{"version":3,"file":"main.e3e08e8d.js","mappings":"muBAUO,SAASA,EAAeC,GAAkE,IAAjE,MAAEC,EAAQ,aAAY,MAAEC,EAAK,SAAEC,GAAgCH,EAC7F,OACEI,EAAAA,cAACC,EAAAA,iBAAgB,CACfJ,MAAOA,EACPK,gBAAe,eAAAC,OAAiBN,EAAMO,oBAAmB,eACzDC,OAAOC,EAAAA,EAAAA,mBAAkBR,GACzBC,SAAUA,GAGhB,C,oOCHO,SAASQ,EAAkBX,GASN,IATO,MACjCC,EAAK,WACLW,EAAU,YACVC,EAAW,WACXC,EAAU,YACVC,EAAW,WACXC,EAAU,WACVC,EAAU,SACVd,GACwBH,EACxB,MAAMkB,GAAoBC,EAAAA,EAAAA,cACvBC,IACC,MAAMlB,EAAQkB,EAAGC,cAAcnB,MAC/BC,EAASS,EAAYV,EAAM,GAE7B,CAACC,EAAUS,IAEPU,GAAoBH,EAAAA,EAAAA,cACvBV,IACCN,EAASM,EAAOK,EAAW,GAE7B,CAACX,EAAUW,IAEb,OACEV,IAAAA,cAAA,OAAKmB,UAAU,kBACbnB,IAAAA,cAAA,OAAKmB,UAAU,4BACbnB,IAAAA,cAACC,EAAAA,iBAAgB,CAACJ,MAAOA,EAAOQ,MAAOG,EAAYN,gBAAiBO,EAAaV,SAAUmB,KAE7FlB,IAAAA,cAAA,OAAKmB,UAAU,iCACbnB,IAAAA,cAACoB,EAAAA,YAAWC,EAAA,GACNR,EAAU,CACdhB,MAAOe,EACPU,aACEtB,IAAAA,cAACuB,EAAAA,UAAS,CAACC,GAAG,MAAMC,KAAK,QAAQN,UAAU,yDACxCT,GAGLX,SAAUe,EACVhB,MAAOY,EACP,cAAaC,MAKvB,CC1CO,SAASe,EAAW9B,GAAoE,IAAnE,MAAEC,EAAQ,SAAQ,MAAEC,EAAK,SAAEC,EAAQ,IAAE4B,EAAG,IAAEC,GAAuBhC,EAC3F,OACEI,EAAAA,cAACO,EAAkB,CACjBV,MAAOA,EACPW,YAAYF,EAAAA,EAAAA,mBAAkBR,EAAMO,OACpCI,YAAY,2BACZC,WAAYZ,EAAM+B,MAClBhB,WAAY,CAAEc,IAAKA,QAAAA,EAAO,EAAGC,IAAKA,QAAAA,EAAO,EAAGE,KAAM,GAClDlB,WAAW,QACXD,YAAY,2BACZZ,SAAUA,CAACM,EAAewB,IAAkB9B,EAAS,CAAEM,QAAOwB,WAGpE,CCrBO,SAASE,EAAQnC,GAA4C,IAA3C,MAAEC,EAAK,MAAEC,EAAK,SAAEC,GAAyBH,EAChE,OACEI,IAAAA,cAACgC,EAAAA,SAAQ,CACPC,QAASnC,EACTC,SAAWiB,GAA4CjB,EAASiB,EAAGC,cAAcgB,SACjF,cAAY,wBAEXpC,EAGP,CChBA,MAAMqC,EAAc,CAClB,CAAEpC,MAAO,QAASD,MAAO,SACzB,CAAEC,MAAO,UAAWD,MAAO,YAetB,SAASsC,EAASvC,GAAsC,IAAAwC,EAAA,IAArC,MAAEtC,EAAK,SAAEC,GAA0BH,EAC3D,MAAOyC,EAAQC,IAAaC,EAAAA,EAAAA,UAASzC,EAAMuC,SACpCZ,EAAMe,IAAWD,EAAAA,EAAAA,UAASzC,EAAM2B,OAChCgB,EAAOC,IAAYH,EAAAA,EAAAA,UAASzC,EAAM2C,QAClCE,EAAQC,IAAaL,EAAAA,EAAAA,UAASzC,EAAM6C,QAErCE,GAAW9B,EAAAA,EAAAA,cACf,CAAC+B,EAAKC,EAAajD,KACjBiD,EAAYjD,GACZC,EAAS,CAAEsC,SAAQZ,OAAMgB,QAAOE,SAAQ,CAACG,GAAMhD,GAAQ,GAEzD,CAACuC,EAAQZ,EAAMgB,EAAOE,EAAQ5C,IAGhC,OACEC,IAAAA,cAAA,WACEA,IAAAA,cAAA,OAAKmB,UAAU,4BACbnB,IAAAA,cAAA,WACEA,IAAAA,cAACgD,EAAAA,OAAM,CACLnD,MAAM,OACN,aAAW,OACXsB,UAAU,OACV8B,MAAOf,EACPpC,MAAkE,QAA7DsC,EAAEF,EAAYgB,MAAMC,GAAWA,EAAOrD,QAAUA,EAAMuC,gBAAO,IAAAD,OAAA,EAA3DA,EAA6DtC,MACpEC,SAAWqD,GAAgCP,EAAS,SAAUP,EAAWc,EAAStD,OAClF,cAAY,2BAEXoC,EAAYmB,KAAKF,GAChBnD,IAAAA,cAACsD,EAAAA,aAAY,CAACR,IAAKK,EAAOrD,OAAQqD,EAAOtD,WAI/CG,IAAAA,cAACuD,EAAAA,MAAK,CACJ1D,MAAM,OACN2D,KAAK,SACL7B,IAAI,IACJC,IAAI,KACJ7B,SAAWiB,GAA4C6B,EAAS,OAAQL,EAASxB,EAAGC,cAAcnB,OAClGA,MAAO2B,EACP,cAAY,0BAGdzB,IAAAA,cAACgC,EAAAA,SAAQ,CACPC,QAAoB,SAAXU,EACT5C,SAAWiB,GACT6B,EAAS,SAAUD,EAAW5B,EAAGC,cAAcgB,QAAU,OAAS,UAEpE,cAAY,2BACb,QAGDjC,IAAAA,cAACgC,EAAAA,SAAQ,CACPC,QAAmB,WAAVQ,EACT1C,SAAWiB,GACT6B,EAAS,QAASH,EAAU1B,EAAGC,cAAcgB,QAAU,SAAW,UAEpE,cAAY,0BACb,WAMT,CCpEO,SAASwB,EAAS7D,GAAsD,IAArD,MAAEC,EAAQ,OAAM,MAAEC,EAAK,SAAEC,GAA0BH,EAC3E,OACEI,EAAAA,cAACO,EAAkB,CACjBV,MAAOA,EACPW,YAAYF,EAAAA,EAAAA,mBAAkBR,EAAMO,OACpCI,YAAY,yBACZC,WAAYZ,EAAM+B,MAClBhB,WAAY,CAAEc,IAAK,EAAGC,IAAK,EAAGE,KAAM,GACpClB,WAAW,QACXD,YAAY,yBACZZ,SAAUA,CAACM,EAAOwB,IAAU9B,EAAS,CAAEM,QAAOwB,WAGpD,CClBO,SAAS6B,EAAoB9D,GAAkE,IAAjE,MAAEC,EAAK,MAAEC,EAAK,SAAE6D,EAAQ,SAAE5D,GAAqCH,EAClG,OACEI,IAAAA,cAAC4D,EAAAA,SAAQ,CACP/D,MAAOA,EACP8D,SAAUA,EACVE,YAAY,mBACZ9D,SAAW+D,GAA2C/D,EAAS+D,EAAEC,OAAOjE,OACxEA,MAAOA,EACPkE,WAAS,EACT,cAAY,yCAGlB,CCPO,SAASC,EAAYC,GAC1B,MAAM,MAAErE,EAAK,KAAEsE,EAAI,MAAErE,EAAK,SAAE6D,EAAQ,IAAEhC,EAAG,IAAEC,EAAG,KAAEE,EAAI,aAAEsC,GAAe,GAAUF,EAE/E,OACElE,IAAAA,cAACuD,EAAAA,MAAK,CACJC,KAAK,SACL3D,MAAOA,EACPsE,KAAMA,EACNR,SAAUA,EACVU,QAASD,EAAe,qBAAuB,SAC/CtE,MAAOA,EACP6B,IAAKA,QAAAA,EAAO,EACZC,IAAKA,EACLE,KAAMA,EACN/B,SAAW+D,GACTI,EAAMnE,SAASqE,EAAeE,WAAWR,EAAEC,OAAOjE,OAASyE,SAAST,EAAEC,OAAOjE,MAAO,KAEtF,cAAY,4BAGlB,CCxBO,SAAS0E,EAAYN,GAC1B,MAAM,MAAErE,EAAK,KAAEsE,EAAI,MAAErE,EAAK,SAAE6D,GAAaO,EAEzC,OACElE,IAAAA,cAACuD,EAAAA,MAAK,CACJC,KAAK,OACL3D,MAAOA,EACPsE,KAAMA,EACNR,SAAUA,EACV7D,MAAOA,EACPC,SAAW+D,GAA2CI,EAAMnE,SAAS+D,EAAEC,OAAOjE,OAC9E,cAAY,gCAGlB,CCXO,SAAS2E,EAAK7E,GAAuC,IAAtC,MAAEE,EAAK,SAAEC,GAA2BH,EACxD,OACEI,IAAAA,cAAA,OAAKmB,UAAU,4BACbnB,IAAAA,cAACgC,EAAAA,SAAQ,CACPC,QAASnC,EAAM4E,OACf3E,SAAWiB,GAA4CjB,EAAS,IAAKD,EAAO4E,OAAQ1D,EAAGC,cAAcgB,UACrG,cAAY,6BAEdjC,IAAAA,cAACuD,EAAAA,MAAK,CACJC,KAAK,SACL1B,KAAK,MACL/B,SAAWiB,GACTjB,EAAS,IAAKD,EAAO6E,MAAO3D,EAAGC,cAAc2D,gBAE/C9E,MAAOA,EAAM6E,MACb,cAAY,4BAEd3E,IAAAA,cAACC,EAAAA,iBAAgB,CACfI,OAAOC,EAAAA,EAAAA,mBAAkBR,EAAMO,OAC/BN,SAAWM,GAAkBN,EAAS,IAAKD,EAAOO,MAAOA,IACzDH,gBAAgB,4BAIxB,C,mDCpBO,SAAS2E,EAAejF,GAA4D,IAA3D,MAAEE,EAAK,SAAEC,EAAQ,eAAE+E,GAAsClF,EACvF,MAAOmF,EAAOC,GAAYhF,IAAAA,SAAeF,EAAMiF,QACxCE,EAAMC,GAAWlF,IAAAA,SAAeF,EAAMmF,OACtCE,EAAIC,GAASpF,IAAAA,SAAeF,EAAMqF,KACnC,SAAEE,GAAavF,EACfwF,EAAaD,EAASE,OAAO,GAAGC,cAAgBH,EAASI,MAAM,GAE/D5C,EAAW7C,IAAAA,aACf,CAAC8C,EAAKC,EAAajD,KACjBiD,EAAYjD,GACZC,EAAS,CAAEsF,WAAUN,QAAOE,OAAME,KAAI,CAACrC,GAAMhD,GAAQ,GAEvD,CAACuF,EAAUN,EAAOE,EAAME,EAAIpF,IAE9B,OACEC,IAAAA,cAAA,OAAK8C,IAAKuC,EAAUlE,UAAU,sBAC5BnB,IAAAA,cAAA,OAAKmB,UAAU,+BACbnB,IAAAA,cAACgC,EAAAA,SAAQ,CACPb,UAAU,iBACVc,SAAU8C,EACV,qCAAA5E,OAAoCkF,GACpCtF,SAAW+D,GAA2CjB,EAAS,QAASmC,GAAWlB,EAAEC,OAAO9B,UAE3F6C,GAAkBQ,IAEnBR,GACA9E,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAACuD,EAAAA,MAAK,CACJmC,SAAUX,EACV5D,UAAU,OACVqC,KAAK,SACLW,KAAI,GAAAhE,OAAKkF,EAAQ,SACjBvF,MAAOmF,EACPtD,IAAKgE,EAASN,GAAUJ,KACxBrD,IAAKgE,KAAKjE,IAAIgE,EAASN,GAAUF,GAAIA,GACrCpF,SAAWiB,GACT6B,EAAS,OAAQqC,EAASW,OAAO7E,EAAGC,cAAcnB,QAEpD,kCAAAK,OAAiCkF,EAAQ,WAE3CrF,IAAAA,cAAA,YAAM,KACNA,IAAAA,cAACuD,EAAAA,MAAK,CACJmC,SAAUX,EACV5D,UAAU,OACVqC,KAAK,SACLW,KAAI,GAAAhE,OAAKkF,EAAQ,OACjBvF,MAAOqF,EACPxD,IAAKiE,KAAKhE,IAAI+D,EAASN,GAAUJ,KAAMA,GACvCrD,IAAK+D,EAASN,GAAUF,GACxBpF,SAAWiB,GACT6B,EAAS,KAAMuC,EAAOS,OAAO7E,EAAGC,cAAcnB,QAEhD,kCAAAK,OAAiCkF,EAAQ,SAE3CrF,IAAAA,cAACuB,EAAAA,UAAS,KAAE+D,KAMxB,CC7DO,MAAMK,EAA0B,CAErC,CAACG,EAAAA,GAAAA,SAAyB,CAAEf,OAAO,EAAOE,KAAM,EAAGE,GAAI,IACvD,CAACW,EAAAA,GAAAA,OAAuB,CAAEf,OAAO,EAAOE,KAAM,EAAGE,GAAI,IACrD,CAACW,EAAAA,GAAAA,MAAsB,CAAEf,OAAO,EAAOE,KAAM,EAAGE,GAAI,KACpD,CAACW,EAAAA,GAAAA,OAAuB,CAAEf,OAAO,EAAOE,KAAM,EAAGE,GAAI,IACrD,CAACW,EAAAA,GAAAA,QAAwB,CAAEf,OAAO,EAAOE,KAAM,EAAGE,GAAI,KAGlDY,EAAmB,CAACD,EAAAA,GAAAA,QAAwBA,EAAAA,GAAAA,OAE5CE,EAAmBlG,IACvB,MAAMmG,EAAeC,IAAM,CAAC,EAAGP,GAC/B,IAAK,MAAMQ,KAAcF,EAAc,CACrC,MAAMG,EAAiBD,EACjBE,EAAsBvG,aAAK,EAALA,EAAQsG,GAC/BC,IAC2C,IAA5CC,OAAOC,KAAKF,GAAqBG,OACnCP,EAAaG,GAAkB,IAAKH,EAAaG,GAAiBrB,OAAO,GAEzEkB,EAAaG,GAAkB,IAAKH,EAAaG,MAAoBC,GAEzE,CACA,OAAOJ,CAAY,EAGfQ,EAA6C3G,GAClCwG,OAAOC,KAAKT,EAAAA,IAAgBY,OAAOC,IAChD,MAAMC,EAAa9G,EAAM6G,GAEzB,OACEC,IACoC,IAAnCN,OAAOC,KAAKK,GAAYJ,SACtBK,EAAAA,GAAoBF,GAAkCG,MAAMC,IAAI,IAAAC,EAAAC,EAAA,OAC/DC,EAAAA,EAAAA,IAAU,CACRpH,MAAOiH,EACPpF,IAAqB,QAAlBqF,EAAEJ,aAAU,EAAVA,EAAY3B,YAAI,IAAA+B,EAAAA,EAAIrB,EAASgB,GAAkC1B,KACpErD,IAAmB,QAAhBqF,EAAEL,aAAU,EAAVA,EAAYzB,UAAE,IAAA8B,EAAAA,EAAItB,EAASgB,GAAkCxB,IAClE,IACF,IAMH,SAASgC,EAAWjD,GACzB,MAAMkD,EAAuBpH,IAAAA,OAA4BgG,EAAgB9B,EAAMpE,QAEzEuH,EAAgBvH,IACpB,MAAMwH,EAAsBpD,EAAMpE,MAAQoG,IAAM,CAAC,EAAGhC,EAAMpE,OAAS,CAAC,EACpEwH,EAAOxH,EAAMuF,UAAY,CAAC,EAEtBvF,EAAMiF,MACRb,EAAMnE,SAASuH,GACNxH,EAAMmF,OAASU,EAAS7F,EAAMuF,UAAUJ,MAAQnF,EAAMqF,KAAOQ,EAAS7F,EAAMuF,UAAUF,WACxFmC,EAAOxH,EAAMuF,UACpBnB,EAAMnE,SAASuH,KAEXxH,EAAMmF,OAASU,EAAS7F,EAAMuF,UAAUJ,OAC1CqC,EAAOxH,EAAMuF,UAAWJ,KAAOnF,EAAMmF,MAEnCnF,EAAMqF,KAAOQ,EAAS7F,EAAMuF,UAAUF,KACxCmC,EAAOxH,EAAMuF,UAAWF,GAAKrF,EAAMqF,IAErCjB,EAAMnE,SAASuH,IAGjBpD,EAAMqD,sBACJd,EAA0Ca,IACtC,sFAEL,EAGH,OAAOhB,OAAOC,KAAKa,EAAqBI,SAASnE,KAAKgC,GACpDrF,IAAAA,cAAC6E,EAAe,CACd/B,IAAG,cAAA3C,OAAgBkF,GACnBvF,MAAO,IAAKsH,EAAqBI,QAAQnC,GAA6BA,SAAUA,GAChFP,gBAAiBiB,EAAiB0B,SAASpC,GAC3CtF,SAAUsH,KAGhB,C,oOC9CA,MAAMK,EAA0B,CAAElE,KAAM,SAAUrC,UAAW,SAAUwG,aAAc,eAmBrF,SAASC,EAAuBC,GAC9B,OAAOA,EAAUC,QAAO,CAACC,EAAiBC,KACxCD,EAAIC,EAAI7D,MAAQ6D,EAAIlI,MACbiI,IACN,CAAC,EACN,CAAC,IAEIE,EAAU,SAAVA,GAAU,OAAVA,EAAAA,EAAU,iBAAVA,EAAAA,EAAU,2BAAVA,CAAU,EAAVA,GAAU,IAKR,SAASC,EAAmBhE,GAAgC,IAAAiE,EACjE,MAAMC,EAASlE,EAAMmE,QAAQC,iBACvBC,EAAsBvI,EAAAA,OAAmCwI,KAAKC,MAAMD,KAAKE,UAAUN,EAAOO,WACzFd,EAAWe,GAAgB5I,EAAAA,SAAqCoI,EAAOO,QACxEE,EAAgB7I,EAAAA,OAnEwB,QAA9C8I,EAAOC,SAASC,cAAc,wBAAgB,IAAAF,EAAAA,EAAIC,SAASE,MAD7D,IAA6BH,EAqE3B,MAAOI,EAAaC,GAAkBnJ,EAAAA,SAAeiI,EAAWmB,QACzDC,EAAkBC,GAAuBtJ,EAAAA,UAA+B,GAEzEuJ,EAAmBrF,EAAMmE,QAAQmB,eAEvCxJ,EAAAA,WAAgB,KACdkE,EAAMmE,QAAQoB,kBAAmB,EAC1B,KACLvF,EAAMmE,QAAQoB,kBAAmB,EACjCvF,EAAMmE,QAAQqB,QAAQ,SAAUxF,EAAMmE,QAAQ,IAG/C,IAEH,MAAMsB,EAAqB3J,EAAAA,aACzBJ,IAQM,IARL,OACCgK,EAAM,aACNC,GAAe,EAAK,cACpBC,GAAgB,GAKjBlK,EACC,MAAMmK,EAAwC,mBAAnB7F,EAAM8F,SAC3BC,EAA0C,mBAApB/F,EAAMgG,UAElChG,EAAMmE,QAAQ8B,IAAIP,GACdC,GAAgBE,EAClB7F,EAAM8F,SAAUJ,GACPE,GAAiBG,GAC1B/F,EAAMgG,aAGJL,GAAgBC,IAClB5F,EAAMkG,MAAMC,MACd,GAEF,CAACnG,IAGGoG,EAAgCtK,EAAAA,OACpCuK,KACGC,IACC,MAAMZ,EAAShC,EAAuB4C,GACtCb,EAAmB,CAAEC,UAAS,GAEhC,GACA,CAAEa,QAAS,OAIfzK,EAAAA,WACE,IAAM,KACJsK,EAA8B9C,QAAQkD,QAAQ,GAEhD,IAGF,MAAMV,EAAoDhK,EAAAA,aACvDgB,IAEC,GADAA,EAAG2J,iBACC3J,EAAGC,cAAc2J,gBAAiB,CACpC,MAAMhB,EAAShC,EAAuBC,GACtC8B,EAAmB,CAAEC,SAAQC,cAAc,GAC7C,IAEF,CAAChC,EAAW8B,IAGRkB,EAAoB7K,EAAAA,aAAkB,KAC1C,MAAM4J,EAAShC,EAAuBW,EAAoBf,SAC1DmC,EAAmB,CAAEC,SAAQE,eAAe,GAAO,GAClD,CAACH,IAQJ,OACE3J,EAAAA,cAAC8K,EAAAA,OAAM,CACLC,aAAW,EACX5J,UAAU,OACV,cAAY,gBACZiJ,MAAOlG,EAAMkG,MACbvB,cAAeA,EACf,aAAwB,QAAxBV,EAAYC,EAAO4C,aAAK,IAAA7C,EAAAA,EAAI,aAC5B8C,eAAgBJ,EAChBR,KAAMQ,EACNK,OAAQhH,EAAMgH,QAEdlL,EAAAA,cAACmL,EAAAA,aAAY,CAACC,aAAcP,GAAoBzC,EAAO4C,OACvDhL,EAAAA,cAAA,QAAMgK,SAAUA,EAAU7I,UAAU,iCAClCnB,EAAAA,cAACqL,EAAAA,WAAU,CAAClK,UAAU,aACnBoI,GACCvJ,EAAAA,cAACsL,EAAAA,YAAW,CAACC,YAAY,EAAOpK,UAAU,UACxCnB,EAAAA,cAACwL,EAAAA,OAAMnK,EAAA,GACDqG,EAAuB,CAC3BhD,OAAQwE,IAAgBjB,EAAWmB,MACnCqC,QAASA,IAAMtC,EAAelB,EAAWmB,OACzC,cAAY,4BACb,SAGDpJ,EAAAA,cAACwL,EAAAA,OAAMnK,EAAA,GACDqG,EAAuB,CAC3BhD,OAAQwE,IAAgBjB,EAAWd,WACnCsE,QAASA,IAAMtC,EAAelB,EAAWd,YACzC,cAAY,iCACb,eAMJU,EAAUxE,KAAKqI,IACd,MAAMC,EAvLlB,SAAyBnI,GACvB,OAAQA,GACN,IAAK,SACH,OAAOS,EACT,IAAK,SAEL,IAAK,OACH,OAAOO,EACT,IAAK,aACH,OAAO7E,EACT,IAAK,SACH,OAAO+B,EACT,IAAK,OACH,OAAO+B,EACT,IAAK,mBACH,OAAOC,EACT,IAAK,OACH,OAAOvB,EACT,IAAK,WACH,OAAOJ,EACT,IAAK,QACH,OAAO0C,EACT,IAAK,aACH,OAAO0C,EACT,QACE,MAAO,IAAMnH,EAAAA,cAAA,WAAK,6BAExB,CA4JmC4L,CAAgBF,EAAMlI,MAI7C,OA/C0BqI,EAgDGH,EAAMlI,MA/CvC0F,IAAgBjB,EAAWd,YAA4B,eAAd0E,GACzC3C,IAAgBjB,EAAWd,YAA4B,eAAd0E,IA+CjC7L,EAAAA,cAAC2L,EAActK,EAAA,CACbyB,IAAK4I,EAAMvH,MACPuH,EAAK,CACT3L,SAAWD,IACT8I,GAAckD,IACZ,MAAMtB,EAAesB,EAAUzI,KAAK0I,GAC9BA,EAAW5H,OAASuH,EAAMvH,KACrB,IAAK4H,EAAYjM,SAEnBiM,IAGT,OADAzB,EAA8B9C,QAAQgD,GAC/BA,CAAY,GACnB,EAEJjD,oBAAqB+B,KAhEDuC,KAkEvB,KAIP7L,EAAAA,cAACgM,EAAAA,aAAY,KACXhM,EAAAA,cAACwL,EAAAA,OAAM,CACLhI,KAAK,SACLiI,QAASZ,EACT,cAAY,uBACZnF,SAAUxB,EAAMkG,MAAM6B,WACvB,SAGDjM,EAAAA,cAACwL,EAAAA,OAAM,CACLU,MAAM,OACN1I,KAAK,SACL,cAAY,wBACZkC,SAAUxB,EAAMkG,MAAM6B,aAAe5C,EACrC2B,MAAO3B,GAAoB,UAC5B,UAOX,CAEO,MAAM8C,EAA4BnM,EAAAA,eAA4C,SAU9E,SAASoM,EAA0BlI,GACxC,MAAOmE,EAASgE,GAAcrM,EAAAA,SAAqC,OAC5DgK,EAAUsC,GAAetM,EAAAA,SAA6B,OACtDkK,EAAWqC,GAAgBvM,EAAAA,SAA8B,MAC1DwM,GAASC,EAAAA,EAAAA,gBAAe,CAAEC,OAAO,IAoBvC,OACE1M,EAAAA,cAACmM,EAA0BQ,SAAQ,CAAC7M,MAnBnB8M,CAACvE,EAAwB2B,EAAyBE,KAC/DF,GACFsC,GAAY,IAAMtC,IAEhBE,GACFqC,GAAa,IAAMrC,IAGrBmC,EAAWhE,GACXmE,EAAOK,MAAM,GAWV3I,EAAM4I,SACNzE,GACCrI,EAAAA,cAACkI,EAAkB,CACjBkC,MAAOoC,EACPnE,QAASA,EACT2B,SAAUA,EACVE,UAAWA,EACXgB,OAfOA,KACbmB,EAAW,MACXC,EAAY,MACZC,EAAa,KAAK,IAiBtB,C,2LCzRO,SAASQ,GAAiBC,GAAkB,IAAAC,EAAAC,EACjD,MAAMC,EAAcH,EAAMG,cACpBC,EAA2C,QAA9BH,EAAGE,SAAqB,QAAVD,EAAXC,EAAaE,gBAAQ,IAAAH,OAAA,EAArBA,EAAuB1J,YAAI,IAAAyJ,EAAAA,EAAI,KACrD,OAAIE,SAAAA,EAAaG,eAAiBF,IAAkBG,EAAAA,EAAAA,KAC3CH,EAELD,SAAAA,EAAaK,UACR,QAEF,IACT,CA8DO,SAASC,GAAyCC,GACvD,MAAMC,EAAoB,GACpBC,EAA8C,CAAC,QAYrD,OAVAF,EAAYG,cAAcC,SAASC,IACjC,MAAMC,EAASD,EAAUE,oBACnBC,EAAgBnB,GAAiBgB,GACnCC,IAAWL,EAAQlG,SAASuG,IAC9BL,EAAQQ,KAAKH,GAEXE,IAAkBN,EAAenG,SAASyG,IAC5CN,EAAeO,KAAKD,EACtB,IAEK,CAAEP,UAASC,iBACpB,CA8CO,SAASQ,KAAoD,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAClE,MAAMC,EAC4F,QAD7EL,EACwB,QADxBC,EACE,QADFC,EACnBI,OAAOC,sBAAc,IAAAL,OAAA,EAArBA,EAAuBM,4BAAoB,IAAAP,EAAAA,EAA+B,QAA/BE,EAAIG,OAAOG,4BAAoB,IAAAN,OAAA,EAA3BA,EAA6BK,4BAAoB,IAAAR,OAAA,EAD1EA,EAErBU,SAEH,OAA2E,QAA3EN,EAAOC,aAAe,EAAfA,EAAiBrL,KAAK0D,GAASiI,GAA+BjI,YAAM,IAAA0H,EAAAA,EAAI,IACjF,CAEO,SAASQ,GAA6BC,GAM1C,IAN2C,iBAC5CC,EAAgB,cAChBC,GAIDF,EACCC,EAAiBE,iBAAiBvB,SAASzF,IACrCA,EAAQiH,aACVjH,EAAQ+G,IACV,GAEJ,CAEO,SAASG,GAAiBvB,GAC/B,MAAO,QAAP7N,OAAe6N,EACjB,CAEO,SAASwB,GAAmBC,GAA+B,IAAAC,EAAAC,EAChE,OAAqE,QAArED,EAAQD,EAAkD,QAAvCE,EAAGnH,KAAKC,MAAMgH,EAAYG,qBAAa,IAAAD,OAAA,EAApCA,EAAsCE,KAAO,UAAE,IAAAH,EAAAA,EAAK,EAC5E,CAEO,SAASI,GAAiBC,GAAwE,IAAvE,OAAE/B,EAAM,SAAEgC,GAA2DD,EAErG,OAAOP,GADaQ,EAAS9M,MAAK+M,IAAA,IAAC,UAAEC,GAAWD,EAAA,OAAKC,IAAcX,GAAiBvB,EAAO,IAE7F,CAEO,SAASgB,GAA+BjI,GAC7C,MAAO,CACLmJ,UAAWnJ,EAAKmJ,UAChBlC,OAAQjH,EAAKiH,OACbmC,OAAQpJ,EAAKoJ,OACbC,WAAYrJ,EAAKqJ,WACjBlC,cAAenH,EAAKmH,cACpB0B,aAAc7I,EAAK6I,aACnBS,WAAY,CACVC,GAAIvJ,EAAKwJ,oBACTC,MAAOzJ,EAAK0J,kBACZC,KAAM3J,EAAK4J,oBAGjB,C,0BCzLO,MACMC,GAA4B,I,cCVzC,MAAMC,GAAc,EAEb,SAASC,KACd,MAAMC,EAAoB/Q,IAAAA,OAAa,GACjCgR,EAAsBhR,IAAAA,OAAa,GAEnCiR,EAAgBjR,IAAAA,aACpBkR,UAQM,IARC,QACLvD,EAAO,eACPC,EAAc,WACdyC,GAKDzQ,EACC,IAcE,aAbmBuR,EAAAA,GAAAA,IAEhB,CACDC,SAAU,sBACVC,gBAAiB,CACfrD,OAAQL,EAAQ2D,KAAK,KACrB1D,eAAgBA,EAAe0D,KAAK,WAAQC,EAC5ChB,oBAAqBF,EAAWC,GAChCG,kBAAmBJ,EAAWG,MAC9BG,mBAAoBN,EAAWK,MAEjCc,mBAAoB,CAAC,IAAK,QAEhBzC,SAAS1L,KAAKoO,GAAYzC,GAA+ByC,IACvE,CAAE,MACA,CAGF,MAAO,EAAE,GAEX,IAGIC,EAAe1R,IAAAA,aAAkBkR,UACrC,GAAwB,IAApBnC,EAASvI,OAIb,IACE,MAAMmL,EAAiBnJ,KAAKE,UAAUqG,EAAS1L,KAAK0D,GFsJnD,SAAwCA,GAC7C,MAAO,CACLmJ,UAAWnJ,EAAKmJ,UAChBlC,OAAQjH,EAAKiH,OACbmC,OAAQpJ,EAAKoJ,OACbC,WAAYrJ,EAAKqJ,WACjBlC,cAAenH,EAAKmH,cACpB0B,aAAcpH,KAAKE,UAAU3B,EAAK6I,cAClCW,oBAAqBxJ,EAAKsJ,WAAWC,GACrCG,kBAAmB1J,EAAKsJ,WAAWG,MACnCG,mBAAoB5J,EAAKsJ,WAAWK,KAExC,CElKmEkB,CAA+B7K,MAC5F,IAAI8K,GAAY,EAChB,IACEA,EC7DD,SAA+BC,GAEpC,IAAIC,EAAI,EACR,IAAK,IAAIC,EAAI,EAAGC,EAAIH,EAAEtL,OAAQwL,EAAIC,EAAGD,IAAK,CACxC,MAAME,EAAKJ,EAAEK,WAAWH,GACxB,GAAIE,EAAK,IACPH,GAAK,OACA,GAAIG,EAAK,KACdH,GAAK,OACA,GAAIG,EAAK,MACdH,GAAK,OACA,GAAIG,EAAK,MAAQ,CACtB,MAAME,EAAKN,EAAEK,aAAaH,GAC1B,KAAIA,EAAIC,GAAKG,GAAM,OAAUA,GAAM,OAGjC,MAAM,IAAIC,MAAM,0BAFhBN,GAAK,CAIT,KAAO,IAAIG,EAAK,MACd,MAAM,IAAIG,MAAM,0BAEhBN,GAAK,CACP,CACF,CACA,OAAOA,CACT,CDoCoBO,CAAsBX,GAAkB,IACtD,CAAE,MAAOY,GAAY,IAAAC,EACN,QAAbA,EAAA7D,OAAO8D,cAAM,IAAAD,GAAbA,EAAeE,iBAAiBH,EAClC,OACMpB,EAAAA,GAAAA,IAAS,CACbC,SAAU,sBACVuB,OAAQ,OACRnB,mBAAoB,CAAC,IAAK,IAAK,IAAK,KACpCoB,YAAaC,GAAAA,GAAAA,gBACb5J,KAAM0I,EACNE,cAEF,MAAOiB,GAAmB,IAAI/D,GAAUgE,MAAK,CAACC,EAAGC,KAAMC,EAAAA,GAAAA,IAAWD,EAAE5C,WAAY2C,EAAE3C,cAElF,OADAU,EAAkBvJ,QAAU,EACrBsL,EAAgBzC,UACzB,CAAE,MAAOkC,GAAO,IAAAY,EACd,GAAIZ,aAAiBa,GAAAA,GAAqB,CAExC,GAAIrC,EAAkBvJ,QAAUqJ,GAG9B,OAFAE,EAAkBvJ,QAAUuJ,EAAkBvJ,QAAU,QAClD,IAAI6L,SAASC,GAAMC,WAAWD,EAAG,OAChC5B,EAAa3C,GAGpBgC,EAAkBvJ,QAAU,CAEhC,MAAO,GAAI+K,aAAiBiB,GAAAA,GAE1B,OAcF,YAVa,QAAbL,EAAAxE,OAAO8D,cAAM,IAAAU,GAAbA,EAAeT,iBAAiBH,EAAO,CACrCkB,OAAQlB,aAAiBmB,GAAAA,GACpBnB,EAAMoB,SAAwBC,aAC/B7E,GACFjH,QACA,CAACC,EAAiBC,EAAiB6L,KAAkB,IAAM9L,EAAK,CAAC,QAAD5H,OAAS0T,IAAUrL,KAAKE,UAAUV,MAClG,CAAC,KAKP,IACC,IAEG8L,EAAoB9T,IAAAA,aACxBkR,UAAoG,IAA7F,QAAEvD,EAAO,gBAAEoG,GAA8DC,EAC9E,IACE,MAAMC,EAAS,KACVC,EAAAA,GAAAA,IAAaH,EAAiBI,KAAKC,OACtC1D,MAAM2D,EAAAA,EAAAA,aAEFlD,EAAAA,GAAAA,IAAS,CACbC,SAAU,8BAAFjR,OAAgCwN,EAAQ2D,KAAK,KAAI,yBAAAnR,OACvD8T,EAAO3D,GAAE,uBAAAnQ,OACW8T,EAAOzD,MAAK,wBAAArQ,OAAuB8T,EAAOvD,MAChEiC,OAAQ,SACRnB,mBAAoB,CAAC,IAAK,IAAK,KAC/BK,WAAW,IAEbb,EAAoBxJ,QAAU,CAChC,CAAE,MAAO+K,GAAO,IAAA+B,EACd,GAAI/B,aAAiBa,GAAAA,GAAqB,CAExC,GAAIpC,EAAoBxJ,QAAUqJ,GAGhC,OAFAG,EAAoBxJ,QAAUwJ,EAAoBxJ,QAAU,QACtD,IAAI6L,SAASC,GAAMC,WAAWD,EAAG,OAChCQ,EAAkB,CAAEnG,UAASoG,oBAGpC/C,EAAoBxJ,QAAU,CAElC,MAAO,GAAI+K,aAAiBiB,GAAAA,GAE1B,OAIW,QAAbc,EAAA3F,OAAO8D,cAAM,IAAA6B,GAAbA,EAAe5B,iBAAiBH,EAClC,IAEF,IAGF,MAAO,CAAEtB,gBAAeS,eAAcoC,oBACxC,CE/HO,SAASS,GAA2B7G,GACzC,MAAM,cAAEuD,EAAa,aAAES,EAAY,kBAAEoC,GAAsBhD,KACrD0D,EClBD,SAA6B9G,GAClC,MAAMyB,GAAmBsF,EAAAA,GAAAA,GAAc/G,EAAa,CAClDgH,gBAAiB,CAAC,SAAU,2BAA4B,WAEpD,KAAEC,EAAI,OAAEC,EAAM,yBAAEC,GAA6B1F,EACnD,OAAOnP,IAAAA,SACL,KACE8U,EAAAA,EAAAA,IAA0C3F,IAAqB0F,KAA8BD,KAAWD,SAAAA,EAAMI,KAChH,CAACF,EAA0BD,EAAQD,aAAI,EAAJA,EAAMI,GAAI5F,GAEjD,CDQ2B6F,CAAoBtH,GACvCuH,EAAwBjV,IAAAA,SAAc,IAAM0N,EAAYuH,yBAAyB,CAACvH,IAClFwH,EAAiBlV,IAAAA,SAEvBA,IAAAA,WACE,IAAM,KACAkV,EAAe1N,SACjB2N,aAAaD,EAAe1N,QAC9B,GAEF,IAGF,MAAM4N,EAAoBpV,IAAAA,aACxB,WAGK,IAFHqV,EAAaC,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG1E,GAChB2E,EAAyED,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,KAExEJ,EAAe1N,SACjB2N,aAAaD,EAAe1N,SAE9B,MAAMgO,EAAYP,EAAsBjF,SAASyF,QAC9C1O,IACCmM,EAAAA,GAAAA,IAAWnM,EAAKsJ,WAAY4E,EAAsBS,4BAA8B,GAChF3O,EAAKsJ,WAAWK,OAASuE,EAAsBU,eACb,OAAjCJ,GAAyCA,EAA6BxO,MAE3E,GAAyB,IAArByO,EAAUhP,OACZ,OAGFyO,EAAsBW,iBAAiBC,EAAAA,GAAAA,SAEvC,MAAMC,EAAO5E,UACX+D,EAAsBW,iBAAiBC,EAAAA,GAAAA,QACvC,MAAMvO,QAAeoK,EAAa8D,GAQlC,OAPIlO,GACF2N,EAAsBc,iBAAiB,CACrCL,4BAA4BM,EAAAA,GAAAA,IAAWf,EAAsBS,2BAA4BpO,KAG7F2N,EAAsBW,iBAAiBC,EAAAA,GAAAA,OAEhCvO,CAAM,EAGf,GAAsB,IAAlB+N,EACF,OAAOS,IAGTZ,EAAe1N,QAAU+L,WAAWuC,EAAMT,EAC5C,GACA,CAAC3D,EAAcuD,IAGXgB,EAA0BjW,IAAAA,aAC7ByR,IACC,GAA8B,SAA1BA,EAAQvD,cACV,OAEF,MAAMgI,EAAkC,YAAvBzE,EAAQrB,WAEzB1C,EAAYG,cAAcC,SAASC,IACjC,MAAMC,EAASD,EAAUE,oBACnBkI,EAAoBpJ,GAAiBgB,GAC3C,IAAKoI,GAAqB1E,EAAQzD,SAAWA,EAC3C,OAEF,MAAMoI,EAA4BnB,EAAsBjF,SAASyF,QAC9DY,GAAoBA,EAAgBrI,SAAWA,GAAUqI,EAAgBnI,gBAAkBiI,IAG9F,IAAI9N,EADiB0F,EAAUsB,iBAElBvB,SAASwI,IACpB,GAAIA,EAAYhH,cAAgBgH,EAAYjJ,SAASkJ,UAAW,CAC9D,MAAMC,EAAcJ,EAA0BlT,MAAKtD,IAAA,IAAC,UAAEsQ,GAAWtQ,EAAA,OAAKsQ,IAAcoG,EAAYpG,SAAS,IACpGsG,GAA0C,YAA3BA,EAAYpG,WAErBkG,EAAYpG,WAAaoG,EAAYpG,YAAcuB,EAAQvB,YACpE7H,EAAUiO,GAFVA,EAAYG,gBAIhB,KAGF,MAAMC,EAAqBlO,KAAKC,MAAMgJ,EAAQ7B,cAC9C,GAAIvH,EACEoJ,EAAQ7B,eAAiBpH,KAAKE,UAAUL,EAAQgF,SAASsJ,sBACvDtO,EAAQuO,OAAOC,YAAcxO,EAAQgF,UAAahF,EAAQyO,0BAC5DzO,EAAQgF,SAASlD,IAAIuM,GACrBrO,EAAQgF,SAAS0J,iBAGjBtF,EAAQtB,SAAW9H,EAAQ8H,QAC7B9H,EAAQ0N,iBAAiB,CAAE5F,OAAQsB,EAAQtB,UAEzC+F,GAAYC,IAAsB1E,EAAQvD,gBAC5C7F,EAAQoO,sBAEL,IAAKP,GAAYC,IAAsB1E,EAAQvD,cAAe,CACnE,MAAMb,GAAW2J,EAAAA,GAAAA,GAAuBN,EAAmBlT,MAAMyT,WAC/DP,EACA3I,GAEFA,EAAUiC,WAAWkH,OAAO,CAAEhH,UAAWuB,EAAQvB,UAAW7C,WAAU8C,OAAQsB,EAAQtB,SACtF9C,EAAS0J,cACX,IACA,GAEJ,CAACrJ,EAAauH,IAGVkC,EAA2BnX,IAAAA,aAC/B,CAACoX,EAAcpJ,KACb,GAAIA,EAAQ,CACV,MAAMqJ,EAAkC,CACtCnH,UAAWX,GAAiBvB,GAC5BmC,OAAQ,EACRnC,OAAQA,EACRqC,YAAY6D,EAAAA,GAAAA,IAAae,EAAsBS,2BAA4BvB,KAAKC,OAChFhE,WAAY,SACZlC,cAAe,OACf0B,aAAcpH,KAAKE,UAAU,CAAEmH,KAAMuH,KAGvCnC,EAAsBc,iBAAiB,CACrC/F,SAAU,IACLiF,EAAsBjF,SAASyF,QAAOzB,IAAA,IAAC,UAAE9D,GAAW8D,EAAA,OAAK9D,IAAcmH,EAAenH,SAAS,IAClGmH,IAGN,IAEF,CAACpC,IAGGqC,EAAuBtX,IAAAA,aAC1BoX,IAAiB,IAAAG,EACmDC,EAAAC,GAA/C,QAAhBF,EAAA7J,EAAYiH,YAAI,IAAA4C,OAAA,EAAhBA,EAAkBH,QAASA,IAAS1J,EAAYiH,MAAQyC,KAC1D1J,EAAYgK,gBAAgB,OAAQ,IAAKhK,EAAYiH,KAAMyC,SAC3DD,EAAyBC,EAAkD,QAA9CI,EAAyB,QAAzBC,EAAE/J,EAAYiK,mBAAW,IAAAF,OAAA,EAAvBA,EAAyBxJ,2BAAmB,IAAAuJ,EAAAA,OAAIjG,GACjF,GAEF,CAAC7D,EAAayJ,IAGVS,EAAqB5X,IAAAA,aACzBkR,iBAAgC,IAAzB2G,EAAYvC,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,IAAAA,UAAA,GACjB,MAAM,QAAE3H,EAAO,eAAEC,GAAmBH,GAAyCC,GACzEmK,GACF5C,EAAsBc,iBAAiB,CACrC+B,6BAA6BC,EAAAA,GAAAA,IAAQ9C,EAAsBU,aAAc,KAI7E,MAAMqC,QAAwB/G,EAAc,CAC1CtD,UACAC,iBACAyC,WAAY4E,EAAsB6C,+BAE9B,uBAAEG,EAAsB,kBAAEC,EAAiB,iBAAEC,GJpElD,SAA4CnE,GAUhD,IAViD,gBAClDgE,EAAe,qBACfI,EAAoB,oBACpBC,EAAmB,aACnBR,GAMD7D,EACKiE,EAAyBI,EAC7B,MAAMF,EAAmB,IAAIC,GACvBF,EAA8B,GA4BpC,OA1BAF,EAAgBlK,SAAS2D,IACvBwG,GAAyBjC,EAAAA,GAAAA,IAAWiC,EAAwBxG,EAAQpB,YACpE,MAAMiI,EAAeH,EAAiBI,WAAUC,IAAA,IAAC,UAAEtI,GAAWsI,EAAA,OAAK/G,EAAQvB,YAAcA,CAAS,IAC5FuI,EAAiBH,GAAgB,EAAIH,EAAiBG,GAAgB,KAC5E,GAAuB,OAAnBG,EACFN,EAAiBhK,KAAKsD,GACtByG,EAAkB/J,KAAKsD,EAAQvB,gBAC1B,GAAqC,SAAjCuI,EAAevK,eAA4B2J,EAAc,CAClE,MAAMa,EAAclJ,GAAmBiJ,GACjCE,EAAgBnJ,GAAmBiC,GACrCiH,IAAgBC,IAClBR,EAAiBG,GAAgB,IAC5B7G,EACHpB,YAAY6D,EAAAA,GAAAA,KAAa8B,EAAAA,GAAAA,IAAWyC,EAAepI,WAAYoB,EAAQpB,YAAa8D,KAAKC,OACzFxE,aAAcpH,KAAKE,UAAU,IACxBF,KAAKC,MAAMgJ,EAAQ7B,cACtBC,KAAM,GAAF1P,OAAKuY,EAAW,QAAAvY,OAAOwY,OAIjCT,EAAkB/J,KAAKsD,EAAQvB,UACjC,MAAWgD,EAAAA,GAAAA,IAAWiF,EAAiBG,GAAcjI,WAAYoB,EAAQpB,YAAc,IACrF8H,EAAiBG,GAAgB7G,EACjCyG,EAAkB/J,KAAKsD,EAAQvB,WACjC,IAEK,CAAE+H,yBAAwBE,mBAAkBD,oBACrD,CI0B8EU,CAAoC,CAC1GZ,kBACAI,qBAAsBnD,EAAsBjF,SAC5CqI,oBAAqBpD,EAAsB6C,4BAC3CD,iBAaF,GAVA5C,EAAsBc,iBAAiB,IAEjCmC,EAAkB1R,OAAS,EAAI,CAAEwJ,SAAUmI,GAAqB,CAAC,EACrEL,4BAA6BG,EAC7BvC,2BACEmC,GAAgBM,EAAiB3R,OAAS,GACtCwP,EAAAA,GAAAA,IAAWf,EAAsBS,2BAA4BuC,GAC7DhD,EAAsBS,6BAG1BwC,EAAkB1R,OAAS,GAAKqR,EAAc,CAChDzC,EAAkB,GAClB,MAAMyD,EAAcnL,EAAY2B,iBAchC,GAbA6I,EAAkBpK,SAASoC,IACzB,MAAM7H,EAAUwQ,EAAY3V,MAAMmF,GAAYA,EAAQ6H,YAAcA,IAEhE7H,GAAWA,EAAQiH,cAAgBjH,EAAQyO,yBAC7CzO,EAAQoO,gBACV,IAGFxB,EAAsBjF,SAASlC,QAAQmI,GACvCvI,EAAYG,cAAcC,SAASC,IACjCA,EAAU+K,mBAAmB,IAG3BpL,EAAYqL,6BAA+BC,EAAAA,GAAAA,UAAsC,KAAAC,EAAAC,EACnF,MAAMC,EAA2D,QAA/CF,EAA0B,QAA1BC,EAAGxL,EAAYiK,mBAAW,IAAAuB,OAAA,EAAvBA,EAAyBjL,2BAAmB,IAAAgL,EAAAA,EAAI,GACrE3B,EAAqBxH,GAAkB,CAAE9B,OAAQmL,EAAcnJ,SAAUmI,IAC3E,CACF,CACF,GACA,CACEzK,EACAuH,EACAgB,EACAhF,EACAqG,EACAlC,IAIEgE,EAAiCpZ,IAAAA,aACrC,CAACqI,EAAkB+H,KACjB,MAAMiJ,EJpML,SAA8CzZ,GAUlD,IAVmD,QACpDyI,EAAO,WACP+H,EAAU,qBACVgI,EAAoB,oBACpBC,GAMDzY,EACC,MAAMmO,EAAY1F,EAAQuO,OACpB5I,EAASD,EAAUE,oBACnBC,EAAgBnB,GAAiBgB,GACvC,GAAIC,GAAUD,GAAaG,KAAmB7F,EAAQiR,WAA4B,YAAflJ,GAA2B,CAC5F,MAAMmJ,EAAelR,EAAQgF,SAASsJ,mBAChC6C,EAA8B,CAClCtJ,UAAW7H,EAAQ6H,UACnBC,OAAQ9H,EAAQ8H,OAChBnC,SACAqC,WAAYgI,EACZjI,aACAlC,gBACA0B,aAAcpH,KAAKE,UAAU6Q,IAGzBpB,EAAmB,IAAIC,GACvBqB,EAAqBtB,EAAiBI,WACzCmB,GAAmBA,EAAexJ,YAAcsJ,EAAWtJ,YAG9D,IAAIyJ,GAAoB,EACxB,GAAIF,GAAsB,EAAG,CAC3B,MAAMG,EAAgBzB,EAAiBsB,GACjCI,EAAmBD,EAAczJ,SAAWqJ,EAAWrJ,OACvD2J,EAAiBF,EAAcxJ,aAAeoJ,EAAWpJ,WACzD2J,EAAkBH,EAAchK,eAAiB4J,EAAW5J,aAC5DoK,EAAYF,GAAkBC,GAAmBF,GAEpDxR,EAAQgF,SAAS5D,kBAClBmQ,EAAc5L,SAAWA,GACzBgM,GAC6B,YAA7BJ,EAAcxJ,aAEd+H,EAAiBsB,GAAsBD,EACvCG,GAAoB,EAExB,MACExB,EAAiBhK,KAAKqL,GACtBG,GAAoB,EAGtB,MAAO,CACLxB,mBACAwB,oBACAH,aAEJ,CACF,CI0I2BS,CAAsC,CACzD5R,UACA+H,aACAgI,qBAAsBnD,EAAsBjF,SAC5CqI,qBAAqBnE,EAAAA,GAAAA,KACnB8B,EAAAA,GAAAA,IACEf,EAAsBS,2BACtBT,EAAsB6C,6BAExB3D,KAAKC,SAIT,GAAIiF,EAAc,CAChB,MAAM,kBAAEM,EAAiB,iBAAExB,EAAgB,WAAEqB,GAAeH,EACxDM,IACF1E,EAAsBc,iBAAiB,CAAE/F,SAAUmI,IACnDlC,EAAwBuD,GAE5B,IAEF,CAACvD,EAAyBhB,IAGtBiF,EAA6Bla,IAAAA,aAAkBkR,UACnD,MAAM,QAAEvD,GAAYF,GAAyCC,SAEvDoG,EAAkB,CAAEnG,UAASoG,gBAAiBkB,EAAsBS,mCACpEkC,GAAoB,GACzB,CAAClK,EAAaoG,EAAmBmB,EAAuB2C,IAErDuC,EAAkBna,IAAAA,aACtB,CAACqI,EAAkB+R,EAASC,KAC1B,MAAMC,EAAcjS,EAAQuO,OAG5B,IAAKvO,EAAQiH,aAAejH,EAAQgF,SAASkJ,YAAc+D,EACzD,OAEF,MAAMC,EAAuBxN,GAAiBuN,GACxCE,EAAoBF,EAAYrM,oBAMtC,GALsCP,EACnCG,cACA/G,MACEkG,GAAUD,GAAiBC,KAAWuN,GAAwBvN,EAAMiB,sBAAwBuM,IAE9D,CACjC,MAAMtE,GAAWmE,aAAO,EAAPA,EAASI,aAAcC,EAAAA,GAAAA,OACxCtB,EAA+B/Q,EAAS6N,EAAW,UAAY,SACjE,IAEF,CAACkD,EAAgC1L,IAGnC,MAAO,CACLuH,wBACAkF,kBACA7C,uBACA4C,6BACA1F,mBACA2C,2BACAlB,0BACAb,oBACAwC,qBAEJ,C,uOE9RA,SAAS+C,GAAmBjN,GAC1B,MAAM,gBACJyM,EAAe,2BACfD,EAA0B,mBAC1BtC,EAAkB,wBAClB3B,EAAuB,kBACvBb,EAAiB,iBACjBZ,GACED,GAA2B7G,GAEzBkN,EAAiC5a,IAAAA,SAAc,IAAM0N,EAAYuH,yBAAyB,CAACvH,IAC3FuH,GAAwBR,EAAAA,GAAAA,GAAcmG,EAAgC,CAAElG,gBAAiB,CAAC,cAC1FmG,ECvBD,SAAqB/a,GAC1B,MAAMgb,EAAM9a,IAAAA,SAIZ,OAHAA,IAAAA,WAAgB,KACd8a,EAAItT,QAAU1H,CAAK,GAClB,CAACA,IACGgb,EAAItT,OACb,CDiB+BuT,CAAYvG,GAEnCwG,EAAiChb,IAAAA,aAAkBkR,UACvDxD,EAAY2B,iBAAiBvB,SAASzF,IAE/B4M,EAAsBjF,SAASlJ,MAAM2K,GAAYA,EAAQvB,YAAc7H,EAAQ6H,aAClFiK,EAAgB9R,EAClB,UAKI+M,EAAkB,GAAIrO,GAAgC,SAAvBA,EAAKmH,gBAE1C0J,GAAmB,EAAK,GACvB,CAACA,EAAoBlK,EAAayM,EAAiBlF,EAAsBjF,SAAUoF,IAuDtF,OArDApV,IAAAA,WAAgB,KACVwU,GACFY,GACF,GACC,CAACA,EAAmBH,EAAsBjF,SAAUwE,IAEvDxU,IAAAA,WAAgB,KACd,IAAKwU,EAEH,YADA9G,EAAYuH,wBAAwBW,iBAAiBC,EAAAA,GAAAA,KAGvDnI,EAAYuH,wBAAwBW,iBAAiBC,EAAAA,GAAAA,QAChDgF,GAAwBrG,GAC3BwG,IAGF,IAAI,QAAErN,EAAO,eAAEC,GAAmBH,GAAyCC,GAE3E,MAAMuN,EAA2BA,KAC/B,MAAQtN,QAASuN,EAAYtN,eAAgBuN,GAC3C1N,GAAyCC,GAEzClF,KAAKE,UAAUiF,KAAanF,KAAKE,UAAUwS,IAC3C1S,KAAKE,UAAUkF,KAAoBpF,KAAKE,UAAUyS,KAElDxN,EAAUuN,EACVtN,EAAiBuN,EACjBvD,GAAmB,GACrB,EAGFwD,GAAAA,EAAAA,KAAgB,GAADjb,OAAIkb,EAAAA,GAAAA,iBAAkC,WAAWJ,GAChEK,EAAAA,EAAAA,KAAa,SAAUnB,GAEvBlF,EAAsBjF,SAASlC,QAAQmI,GACvC,MAAMsF,EAA6BC,YAAY5D,ELtD4B,MKwD3E,MAAO,KACL6D,cAAcF,GACdH,GAAAA,EAAAA,OAAkB,GAADjb,OAAIkb,EAAAA,GAAAA,iBAAkC,WAAWJ,GAClEK,EAAAA,EAAAA,OAAe,SAAUnB,EAAgB,CAC1C,GACA,CACDzM,EACAuH,EACA2C,EACAuC,EACAlE,EACAzB,EACAqG,EACAG,IAGK,CAAEd,6BAA4B1F,mBACvC,C,iHEvEA,SAASkH,GAAU9b,GAA6F,IAA5F,OAAEoO,EAAM,WAAE2N,EAAU,OAAEC,EAAM,GAAE7G,GAA4DnV,EAC5G,MAAMic,EAAe,CAAEC,EAAG9N,EAAQ+N,EAAGH,EAAQ5J,EAAG+C,GAC1CiH,EAAUL,IAAeM,EAAAA,GAAAA,MACzBC,EAAc,YAAYC,KAAKxN,OAAOyC,SAASgL,UAC/CC,EAAgBH,GAAeF,EAC/BM,GAAQJ,GAAeF,EAAUrN,OAAOyC,SAASgL,SAAW,eAElE,MAAO,GAAPjc,OAAUmc,EAAI,KAAAnc,OAAIoc,GAAAA,UAAsB,IAAKV,KAAkBQ,EAAgB,CAAEG,GAAI,KAAQ,CAAEvK,EAAG,UACpG,CAEA,SAASwK,KACP,MAAOC,EAAUC,IAAepa,EAAAA,EAAAA,WAAS,IAClCqa,EAAYC,IAAiBta,EAAAA,EAAAA,WAAS,IACtCua,EAAYC,IAAiBxa,EAAAA,EAAAA,WAAS,IACtCya,EAAOC,IAAY1a,EAAAA,EAAAA,UAAkB,KACpCyP,EAAGkL,IAAgBC,EAAAA,GAAAA,MAE3BC,EAAAA,EAAAA,YAAU,MACRlM,iBAA4B,IAAAmM,EAAAC,EACf,QAAXD,GAAAC,EAAA3O,QAAO4O,YAAI,IAAAF,GAAXA,EAAAG,KAAAF,EAAc,QAAS,OAAQ,CAAEG,eAAgB,UACjD,IACE,MACMT,SADa7L,EAAAA,GAAAA,IAAS,CAAEC,SAAU,uBAAwBI,mBAAoB,CAAC,QAClEwL,MAAM3Z,KAAKsR,IAAW,IACpCA,EACHgH,YAAY+B,EAAAA,EAAAA,IAAc/I,EAAK3G,YAGjCiP,EAASD,GACTH,GAAc,EAChB,CAAE,MACAF,GAAY,EACd,CACF,CAEAgB,EAAY,GACX,IAEH,MAAMC,GAAoBC,EAAAA,EAAAA,SAAO3M,UAAuB,IAAA1C,EAAAsP,EAAAC,EACtD,IAAKpP,OAAOqP,QAAQ,2CAA4C,OAEhE,MAAM/U,EAAO,CACX,CAAC,KAAM0L,EAAKI,IACZ,CAAC,SAAUJ,EAAK3G,QAChB,CAAC,cAAejF,SAASqI,SAAS6M,QAClC,CAAC,mBAAoBlV,SAASqI,SAASgL,UACvC,CAAC,cAAec,IAEf7Z,KAAK6a,GAAQA,EAAI5M,KAAK,OACtBA,KAAK,KAERyL,GAAc,GAEd,MAAMpJ,QAAiBwK,MAAM,wBAAyB,CACpDlV,OACAmV,QAAS,CACP,eAAgB,qCAElBzL,OAAQ,SAGV,GAAIuK,IAAgBmB,OAAO1J,EAAKI,IAE9B,YADApG,OAAOyC,SAASkN,KAAO3K,EAAS4K,MAMmC,QAAnD/P,EAA8B,QAA9BsP,EAAGnP,OAAOG,4BAAoB,IAAAgP,GAAW,QAAXA,EAA3BA,EAA6BU,iBAAS,IAAAV,GAAM,QAANA,EAAtCA,EAAwCnJ,YAAI,IAAAmJ,OAAA,EAA5CA,EAA8C/I,UAAE,IAAAvG,EAAAA,EAA4B,QAA5BuP,EAAIpP,OAAO8P,yBAAiB,IAAAV,GAAM,QAANA,EAAxBA,EAA0BpJ,YAAI,IAAAoJ,OAAA,EAA9BA,EAAgChJ,MACpFJ,EAAKI,IAK1BkI,GAAUD,GAAUA,EAAMvH,QAAQiJ,GAAcA,EAAU3J,KAAOJ,EAAKI,OACtEgI,GAAc,IALZpO,OAAOyC,SAASuN,QAKE,IAGtB,OAAK/B,GAAcF,EAEf1c,IAAAA,cAAA,OAAKmB,UAAU,2DACZub,EAAW,qDAAuD,YAKpD,IAAjBM,EAAMxW,OAENxG,IAAAA,cAAA,OACE,cAAY,+BACZmB,UAAU,2DACX,mBAOHnB,IAAAA,cAAAA,IAAAA,SAAA,KACGgd,EAAM3Z,KAAKsR,GACV3U,IAAAA,cAAA,OACE8C,IAAK6R,EAAKI,GACV5T,UAAU,oHACVsK,QAASA,IAAO1C,SAASqI,SAAWsK,GAAW/G,IAE/C3U,IAAAA,cAAA,OAAKmB,UAAU,iCACbnB,IAAAA,cAAA,MAAImB,UAAU,iBACXwT,EAAK3G,OACL2G,EAAKiK,SAAW,MAAQjK,EAAKiK,SAEhC5e,IAAAA,cAAA,QAAMmB,UAAU,UAAU,cAAY,2BACnCwT,EAAKkK,MAEO,KAAdlK,EAAKyC,KACJpX,IAAAA,cAAA,KAAGmB,UAAU,2DAA2DwT,EAAKyC,MAC3E,MAENpX,IAAAA,cAAA,OAAKmB,UAAU,kBACbnB,IAAAA,cAACwL,EAAAA,OAAM,CAAC,cAAY,+BAA8B,QAClDxL,IAAAA,cAACwL,EAAAA,OAAM,CACL,cAAY,gCACZ9F,SAAUoX,EACV5Q,MAAM,MACNT,QAAUzK,IACRA,EAAG8d,kBACHlB,EAAkBpW,QAAQmN,EAAK,GAElC,cAQb,CAEO,SAASoK,GAAY7a,GAC1B,OACElE,IAAAA,cAAC8K,EAAAA,OAAM,CAACV,MAAOlG,EAAMkG,MAAO,aAAW,aAAa,cAAY,qBAAqBjJ,UAAU,SAC7FnB,IAAAA,cAACmL,EAAAA,aAAY,CAACC,aAAcA,IAAMlH,EAAMkG,MAAMC,QAAQ,cACtDrK,IAAAA,cAACqL,EAAAA,WAAU,CAAClK,UAAU,aACpBnB,IAAAA,cAACyc,GAAS,OAEZzc,IAAAA,cAACgM,EAAAA,aAAY,KACXhM,IAAAA,cAACwL,EAAAA,OAAM,CAACC,QAASA,IAAMvH,EAAMkG,MAAMC,OAAQ,cAAY,6BAA4B,UAM3F,C,uOClJO,SAAS2U,GAAapf,GAKkB,IALjB,MAC5BoN,EAAK,SACLiS,EAAQ,wBACRC,KACGhb,GACwCtE,EAC3C,MAAMuf,GAAeC,EAAAA,EAAAA,iBAAgB,CAAEC,UAAW,iBAC3CC,EAAmBC,GAAwBvf,EAAAA,UAAe,GAC3D8a,EAAM9a,EAAAA,OAAa,MACnBwM,GAASC,EAAAA,EAAAA,kBACT+S,GAAWC,EAAAA,EAAAA,oBACXC,EAAcP,EAAa9U,KAoBjC,OAlBArK,EAAAA,WAAgB,KACd,MAAM2f,EAA2BA,KAC/B,MAAMC,EAAiBC,GAAAA,EAAAA,QAAqBC,GAAUA,EAAMC,aAAmC,IAArBD,EAAME,YAChFT,EAAqBK,EAAepZ,OAAS,EAAE,EAIjD,OADAqZ,GAAAA,EAAAA,KAAW,SAAUF,GACd,KACLE,GAAAA,EAAAA,OAAa,SAAUF,EAAyB,CACjD,GACA,IAEH3f,EAAAA,WAAgB,KACTsf,GAAsBE,EAASS,SAClCP,GACF,GACC,CAACJ,EAAmBE,EAASS,QAASP,IAEpC/Q,OAAOC,eAAesR,eAsBzBlgB,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAACmgB,EAAAA,SAAQ,CACPrF,IAAKA,EACL1Q,MAAOoV,EACP,aAAW,OACXP,SAAUA,EACVpf,MACEG,EAAAA,cAACwL,EAAAA,OAAMnK,GAAA,GACD6C,EAAK,CACTkc,YAAY,OACZjf,UAAW+d,EACX,cAAY,sBACZvX,aAAa,iBACb0Y,WAAYnc,EAAM4I,cAAWyE,EAAY,SACzCvG,MAAO9G,EAAM4I,cAAWyE,EAAY,YAIxCvR,EAAAA,cAACsgB,EAAAA,aAAY,CACX9e,GAAI8d,EAAoBiB,EAAAA,oBAAiBhP,EACzCnH,MAAOkV,EAAoBH,OAAe5N,EAC1C6O,YAAY,WACZ,cAAY,8BACZI,cAAc,EACdrf,UAAU,iBACVsK,QAASA,KACH6T,EACFH,EAAatS,ODoEpBqE,eAAwBuP,GAA0B,IAAAC,EAAAC,EAAAC,EACvD,MAAMjJ,EAAc8I,EAAY9I,YAC1BkJ,EAAmBlJ,EAAYmI,QAAQgB,UACvC,OAAE9S,EAAM,WAAE2N,EAAU,IAAEoF,GAAQpJ,EAC9BiE,EAASiF,EAAiBG,WAC1B,cAAEC,GAAkBR,EAAYS,SAChCC,EAAqBV,EAAYW,WACvCD,EAAOA,OAASE,EAAAA,GAAAA,QAChBF,EAAOG,SAAWL,EAAcM,OAAOD,SACvCH,EAAOK,UAAYP,EAAcM,OAAOC,UACxCL,EAAOM,OAASN,EAAOM,OACpBhM,QAAQiM,GAAkBA,EAAEC,UAAYZ,IACxC1d,KAAKqe,IAAa,IAAWA,EAAGE,UAAW,KAAMC,aAAa,aAE1DV,EAAOM,OAAO,GAAGE,QAGxB,MAgBMhU,EAhBmBmU,KACvB,IAAInU,EAAU,GACVoU,EAAgB,GACpB,IAAK,MAAMnL,KAAQkL,EACjB,IAAK,MAAMzZ,KAAWuO,EAAK5G,SACJ,oBAAjB3H,EAAQ7E,OACVue,EAAgB1Z,EAAQsF,SAQ9B,OAJAA,EAAUoU,EAAcC,MAAM,KAAKvM,QAAQ1O,GAASA,IAC/C4G,EAAQlG,SAASuG,IACpBL,EAAQQ,KAAKH,EAAOiU,QAAQ,IAAK,KAE5BtU,CAAO,EAEAuU,CAAgBf,EAAOM,OAAO,GAAGU,OAC3CC,EAASvC,GAAAA,EAAAA,QACZC,GACCnS,EAAQlG,SAASqY,EAAM9R,SAAW8R,EAAMkB,YAAcrJ,EAAYqJ,WAAaP,EAAY4B,SAASvC,EAAMwC,UAC5G7M,QAAO,CAACpN,EAASwL,EAAO0O,IAAUA,EAAMhK,WAAWuD,GAAMA,EAAE9N,SAAW3F,EAAQ2F,WAAY6F,IACtF2O,EAAmBha,KAAKE,UAAU0Z,EAAO/e,KAAKof,GAAMC,KAAKD,EAAE3B,SAAU,CAAC,SAAU,iBAEhF6B,EAAQna,KAAKE,UAAUyY,GACvB/J,GACY,QAAhBsJ,EAAAD,EAAY9L,YAAI,IAAA+L,OAAA,EAAhBA,EAAkBtJ,OAClBtH,GAAkB,CAAE9B,SAAQgC,SAAUyQ,EAAYxL,wBAAwBjF,YAC1E,GACS,QAAX2Q,GAAAC,EAAAjS,QAAO4O,YAAI,IAAAoD,GAAXA,EAAAnD,KAAAoD,EAAc,QAAS,OAAQ,CAAEnD,eAAgB,UAE7C9P,EAAQnH,SAAW4b,EAAO5b,SAC5BkM,EAAAA,EAAAA,IAAiB,IAAIL,MAAM,4CAA6C,CACtEoB,MAAO,CACL9F,UACAiV,uBAAwBR,EAAO/e,KAAKyc,IAAK,CAAQ9R,OAAQ8R,EAAM9R,OAAQgT,UAAWlB,EAAMkB,cACxFtT,YAAa+S,EAAYoC,SAAS,CAAC,SAAU,aAKnD,MAAMC,QAAa3R,EAAAA,GAAAA,IAAyB,CAC1CC,SAAU,sBACVuB,OAAQ,OACR1J,MAAM8Z,EAAAA,GAAAA,IAAsB,CAAE/U,SAAQ4N,SAAQ+G,QAAOP,OAAQI,EAAkBpL,WAG3E4L,EAAUtH,GAAW,CACzB1N,SACA4N,SACAD,aACA5G,GAAI+N,EAAK/N,KAQTxB,YAAW,KACT5E,OAAOsU,KAAKD,EAAS,kBAAkB,GAG7C,CChJYE,CAASlW,EAAM,GAElB,aAGDhN,EAAAA,cAACsgB,EAAAA,aAAY,CACX9e,GAAI2hB,EAAAA,cACJ/Y,MAAOoC,EACP4T,YAAY,WACZ,cAAY,+BACb,cAIHpgB,EAAAA,cAAC+e,GAAW,CAAC3U,MAAOoC,IACpBxM,EAAAA,cAACojB,EAAAA,QAAO,CAAChZ,MAAO+U,EAAche,UAAU,QACtCnB,EAAAA,cAAA,OAAKmB,UAAU,QACbnB,EAAAA,cAACqjB,EAAAA,QAAO,CAACxhB,MAAO,MAElB7B,EAAAA,cAAA,QAAMmB,UAAWmiB,IAAW,OAAQ,CAAE,QAAQC,EAAAA,EAAAA,SAA4B,8CArE5EvjB,EAAAA,cAACwL,EAAAA,OAAMnK,GAAA,GACD6C,EAAK,CACT1C,GAAG,IACH8c,KAAI,eAAAne,QAAiBqjB,EAAAA,GAAAA,GAAkB,CACrCC,WAAY,SACZC,WAAY,SACZC,aAAc,wBAEhBvD,YAAY,OACZjf,UAAW+d,EACX,cAAY,sBACZvX,aAAa,iBACb0Y,WAAYnc,EAAM4I,cAAWyE,EAAY,SACzCvG,MAAO9G,EAAM4I,cAAWyE,EAAY,QACpC0N,SAAUA,IA6DlB,CCzIO,MAAM2E,GAA0B,CACrCC,SAAUA,IAAM,6BAChBC,SAAU,kB,uOCaL,SAASC,GAAOnkB,GAA6D,IAA5D,MAAEoN,KAAU9I,GAA8CtE,EAChF,MAAM4M,GAASC,EAAAA,EAAAA,mBACRuX,GAAoB,UAAEC,KAAeC,EAAAA,EAAAA,GAAe,IACtDN,GACHO,iBAAkB3X,EAAOyT,QACzBmE,cAAe,SACfC,QAASA,IAAM7X,EAAOnC,SAElBia,EAAgBN,aAAkB,EAAlBA,EAAoBO,QACpCC,EAAcP,EAChB,CACE7D,YACEpgB,EAAAA,cAACykB,EAAAA,QAAO,CACNC,eACE1kB,EAAAA,cAAC2kB,EAAAA,KAAI,CAACxgB,KAAK,QAAQhD,UAAWmiB,IAAW,CAAE,aAA8B,eAAhBpf,EAAMgI,WAGjElM,EAAAA,cAACqjB,EAAAA,QAAO,CAACxhB,MAAO,OAItB,CACEL,GAAI2hB,EAAAA,cACJ/Y,MAAOoC,EACP4T,YAAa,SAEnB,OACEpgB,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAACwL,EAAAA,OAAMnK,GAAA,GACDmjB,EACAtgB,EAAK,CACTyD,aAAa,iBACbjD,OAAQ8H,EAAOyT,QACfI,WAAYnc,EAAM4I,cAAWyE,EAAY,SACzCvG,MAAO9G,EAAM4I,cAAWyE,EAAY,iBAErC+S,GAAiBtkB,EAAAA,cAACskB,EAAa,CAACla,MAAOoC,EAAQiU,YAAazT,IAGnE,C,uOCjCA,MAAM4X,GAAYjW,OAAOC,eAAesR,eAwIjC,SAAS2E,GAAUjlB,GAAiF,IAAhF,KAAEklB,EAAI,UAAE3jB,EAAS,MAAE+K,KAAUhI,GAAiDtE,EACvG,MAAMmlB,GAAOC,EAAAA,EAAAA,WACPC,EAvIR,SAAiBH,GACf,MAAO,CACL,CACE/P,GAAI,aACJmQ,MAAO,CACL,CACEla,MAAO,aACP/B,KAAM,2GAEJ2b,GACA,CACE,CACE5Z,MAAO,qBACP/B,KAAM,2FACNlF,OAAQ,yCAEV,CACEiH,MAAO,uBACP/B,KAAM,+KACNlF,OAAQ,yCAEV,CACEiH,MAAO,2BACP/B,KAAM,wGACNlF,OAAQ,YAEV,CACEiH,MAAO,qBACP/B,KAAM,oKACNlF,OAAQ,mCAGZ,CACE,CACEiH,MAAO,sBACP/B,KACEjJ,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAA,KACEse,KAAI,eAAAne,QAAiBqjB,EAAAA,GAAAA,GAAkB,CACrCC,WAAY,SACZC,WAAY,SACZC,aAAc,gBAEhB5f,OAAO,SACP5C,UAAU,YACX,gBAEI,IAAI,6GAEFnB,EAAAA,cAAA,WAAM,uGAIjB+D,OAAQ,wCACRsb,UAAW,iBAGnB,CACErU,MAAO,uBACP/B,KAAM2b,GACF,qGACA,kHACJ7gB,OAAQ,sCACRsb,UAAW,mBAETyF,IAAS9L,EAAAA,GAAAA,UACT,GACA,CACE,CACEhO,MAAO,8BACP/B,KAAM,+IACNlF,OAAQ,4CAGXohB,EAAAA,EAAAA,IAAqBpc,SAASqc,kBAAoBN,IAAS9L,EAAAA,GAAAA,UAE5D,CACE,CACEhO,MAAO,kBACP/B,KACE6b,IAAS9L,EAAAA,GAAAA,UACL,oFACA,gDACNjV,OAAQ,0CACRsb,UAAWyF,IAAS9L,EAAAA,GAAAA,UAAuC,SAAW,eAT1E,GAYJ,CACEhO,MAAO,cACP/B,KAAM,uDACNlF,OAAQ,wCACRshB,eAAgBP,IAAS9L,EAAAA,GAAAA,UAAuC,OAAIzH,EACpE8N,UAAW,cAETiG,EAAAA,EAAAA,OAAuBR,IAAS9L,EAAAA,GAAAA,UAChC,CACE,CACEhO,MAAO,QACP/B,KAAM,2CACNlF,OAAQ,uCAGZ,GACJ,CACEiH,MAAO,iBACP/B,KAAM,+FACNlF,OAAQ,0CACRsb,UAAWyF,IAAS9L,EAAAA,GAAAA,UAAuC,SAAW,gBAI5E8L,IAAS9L,EAAAA,GAAAA,WAAwC,CAC/CjE,GAAI,oBACJmQ,MAAO,CACL,CACEla,MAAO,0BACP/B,KAAM,oKACNlF,OAAQ,wCACRsb,UAAW,iBAIjB5J,OAAO8P,QACX,CAYoBC,CAAQV,IACnBW,EAAUC,GAAkB1lB,EAAAA,SAAe+kB,EAAKY,gBAAgBV,IACjEW,EAAcH,EAASI,YAAc,OAAS3Z,QAAAA,EAAS,aAE7D,OACElM,EAAAA,cAACwL,EAAAA,OAAMnK,GAAA,GACD6C,EAAK,CACTgI,MAAO0Z,EACPxF,YACE2E,EAAKd,UACHjkB,EAAAA,cAACykB,EAAAA,QAAO,CACNC,eACE1kB,EAAAA,cAAC2kB,EAAAA,KAAI,CAACxgB,KAAK,kBAAkBhD,UAAWmiB,IAAW,CAAE,aAA8B,eAAhBsC,OAGrE5lB,EAAAA,cAACqjB,EAAAA,QAAO,CAACxhB,MAAO,MAGlB7B,EAAAA,cAAC2kB,EAAAA,KAAI,CAACxgB,KAAK,kBAAkBhD,UAAWmiB,IAAW,CAAE,aAA8B,eAAhBsC,MAGvEzkB,UAAWA,EACXwG,aAAcmd,IAAS9L,EAAAA,GAAAA,UAAuC,iBAAmB,GACjFhO,MAAM,uBACNS,QAASyF,UACP,GAAIuU,EAAU,CACZ,MAAMK,QAAmBf,EAAKgB,UAAUN,EAASV,MACjDe,SAAAA,EAAYE,KAAK,YAAY,KAC3BN,EAAeX,EAAKY,gBAAgBV,GAAW,GAEnD,KAIR,C,qPCzLA,MAAMgB,IAAuB,EAEtB,SAASC,GAAgBtmB,GAU7B,IAAAumB,EAAAC,EAAA,IAV8B,UAC/BxB,EAAS,MACT5X,KACG9I,GAOJtE,EACC,MAAM,WAAEymB,EAAU,eAAEC,GCJf,SAAsB1mB,GAAmE,IAAlE,UAAEglB,EAAS,MAAE5X,GAAmDpN,EAC5F,MAAMwR,GAAWmV,EAAAA,GAAAA,gBACX,EAAEtT,EAAC,EAAE6I,EAAC,GAAEU,EAAE,GAAEgK,EAAE,EAAEzK,EAAI,IAAG,EAAEzI,IAAM6J,EAAAA,GAAAA,GAAkB/L,EAAS6M,QAC1DwI,EAAQjK,EAAK3W,OAAOtB,SAASiY,GAAM,EACnCN,EAAclP,EAAM+L,6BAA+BC,EAAAA,GAAAA,UAEnDsN,EAAiBtmB,EAAAA,aAAkB,KAAM,IAAAgU,EAC7C,MAAM0S,EACqF,QAD1E1S,EACbwS,GAAyCG,GAAAA,GAAqBH,UAAyB,IAAAxS,EAAAA,EACxFrF,OAAOiY,uBAEV,OAAQhC,GAAa8B,IAAgBG,GAAAA,GAAAA,aAA6C,IAAVJ,EAEpEC,EADAG,GAAAA,GAAAA,iBACW,GACd,CAACjC,EAAW6B,EAAOD,IAEhBM,EAAqB9mB,EAAAA,aACxBwD,GACKohB,GAAamC,GAAAA,GAAAA,SAAiCvjB,GACzC,GAAPrD,OAAUiR,EAASgL,SAAQ,KAAAjc,QAAIqjB,EAAAA,GAAAA,GAAkB,CAC/CvQ,IACA6I,IACAxI,IACAkT,GACEhjB,IAASqjB,GAAAA,GAAAA,kBACLG,GAAAA,GAAAA,YACAA,GAAAA,GAAqBxjB,GAC3BgZ,GAAIhZ,IAASqjB,GAAAA,GAAAA,YAAkC,IAAM,IACrD9K,OAGG,eAAP5b,QAAsBqjB,EAAAA,GAAAA,GAAkB,CACtCC,WAAY,SACZC,WAAY,SACZC,aAAc,8BAGlB,CAACiB,EAAWxT,EAASgL,SAAUnJ,EAAG6I,EAAGxI,EAAGyI,IAa1C,MAAO,CAAEuK,iBAAgBD,WAVNrmB,EAAAA,SAAc,KACf4kB,IAAc1I,EAAc+K,GAAAA,GAAgBC,GAAAA,IAE7C7jB,KAAK0D,IAAI,IACnBA,EACHuX,KAAMwI,EAAmB/f,EAAKjH,OAC9BqnB,gBAAiBvC,OAElB,CAACkC,EAAoBlC,EAAW1I,IAGrC,CD/CyCkL,CAAc,CAAExC,YAAW5X,UAC5Dqa,EAAcf,KACbgB,EAAcC,GAAmBvnB,EAAAA,SAAeqnB,GACjDG,EAA6D,QAAzDrB,EAAGE,EAAWnjB,MAAM6D,GAASA,EAAKjH,QAAUwnB,WAAa,IAAAnB,OAAA,EAAtDA,EAAwDsB,SAMrE,OAJAznB,EAAAA,WAAgB,KACdunB,EAAgBF,EAAY,GAC3B,CAACA,IAGFrnB,EAAAA,cAACgD,EAAAA,OAAM3B,GAAA,GACD6C,EAAK,CACT,cAAY,oBACZ,aAAW,aACXpE,MAAOwnB,EACPrkB,MAAOojB,EACPllB,UAAU,cACVwG,aAAa,WACb+f,UAAW,CAAEzI,SAAU/a,EAAM+a,UAC7BmB,YACkB,SAAhBlc,EAAMgI,MACJsb,EAEAxnB,EAAAA,cAAC2kB,EAAAA,KAAI,CAACxgB,KAA4D,QAAxDiiB,EAAEC,EAAWnjB,MAAM6D,GAASA,EAAKjH,QAAUwnB,WAAa,IAAAlB,OAAA,EAAtDA,EAAwDqB,SAAUtmB,UAAU,kBAG5FG,aAA8B,SAAhB4C,EAAMgI,MAAmB,iBAAcqF,EACrDoW,4BAA4B,EAC5B1B,qBAAsBA,GACtBlmB,SAAWgH,GAAyBwgB,EAAgBxgB,EAAKjH,SAExDumB,EAAWhjB,KAAK0D,GACf/G,EAAAA,cAACsD,EAAAA,aAAY,CACX9B,GAAIuF,EAAKuX,KAAOsJ,GAAAA,UAAOrW,EACvBpM,GAAI4B,EAAKuX,KACT6I,eAAgBpgB,EAAKuX,MAAQ3P,OAAOC,eAAesR,oBAAiB3O,EACpE,0CAAApR,OAAyC4G,EAAKjH,OAC9CgD,IAAKiE,EAAKjH,MACVsgB,YAAarZ,EAAK0gB,SAClBxI,SAAU/a,EAAM+a,UAEflY,EAAKlH,SAKhB,CE9CA,MAAMgoB,GAAsB,CAAC,SAAU,UACjCC,GAA4B,IAAID,MAAwBvhB,OAAOsD,OAAOme,GAAAA,IAE5E,SAASC,GAAWpoB,GAAuD,IAAtD,SAAEkN,EAAQ,aAAEmb,EAAY,OAAEC,GAA0BtoB,EACvE,OACEI,EAAAA,cAACuB,EAAAA,UAAS,CACRE,KAAMymB,EAAS,OAAS,QACxB/mB,UAAWmiB,IAAW,sCAAuC,CAC3D,iBAAkB2E,EAAe,EACjC,eAAgBA,EAAe,KAGhCnb,EAGP,CA2CO,MAAMqb,GAAqBnoB,EAAAA,MAChCooB,EAAAA,EAAAA,IA1CK,SAAoCpU,GAAwB,IAAAqU,EAAAC,EAAA,IAAvB,WAAEC,GAAmBvU,EAC/D,MAAOwU,IAAgBtE,EAAAA,EAAAA,GAAe,IACjCuE,EAAAA,EACHC,gBAAgB,KAEZ,iBAAEvZ,GAAqBqZ,EAAaG,4BACpCC,GAAanU,EAAAA,GAAAA,GAA0D,QAA7C4T,EAAClZ,aAAgB,EAAhBA,EAAkB0Z,eAAeN,UAAW,IAAAF,EAAAA,EAAI,KAAM,CACrF3T,gBAAiB,CAAC,SAClBoU,eAAgBjB,KAEZkB,GAAatU,EAAAA,GAAAA,GAAiC,QAApB6T,EAACM,aAAU,EAAVA,EAAY9I,eAAO,IAAAwI,EAAAA,EAAI,KAAM,CAC5D5T,gBAAiB,CAAC,YAAa,YAAa,cAC5CoU,eAAgBhB,KAGZkB,EAAeD,IAAcE,EAAAA,EAAAA,IAAgB,CAAEnG,KAAMiG,IACrDb,IACFc,UAAAA,EAAcA,eAChBE,GAAAA,GAAAA,2BAAgC,CAC9BvN,WAAYoN,EAAYpN,WACxB7b,MAAOipB,EAAYI,aACf,EAER,OACEnpB,EAAAA,cAAA,OAAKmB,UAAU,8EACZ6nB,aAAY,EAAZA,EAAcA,eACbhpB,EAAAA,cAAAA,EAAAA,SAAA,KACGgpB,EAAaI,mBACZppB,EAAAA,cAACgoB,GAAW,CAACC,aAAce,EAAaI,kBAAkBC,OAAQnB,OAAQA,GACvEc,EAAaI,kBAAkBE,QAGpCtpB,EAAAA,cAACgoB,GAAW,CAACC,aAAce,EAAaA,aAAaK,OAAQnB,OAAQA,GAClEc,EAAaA,aAAaM,SAMvC,KAIE,CAACC,EAAWC,IAAcD,EAAUhB,aAAeiB,EAAUjB,a,uOCzE/D,MAAMkB,GAAmE,CACvE,CAACzQ,EAAAA,GAAAA,WAAuC,oBACxC,CAACA,EAAAA,GAAAA,aAAyC,4BAC1C,CAACA,EAAAA,GAAAA,WAAuC,0BACxC,CAACA,EAAAA,GAAAA,YAAwC,4BAGrC0Q,GAA8D,CAClE,CAAC1Q,EAAAA,GAAAA,WAAuC,wBACxC,CAACA,EAAAA,GAAAA,aAAyC,sBAC1C,CAACA,EAAAA,GAAAA,WAAuC,oBACxC,CAACA,EAAAA,GAAAA,YAAwC,sBAYpC,SAAS2Q,GAAU/pB,GAImB,IAJlB,UACzBglB,EAAS,2BACT7L,KACG7U,GACsCtE,EACzC,MAAM4kB,EAAcxkB,EAAAA,SAAc,IAC3B4kB,EAWE,CACLnZ,QAAUzK,IACRA,EAAG2J,iBACH,MAAMif,GAAWC,EAAAA,EAAAA,MAAwB,MAAQ,KAEjD1L,MAAM,+BAAiC2L,EAAAA,GAAsB,UAAYF,GACtEG,OAAM,SACNC,MAAMC,IACL,GAAKA,UAAAA,EAAKC,GAAI,CAEZ,MAAMC,EAAU,IAAIhW,KACpBgW,EAAQC,SAASD,EAAQE,WAAa,GACtCC,EAAAA,GAAAA,UAAgBR,EAAAA,GAAqBF,EAAUO,EACjD,CAEA,MAAQnY,KAAYuY,IAASpN,EAAAA,GAAAA,KACzBxI,EACF5L,SAASqI,SAAW,cAAHjR,QAAiBqjB,EAAAA,GAAAA,GAAkB+G,IAEpDxhB,SAASqI,SAASuN,QACpB,GACA,GA/BC,CACLnd,GAAI,IACJ8c,KAAM,eAAFne,QAAiBqjB,EAAAA,GAAAA,GAAkB,CACrCC,WAAY,SACZC,WAAY,SACZC,aAAc8F,GAAY1Q,QA6B/B,CAAC6L,EAAW7L,IAEf,OACE/Y,EAAAA,cAACwL,EAAAA,OAAMnK,GAAA,GACDmjB,EACAtgB,EAAK,CACTkc,YAAY,OACZ,cAAasJ,GAAO3Q,GACpBsH,WAAYnc,EAAM4I,cAAWyE,EAAY,SACzCvG,MAAO9G,EAAM4I,cAAWyE,EAAY,SAG1C,C,uOCtEA,SAASiZ,GAAcC,GACrB,OAAQA,GACN,KAAK,EACL,KAAK,EACH,MAAO,OACT,KAAK,EACH,MAAO,OACT,KAAK,EACH,MAAO,OACT,KAAK,EACH,MAAO,OAET,QAEE,MAAO,OAEb,CAEA,MAAMhB,GAAmE,CACvE,CAACzQ,EAAAA,GAAAA,WAAuC,0BACxC,CAACA,EAAAA,GAAAA,aAAyC,4BAC1C,CAACA,EAAAA,GAAAA,WAAuC,0BACxC,CAACA,EAAAA,GAAAA,YAAwC,4BAYpC,SAAS0R,GAAgB9qB,GAAiF,IAAhF,MAAEoN,EAAK,UAAE4X,KAAc1gB,GAAuDtE,EAC7G,MAAMwR,GAAWmV,EAAAA,GAAAA,gBACX,EAAEvU,EAAC,EAAE+J,EAAI,IAAG,EAAEzI,IAAM6J,EAAAA,GAAAA,GAAkB/L,EAAS6M,QAC/C0M,EAAa3d,EAChByU,SACAmJ,MACAvnB,KAAKsf,GAAUA,EAAM7C,QAAQ+K,iBAEhC,OACE7qB,EAAAA,cAACwL,EAAAA,OAAMnK,GAAA,GACD6C,EAAK,CACT1C,GAAG,IACH4e,YAAY,aACZrc,OAAQ6gB,EAAY,cAAWrT,EAC/B8O,WAAYnc,EAAM4I,cAAWyE,EAAY,SACzCvG,MAAO9G,EAAM4I,cAAWyE,EAAY,aACpC,cAAY,0BACZ+M,KACEsG,EAAS,WAAAzkB,QACMqjB,EAAAA,GAAAA,GAAkB,CAC3BxR,IACA8J,GA7DYnO,EA6DQgd,EA7DWF,EA6DCE,EAAWnkB,OA5DhDskB,MAAM7lB,KAAK,CAAEuB,OAAQZ,KAAKjE,IAAI8oB,EAAc,KAChDpnB,KAAI,CAAC+W,EAAGvG,KAAK,IAAAkX,EAAA,OAAmB,QAAnBA,EAAKpd,EAAQkG,UAAM,IAAAkX,EAAAA,EAAIpd,EAAQA,EAAQnH,OAAS,EAAE,IAC/D8K,KAAK,MA2DIyK,EAAG4O,EAAWtnB,KAAI,IAAM0Y,IAAGzK,KAAK,KAChCW,EAAGuY,GAAcG,EAAWnkB,QAC5B8M,OACA,eAAAnT,QACaqjB,EAAAA,GAAAA,GAAkB,CAC/BC,WAAY,SACZC,WAAY,SACZC,aAAc8F,GAAYzc,EAAM+L,kCArE9C,IAA0BpL,EAAmB8c,CA0E7C,CC1De,SAASO,GAAMprB,GAAoE,IAAnE,OAAEoO,EAAM,WAAE2N,EAAU,iBAAEsP,EAAgB,WAAE1C,GAAyB3oB,EAC9F,MAAMsrB,GAAgBzL,EAAAA,EAAAA,kBAAiB,CAAEJ,UAAW,eAC9C8L,GAAwB1e,EAAAA,EAAAA,kBACxB2e,GAAoB3e,EAAAA,EAAAA,kBAEpB4e,EAAarrB,IAAAA,SAAc,KAC/B,MAAMsrB,EAAkBtd,EAAOiU,QAAQ,IAAK,IAE5C,OAAQtG,GACN,KAAKM,EAAAA,GAAAA,MACH,MAAO,iBAAP9b,OAAwBmrB,GAC1B,KAAKrP,EAAAA,GAAAA,QACH,MAAO,0BAAP9b,OAAiCmrB,GACnC,KAAKrP,EAAAA,GAAAA,MACH,MAAO,wBAAP9b,OAA+BmrB,GACjC,KAAKrP,EAAAA,GAAAA,OACH,MAAO,yBAAP9b,OAAgCmrB,GACpC,GACC,CAACtd,EAAQ2N,IAEZ,OACE3b,IAAAA,cAAA,OAAKmB,UAAU,2CACbnB,IAAAA,cAACurB,EAAAA,OAAsB,CACrBhD,WAAYA,EACZ1kB,YAAamK,EACbvM,KAAK,SACL+pB,WAAW,kIACXC,cAAc,EACdC,kBAAkB,EAClBC,kBAAkB,EAClBV,iBAAkBA,EAClB3pB,aACEtB,IAAAA,cAACmgB,EAAAA,SAAQ,CACP/V,MAAO8gB,EACP,aAAW,eACXrrB,MACEG,IAAAA,cAACwL,EAAAA,OAAM,CACLhI,KAAK,SACL/B,KAAK,OACLN,UAAU,+CACV+K,MAAM,cACNmU,WAAW,SACX/e,aAActB,IAAAA,cAAC2kB,EAAAA,KAAI,CAAC9iB,MAAO,GAAIsC,KAAK,YAIxCnE,IAAAA,cAACsgB,EAAAA,aAAY,CACX9e,GAAG,IACHuC,OAAO,SACPua,KAAM+M,EACN5f,QAASA,KAAM,IAAA4R,EAAAC,EACF,QAAXD,GAAAC,EAAA3O,QAAO4O,YAAI,IAAAF,GAAXA,EAAAG,KAAAF,EAAc,QAAS,QAAS,CAAEG,eAAgB,qBAAsB,GAGzE9B,IAAeM,EAAAA,GAAAA,MAAmB,oBAAsB,eAE1DN,IAAeM,EAAAA,GAAAA,OACdjc,IAAAA,cAACsgB,EAAAA,aAAY,CACX9e,GAAI2hB,EAAAA,cACJ/Y,MAAO+gB,EACP1f,QAASA,KAAM,IAAAkV,EAAAC,EACF,QAAXD,GAAAC,EAAAjS,QAAO4O,YAAI,IAAAoD,GAAXA,EAAAnD,KAAAoD,EAAc,QAAS,QAAS,CAAEnD,eAAgB,qBAAsB,GAE3E,qBAIF9B,IAAeM,EAAAA,GAAAA,OACdjc,IAAAA,cAACsgB,EAAAA,aAAY,CACX9e,GAAI2hB,EAAAA,cACJ/Y,MAAOghB,EACP3f,QAASA,KAAM,IAAAmgB,EAAAC,EACF,QAAXD,GAAAC,EAAAld,QAAO4O,YAAI,IAAAqO,GAAXA,EAAApO,KAAAqO,EAAc,QAAS,QAAS,CAAEpO,eAAgB,gBAAiB,GAEtE,mBAOTzd,IAAAA,cAAC8K,EAAAA,OAAM,CAACV,MAAO+gB,EAAuB,aAAW,oBAAoBhqB,UAAU,SAC7EnB,IAAAA,cAAC8rB,EAAAA,gBAAe,CAAC9d,OAAQA,EAAQ+d,QAASZ,EAAsB9gB,QAElErK,IAAAA,cAAC8K,EAAAA,OAAM,CAACV,MAAOghB,EAAmB,aAAW,eAAejqB,UAAU,aACpEnB,IAAAA,cAACgsB,EAAAA,YAAW,CAAChe,OAAQA,EAAQ+d,QAASX,EAAkB/gB,QAIhE,C,uOCjGA,MAAM4hB,GAAiB,IACjBC,GAAwB,GACxBC,GAAsB,mBAEtB1C,GAAmE,CACvE,CAACzQ,EAAAA,GAAAA,WAAuC,wBACxC,CAACA,EAAAA,GAAAA,aAAyC,0BAC1C,CAACA,EAAAA,GAAAA,WAAuC,wBACxC,CAACA,EAAAA,GAAAA,YAAwC,0BAKpC,SAASoT,GAA8BxsB,GAAuD,IAAtD,MAAEwK,EAAK,MAAE4C,GAA2CpN,EACjG,MAAQysB,aAAcC,IAAcC,EAAAA,EAAAA,mBAAkBxjB,SAASE,OACxDuf,IAAgBtE,EAAAA,EAAAA,GAAe,IACjCuE,EAAAA,EACHC,gBAAgB,KAEZ,6BAAE8D,EAA4B,cAAEvL,GAAkBuH,GAClD,cAAEiE,IAAkBC,EAAAA,EAAAA,wBAAuBtiB,GAC3CuiB,EAAe5jB,SAAS6jB,eAAe,SACvCC,EAAwB9jB,SAAS6jB,eAAeT,IAChDW,EAAoC1iB,EAAM2iB,sBAAsBvlB,QAEhEwlB,EAAgBhtB,IAAAA,SAAiC,KACrD,MAAMitB,EAAsC,CAAC,EAC7C,IAAKH,IAAmBH,EACtB,OAAOM,EAET,MAAMC,EAAaJ,EAAeK,wBAC5BC,EAAYF,EAAWG,IAAMH,EAAWI,OAM9C,GALAL,EAAiBhkB,KAAO,CACtBskB,UAAW5e,OAAO6e,YAAcJ,EAAoC,EAAxBlB,GAC5CuB,SAAU,SACVJ,KAAMD,EAAYlB,GAAwBvd,OAAO+e,UAE9Cb,EACH,OAAOI,EAET,MAAMU,EAAchB,EAAaiB,aAC3BC,EAAuBhB,EAAsBiB,aAC7CC,EAAiBzB,EAAYtf,EAAMnL,MACnCmsB,EAAY/B,GAAiBiB,EAAWrrB,MAE9C,IAAIosB,EAAcF,EAAiB,IAAOA,EAAiB,GAAM,EAAI,EAQrE,OAPIA,EAAiB,EAAIC,IAAWC,GAA2B,EAAbD,GAElDf,EAAiBiB,QAAU,CACzBZ,OAAQO,EAAuBF,EAAcA,OAAcpc,EAC3D4c,YAAaF,GAGRhB,CAAgB,GACtB,CAACH,EAAgBH,EAAcE,EAAuB7f,EAAMnL,MAAOyqB,IAEtE,OACEtsB,IAAAA,cAACwsB,EAA4B,CAACthB,OAAQd,EAAMC,OACzC2J,IAAA,IAAC,+BAAEoa,GAAgCpa,EAAA,OAClChU,IAAAA,cAACquB,EAAAA,QAAO,CACNtZ,GAAIoX,GACJ,aAAW,iBACXhrB,UAAU,0DACViJ,MAAOA,EACP3H,MAAOuqB,EAAc/jB,KACrBqlB,oBAAqBtB,EAAckB,QACnCK,aAAa,EACbC,oBAAoB,EACpBvjB,eAAgBmjB,IAEd3B,GAAiBzsB,IAAAA,cAACihB,EAAa,CAACjX,SAAUA,OAAU+hB,QAASqC,IACvD,GAIlB,CAWO,SAASK,GAAmBjW,GAKmB,IALlB,UAClCoM,EAAS,MACT5X,EAAK,UACLqS,KACGnb,GAC+CsU,EAClD,MAAMkW,GAAuBC,EAAAA,EAAAA,iBAAgB,CAAEtP,UAAWA,QAAAA,EAAa,eAEjEmF,EAAcxkB,IAAAA,SAAc,IAC5BgN,EAAM+L,6BAA+BC,EAAAA,GAAAA,WAAyC4L,EAW3E,CACLpjB,GAAIotB,EAAAA,eACJxkB,MAAOskB,EACPhqB,OAAQgqB,EAAqBzO,SAbtB,CACLze,GAAI,IACJ8c,KAAM,eAAFne,QAAiBqjB,EAAAA,GAAAA,GAAkB,CACrCC,WAAY,SACZC,WAAY,SACZC,aAAc8F,GAAYzc,EAAM+L,iCAUrC,CAAC/L,EAAO4X,EAAW8J,IAEtB,OACE1uB,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAACwL,EAAAA,OAAMnK,GAAA,GACDmjB,EAAW,CACfqK,WAAW,EACX,cAAY,0BACZxO,WAAYnc,EAAM4I,cAAWyE,EAAY,SACzCvG,MAAO9G,EAAM4I,cAAWyE,EAAY,iBACpC6O,YAAY,iBACRlc,IAENlE,IAAAA,cAACosB,GAA8B,CAAChiB,MAAOskB,EAAsB1hB,MAAOA,IAG1E,C,eClIA,MAAM8hB,GAAsBlG,GAAiB,YAAAzoB,OAC/ByoB,EAAW5a,OAAM,KAAA7N,OAAIyoB,EAAWjN,WAAU,KAAAxb,OAAIyoB,EAAW7T,IAEhE,SAASga,GAAgBnvB,GAM7B,IAAAovB,EAAAC,EAAA3G,EAAA,IALDM,WAAYsG,EAAmB,cAC/BC,GAIDvvB,EACC,MAAMwR,GAAWmV,EAAAA,GAAAA,eACX6I,GAAWC,EAAAA,GAAAA,eACXzG,GAAanU,EAAAA,GAAAA,GAAcya,EAAqB,CACpDxa,gBAAiB,CAAC,SAAU,YAAa,eAErCvF,GAAmBsF,EAAAA,GAAAA,GAAwC,QAA3Bua,EAACpG,aAAU,EAAVA,EAAY0G,sBAAc,IAAAN,EAAAA,EAAI,KAAM,CACzEta,gBAAiB,CAAC,OAAQ,cAEtB6a,EC5BD,SAAgDviB,GACrD,MAAMwiB,EAAWxvB,EAAAA,OAAagN,GAM9B,OAJAhN,EAAAA,WAAgB,KACdwvB,EAAShoB,QAAUwF,CAAK,GACvB,CAACA,IAEGwiB,CACT,CDoBwBC,CAAY7G,IAC3B3E,EAAWyL,GAAgB1vB,EAAAA,UAAe,GAC3C2vB,EAAwB3vB,EAAAA,OAAa,IACrC4vB,IAAgBzgB,SAAsB,QAAN8f,EAAhB9f,EAAkBwF,YAAI,IAAAsa,IAAtBA,EAAwBla,IAExC8a,EAA+B7vB,EAAAA,aAAmB8f,IAAiB,IAAAgQ,EAAAC,EACvE,MAAMpN,EAAQ4M,EAAc/nB,QAC5B,IAAKmb,EACH,OAGF,MAAMxT,EAAmBwT,EAAM2M,eACzBU,EAAerN,EAAM1U,sBAAwB6R,EAAM+K,eAEzDlI,EAAM9U,cAAcC,SAAS8I,IACrBA,EAAKqZ,8BACTrZ,EAAKc,gBAAgB,aAAc,KACrC,IAGFiL,EAAM5M,iBAAiB,CAAEma,YAAYC,EAAAA,EAAAA,IAAc,CAAErQ,QAAO8I,WAAYjG,IAAU7C,QAAOsQ,YAAY,IAGrGzN,EACG0N,eACA5a,QAAQ6a,IAAgBA,EAAWC,IAAIzQ,KACvChS,SAASgS,IACRA,EAAM0Q,UAAU,CAAEC,UAAW1I,GAAAA,EAAAA,WAA2B,IAG5D,MAAM2I,EAAY/N,EAAMgO,eACS,QAAjCb,EAAA3gB,EAAiByhB,wBAAgB,IAAAd,GAAjCA,EAAmCziB,SAASwjB,cAAa,GAEzD,MAAM7gB,EAAW,IAAI2S,EAAMtT,oBAAyD,QAAvC0gB,EAAIW,aAAS,EAATA,EAAWI,mBAAkB,UAAM,IAAAf,EAAAA,EAAI,IACxF,IAAK,MAAM1nB,KAAW2H,EAAU,CAC9B,MAAMV,EAAYjH,EAAQiH,YACpByhB,EAAe1oB,EAAQ0oB,gBACzBzhB,GAAayhB,KAEXf,IAAiBe,GAAgB5hB,EAAiB0F,0BACpDxM,EAAQgF,SAAS0J,eAEjB1O,EAAQoO,iBAGd,CAEAkM,EAAMqO,eAAelR,EAAMmR,aAAa,GAExCP,SAAAA,EAAWQ,2BAA2B,GAIrC,IAEGC,EAAanxB,EAAAA,aAAkBkR,UACnC,IAAKie,IAAkBvG,GAAcgH,EACnC,OAEFF,GAAa,GAEb,MAAM,OAAE1hB,EAAM,WAAE2N,EAAU,UAAEqF,EAAS,eAAEoQ,GAAmBxI,GACpD,UAAEyI,EAAS,YAAEC,GAAgBzR,GAAAA,EAAAA,QAC7B0R,EAAW3I,EAAW4I,iBACtBC,EAAe7I,EAAW9I,QAChC,GAAI2R,EAAa5G,iBAAmB7c,GAAUyjB,EAAazQ,YAAcA,EAAW,CAClF2O,EAAsBnoB,QAAUsnB,GAAmBlG,GACnD,MAAM8I,GAAkBC,EAAAA,GAAAA,IAA6B,CACnD7uB,IAAK6sB,EAAsBnoB,QAC3BoqB,2BAA4B/R,GAAAA,EAAAA,QACzBC,GACCA,EAAM9R,SAAWA,GACjB8R,EAAMkB,YAAcA,GACpBlB,EAAMC,YACN6I,EAAW0G,eAAejN,SAASvC,EAAMwC,YAIzCxC,QAAcD,GAAAA,EAAAA,IAAU,CAC5B7R,SACA2N,aACAqF,YACA3G,QAAS,CACPgX,YACAC,cACAO,OAAQT,EACRG,WACAO,eAAiBhS,QAA2BvO,IAAjBuO,EAAMwC,OACjCyP,2BAA2B,GAE7BL,oBAGF,GAAI5R,EAAMkS,gBAAiB,CAEzB,MAAMC,EAA2BrJ,EAC9B0G,eACAzG,eACApT,QAAQkN,IAAWiG,EAAW2H,IAAI5N,KAClC7b,MAAM6b,GAAU7C,EAAMyQ,IAAI5N,EAAM7C,WAOnC,aAJyB,IAArBA,EAAME,WAAqBiS,GAC7BnS,EAAMoS,UAIV,EAEAC,EAAAA,GAAAA,IAAqBxC,EAAsBnoB,SAE3CqoB,EAA6B/P,EAC/B,CAEA4P,GAAa,EAAM,GAIlB,CACD9G,aAAU,EAAVA,EAAY7T,GACZ6T,aAAU,EAAVA,EAAY5a,OACZ4a,aAAU,EAAVA,EAAY5H,UACZ4H,aAAU,EAAVA,EAAYjN,WACZiU,EACAC,EACAV,IAuFF,OApFAnvB,EAAAA,WAAgB,KACdmxB,GAAY,GACX,CAACA,IAKJnxB,EAAAA,WAAgB,KACd,GAAI4oB,EAAY,CACd,MAAMwJ,GAAqBjV,EAAAA,GAAAA,GAAgD/L,EAAS6M,QAC9EoU,EAAczJ,EACjB0G,eACAzG,eACAxlB,KAAKsf,GAAUA,EAAMf,YAClB0Q,EAASD,EAAY3rB,OAAOsL,IAAOA,SAAKT,EAAY8gB,EAAY/gB,KAAK,KAEvE8gB,EAAmB9e,IAAMgf,GAC3BlD,EAAS,CACPnR,OAAQ,IAAF9d,QAAMqjB,EAAAA,GAAAA,GAAkB,IACzB4O,EACH9e,EAAGgf,MAIX,IAEC,CAAC1J,aAAU,EAAVA,EAAYhH,YAYhB5hB,EAAAA,WAAgB,KACd,MAAM2iB,EAAQ4M,EAAc/nB,QACtBsY,EAAQ6C,aAAK,EAALA,EAAO7C,QAErB,IAAIyS,GAA4B,EAChC,IAAIpjB,aAAgB,EAAhBA,EAAkB4J,8BAA+BC,EAAAA,GAAAA,YAAyC4W,EAAa,CACzG,MAAM1O,EAAW/R,aAAgB,EAAhBA,EAAkB+R,SAC7BI,EAAW,EACXE,EAAY,EAClB,GAAIN,EAAU,CACZ,MAAMsR,EAAkB,CACtBtR,EAASD,cAAcM,OAAOD,SAC9BJ,EAASuR,kBAAkBlR,OAAOD,UAClC5a,OAAO5G,GAAUA,IAAUwhB,IACvBoR,EAAmB,CACvBxR,EAASD,cAAcM,OAAOC,UAC9BN,EAASuR,kBAAkBlR,OAAOC,WAClC9a,OAAO5G,GAAUA,IAAU0hB,IAE7B+Q,GAA6BC,IAAoBE,EAC7CH,IACFrR,EAASD,cAAcM,OAAOD,SAAWA,EACzCJ,EAASuR,kBAAkBlR,OAAOD,SAAWA,EAC7CJ,EAASD,cAAcM,OAAOC,UAAYA,EAC1CN,EAASuR,kBAAkBlR,OAAOC,UAAYA,EAE9CrS,EAAiB4G,iBAAiB,CAAEmL,aAExC,CACF,CAEA,GACEyB,GACA7C,KACC3Q,aAAgB,EAAhBA,EAAkB4J,8BAA+BC,EAAAA,GAAAA,WAChDuZ,KACD3C,EACD,CACA,MAAMM,GAAaC,EAAAA,EAAAA,IAAc,CAAErQ,QAAO8I,WAAYjG,IACtDA,EAAM5M,iBAAiB,CAAEma,cAC3B,IAIC,CAACtH,SAAmB,QAATN,EAAVM,EAAY9I,eAAO,IAAAwI,OAAA,EAAnBA,EAAqBtH,UAAW7R,aAAgB,EAAhBA,EAAkB+R,SAAU0O,IAEzD,CAAE3L,YACX,C,qPErNA,MAAMW,GAAYjW,OAAOC,eAAesR,eAClCyS,GAAqBhkB,OAAOC,eAAe+jB,mBAE1C,SAASC,GAAahzB,GAA0E,IAAAizB,EAAA,IAAzE,WAAEtK,EAAYK,WAAYsG,GAA6CtvB,EACnG,MAAMqf,EAAW0T,QAAqBphB,EAAY,OAE5C7D,EAAc1N,IAAAA,SAAc,IAAMkvB,EAAoBI,gBAAgB,CAACJ,IACvEtG,GAAanU,EAAAA,GAAAA,GAAcya,EAAqB,CACpDxa,gBAAiB,CAAC,SAAU,QAAS,gBAEjC,WAAEiH,IAAeiN,aAAU,EAAVA,EAAY9I,UAAW,CAAC,EACzC5D,EAAcxO,EAAYqL,6BAA+BC,EAAAA,GAAAA,UAEzDoW,GAAWC,EAAAA,GAAAA,gBACX,mBAAEyD,EAAkB,wBAAEC,IAA4BC,EAAAA,EAAAA,0BAClD,UAAE/O,GAAc8K,GAAiB,CACrCnG,aACAuG,eAAe,KAEX,WACJ8D,EAAU,8BACVC,EAA6B,wBAC7BC,EAAuB,wBACvBC,EAAuB,WACvBrT,EAAU,gCACVsT,IACEC,EAAAA,GAAAA,GAAmC,CAAE1K,aAAYhE,UAASA,MACxD,eAAE2O,EAAc,2BAAEC,EAA0B,sBAAEC,EAAqB,sBAAEC,IACzEC,EAAAA,EAAAA,0BAAyB,CACvBhY,aACAsX,aACAW,cAAeV,IAGbW,EAAqB7zB,IAAAA,aACxBgO,IACC,MAAM8lB,EAAkB9lB,EAAOxI,cAE/B4pB,EACE8D,EAA8B,CAC5BllB,OAAQ8lB,EACR9S,UAAW4H,EAAW5H,UACtBY,UAAWgH,EAAWhH,YAEzB,GAEH,CAACgH,EAAYsK,EAA+B9D,IAG9Cle,eAAe6iB,EAAwBnqB,GACrC,MAAMoqB,EAAqBN,EAAsB9pB,EAAOgY,WACxD,IAAKoS,EAAoB,aAEHX,EAAgCW,IACzCT,EAAeS,EAC9B,CAEA,MAAMC,EAAoBj0B,IAAAA,SACxB,KAAM,CACJyB,KAAM,SACN8mB,WAAYA,EACZ2L,gBAAiBf,EAAwBvO,IACzCuP,gBAAiBf,EAAwB,CAAExO,UAAS,GAAEwP,YAAaxL,EAAWhH,UAAWjG,eACzF0Y,kBAAmBzL,EAAW5H,UAC9BsT,kBAAmBA,OACnBC,kBAAmB3L,EAAWhH,UAC9BkR,mBAAoBA,EACpB0B,iBAAkBvQ,EAAY2E,EAAW5H,eAAYzP,EACrDkjB,kBAAmBhB,EACnBiB,mBAAoB9P,GACpB+P,0BAA2B3gB,IAAqC,IAApC,MAAElU,GAA6BkU,EACzD+e,EAAwBjzB,EAAM,KAGlC,CACEyoB,EACAK,EAAWhH,UACXgH,EAAW5H,UACXoS,EACAN,EACAW,EACA9X,EACAsI,EACAkP,EACAJ,IAIJ,GAAIrlB,EAAYqL,6BAA+BC,EAAAA,GAAAA,UAC7C,OACEhZ,IAAAA,cAAA,OAAKmB,UAAU,+DACZynB,EAAW0G,eAAesF,iBACzB50B,IAAAA,cAACgrB,GAAM,CACLhd,OAAQ4a,EAAW5a,OACnB2N,WAAYiN,EAAWjN,WACvBsP,iBAAkB4I,EAClBtL,WAAYA,IAIhBvoB,IAAAA,cAAC60B,EAAAA,aAAiBZ,GAElBj0B,IAAAA,cAACmoB,GAAkB,CAACI,WAAYA,IAEhCvoB,IAAAA,cAAC80B,EAAAA,gBAAe,CACdC,YAAavB,EACb5R,UAAWgH,EAAWhH,UACtBqR,WAAYA,EACZM,eAAgBQ,EAChBhU,WAAYA,KAMpB,MAAMiV,EAAetnB,EAAYunB,QAAQxtB,SAASytB,EAAAA,GAAAA,WAElD,OACEl1B,IAAAA,cAAA,OACEmB,UAAWmiB,IAAW,sCAAuC,CAC3D,kBAAmB0R,EACnB,mDAAoDrC,MAGtD3yB,IAAAA,cAAA,OAAKmB,UAAU,kCACX+a,GACAlc,IAAAA,cAACm1B,EAAAA,QAAO,CAACC,MAAO,EAAGj0B,UAAU,iEACH,QADkE0xB,EACzFjK,EAAW9I,QAAQ3b,YAAI,IAAA0uB,EAAAA,EAAIjK,EAAW5a,QAG1CN,EAAYunB,QAAQxtB,SAASytB,EAAAA,GAAAA,QAC5Bl1B,IAAAA,cAAC2pB,GAAU,CACTzd,MAAM,OACNzK,KAAK,SACLiD,OAAQgJ,EAAY2nB,SACpBzQ,UAAWA,GACX3F,SAAUA,EACVlG,2BAA4BrL,EAAYqL,4BACzC,QAIFrL,EAAYunB,QAAQxtB,SAASytB,EAAAA,GAAAA,QAC5Bl1B,IAAAA,cAACgf,GAAa,CAAChS,MAAOU,EAAaxB,MAAM,OAAOzK,KAAK,SAASwd,SAAUA,GAAU,UAIlF+V,GACAh1B,IAAAA,cAAA,WACEA,IAAAA,cAACkmB,GAAgB,CACflZ,MAAOU,EACPkX,UAAWA,GACX1Y,MAAM,OACNzK,KAAK,SACLwd,SAAUA,MAMjB+V,GACCh1B,IAAAA,cAAA,OAAKmB,UAAU,iCACbnB,IAAAA,cAAA,OAAKmB,UAAU,mEACbnB,IAAAA,cAAA,WACEA,IAAAA,cAACkmB,GAAgB,CAAClZ,MAAOU,EAAakX,UAAWA,GAAWnjB,KAAK,SAASwd,SAAUA,KAEtFjf,IAAAA,cAAA,OAAKmB,UAAU,2CACbnB,IAAAA,cAAC60B,EAAAA,aAAYxzB,GAAA,CACXi0B,2BAA4B,GACxBrB,EAAiB,CACrB9yB,UAAU,cACV8d,SAAUA,KAEZjf,IAAAA,cAAC80B,EAAAA,gBAAe,CACdC,YAAavB,EACb5R,UAAWgH,EAAWhH,UACtBqR,WAAYA,EACZM,eAAgBQ,EAChBhU,WAAYA,EACZd,SAAUA,OAOpBjf,IAAAA,cAAA,OAAKmB,UAAWmiB,IAAW,4CAA6C,CAAEiS,MAAOP,KAC9EtnB,EAAYunB,QAAQxtB,SAASytB,EAAAA,GAAAA,UAC5Bl1B,IAAAA,cAAC+jB,GAAO,CACN/W,MAAOU,EACPxB,MAAM,OACNzK,KAAK,SACLwd,SAAUA,EACV,cAAY,yBACb,SAIF/C,GACClc,IAAAA,cAAC6kB,GAAU,CAACC,KAAMpX,EAAYqL,2BAA4BkG,SAAUA,EAAU/S,MAAM,OAAOzK,KAAK,WAElGzB,IAAAA,cAAC0qB,GAAgB,CAAC1d,MAAOU,EAAakX,UAAWA,GAAW3F,SAAUA,EAAU/S,MAAM,OAAOzK,KAAK,WAC9Fya,GAAe,cAElBxO,EAAYunB,QAAQxtB,SAASytB,EAAAA,GAAAA,WAC5Bl1B,IAAAA,cAACyuB,GAAmB,CAACzhB,MAAOU,EAAakX,UAAWA,GAAW3F,SAAUA,EAAU/S,MAAM,OAAOzK,KAAK,WACjGya,GAAe,aAGnBA,GACAlc,IAAAA,cAAA,OAAKmB,UAAU,kCACbnB,IAAAA,cAACmoB,GAAkB,CAACI,WAAY,MAM5C,CCxPA,MAAM,GAA+BiN,MAAMC,S,+FCMpC,MAAMC,GAA6BxxB,IACxC,MAAMyxB,EAAgBC,GAAAA,EAAoB1xB,EAAM2xB,WAAW3xB,GAE3D,OAAOlE,IAAAA,cAAA,QAAM81B,wBAAyB,CAAEC,OAAQJ,IAAwB,E,eCFnE,SAASK,GAAyBp2B,GAA0C,IAAzC,KAAEkjB,GAAqCljB,EAC/E,OACEI,IAAAA,cAAA,UACG8iB,EAAKzf,KAAI,CAAA2Q,EAAsCH,KAAK,IAA1C,MAAE/T,EAAK,UAAEqB,EAAS,QAAE80B,EAAO,KAAE3X,GAAMtK,EAAA,OAC5ChU,IAAAA,cAAA,MAAI8C,IAAG,GAAA3C,OAAK0T,EAAK,KAAA1T,OAAIL,GAASm2B,QAASA,GACrCj2B,IAAAA,cAACuB,EAAAA,UAAS,CACRC,GAAI8c,EAAO,SAAM/M,EACjB+M,KAAMA,EACN7c,KAAK,QACLN,UAAWmiB,IACT,CACE,yBAAoC,IAAVzP,EAC1B,qCAAsC1S,GAAuB,IAAV0S,GAErD1S,IAGDrB,GAEA,IAIb,CCpBO,SAASo2B,GAAiCt2B,GAQ9C,IAR+C,UAChDi2B,EAAS,QACTM,EAAO,MACPjqB,GAKDtM,EACC,MAAMkjB,EAAO9iB,IAAAA,SAAc,KACzB,MAAMo2B,EAAmC,CACvC,CAAC,CAAEt2B,MAAO,WAAa,CAAEA,OAAOu2B,EAAAA,GAAAA,IAAsBF,EAAQG,kBAQhE,OANIH,EAAQI,SAAW,GACrBH,EAAUjoB,KAAK,CAAC,CAAErO,MAAO,UAAY,CAAEA,OAAO02B,EAAAA,GAAAA,IAAkB,CAAE12B,MAAOq2B,EAAQI,cAE/EJ,EAAQM,QAAU,GACpBL,EAAUjoB,KAAK,CAAC,CAAErO,MAAO,WAAa,CAAEA,OAAO02B,EAAAA,GAAAA,IAAkB,CAAE12B,MAAOq2B,EAAQM,aAE7EL,CAAS,GACf,CAACD,IAEJ,OACEn2B,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAAA,OAAKmB,UAAU,yBACZu0B,GAA0B,CACzBxpB,MAAOA,EACP9B,MAAOssB,GAAAA,GAAAA,QACP70B,MAAO80B,GAAAA,EACPd,cACE,IACJ71B,IAAAA,cAACm1B,EAAAA,QAAO,CAACh0B,UAAU,kBAAkBy1B,EAAAA,GAAiBf,KAExD71B,IAAAA,cAAA,aACEA,IAAAA,cAAA,aACG8iB,EAAKzf,KAAI,CAAC0D,EAAM8M,IACf7T,IAAAA,cAACg2B,GAAyB,CAAClT,KAAM/b,EAAMjE,IAAG,GAAA3C,OAAK0T,EAAK,KAAA1T,OAAI4G,EAAK,UAMzE,CCxCA,MAAM8vB,GAA0B,qCAC1BC,GAA0B,iCAEhC,SAASC,GAAyBC,GAChC,MAAMC,EAAeD,EAAgBE,cACrC,GAAID,EAAaxvB,SAAS,KAAM,CAC9B,MAAO0vB,EAAMC,GAAWH,EAAajV,MAAM,KAC3C,MAAO,GAAP7hB,OAAUg3B,EAAI,MAAAh3B,OAAKi3B,EACrB,CACA,GAAIH,EAAaxvB,SAAS,KAAM,CAC9B,MAAO0vB,EAAME,GAAYJ,EAAajV,MAAM,KAC5C,MAAO,GAAP7hB,OAAUg3B,EAAI,MAAAh3B,OAAKk3B,EACrB,CACA,OAAOL,CACT,CAEA,SAASM,GAAsBx3B,EAAey3B,GAC5C,GAAmB,IAAfA,EACF,MAAO,GAET,MAAMC,EAAW13B,EAAQy3B,EAAc,IACjCE,EAAeC,MAAMF,GAAW,EAAI5xB,KAAK+xB,IAAIH,GAEnD,MAAO,IAAPr3B,QAAWq2B,EAAAA,GAAAA,IAAkB,CAC3B12B,MAAO23B,EACPG,iBAAkB,IAClB,KACJ,CAEO,SAASC,GAAgCj4B,GAQ7C,IAR8C,UAC/Ci2B,EAAS,QACTM,EAAO,MACPjqB,GAKDtM,EACC,MAAMglB,EAAYjW,OAAOC,eAAesR,eAClC4C,EAAO9iB,IAAAA,SAAc,KACzB,MAAMo2B,EAAmC,CACvC,CACE,CAAEt2B,MAAO,iBACT,CACEA,OAAOu2B,EAAAA,GAAAA,IAAsBF,EAAQG,eAAe,KAGxD,CACE,CAAEx2B,MAAO,iBACT,CACEA,MAAOi3B,GAAyBZ,EAAQc,gBAG5C,CACE,CAAEn3B,MAAO,iBACT,CACEA,OAAOu2B,EAAAA,GAAAA,IAAsBF,EAAQ2B,eAAe,EAAO,CACzDC,MAAO,QACPC,SAAKzmB,OAeb,QAT0BA,IAAtB4kB,EAAQ8B,gBAAmD1mB,IAAxB4kB,EAAQ+B,aAC7C9B,EAAUjoB,KAAK,CAAC,CAAErO,MAAO,MAAOqB,UAAW,2BAEnBoQ,IAAtB4kB,EAAQ8B,WACV7B,EAAUjoB,KAAK,CAAC,CAAErO,MAAO,YAAc,CAAEA,OAAO02B,EAAAA,GAAAA,IAAkB,CAAE12B,MAAOq2B,EAAQ8B,oBAEzD1mB,IAAxB4kB,EAAQ+B,aACV9B,EAAUjoB,KAAK,CAAC,CAAErO,MAAO,YAAc,CAAEA,OAAO02B,EAAAA,GAAAA,IAAkB,CAAE12B,MAAOq2B,EAAQ+B,sBAE3D3mB,IAAtB4kB,EAAQ8B,gBAAmD1mB,IAAxB4kB,EAAQ+B,YAA2B,CACxE,MAAMC,EAAchC,EAAQ8B,UAAY9B,EAAQ+B,YAC1CE,EAAmBD,EAAc,EAAIrB,GAA0BD,GAC/DwB,EAAkBf,GAAsBa,EAAahC,EAAQ+B,aAEnE9B,EAAUjoB,KAAK,CACb,CAAErO,MAAO,WAAYqB,UAAWi3B,GAChC,CACEt4B,MAAO,GAAFK,QAAKq2B,EAAAA,GAAAA,IAAkB,CAAE12B,MAAOq4B,IAAc,KAAAh4B,OAAIk4B,GACvDl3B,UAAWi3B,IAGjB,CAEA,QAAkC7mB,IAA9B4kB,EAAQmC,mBAAmCnC,EAAQ8B,YAAc9B,EAAQmC,kBAG3E,GAFAlC,EAAUjoB,KAAK,CAAC,CAAErO,MAAO,aAAcqB,UAAW,sBAE9CyjB,GAGF,GAFAwR,EAAUjoB,KAAK,CAAC,CAAErO,MAAO,YAAc,CAAEA,OAAO02B,EAAAA,GAAAA,IAAkB,CAAE12B,MAAOq2B,EAAQmC,4BAE/C/mB,IAAhC4kB,EAAQoC,oBAAmC,CAC7C,MAAMC,EAAsBrC,EAAQmC,kBAAoBnC,EAAQoC,oBAC1DE,EAA2BD,EAAsB,EAAI1B,GAA0BD,GAC/EwB,EAAkBf,GAAsBkB,EAAqBrC,EAAQoC,qBAE3EnC,EAAUjoB,KACR,CAAC,CAAErO,MAAO,YAAc,CAAEA,OAAO02B,EAAAA,GAAAA,IAAkB,CAAE12B,MAAOq2B,EAAQoC,wBACpE,CACE,CAAEz4B,MAAO,WAAYqB,UAAWs3B,GAChC,CACE34B,MAAO,GAAFK,QAAKq2B,EAAAA,GAAAA,IAAkB,CAAE12B,MAAO04B,IAAsB,KAAAr4B,OAAIk4B,GAC/Dl3B,UAAWs3B,IAInB,OAEArC,EAAUjoB,KAAK,CACb,CACErO,MAAO,oBACPqB,UAAW,gGACX80B,QAAS,EACT3X,KAAM,eAAFne,QAAiBqjB,EAAAA,GAAAA,GAAkB,CACrCC,WAAY,SACZC,WAAY,SACZC,aAAc,kCAsBxB,QAf4BpS,IAAxB4kB,EAAQuC,kBAAuDnnB,IAA1B4kB,EAAQwC,eAC/CvC,EAAUjoB,KAAK,CAAC,CAAErO,MAAO,UAAWqB,UAAW,2BAErBoQ,IAAxB4kB,EAAQuC,aACVtC,EAAUjoB,KAAK,CACb,CAAErO,MAAO,YACT,CAAEA,OAAO02B,EAAAA,GAAAA,IAAkB,CAAE12B,MAAOq2B,EAAQuC,YAAaE,cAAeC,GAAAA,GAAAA,kBAG9CtnB,IAA1B4kB,EAAQwC,eACVvC,EAAUjoB,KAAK,CACb,CAAErO,MAAO,YACT,CAAEA,OAAO02B,EAAAA,GAAAA,IAAkB,CAAE12B,MAAOq2B,EAAQwC,cAAeC,cAAeC,GAAAA,GAAAA,kBAGlDtnB,IAAxB4kB,EAAQuC,kBAAuDnnB,IAA1B4kB,EAAQwC,cAA6B,CAC5E,MAAMG,EAAkB3C,EAAQuC,YAAcvC,EAAQwC,cAChDI,EAAuBD,EAAkB,EAAIhC,GAA0BD,GACvEwB,EAAkBf,GAAsBwB,EAAiB3C,EAAQwC,eAEvEvC,EAAUjoB,KAAK,CACb,CAAErO,MAAO,WAAYqB,UAAW43B,GAChC,CACEj5B,MAAO,GAAFK,QAAKq2B,EAAAA,GAAAA,IAAkB,CAC1B12B,MAAOg5B,EACPF,cAAeC,GAAAA,GAAAA,UACf,KAAA14B,OAAIk4B,GACNl3B,UAAW43B,IAGjB,CAEA,OAAO3C,CAAS,GACf,CAACD,EAASvR,IAEb,OACE5kB,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAAA,OAAKmB,UAAU,yBACZu0B,GAA0B,CACzBxpB,MAAOA,EACP9B,MAAOssB,GAAAA,GAAAA,QACP70B,MAAO80B,GAAAA,EACPd,cACE,IACJ71B,IAAAA,cAACm1B,EAAAA,QAAO,CAACh0B,UAAU,kBAAkBy1B,EAAAA,GAAiBf,KAExD71B,IAAAA,cAAA,aACEA,IAAAA,cAAA,aACG8iB,EAAKzf,KAAI,CAAC0D,EAAM8M,IACf7T,IAAAA,cAACg2B,GAAyB,CAAClT,KAAM/b,EAAMjE,IAAG,GAAA3C,OAAK0T,EAAK,KAAA1T,OAAI4G,EAAK,UAMzE,CCvLO,SAASiyB,GAA6Bp5B,GAQ1C,IAR2C,UAC5Ci2B,EAAS,QACTM,EAAO,MACPjqB,GAKDtM,EACC,OACEI,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAAA,OAAKmB,UAAU,yBACZu0B,GAA0B,CACzBxpB,MAAOA,EACP9B,MAAOssB,GAAAA,GAAAA,QACP70B,MAAO80B,GAAAA,EACPd,cACE,IACJ71B,IAAAA,cAACm1B,EAAAA,QAAO,CAACh0B,UAAU,kBAAgB,GAAAhB,OAAKy2B,EAAAA,GAAiBf,GAAU,MAAA11B,OAAKg2B,EAAQ8C,WAAU,KAAA94B,OAAIg2B,EAAQ+C,YAExGl5B,IAAAA,cAAA,aACEA,IAAAA,cAAA,aACEA,IAAAA,cAAA,UACEA,IAAAA,cAAA,UACEA,IAAAA,cAACuB,EAAAA,UAAS,CAACE,KAAK,UAAS40B,EAAAA,GAAAA,IAAsBF,EAAQG,oBAOrE,CCDO,SAAS6C,GAAiBv5B,GAA4D,IAA3D,GAAEmV,EAAE,aAAEqkB,EAAY,UAAEvD,EAAS,KAAE/S,EAAI,MAAE5W,GAAoBtM,EACzF,OACEI,IAAAA,cAACq5B,EAAAA,cAAAA,SAAsB,CAACv5B,MAAM,YAC5BE,IAAAA,cAACquB,EAAAA,QAAO,CACNtZ,GAAIA,EACJukB,SAAU,EACVC,aAAa,EACb,aAAW,iBACXp4B,UAAWq4B,IAAW,0DAA2D,CAC/E,WAAY,CACVC,EAAAA,GAAAA,gBACAA,EAAAA,GAAAA,eACAA,EAAAA,GAAAA,iBACAA,EAAAA,GAAAA,kBACAhyB,SAASouB,GACX,WAAYA,IAAc4D,EAAAA,GAAAA,UAC1B,WAAY5D,IAAc4D,EAAAA,GAAAA,QAE5BrvB,MAAOgvB,EACP7K,aAAa,EACbmL,aAAa,EACblL,oBAAoB,EACpBmL,wBAAsB,EACtB,cAAY,uBAEZ35B,IAAAA,cAACqL,EAAAA,WAAU,CAAClK,UAAU,eA7C9B,SACE00B,EACA/S,EACA5W,GAEA,OAAQ2pB,GACN,KAAK4D,EAAAA,GAAAA,MACH,OAAOz5B,IAAAA,cAACg5B,GAA6B,CAACnD,UAAWA,EAAWM,QAASrT,EAAgB5W,MAAOA,IAC9F,KAAKutB,EAAAA,GAAAA,UACH,OAAOz5B,IAAAA,cAACk2B,GAAiC,CAACL,UAAWA,EAAWM,QAASrT,EAAoB5W,MAAOA,IACtG,KAAKutB,EAAAA,GAAAA,iBACL,KAAKA,EAAAA,GAAAA,iBACL,KAAKA,EAAAA,GAAAA,eACL,KAAKA,EAAAA,GAAAA,gBACH,OAAOz5B,IAAAA,cAAC63B,GAAgC,CAAChC,UAAWA,EAAWM,QAASrT,EAAmB5W,MAAOA,IACpG,QACE,OAAO,KAEb,CA2B6C0tB,CAA8B/D,EAAW/S,EAAM5W,KAI5F,CCtDO,SAAS2tB,GAA0Bj6B,GAAkD,IAAjD,WAAEgpB,GAA6ChpB,EACxF,MAAMk6B,EAAuB95B,IAAAA,SAAc,SAAAgvB,EAAA,OAA+B,QAA/BA,EAAMpG,EAAW0G,sBAAc,IAAAN,EAAAA,EAAI,IAAI,GAAE,CAACpG,KAC/E,iBAAEgI,EAAgB,MAAE1kB,IAAUuI,EAAAA,GAAAA,GAAcqlB,EAAsB,CAAEplB,gBAAiB,CAAC,sBACtF0kB,GAAezK,EAAAA,EAAAA,iBAAgB,CAAEtP,UAAW,SAC5C,cAAEoN,IAAkBC,EAAAA,EAAAA,wBAAuB0M,IAC1C32B,EAAOC,GAAY1C,IAAAA,SAAe,CACvCqtB,IAAK,EACL0M,KAAM,IAEF7pB,EAAY0gB,aAAgB,EAAhBA,EAAkB1gB,UAC9B8pB,EAA0BpJ,aAAgB,EAAhBA,EAAkBha,OAAO+L,QAAQ4N,IAAI3H,IAC9D9F,EAAMmX,GAAWj6B,IAAAA,SAAkC,MACpDk6B,ECtBD,SAAsBC,GAAwE,IAApBC,IAAW9kB,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,KAAAA,UAAA,GAC1F,MAAMwF,EAAM9a,IAAAA,OAAiC,MACvCq6B,EAAcr6B,IAAAA,OAAam6B,GAyBjC,OAvBAn6B,IAAAA,iBAAsB,KACpBq6B,EAAY7yB,QAAU2yB,CAAQ,IAGhCn6B,IAAAA,WAAgB,KACd,IAAKo6B,EACH,OAEF,MAAME,EAAWC,EAAAA,GAAAA,WACXC,EAAW12B,IACf,MAAMuE,EAAUyS,EAAItT,QAChBa,GAAWvE,EAAEC,SAAWsE,EAAQoyB,SAAS32B,EAAEC,SAC7Cs2B,EAAY7yB,QAAQ1D,EACtB,EAKF,OAFAiF,SAAS2xB,iBAAiBJ,EAAW,aAAe,YAAaE,GAE1D,KACLzxB,SAAS4xB,oBAAoBL,EAAW,aAAe,YAAaE,EAAQ,CAC7E,GACA,CAACL,EAAUC,IAEPtf,CACT,CDNuB8f,EAAa,KAAM,IAAAC,KAErB,QADUA,EAACjS,EACzB+H,sBAAc,IAAAkK,IADWA,EAExB/J,oBACDhqB,MAAMg0B,GAAeA,EAAWztB,SAAS0tB,cAElBnK,GAAoBoJ,GAC5CpJ,EAAiBvjB,SAASwjB,cAAa,EACzC,KACGD,GAAoBoJ,GAEzBE,EAAa1yB,QAAU4xB,EAAa4B,oBAAoBxzB,QACxD,MAAMyzB,EAAc7B,EAAavsB,KAC3BquB,EAAc9B,EAAa/uB,KA0CjC,OAxCArK,IAAAA,WAAgB,KACd,GAAK4wB,UAAAA,EAAkBvjB,SAAS8tB,SAAWnB,EACzC,OAAIvN,EACKwN,EAAQ,MAEViB,IAET,IAAKlB,EAAyB,OAC9B,MAAM,IAAE3M,EAAG,KAAE0M,GAASnJ,EAAiBvjB,SACjC+tB,EAAUxK,EAAiByK,qBAC7BD,aAAO,EAAPA,EAASlrB,cAAc4S,aAAI,EAAJA,EAAM5S,YAC/B+pB,EAAQ,IACHmB,EACHvF,UAAWjF,EAAiBvjB,SAASiuB,0BAIrC74B,EAAM4qB,MAAQA,GAAO5qB,EAAMs3B,OAASA,IACtCmB,IACAx4B,EAAS,CACP2qB,MACA0M,UAGCX,EAAanZ,SAChBgb,GACF,GACC,CACD/qB,EACAuc,EACA3J,EACArgB,EACAw4B,EACAC,EACA9B,EAAanZ,QACb2Q,EACAhI,EACAoR,IAIAh6B,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAAC4uB,EAAAA,eAAc,CAACptB,GAAG,MAAM4I,MAAOgvB,EAAcj4B,UAAU,WAAWsB,MAAOA,IACzEqgB,GACC9iB,IAAAA,cAACm5B,GAAiB,CAChBpkB,GA1ES,gBA2ETqkB,aAAcA,EACdvD,UAAW/S,EAAK+S,UAChB/S,KAAMA,EACN5W,MAAOA,IAKjB,CE/FO,MAAMqvB,GAAkC,yB,0BCM/C,MAAMC,WAAoBC,KAAAA,MACxBC,mBACEC,KAAKC,UAAU,cAAe,QAAS,SAAU,MAAO,OAC1D,EAQFJ,GAAYK,YAEZ,MAAMC,GAAcN,GAAYtkB,SAChC4kB,GAAYhmB,OAEZ,Y,ycCdA,MAAMimB,GAAW,gBAEjB,MAAMP,WAAoBx7B,IAAAA,UAAgBg8B,cAAA,SAAA1mB,WAAA2mB,GAAA,eAS/B,KACPN,KAAKO,aAAa,GACnB,CAVDC,oBACEnvB,GAAAA,KAAW,SAAU2uB,KAAKS,OAC5B,CAEAC,uBACErvB,GAAAA,OAAa,SAAU2uB,KAAKS,OAC9B,CAMAE,SAGS,IAAAC,EAFUzzB,EAAjB,OAAIkE,GAAAA,OAC8B,QAAhClE,EAAAC,SAASC,cAAc+yB,WAAS,IAAAjzB,GAAhCA,EAAkC0zB,UAAUC,OAAO,UAOnDz8B,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAAA,OACEmB,UAAU,sBACVsK,QAASA,IAAMkwB,KAAKtxB,OACpBqyB,cAAgB54B,GAAMA,EAAE6G,iBACxB,cAAY,gCAEd3K,IAAAA,cAAC28B,EAAAA,YAAoB,CAACtP,IAAKrgB,GAAAA,IAAW+sB,KAAM/sB,GAAAA,KAAY/J,MAAO+J,GAAAA,OAAc3C,KAAMsxB,KAAKtxB,UAZ1D,QAAhCkyB,EAAAxzB,SAASC,cAAc+yB,WAAS,IAAAQ,GAAhCA,EAAkCC,UAAUI,IAAI,UACzC,KAcX,CAEAvyB,OACE2C,GAAAA,gBAAsB,SAAS,EACjC,GAEF6vB,EAAAA,EAAAA,KAAM,KACJ,MAAMC,EAAK/zB,SAASC,cAAc+yB,IAC9Be,GACFC,EAAAA,OAAgB/8B,IAAAA,cAACw7B,GAAW,MAAKsB,EACnC,IAGF,MAWA,GAX2B,CACzBjwB,KAAMA,CAACmwB,EAAsC50B,KAC3C4E,GAAAA,iBAAuB,CACrBiwB,OAAO,EACP70B,OAAQA,EACRilB,IAAK2P,EAAME,QAAUvuB,OAAOwuB,YAC5BpD,KAAMiD,EAAMI,SACZ,G,gRClDC,SAASC,GAAoBz9B,GAAiE,IAA9DgpB,WAAY0U,GAAgD19B,EACjG,MAAM29B,GAAeC,EAAAA,GAAAA,KACf5U,GAAanU,EAAAA,GAAAA,GAAc6oB,EAAqB,CAAE5oB,gBAAiB,CAAC,WACpEqU,GAAatU,EAAAA,GAAAA,GAAcmU,EAAW9I,QAAS,CAAEpL,gBAAiB,CAAC,iBAClE+oB,EAAqBC,GAA0B19B,IAAAA,UAAe,GAErEA,IAAAA,WAAgB,KACT4oB,EAAW+U,sBAEd/U,EACG9I,QACA8d,kCACA5T,MAAM6T,IACDN,KACFG,EAAuBG,EACzB,GAEN,GAGC,IAcH,OAAKJ,EAKHz9B,IAAAA,cAACsL,EAAAA,YAAW,CAAC2T,SAAS,OAAO9d,UAAU,uCACrCnB,IAAAA,cAACwL,EAAAA,OAAM,CACL4U,YACE2I,SAAAA,EAAYhJ,WACV/f,IAAAA,cAACykB,EAAAA,QAAO,CAACC,eAAgB1kB,IAAAA,cAAC2kB,EAAAA,KAAI,CAACxgB,KAAK,aAClCnE,IAAAA,cAACqjB,EAAAA,QAAO,CAACxhB,MAAO,MAGlB,UAGJ6D,SAAUqjB,aAAU,EAAVA,EAAYhJ,WACtB/U,MAAM,mBACNS,QA9BuByF,UAC3B,MAAM4sB,EAAWlV,EACdyH,eACAhtB,KAAI6N,SAAiB4O,EAAM0Q,UAAU,CAAEC,UAAW1I,GAAAA,EAAAA,cAGjC,IAAA1K,EAAAC,GAFpBsL,EAAW7S,iBAAiB,CAAE8L,aAAa,UACrCxO,QAAQuX,IAAIkT,GACdP,OACFG,GAAuB,GACZ,QAAXrgB,GAAAC,EAAA3O,QAAO4O,YAAI,IAAAF,GAAXA,EAAAG,KAAAF,EAAc,QAAS,mBAAoB,CAAEG,eAAgB,UAC/D,EAsBI,cAAY,2BACb,qBAnBI,IAwBX,C,uOC5DO,MAAMsgB,GAA6B,YAC7BC,GAAiC,aAExCC,GAAoB,CACxBx8B,KAAM,OACNN,UAAW,UACXwG,aAAc,uBAGV2yB,GAAWC,EAAAA,GAAAA,WAWX2D,GAAwBtV,IAC5BuH,EAAAA,EAAAA,IAAc,CACZrQ,MAAO8I,EAAW9I,QAClB8I,aACAxgB,OAAQ,CAAC,IAGN,SAAS+1B,GAAYv+B,GAON,IAAAqvB,EAAA,IAPO,gBAC3BmP,EAAe,WACfxV,EAAU,UACVyV,EAAS,SACTC,EAAQ,UACRC,EAAS,YACTC,GACkB5+B,EAClB,MAAMuP,GAAmBsF,EAAAA,GAAAA,GAAcmU,EAAW0G,eAAgB,CAAE5a,gBAAiB,CAAC,WAC/E+pB,EAAqBC,GAA0B1+B,IAAAA,UAAe,IAC/D,kBAAE2+B,GAAsBxvB,GACvByvB,EAAoBC,GAAyB7+B,IAAAA,SAAe4oB,EAAWkW,aAAeH,GACvFI,EAAuB/+B,IAAAA,aAAkB,KAC7C4oB,EAAW7S,iBAAiB,CAAEma,WAAYgO,GAAqBtV,GAAahH,UAAW,MAAO,GAC7F,CAACgH,IAkBJ,OAhBA5oB,IAAAA,WAAgB,KACd,MAAMg/B,EAAkCz0B,KACtC,KACEs0B,EAAsBjW,EAAWkW,aAAeH,GAChDD,EAAuB9V,EAAWsH,aAAegO,GAAqBtV,GAAY,GAEpF,IACA,CAAEne,QAAS,MAGb,OADAme,EAAWqW,KAAK,SAAUD,GACnB,KACLA,EAAgCt0B,SAChCke,EAAWsW,OAAO,SAAUF,EAAgC,CAC7D,GACA,CAACL,EAAmB/V,IAGrB5oB,IAAAA,cAAA,OACE8a,IAAKsjB,EACLj9B,UAAWmiB,IACT,gIACA,CAAE6b,QAASd,MAGX/D,IACAt6B,IAAAA,cAAA,OAAKmB,UAAU,sIACZy9B,GACC5+B,IAAAA,cAAA,OAAKmB,UAAU,iGACbnB,IAAAA,cAACsL,EAAAA,YAAW,CAAC2T,SAAS,OAAO9d,UAAU,uCACrCnB,IAAAA,cAACwL,EAAAA,OAAMnK,GAAA,GACD48B,GAAiB,CACrB,cAAY,iCACZjzB,MAAM,aACNS,QAAS+yB,EACTr9B,UAAU,YAEVnB,IAAAA,cAAC2kB,EAAAA,KAAI,CAACxgB,KAAK,eAKnBnE,IAAAA,cAACsL,EAAAA,YAAW,CAAC2T,SAAS,OAAO9d,UAAU,uCACrCnB,IAAAA,cAACwL,EAAAA,OAAMnK,GAAA,GACD48B,GAAiB,CACrB,cAAY,+BACZjzB,MAAM,WACNS,QAAS8yB,IAETv+B,IAAAA,cAAC2kB,EAAAA,KAAI,CAACxgB,KAAK,YAGbnE,IAAAA,cAACwL,EAAAA,OAAMnK,GAAA,GAAK48B,GAAiB,CAAE,cAAY,8BAA8BjzB,MAAM,UAAUS,QAAS6yB,IAChGt+B,IAAAA,cAAC2kB,EAAAA,KAAI,CAACxgB,KAAK,WAMnBnE,IAAAA,cAAA,OAAKmB,UAAU,wGACW,QAAtB8tB,EAAC9f,EAAiBwF,YAAI,IAAAsa,IAArBA,EAAuBla,KAAM/U,IAAAA,cAACq9B,GAAoB,CAACzU,WAAYA,IAEjE6V,GACCz+B,IAAAA,cAACsL,EAAAA,YAAW,CAAC2T,SAAS,OAAO9d,UAAU,uCACrCnB,IAAAA,cAACwL,EAAAA,OAAM,CACL6U,WAAW,SACX,cAAY,mCACZrV,MAAM,8BACNS,QAASszB,GAET/+B,IAAAA,cAAC2kB,EAAAA,KAAI,CAACxgB,KAAK,cAOzB,C,ycCpEA,MAAMi7B,WAAap/B,IAAAA,UAwCjBg8B,YAAY93B,GAAkB,IAAAm7B,EAC5BC,MAAMp7B,GAAMm7B,EAAA1D,KAAAM,GAAA,aAxCU,MAAIA,GAAA,kBACC,MAAIA,GAAA,0BAAAA,GAAA,eAEvBj8B,IAAAA,aAAiCi8B,GAAA,iBAC/Bj8B,IAAAA,aAAiCi8B,GAAA,iBACjCj8B,IAAAA,aAAiCi8B,GAAA,uBAC3Bj8B,IAAAA,aAAiCi8B,GAAA,wBAChCj8B,IAAAA,aAAiCi8B,GAAA,iBACxCj8B,IAAAA,aAAoCi8B,GAAA,sBAC/Bj8B,IAAAA,aAAoCi8B,GAAA,wBAClCN,KAAKz3B,MAAM0kB,WAAW0G,gBAAc2M,GAAA,0BAAAA,GAAA,4BAAAA,GAAA,4BAAAA,GAAA,mCAAAA,GAAA,kBAK3C,GAAKA,GAAA,2BAAAA,GAAA,2BAAAA,GAAA,wBAGuC,MAAIA,GAAA,qBAAAA,GAAA,qBAAAA,GAAA,8BAAAA,GAAA,mBAI/B,MAAIA,GAAA,yBACd,GAAKA,GAAA,sBACe,MAAIA,GAAA,wBAAAA,GAAA,qCAEZ,GAAIA,GAAA,cAEA,MAAIA,GAAA,iBACM,MAAIA,GAAA,mBACT,MAAIA,GAAA,sBACM,MAAIA,GAAA,wBACpC,GAAKA,GAAA,aAEJ,CACjBsD,2BAA4B5wB,OAAO6wB,aAAaC,QAAQ,8BACzDxD,GAAA,qCA8L8B,IAC7BN,KAAKxsB,iBAAiB4J,6BAA+BC,EAAAA,GAAAA,YACpD2iB,KAAKxsB,iBAAiBuwB,qBACtB/D,KAAKxsB,iBAAiBwwB,aAAU1D,GAAA,wBAEhBa,IACjBA,EAAGzvB,SAAS4xB,KAAK,SAAUtD,KAAKiE,WAChCjE,KAAKiE,WAAW,IACjB3D,GAAA,yBAEkB,CAACa,EAAkB+C,KACpCA,EAAmBX,OAAO,SAAUvD,KAAKiE,WACzC9C,EAAGzvB,SAAS4xB,KAAK,SAAUtD,KAAKiE,WAC5BC,IAAuBlE,KAAKz3B,MAAM8I,MAAM6J,WAAc8kB,KAAKxsB,iBAAiB2wB,8BAG9EnE,KAAKoE,aAAa,MAFlBpE,KAAKoE,aAAajD,EAAGzvB,UAIvBsuB,KAAKiE,WAAW,IACjB3D,GAAA,yBAEmBa,IAClB,MAAM,KAAEt5B,GAASs5B,EAAGzvB,SACpByvB,EAAGzvB,SAAS6xB,OAAO,SAAUvD,KAAKiE,WAC9B9C,EAAGzvB,WAAasuB,KAAKz3B,MAAM8I,MAAM6J,WACnC8kB,KAAKoE,aAAa,OAEhBv8B,EAAKw8B,WAAW,YAAcx8B,EAAKw8B,WAAW,iBAChDrE,KAAKz3B,MAAM+7B,cAAcnD,EAAY,SAEvCnB,KAAKiE,WAAW,IACjB3D,GAAA,wBAEkBa,IACjBnB,KAAKuE,mBAAmBpD,EAAGzvB,SAAS,IACrC4uB,GAAA,uBAEgB,CAAC7hB,EAAY+lB,KAC5BxE,KAAKuE,mBAAmBC,EAAsB,IAC/ClE,GAAA,sBAEer8B,IAAoC,IAAnC,OAAE0tB,GAA4B1tB,EAC7C+7B,KAAKyE,cAAc,CACjBv+B,MAAO85B,KAAKz3B,MAAM0kB,WAAW/mB,MAC7ByrB,UACA,IACH2O,GAAA,sBAEejoB,IAAkC,IAAjC,MAAEnS,GAA0BmS,EAC3C,MAAM,MAAEhH,EAAK,WAAE4b,GAAe+S,KAAKz3B,MACnCy3B,KAAKyE,cAAc,CACjBv+B,QACAyrB,OAAQtgB,EAAMsgB,SAEhB,MAAMxN,EAAQ8I,EAAW9I,QACpB6b,KAAK5S,WAAWwH,IAAIzQ,KACvB6b,KAAK5S,WAAWmW,OAAO,SAAUvD,KAAK0E,cAClCvgB,IACF6b,KAAK5S,WAAajJ,EAClB6b,KAAK5S,WAAWkW,KAAK,SAAUtD,KAAK0E,eAExC,IACDpE,GAAA,0BAE6Dn4B,IAC5D,IAAK63B,KAAKxsB,iBAAiBwwB,YAAehE,KAAKrB,WAAaqB,KAAKxsB,iBAAiBuwB,mBAAqB,OACvG,MAAMY,EAAO3E,KAAK4E,QAAQz8B,GAC1B08B,GAAAA,EAAAA,iBAA4B,CAC1B/S,SAAU,CAAEgT,EAAGH,EAAKG,EAAGC,EAAG,MAC1B9pB,KAAM+kB,KAAKz3B,MAAM8I,OACjB,IACHivB,GAAA,+BAEyBe,IAAmC,IAAA2D,EAC3D,GAAIhF,KAAKz3B,MAAM08B,uBACb,OAGF,IAAI,QAAExD,EAAO,QAAEF,GAAYF,EAC3B,MAAM,MAAEhwB,GAAU2uB,KAAKz3B,MAOvB,GALsC,oBAAf28B,YAA8B7D,aAAiB6D,aACpC,QAAnBF,EAAA3D,EAAM8D,qBAAa,IAAAH,OAAA,EAAnBA,EAAqBn6B,QAAS,IAC3C42B,EAAUJ,EAAM8D,cAAc,GAAG1D,QACjCF,EAAUF,EAAM8D,cAAc,GAAG5D,UAE9BlwB,EAAM6J,YAAc8kB,KAAKxsB,iBAAiByhB,iBAAkB,CAC/D,GAAwB,MAApB+K,KAAKoF,YAAqB,CAC5B,MAAMC,EAAMrF,KAAKoF,YAAc3D,EAC/BzB,KAAKsF,iBAAiBD,EACxB,CACA,GAAIh0B,EAAMk0B,YAAkC,MAApBvF,KAAKwF,YAAqB,KAAAC,EAAAC,EAAAC,EAChD,IACIC,GADA,IAAE5/B,EAAG,IAAEC,GAAQoL,EAAMk0B,WAEzB,GAAQvF,KAAKz3B,MAAM0kB,WAAW4Y,QACvBC,EAAAA,GAAAA,YACHF,EAAO5F,KAAKwF,YAAcjE,EAC1Bv7B,EAAMqL,EAAMw0B,MAAMd,EAAEgB,OAAO10B,EAAMw0B,MAAMd,EAAE/+B,GAAO4/B,GAChD3/B,EAAMoL,EAAMw0B,MAAMd,EAAEgB,OAAO10B,EAAMw0B,MAAMd,EAAE9+B,GAAO2/B,QAIhDA,GAAQ5F,KAAKwF,YAAcjE,IAAYlwB,EAAMw0B,MAAMd,EAAEgB,OAAO,GAAK10B,EAAMw0B,MAAMd,EAAEgB,OAAO,IACtF//B,GAAO4/B,EACP3/B,GAAO2/B,EAKXv0B,EAAM0K,gBAAgB,aAAc,CAAE/V,MAAKC,QAC3C+5B,KAAK0E,eACL1E,KAAKgG,iBAAyF,QAAzEP,EAAgD,QAAhDC,EAAG1F,KAAKz3B,MAAM8I,MAAMijB,oCAA4B,IAAAoR,GAAU,QAAVA,EAA7CA,EAA+Ch0B,gBAAQ,IAAAg0B,GAAW,QAAXC,EAAvDD,EAAyDO,iBAAS,IAAAN,OAAA,EAAlEA,EAAA9jB,KAAA6jB,UAAsE,IAAAD,EAAAA,EAAI,IACpG,CACF,CACAzF,KAAKoF,YAAc3D,EACnBzB,KAAKwF,YAAcjE,CAAO,IAC3BjB,GAAA,2BAE8Dn4B,IACxD63B,KAAKxsB,iBAAiBwwB,aAAchE,KAAKz3B,MAAM29B,qBAChDlG,KAAKxsB,iBAAiBwwB,YAAyC,IAA3B77B,EAAEg9B,cAAct6B,QACtDm1B,KAAKmG,kBAAkBh+B,EAAEg9B,cAAc,GACzC,IACD7E,GAAA,0BAEoBn4B,IACf63B,KAAKxsB,iBAAiBwwB,YAAyC,IAA3B77B,EAAEg9B,cAAct6B,QACtDm1B,KAAKoG,kBAAkBj+B,EAAEg9B,cAAc,GACzC,IACD7E,GAAA,yBAEkB,KACbN,KAAKxsB,iBAAiBwwB,YACxBhE,KAAKqG,iBACP,IACD/F,GAAA,2BAEoB,KACnBuE,GAAAA,EAAAA,iBAA4B,CAC1B/S,SAAU,KACV7W,KAAM,MACN,IACHqlB,GAAA,0BAEoBe,IACnB,MAAM,uBAAE4D,EAAsB,0BAAEqB,EAAyB,MAAEj1B,GAAU2uB,KAAKz3B,MAC1E,GAAK84B,aAAiBkF,YAAclF,EAAMmF,QAAWvB,IAA2BjF,KAAKxsB,iBAAiBwwB,WACpG,OAEFsC,EAA0B,UAE1BtG,KAAKyG,YAAcpF,EAAME,QAEzB,MAAOmF,EAAkBC,GAAoBt1B,EAAMw0B,MAAMd,EAAE6B,SAC3D5G,KAAKgG,iBAAmB,CAAEhgC,IAAK2gC,EAAkB1gC,IAAKygC,GACtDt5B,SAAS2xB,iBAA8B,YAAaiB,KAAKoG,mBACzDh5B,SAAS2xB,iBAAiB,UAAWiB,KAAKqG,iBAC1Cj5B,SAAS2xB,iBAAiB,YAAaiB,KAAK6G,mBAC5Cz5B,SAAS2xB,iBAAiB,WAAYiB,KAAK8G,iBAAiB,IAC7DxG,GAAA,0BAEoBe,IAA8B,IAAA0F,EAAAC,EACjD,MAAM,MAAE31B,EAAK,WAAE4b,GAAe+S,KAAKz3B,MACnC,GAAyB,OAArB8I,EAAMk0B,YAAiD,OAA1BvF,KAAKgG,iBACpC,OAEF,IACIJ,GADA,IAAE5/B,EAAG,IAAEC,GAAQoL,EAAMk0B,YAAcvF,KAAKgG,iBAE5C,GAAQhG,KAAKz3B,MAAM0kB,WAAW4Y,QACvBC,EAAAA,GAAAA,YACHF,EAAO5F,KAAKyG,YAAepF,EAAME,QACjCv7B,EAAMqL,EAAMw0B,MAAMd,EAAEgB,OAAO10B,EAAMw0B,MAAMd,EAAE/+B,GAAO4/B,GAChD3/B,EAAMoL,EAAMw0B,MAAMd,EAAEgB,OAAO10B,EAAMw0B,MAAMd,EAAE9+B,GAAO2/B,QAIhDA,IAAS5F,KAAKyG,YAAepF,EAAME,UAAYlwB,EAAMw0B,MAAMd,EAAEgB,OAAO,GAAK10B,EAAMw0B,MAAMd,EAAEgB,OAAO,IAC9F//B,GAAO4/B,EACP3/B,GAAO2/B,EAIX5F,KAAKyG,YAAcpF,EAAME,QAEzB,MAAM0F,EAAmD,QAArCF,EAAG11B,EAAMijB,oCAA4B,IAAAyS,GAAU,QAAVA,EAAlCA,EAAoCr1B,gBAAQ,IAAAq1B,GAAW,QAAXC,EAA5CD,EAA8Cd,iBAAS,IAAAe,OAAA,EAAvDA,EAAAnlB,KAAAklB,GACvB,GAAIE,EAAgB,CAClB,MAAMC,EAAcj9B,KAAK+xB,IAAI/1B,EAAMD,GAC7BmhC,EAAel9B,KAAK+xB,IAAIiL,EAAehhC,IAAMghC,EAAejhC,KAElE,GAAIkhC,EA1bmB,IA0bLC,GAAuCD,EAAcC,EA1bhD,IA2brB,MAEJ,CAEA91B,EAAM0K,gBAAgB,aAAc,CAAE/V,MAAKC,QAC3CgnB,EAAWlR,gBAAgB,YAAa,MACxCikB,KAAK0E,cAAc,IACpBpE,GAAA,wBAEiB,KAChBN,KAAKyG,YAAc,KAEnBr5B,SAAS4xB,oBAAoB,YAAagB,KAAKoG,mBAC/Ch5B,SAAS4xB,oBAAoB,UAAWgB,KAAKqG,iBAC7Cj5B,SAAS4xB,oBAAoB,YAAagB,KAAK6G,mBAC/Cz5B,SAAS4xB,oBAAoB,WAAYgB,KAAK8G,kBAC9C9G,KAAKz3B,MAAM+9B,0BAA0B,KAAK,IAC3ChG,GAAA,sBAEe,KACd,MAAM,MAAEjvB,EAAK,WAAE4b,GAAe+S,KAAKz3B,MAC9By3B,KAAKxsB,iBAAiBwwB,aAC3B/W,EAAWlR,gBAAgB,YAAa,MACxC1K,EAAM0K,gBAAgB,aAAc,MACpCikB,KAAK0E,eAAc,IACpBpE,GAAA,wBAEkBlqB,IACjB,MAAM+N,EAAQ6b,KAAKz3B,MAAM0kB,WAAW9I,QAC9BwB,GAAWyhB,EAAAA,EAAAA,IAAsB,CACrCr1B,YAAaiuB,KAAKxsB,iBAClB2vB,WAAYnD,KAAKz3B,MAAM0kB,WAAWkW,aAE9B5O,GAAa8S,EAAAA,EAAAA,IAAoB,CACrCC,cAAetH,KAAKz3B,MAAM0kB,WAAWsH,WAAane,EAClD6W,WAAY+S,KAAKz3B,MAAM0kB,WACvBtH,WACA4hB,SAAUpjB,EAAMojB,SAASpjB,EAAMmD,KAAKzc,OAAS,KAG3C0pB,EAAa5O,GACfxB,EAAMqjB,iBAERxH,KAAKz3B,MAAM0kB,WAAW7S,iBAAiB,CACrCma,aACAtO,UAAW,MACX,IACHqa,GAAA,sBAEgBe,IACfA,EAAMryB,iBACN,MAAM21B,EAAO3E,KAAK4E,QAAQvD,GACpB30B,EAAUszB,KAAKz3B,MAAM8I,MAAM6J,WAAa8kB,KAAKyH,WAAW9C,GAC1Dj4B,GAAWA,EAAQ7E,OAAS+J,EAAAA,EAAAA,MAC9BgG,YAAW,KACTooB,KAAKz3B,MAAMm/B,uBAAwBh7B,EAAQ,GAC1C,GACHA,EAAQqB,QAAQ,WAAYszB,GAC9B,IACDf,GAAA,gBAEUn4B,IACT,GAAsB,UAAlBA,EAAEw/B,YAAyB,OAE/Bx/B,EAAEs5B,QAAUt5B,EAAEyd,OAAOkf,EACrB38B,EAAEo5B,QAAUp5B,EAAEyd,OAAOmf,EAErB,MAAM5D,EAAKnB,KAAKz3B,MAAM8I,MAAM6J,WAAa8kB,KAAKyH,WAAWzH,KAAK4E,QAAQz8B,IACjE63B,KAAKxsB,iBAAiBuwB,qBACpB5C,EAGHnB,KAAKe,cAAc54B,EAAuBg5B,GAF1CnB,KAAK4H,cAAcz/B,GAIvB,IACDm4B,GAAA,sBAEe,CAACn4B,EAAqBuE,KACpCvE,EAAE6G,iBACF,MAAM21B,EAAO3E,KAAK4E,QAAQz8B,GACpB0/B,EAAgB7H,KAAKyH,WAAW9C,GAChCxD,EAAKz0B,QAAAA,EAAWm7B,EACtB,IAAK1G,GAAMA,EAAG2G,gBAAgBnD,GAC5B,OAEF,MAAMoD,EAAeC,EAAAA,EAAAA,gBAA2C,WAAY7G,GAC5E,IAAK4G,EAAc,OACnB/H,KAAKuE,mBAAmBpD,GACxB,MAAM8G,EACJ,CAAC,YAAa,UAAU98B,MAAMtD,GAASs5B,EAAGt5B,KAAKw8B,WAAWx8B,MAAUs5B,EAAGt5B,OAAS+J,EAAAA,EAAAA,IAC5Es2B,EAAmBH,EAAap0B,YAEtC,OAAOksB,GAAAA,KACL13B,EACA,CACE8/B,GAAiB,CACf7uB,GAAI,OACJlV,MAAO,aACP4L,QAASA,IAAMkwB,KAAKz3B,MAAMm/B,uBAAwBvG,MAGlD4G,EAAal2B,WAAak2B,SAAAA,EAAcp2B,gBAAkB,CAC1DyH,GAAI,QACJlV,MAAO,QACP4L,QAASA,IAAMi4B,EAAaI,gBAG1BD,EACA,CACE,CAAErgC,KAAM,UAAW3D,MAAO,cAE1B,CACEkV,GAAI,+BACJlV,MAAO,6BACP4L,QAASA,IAAMi4B,EAAar2B,SAAS02B,gBAAgBC,EAAAA,GAAAA,kBAGvD,CACEjvB,GAAI,+BACJlV,MAAO,6BACP4L,QAASA,IAAMi4B,EAAar2B,SAAS02B,gBAAgBC,EAAAA,GAAAA,kBAGvD,CACEjvB,GAAI,0BACJlV,MAAO,wBACP4L,QAASA,IAAMi4B,EAAar2B,SAAS02B,gBAAgBC,EAAAA,GAAAA,cAGvD,CACEjvB,GAAI,2BACJlV,MAAO,gBACP4L,QAASA,IAAMi4B,EAAar2B,SAAS02B,gBAAgBC,EAAAA,GAAAA,OAGzD,IAEHH,GAAoBD,IAAkB,CAAEpgC,KAAM,WAE/C,CACEuR,GAAI,iBACJlV,MAAO,iBACP4L,QAASA,IAAMi4B,EAAaO,gBAE9B,CACElvB,GAAI,eACJlV,MAAO,eACP4L,QAASA,IAAMi4B,EAAaQ,cAE9B,CACEnvB,GAAI,gBACJlV,MAAO,gBACP4L,QAASA,IAAMi4B,EAAaS,gBAE9B,CACEpvB,GAAI,gBACJlV,MAAO,gBACP4L,QAASA,IAAMi4B,EAAaU,gBAG9B,CAAE5gC,KAAM,WAER,CACEuR,GAAI,SACJlV,MAAO,SACP4L,QAASA,KACHi4B,EAAap2B,eACf+2B,EAAAA,GAAAA,IAA0B,CAAEC,UAAW3I,KAAKz3B,MAAMogC,UAAWn1B,iBAAkBwsB,KAAKxsB,oBAEpFu0B,EAAajtB,eAAe,CAAEgE,UAAWC,EAAAA,GAAAA,SACzCihB,KAAKz3B,MAAM8I,MAAM8L,oBACnB,IAIHrD,OAAO8P,SACPliB,KAAK0D,IAAI,IAAWA,EAAMwW,KAAM,CAAEgnB,aAAczH,EAAGt5B,UACvD,IACFy4B,GAAA,oDAE8C5zB,KACzCA,SAAAA,EAASmF,WAAanF,SAAAA,EAASiF,gBACjCquB,KAAK0E,cACP,IACDpE,GAAA,qBAEc,CAAC7hB,EAAaoqB,KAC3B,MAAM,MAAEx3B,GAAU2uB,KAAKz3B,MACjB0kB,EAAa5b,EAAM2V,QACN,YAAf6hB,GAA6B5b,GAAeA,EAAW9I,WAI3DugB,EAAAA,EAAAA,IAAa,CAAEzX,aAAY7a,UAAWf,IAElC2uB,KAAK8I,WACP9I,KAAKiE,YACP,IACD3D,GAAA,eAEQ,KAAM,IAAAyI,EAAAC,EACiB,QAA9BD,EAAI/I,KAAKz3B,MAAM8I,MAAM6J,iBAAS,IAAA6tB,GAAc,QAAdC,EAA1BD,EAA4BE,oBAAY,IAAAD,GAAxCA,EAAAnnB,KAAAknB,GACF/I,KAAKoE,aAAa,MAElBpE,KAAKuE,mBAAmB,MAEtBvE,KAAKkJ,iBACPlJ,KAAKkJ,eAAeC,cAAa,GACjCnJ,KAAKkJ,eAAiB,MAExBlJ,KAAKz3B,MAAM8I,MAAMqC,iBAAiBvB,SAASzF,IAAY,IAAA08B,EAAAC,EAAAC,EAAAC,EACpB,QAA7BH,GAAAC,EAAA38B,EAAQgF,UAASu3B,oBAAY,IAAAG,IAA7BA,EAAAvnB,KAAAwnB,IAA6E,QAAxCC,GAACC,EAAA78B,EAAQgF,UAAS83B,8BAAsB,IAAAF,GAAvCA,EAAAznB,KAAA0nB,IACxC78B,EAAQoO,gBACV,GACA,IACHwlB,GAAA,kBAEYz4B,IAEE,UAATA,GAAoBm4B,KAAKxsB,iBAAiBi2B,MACpB,OAApBzJ,KAAK0J,aACP1J,KAAK0J,WAAa12B,OAAO22B,uBAAsB,KAC7C3J,KAAK4J,aAC2B52B,KAGb,MAAdgtB,KAAK6J,OAAiB7J,KAAK8I,YACpC9I,KAAK6J,MAAQ72B,OAAO22B,uBAAsB,KACxC3J,KAAK8J,YAC2B92B,IAEpC,IACDstB,GAAA,mBAEY,KACX,MAAM,MAAEjvB,GAAU2uB,KAAKz3B,MAED,OAAlB8I,EAAM2V,SAA+C,OAA3BgZ,KAAK+J,UAAUl+B,SAAqBm0B,KAAK8I,YAGnE9I,KAAKgK,sBACiB,OAApBhK,KAAK0J,aACP1J,KAAK0J,WAAa12B,OAAO22B,sBAAsB3J,KAAK4J,cAGxD5J,KAAK6J,WAAQj0B,GAEbq0B,EAAAA,EAAAA,IAAW,CACTz2B,iBAAkBwsB,KAAKxsB,iBACvByZ,WAAY+S,KAAKz3B,MAAM0kB,WACvB7a,UAAWf,EACXy3B,UAAW9I,KAAK8I,YAChB,IACHxI,GAAA,oBAUa,KACZ,MAAM,MAAEjvB,GAAU2uB,KAAKz3B,MACjB2hC,EAAgBrF,GAAAA,EAAAA,2BAAsCxzB,GAE5D,GADA2uB,KAAK0J,WAAa,MACb1J,KAAKmK,eACR,OAEFnK,KAAKmK,eAAeC,UAAU,EAAG,EAAGpK,KAAKz3B,MAAM0kB,WAAW/mB,MAAOmL,EAAMsgB,QACvE,MAAM0Y,EACwG,IAA5GC,GAAAA,EAAAA,QAA6BlqB,KAAQA,EAAElF,YAAckF,EAAElF,UAAUrT,KAAKw8B,WAAW,iBAAgBx5B,QACjGm1B,KAAKz3B,MAAM0kB,WAAWsd,kBACrBL,EAEH,IAAK,MAAQx4B,SAAU84B,KAAqBn5B,EAAMqC,mBAE5C22B,GAAkD,MAA/BG,EAAgBZ,aACpCS,GAAsD,MAAnCG,EAAgBC,mBAEpCzK,KAAKmK,eAAehwB,OAChBkwB,EACFG,EAAgBC,gBAAiBzK,KAAKmK,eAAgBjgC,OAAOwgC,KAE7DF,EAAgBZ,YAAa5J,KAAKmK,gBAEpCnK,KAAKmK,eAAeQ,UAExB,IACDrK,GAAA,gBAES,CAAqCn4B,EAAeyiC,KAC5D,MAAM,MAAEv5B,GAAU2uB,KAAKz3B,MACjBk5B,EAAUt5B,EAAEs5B,UAAWmJ,aAAc,EAAdA,EAAgBnJ,SACvCF,EAAUp5B,EAAEo5B,UAAWqJ,aAAc,EAAdA,EAAgBrJ,SACvCsJ,GAAWC,EAAAA,EAAAA,IAAYz5B,GACvB05B,EAAgB/K,KAAKgL,OAAQxZ,wBAC7ByZ,EAAuBxJ,EAAUsJ,EAAc3M,KAC/C8M,EAAuB3J,EAAUwJ,EAAcrZ,IAC/CoT,EAAImG,EAAuB55B,EAAM2V,QAAQuN,WAAasW,EAASzM,KAAKl4B,MACpE6+B,EAAImG,EAAuBL,EAASnZ,IAAIC,OACxCkU,EAAQx0B,EAAMw0B,MACdsF,EAAaJ,EAAc3M,KAAOyM,EAASzM,KAAKl4B,MAChDklC,EAAcL,EAAcM,MAAQR,EAASQ,MAAMnlC,MACzD,MAAO,IACD0kC,EAEJ9F,EAAGe,EAAMf,EAAEiB,OAAOjB,GAClBC,EAAGc,EAAMd,EAAEgB,OAAOhB,GAClBuG,OAAQ,CACNxG,IACAC,KAEF7+B,MAAO,EACPyrB,OAAQ,EACR4Z,QAASN,EACTO,QAASN,EACTO,+BAAgChK,EAAU0J,GAAc1J,EAAU2J,EACnE,IACF9K,GAAA,sBAEezjB,IAA0D,IAAzD,MAAE3W,EAAK,OAAEyrB,GAA2C9U,EACnE,MAAM6uB,EAAQ9M,EAAAA,GAAAA,gBACR+M,EAAgB3L,KAAK+J,UAAUl+B,QAQnCm0B,KAAK8I,WACL6C,IACC1hC,KAAK+xB,IAAIrK,EAAS+Z,EAAQC,EAAcha,SAAW,GAAK1nB,KAAK+xB,IAAI91B,EAAQwlC,EAAQC,EAAczlC,QAAU,KAE1G04B,EAAAA,GAAAA,uBAA6B,CAAE+M,gBAAezlC,QAAOyrB,WACrDqO,KAAK8I,UAAUjD,MAAM6F,EAAOA,GACxB1L,KAAKxsB,iBAAiBi2B,OAASzJ,KAAKmK,iBACtCvL,EAAAA,GAAAA,uBAA6B,CAC3B+M,cAAe3L,KAAK4L,eAAe//B,QACnC3F,QACAyrB,WAEFqO,KAAKmK,eAAetE,MAAM6F,EAAOA,IAEnC9zB,YAAW,KACTooB,KAAK0E,cAAc,IAEvB,IACDpE,GAAA,gBAEUe,IACT,MAAMsD,EAAO3E,KAAK4E,QAAQvD,EAAO,CAC/BI,QAASJ,EAAMzb,OAAOkf,EACtBvD,QAASF,EAAMzb,OAAOmf,IAElBr4B,EAAUszB,KAAKz3B,MAAM8I,MAAM6J,WAAa8kB,KAAKyH,WAAW9C,GAG9D,GAFAj4B,SAAAA,EAASqB,QAAQ,QAAS42B,GAErB3E,KAAK6L,6BAAV,CAKA,GAAI7L,KAAKxsB,iBAAiBuwB,mBACxBc,GAAAA,EAAAA,iBAA4B,CAC1B/S,SAAU,KACV7W,KAAM,OAER+kB,KAAKxsB,iBAAiB4G,iBAAiB,CACrC4pB,WAAYhE,KAAKxsB,iBAAiBs4B,kBAClC/H,oBAAoB,SAEjB,GACL/D,KAAKrB,WACJqB,KAAKvxB,MAAMm1B,0BACZ5D,KAAK+L,iBAAmBC,GAAAA,EAAAA,OACxBhM,KAAKxsB,iBAAiB4J,6BAA+BC,EAAAA,GAAAA,WACrD,CACA,MAAM4uB,EAAejM,KAAKxsB,iBAAiB4J,6BAA+BC,EAAAA,GAAAA,UAE1E2iB,KAAKkM,SAAS,CAAEtI,0BAA0B,IAC1C5D,KAAKz3B,MAAM4jC,oBAAoBj7B,KAC7B7M,IAAAA,cAAC+nC,EAAAA,aAAY,CACXC,QACEhoC,IAAAA,cAACwL,EAAAA,OAAM,CACLC,QAASA,KACPkwB,KAAKz3B,MAAM4jC,oBAAoBz9B,OAC/BsE,OAAO6wB,aAAayI,QAAQ,2BAA4B,OAAO,GAElE,WAKHjoC,IAAAA,cAACuB,EAAAA,UAAS,CAACJ,UAAU,YAAW,gDAElC,CAAE+mC,QAASN,GAEf,CAEAjM,KAAK+L,eAAiB/L,KAAKz3B,MAAMikC,UAvCjC,MAFExM,KAAK6L,8BAA+B,CAyCK,IAC5CvL,GAAA,yBAEkB,KAEjB1oB,YAAW,KAAM,IAAA60B,EACa,QAA5BA,EAAAzM,KAAKyC,gBAAgB52B,eAAO,IAAA4gC,GAA5BA,EAA8B5L,UAAUC,OAAOsB,GAA4BC,GAA+B,IAExGrC,KAAKxsB,iBAAiB4J,6BAA+BC,EAAAA,GAAAA,WACvD2iB,KAAK4J,aACP,IACDtJ,GAAA,wBAEiB,SAACn4B,GAAkE,IAA/BukC,EAAkB/yB,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,IAAAA,UAAA,GACtE,MAAM,MAAEtI,EAAK,WAAE4b,GAAeyW,EAAKn7B,MAC7BokC,EAAejJ,EAAKjB,gBAAgB52B,QACpC+gC,EAAav7B,EAAMsgB,OACzB,GAAIgb,EAAc,CAChB,MAAMhI,EAAOjB,EAAKkB,QAAkEz8B,EAAG,CACrF0kC,WAAYH,GAAsBhJ,EAAKmJ,UACvCpL,QAASt5B,EAAEs5B,QACXF,QAASp5B,EAAEo5B,UAIb3pB,YAAW,KAGT,MAAMk1B,EAAWz7B,EAAMsgB,OAAS,IAAMgT,EAAK6G,SAAWoB,EAAa,KAGjEE,GACCH,EAAa9L,UAAU/B,SAASuD,KAChCpV,EAAWsd,iBAGFuC,GAAYH,EAAa9L,UAAU/B,SAASuD,KACtDsK,EAAa9L,UAAUC,OAAOuB,IAF9BsK,EAAa9L,UAAUI,IAAIoB,IAKxBsC,EAAKkI,WAAcx7B,EAAM6J,YAAa4xB,GAAa7f,EAAWsd,gBAIxDoC,EAAa9L,UAAU/B,SAASsD,KACzCuK,EAAa9L,UAAUC,OAAOsB,IAJzBuK,EAAa9L,UAAU/B,SAASsD,KACnCuK,EAAa9L,UAAUI,IAAImB,GAI/B,GAEJ,CACF,IAAC9B,GAAA,qBAEc,KACbN,KAAK6M,WAAY,CAAK,IACvBvM,GAAA,qBAEen4B,IACd,IAAK63B,KAAKz3B,MAAM29B,qBAAkD,IAA3B/9B,EAAEg9B,cAAct6B,OAAc,CACnE,MAAMkiC,EAAa5kC,EAAEg9B,cAAc,GACnC,GAAInF,KAAKxsB,iBAAiBwwB,WACxBhE,KAAKgN,yBAAyBD,QACzB,GAAI/M,KAAKxsB,iBAAiBuwB,mBAAoB,KAAAkJ,EAGnD,GAFAjN,KAAKoF,YAAc2H,EAAWtL,QAC9BzB,KAAKwF,YAAcuH,EAAWxL,QACR,QAAlB0L,EAACpI,GAAAA,EAAAA,cAAiB,IAAAoI,IAAjBA,EAAmBrY,IAAIoL,KAAKz3B,MAAM8I,OAAQ,CAC7C,MAAMszB,EAAO3E,KAAK4E,QAAQmI,EAAY,CACpCF,UAAW7M,KAAK6M,UAChBpL,QAASsL,EAAWtL,QACpBF,QAASwL,EAAWxL,UAEtBvB,KAAKkN,iBAAiBlN,KAAKmN,6BAA6BxI,IACxD3E,KAAK6L,8BAA+B,CACtC,CACF,KAAO,KAAAuB,EACL,MAAMzI,EAAO3E,KAAK4E,QAAQmI,EAAY,CAAEM,SAAS,IAC3C3gC,EAAUszB,KAAKyH,WAAW9C,GAChC,GAAIj4B,SAAwB,QAAjB0gC,EAAP1gC,EAAS4gC,uBAAe,IAAAF,GAAxBA,EAAAvrB,KAAAnV,GAA8B,CACNA,EACRwoB,cACpB,CACF,CACA8K,KAAKuN,gBAAgBR,GAAY,EACnC,KACDzM,GAAA,oBAEcn4B,IACR63B,KAAKz3B,MAAM29B,sBACTlG,KAAKwN,gCACRrlC,EAAE6G,iBAECgxB,KAAKz3B,MAAM29B,qBAAkD,IAA3B/9B,EAAEg9B,cAAct6B,QACrDm1B,KAAKyN,wBAAwBtlC,EAAEg9B,cAAc,IAEjD,IACD7E,GAAA,mBAEan4B,KACP63B,KAAKz3B,MAAM29B,qBAAuBlG,KAAKxsB,iBAAiBwwB,YAC3DhE,KAAK0N,uBAAuBvlC,EAC9B,IACDm4B,GAAA,sBAEgBn4B,IACX63B,KAAKxsB,iBAAiBwwB,aACxBhE,KAAKxsB,iBAAiBuI,gBAAgB,cAAc,GACpD3O,SAAS4xB,oBAAoB,YAAagB,KAAK2N,yBAE5C3N,KAAKxsB,iBAAiBuwB,qBACzB/D,KAAKxsB,iBAAiBuI,gBAAgB,sBAAsB,GAC5DikB,KAAKyN,wBAAwBtlC,GAC/B,IACDm4B,GAAA,iCAE2Bn4B,IAC1B,MAAM,WAAEqkC,EAAU,uBAAEvH,EAAsB,WAAEhY,EAAU,MAAE5b,GAAU2uB,KAAKz3B,MACjE8kC,EAA2B,oBAAVO,OAAyBzlC,aAAaylC,MAG7D,GAFA5N,KAAK+L,eAAiBS,GAElBqB,EAAAA,EAAAA,IAAe1lC,KAAO88B,IAA2BhY,EAAWsd,gBAAiB,KAAAuD,EAC/E,MAAMnJ,EAAO3E,KAAK4E,QAAQz8B,EAAG,CAAEklC,YACzB3gC,EAAUszB,KAAKyH,WAAW9C,GAChC,GAAI3E,KAAKxsB,iBAAiBwwB,WAAY,CAEd,IAAA+J,EAAAC,EAAAC,EAAtB,IADAC,EAAAA,GAAAA,GAAiB,CAAE35B,UAAWyrB,KAAKxsB,iBAAiB26B,mBAAoBC,OAAQ,aAC5E/8B,EAAMk0B,WACRvF,KAAKgG,iBAA8E,QAA9D+H,EAAqC,QAArCC,EAAG38B,EAAMijB,oCAA4B,IAAA0Z,GAAU,QAAVA,EAAlCA,EAAoCt8B,gBAAQ,IAAAs8B,GAAW,QAAXC,EAA5CD,EAA8C/H,iBAAS,IAAAgI,OAAA,EAAvDA,EAAApsB,KAAAmsB,UAA2D,IAAAD,EAAAA,EAAI,KAEzF3gC,SAAS2xB,iBAAiBsO,EAAU,YAAc,YAAarN,KAAK2N,wBACpEvgC,SAAS2xB,iBAAiBsO,EAAU,WAAa,UAAWrN,KAAK0N,uBACnE,CACA,GAAIhhC,SAAwB,QAAjBohC,EAAPphC,EAAS4gC,uBAAe,IAAAQ,GAAxBA,EAAAjsB,KAAAnV,GAA8B,CAChCszB,KAAKuE,mBAAmB,MACE73B,EACRwoB,cACpB,MACEsX,IAAeR,GAAAA,EAAAA,OACf36B,EAAMqC,iBAAiBvI,MAAKuH,IAAA,IAAC,SAAEhB,GAAUgB,EAAA,OAAKhB,EAASkJ,SAAS,OAEhElO,SAAAA,EAASqB,QAAQ,YAAa42B,GAC9B3E,KAAKuE,mBAAmB73B,IAE1B2E,EAAMtD,QAAQ,YAAasD,EAAOszB,EAAMj4B,GACxCszB,KAAK6M,WAAY,EACjB7M,KAAKqO,MAAQ1J,EAAKG,EAClB9E,KAAKsO,MAAQ3J,EAAKI,CACpB,CAEA/E,KAAKoF,YAAcj9B,EAAEs5B,QACrBzB,KAAKwF,YAAcr9B,EAAEo5B,OAAO,IAC7BjB,GAAA,gCAE0Bn4B,IACzB,MAAMw8B,EAAO3E,KAAK4E,QAAQz8B,EAAG,CAC3B0kC,UAAW7M,KAAK6M,UAChBpL,QAASt5B,EAAEs5B,QACXF,QAASp5B,EAAEo5B,UAEb,IAAKoD,EAAK8G,+BAKR,YAJA5G,GAAAA,EAAAA,iBAA4B,CAC1B/S,SAAU,KACV7W,KAAM,OAKV,MAAM,MAAE5J,GAAU2uB,KAAKz3B,MACjB2gC,EAAiBlJ,KAAKyH,WAAW9C,GACjCj4B,EAAU2E,EAAM6J,WAAaguB,EAyBjC,IAAAqF,EAAAC,GAvBIxO,KAAKrB,WAAaqB,KAAKxsB,iBAAiBuwB,qBAC5C/D,KAAK6L,8BAA+B,EACpC7L,KAAKkN,iBACHlN,KAAKoF,aAAepF,KAAKwF,aAAexF,KAAKxsB,iBAAiBuwB,oBAAsBc,GAAAA,EAAAA,SAChF7E,KAAKmN,6BAA6B,CAChCrI,EAAGD,GAAAA,EAAAA,SAAAA,GAAyBxzB,EAAMw0B,MAAMf,EAAEiB,OAAOpB,EAAKlD,SAAWpwB,EAAMw0B,MAAMf,EAAEiB,OAAO/F,KAAKoF,cAC3FL,EAAGF,GAAAA,EAAAA,SAAAA,GAAyBxzB,EAAMw0B,MAAMd,EAAEgB,OAAOpB,EAAKpD,SAAWlwB,EAAMw0B,MAAMd,EAAEgB,OAAO/F,KAAKwF,gBAE7F,CAAEV,EAAGH,EAAKG,EAAGC,EAAGJ,EAAKI,KAIxB/E,KAAKxsB,iBAAiBwwB,aACzBhE,KAAKoF,YAAcT,EAAKlD,QACxBzB,KAAKwF,YAAcb,EAAKpD,SAG1B70B,SAAAA,EAASqB,QAAQ,YAAa42B,GAE5B3E,KAAK6M,WACLx7B,EAAM6J,qBAAqBuzB,GAAAA,IAC1Bp9B,EAAM6J,UAAUwzB,cAChB1O,KAAKxsB,iBAAiByhB,oBAEU,QAA7BsZ,GAACC,EAAAn9B,EAAM6J,WAAU+tB,oBAAY,IAAAsF,GAA5BA,EAAA1sB,KAAA2sB,IACHn9B,EAAM6J,UAAUyzB,OAAOhK,EAAKG,EAAI9E,KAAKqO,MAAO1J,EAAKI,EAAI/E,KAAKsO,OAE5DtO,KAAKqO,MAAQ1J,EAAKG,EAClB9E,KAAKsO,MAAQ3J,EAAKI,EAClB/E,KAAKiE,aAEP,MAAM2K,EACJ5O,KAAKz3B,MAAMikC,aAAeR,GAAAA,EAAAA,QACxBt/B,GAAWA,IAAYw8B,GAAmBA,aAA0BuF,GAAAA,GAEpEvF,IAAmBlJ,KAAKkJ,gBAAkBlJ,KAAKkJ,0BAA0BuF,GAAAA,IAC3EzO,KAAKkJ,eAAeC,cAAa,GACjCnJ,KAAKkJ,eAAiB,MAGpB0F,GAAoB1F,aAA0BuF,GAAAA,IAC3CvF,EAAe9J,WAAc8J,EAAe2F,aAC/C3F,EAAeC,cAAa,GAC5BnJ,KAAKkJ,eAAiBA,IAItB0F,IAAqB5O,KAAK4O,kBAAoB5O,KAAKgL,SAAU9B,aAAc,EAAdA,EAAgBrhC,QAAS+J,EAAAA,EAAAA,MACxFouB,KAAKgL,OAAOxlC,UAAYopC,EAAmB,QAAU,GACjD5O,KAAKxsB,iBAAiBi2B,OAASzJ,KAAK8O,cACtC9O,KAAK8O,YAAYtpC,UAAY,SAAHhB,OAAYoqC,EAAmB,SAAW,KAEtE5O,KAAK4O,iBAAmBA,EAC1B,IACDtO,GAAA,+BAEyBe,IACpBwD,GAAAA,EAAAA,UACFqJ,EAAAA,GAAAA,GAAiB,CAAE35B,UAAWyrB,KAAKxsB,iBAAiB26B,mBAAoBC,OAAQ,eAEhFF,EAAAA,GAAAA,GAAiB,CAAE35B,UAAWyrB,KAAKxsB,iBAAiB26B,mBAAoBC,OAAQ,YAElF,MAAMf,EAAgC,oBAAfnI,YAA8B7D,aAAiB6D,WACtElF,KAAK6M,WAAY,EACjB,MAAMlI,EAAO3E,KAAK4E,QAAQvD,GACpB30B,EAAUszB,KAAKz3B,MAAM8I,MAAM6J,WAAa8kB,KAAKyH,WAAW9C,GAC9Dj4B,SAAAA,EAASqB,QAAQ,UAAW42B,GAC5Bv3B,SAAS4xB,oBAAoBqO,EAAU,YAAc,YAAarN,KAAK2N,wBACvEvgC,SAAS4xB,oBAAoBqO,EAAU,WAAa,UAAWrN,KAAK0N,uBAAuB,IAC5FpN,GAAA,qCAE8B/sB,IAAwC,IAAvC,EAAEuxB,EAAC,EAAEC,GAA6BxxB,EAChE,MAAM,MAAElC,GAAU2uB,KAAKz3B,MACjBsiC,GAAWC,EAAAA,EAAAA,IAAYz5B,GACvB09B,EAAsB/O,KAAKgL,OAAQxZ,wBACnCwd,EAAY39B,EAAMw0B,MAAMf,EAAEiB,OAAmC,EAA3B10B,EAAM2V,QAAQuN,YAChD0a,EAAa59B,EAAMw0B,MAAMf,EAAEiB,OAC/BgJ,EAAoB7oC,MAAQ2kC,EAASQ,MAAMnlC,MAAQ2kC,EAASzM,KAAKl4B,MAAQmL,EAAM2V,QAAQuN,WAAa,GAEhG2a,EAAW79B,EAAMw0B,MAAMd,EAAEgB,OAAO,GAChCoJ,EAAc99B,EAAMw0B,MAAMd,EAAEgB,OAAOgJ,EAAoBpd,OAASkZ,EAASuE,OAAOzd,OAASkZ,EAASnZ,IAAIC,QAE5G,MAAO,CACLmT,GAAGuK,EAAAA,EAAAA,IAAgB,CACjBlrC,MAAO2gC,EACP9+B,IAAKgpC,EACL/oC,IAAKgpC,IAEPlK,GAAGsK,EAAAA,EAAAA,IAAgB,CACjBlrC,MAAO4gC,EACP/+B,IAAKmpC,EACLlpC,IAAKipC,IAER,IACF5O,GAAA,yBAEkBvsB,IAAwC,IAAAu7B,EAAA,IAAvC,EAAExK,EAAC,EAAEC,GAA6BhxB,EACpD,MAAMw7B,IAAsC,QAAlBD,EAACzK,GAAAA,EAAAA,cAAiB,IAAAyK,IAAjBA,EAAmB1a,IAAIoL,KAAKz3B,MAAM8I,QAC7DwzB,GAAAA,EAAAA,iBAA4B,CAC1B/S,SAAU,CAAEgT,IAAGC,QACXwK,EAAmB,CAAC,EAAI,CAAEt0B,KAAM+kB,KAAKz3B,MAAM8I,QAC/C,IACHivB,GAAA,qBAEeplB,IACVA,aAAqBuzB,GAAAA,IACvBvzB,SAAAA,EAAWs0B,eAAc,IAG3BxP,KAAKz3B,MAAM8I,MAAM0K,gBAAgB,YAAab,EAAU,IACzDolB,GAAA,2BAEqB5zB,IACpB,MAAM,UAAEwO,GAAc8kB,KAAKz3B,MAAM8I,MAC3Bo+B,EAAoBv0B,aAAqBuzB,GAAAA,GAC3C/hC,IAAYwO,GAAcu0B,GAAqB/iC,IAAYwO,UAAAA,EAAW2zB,eACpEY,IACFv0B,SAAAA,EAAWs0B,eAAc,IAEvBC,SAAqBv0B,GAAAA,EAAWN,UAClColB,KAAKoE,aAAa,MAElBpE,KAAKoE,aAAa13B,GAEtB,IACD4zB,GAAA,mBAEaqE,IACZ,MAAMtwB,EAAW2rB,KAAKz3B,MAAM8I,MAAMqC,iBAC5B4hB,EAAc0K,KAAKz3B,MAAM8I,MAAM8jB,oBAErC,IAAK,IAAI9e,EAAIif,EAAYzqB,OAAS,EAAGwL,GAAK,EAAGA,IAAK,CAChD,MAAM8qB,EAAK7L,EAAYjf,GAAG3E,SAC1B,GAAIyvB,EAAG2L,SAASnI,GACd,OAAOxD,CAEX,CAEA,IAAK,IAAI9qB,EAAIhC,EAASxJ,OAAS,EAAGwL,GAAK,EAAGA,IAAK,CAC7C,MAAM8qB,EAAK9sB,EAASgC,GAAG3E,SACvB,GAAIyvB,EAAG2L,SAASnI,GACd,OAAOxD,CAEX,CACA,OAAO,IAAI,IACZb,GAAA,yBAEkB,IAEjBN,KAAK+J,UAAUl+B,UApkCfm0B,KAAK5S,WAAa4S,KAAKz3B,MAAM0kB,WAAW9I,QACxC5b,EAAM8I,MAAM0K,gBAAgB,WAAYikB,MACxCz3B,EAAM8I,MAAMiyB,KAAK,SAAUtD,KAAK0P,eAChCnnC,EAAM8I,MACHgD,WACAivB,KAAK,SAAUtD,KAAK2P,iBACpBrM,KAAK,UAAWtD,KAAK4P,kBACrBtM,KAAK,UAAWtD,KAAK6P,kBACrBvM,KAAK,SAAUtD,KAAK8P,iBACpBxM,KAAK,YAAatD,KAAK+P,gBACvBzM,KAAK,SAAUtD,KAAKgQ,6CACpB1M,KAAK,SAAU10B,IAASoxB,KAAK0E,aAAc,KAC9Cn8B,EAAM8I,MAAMiyB,KAAK5jB,EAAAA,GAAAA,aAAgCsgB,KAAK0E,cAEtDn8B,EAAM8I,MAAMikB,cAAcgO,KAAK,SAAUtD,KAAK2P,iBAAiBrM,KAAK,SAAU10B,IAASoxB,KAAK0E,aAAc,KAE1G1E,KAAKz3B,MAAM0kB,WAAWqW,KAAK,SAAUtD,KAAKiQ,eAC1CjQ,KAAKz3B,MAAM0kB,WAAWqW,KAAK,UAAD9+B,OAAWkb,EAAAA,GAAAA,kBAAsCsgB,KAAK0E,cAChF1E,KAAK5S,WAAWkW,KAAK,SAAUtD,KAAK0E,cACpC1E,KAAKrB,WAAaC,EAAAA,GAAAA,WAClBoB,KAAK+L,eAAiBxjC,EAAMikC,WACvB3H,GAAAA,EAAAA,QACHA,GAAAA,EAAAA,gBAA2B,OAAQt8B,EAAM8I,OAE3C2uB,KAAKkQ,gBAAkB3nC,EAAM8I,MAAM8+B,qBACnCnQ,KAAK0E,cACP,CAEAlE,oBAAoB,IAAA4P,EAAAC,EAClB,MAAM,MAAEh/B,GAAU2uB,KAAKz3B,MACvBy3B,KAAKxsB,iBAAiB8vB,KAAK,QAAStD,KAAKiE,WACzCjE,KAAKxsB,iBAAiB8vB,KAAK,QAAStD,KAAK4J,aAEzC,MAAM0G,EAAgD,QAA5BF,EAAG39B,YAAyB,IAAA29B,EAAAA,EAAI,GACzC,IAAI/+B,EAAMqC,oBAAqBrC,EAAM8jB,mBAAkB,IAC/DhjB,SAASzF,IAEhB,GADAszB,KAAK2P,gBAAgBjjC,GACjBA,EAAQiH,YAAa,CAEO,IAAA48B,EAA9B,GADiCD,EAAqBnlC,MAAKiJ,IAAA,IAAC,UAAEG,GAAWH,EAAA,OAAK1H,EAAQ6H,YAAcA,CAAS,IAE3F,QAAhBg8B,EAAA7jC,EAAQgF,gBAAQ,IAAA6+B,GAAhBA,EAAkBn1B,eAEpB1O,EAAQgF,SAAS8+B,6BACnB,MAAO,GAAI9jC,EAAQ0oB,eAAgB,KAAAqb,EACjB,QAAhBA,EAAA/jC,EAAQgF,gBAAQ,IAAA++B,GAAhBA,EAAkBr1B,cACpB,KAGF/J,SAAAA,EAAOkkB,4BAEPyK,KAAKgL,OAAShL,KAAK+J,UAAUl+B,QAC7Bm0B,KAAK8I,WAAY4H,EAAAA,GAAAA,GAAoB1Q,KAAK+J,UAAUl+B,SACpDm0B,KAAK8O,YAAc9O,KAAK4L,eAAe//B,QACvCm0B,KAAKmK,gBAAiBuG,EAAAA,GAAAA,GAAoB1Q,KAAK4L,eAAe//B,SAE9Dm0B,KAAK2Q,WAAa,IAAIC,KAAAA,SAAe5Q,KAAK6Q,QAAQhlC,QAAU,CAAEilC,YAAa,SAC3E9Q,KAAK2Q,WAAW1P,IAAI,IAAI2P,KAAAA,OAAa,CAAEG,UAAW,EAAGC,KAAM,OAC3DhR,KAAK2Q,WAAWM,GAAG,QAASjR,KAAKkR,SACjClR,KAAKmR,oBAAsB,IAAIP,KAAJ,CAAW5Q,KAAKoR,iBAAiBvlC,QAAU,CAAEilC,YAAa,SACrF9Q,KAAKmR,oBAAoBF,GAAG,MAAOjR,KAAKlwB,SACX,QAA7BugC,EAAArQ,KAAKoR,iBAAiBvlC,eAAO,IAAAwkC,GAA7BA,EAA+BtR,iBAAiB,YAAaiB,KAAKqR,YAAa,CAAEC,SAAS,KAEtFtR,KAAKxsB,iBAAiBwwB,YAAehE,KAAKrB,WACxCqB,KAAKuR,UAAU1lC,UACjBm0B,KAAKwR,aAAe,IAAIZ,KAAJ,CAAW5Q,KAAKuR,UAAU1lC,QAAS,CAAEilC,YAAa,SACtE9Q,KAAKwR,aAAaP,GAAG,YAAajR,KAAKyR,gBAErCzR,KAAK0R,UAAU7lC,UACjBm0B,KAAK2R,aAAe,IAAIf,KAAJ,CAAW5Q,KAAK0R,UAAU7lC,QAAS,CAAEilC,YAAa,SACtE9Q,KAAK2R,aAAaV,GAAG,YAAajR,KAAKz3B,MAAMqpC,gBAE/C5R,KAAKmR,oBAAoBF,GAAG,YAAajR,KAAK6R,gBAGhD7R,KAAKiQ,cAAc,CAAE/pC,MAAO85B,KAAKz3B,MAAM0kB,WAAW/mB,QAClD85B,KAAK0P,cAAc,CAAE/d,OAAQtgB,EAAMsgB,SACnCqO,KAAKO,cACLP,KAAKxsB,iBAAiBzF,QAAQ6xB,GAChC,CAEAc,uBAAuB,IAAAoR,EACQ,QAA7BA,EAAA9R,KAAKoR,iBAAiBvlC,eAAO,IAAAimC,GAA7BA,EAA+B9S,oBAAoB,YAAagB,KAAKqR,cACrEU,EAAAA,EAAAA,IAAc/R,KAAKgL,SACnB+G,EAAAA,EAAAA,IAAc/R,KAAK8O,aACnB9O,KAAKz3B,MAAM0kB,WAAWsW,OAAO,SAAUvD,KAAKiQ,eAC5CjQ,KAAKz3B,MAAM0kB,WAAWsW,OAAO,SAAUvD,KAAK0E,cAC5C1E,KAAK5S,WAAWmW,OAAO,SAAUvD,KAAK0E,aACxC,CAEA/D,SACE,MAAM,WAAE6L,EAAU,oBAAEtG,EAAmB,YAAE8L,EAAW,UAAErJ,EAAS,WAAE/b,EAAU,MAAEvb,EAAK,WAAE4b,GAAe+S,KAAKz3B,MACxG,GAAI29B,EAAqB,KAAA+L,EAAAC,EAAAC,EAAAC,EACR,QAAfH,EAAAjS,KAAK2Q,kBAAU,IAAAsB,GAAfA,EAAiBzjC,IAAI,CAAEsiC,YAAa,SACnB,QAAjBoB,EAAAlS,KAAKwR,oBAAY,IAAAU,GAAjBA,EAAmB1jC,IAAI,CAAEsiC,YAAa,SACrB,QAAjBqB,EAAAnS,KAAK2R,oBAAY,IAAAQ,GAAjBA,EAAmB3jC,IAAI,CAAEsiC,YAAa,SACd,QAAxBsB,EAAApS,KAAKmR,2BAAmB,IAAAiB,GAAxBA,EAA0B5jC,IAAI,CAAEsiC,YAAa,QAC/C,KAAO,KAAAuB,EAAAC,EAAAC,EAAAC,EACL,MAAM1B,EAAc9Q,KAAKwN,+BAAiC,OAAS,OAClD,QAAjB6E,EAAArS,KAAKwR,oBAAY,IAAAa,GAAjBA,EAAmB7jC,IAAI,CAAEsiC,YAAa,SACrB,QAAjBwB,EAAAtS,KAAK2R,oBAAY,IAAAW,GAAjBA,EAAmB9jC,IAAI,CAAEsiC,YAAa,SACvB,QAAfyB,EAAAvS,KAAK2Q,kBAAU,IAAA4B,GAAfA,EAAiB/jC,IAAI,CAAEsiC,gBACC,QAAxB0B,EAAAxS,KAAKmR,2BAAmB,IAAAqB,GAAxBA,EAA0BhkC,IAAI,CAAEsiC,eAClC,CAEA,MAAM2B,EAAcphC,EAAMqhC,iBAE1B,OACEruC,IAAAA,cAAA,OACEmB,UAAU,OACV2Z,IAAK6gB,KAAK6Q,QACV8B,YAAa3S,KAAKuN,gBAClBqF,aAAc5S,KAAK6S,iBACnB/iC,QAASA,IAAMkiC,EAAY3gC,GAC3ByhC,aAAcA,IAAMd,EAAY3gC,GAChC0vB,cAAef,KAAKe,cACpB,uBAAAv8B,OAAsBooB,EAAU,UAAApoB,OAASmkC,IAExC8J,GAAepuC,IAAAA,cAAC65B,GAA0B,CAACjR,WAAYA,IACzC,IAAd0b,GACCtkC,IAAAA,cAAA,OACEmB,UAAU,UACVutC,YAAc5qC,GAAM63B,KAAKz3B,MAAMyqC,mBAAmB7qC,EAAGkJ,GACrD,uBAAA7M,OAAsBooB,EAAU,UAAApoB,OAASmkC,EAAS,cAGrD3I,KAAKxsB,iBAAiBs4B,mBACrBznC,IAAAA,cAAA,OACEmB,UAAWmiB,IAAW,6EAA8E,CAClG,qBAAsBqY,KAAKkQ,gBAC3B,oBAAqBlQ,KAAKkQ,kBAE5B/wB,IAAK6gB,KAAKuR,UACVwB,YAAa/S,KAAKmG,kBAClB8M,aAAcjT,KAAKkT,mBACnBJ,aAAc9S,KAAKmT,mBACnBtB,cAAe7R,KAAKyR,cACpB,uBAAAjtC,OAAsBooB,EAAU,UAAApoB,OAASmkC,EAAS,aAIrD3I,KAAKxsB,iBAAiBs4B,mBAAqB2G,GAC1CpuC,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAAA,OACEmB,UAAU,SACV2Z,IAAK6gB,KAAK0R,UACVqB,YAAa/S,KAAKz3B,MAAM6qC,kBACxBT,YAAa3S,KAAKqT,kBAClBP,aAAc9S,KAAKz3B,MAAM+qC,mBACzBzB,cAAe7R,KAAKz3B,MAAMqpC,cAC1B,uBAAAptC,OAAsBooB,EAAU,UAAApoB,OAASmkC,EAAS,aAEpDtkC,IAAAA,cAACm+B,GAAY,CACXvV,WAAY+S,KAAKz3B,MAAM0kB,WACvBwV,gBAAiBzC,KAAKyC,gBACtBC,UAAW8J,IAAeR,GAAAA,EAAAA,OAAyC,OAApB36B,EAAM6J,UACrDynB,SAAUA,KACR3C,KAAKz3B,MAAMgrC,kBAAkB,CAAEC,KAAM,GAAKC,2BAA2B,GAAO,EAE9E7Q,UAAWA,KACT5C,KAAKz3B,MAAMgrC,kBAAkB,CAAEC,MAAO,GAAKC,2BAA2B,GAAO,EAE/E5Q,YAAa7C,KAAKz3B,MAAMqpC,iBAI9BvtC,IAAAA,cAAA,OACEmB,UAAU,sBACV2Z,IAAK6gB,KAAKoR,iBACVzT,SAAU,EACV,uBAAAn5B,OAAsBooB,EAAU,UAAApoB,OAASmkC,EAAS,WAClDoK,YAAc/S,KAAKrB,cAA2C/oB,EAAhCoqB,KAAKgN,yBACnC2F,YAAc3S,KAAKrB,cAA0C/oB,EAA/BoqB,KAAKyN,wBACnCmF,aAAc5S,KAAK4S,aACnBE,aAAc9S,KAAKrB,SAAWqB,KAAK8S,kBAAel9B,EAClD89B,WAAY1T,KAAK0T,WACjBC,OAAQ3T,KAAK2T,QAEbtvC,IAAAA,cAAA,UAAQ8a,IAAK6gB,KAAK+J,YAAY6J,EAAAA,GAAAA,IAAY5T,KAAK5S,aAC9C4S,KAAKxsB,iBAAiBi2B,OAASplC,IAAAA,cAAA,UAAQmB,UAAU,SAAS2Z,IAAK6gB,KAAK4L,kBAI7E,CA+bA5B,qBACE,MAAM,2BAAE5sB,GAA+B4iB,KAAKxsB,iBACtCqgC,EAAWz2B,IAA+BC,EAAAA,GAAAA,UAC1Cy2B,GAAiCC,EAAAA,EAAAA,IAAiB,CAAE32B,+BAE1D,OAAOy2B,GAAYC,CACrB,EA4cF,UAAeE,EAAAA,EAAAA,yBtC36BR,SAAwCC,GAC7C,OAAO,SAA0B1rC,GAC/B,MAAM2rC,EAAU7vC,EAAAA,WAAiBmM,GAEjC,OAAOnM,EAAAA,cAAC4vC,EAASvuC,EAAA,GAAK6C,EAAK,CAAEm/B,uBAAwBwM,IACvD,CACF,CsCq6BuCC,EC3qCuBF,GD2qCmBxQ,GC1qCxE,SAA0Bl7B,GAC/B,MAAM8I,GAAQyH,EAAAA,GAAAA,GAAcvQ,EAAM8I,MAAO,CAAE0H,gBAAiB,CAAC,eAE7D,OAAO1U,IAAAA,cAAC4vC,GAASvuC,GAAA,GAAK6C,EAAK,CAAE8I,MAAOA,IACtC,KALK,IAAuD4iC,G,QCAvD,SAASG,GAAmBnwC,GAA8E,IAA7E,cAAEowC,EAAa,UAAE7uC,GAA0DvB,EAC7G,MAAOy+B,EAAW4R,GAAgBjwC,IAAAA,SAAegwC,GAajD,OAZAhwC,IAAAA,WAAgB,KACd,IAAIkwC,EAMJ,OALKF,IACHE,EAAUvhC,OAAO4E,YAAW,KAC1B08B,GAAa,EAAM,GAClB,MAEE,KACL96B,aAAa+6B,EAAQ,CACtB,GACA,CAACF,IAGFhwC,IAAAA,cAAAA,IAAAA,SAAA,KACGq+B,GACCr+B,IAAAA,cAAA,OACEmB,UAAWmiB,IACT,wIACA,CACE,cAAe0sB,EACf,aAAcA,GAEhB7uC,GAEF,cAAY,yBAEZnB,IAAAA,cAACqjB,EAAAA,QAAO,OAKlB,CC/BO,MACM8sB,GAA4B,M,u5BCmBzC,SAASC,GAAmBpT,GAC1BA,EAAMryB,gBACR,CA4CA,MAAM0lC,WAAcrwC,IAAAA,UAgBlBg8B,YAAY93B,GAAmB,IAAAm7B,EAC7BC,MAAMp7B,GAAMm7B,EAAA1D,KAAAM,GAAA,yBAAAA,GAAA,iCAAAA,GAAA,wCAAAA,GAAA,kBAbD,GAACA,GAAA,aACS,MAAIA,GAAA,aACJ,MAAIA,GAAA,yBACP,GAACA,GAAA,yBACD,GAACA,GAAA,wBAKV,MAAIA,GAAA,iCAyDaqU,IAC1B3U,KAAKkM,SAAS,CAAEyI,uBAAsB,IACvCrU,GAAA,qBA4Den4B,IACd,MAAM,WAAE8kB,EAAU,YAAEnI,GAAgBkb,KAAKz3B,MACnC+f,EAAY2E,EAAWzG,QAAQ3R,QAAU,EAC1CiQ,EAAY8vB,qBAAsBtsB,IAGlC0X,KAAK6U,kBACR7U,KAAK8U,uBAEPt7B,aAAawmB,KAAK+U,mBAClB/U,KAAK+U,kBAAoB/hC,OAAO4E,YAAW,KACzCooB,KAAK6U,iBAAmB,IAAI,GAC3B,KACH7U,KAAKqT,kBAAkBlrC,OAAGyN,GAAW,GAAK,IAC3C0qB,GAAA,gBAEU0U,IAAsC,IAAAC,EAE5CjV,KAAKz3B,MAAMuc,YAAY9I,YAAY4Y,IAAIoL,KAAKz3B,MAAM0kB,cAChB,QAAjCgoB,EAAAjV,KAAKz3B,MAAMuc,YAAYkwB,kBAAU,IAAAC,GAAjCA,EAAmCrgB,IAAIogB,IAAehV,KAAKz3B,MAAMuc,YAAYkwB,aAAeA,IAE9FhV,KAAKz3B,MAAMuc,YAAY1K,iBAAiB,CAAE4B,YAAagkB,KAAKz3B,MAAM0kB,WAAY+nB,cAChF,IACD1U,GAAA,qBAEc,KACb,MAAM,WAAErT,GAAe+S,KAAKz3B,MAC5By3B,KAAKkV,gBACLlV,KAAKmV,6BACLloB,EAAWlf,QAAQ,SAAUkf,EAAW,IACzCqT,GAAA,sBAEgB8U,IACf,MAAM,WAAEnoB,GAAe+S,KAAKz3B,MACtB0S,EAAOgS,EAAWzG,QAAQjf,KAAK6tC,GAEjCn6B,IACFA,EAAKH,iBACLklB,KAAKkV,gBACLjoB,EAAWlf,QAAQ,SAAUkf,GAC/B,IACDqT,GAAA,sBAEgB+U,IACf,MAAM,WAAEpoB,EAAU,OAAExgB,GAAWuzB,KAAKz3B,MAC9Bie,EAAQyG,EAAW/a,cACnBiS,EAAQ8I,EAAW9I,QAEzB,GAAqB,IAAjBqC,EAAM3b,SAAiBsZ,QAAmCvO,IAA1BqX,EAAWsH,WAC7C,OAGF,MAAM,MAAEruB,EAAK,OAAEyrB,GAAW1E,EAC1B,IAAIqoB,EAAc9uB,EAAMra,QAAO,CAACopC,EAAKt6B,KAAI,IAAAu6B,EAAA,OAAKD,GAAkB,QAAfC,EAAIv6B,EAAK0W,cAAM,IAAA6jB,EAAAA,EAAI,EAAE,GAAE,GACxE,GAAIF,IAAgB3jB,EAAQ,CAC1B2jB,EAAc9uB,EAAMra,QAAO,CAACopC,EAAKt6B,KAC/B,MAAMw6B,EAAgBxrC,KAAKyrC,MAAOz6B,EAAK0W,OAAS2jB,EAAe3jB,GAI/D,OAHKznB,OAAO6xB,MAAM0Z,IAChBx6B,EAAKc,gBAAgB,SAAU05B,GAE1BF,EAAME,CAAa,GACzB,GACH,MAAM1gB,EAAY9H,EAAW+H,eAC7B,GAAID,GAAaugB,IAAgB3jB,EAAQ,CACvC,MAAMgkB,EAAqB5gB,EAAUpD,OAASA,EAAS2jB,EAClDprC,OAAO6xB,MAAM4Z,IAChB5gB,EAAUhZ,gBAAgB,SAAU45B,EAExC,CACF,CAEA,MAAMrO,GAAgB9S,EAAAA,EAAAA,IAAc,CAClCrQ,QACA8I,aACAxgB,OAAQA,IAEJmpC,EAAgB3oB,EAAWsH,aAAe+S,EAC1C7S,EAAaxH,EAAWwH,WACzBA,GAAcuL,KAAK6V,YAAc3vC,EAG3BuuB,IAAemhB,GACxB3oB,EAAW7S,iBAAiB,CAAEqa,WAAYmhB,KAH1C5V,KAAK6V,UAAY3vC,EACjB+mB,EAAWlR,gBAAgB,aAAcurB,IAKvCtH,KAAK8V,aAAenkB,IACtBqO,KAAK8V,WAAankB,EAClBqO,KAAKmV,8BAGHE,GACFrV,KAAK+V,kBAAkBV,EAAgBlxB,QACzC,IACDmc,GAAA,4BAEqBjoB,IAAqF,IAApF,YAAE2D,EAAW,WAAEg5B,GAAgE38B,EACpG,MAAM,WAAE4U,GAAe+S,KAAKz3B,MAC5B,GAAKyT,EAGL,IAAK,MAAMf,KAAQgS,EAAW/a,cAAe,KAAA8jC,GACvChB,aAAU,EAAVA,EAAY57B,MAAO6B,EAAK7B,KAAqC,KAAjB,QAAd48B,EAAA/6B,EAAKC,iBAAS,IAAA86B,OAAA,EAAdA,EAAgBnH,cAChD5zB,EAAKC,UAAUs0B,eAAc,GAC7Bv0B,EAAKc,gBAAgB,iBAAanG,GAEtC,KACD0qB,GAAA,2BAEoB,CAACn4B,EAAkCkJ,KACrC,IAAblJ,EAAEq+B,SAGNxG,KAAKsO,MAAQnmC,EAAEo5B,QACfvB,KAAKiW,iBAAmBjW,KAAKz3B,MAAM0kB,WAChCzG,QACAyI,MACArS,WAAW3B,GAASA,EAAK2Z,IAAIvjB,KAChCjE,SAAS2xB,iBAAiB,YAAaiB,KAAKkW,oBAC5C9oC,SAAS2xB,iBAAiB,UAAWiB,KAAKmW,kBAAiB,IAC5D7V,GAAA,2BAEqBn4B,IAChB63B,KAAKiW,iBAAmB,GAAoB,OAAfjW,KAAKsO,OAAkBtO,KAAKoW,uBAAuBpW,KAAKsO,MAASnmC,EAAEo5B,WAClGvB,KAAKsO,MAAQnmC,EAAEo5B,QACjB,IACDjB,GAAA,yBAEmBn4B,IAClB,MAAM,WAAE8kB,GAAe+S,KAAKz3B,MACxBy3B,KAAKiW,iBAAmB,GAAoB,OAAfjW,KAAKsO,QACpCtO,KAAKoW,uBAAuBpW,KAAKsO,MAAQnmC,EAAEo5B,SAC3CvB,KAAKsO,MAAQ,KAEbrhB,EAAWlf,QAAQ,SAAUkf,IAG/B7f,SAAS4xB,oBAAoB,YAAagB,KAAKkW,oBAC/C9oC,SAAS4xB,oBAAoB,UAAWgB,KAAKmW,iBAAiB,IAC/D7V,GAAA,2BA8EqBn4B,IACf63B,KAAKz3B,MAAMuc,YAAYkf,YAAmC,IAArB77B,EAAEkuC,QAAQxrC,SAAgBm1B,KAAKz3B,MAAM29B,qBAG/ElG,KAAKoT,kBAAkBjrC,EAAEg9B,cAAc,GAAG,IAC3C7E,GAAA,0BAEoBn4B,IACd63B,KAAKz3B,MAAMuc,YAAYkf,YAAmC,IAArB77B,EAAEkuC,QAAQxrC,QAGpDm1B,KAAKqT,kBAAkBlrC,EAAEg9B,cAAc,GAAG,IAC3C7E,GAAA,yBAEkB,KACZN,KAAKz3B,MAAMuc,YAAYkf,YAG5BhE,KAAKsW,iBAAiB,IACvBhW,GAAA,uBAEiBn4B,IAChB,MAAMouC,EAAK,CAAEzR,EAAG38B,EAAEkuC,QAAQ,GAAG5U,QAASsD,EAAG58B,EAAEkuC,QAAQ,GAAG9U,SAChDiV,EAAK,CAAE1R,EAAG38B,EAAEkuC,QAAQ,GAAG5U,QAASsD,EAAG58B,EAAEkuC,QAAQ,GAAG9U,SACtD,OAAOhU,GAAAA,GAAAA,SAAcgpB,EAAIC,EAAG,IAC7BlW,GAAA,qBAEen4B,IACd,MAAM,WAAE8kB,GAAe+S,KAAKz3B,OACtB,uBAAE08B,EAAsB,0BAAEqB,EAAyB,oBAAEJ,GAAwBlG,KAAKz3B,MAClF+f,EAAY2E,EAAWzG,QAAQ3R,QAAU,GAG7CmrB,KAAKz3B,MAAMuc,YAAYkf,YACF,IAArB77B,EAAEkuC,QAAQxrC,QACTo6B,GACA3c,GACA4d,IAEDI,EAA0B,SAC1BtG,KAAKoT,kBAAkB,CAAE3R,QAASzB,KAAKyW,eAAetuC,KAEtDiF,SAAS2xB,iBAAiB,YAAaiB,KAAK0W,aAC5CtpC,SAAS2xB,iBAAiB,WAAYiB,KAAK2W,YAC7C,IACDrW,GAAA,oBAEcn4B,IACY,IAArBA,EAAEkuC,QAAQxrC,QACZm1B,KAAKqT,kBAAkB,CAAE5R,QAASzB,KAAKyW,eAAetuC,IACxD,IACDm4B,GAAA,mBAEan4B,IACa,IAArBA,EAAEkuC,QAAQxrC,SACZm1B,KAAKsW,kBACLlpC,SAAS4xB,oBAAoB,YAAagB,KAAK0W,aAC/CtpC,SAAS4xB,oBAAoB,WAAYgB,KAAK2W,YAChD,IACDrW,GAAA,6BAEsB,KACrB,MAAM,WAAErT,GAAe+S,KAAKz3B,OACtB,cAAE+c,GAAkB2H,EAAW2pB,yBAC/BzyB,EAAQ8I,EAAW9I,QACnB0yB,EAAK5pB,EAAWzG,QAAQswB,QAAQjR,MAAMf,EACtCnf,GAAWyhB,EAAAA,EAAAA,IAAsB,CAAEjE,WAAYlW,EAAWkW,WAAYpxB,YAAaiuB,KAAKz3B,MAAMuc,cAC9FiyB,GAAoBviB,EAAAA,EAAAA,IAAc,CAAErQ,QAAO8I,aAAYxgB,OAAQuzB,KAAKz3B,MAAMkE,OAAQkZ,aAGxF,GAFAqa,KAAK6U,iBAAmB,KAEpB1wB,EAAM6yB,YAAc7yB,EAAMnE,aAAeM,EAAAA,GAAAA,MAAkB,CAC7D,MAAMinB,EAAWpjB,EAAM8yB,YAAY9yB,EAAM+yB,MAAMrsC,OAAS,GACxD,IAAIssC,EACFlqB,EAAWsH,YACXC,EAAAA,EAAAA,IAAc,CACZrQ,QACA8I,WAAYA,EACZxgB,OAAQuzB,KAAKz3B,MAAMkE,OACnBkZ,WACA4hB,WACA6P,8BAA8B,IAElC,MAAMC,KAAgBF,EAAaxxB,GACnCwxB,GAAcE,EAAa1xB,EAC3Bqa,KAAK6U,iBAAmB,CACtBtN,WACArvB,MAAOqvB,EAAW8P,EAClBF,aAEJ,MAAO,GAAIlqB,EAAWsH,YAAcwiB,EAClC/W,KAAK6U,iBAAmB,CACtB38B,MAAOiM,EAAM8yB,YAAY9yB,EAAMmD,KAAKzc,OAAS,GAC7CssC,WAAYlqB,EAAWsH,WAAawiB,OAEjC,CACL,MAAMO,EAASrqB,EAAWsH,WAC1B,IAAK,IAAIle,EAAI,EAAGA,EAAI8N,EAAMmD,KAAKzc,OAAQwL,GAAK,EAAG,CAC7C,MAAMyuB,EAAI+R,EAAGxgC,GACb,KAAIyuB,EAAIwS,EAAS,IAGbxS,EAAIwS,EAASrqB,EAAW/mB,MAAQof,EAAc8Y,KAAKl4B,MAAQof,EAAc+lB,MAAMnlC,MAAO,CACxF,MAAMqhC,EAAWpjB,EAAM8yB,YAAY5gC,EAAI,GACvC,IAAI8gC,EACFG,GACA9iB,EAAAA,EAAAA,IAAc,CACZrQ,QACA8I,aACAxgB,OAAQuzB,KAAKz3B,MAAMkE,OACnBkZ,WACA4hB,aAEJ,MAAM8P,KAAgBF,EAAaxxB,GACnCwxB,GAAcE,EAAa1xB,EAC3Bqa,KAAK6U,iBAAmB,CACtBtN,WACArvB,MAAOqvB,EAAW8P,EAClBF,cAEF,KACF,CACF,CACF,KACD7W,GAAA,0BAEoBn4B,IAA8C,IAAAovC,EACjE,IAAkB,IAAbpvC,EAAEq+B,UAAgB,WAAYr+B,KAAO63B,KAAKz3B,MAAMuc,YAAYkf,WAAjE,CAGA,OAAQhE,KAAKz3B,MAAM08B,wBACjB,IAAK,QACH,MACF,KAAK,KACHjF,KAAKz3B,MAAM+9B,0BAA0B,UACrC,MACF,QACE,OAGJtG,KAAKqO,MAAiB,QAAZkJ,EAAGpvC,EAAEs5B,eAAO,IAAA8V,EAAAA,EAAI,KAC1BvX,KAAK8U,uBAEL1nC,SAAS2xB,iBAAiB,YAAaiB,KAAKqT,mBAC5CjmC,SAAS2xB,iBAAiB,UAAWiB,KAAKsW,iBAC1ClpC,SAAS2xB,iBAAiB,YAAaiB,KAAKwX,mBAC5CpqC,SAAS2xB,iBAAiB,WAAYiB,KAAKyX,iBAjB3C,CAiB4D,IAC7DnX,GAAA,6BAEuBn4B,IAEtB,MAAM6zB,EAAM/xB,KAAK+xB,IAAI7zB,EAAEuvC,QACvB,OAAY,IAAR1b,EAAkB,EACf/xB,KAAK0tC,IAAI3b,GAAO/xB,KAAK2tC,KAAKzvC,EAAEuvC,QAAU,EAAE,IAChDpX,GAAA,0BAEmB,SAClBn4B,EACAsW,GAEG,IADHo5B,EAAYl+B,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,IAAAA,UAAA,GAEZ,MAAM,WAAEsT,EAAU,YAAEnI,GAAgB4e,EAAKn7B,MACzC,IAAIuvC,EACChzB,EAAYkf,aACZ6T,GAA+B,OAAfnU,EAAK2K,MAMxByJ,EAAOpU,EAAKqU,qBAAqB5vC,GAAmB,KALpD2vC,GAAQpU,EAAK2K,MAAQlmC,EAAEs5B,SAAWxU,EAAW/mB,MAC7Cw9B,EAAK2K,MAAQlmC,EAAEs5B,SAOjBiC,EAAKsU,gBAAgB,CAAExE,MAAOsE,IAChC,IAACxX,GAAA,wBAEiBzjB,IAMZ,IANa,KACjB22B,EAAI,0BACJC,GAA4B,GAI7B52B,EACC,MAAM,WAAEoQ,EAAU,YAAEnI,GAAgBkb,KAAKz3B,MACrCkrC,GACFzT,KAAK8U,uBAGP,MAAMmD,EAAkBhrB,EAAWkW,YAAc,GAAIiE,EAAAA,EAAAA,IAAsB,CAAEr1B,YAAaiuB,KAAKz3B,MAAMuc,eAC/Fqe,EAlkBV,SAAsBl/B,GAYnB,IAZoB,YACrB8N,EAAW,kBACXmmC,EAAiB,KACjB1E,EAAI,gBACJ2E,EAAkB,EAAC,gBACnBC,EAAkB,IAOnBn0C,EACC,MAAMo0C,GAAgBC,EAAAA,EAAAA,IAA8B,CAClDvmC,cACAwmC,kBAAmBJ,EACnBK,iBAAkB,IAEdC,GAAgBH,EAAAA,EAAAA,IAA8B,CAClDvmC,cACAwmC,kBAAmBH,EACnBI,iBAAkB,IAEdE,EAAsBlF,EAAO,EAC7BmF,EAAgBT,EAAoB1E,EACpCoF,EAAuB3uC,KAAKjE,IAAIiE,KAAKhE,IAAIoyC,EAAeM,GAAgBF,GAE9E,OAAIE,EAAgBC,GAAwBV,EAAoBU,EACvDF,EAAsBC,EAAgBT,EAG3CS,EAAgBC,GAAwBV,EAAoBU,EACtDF,EAAsCR,EAAhBS,EAGzBC,CACT,CA8hBuBC,CAAc,CAC/B9mC,YAAa+S,EACbozB,kBAAmBjrB,EAAWkW,WAC9BqQ,KAAMA,EAAOyE,IAETtyB,GAAWyhB,EAAAA,EAAAA,IAAsB,CACrCjE,aACApxB,YAAaiuB,KAAKz3B,MAAMuc,cAG1B,IAAIyP,EACJ,GAAIyL,KAAKz3B,MAAMkE,OAAOqsC,QACpBvkB,EAAa,OACR,IAAIwkB,EAAAA,EAAAA,IAAqB/Y,KAAKz3B,MAAMuc,YAAY1H,4BACrDmX,EAAa5O,MACR,KAAIqa,KAAK6U,iBAgBd,OAfAtgB,GAAa8S,EAAAA,EAAAA,IAAoB,CAC/BC,eACE9S,EAAAA,EAAAA,IAAc,CACZrQ,MAAO8I,EAAW9I,QAClB8I,WAAYA,EACZxgB,OAAQuzB,KAAKz3B,MAAMkE,OACnBkZ,WACA4hB,SAAUvH,KAAK6U,iBAAiB38B,MAChCk/B,8BAA8B,IAC3BpX,KAAK6U,iBAAiBsC,WAC7BlqB,WAAYA,EACZtH,WACA4hB,UAAU0P,EAAAA,EAAAA,IAAYhqB,EAAW9I,UAIrC,CACA8I,EAAW7S,iBAAiB,CAC1B+oB,aACA5O,aACAtO,UAAW,OAETwtB,IACFzT,KAAK6U,iBAAmB,KAC1B,IACDvU,GAAA,wBAEiB,KAChBN,KAAK6U,iBAAmB,KACxBznC,SAAS4xB,oBAAoB,YAAagB,KAAKqT,mBAC/CjmC,SAAS4xB,oBAAoB,UAAWgB,KAAKsW,iBAC7ClpC,SAAS4xB,oBAAoB,YAAagB,KAAKwX,mBAC/CpqC,SAAS4xB,oBAAoB,WAAYgB,KAAKyX,kBAC9CzX,KAAKz3B,MAAM+9B,0BAA0B,KAAK,IAC3ChG,GAAA,sBAEe,KACd,MAAM,WAAErT,EAAU,YAAEnI,GAAgBkb,KAAKz3B,MACnC46B,EAAalW,EAAW0G,eAAeqP,kBACvCrd,GAAWyhB,EAAAA,EAAAA,IAAsB,CAAEjE,aAAYpxB,YAAa+S,IAC5DyP,GAAaC,EAAAA,EAAAA,IAAc,CAC/BrQ,MAAO8I,EAAW9I,QAClB8I,aACAxgB,OAAQuzB,KAAKz3B,MAAMkE,OACnBkZ,aAGFsH,EAAW7S,iBAAiB,CAC1B+oB,aACA5O,aACAtO,UAAW,MACX,IACHqa,GAAA,0BAEmB,KAClB,MAAM,IAAI5pB,MAAM,oCAAoC,IAErD4pB,GAAA,wBAEiB,KACEN,KAAKz3B,MAAM0kB,WAAWzG,QAAQ3R,QAAU,GAExDgwB,GAAAA,EAAAA,iBAA4B,CAC1B/S,SAAU,KACV7W,KAAM,MAEV,IACDqlB,GAAA,0BAEoBnc,IACnB,MAAM,WAAE8I,GAAe+S,KAAKz3B,MAG5B,GAAI0kB,EAAWhH,UAAW,CACxB,IAAK9B,EAAMyQ,IAAI3H,EAAW9I,UAAY8I,EAAW5H,YAAclB,EAAMkB,WAAmC,IAAtBlB,EAAMjB,KAAKrY,OAC3F,QAEFmuC,EAAAA,EAAAA,IAAmC,CAAE/rB,aAAY9I,SACnD,KACDmc,GAAA,qBAEc,CAAC2Y,EAAiBnkB,KAC/B,MAAM,WAAE7H,GAAe+S,KAAKz3B,MACtB4b,EAAQ8I,EAAW9I,QACzB,GAAKA,UAAAA,EAAOyQ,IAAIqkB,GACd,OAGF,MAAMC,EAA8BpkB,IAAc1I,GAAAA,EAAAA,QAClD,IAAIkb,EAAgBra,EAAWsH,aAEU,IAAtCyL,KAAKz3B,MAAMuc,YAAYkf,aAAyBhE,KAAKz3B,MAAMuc,YAAYif,qBACvE9W,EAAWwH,YACZykB,KAEA5R,GAAgB9S,EAAAA,EAAAA,IAAc,CAC5BrQ,QACA8I,WAAYA,EACZxgB,OAAQuzB,KAAKz3B,MAAMkE,UAIvBwgB,EAAWoI,eAAelR,EAAMmR,aAAcnR,EAAM+R,QAEhDoR,IAAkBra,EAAWsH,YAC/BtH,EAAWvZ,iBAAiBvB,SAASzF,IAC/BA,EAAQiH,cAAgBjH,EAAQysC,eAClCzsC,EAAQgF,SAAS0J,cACnB,IAIJ6R,EAAWlR,gBAAgB,aAAcurB,GAEzCtH,KAAK+V,kBAAkB5xB,EAAM,IAvoB7B6b,KAAK6V,UAAYttC,EAAM0kB,WAAW/mB,MAClC85B,KAAKz3B,MAAMuc,YAAYwe,KAAK,SAAUtD,KAAKoZ,qBAC3CpZ,KAAKvxB,MAAQ,CAAEkmC,oBAAqB,KACtC,CAEAnU,oBACE,MAAM,WAAEvT,GAAe+S,KAAKz3B,MAC5By3B,KAAK6V,UAAY7V,KAAKz3B,MAAMuc,YAAY5e,MAExC+mB,EAAWlf,QAAQ,SAAUkf,GAC7BA,EAAWqW,KAAK,aAActD,KAAKqZ,cAEnCrZ,KAAKmV,6BACLnV,KAAK+V,kBAAkB9oB,EAAW9I,SAClC6b,KAAKkV,gBAELjoB,EAAWqW,KAAK,SAAUtD,KAAKkV,eAC/BjoB,EAAWqW,KAAK,WAAW,KACzBpf,GAAAA,EAAAA,OAAa,YAAa8b,KAAKsZ,mBAC/Bp1B,GAAAA,EAAAA,OAAa,GAAD1f,OAAI4nB,GAAAA,EAAAA,QAAsB,KAAA5nB,OAAI4nB,GAAAA,EAAAA,WAA4B4T,KAAKuZ,aAAa,IAG1Fr1B,GAAAA,EAAAA,KAAW,YAAa8b,KAAKsZ,mBAC7Bp1B,GAAAA,EAAAA,KAAU,GAAA1f,OAAW4nB,GAAAA,EAAAA,QAAsB,KAAA5nB,OAAI4nB,GAAAA,EAAAA,WAA4B4T,KAAKuZ,aAClF,CAEAC,mBAAmB5rB,EAAiCzd,GAIhD,IAAAspC,EAG+CC,EAL/CvpC,EAAUwkC,sBAAwB3U,KAAKvxB,MAAMkmC,qBAC7C/mB,EAAU9I,YAAY8vB,qBAAuB5U,KAAKz3B,MAAMuc,YAAY8vB,qBAEvC,QAA7B6E,EAAAtpC,EAAUwkC,2BAAmB,IAAA8E,GAA7BA,EAA+Bza,oBAAoB,QAASyV,IAExDzU,KAAKz3B,MAAMuc,YAAY8vB,qBAEK,QAA9B8E,EAAA1Z,KAAKvxB,MAAMkmC,2BAAmB,IAAA+E,GAA9BA,EAAgC3a,iBAAiB,QAAS0V,GAAoB,CAAEnD,SAAS,KAG/F,CAEA5Q,uBAAuB,IAAAiZ,EACrB,MAAM,WAAE1sB,EAAU,YAAEnI,GAAgBkb,KAAKz3B,MACrCy3B,KAAK4Z,0BACPpgC,aAAawmB,KAAK4Z,0BAEpB90B,EAAYye,OAAO,SAAUvD,KAAKoZ,qBAClCnsB,EAAWsW,OAAO,SAAUvD,KAAKkV,eAEH,QAA9ByE,EAAA3Z,KAAKvxB,MAAMkmC,2BAAmB,IAAAgF,GAA9BA,EAAgC3a,oBAAoB,QAASyV,GAC/D,CAMA9T,SACE,MAAM,WAAE6L,EAAU,WAAE5f,EAAU,YAAE9H,EAAW,WAAEmI,EAAU,mBAAE4sB,GAAuB7Z,KAAKz3B,MAC/Eie,EACJ1B,EAAY1H,6BAA+BC,EAAAA,GAAAA,YACvC4P,EAAW6sB,mBACX7sB,EAAW/a,cACX6nC,EAAej1B,EAAYwU,QAAQxtB,SAASytB,EAAAA,GAAAA,UAElD,OACEl1B,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAAA,OACEyL,QAASA,IAAMkwB,KAAKlwB,aAAQ8F,GAC5B,uBAAApR,OAAsBooB,EAAU,aAChCqmB,aAAcjT,KAAKga,iBAElBD,GAAgB11C,IAAAA,cAAC4yB,GAAa,CAAC9vB,IAAK2d,EAAYU,OAAQoH,WAAYA,EAAYK,WAAYA,KAE9FnI,EAAY4U,UAAYqgB,GAAgBF,GACvCx1C,IAAAA,cAAA,OACEmB,UAAWmiB,IAAW,WAAY,CAChC,kBAAkBgC,EAAAA,EAAAA,MAClB,8BAA8BA,EAAAA,EAAAA,SAG/BkwB,KAGLx1C,IAAAA,cAAA,OACE8a,IAAK6gB,KAAKia,yBACVnH,aAAc9S,KAAKka,aACnBtH,aAAejkB,EAAAA,GAAAA,gBAA0C/Y,EAAvBoqB,KAAKga,gBACvCG,QAASna,KAAKoa,cAEb5zB,EAAM9e,KAAI,CAACuT,EAAM/C,IAChB7T,IAAAA,cAACo/B,GAAI,CACHt8B,IAAK8T,EAAK7B,GACVuvB,UAAWzwB,EACX0U,WAAYA,EACZvb,MAAO4J,EACPuxB,WAAYA,EACZvf,WAAYA,EACZsmB,kBAAmBvT,KAAKgY,gBACxBhG,YAAahS,KAAKlwB,QAClBw0B,cAAetE,KAAKsE,cACpB0O,mBAAoBhT,KAAKgT,mBACzBI,kBAAmBpT,KAAKoT,kBACxBxB,cAAe5R,KAAK4R,cACpB0B,mBAAoBtT,KAAKsT,mBACzBhN,0BAA2BtG,KAAKz3B,MAAM+9B,0BACtCrB,uBAAwBjF,KAAKz3B,MAAM08B,uBACnCiB,oBAAqBlG,KAAKz3B,MAAM29B,yBAM5C,CA8IAiP,6BACE,MAAM,WAAEloB,GAAe+S,KAAKz3B,OACtB,UAAE8xC,EAAS,MAAEC,GAAUrtB,EAC1BzG,QACAyI,MACA9iB,QACC,CAAAuG,EAAuBuI,KAAS,IAA/B,UAAEo/B,EAAS,MAAEC,GAAO5nC,EAKnB,OAJI2nC,EAAYp/B,EAAK0W,SACnB0oB,EAAYp/B,EAAK0W,QAEnB2oB,GAASr/B,EAAKy3B,iBAAmB,EAAI,EAC9B,CAAE2H,YAAWC,QAAO,GAE7B,CAAED,UAAWptB,EAAW0E,OAAQ2oB,MAAO,IAErCC,EAAgBtwC,KAAKuwC,MAAMvtB,EAAW0E,OAAS2oB,GACrDta,KAAKya,kBAAoBxwC,KAAKjE,IAAIq0C,EAAWE,EAC/C,CAEAnE,uBAAuBxQ,GACrB,MAAM,WAAE3Y,GAAe+S,KAAKz3B,MACtBie,EAAQyG,EAAWzG,QAAQyI,MACjC,IAAIyrB,EAAW1a,KAAKiW,iBACpB,IAAKrQ,EACH,OAAO,EACF,GAAIA,EAAO,EAAG,CACnB,IAAIvvB,EAAIqkC,EACJz/B,EAAOuL,EAAMnQ,GAMjB,IALI4E,EAAK0W,OAASiU,GAAQ5F,KAAKya,kBAC7Bx/B,EAAKc,gBAAgB,SAAUd,EAAK0W,OAASiU,GAE7C3qB,EAAKc,gBAAgB,SAAUikB,KAAKya,qBAE/BpkC,EAAGA,GAAK,EAAGA,IAAK,CAErB,GADA4E,EAAOuL,EAAMnQ,GACT4E,EAAK0W,OAASiU,GAAQ5F,KAAKya,kBAAmB,CAChDx/B,EAAKc,gBAAgB,SAAUd,EAAK0W,OAASiU,GAC7C,KACF,CACE3qB,EAAKc,gBAAgB,SAAUikB,KAAKya,kBAExC,CACF,MAAO,GAAI7U,EAAO,EAAG,CACnB8U,EAAWzwC,KAAKhE,IAAI,EAAGy0C,EAAW,GAClC,IAAIrkC,EAAIqkC,EACJz/B,EAAOuL,EAAMnQ,GAMjB,IALI4E,EAAK0W,OAASiU,GAAQ5F,KAAKya,kBAC7Bx/B,EAAKc,gBAAgB,SAAUd,EAAK0W,OAASiU,GAE7C3qB,EAAKc,gBAAgB,SAAUikB,KAAKya,qBAE/BpkC,EAAGA,EAAImQ,EAAM3b,OAAQwL,IAAK,CAE/B,GADA4E,EAAOuL,EAAMnQ,GACT4E,EAAK0W,OAASiU,GAAQ5F,KAAKya,kBAAmB,CAChDx/B,EAAKc,gBAAgB,SAAUd,EAAK0W,OAASiU,GAC7C,KACF,CACE3qB,EAAKc,gBAAgB,SAAUikB,KAAKya,kBAExC,CACF,CAEA,MAAMnF,EAAc9uB,EAAMra,QAAO,CAACopC,EAAKt6B,IAASs6B,EAAMt6B,EAAK0W,QAAQ,GACnE,GAAI2jB,IAAgBroB,EAAW0E,OAAQ,CACrCiU,EAAO3Y,EAAW0E,OAAS2jB,EAE3B,MAAMr6B,EAAOuL,EAAMk0B,GAInB,OAHAz/B,EAAKc,gBAAgB,SAAUd,EAAK0W,OAASiU,IAGtC,CACT,CAEA,OAAO,CACT,EAoUF,SCztBO,SAAuBqO,GAC5B,OAAO,SAA0B1rC,GAC/B,MAAM,YAAEoyC,EAAcnG,GAAyB,SAAEoG,GAAaryC,EACxDsyC,EAAsBx2C,IAAAA,QAAa,GACnCgN,GAAQyH,EAAAA,GAAAA,GAAcvQ,EAAM0kB,WAAY,CAAElU,gBAAiB,CAAC,QAAS,WACrE+L,GAAchM,EAAAA,GAAAA,GAAcvQ,EAAMuc,YAAa,CAAE/L,gBAAiB,CAAC,iBACnEoL,EAAQ9S,EAAM8S,QAEd22B,EAAez2C,IAAAA,QAAakR,UAChC,MAAM,WAAE0X,EAAU,OAAExgB,GAAWlE,GACzB,UAAEmtB,EAAS,eAAED,EAAc,YAAEE,EAAW,OAAEtjB,EAAM,WAAE2N,EAAU,UAAEqF,EAAWmB,MAAOu0B,GAAgBtuC,EAEhGiS,EAAU,CACdgX,YACAC,cACAO,OAAQT,EACRG,SAAUmlB,EAAY5vC,MACnB8P,IAAI,IAAA+/B,EAAA,OACU,QADVA,EACH//B,EAAK5G,gBAAQ,IAAA2mC,OAAA,EAAbA,EAAe7vC,MACZuB,IAAO,IAAAuuC,EAAA,OAAqB,QAArBA,EAAKvuC,EAAQwuC,gBAAQ,IAAAD,OAAA,EAAhBA,EAAkB9vC,MAAMgwC,GAAyC,sBAAjBA,EAAQtzC,MAA6B,GACnG,KAIDsc,QAAcD,GAAAA,EAAAA,IAAU,CAC5B7R,SACA2N,aACAqF,YACA3G,YAEI08B,EAAyBL,EAAYjhC,QAAO7V,IAAA,IAAC,SAAEoQ,GAAUpQ,EAAA,OAC7DoQ,EAASlJ,MAAKkN,IAAA,IAAC,KAAExQ,GAAMwQ,EAAA,MAAc,oBAATxQ,CAA0B,GAAC,IAWzD,GARIuzC,SACI1jC,QAAQ2jC,WACZD,EAAuB1zC,KAAK4zC,IAC1BC,EAAAA,EAAAA,IAA+B,CAAED,wBAAuBj2B,YAAW3G,gBAKrEm8B,EAAoBhvC,QAAxB,CAkBA,GAdAY,EAAO+Z,MAAMrU,SAAS8I,IACpB,MAAMugC,EAAiBjxC,IAAM,CAAC,EAAG0Q,GACjCugC,EAAex0B,MAAQiG,EACvBA,EAAWwuB,kBAAkBD,EAAe,IAG9CvuB,EAAW7S,iBAAiB,CAC1B+J,QACAuR,UAAWhX,EAAQgX,UACnBC,YAAajX,EAAQiX,cAGvB1I,EAAWoI,eAAelR,EAAMmR,aAAa,GAEzC/sB,EAAMmzC,aAAc,CACtB,MAAMC,GAAmBC,EAAAA,EAAAA,IAAoBrzC,EAAMuc,YAAYqpB,oBAC/D5lC,EAAMuc,YAAY1K,iBAAiBuhC,EACrC,CAEA,GAA6B,MAAzB1uB,EAAWsH,WAAoB,CACjC,MAAMA,GAAaC,EAAAA,EAAAA,IAAc,CAAErQ,QAAO8I,WAAYA,EAAYxgB,OAAQlE,EAAMkE,SAChFwgB,EAAWlR,gBAAgB,aAAcwY,EAC3C,CAxBA,CAwBA,IAGFlwB,IAAAA,WAAgB,KACd,MAAMw3C,EAA2BA,KAC/BhB,EAAoBhvC,SAAU,CAAI,EAKpC,OAFAwF,EAAMiyB,KAAK,gBAAiBuY,GAC5Bf,EAAajvC,UACN,KACLwF,EAAMkyB,OAAO,gBAAiBsY,EAAyB,CACxD,GAGA,IAEH,MAAMt7B,EAAchY,EAAMuc,YAAY1H,6BAA+BC,EAAAA,GAAAA,UAC/Dy+B,EAAcvzC,EAAMuc,YAAY1H,6BAA+BC,EAAAA,GAAAA,UAC/D0+B,EAA2B,CAC/B1+B,EAAAA,GAAAA,YACAA,EAAAA,GAAAA,UACAA,EAAAA,GAAAA,YACAvR,SAASvD,EAAMuc,YAAY1H,4BACvB4+B,EACJ73B,SAA+BvO,IAApBuO,EAAME,WAA2BF,EAAM+yB,MAAMrsC,OAAS,GAAMsZ,EAAME,UAAY,GAAKF,GAC1F83B,GACHD,GAAgBz7B,EAEb,CAAEra,MAAOmL,EAAMnL,MAAQmL,EAAMnL,MAAQ,EAAI,OAAQyrB,OAAQtgB,EAAMsgB,OAAS,QACxE/b,EAEN,OACEvR,IAAAA,cAACs2C,EAAWj1C,GAAA,CACVF,UAAWq4B,IF7Gc,wBE6GgB,CACvC90B,OAAQwX,EACR,kBAAmBw7B,IAA4BpyB,EAAAA,EAAAA,MAC/C,qCAAsC7E,EAAY9I,YAAY4Y,IAAIvjB,IAAU9I,EAAM2zC,cAE/EvB,IAAgBnG,GAA4B,CAAEoG,YAAa,CAAC,EAAC,CAClE,uBAAAp2C,OAAsB+D,EAAMqkB,WAAU,cACtC9lB,MAAOm1C,IAENH,GACCz3C,IAAAA,cAAC+vC,GAAmB,CAClB5uC,UAAWq4B,IAAW,CACpB,WAAYtd,EACZ,8BAA+Bu7B,IAEjCzH,eAAgB2H,IAGnBA,GAAgB33C,IAAAA,cAAC4vC,EAAc1rC,GAGtC,CACF,CD6lBA,CEluBO,SAA4E0rC,GACjF,OAAO,SAA0B1rC,GAC/B,MAAM8I,GAAQyH,EAAAA,GAAAA,GAAcvQ,EAAM0kB,WAAY,CAAElU,gBAAiB,CAAC,WAElE,OAAO1U,IAAAA,cAAC4vC,EAASvuC,GAAA,GAAK6C,EAAK,CAAE8I,MAAOA,IACtC,CACF,CF4tB6B8qC,CAA6BzH,K,mCGvuBnD,MAAM0H,GAAgC,CAC3Cl0B,SAAUA,IAAM,6BAChBC,SAAU,uBCEL,SAASk0B,KACd,OACEh4C,IAAAA,cAAA,OAAKmB,UAAU,gDACbnB,IAAAA,cAAA,WACEA,IAAAA,cAACuB,EAAAA,UAAS,CAACJ,UAAU,0CAAyC,yEAG9DnB,IAAAA,cAACwL,EAAAA,OAAM,CAACrK,UAAU,eAAesK,QAASA,IAAMkD,OAAOyC,SAASuN,UAAU,iBAMlF,CCZO,IAAKs5B,GAAa,SAAbA,GAAa,OAAbA,EAAa,sBAAbA,CAAa,MAgBlB,MAAMC,GAA2D5xC,OAAO6xC,OAAO,CACpF,CAACF,GAAcG,WAAY,CACzBt1C,IAAKm1C,GAAcG,UACnB5wB,KAAM,YACN6wB,YAAa,sBACbC,QCpBG,SAELC,GAA2F,IAA5BC,EAAkBljC,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,IAAAA,UAAA,GACjF,OAAO,WACL,MAAOmjC,EAAkBC,GAAuB14C,IAAAA,UAAe,IACxD24C,GAAe,UAAE10B,EAAS,QAAE20B,KAAa10B,EAAAA,EAAAA,GAAe,IAC1Dq0B,EACHp0B,kBAAkB,IAGd8zB,EAAgBU,aAAa,EAAbA,EAAep0B,QAErC,OAAIq0B,EACK54C,IAAAA,cAACg4C,GAAgB,MAIxBh4C,IAAAA,cAAAA,IAAAA,SAAA,MACIikB,IAAew0B,GAAoBD,IACnCx4C,IAAAA,cAACykB,EAAAA,QAAO,KACNzkB,IAAAA,cAAA,OAAKmB,UAAU,kDACbnB,IAAAA,cAACqjB,EAAAA,QAAO,UAIX40B,GAAiBj4C,IAAAA,cAACi4C,EAAa,CAACS,oBAAqBA,IAG9D,CACF,CDTaG,CAAoBd,IAA+B,GAC5Dl2C,MAAO,CAAEF,IAAK,IAAK4iB,QAAS,CAAEu0B,OAAQ,S,eEhB3B,SAASC,GAAcn5C,GAAoC,IAAAo5C,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,IAAnC,SAAEvsC,GAA+BlN,EACtE,MAAM,UAAE05C,EAAS,SAAEC,EAAQ,MAAE1G,EAAK,MAAEhxC,IAAU23C,EAAAA,GAAAA,KACxCC,EAAqB,QAAbT,EAAGn3C,aAAK,EAALA,EAAOF,WAAG,IAAAq3C,EAAAA,EAAIU,GAAAA,EAAAA,IACzBC,EAAqB,QAAbV,EAAGp3C,aAAK,EAALA,EAAOD,WAAG,IAAAq3C,EAAAA,EAAIS,GAAAA,EAAAA,IACzBE,EAAsC,QAAzBV,EAAGr3C,SAAc,QAATs3C,EAALt3C,EAAO0iB,eAAO,IAAA40B,OAAA,EAAdA,EAAgBL,cAAM,IAAAI,EAAAA,EAAIO,EAC1CI,EAAwC,QAA1BT,EAAGv3C,SAAc,QAATw3C,EAALx3C,EAAO0iB,eAAO,IAAA80B,OAAA,EAAdA,EAAgBS,eAAO,IAAAV,EAAAA,EAAIO,EAElD,OACE35C,IAAAA,cAAAA,IAAAA,SAAA,KACGs5C,IAAcS,GAAAA,EAAAA,UACb/5C,IAAAA,cAACg6C,GAAAA,EAAS,CACRP,SAAUA,EACVE,SAAUA,EACVM,OAAQ,CACNlgB,MAAMl4B,aAAK,EAALA,EAAOF,QAAQE,aAAK,EAALA,EAAOD,MAAO63C,EAAWE,GAEhDO,cAAe,CACbngB,KAAM,wDAER54B,UAAU,6BACVo4C,SAAUA,EACVY,YAAa,CACXt4C,MAAO04B,EAAAA,GAAAA,aAAqBA,EAAAA,GAAAA,SAAiBqf,EAAgBC,EAC7DvsB,OAAQ,SAGTxgB,GAGJwsC,IAAcS,GAAAA,EAAAA,YACb/5C,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAAA,OAAKmB,UAAU,mCAAmCsK,QAASonC,IAC3D7yC,IAAAA,cAAA,OAAKmB,UAAU,0HACZ2L,IAMb,CC1CO,MAAMstC,GAAwB,iBAMtB,SAASC,GAAWz6C,GAAkC,IAAjC,UAAEuB,GAA6BvB,EACjE,MAAM,OAAEu7B,EAAM,UAAEme,EAAS,aAAEgB,EAAY,aAAEC,IAAiBf,EAAAA,GAAAA,KACpDr6B,GAAeC,EAAAA,EAAAA,iBAAgB,CAAEC,UAAW,OAAQm7B,iBAAkB,MAE5E,OACEx6C,IAAAA,cAAA,OACEmB,UAAWmiB,IACT,iIACA,CACE,WAAY6X,GAAUme,IAAcS,GAAAA,EAAAA,SACpC,sBAAuBT,IAAcS,GAAAA,EAAAA,SACrC,WAAYT,IAAcS,GAAAA,EAAAA,YAE5B54C,IAIDm4C,IAAcS,GAAAA,EAAAA,YACb/5C,IAAAA,cAAA,OACE+U,GAAIqlC,GACJ,iBAAAj6C,OAAgBi6C,GAAqB,QACrCj5C,UAAU,+BAIbmF,OAAOm0C,QAAQvC,IAAgB70C,KAAI2Q,IAAkB,IAAhBlR,EAAKhD,GAAMkU,EAC/C,MAAM0mC,GAAWJ,aAAY,EAAZA,EAAcx3C,OAAQA,EACvC,OACE9C,IAAAA,cAACA,IAAAA,SAAc,CAAC8C,IAAKA,GACnB9C,IAAAA,cAACugB,EAAAA,eAAc,CAAC+Y,UAAW,EAAGlvB,MAAO+U,EAAc,aAAYrf,EAAMu4C,YAAasC,kBAAgB,GAChG36C,IAAAA,cAACwL,EAAAA,OAAM,CACL6U,WAAW,SACX5e,KAAK,SACLiD,OAAQg2C,EACRxuC,MAAM,kBACNT,QAASA,KACP8uC,EAAaG,OAAWnpC,EAAYzR,EAAMgD,IAAI,EAEhD3B,UAAWmiB,IAAW,CAAE,OAAQg2B,IAAcS,GAAAA,EAAAA,aAC9C,yBAAA55C,OAAwB2C,EAAG,SAE3B9C,IAAAA,cAAC2kB,EAAAA,KAAI,CAACxgB,KAAMrE,EAAM0nB,KAAM3lB,MAAO,GAAIV,UAAU,eAGjDnB,IAAAA,cAACojB,EAAAA,QAAO,CAAChZ,MAAO+U,GACdnf,IAAAA,cAACuB,EAAAA,UAAS,CAACE,KAAK,SAAS3B,EAAMu4C,cAElB,IAK3B,CCvDO,MAAMuC,GAAsB,UAKjCpb,GAAAA,aAAAA,YADkC,iBAYpC,IAAI5qB,IAAS,EAEN,SAASimC,GAAOj7C,GAA6D,IAA5D,eAAEk7C,EAAc,UAAExB,EAAS,cAAEyB,GAA6Bn7C,EAChF,MAAMwvB,GAAWC,EAAAA,GAAAA,gBACV2rB,IAAmBC,EAAAA,GAAAA,mBACpBC,EAAoBF,EAAgBG,IAAIP,KAA+D,MACtGN,EAAcc,GAAmBp7C,IAAAA,SAAyC,MAE3Em7B,IAAWmf,EACXe,EAAqBr7C,IAAAA,aACxB8C,IACC,MAAMw4C,EAAqB,IAAIC,gBAAgBP,GAC3Cl4C,EACFw4C,EAAmBnxC,IAAIywC,GAAqB93C,GAE5Cw4C,EAAmBE,OAAOZ,IAE5BxrB,EAAS,CAAEnR,OAAQq9B,EAAmBG,YAAc,CAAEx5B,SAAS,GAAO,GAExE,CAAC+4B,EAAiB5rB,IAGdssB,EAAqB17C,IAAAA,aAAkB,KAC3Cq7C,OAAmB9pC,EAAU,GAC5B,CAAC8pC,IAGJr7C,IAAAA,WAAgB,KACd86C,GAAgB,GACf,CAACR,EAAcQ,IAGlB96C,IAAAA,WAAgB,KACd,IAAI24C,EAAgBuC,GAAoBhD,GAAegD,IAElDtmC,KAAU+mC,EAAAA,EAAAA,QACbhD,EAAgB,KAChB+C,KAGFN,EAAgBzC,GAChB/jC,IAAS,CAAI,GACZ,CAACsmC,EAAkBQ,IAEtB,MAAME,EAAmC57C,IAAAA,SACvC,KAAM,CACJs5C,YACAne,SACA0gB,eAAgBvC,IAAcS,GAAAA,EAAAA,WAC9Bl4C,MAAOy4C,aAAY,EAAZA,EAAcz4C,MACrBy4C,eACAf,SAAUuB,EACVjI,MAAO6I,EACPnB,aAAcc,KAEhB,CAAC/B,EAAWne,EAAQ2f,EAAgBR,EAAcoB,EAAoBL,IAGxE,OACEr7C,IAAAA,cAAC87C,GAAAA,EAAAA,SAAuB,CAACh8C,MAAO87C,GAC7BtB,GACCt6C,IAAAA,cAAC+4C,GAAc,KACb/4C,IAAAA,cAACs6C,EAAahC,QAAO,OAGzBt4C,IAAAA,cAACq6C,GAAW,CAACl5C,UAAW45C,IAG9B,CC/FO,MAAMgB,GAA6B,CACxCl4B,SAAUA,IAAM,8BAChBC,SAAU,oBCACk4B,GAAgE,CAC3E,CAACC,GAAAA,GAAAA,SAAyB,CACxBlnC,GAAIknC,GAAAA,GAAAA,QACJjxC,MAAO,WACPwc,KAAM,QAER,CAACy0B,GAAAA,GAAAA,gBAAgC,CAC/BlnC,GAAIknC,GAAAA,GAAAA,eACJjxC,MAAO,sBACPwc,KAAM,uBAER,CAACy0B,GAAAA,GAAAA,yBAAyC,CACxClnC,GAAIknC,GAAAA,GAAAA,wBACJjxC,MAAO,gCACPwc,KAAM,wBAIG00B,GAA2Bt8C,IAAA,IAAC,iBACvC4U,EAAgB,mBAChB2nC,GAAqB,EAAK,OAC1BC,GAKDx8C,EAAA,MAAuC,IAClCu8C,EACA,CACE,CACEE,YAAaL,GAAeC,GAAAA,GAAAA,SAC5BK,WAAYF,EACZG,gBAAiB,uCAGrB,GACJ,CACEF,YACEL,GAAexnC,EAAmBynC,GAAAA,GAAAA,wBAAyCA,GAAAA,GAAAA,iBAEhF,ECxCKO,GAAkE,CACtE,CAACC,GAAAA,GAAAA,kBAAkC,CACjC1nC,GAAI0nC,GAAAA,GAAAA,iBACJj1B,KAAM,iCACNk1B,WAAY,uCACZ1xC,MAAO,yBACP2xC,YAAa,yBAEf,CAACF,GAAAA,GAAAA,uBAAuC,CACtC1nC,GAAI0nC,GAAAA,GAAAA,sBACJj1B,KAAM,4BACNk1B,WAAY,kCACZ1xC,MAAO,uBACP2xC,YAAa,4BAEf,CAACF,GAAAA,GAAAA,cAA8B,CAC7B1nC,GAAI0nC,GAAAA,GAAAA,aACJj1B,KAAM,qBACNk1B,WAAY,qBACZ1xC,MAAO,gBACP2xC,YAAa,iBAEf,CAACF,GAAAA,GAAAA,cAA8B,CAC7B1nC,GAAI0nC,GAAAA,GAAAA,aACJj1B,KAAM,qBACNk1B,WAAY,uBACZ1xC,MAAO,gBACP2xC,YAAa,oBAIXC,GAAmC,CACvC7nC,GAAI0nC,GAAAA,GAAAA,iBACJj1B,KAAM,4BACNk1B,WAAY,2BACZG,WAAY,+BACZ7xC,MAAO,yBACP2xC,YAAa,wBACbG,YAAa,6BAGFC,GAA4Bn9C,IAQC,IARA,uCACxCo9C,EAAsC,OACtCZ,EAAM,qBACNa,GAKDr9C,EAuBC,MAtBwB,CACtB,CACEy8C,YAAaG,GAAgBC,GAAAA,GAAAA,2BAE3BO,EACA,CACE,CACEX,YAAaO,GACbN,WAAYF,EACZc,WAAYD,EACZV,gBAAiB,uCAGrB,GACJ,CACEF,YAAaG,GAAgBC,GAAAA,GAAAA,eAE/B,CACEJ,YAAaG,GAAgBC,GAAAA,GAAAA,eAIX,ECxEXU,GAAyD,CACpE,CAACxV,GAAAA,EAAAA,OAAoB,CACnB5yB,GAAI4yB,GAAAA,EAAAA,MACJ38B,MAAO,QACPwc,KAAM,aAER,CAACmgB,GAAAA,EAAAA,SAAsB,CACrB5yB,GAAI4yB,GAAAA,EAAAA,QACJ38B,MAAO,UACPwc,KAAM,eAER,CAACmgB,GAAAA,EAAAA,YAAyB,CACxB5yB,GAAI4yB,GAAAA,EAAAA,WACJ38B,MAAO,OACPwc,KAAM,YAER,CAACmgB,GAAAA,EAAAA,OAAoB,CACnB5yB,GAAI4yB,GAAAA,EAAAA,MACJ38B,MAAO,QACPwc,KAAM,aAER,CAACmgB,GAAAA,EAAAA,cAA2B,CAC1B5yB,GAAI4yB,GAAAA,EAAAA,aACJ38B,MAAO,gBACPwc,KAAM,gBAER,CAACmgB,GAAAA,EAAAA,gBAA6B,CAC5B5yB,GAAI4yB,GAAAA,EAAAA,eACJ38B,MAAO,kBACPwc,KAAM,gBAER,CAACmgB,GAAAA,EAAAA,WAAwB,CACvB5yB,GAAI4yB,GAAAA,EAAAA,UACJ38B,MAAO,YACPwc,KAAM,YAER,CAACmgB,GAAAA,EAAAA,kBAA+B,CAC9B5yB,GAAI4yB,GAAAA,EAAAA,iBACJ38B,MAAO,oBACPwc,KAAM,mBAER,CAACmgB,GAAAA,EAAAA,UAAuB,CACtB5yB,GAAI4yB,GAAAA,EAAAA,SACJ38B,MAAO,WACPwc,KAAM,gBAER,CAACmgB,GAAAA,EAAAA,SAAsB,CACrB5yB,GAAI4yB,GAAAA,EAAAA,QACJ38B,MAAO,UACPwc,KAAM,eAER,CAACmgB,GAAAA,EAAAA,OAAoB,CACnB5yB,GAAI4yB,GAAAA,EAAAA,MACJ38B,MAAO,QACPwc,KAAM,aAER,CAACmgB,GAAAA,EAAAA,WAAwB,CACvB5yB,GAAI4yB,GAAAA,EAAAA,UACJ38B,MAAO,YACPwc,KAAM,iBAER,CAACmgB,GAAAA,EAAAA,SAAsB,CACrB5yB,GAAI4yB,GAAAA,EAAAA,QACJ38B,MAAO,UACPwc,KAAM,eAER,CAACmgB,GAAAA,EAAAA,OAAoB,CACnB5yB,GAAI4yB,GAAAA,EAAAA,MACJ38B,MAAO,QACPwc,KAAM,aAER,CAACmgB,GAAAA,EAAAA,YAAyB,CACxB5yB,GAAI4yB,GAAAA,EAAAA,WACJ38B,MAAO,OACPwc,KAAM,YAER,CAACmgB,GAAAA,EAAAA,OAAoB,CACnB5yB,GAAI4yB,GAAAA,EAAAA,MACJ38B,MAAO,QACPwc,KAAM,aAER,CAACmgB,GAAAA,EAAAA,cAA2B,CAC1B5yB,GAAI4yB,GAAAA,EAAAA,aACJ38B,MAAO,gBACPwc,KAAM,mBAER,CAACmgB,GAAAA,EAAAA,uBAAoC,CACnC5yB,GAAI4yB,GAAAA,EAAAA,sBACJ38B,MAAO,yBACPwc,KAAM,iBAER,CAACmgB,GAAAA,EAAAA,UAAuB,CACtB5yB,GAAI4yB,GAAAA,EAAAA,SACJ38B,MAAO,WACPwc,KAAM,gBAER,CAACmgB,GAAAA,EAAAA,SAAsB,CACrB5yB,GAAI4yB,GAAAA,EAAAA,QACJ38B,MAAO,UACPwc,KAAM,gBAIG41B,GAAsD,CACjE,CACEf,YAAac,GAAaxV,GAAAA,EAAAA,QAE5B,CACE0U,YAAac,GAAaxV,GAAAA,EAAAA,UAE5B,CACE0U,YAAac,GAAaxV,GAAAA,EAAAA,YAC1B0V,UAAW,CACTF,GAAaxV,GAAAA,EAAAA,YACbwV,GAAaxV,GAAAA,EAAAA,cACbwV,GAAaxV,GAAAA,EAAAA,gBACbwV,GAAaxV,GAAAA,EAAAA,QAEf2V,eAAgB,cAElB,CACEjB,YAAac,GAAaxV,GAAAA,EAAAA,QAE5B,CACE0U,YAAac,GAAaxV,GAAAA,EAAAA,YAE5B,CACE0U,YAAac,GAAaxV,GAAAA,EAAAA,mBAE5B,CACE0U,YAAac,GAAaxV,GAAAA,EAAAA,WAE5B,CACE0U,YAAac,GAAaxV,GAAAA,EAAAA,UAE5B,CACE0U,YAAac,GAAaxV,GAAAA,EAAAA,UAE5B,CACE0U,YAAac,GAAaxV,GAAAA,EAAAA,OAC1B0V,UAAW,CAACF,GAAaxV,GAAAA,EAAAA,OAAoBwV,GAAaxV,GAAAA,EAAAA,YAC1D2V,eAAgB,eAElB,CACEjB,YAAac,GAAaxV,GAAAA,EAAAA,YAC1B0V,UAAW,CAACF,GAAaxV,GAAAA,EAAAA,YAAyBwV,GAAaxV,GAAAA,EAAAA,UAC/D2V,eAAgB,cAElB,CACEjB,YAAac,GAAaxV,GAAAA,EAAAA,QAE5B,CACE0U,YAAac,GAAaxV,GAAAA,EAAAA,eAE5B,CACE0U,YAAac,GAAaxV,GAAAA,EAAAA,wBAE5B,CACE0U,YAAac,GAAaxV,GAAAA,EAAAA,YC9IjB4V,GAA8B,2CAE5B,SAASC,GAAO59C,GAab,IAAAqvB,EAAAwuB,EAAA,IAbc,UAC9BC,EAAS,aACTC,EAAY,gBACZC,EAAe,WACfzV,EAAU,iBACVh5B,EAAgB,mBAChB0uC,EAAkB,qBAClBC,EAAoB,sBACpBC,EAAqB,aACrBC,EAAY,gBACZxB,EAAe,mBACfyB,EAAkB,iBAClBC,GACct+C,EACd,MAAOu+C,GAAyBl6B,UAAWm6B,KAAoCl6B,EAAAA,EAAAA,GAAe,IACzF63B,GACH53B,kBAAkB,KAEd,cAAEk6B,IAAkB5pC,EAAAA,GAAAA,GACxBzU,IAAAA,SAAc,IAAMmP,EAAiB8F,yBAAyB,CAAC9F,IAC/D,CAAEuF,gBAAiB,CAAC,oBAEfpF,EAAWgvC,GAAgBt+C,IAAAA,UAAe,GAC3CqjC,EAAyBrjC,IAAAA,WAAiBmM,GAE1CoyC,EAA2BxB,GAA0B,CACzDC,wCAAwCloC,EAAAA,EAAAA,IAA0C3F,GAClF8tC,qBAAsBoB,IAAkBxoC,EAAAA,GAAAA,OACxCumC,SAA+B,QAAtBntB,EAAC9f,EAAiBwF,YAAI,IAAAsa,IAArBA,EAAuBla,MAG7BypC,EAA0BtC,GAAyB,CACvD1nC,iBAAkB6pC,IAAkBxoC,EAAAA,GAAAA,IACpCsmC,mBAAoBhtC,EAAiB4J,6BAA+BC,EAAAA,GAAAA,UACpEojC,SAA+B,QAAtBqB,EAACtuC,EAAiBwF,YAAI,IAAA8oC,IAArBA,EAAuB1oC,MAqDnC,OAlDA/U,IAAAA,WAAgB,KACd,IAAKm+C,EACH,OAGF,MAAMzP,EAAcA,CAAC1hC,EAAkBszB,KACrC,MAAMme,EAA0BjC,EAAgBC,GAAAA,GAAAA,uBAC1CiC,EAAU1xC,EAAM2V,QAAQ7C,QAAQ+yB,MAAMrsC,OAAS,EAC/Cm4C,EAAoBnC,EAAgBC,GAAAA,GAAAA,cACpCmC,EAAOzB,GAAahV,GAAYpzB,GAEtC,GAAI6pC,IAASjX,GAAAA,EAAAA,OAAqBr4B,GAAaqvC,IAAsBD,EACnE,OAGFJ,GAAa,GACb,MAAM,gCAAEO,EAA+B,2BAAEC,GAA+BX,EAClEY,EAAYze,EAAK0I,QAAU6V,EAAgCD,GAAQE,EAA2BF,GAC9Fv2C,EAAU2E,EAAMgD,WAAWkH,OAAO,CACtC7J,SAAU,IAAI0xC,EAAUze,EAAM,CAAC,EAAGtzB,EAAOq2B,GAAwB,KAC1Dob,GACHZ,EAAmBlW,GAAAA,EAAAA,OAErB2W,GAAa,GACbN,SAAAA,GAAgB,MAGpB31C,EAAQ22C,IAAI,WAAWhrC,IAAkB,IAAjB,SAAE3G,GAAU2G,EAC9B3G,EAASu3B,iBACX0Z,GAAa,GACbN,SAAAA,IACF,IAGF31C,EAAQqB,QAAQ,SAAUrB,EAAQ,EAGpC,OADA49B,GAAAA,EAAAA,KAAe,YAAayI,GACrB,KACLzI,GAAAA,EAAAA,OAAiB,YAAayI,EAAY,CAC3C,GACA,CACDvG,EACA0V,EACAxa,EACA2a,EACAG,EACA3B,EACAltC,IAIAtP,IAAAA,cAACi/C,EAAAA,QAAgB,CACf3kB,SAAUsjB,EACVtE,WAAWqE,GAAiBD,GAAcE,EAAiC,WAAf,aAC5D1xC,MAAO+xC,EAAqB,mBAAgB1sC,EAC5CpQ,UAAWmiB,IAAW,CAAE,mCAAoCs6B,KAE3DR,GAAoB/5C,KAAK0D,IAAS,IAAAm4C,EACjC,MAAMxE,EAAWvS,IAAephC,EAAKs1C,YAAYtnC,KAAoB,QAAlBmqC,EAAIn4C,EAAKs2C,iBAAS,IAAA6B,OAAA,EAAdA,EAAgBp4C,MAAM83C,GAASA,EAAK7pC,KAAOozB,KAC5FgX,EAAgBf,GAAkC1D,EAExD,OACE16C,IAAAA,cAACo/C,EAAAA,YAAW,CACVt8C,IAAKiE,EAAKs1C,YAAYtnC,GACtBsnC,YAAat1C,EAAKs1C,YAClB3B,SAAUA,EACVz2B,UAAWk7B,EACXE,WAAYt4C,EAAKs2C,UACjBiC,WAAYv4C,EAAKu2C,eACjBv9C,SAAU89C,EACVn4C,SAAUqB,EAAKs1C,YAAYtnC,KAAO4yB,GAAAA,EAAAA,OAAqBuW,EACvD3B,gBAAiBgB,GACjBgC,iBAAqC,IAApB3B,QAAmCrsC,GACpD,IAGNvR,IAAAA,cAACw/C,EAAAA,eAAc,CAACr+C,UAAWmiB,IAAW,CAAE,aAAcs6B,MACrDW,EAAyBl7C,KAAK0D,GAC7B/G,IAAAA,cAACo/C,EAAAA,YAAW,CACVt8C,IAAKiE,EAAKs1C,YAAYtnC,GACtBsnC,YAAat1C,EAAKs1C,YAClB3B,SAAU8B,EAAgBz1C,EAAKs1C,YAAYtnC,IAC3CmoC,WAAYn2C,EAAKm2C,WACjBX,gBAAiBx1C,EAAKw1C,gBACtB72C,SAAUqB,EAAKu1C,WACfv8C,SAAUg+C,MAGbS,EAAwBn7C,KAAK0D,GAC5B/G,IAAAA,cAACo/C,EAAAA,YAAW,CACVt8C,IAAKiE,EAAKs1C,YAAYtnC,GACtBsnC,YAAat1C,EAAKs1C,YAClB3B,UAAU,EACVh1C,SAAUqB,EAAKu1C,WACfC,gBAAiBx1C,EAAKw1C,gBACtBx8C,SAAU+9C,MAKpB,CC3JA,YCcA,SAAS2B,GAAiB7/C,GAAyD,IAAxD,OAAEoO,EAAM,KAAEoJ,EAAI,aAAEsoC,GAAsC9/C,EAC/E,OACEI,IAAAA,cAAC4D,EAAAA,SAAQ,CACP,wCAAAzD,OAAuC6N,GACvCnO,MAAOmO,EACPwd,WAAW,SACXm0B,KAAM,EACN7/C,MAAOsX,EACPrX,SAAW+D,IACT47C,EAAa57C,EAAEC,OAAOjE,MAAOkO,EAAO,GAI5C,CAMO,SAAS4xC,GAAkB5rC,GAA8B,IAA7B,iBAAE7E,GAAyB6E,EAC5D,MAAM,yBAAEmD,GAA6B5C,GAA2BpF,IACzDxB,EAASkyC,GAAc7/C,IAAAA,SAAyB,IACjD8/C,EAAyB9/C,IAAAA,SAAc,IAAMmP,EAAiB8F,yBAAyB,CAAC9F,IACxF8F,GAAwBR,EAAAA,GAAAA,GAAcqrC,EAAwB,CAAEprC,gBAAiB,CAAC,cAExF1U,IAAAA,WAAgB,KAEd,MAAM+/C,EAAoBA,KACxB,MAAM,QAAEpyC,GAAYF,GAAyC0B,GAC7D0wC,EAAWlyC,EAAQ,EAKrB,OAFA0iC,GAAAA,EAAAA,KAAW,SAAU0P,GACrBA,IACO,KACL1P,GAAAA,EAAAA,OAAa,SAAU0P,EAAkB,CAC1C,GACA,CAAC5wC,IAEJ,MAAM6wC,EAAgBhgD,IAAAA,SAAc,KAClC,MAAMqD,EAAkB,CAAC,EAOzB,OANA4R,EAAsBjF,SAASlC,SAASzF,IACR,SAA1BA,EAAQ6F,eAA4BP,EAAQlG,SAASY,EAAQ2F,UAC/D3K,EAAIgF,EAAQ2F,QAAUwB,GAAmBnH,GAC3C,IAGKhF,CAAG,GACT,CAAC4R,EAAsBjF,SAAUrC,IAEpC,OACE3N,IAAAA,cAAA,OAAKmB,UAAU,aACZwM,EAAQtK,KAAK2K,IAAM,IAAAiyC,EAAA,OAClBjgD,IAAAA,cAACy/C,GAAiB,CAChB38C,IAAKkL,EACLA,OAAQA,EACRoJ,KAA2B,QAAvB6oC,EAAED,EAAchyC,UAAO,IAAAiyC,EAAAA,EAAI,GAC/BP,aAAcvoC,GACd,IAIV,CCnEO,SAAS+oC,GAAmBtgD,GAAiD,IAAhD,YAAEm1B,EAAW,iBAAE5lB,GAA+BvP,EAChF,OACEI,IAAAA,cAAC8K,EAAAA,OAAM,CAACC,aAAW,EAACo1C,oBAAkB,EAAC/1C,MAAO2qB,EAAa,aAAW,cAAc5zB,UAAU,QAC5FnB,IAAAA,cAACmL,EAAAA,aAAY,CAACC,aAAcA,IAAM2pB,EAAY1qB,QAAQ,SACtDrK,IAAAA,cAACqL,EAAAA,WAAU,MACP0pB,EAAY9U,SAAW8U,EAAY9oB,YAAcjM,IAAAA,cAAC4/C,GAAkB,CAACzwC,iBAAkBA,KAIjG,CCgBO,SAASixC,GAAkBpsC,GAMV,IANW,SACjCqsC,EAAQ,SACRC,EAAQ,MACRl2C,EAAK,wBACLm2C,GAA0B,EAAK,QAC/B5yC,GACoBqG,EACpB,MAAMwsC,EAvCiB5gD,KAMnB,IANoB,wBACxB2gD,EAAuB,QACvB5yC,GAID/N,EACC,OAAI2gD,EACK,CACLv1C,MAAO,iCACPy1C,QACEzgD,IAAAA,cAAAA,IAAAA,SAAA,KAAE,oCACiCA,IAAAA,cAAA,SAAG,aAAa,oFAC3BA,IAAAA,cAAA,SAAI2N,EAAQ2D,KAAK,OAAU,MAKlD,CACLtG,MAAO,uBACPy1C,QAAS,oKACV,EAkBqBC,CAAiB,CAAEH,0BAAyB5yC,YAElE,OACE3N,IAAAA,cAAC2gD,EAAAA,mBAA2B,CAC1Bv2C,MAAOA,EACP,aAAYo2C,EAAcx1C,MAC1BA,MAAOw1C,EAAcx1C,MACrBg9B,QACEhoC,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAACwL,EAAAA,OAAM,CAAC,cAAY,6BAA6BC,QAAS40C,GAAU,UAGpErgD,IAAAA,cAACwL,EAAAA,OAAM,CAAC,cAAY,6BAA6BC,QAAS60C,EAAUp0C,MAAM,OAAM,YAMnFs0C,EAAcC,QAGrB,CCrDe,SAASG,GAAUhhD,GAA2C,IAA1C,WAAEuoC,EAAU,QAAE18B,GAA0B7L,EACzE,OACEI,IAAAA,cAACwL,EAAAA,OAAM,CAAC6U,WAAW,SAAS5U,QAASA,EAAS/G,QAAQ,EAAMwH,MAAM,kBAAkBzK,KAAK,UACvFzB,IAAAA,cAAC2kB,EAAAA,KAAI,CAACxgB,KAAMg5C,GAAahV,GAAY3gB,KAAM3lB,MAAO,GAAIV,UAAU,aAGtE,C,uOCHe,SAAS0/C,GAAajhD,GAKd,IALe,WACpCuoC,EAAU,mBACV0V,EAAkB,qBAClBC,KACGvzB,GACgB3qB,EACnB,MAAOkhD,EAAkBC,GAAuB/gD,IAAAA,UAAe,IACxDg7C,EAAiBgG,IAAsB/F,EAAAA,GAAAA,oBACvCgG,EAAsBC,GAA2BlhD,IAAAA,SAAmC,MAG3FA,IAAAA,WAAgB,KACdkhD,EAAwBn4C,SAAS6jB,eAAewtB,IAAuB,GACtE,IAEH,MAAM+G,EAAyBnhD,IAAAA,aAC7B,CAACohD,EAA0B13C,KAGzB,GAFAm0C,EAAmBuD,EAAa13C,GAEhB,UAAZA,EAAqB,OAAOq3C,GAAoB,EAAM,GAE5D,CAAClD,IAIGwD,EAAarhD,IAAAA,OAA6B,MAChDA,IAAAA,WAAgB,KACd,GAAK8gD,EAYL,OAHA/3C,SAAS2xB,iBAAiB,YAAa4mB,GACvCv4C,SAAS2xB,iBAAiB,aAAc4mB,GAEjC,KACLv4C,SAAS4xB,oBAAoB,YAAa2mB,GAC1Cv4C,SAAS4xB,oBAAoB,aAAc2mB,EAAmB,EAZhE,SAASA,EAAmBtkB,GAAgC,IAAAukB,EAE1D,MAAMC,EAAaz4C,SAASC,cAAc,+BACpB,QAAlBu4C,EAAAF,EAAW75C,eAAO,IAAA+5C,GAAlBA,EAAoB9mB,SAASuC,EAAMj5B,SAAmBy9C,SAAAA,EAAY/mB,SAASuC,EAAMj5B,SACrFg9C,GAAoB,EACtB,CAQC,GACA,CAACD,IAOJ,OAAKG,EAEElkB,IAAAA,aACL/8B,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAAA,OACE8a,IAAKumC,EACLlgD,UAAWq4B,IAAW,oBAAqB,CACzC,iCAAkCsnB,KAGpC9gD,IAAAA,cAACw9C,GAAOn8C,GAAA,CACNu8C,iBAAe,EACfzV,WAAYA,EACZ0V,mBAAoBsD,EACpBrD,qBAnB0B2D,IAChC3D,SAAAA,EAAuB2D,GACvBV,GAAoB,EAAM,GAkBhBx2B,KAGPywB,EAAgB0G,IAAI9G,KAAwBzS,IAAeR,GAAAA,EAAAA,MAC1D3nC,IAAAA,cAACwL,EAAAA,OAAM,CACL4U,YAAY,OACZ3e,KAAK,SACLgK,QAASA,KACPs1C,GAAoB,GACpBC,GAAoBW,IAClBA,EAAOnG,OAAOZ,IACP+G,IACP,GAEL,QAID3hD,IAAAA,cAAC4gD,GAAU,CACTzY,WAAYA,EACZ18B,QAASA,KACPs1C,GAAoB,EAAK,KAKjCE,GAzCgC,IA2CpC,C,uOCjGO,SAASW,GAAsBhiD,GAAkD,IAAjD,iBAAEuP,GAA6CvP,EACpF,MAAMgb,EAAiC5a,IAAAA,SACrC,IAAMmP,EAAiB8F,yBACvB,CAAC9F,KAEG,cAAEkvC,IAAkB5pC,EAAAA,GAAAA,GAAcmG,EAAgC,CAAElG,gBAAiB,CAAC,oBACrF2pB,EAAW4R,GAAgBjwC,IAAAA,UAAe,GAqCjD,OAnCAA,IAAAA,WAAgB,KACd,GAAIq+C,IAAkBxoC,EAAAA,GAAAA,IACpB,OAGF,IAAIgsC,EAA8C,KAClD,MAAMC,EAAezD,IAAkBxoC,EAAAA,GAAAA,MAEvCgsC,EAAuBtuC,YACrB,KACE08B,EAAa6R,EAAa,GAE5BA,EAAe,EAAI,KAGrB,MAAMC,EAA+B/kB,IACnC,GAAIqhB,IAAkBxoC,EAAAA,GAAAA,MACpB,OAGF,MAAM4qC,EAAU,4FAEhB,OADAzjB,EAAMglB,YAAcvB,EACbA,CAAO,EAKhB,OAFA9xC,OAAO+rB,iBAAiB,eAAgBqnB,GAEjC,KACLpzC,OAAOgsB,oBAAoB,eAAgBonB,GACvCF,GACF1sC,aAAa0sC,EACf,CACD,GACA,CAACxD,IAOG,IACT,CC9CA,MAAM4D,IAAc38B,EAAAA,EAAAA,MAEb,SAAS48B,GAAuBtiD,GAAsE,IAAAqvB,EAAAwuB,EAAA,IAAnEtuC,iBAAkBgzC,EAAyB,YAAEC,GAAoBxiD,EACzG,MAAMuP,GAAmBsF,EAAAA,GAAAA,GAAc0tC,EAA2B,CAChEztC,gBAAiB,CAAC,WAEd,qBAAE4C,GAAyB/C,GAA2BpF,GAE5D,OAAKA,EAAiBkmB,SAKpBr1B,IAAAA,cAAA,OAAKmB,UAAU,sCACX8gD,IAAejiD,IAAAA,cAAA,WAAK,SACtBA,IAAAA,cAAA,OAAKmB,UAAU,2BACbnB,IAAAA,cAAC4D,EAAAA,SAAQ,CACPkX,IAAKsnC,EACLnjC,SAAUgjC,QAAc1wC,EAAY,OACpCia,WAAW,eACX3nB,YAAY,mCACZ,cAAY,qBACZ/D,MAAkC,QAA7BmvB,EAAuB,QAAvBwuB,EAAEtuC,EAAiBwF,YAAI,IAAA8oC,OAAA,EAArBA,EAAuBrmC,YAAI,IAAA6X,EAAAA,EAAI,GACtClvB,SAAW+D,IACTwT,EAAqBxT,EAAEC,OAAOjE,MAAM,MAfrC,IAqBX,CC/BO,SAASuiD,KACd,MAAMC,EAAuBv5C,SAASw5C,uBAAuB,oBAG7D,OAFiCz3B,MAAM7lB,KAAKq9C,EAG9C,CAEA,SAASE,GAAe3uC,GAAe,IAAA4uC,EACrC,MAAMC,EAAa35C,SAAS6jB,eAAe,QAADzsB,OAAS0T,IACnD,OAAsB,QAAtB4uC,EAAOC,aAAU,EAAVA,EAAYC,WAAG,IAAAF,EAAAA,EAAI,IAC5B,CAEO,SAASG,GAA6BhjD,GAAmE,IAAlE,YAAEw6B,EAAW,YAAE3Z,GAAiD7gB,EAC5G,MAAM4M,GAASC,EAAAA,EAAAA,mBACT,cAAEggB,IAAkBC,EAAAA,EAAAA,wBAAuBlgB,IAC1Cq2C,EAAcC,GAAmB9iD,IAAAA,SAAe,CACrD+iD,UAAU,EACVC,YAAa,KACbhiC,UAAW,GACXhT,OAAQ,MAEHgW,IAAsBE,EAAAA,EAAAA,GAAe,IACvCN,GACHO,kBAAmBsI,IAEfnI,EAAgBN,aAAkB,EAAlBA,EAAoBO,QA+B1C,OA7BAvkB,IAAAA,WAAgB,KACd,MAAMijD,EAA2BZ,KAC3Ba,EAAgBlmB,IACpB,MAAM,MAAEnpB,EAAK,OAAE7F,EAAM,UAAEgT,GAAegc,EAAM/7B,cAA8BkiD,QAC1E,GAAItvC,GAAS7F,GAAUgT,EAAW,CAChC,MAAMoiC,EAAWv9C,OAAOtB,SAASsP,GACjCivC,EAAgB,CACd90C,SACAgT,YACA+hC,SAAuB,IAAbK,EACVJ,YAAaI,EAAW,EAAIZ,GAAeY,GAAY,OAEzD52C,EAAOK,MACT,GASF,OANIutB,GACF6oB,EAAyBn1C,SAASgvB,IAChCA,EAAGpC,iBAAiB,QAASwoB,EAAa,IAIvC,KACLD,EAAyBn1C,SAASgvB,IAChCA,EAAGnC,oBAAoB,QAASuoB,EAAa,GAC7C,CACH,GACA,CAAC12C,EAAQ4tB,IAEL9V,EAAgBtkB,IAAAA,cAACskB,EAAa,CAACla,MAAOoC,EAAQpE,OAAQy6C,EAAcpiC,YAAaA,IAAkB,IAC5G,C,eCjEO,IAAK4iC,GAA+B,SAA/BA,GAA+B,OAA/BA,EAAAA,EAA+B,iBAA/BA,EAAAA,EAA+B,uBAA/BA,EAAAA,EAA+B,qBAA/BA,EAAAA,EAA+B,mBAA/BA,CAA+B,MAYpC,SAASC,GAAe1jD,GAA8C,IAA7C,eAAE2jD,EAAc,MAAEn5C,GAAyBxK,EACzE,OACEI,IAAAA,cAAC8K,EAAAA,OAAM,CACLV,MAAOA,EACP,aAAW,wGACXjJ,UAAU,OACV8J,eAAgBA,IAAMs4C,EAAeF,GAAgCG,QACrE36C,cAAe,CAAErB,QAASuB,SAASE,OAEnCjJ,IAAAA,cAACmL,EAAAA,aAAY,CAACC,aAAcA,IAAMm4C,EAAeF,GAAgCG,SAAS,mCAG1FxjD,IAAAA,cAACqL,EAAAA,WAAU,KACTrL,IAAAA,cAAA,OAAKmB,UAAU,aACbnB,IAAAA,cAACuB,EAAAA,UAAS,KAAC,uEACXvB,IAAAA,cAACuB,EAAAA,UAAS,KACRvB,IAAAA,cAAA,cAAQ,oBACRA,IAAAA,cAAA,WAAM,oHAIRA,IAAAA,cAACuB,EAAAA,UAAS,KACRvB,IAAAA,cAAA,cAAQ,oBACRA,IAAAA,cAAA,WAAM,4LAIRA,IAAAA,cAACuB,EAAAA,UAAS,KACRvB,IAAAA,cAAA,cAAQ,cACRA,IAAAA,cAAA,WAAM,6DAKZA,IAAAA,cAACgM,EAAAA,aAAY,KACXhM,IAAAA,cAACwL,EAAAA,OAAM,CACL,cAAY,+BACZC,QAASA,IAAM83C,EAAeF,GAAgCI,WAC/D,WAGDzjD,IAAAA,cAACwL,EAAAA,OAAM,CACL,cAAY,4BACZC,QAASA,IAAM83C,EAAeF,GAAgCK,QAC/D,WAGD1jD,IAAAA,cAACwL,EAAAA,OAAM,CACL,cAAY,8BACZC,QAASA,IAAM83C,EAAeF,GAAgCM,UAC/D,eAMT,CC3CA,MAAMC,GAAoCC,IAA+C,IAAAC,EAAAx1C,EAAAC,EACvF,OAAQs1C,GACN,KAAKE,EAAAA,GAAAA,EACH,OAAOC,EAAAA,GAAAA,UACT,KAAKD,EAAAA,GAAAA,GACH,OAAOC,EAAAA,GAAAA,kBACT,KAAKD,EAAAA,GAAAA,GACH,OAAOC,EAAAA,GAAAA,WACT,KAAKD,EAAAA,GAAAA,EACH,OAAOC,EAAAA,GAAAA,UACT,KAAKD,EAAAA,GAAAA,EACH,OAAOC,EAAAA,GAAAA,UACT,KAAKD,EAAAA,GAAAA,EACL,KAAKA,EAAAA,GAAAA,GACH,OAAOC,EAAAA,GAAAA,YACT,QACE,OAC+E,QAD/EF,GACEG,EAAAA,GAAAA,IAAoE,QAAjC31C,EAAsB,QAAtBC,EAACI,OAAOC,sBAAc,IAAAL,GAAI,QAAJA,EAArBA,EAAuB21C,UAAE,IAAA31C,OAAA,EAAzBA,EAA2B9L,aAAK,IAAA6L,EAAAA,EAAI,aAAK,IAAAw1C,EAAAA,EAAIE,EAAAA,GAAAA,YAEvF,EAGIG,GAAuBh1C,IAA8C,IAAAsuC,GACzE2G,EAAAA,GAAAA,kBAAiB,CAAEC,cAAc,IACjC,MAAMjzC,GAAWmV,EAAAA,GAAAA,eACX6I,GAAWC,EAAAA,GAAAA,gBACX,kBAAEvb,GAAsBhD,KACxBtE,GAASC,EAAAA,EAAAA,kBAETyP,GAAc/M,aAAgB,EAAhBA,EAAkB4J,8BAA+BC,EAAAA,GAAAA,UAC/Dy+B,GAActoC,aAAgB,EAAhBA,EAAkB4J,8BAA+BC,EAAAA,GAAAA,UAC/D0+B,EAA2B,CAC/B1+B,EAAAA,GAAAA,YACAA,EAAAA,GAAAA,UACAA,EAAAA,GAAAA,YACAvR,SAAS0H,aAAgB,EAAhBA,EAAkB4J,4BAE7B/Y,IAAAA,WAAgB,KACVy3C,GACFntB,EAAAA,GAAAA,UACE,YAAW,IAAAnqB,QACPqjB,EAAAA,GAAAA,GAAkB,KAAKrG,EAAAA,GAAAA,GAAkB/L,EAAS6M,QAASjM,OAAGT,EAAW2P,cAAU3P,KACvF+yC,GAAAA,IAAY,IAAInwC,KAAQ,CAAEowC,OAAQ,IAEtC,GACC,CAAC9M,EAAarmC,EAAS6M,SAE1Bje,IAAAA,WAAgB,KAAM,IAAAivB,EACpB,MAAMmD,GAAqBjV,EAAAA,GAAAA,GAAgD/L,EAAS6M,SAIhF9O,IAAoBijB,EAAmBpgB,GAA2B,QAAtBid,EAAC9f,EAAiBwF,YAAI,IAAAsa,GAArBA,EAAuBla,IACtEpG,OAAOyC,SAASuN,QAClB,GAGC,CAACvN,EAAS6M,OAAQ9O,SAAsB,QAANsuC,EAAhBtuC,EAAkBwF,YAAI,IAAA8oC,OAAA,EAAtBA,EAAwB1oC,KAE7C,MAAMyvC,EAAoBxkD,IAAAA,aAAkB,KAAM,IAAAykD,EAChD,IAAKt1C,EAAkB,OAEvB,MAAMu1C,GAAgBvnC,EAAAA,GAAAA,GAAgD/L,EAAS6M,QAEzE0mC,EAAoD,QAA7CF,EAAIC,EAAuCl+B,UAAE,IAAAi+B,EAAAA,EAAI,MAC9DG,EAAAA,EAAAA,IAAiB,CACfphD,KAAMogD,GAAiCe,GACvCx1C,qBAGEsoC,GAAetoC,EAAiBgS,SAAYujC,EAAwCzyC,GACtF9C,EAAiB4G,iBAAiB,CAAEoL,OAASujC,EAAwCzyC,IAGvF9C,EAAiB0Z,eAAe/a,SAAQ,CAAC8a,EAAYL,KAAe,IAAAs8B,EAAAC,EAAAC,EAAAC,EAAAC,EAClE,MAAMC,EAAkD,QAAzCL,EAAGH,EAAc5oC,EAAEkG,MAAM,KAAKuG,UAAW,IAAAs8B,EAAAA,EAAI,KACtDM,EAAsD,QAA1CL,EAAkB,QAAlBC,EAAGL,EAAc3oC,SAAC,IAAAgpC,OAAA,EAAfA,EAAiB/iC,MAAM,KAAKuG,UAAW,IAAAu8B,EAAAA,EAAI,KAC1DM,EAAsD,QAA1CJ,EAAkB,QAAlBC,EAAGP,EAAcpxC,SAAC,IAAA2xC,OAAA,EAAfA,EAAiBjjC,MAAM,KAAKuG,UAAW,IAAAy8B,EAAAA,EAAI,KAC1DlxB,EAAkBoxB,aAAS,EAATA,EAAW1/C,cAMnC,IAAImW,GAAa+B,EAAAA,EAAAA,IAAcoW,GAC3B3kB,EAAiB4J,6BAA+BC,EAAAA,GAAAA,YAClD2C,EAAaiN,EAAWjN,YAG1B,MAAM0pC,EAAiB,CACrB1pC,aACA3N,QAAQs3C,EAAAA,GAAAA,IAA0B3pC,EAAYmY,GAC9C9S,UAAWmkC,EACXvjC,UAAWwjC,GAGT9+C,OAAOm0C,QAAQ4K,GAAgBv+C,MAAKlH,IAAA,IAAEkD,EAAKhD,GAAMF,EAAA,OAAKgpB,EAAW9lB,KAAwBhD,CAAK,KAChG8oB,EAAW28B,wBAAwBF,EACrC,GACA,GACD,CAACl2C,EAAkBiC,EAAS6M,OAAQw5B,IAEvCz3C,IAAAA,WAAgB,KAAM,IAAAwlD,EAAAC,EACpB,MAAMf,GAAgBvnC,EAAAA,GAAAA,GAAgD/L,EAAS6M,QAE/E,GACG9O,GACAu1C,EAAc3oC,GACd2oC,EAAc5oC,IACbI,GAAeu7B,GAAeC,GAJlC,CA0BA,GAJyB,QAArB8N,EAAAr2C,EAAiBwF,YAAI,IAAA6wC,GAArBA,EAAuBzwC,IAAMvI,EAAOyT,SACtCzT,EAAOnC,QAGJq6C,EAAc1yC,GAA0B,QAAzByzC,EAAIt2C,EAAiBwF,YAAI,IAAA8wC,GAArBA,EAAuB1wC,GAAI,CACjD,MAAMmwC,EAAYR,EAAc5oC,EAAEkG,MAAM,KAClCgO,EAAe7gB,EAClB0Z,eACAniB,OAAM,CAACic,EAAO3Q,IAAM2Q,EAAM1U,sBAAwBi3C,EAAUlzC,KAE/D,GAAIge,GAAgBrhB,OAAOC,eAAesR,gBAAkB/Q,EAAiB0F,yBAE3E,YADArI,EAAOK,OAGJsC,EAAiB0F,0BAA6Bmb,GACjD/gB,GAA8B,CAAEE,mBAAkBC,cAAe,mBAEnED,EAAiBu2C,UACnB,CACAlB,GApBA,KArBA,CAMuC,IAAAmB,GAAhCjB,EAAc3oC,GAAKG,GACtBkT,EACE,CACEnR,OAAQ,IAAF9d,QAAMqjB,EAAAA,GAAAA,GAAkB,IACzBkhC,EACH3oC,EAAsC,QAArC4pC,EAAEh3C,OAAOC,eAAeg3C,qBAAa,IAAAD,EAAAA,EAAIE,EAAAA,GAAAA,EAC1CvyC,EAAG3E,OAAOC,eAAek3C,qBAG7B,CACE7jC,SAAS,GAKjB,CAoBmB,GAElB,CACD7Q,EAAS6M,OACTzR,EAAOK,KACPuiB,EACAjgB,EACA+M,EACAu7B,EACAC,EACA8M,IAGF,MAAMuB,EAAkB/lD,IAAAA,aACtBkR,UACE,GAAK/B,EACL,GAAI62C,IAAW3C,GAAgCG,OAA/C,CAIA,OAAQwC,GACN,KAAK3C,GAAgCK,MACnCz0C,GAA8B,CAC5BE,mBACAC,cAAe,qBAEjB,MAEF,KAAKi0C,GAAgCI,SAAU,CAC7C,MAAM,QAAE91C,GAAYF,GAAyC0B,SACvD2E,EAAkB,CAAEnG,UAASoG,iBAAiBgE,EAAAA,GAAAA,KAAQ1D,EAAAA,EAAAA,MAAWF,KAAKC,SAC5E,KACF,CACA,KAAKivC,GAAgCM,QACnC10C,GAA8B,CAC5BE,mBACAC,cAAe,mBAOrBD,EAAiBu2C,WACjBlB,IACAh4C,EAAOnC,MA1BP,MAFE+kB,GAAU,EA4BC,GAEf,CAAC5iB,EAAQ2C,EAAkBq1C,EAAmB1wC,EAAmBsb,IAGnE,MAAO,CACL5iB,SACAu5C,kBACD,E,4QC3MH,SAASE,GAAqBv4C,GAC5B,MAAMw4C,EAAav3C,OAAOu3C,WAC1B,OACEA,GAAcC,EAAAA,IACdz4C,EAAYqL,6BAA+BC,EAAAA,GAAAA,UAEpC,GAGFi7B,EAAAA,EAAAA,IAA8B,CACnCvmC,cACAymC,iBAAkBiS,EAAAA,GAClBlS,kBAAmBgS,GAEvB,CAEA,SAASG,GAAczmD,GAKyD,IALxD,iBACtBuP,EAAgB,OAChB/G,EAAM,2BACNk+C,EAA0B,cAC1BC,GAC4E3mD,EAC5E,MAAOgV,EAAQ4xC,GAAaxmD,IAAAA,UAAe,GAkD3C,OAzCAA,IAAAA,WAAgB,KACd,GAAIsmD,GAA8Bn3C,IAAqByF,EAAQ,CAC7D,MAAM6xC,EAAwBA,KAC5B,MAAM,OAAEhlC,GAAWtS,EAAiB0T,WAC9B6jC,EACJjlC,EAAOjb,SAAW4B,EAAOqZ,OAAOjb,QAChCib,EAAO/a,OACL,CAACic,EAAO4F,IACN5F,EAAMR,MAAM3b,SAAW4B,EAAOqZ,OAAO8G,GAAYpG,MAAM3b,QACvDmc,EAAMR,MAAMzb,OACV,CAACkQ,EAAM0tB,IACL1tB,EAAK5G,SAASxJ,SAAW4B,EAAOqZ,OAAO8G,GAAYpG,MAAMmiB,GAAWt0B,SAASxJ,QAC7EoQ,EAAK5G,SAAStJ,OACZ,CAAC2B,EAASs+C,KAAY,IAAA/P,EAAAgQ,EAAA,OACJ,QAAhBhQ,EAAAvuC,EAAQwuC,gBAAQ,IAAAD,OAAA,EAAhBA,EAAkBpwC,WACwD,QADlDogD,EACxBx+C,EAAOqZ,OAAO8G,GAAYpG,MAAMmiB,GAAWt0B,SAAS22C,GAAc9P,gBAAQ,IAAA+P,OAAA,EAA1EA,EAA4EpgD,OAAM,QAK5FkgD,IACFF,GAAU,GACVr3C,EAAiB4G,iBAAiB,CAAEnB,QAAQ,IAC5C0xC,EAA2Bn3C,GACvBo3C,IACFA,EAAc9jD,MAAMokD,QAAU,QAC9BN,EAAc9jD,MAAMuzC,UAAY,SAEpC,EAOF,OAJA7mC,EAAiB8vB,KAAK1D,GAAiCkrB,GAEvDA,IAEO,KACLt3C,EAAiB+vB,OAAO3D,GAAiCkrB,EAAsB,CAEnF,IACC,CAACt3C,EAAkB/G,EAAQwM,EAAQ0xC,EAA4BC,IAE3D,IACT,CAEO,MAAMO,GAA+BlX,GAAoB1rC,IAC9D,MAAMkE,EAASpI,IAAAA,SAAc,KAAM,IAAA+mD,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAtb,EAAAub,EAAA33C,EAAA43C,EACjC,MAAMC,EAAYthD,IAAM,CAAC,EAAGhC,EAAMkE,OAAQ,CACxCitB,SAA+B,QAAvB0xB,EAAE7iD,EAAMkE,OAAOitB,gBAAQ,IAAA0xB,GAAAA,EAC/BnyB,gBAA6C,QAA9BoyB,EAAE9iD,EAAMkE,OAAOwsB,uBAAe,IAAAoyB,GAAAA,EAC7CrnB,WAAmC,QAAzBsnB,EAAE/iD,EAAMkE,OAAOu3B,kBAAU,IAAAsnB,GAAAA,EACnC7hB,MAAyB,QAApB8hB,EAAEhjD,EAAMkE,OAAOg9B,aAAK,IAAA8hB,GAAAA,EACzBh7C,MACEhI,EAAMkE,OAAO8D,OAAS,CAACu7C,EAAAA,GAAAA,MAAaA,EAAAA,GAAAA,MAAYhgD,SAASvD,EAAMkE,OAAO8D,OAAShI,EAAMkE,OAAO8D,MAAQu7C,EAAAA,GAAAA,MACtGxyB,QAA6B,QAAtBkyB,EAAEjjD,EAAMkE,OAAO6sB,eAAO,IAAAkyB,EAAAA,EAAI,CAACjyB,EAAAA,GAAAA,QAAyBA,EAAAA,GAAAA,MAAuBA,EAAAA,GAAAA,OAClFlY,MAAyB,QAApBoqC,EAAEljD,EAAMkE,OAAO4U,aAAK,IAAAoqC,GAAAA,EACzBruC,2BAAmE,QAAzCsuC,EAAEnjD,EAAMkE,OAAO2Q,kCAA0B,IAAAsuC,EAAAA,EAAIruC,EAAAA,GAAAA,QACvEizB,qBAAsB,KAGnBub,EAAUxqC,QACbwqC,EAAUvyB,QAAUuyB,EAAUvyB,QAAQxf,QAAQgrB,GAAY,UAANA,MAIlDiP,EAAAA,EAAAA,IAAiB8X,EAAW,CAACxuC,EAAAA,GAAAA,cAC/BwuC,EAAUvyB,QAAUuyB,EAAUvyB,QAAQ90B,OAAO,CAAC+0B,EAAAA,GAAAA,SAA0BA,EAAAA,GAAAA,aAG1E,MAAM+W,EAAsG,QAAlFF,EAA4B,QAA5Bub,EAAGl5C,YAAyB,IAAAk5C,OAAA,EAAzBA,EAA2B7xC,QAAOzB,IAAA,IAAC,WAAE5D,GAAY4D,EAAA,MAAoB,YAAf5D,CAAwB,WAAC,IAAA27B,EAAAA,EAAI,GAC1G7vB,EAAcsrC,EAAUzuC,6BAA+BC,EAAAA,GAAAA,UACvD0uC,EAA6BxrC,GAAkD,OAAnCoO,EAAAA,GAAAA,UAAgB,eAElE,GAAoC,IAAhC2hB,EAAqBzlC,QAAgBkhD,EACvC,OAAOF,EAGT,MAAMG,EAAc1b,EAAqB/oC,MACvCsV,IAAA,IAAC,cAAEtK,EAAa,OAAEF,GAAQwK,EAAA,MACN,SAAlBtK,GAA4BhK,EAAMkE,OAAOqZ,OAAO3a,MAAM6b,GAAUA,EAAM3U,SAAWA,GAAO,IAGtFoJ,EAAOuwC,IAAmD,QAAxCh4C,EAAInH,KAAKC,MAAMk/C,EAAY/3C,qBAAa,IAAAD,OAAA,EAApCA,EAAsCE,MAC5D+3C,EAAa1rC,GAAe9E,EAAO,CAAEA,aAAS7F,EAEpD,MAAO,IACFi2C,EACHvb,uBACAt3B,KAAoB,QAAhB4yC,EAAEC,EAAU7yC,YAAI,IAAA4yC,EAAAA,EAAIK,EACxBnmC,OAAQ+lC,EAAU/lC,OAAOpe,KAAKsf,IAC5B,MAAM,OAAE3U,EAAM,MAAEmU,GAAUQ,EAC1B,MAAO,IACFA,EACHR,MAAOA,EAAM9e,KAAKuT,IAChB,MAAM1I,EnEvIX,SAAwC0I,GAC7C,MAAMixC,EAAmBjxC,EAAK5G,SAAS9M,MAAM45B,GAAOA,EAAGt5B,KAAKw8B,WAAW,iBACvE,OAAI6nB,EACKA,EAAiBrkD,KAELoT,EAAK5G,SAAS9M,MAAM45B,GAAOA,EAAGt5B,KAAKw8B,WAAW,aAE1D,QAEF,IACT,CmE6HkC8nB,CAA+BlxC,GAC/CmxC,EAAc9b,EACjBx2B,QACEhE,GACCA,EAAQvD,gBAAkBA,GAC1BuD,EAAQzD,SAAWA,IAClB4I,EAAK5G,SAASlJ,MAAMwP,GAAgBA,EAAYpG,YAAcuB,EAAQvB,cAE1E7M,KAAIgL,IAAA,IAAC,UAAE6B,EAAS,OAAEC,EAAM,aAAEP,GAAcvB,EAAA,MAAM,CAC7C6B,YACAC,YACG3H,KAAKC,MAAMmH,GACf,IACH,MAAO,IACFgH,EACH5G,SAAU,IAAI4G,EAAK5G,YAAa+3C,GACjC,IAEJ,IAEJ,GAGA,IAEG54C,EAAmBnP,IAAAA,SAAc,KAAM,IAAAsO,EAC3C,MAAM4S,GAAWulB,EAAAA,GAAAA,aAAY,IAAKr+B,EAAQ8D,MAAO9D,EAAO8D,QAClDwB,EAAcs6C,GAAAA,EAAAA,OAA0C,CAC5D7mC,OAAQ/Y,EAAO+Y,OACftf,MAAOuG,EAAOvG,MACdyrB,OAAQllB,EAAOklB,OACf+H,SAAUjtB,EAAOitB,SACjBT,gBAAiBxsB,EAAOwsB,gBACxB+K,WAAYv3B,EAAOu3B,WACnB8H,kBAAmBr/B,EAAOu3B,WAC1ByF,MAAOh9B,EAAOg9B,MACdnQ,QAAS7sB,EAAO6sB,QAChB/oB,MAAO9D,EAAO8D,MACdyI,KAAMvM,EAAOuM,KACbuM,WACAqvB,mBAAoBnoC,EAAO2Q,6BAA+BC,EAAAA,GAAAA,UAC1DD,2BAA4B3Q,EAAO2Q,2BACnCkvC,sBAAsB,EACtBpzC,6BACEC,EAAAA,EAAAA,IAA0C1M,IACV,QADiBkG,EACjDK,OAAOC,eAAes5C,kBAAU,IAAA55C,IAAhCA,EAAmCmuC,GAAAA,GAAAA,mBAErC0L,sBAAsB,EACtBz3C,KAAMtI,EAAOsI,KACbuE,sBAAuBmzC,GAAAA,EAAAA,OAAoD,CACzEp4C,SAAU5H,EAAO6jC,yBAMrB,OAFAv+B,EAAYqI,iBAAiB,CAAE4oB,kBAAmBsnB,GAAqBv4C,KAEhEA,CAAW,GAIjB,IAEH,OAAOyB,EACLnP,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAACqmD,GAAc,CACbj+C,OAAQA,EACR+G,iBAAkBA,EAClBm3C,2BAA4BpiD,EAAMoiD,2BAClCC,cAAeriD,aAAK,EAALA,EAAOqiD,gBAExBvmD,IAAAA,cAAC4vC,EAASvuC,GAAA,CAAC8N,iBAAkBA,GAAsBjL,EAAK,CAAEkE,OAAQA,MAElE,IAAI,E,6OCvNV,MCcaigD,GAAoBzY,GAAoB1rC,IACnD,MAAOokD,EAAyBC,GAA8BvoD,IAAAA,SAA4C,CAAC,GACrGwoD,EAA4BxoD,IAAAA,aAAkB,KAElD,MAAMyoD,EAA0D,CAAC,EACjEvkD,EAAMiL,iBAAiB0Z,eAAe/a,SAAS6U,IAC7C,MAAM+lC,EAAuB/lC,EAAMgb,qBAET,IAAAgrB,EAAtBD,IACFD,EAA2BC,GAAwE,QAAnDC,EAAGF,EAA2BC,UAAqB,IAAAC,EAAAA,EAAI,GACvGF,EAA2BC,GAAsBv6C,KAAKwU,EAAM5N,IAC9D,IAGEvM,KAAKE,UAAU+/C,KAAgCjgD,KAAKE,UAAU4/C,IAChEC,EAA2BE,EAC7B,GACC,CAACvkD,EAAMiL,iBAAkBm5C,IACtBM,EAAiB5oD,IAAAA,OAAuB,IAyD9C,OAvDAA,IAAAA,WAAgB,KACd,MAAM6oD,EAAqCt+C,IAASi+C,GAC9CM,EAA0Bn6C,OAAO6M,YACrCqtC,EAC8B,IAA9BE,EAAAA,IAOF,OAHA1Y,GAAAA,EAAAA,KAAW,SAAUwY,GACrBzpB,GAAAA,EAAAA,KAAU,SAAUypB,GAEb,KACLA,EAAmCn+C,SACnC2lC,GAAAA,EAAAA,OAAa,SAAUwY,GACvBzpB,GAAAA,EAAAA,OAAY,SAAUypB,GACtBl6C,OAAO8M,cAAcqtC,EAAwB,CAC9C,GACA,CAACN,IAEJxoD,IAAAA,WAAgB,KACd,MAAMgpD,EAAmB1iD,OAAOC,KAAK+hD,GAAyBjlD,IAAIwC,QAC5DojD,EAAY/kD,EAAMiL,iBAAiB0Z,eACnCqgC,EAAsBtjD,KAAKjE,OAAOqnD,GAuBxC,OArBAA,EAAiBl7C,SAASq7C,IACxB,MAAMC,EAAYz6C,OAAO6M,aAAY,KACnC,MAAM6tC,EAAWf,EAAwBa,GAEzCF,EACGxzC,QAAQkN,GAAU0mC,EAAS5hD,SAASkb,EAAM5N,MAC1Cu0C,SAAS3mC,GAAUA,EAAM0N,iBACzB5a,QACC,CAACqK,EAAOjM,EAAO01C,KACZzpC,EAAMC,YAAclM,IAAU01C,EAAehxC,WAAWixC,GAAkB1pC,EAAMyQ,IAAIi5B,OAExF17C,SAASgS,IACRA,EAAM0Q,UAAU,CAAEC,UAAW1I,GAAAA,EAAAA,WAA2B,IAExDohC,IAAaD,GACfngD,SAAS0gD,cAAc,IAAIC,MAAMC,EAAAA,IACnC,GACCR,GACHP,EAAephD,QAAQ2G,KAAKi7C,EAAU,IAGjC,KACDR,EAAephD,QAAQhB,OAAS,IAClCoiD,EAAephD,QAAQsG,SAASs7C,IAC9Bz6C,OAAO8M,cAAc2tC,EAAU,IAEjCR,EAAephD,QAAU,GAC3B,CACD,GACA,CAACtD,EAAMiL,iBAAkBm5C,IAErBtoD,IAAAA,cAAC4vC,EAAc1rC,EAAS,E,grBC3BjC,MAAM0lD,WAAiC5pD,IAAAA,UAQrCg8B,YAAY93B,GACVo7B,MAAMp7B,GARR+3B,GAAA,qBAAAA,GAAA,gBAEW1W,QAAQ+E,EAAAA,GAAAA,UAAe,KAAM2R,GAAA,sBAAAA,GAAA,wCAAAA,GAAA,sCAGP,IAAI4tB,iBAAiB5tB,GAAA,2CA6GjB,KACnC,IAAI6tB,GAAmB,EACoC,IAAAx7C,GAAvDwG,EAAAA,EAAAA,IAA0C6mB,KAAK3uB,cAC2BuE,KAAxC,QAAhCjD,EAAAK,OAAOC,eAAes5C,kBAAU,IAAA55C,OAAA,EAAhCA,EAAmCmuC,GAAAA,GAAAA,mBACrCqN,EAAmBn7C,OAAOC,eAAes5C,WAAWzL,GAAAA,GAAAA,kBAEpD9gB,KAAKouB,kCAIT,OADApuB,KAAK3uB,MAAM0K,gBAAgB,2BAA4BoyC,GAChDA,CAAgB,IACxB7tB,GAAA,uCAEgC/qB,UAC/B,MAAM84C,EAAuBC,IAC3BtuB,KAAK3uB,MAAM0K,gBAAgB,2BAA4BuyC,GACvDtuB,KAAKkM,UAAU/7B,IAAS,CACtB0wC,gBAAiB,IACZ1wC,EAAU0wC,gBACb,CAACC,GAAAA,GAAAA,kBAAkCwN,MAEpC,EAGL,IACEtuB,KAAKuuB,+BAA+BC,QACpCxuB,KAAKuuB,+BAAiC,IAAIL,gBAC1C,MAAMl2C,QAAiBxC,EAAAA,GAAAA,IAAS,CAC9BC,SAAU,wBACVuB,YAAkBpB,IAAVzR,EAAsB,OAAS,MACvCmJ,UACYsI,IAAVzR,EACI,IAAIy7C,gBAAgB,CAAE6O,YAAa5hD,KAAKE,UAAU,CAAE,CAAC+zC,GAAAA,GAAAA,kBAAkC38C,WACvFyR,EACNC,mBAAoB,CAAC,KACrBkgB,gBAAiBiK,KAAKuuB,sCAGV34C,IAAVzR,QAAuEyR,KAAhDoC,aAAQ,EAARA,EAAW8oC,GAAAA,GAAAA,oBACpCuN,EAAoBr2C,EAAS8oC,GAAAA,GAAAA,kBAEjC,CAAE,WACclrC,IAAVzR,GACFkqD,GAAqBlqD,EAEzB,KACDm8B,GAAA,gCAEyB,KACxBN,KAAK0uB,yBAA2B17C,OAAO4E,YAAW,KAChDooB,KAAK2uB,qBACD3uB,KAAKz3B,MAAMmzC,cACb1b,KAAK4uB,cACP,GACA,IACHtuB,GAAA,uBAEgB,KACfN,KAAK2uB,qBAED3uB,KAAKz3B,MAAMmzC,cACb1b,KAAK6uB,iBACP,IACDvuB,GAAA,qBAEc,KACb,MAAMwuB,GAAwClT,EAAAA,EAAAA,IAAoB5b,KAAK3uB,MAAM88B,oBAC7EnO,KAAK3uB,MAAM+I,iBAAiB00C,EAAW,IACxCxuB,GAAA,uBAEiByuB,IAAS/uB,KAAK4uB,aAAc,MAAItuB,GAAA,iCAavB,KACyF,IAAA0uB,EAE3GC,GAFF,aAAazuC,KAAKxN,OAAOyC,SAASgL,YAAayuC,EAAAA,EAAAA,OAA2D,IAAlClvB,KAAKmvB,0BACtE,QAAVH,EAAAhvB,KAAKvxB,aAAK,IAAAugD,OAAA,EAAVA,EAAY9oB,sBAAuBlG,KAAKkM,SAAS,CAAEhG,qBAAqB,KAE7D,QAAX+oB,EAACjvB,KAAKvxB,aAAK,IAAAwgD,IAAVA,EAAY/oB,sBAAuBlG,KAAKkM,SAAS,CAAEhG,qBAAqB,GAC3E,IACD5F,GAAA,+BAEwB,IAInBttB,OAAOo8C,gBAAkBpvB,KAAKrB,SACzB3rB,OAAOo8C,eAAevpB,MAEtB,IAEVvF,GAAA,+BAEyBkM,IACnBxM,KAAK3uB,MAAMm7C,sBACdxsB,KAAKkM,SAAS,CAAEM,cAClB,IACDlM,GAAA,4BAEsBwlB,IACrB,OAAQA,GACN,KAAKxF,GAAAA,GAAAA,QACHtgB,KAAKz3B,MAAM8mD,gBAAgBC,SAC3B,MACF,KAAKhP,GAAAA,GAAAA,eACL,KAAKA,GAAAA,GAAAA,wBACHtgB,KAAKz3B,MAAMgnD,wBAAwBr+C,OACnC,MACF,QACE,OACJ,IACDovB,GAAA,yCAEkC,KACjCN,KAAKz3B,MAAMgnD,wBAAwB7gD,MAAM,IAC1C4xB,GAAA,0CAEmC,KAC9BN,KAAK3uB,MAAMiI,wBAAwBopC,gBAAkBxoC,EAAAA,GAAAA,KACvD8lB,KAAKz3B,MAAMgW,6BAEbyhB,KAAK3uB,MAAMqC,iBAAiBvB,SAASzF,GAAYA,EAAQiH,aAAejH,EAAQoO,mBAChFklB,KAAKwvB,kCAAkC,IACxClvB,GAAA,8BAEwBmvB,IAA8B,IAAA/tC,EAAAC,EACrD,MAAM+tC,EAAS,IAAK1vB,KAAKvxB,MAAMoyC,gBAAiB,CAAC4O,IAAazvB,KAAKvxB,MAAMoyC,gBAAgB4O,IAEzF,OAAQA,GACN,KAAK3O,GAAAA,GAAAA,aACH9gB,KAAKwlB,uBAAuBxZ,GAAAA,EAAAA,OAC5BhM,KAAK2vB,mBAAmBD,EAAO5O,GAAAA,GAAAA,eAC/B9gB,KAAK4vB,mBAAmBF,GACxB,MACF,KAAK5O,GAAAA,GAAAA,iBACH9gB,KAAKouB,+BAA+BsB,EAAO5O,GAAAA,GAAAA,mBAC3C9gB,KAAK3uB,MAAM0K,gBAAgB,2BAA4B2zC,EAAO5O,GAAAA,GAAAA,mBAC9D,MACF,KAAKA,GAAAA,GAAAA,aACH9gB,KAAKwlB,uBAAuBxZ,GAAAA,EAAAA,OAC5BhM,KAAK4vB,mBAAmBF,GACxB,MACF,KAAK5O,GAAAA,GAAAA,sBACH9gB,KAAK3uB,MAAM0K,gBAAgB,gCAAiC2zC,EAAO5O,GAAAA,GAAAA,yBAClB,IAAjD4O,EAAO5O,GAAAA,GAAAA,wBAAmD9gB,KAAKwlB,uBAAuBxZ,GAAAA,EAAAA,OAM1FhM,KAAKkM,SAAS,CAAE2U,gBAAiB6O,IACtB,QAAXhuC,GAAAC,EAAA3O,QAAO4O,YAAI,IAAAF,GAAXA,EAAAG,KAAAF,EAAc,QAAS,2BAA4B,CACjDG,eAAgB4tC,EAAOD,GAAa,SAAW,UAC/CI,YAAaJ,GACb,IACHnvB,GAAA,2BAEqBugB,IACpB7gB,KAAK3uB,MAAM0K,gBACT,0BACG8kC,EAAgBC,GAAAA,GAAAA,gBAAiCD,EAAgBC,GAAAA,GAAAA,eACrE,IACFxgB,GAAA,kCA6L4Bn8B,IAC3B67B,KAAKkM,SAAS,CAAEjH,uBAAwB9gC,GAAQ,IACjDm8B,GAAA,uBAsEiBrT,IAA2B,IAAA6iC,EAC3C9vB,KAAK+vB,eACqB,QAA1BD,EAAI9vB,KAAK3uB,MAAM2K,mBAAW,IAAA8zC,GAAtBA,EAAwBl7B,IAAI3H,IAC9B+S,KAAK3uB,MAAM0K,gBAAgB,cAAeikB,KAAK3uB,MAAMyU,SAASkqC,OAChE,IACD1vB,GAAA,sBAEe,CAACxb,EAA2Buc,KAC5B,YAAVA,IAGJrB,KAAK+vB,eAEDjrC,GAAyB,WAAVuc,GACjBrB,KAAKkM,SAAS,CACZxS,SAAU5U,EAAY4U,SACtBJ,QAASxU,EAAYwU,QACrB9T,OAAQV,EAAYU,SAExB,IA3iBAwa,KAAK3uB,MAAQ9I,EAAMiL,iBACnB,MAAM/G,EAASlE,EAAMkE,OAErBuzB,KAAKla,OAAS,GACd,IAAK,MAAMmqC,KAAexjD,EAAOqZ,OAAQ,CACvC,MAAMoqC,EAA8C3lD,IAAM,CAAC,EAAG0lD,GAE9DC,EAAgBv8B,aAAeqM,KAAK3uB,aAC7B6+C,EAAgB1pC,MACW,MAA9B0pC,EAAgB/sB,aAClB+sB,EAAgB/sB,WAAanD,KAAK3uB,MAAM2xB,mBAEP,MAA/BktB,EAAgBhqC,cAClBgqC,EAAgBhqC,aAAc,GAE3BgqC,EAAgBjqC,YACnBiqC,EAAgBjqC,UAAY,MAE9BiqC,EAAgB5D,qBAAuBtsB,KAAK3uB,MAAMi7C,qBAClD4D,EAAgBz7B,YAAa,EAC7B,MAAMpjB,EAAQ2uB,KAAK3uB,MAAMyU,SAASvK,OAAmB20C,GACrDlwB,KAAKla,OAAOtT,KAAK,CAAEnB,QAAO5E,OAAQwjD,GACpC,CACAjwB,KAAK3uB,MAAM0K,gBAAgB,cAAeikB,KAAK3uB,MAAMyU,SAASgxB,SAE9D9W,KAAKvxB,MAAQ,CACXirB,SAAUsG,KAAK3uB,MAAMqoB,SACrBJ,QAAS0G,KAAK3uB,MAAMioB,QACpB9T,OAAQwa,KAAK3uB,MAAMmU,OACnByf,uBAAwB,KACxBuH,WAAYR,GAAAA,EAAAA,MACZ9F,qBAAqB,EACrBiqB,qBAAqB,EACrBtP,gBAAiB,CACf,CAACC,GAAAA,GAAAA,wBAAuC,EACxC,CAACA,GAAAA,GAAAA,kBAAkC9gB,KAAKowB,qCACxC,CAACtP,GAAAA,GAAAA,eAA8B,EAC/B,CAACA,GAAAA,GAAAA,eAA8B,GAGrC,CAEAtgB,oBACE,GAAIR,KAAKvxB,MAAMirB,SAAU,CACvB,MAAM22B,EAAS,GACfr9C,OAAO+rB,iBAAiB,SAAU52B,IAChC,MAAMV,EAAWu4B,KAAK3uB,MAAMi/C,uBAC5B,GAAInoD,EAAEooD,UAAYF,GAAU5oD,EAAU,CACpC,MAAMiF,EAAUs7B,EAAAA,EAAAA,gBAA2C,WAAYvgC,EAASyT,WAChF,GAAIxO,EAAS,CACX,MAAMiS,EAAcjS,EAAQuO,OAC5BvO,EAAQoO,eAAe,CAAEgE,UAAWC,EAAAA,GAAAA,SACpCJ,EAAYxB,mBACd,CACF,IAEJ,CAEI6iB,KAAKrB,WACPqB,KAAK3uB,MAAMkU,SAASirC,cAAc1qD,KAAOk6B,KAAK3uB,MAAMkU,SAASirC,cAAcC,WAG7EzwB,KAAKkV,gBAELlV,KAAK3uB,MAAMiyB,KAAK,SAAUtD,KAAKkV,eAC/BlV,KAAK3uB,MAAMyU,SAASwd,KAAK,UAAWtD,KAAK0wB,gBAEzC1wB,KAAK2uB,qBACL37C,OAAO+rB,iBAAiB,SAAUiB,KAAK2wB,gBACvC39C,OAAO+rB,iBAAiB,oBAAqBiB,KAAK4wB,yBAE9C5wB,KAAKrB,WACPqB,KAAK6wB,2BACL79C,OAAO+rB,iBAAiB,WAAYiB,KAAK6wB,0BAE7C,CAEArX,mBAAmB5rB,GACuB,IAAAzgB,EAApCygB,EAAU5U,OAASgnB,KAAKz3B,MAAMyQ,OAC5BgnB,KAAK3uB,MAAM+L,6BAA+BC,EAAAA,GAAAA,WAC5C2iB,KAAK2wB,iBAEwC,QAA/CxjD,EAAAC,SAASC,cAAc,gCAAwB,IAAAF,GAA/CA,EAAiD2zB,UAGnDd,KAAK2uB,oBACP,CAEAjuB,uBACEV,KAAKuuB,+BAA+BC,QACpCxuB,KAAK3uB,MAAMkyB,OAAO,SAAUvD,KAAKkV,eAEjCliC,OAAOgsB,oBAAoB,SAAUgB,KAAK2wB,gBAC1C39C,OAAOgsB,oBAAoB,oBAAqBgB,KAAK4wB,yBAEjD5wB,KAAKrB,UACP3rB,OAAOgsB,oBAAoB,WAAYgB,KAAK6wB,0BAG9Cr3C,aAAawmB,KAAK0uB,0BAClB1uB,KAAK6uB,gBAAgB9/C,SACrBixB,KAAK3uB,MAAMyJ,gBACb,CA0EA6zC,qBAGE,MAAMmC,EAAyB9wB,KAAK3uB,MAAMnL,MAAQ,IAAM8M,OAAOu3C,YAAcv3C,OAAOu3C,WAAa,IAC7FuG,IAA2B9wB,KAAKvxB,MAAM0hD,qBACxCnwB,KAAKkM,SAAS,CACZikB,oBAAqBW,GAG3B,CA4FAnB,mBAAmBxrD,GACjB67B,KAAK3uB,MAAM0K,gBAAgB,uBAAwB5X,GACnD67B,KAAK3uB,MAAM6b,eAAe/a,SAAS6U,GAAUA,EAAMjL,gBAAgB,uBAAwB5X,IAC7F,CAEA4sD,cAAcC,GACZ,MAAM,WAAExkB,EAAU,gBAAEqU,GAAoB7gB,KAAKvxB,MAC7C,OAAOuiD,EAAKC,iBACV5sD,IAAAA,cAAC6gD,GAAa,CACZ1xC,iBAAkBwsB,KAAK3uB,MACvBm7B,WAAYA,EACZ0V,mBAAoBliB,KAAKwlB,uBACzBrD,qBAAsBniB,KAAKkxB,oBAC3B9O,sBAAuBpiB,KAAKmxB,sBAC5BtQ,gBAAiBA,EACjB0B,iBAAkB1B,EAAgBC,GAAAA,GAAAA,eAAgCD,EAAgBC,GAAAA,GAAAA,gBAGpFz8C,IAAAA,cAACw9C,GAAOn8C,GAAA,CACN8N,iBAAkBwsB,KAAK3uB,MACvBm7B,WAAYA,EACZ0V,mBAAoBliB,KAAKwlB,uBACzBrD,qBAAsBniB,KAAKkxB,oBAC3B9O,sBAAuBpiB,KAAKmxB,sBAC5BtQ,gBAAiBA,EACjB0B,iBAAkB1B,EAAgBC,GAAAA,GAAAA,eAAgCD,EAAgBC,GAAAA,GAAAA,eAC9EkQ,GAGV,CAEArwB,SAAS,IAAAywB,EACP,MAAM,UAAEC,EAAS,QAAEC,GAAYtxB,KAAKz3B,MAAMkE,QACpC,WAAE+/B,EAAU,SAAE9S,EAAQ,QAAEJ,EAAO,oBAAE62B,GAAwBnwB,KAAKvxB,MAC9D8iD,EAAUj4B,EAAQxtB,SAASytB,EAAAA,GAAAA,UAA4BmtB,KAA8B77C,OAAS,EAC9FkH,EAAcy/C,EAAAA,GAAQxxB,KAAK3uB,MAAMmU,QACjCisC,GAAmBzR,EAAAA,EAAAA,IAAoBhgB,KAAKrB,WAC5C,QAAE3sB,GAAYF,GAAyCkuB,KAAK3uB,OAElE,GAAIggD,EAAW,KAAAK,EACb,MAAMC,GAAmBC,EAAAA,EAAAA,IAAoBv0C,EAAAA,GAAAA,WAC7C,OACEhZ,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAAA,OAAKmB,UAAU,8BACXisD,GAIAzxB,KAAK+wB,cAAc,CACjBhP,WAAW,EACXC,cAAc,IAElB39C,IAAAA,cAACogD,GAAkB,CACjBh2C,MAAOuxB,KAAKz3B,MAAMgnD,wBAClB5K,SAAU3kB,KAAK6xB,kCACfnN,SAAU1kB,KAAKwvB,iCACf5K,wBAAyB5kB,KAAKz3B,MAAMsQ,iBACpC7G,QAASA,IAEX3N,IAAAA,cAACkgD,GAAmB,CAACnrB,YAAa4G,KAAKz3B,MAAM8mD,gBAAiB77C,iBAAkBwsB,KAAK3uB,QACrFhN,IAAAA,cAACytD,EAAAA,UAAS,CACRC,QAAM,EACN34C,GAAI4mB,KAAK3uB,MAAM88B,mBACf,cAAY,mBACZ6jB,QAASjgD,EAAYigD,QACrBhO,KAAMjyC,EAAYiyC,MAEjBhkB,KAAKla,OAAOpe,KAAI,CAAAzD,EAAoBiU,KAAK,IAAA+5C,EAAA,IAAxB,MAAE5gD,EAAK,OAAE5E,GAAQxI,EAAA,OACjCI,IAAAA,cAACqwC,GAAK,CACJvtC,IAAKkK,EAAM+H,GACX8iC,YAAU,EACVtvB,WAAY1U,EACZ+U,WAAY5b,EACZ5E,OAAQA,EACRqY,YAAakb,KAAK3uB,MAClBspC,YAAauX,EAAAA,cACbtX,SAA+B,QAAvBqX,EAAElgD,EAAYogD,iBAAS,IAAAF,OAAA,EAArBA,EAAwB/5C,GAClCouB,0BAA2BtG,KAAKsG,0BAChCkG,WAAYA,EACZvH,uBAAwBjF,KAAKvxB,MAAMw2B,uBACnCiB,oBAAqBlG,KAAKvxB,MAAMy3B,oBAChCwV,aAAc1b,KAAKz3B,MAAMmzC,cACzB,KAGNr3C,IAAAA,cAAC4hD,GAAsB,CAACzyC,iBAAkBwsB,KAAK3uB,SAEhDogD,GAAoBE,GACnBttD,IAAAA,cAAC66C,GAAO,CAACC,eAAgBnf,KAAK6uB,gBAAiBlR,UAAWS,GAAAA,EAAAA,aAE3DqT,GACCzxB,KAAK+wB,cAAc,CACjBhP,WAAW,EACXC,cAAc,EACdiP,iBAAkBU,KAEN,QAAfD,EAAA1xB,KAAKz3B,MAAMyQ,YAAI,IAAA04C,OAAA,EAAfA,EAAiBj2C,OAChBpX,IAAAA,cAAA,OAAKmB,UAAU,8DACbnB,IAAAA,cAAA,OAAKmB,UAAU,wEACZw6B,KAAKz3B,MAAMyQ,KAAKyC,OAM7B,CAEA,MAAM6qC,GAAc38B,EAAAA,EAAAA,MACdyoC,EAAgB14B,GAAYJ,EAAQxtB,SAASytB,EAAAA,GAAAA,OAC7C84B,GAActe,EAAAA,EAAAA,IAAiB/T,KAAK3uB,OAAS+gD,IAAkBjC,EAAsBiC,EAErFE,EAAqBllD,SAASC,cAAc,yBAC5CklD,GAA2B,QAAfnB,EAAApxB,KAAKz3B,MAAMyQ,YAAI,IAAAo4C,OAAA,EAAfA,EAAiBluC,OACjC8c,KAAK3uB,MAAM+L,6BAA+BC,EAAAA,GAAAA,WACxChZ,IAAAA,cAAA,MAAImB,UAAU,oBAAkB,kBAAAhB,OAAoBw7B,KAAKz3B,MAAMyQ,KAAKkK,OAGxE,OACE7e,IAAAA,cAAAA,IAAAA,SAAA,KACGiuD,EAAqBlxB,EAAAA,aAAsBmxB,EAAWD,GAAsBC,EAC7EluD,IAAAA,cAAC4iD,GAA6B,CAACxoB,cAAe8yB,EAASzsC,YAAakb,KAAK3uB,QACxEghD,GACChuD,IAAAA,cAAA,OACE+U,GAAG,uBACH,oBAAmB+2C,EAAsB,EAAI,EAC7C3qD,UAAWmiB,IAAW,CACpB,wBAAyBwoC,EACzB,8BAA+BA,IAAwB7J,EACvD,0CAA2C6J,GAAuB7J,IAEpE,cAAY,wBAEXtmB,KAAK+wB,cAAc,CAClB/O,aAAcmO,EACd7N,oBAAoB,KAI1Bj+C,IAAAA,cAACogD,GAAkB,CACjBh2C,MAAOuxB,KAAKz3B,MAAMgnD,wBAClB5K,SAAU3kB,KAAK6xB,kCACfnN,SAAU1kB,KAAKwvB,iCACf5K,wBAAyB5kB,KAAKz3B,MAAMsQ,iBACpC7G,QAASA,IAEX3N,IAAAA,cAACytD,EAAAA,UAAS,CACR14C,GAAI4mB,KAAK3uB,MAAM88B,mBACf,cAAY,mBACZ6jB,QAASjgD,EAAYigD,QACrBhO,KAAMjyC,EAAYiyC,KAClB+N,OAAQT,GAEPtxB,KAAKla,OAAOpe,KAAI,CAAA2Q,EAAoBH,KAAK,IAAxB,MAAE7G,EAAK,OAAE5E,GAAQ4L,EAAA,OACjChU,IAAAA,cAACqwC,GAAK,CACJvtC,IAAKkK,EAAM+H,GACXwT,WAAY1U,EACZ+U,WAAY5b,EACZ5E,OAAQA,EACR+/B,WAAYA,EACZ1nB,YAAakb,KAAK3uB,MAClB6qC,WAAYoV,EACZhrB,0BAA2BtG,KAAKsG,0BAChCrB,uBAAwBjF,KAAKvxB,MAAMw2B,uBACnCiB,oBAAqBlG,KAAKvxB,MAAMy3B,oBAChC2T,mBACEsW,EACI,IACEnwB,KAAK+wB,cAAc,CACjB/O,cAAc,EACdM,oBAAoB,SAExB1sC,GAEN,KAGNvR,IAAAA,cAAA,OAAKmB,UAAU,UACfnB,IAAAA,cAAA,OAAKmB,UAAU,SACfnB,IAAAA,cAAA,OAAKyC,MAAO,CAAE0rD,MAAO,UACpBxyB,KAAK3uB,MAAM+L,6BAA+BC,EAAAA,GAAAA,WACzChZ,IAAAA,cAACkiD,GAAuB,CAAC/yC,iBAAkBwsB,KAAK3uB,QAElDhN,IAAAA,cAAC4hD,GAAsB,CAACzyC,iBAAkBwsB,KAAK3uB,QAGrD,CAMA0+C,eACE,MAAMvqC,EAASgsC,EAAAA,GAAQxxB,KAAK3uB,MAAMmU,QAC5BM,EAASka,KAAK3uB,MAAMyU,SAASmJ,MACb,IAAlBnJ,EAAOjb,SAIPib,EAAOjb,OAAS2a,EAAO3Q,MACzBmrB,KAAKyyB,aAAajtC,EAAO3Q,OAChBiR,EAAOjb,OAAS2a,EAAO3Q,OAChCmrB,KAAK0yB,UAAUltC,EAAO3Q,MAAQiR,EAAOjb,QAGvCm1B,KAAK3uB,MACFyU,SACAmJ,MACA9c,SAAQ,CAAC6U,EAAO9O,KAAU,IAAAy6C,EACzB,MAAOC,EAAUC,EAAaC,EAAQC,IACpB,QAAhBJ,EAAAntC,EAAO2sC,iBAAS,IAAAQ,OAAA,EAAhBA,EAAmBz6C,GAChBoO,QAAQ,KAAM,IACdD,MAAM,KACN3e,KAAKsrD,GAAQ9oD,OAAOtB,SAASoqD,OAAS,GACrCC,EAAmB,CAACH,EAAQF,GAAU7nD,OAAO5G,QAAoByR,IAAVzR,IAAuB2uD,EAASF,EAAW,EAClGM,EAAsB,CAACL,EAAaE,GAAWhoD,OAAO5G,QAAoByR,IAAVzR,IAClE4uD,EAAYF,EACZ,EACEM,EAA0BF,EAAmBztC,EAAOw+B,KACpDoP,EAA6BF,EAAsB1tC,EAAOwsC,QAC1DqB,KAAcrzB,KAAK3uB,MAAMnL,MAAQktD,GACjCtX,EAAc9b,KAAK3uB,MAAM+L,6BAA+BC,EAAAA,GAAAA,UAI9D,IAAIi2C,MAHsBxX,EACtB9b,KAAK3uB,MAAMsgB,OACXqO,KAAK3uB,MAAMyU,SAASgxB,QAAQnlB,QAAUqO,KAAK3uB,MAAMsgB,QACdwhC,GAEnCnzB,KAAK3uB,MAAMioB,QAAQxtB,SAASytB,EAAAA,GAAAA,WAA6BuiB,IAC3DwX,GAAatzB,KAAK3uB,MAAMkU,SAASD,cAAciuC,QAAQC,iBAEpDxsC,EAAM9gB,QAAUmtD,GAAYrsC,EAAM2K,SAAW2hC,IAAcD,EAAW,GAAKC,EAAY,GAC1FtsC,EAAM5M,iBAAiB,CAAElU,MAAOmtD,EAAU1hC,OAAQ2hC,GACpD,IAEN,CAEAZ,UAAU79C,GACR,MAAMsP,EAAQ6b,KAAK3uB,MAAMyU,SAASkqC,OAAO7rC,QACzC,IAAKA,EAAO,OACZ,MAAM1X,EAAS,IACVuzB,KAAK3uB,MAAMyU,SAASkqC,OAAOvqC,WAC9B8O,WAAY,KACZZ,aAAcqM,KAAK3uB,MACnBskB,YAAaxR,EAAMwR,YACnBD,UAAWvR,EAAMuR,WAEnB,IAAK,IAAIrf,EAAI,EAAGA,EAAIxB,EAAOwB,IAAK,CAC9B,MAAMhF,EAAQ2uB,KAAK3uB,MAAMyU,SAASvK,OAAmB9O,GACrDuzB,KAAKla,OAAOtT,KAAK,CAAEnB,QAAO5E,UAC5B,CACF,CAEAgmD,aAAagB,GACX,KAAOzzB,KAAK3uB,MAAMyU,SAASjR,QAAU4+C,GAAa,CAClCzzB,KAAK3uB,MAAMyU,SAASkqC,OAC5Bl1C,iBACNklB,KAAKla,OAAO4tC,KACd,CACF,EAyBK,MAAMC,GAAuBC,KFtnBK3f,GAAoB1rC,IAC3DlE,IAAAA,WAAgB,KACd,MAiBMwvD,EAA0BjlD,KAjBNklD,KACxB,MAAMC,EAAY7vC,GAAAA,EAAAA,MAEZ8vC,EADYtf,GAAAA,EAAAA,MACeiZ,SAAS3mC,GAAUA,EAAM0N,iBAE1Dq/B,EAAU5hD,SAASgS,KAEd6vC,EAAe7oD,MAAM8oD,GAAcA,EAAUr/B,IAAIzQ,OACjDA,EAAMC,YACPD,EAAME,WAAa,GACnBF,EAAME,UAAY7L,KAAKC,MAdE,KAgBzB0L,EAAMoS,SACR,GACA,GAGwD,KAG5D,OADArS,GAAAA,EAAAA,KAAW,SAAU2vC,GACd,KACLA,EAAwB9kD,SACxBmV,GAAAA,EAAAA,OAAa,SAAU2vC,EAAwB,CAChD,GACA,IAEIxvD,IAAAA,cAAC4vC,EAAc1rC,MGhCQ0rC,GAAoB1rC,IAClD,MAAMgnD,GAA0Bz+C,EAAAA,EAAAA,kBAC1Bu+C,GAAkBv+C,EAAAA,EAAAA,gBAAe,CAAEC,OAAO,IAEhD,OAAO1M,IAAAA,cAAC4vC,EAASvuC,GAAA,CAAC6pD,wBAAyBA,EAAyBF,gBAAiBA,GAAqB9mD,GAAS,GDynBnH4iD,IE3jBK,SACLlX,GAEA,OAAO,SAA0B1rC,GAC/B,MAAM,kBAAE2rD,GAnEZ,WACE,MAAMC,EAA0B9vD,EAAAA,OAAa+I,SAASiC,QAE9CxD,QAASqoD,GAAsB7vD,EAAAA,QAAcmP,IACnD,MAAMsS,EAAStS,EACZ0Z,eACA/gB,QACC,CAACC,EAAKP,IACAO,EAAIjB,MAAKlH,IAAA,IAAC,OAAEoO,GAAQpO,EAAA,OAAKoO,IAAWxG,EAAQwG,MAAM,IAC7CjG,EAEF,IAAIA,EAAK,CAAEiG,OAAQxG,EAAQwG,OAAQgT,UAAWxZ,EAAQwZ,UAAWrF,WAAYnU,EAAQmU,cAE9F,IAEDtY,KAAKsf,IACJ,MAAM,OAAE3U,EAAM,UAAEgT,EAAS,WAAErF,GAAegH,EACpCP,EAASvC,GAAAA,EAAAA,QACZC,GACCA,EAAM9R,SAAWA,EAAOiU,QAAQ,IAAK,KACrCnC,EAAMkB,YAAcA,GACpBlB,EAAMnE,aAAeA,GACrBxM,EAAiBkT,SAASvC,EAAMwC,UAEpC,GAAIF,EAAO5b,OAAS,EAAG,CACrB,MAAM,UAAE2iB,EAAS,WAAExN,EAAU,WAAEo0C,EAAU,UAAEC,EAAS,KAAE7rD,GAASie,EAAO,GACtE,IAAI6tC,EACJ,OAAK9mC,GAGa,OAAd6mC,IACFC,EAAiD,KAA7B9mC,EAAY6mC,EAAY,IAE3B,OAAfD,GAAuBA,IAAe5mC,IACxC8mC,EAAkD,KAA9BF,EAAa5mC,EAAY,IAExC,GAAPhpB,OAAUgE,GAAQ6J,EAAM,KAAA7N,OAAI+oB,GAAAA,GAAAA,MAAW,CACrCppB,MAAOqpB,EACPA,YACAxN,aACAu0C,oBAAgB3+C,IAChB,KAAApR,OAAI8vD,EAAoB,EAAI,IAAM,KAAG9vD,OAAG+oB,GAAAA,GAAAA,MAAW,CACnDppB,MAAO8F,KAAK+xB,IAAIs4B,GAChBC,eAAgB,IAChB,MAhBO,IAiBX,CACA,OAAO,IAAI,IAEZz6C,QAAQkN,GAAoB,OAAVA,IAErB,GAAIlB,GAAUA,EAAOjb,OAAS,EAAG,CAC/B,MAAMwE,EAAQyW,EAAOnQ,KAAK,OACtBvI,SAASiC,QAAUA,IACrBjC,SAASiC,MAAQA,EAErB,MAAWjC,SAASiC,QAAU8kD,EAAwBtoD,UACpDuB,SAASiC,MAAQ8kD,EAAwBtoD,QAC3C,IAGF,MAAO,CAAEqoD,oBACX,CAMkCM,GAExBC,EAAqBpwD,EAAAA,aAAkB,KAC3C6vD,EAAkB3rD,EAAMiL,iBAAiB,GACxC,CAACjL,EAAMiL,iBAAkB0gD,IAc5B,OAZA7vD,EAAAA,WAAgB,KACd,GAAIkE,EAAMiL,iBAAiB4J,6BAA+BC,EAAAA,GAAAA,UAKxD,OAJA9U,EAAMiL,iBAAiBsS,SAASwd,KAAK,SAAUmxB,GAE/CA,IAEO,KACLlsD,EAAMiL,iBAAiBsS,SAASyd,OAAO,SAAUkxB,EAAmB,CAExE,GACC,CAAClsD,EAAMiL,iBAAkBihD,IAErBpwD,EAAAA,cAAC4vC,EAAc1rC,EACxB,CACF,INuJO,SACL0rC,GAIA,MAAM0f,EAnBR,SACE1f,GAEA,OAAO,SAA0B1rC,GAC/B,MAAM,OAAEsI,EAAM,gBAAEu5C,GAAoB5B,GAAoBjgD,EAAMiL,kBAC9D,OACEnP,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAACsjD,GAAe,CAACl5C,MAAOoC,EAAQ+2C,eAAgBwC,IAChD/lD,IAAAA,cAAC4vC,EAAc1rC,GAGrB,CACF,CAO+BmsD,CAAmCzgB,GAChE,OAAO,SAA0B1rC,GAC/B,MAAM,GAAEsiB,IAAOrJ,EAAAA,GAAAA,KACTs6B,EAAcvzC,EAAMiL,iBAAiB4J,6BAA+BC,EAAAA,GAAAA,UACpEkD,EAAchY,EAAMiL,iBAAiB4J,6BAA+BC,EAAAA,GAAAA,UACpE0+B,EAA2B,CAC/B1+B,EAAAA,GAAAA,YACAA,EAAAA,GAAAA,UACAA,EAAAA,GAAAA,YACAvR,SAASvD,EAAMiL,iBAAiB4J,4BAClC,OAAI0+B,GAAgBv7B,GAAsB,MAAPsK,GAAekxB,EACzC13C,IAAAA,cAACsvD,EAAyBprD,GAG5BlE,IAAAA,cAAC4vC,EAAc1rC,EACxB,CACF,IOrQO,SACL0rC,GAEA,OAAO,SAA0B1rC,GAC/B,MAAMiL,GAAmBsF,EAAAA,GAAAA,GAAcvQ,EAAMiL,iBAAkB,CAAEuF,gBAAiB,CAAC,UACnF,OAAO1U,IAAAA,cAAC4vC,EAASvuC,GAAA,GAAK6C,EAAK,CAAEyQ,KAAMxF,aAAgB,EAAhBA,EAAkBwF,OACvD,CACF,GHynBE0zC,IhE/hBmCzY,GAAoB1rC,IACvD,MAAM,2BAAEgW,EAA0B,iBAAE1F,GAAqBmG,GAAmBzW,EAAMiL,kBAElF,OACEnP,IAAAA,cAAC4vC,EAASvuC,GAAA,GAAK6C,EAAK,CAAEgW,2BAA4BA,EAA4B1F,iBAAkBA,IAAoB,GgEohBpF+6C,CASlC3F,IIvnBK,SAAS0G,GAAW1wD,GAAyE,IAAxE,OAAEwI,EAAM,aAAEivC,EAAY,oBAAEkZ,GAAsB,GAAwB3wD,EAChG,MAAM4wD,EAAUD,EAAsBE,EAAAA,oBAAsBzwD,IAAAA,SAC5D,OACEA,IAAAA,cAACwwD,EAAO,KACNxwD,IAAAA,cAACoM,EAAyB,KACxBpM,IAAAA,cAACsvD,GAAoB,CAAClnD,OAAQA,EAAQivC,aAAcA,KAI5D,CA6BO,MAAMqZ,IAA6BtoC,EAAAA,EAAAA,IA3BnC,SAAsCpU,GAIK,IAJJ,OAC5C5L,EAAM,aACNivC,EAAY,cACZkP,GAC8CvyC,EAC9C,MAAOwU,IAAgBtE,EAAAA,EAAAA,GAAe,IACjCuE,EAAAA,EACHC,gBAAgB,KAEZ,oBAAEioC,EAAmB,0BAAEC,EAAyB,mBAAEC,GACtDroC,EAAaG,4BAEf,OACE3oB,IAAAA,cAACoM,EAAyB,KACvBhE,GACCpI,IAAAA,cAACsvD,GAAoB,CACnBxsD,IAAK+tD,EACLzoD,OAAQwoD,EAA0B,CAAEE,SAAU1oD,IAC9CivC,aAAcA,EACdiP,2BAA4BqK,EAC5BpK,cAAeA,IAKzB,IC/CMwK,GAASx2B,EAAAA,GAAAA,SACTy2B,GAAwB,qBAEvB,SAAStmC,KACd,MAAOumC,EAAcC,GAAmBlxD,EAAAA,UAAe6qD,EAAAA,EAAAA,OACjDsG,GAAoBhsC,EAAAA,EAAAA,IAAqBpc,SAASqc,iBAClDgsC,GAAiBC,EAAAA,EAAAA,MAEjB5lD,EAAUzL,EAAAA,QAAa,MACvB6qD,EAAAA,EAAAA,MACFuG,EAAe5zC,KAAKzU,UAEpBooD,EAAkB3zC,KAAKzU,SAASqc,gBAClC,IAuBF,OApBAplB,EAAAA,WAAgB,KACd,MAAMsxD,EAAkBA,KAClBP,MACElG,EAAAA,EAAAA,MACF9hD,SAASE,KAAKuzB,UAAUI,IAAIo0B,IAE5BjoD,SAASE,KAAKuzB,UAAUC,OAAOu0B,KAGnCE,GAAgBrG,EAAAA,EAAAA,MAAsB,EAKxC,OAFA9hD,SAAS2xB,iBAAiB,yBAA0B42B,GACpDvoD,SAAS2xB,iBAAiB,mBAAoB42B,GACvC,KACLvoD,SAAS4xB,oBAAoB,yBAA0B22B,GACvDvoD,SAAS4xB,oBAAoB,mBAAoB22B,EAAgB,CAClE,GACA,IAEEH,EAGHnxD,EAAAA,cAACwL,EAAAA,OAAM,CACLU,MAAM,aACN,cAAY,0BACZkU,YAAa6wC,EAAe,iBAAmB,aAC/CtpD,aAAa,iBACbqD,MAAOimD,EAAe,mBAAqB,cAC3CxlD,QAASA,EAAQjE,SAEhBypD,EAAe,mBAAqB,eAXV,IAcjC,C,0BC3CA,MAAMM,GCTC,SACLC,GAEA,IADAn3C,EAA+E/E,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,GAElF,OAAOk8C,EAAIz+C,MAAK,CAACC,EAAGC,IAClBoH,EAAQvS,QAAO,CAACC,EAAK5E,KACnB,MAAM,OAAEsuD,EAAM,cAAEC,EAAgBC,EAAAA,GAAAA,KAAuBxuD,EACjDyuD,EAAsBF,IAAkBC,EAAAA,GAAAA,IAAqB,GAAK,EACxE,OAAe,IAAR5pD,GAAaiL,EAAEy+C,GAAUx+C,EAAEw+C,IAAWG,EAAsB7pD,CAAG,GACrE,IAEP,CDF2B8pD,CACzBvrD,OAAOm0C,QAAQ0S,EAAAA,IAAS9pD,KAAIzD,IAAA,IAAEkD,EAAKhD,GAAMF,EAAA,MAAM,IAAKE,EAAOgD,MAAK,IAChE,CAAC,CAAE2uD,OAAQ,WAAa,CAAEA,OAAQ,WAClCpuD,KAAI2Q,IAAA,IAAC,IAAElR,GAAKkR,EAAA,OAAKlR,CAAG,IAEf,SAASgvD,GAAmBt5C,GAAoC,IAAnC,MAAExL,GAA+BwL,EACnE,MAAMpH,GAAWmV,EAAAA,GAAAA,eACX6I,GAAWC,EAAAA,GAAAA,eACX0iC,GAAc50C,EAAAA,GAAAA,GAAkB/L,EAAS6M,QACzC9O,GAAmBsF,EAAAA,GAAAA,GAAczH,EAAO,CAAE0H,gBAAiB,CAAC,SAAU,qBACtE,gBAAEs9C,IAAoBC,EAAAA,GAAAA,GAAsB,CAAE9iD,qBAC9C/E,GAAQqV,EAAAA,EAAAA,kBAAiB,CAAEJ,UAAW,SAAU6yC,YAAa,eAEnE,OACElyD,EAAAA,cAACmgB,EAAAA,SAAQ,CACP/V,MAAOA,EACP,aAAW,SACXvK,MACEG,EAAAA,cAACwL,EAAAA,OAAM,CACLU,MAAM,aACN,cAAY,sBACZkU,YAAW,SAAAjgB,OAAW4xD,EAAY9/C,GAClCtK,aAAa,iBACbqD,MAAM,iBACP,WAKHhL,EAAAA,cAAA,WACEA,EAAAA,cAAA,OAAKmB,UAAU,QACZowD,GAAmBluD,KAAK8d,GACvBnhB,EAAAA,cAACsgB,EAAAA,aAAY,CACXxd,IAAKqe,EACLd,WAAW,SACX,8BAAAlgB,OAA6BghB,GAC7B1V,QAASA,KACP2jB,EAAS4iC,EAAgB,CAAE7wC,WAAU,GAGvCnhB,EAAAA,cAAC2kB,EAAAA,KAAI,CAACxgB,KAAI,SAAAhE,OAAWghB,GAAUhgB,UAAU,sCAI/CnB,EAAAA,cAACmyD,EAAAA,kBAAiB,MAClBnyD,EAAAA,cAAA,OAAKmB,UAAU,kBACbnB,EAAAA,cAAA,OAAKmB,UAAU,yCACbnB,EAAAA,cAACuB,EAAAA,UAAS,CAACE,KAAK,SAAQ,UAEzB2wD,GAAAA,GAAAA,KAAuB/jD,IAAsB,IAArB,MAAEvO,EAAK,MAAED,GAAOwO,EACvC,MAAMgkD,EAAoBljD,EAAiBmjD,qBAAqBxyD,GAChE,OACEE,EAAAA,cAACwL,EAAAA,OAAM,CACL1I,IAAKhD,EACLoM,MAAM,OACNzK,KAAK,UACLiD,OAAQ2tD,EACR,gCAAAlyD,OAA+BL,GAC/B2L,QAASA,KAAM,IAAA4R,EAAAC,EACbnO,EAAiBojD,kBAAkBzyD,GAAQuyD,GACtCA,GAA8B,QAAXh1C,GAAAC,EAAA3O,QAAO4O,YAAI,IAAAF,GAAXA,EAAAG,KAAAF,EAAc,QAAS,OAAQ,CAAEkuC,YAAa1rD,GAAQ,GAG/ED,EACM,MAOvB,CE5EO,SAAS2yD,GAAiB5yD,GAAoC,IAAnC,MAAEoN,GAA+BpN,EACjE,MAAMuP,GAAmBsF,EAAAA,GAAAA,GAAczH,EAAO,CAAE0H,gBAAiB,CAAC,WAC5D+9C,EAA6B,SAAhBzlD,EAAMd,MAezB,OAAKiD,EAKHnP,EAAAA,cAACwL,EAAAA,OAAM,CACLU,MAAM,aACNmU,WAAW,SACX,cAAY,qBACZrV,MAAOynD,EAAa,oBAAsB,mBAC1ChnD,QAvBYA,KACd,MAAMS,EAAQumD,EAAa,QAAU,OACrCtjD,EAAiB4G,iBAAiB,CAAE7J,QAAOgV,UAAUwxC,EAAAA,GAAAA,gBAAevjD,EAAkBjD,KACtFiD,EAAiBzF,QAAQ,QAASyF,GAClCgP,MAAM,iDAADhe,OAAkD+L,IAAS6d,OAAM,SAElE0oC,EACF1pD,SAASqc,gBAAgBoX,UAAUC,OAAO,QAE1C1zB,SAASqc,gBAAgBoX,UAAUI,IAAI,OACzC,EAcExc,YAAaqyC,EAAa,YAAc,aAVnC,IAaX,CC1BA,MAAME,GAAc,CAClB,CAAElZ,UAAWmZ,IAAUC,iBAAiB,EAAOC,WAAY,YAC3D,CAAErZ,SAAU,IAAKoZ,iBAAiB,EAAOC,WAAY,SACrD,CAAErZ,SAAU,IAAKoZ,iBAAiB,EAAOC,WAAY,QACrD,CAAErZ,SAAU,IAAKoZ,iBAAiB,EAAMC,WAAY,SAU/C,SAASC,GAA0BnzD,GAA2E,IAAA2X,EAAA,IAA1E,MAAEvK,EAAK,eAAEgmD,EAAiBA,SAAQ,WAAEC,GAAoCrzD,EACjH,MAAM8N,GAAc+G,EAAAA,GAAAA,GAAczH,EAAO,CAAE0H,gBAAiB,CAAC,UAE7D,OACE1U,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAA,OAAKmB,UAAU,oCACbnB,EAAAA,cAACgf,GAAa,CAAChS,MAAOU,EAAaxB,MAAM,cAAa,UAIxDlM,EAAAA,cAAA,OAAKmB,UAAU,gDACbnB,EAAAA,cAAC6kB,GAAU,CAACC,KAAM9X,EAAM+L,2BAA4B7M,MAAM,aAAa/K,UAAU,iBAAgB,cAGjGnB,EAAAA,cAAC8xD,GAAmB,CAAC9kD,MAAOU,IAC5B1N,EAAAA,cAAC0qB,GAAgB,MAChBuoC,GACCjzD,EAAAA,cAAC+jB,GAAO,CAAC/W,MAAOU,EAAa,cAAY,wBAAwBxB,MAAM,cAAa,SAItFlM,EAAAA,cAACwyD,GAAiB,CAACxlD,MAAOU,IAC1B1N,EAAAA,cAACwL,EAAAA,OAAM,CACL6U,WAAW,SACXD,YAAY,gBACZlU,MAAM,aACN,cAAY,0BACZlB,MAAM,WACN7J,UAAU,kBACVsK,QAASunD,EACTttD,SAA0B,QAAlB6R,EAAE7J,EAAYiH,YAAI,IAAA4C,OAAA,EAAhBA,EAAkBxC,KAE9B/U,EAAAA,cAACkzD,EAAAA,KAAI,CACHn+C,GAAG,OACHo+C,eAAe,SACfhyD,UAAU,mDACViyD,YAAaT,MAKvB,CAEO,MAAMU,GAAoBrzD,EAAAA,KAC/B+yD,IACA,CAACxpC,EAAWC,IACVD,EAAUvc,QAAUwc,EAAUxc,OAC9Buc,EAAUypC,iBAAmBxpC,EAAUwpC,gBACvCzpC,EAAU0pC,aAAezpC,EAAUypC,aCwChC,MAAMK,IAA0BlrC,EAAAA,EAAAA,IAtGvC,SAAmCxoB,GAkBhC,IAlBiC,KAClC6B,EAAO,UAAS,UAChBN,EAAY,iBAAgB,qBAC5BoyD,EAAoB,UACpB3uC,EAAS,kBACT4uC,EAAiB,wBACjBC,GAA0B,EAAK,kBAC/Bn/B,EAAoBA,SAAQ,kBAC5BG,EAAoBA,UAUrB70B,EACC,MAAO4oB,IAAgBtE,EAAAA,EAAAA,GAAe,IACjCuE,EAAAA,EACHC,gBAAgB,KAEZ,iBAAEvZ,GAAqBqZ,EAAaG,4BACpC2U,EAAsBt9B,IAAAA,SAAc,SAAAqoB,EAAA,OAAyC,QAAzCA,EAAMlZ,aAAgB,EAAhBA,EAAkB0Z,eAAe,UAAE,IAAAR,EAAAA,EAAI,IAAI,GAAE,CAAClZ,KACxF,mBAAE2jB,EAAkB,wBAAEC,IAA4BC,EAAAA,EAAAA,uBAAsBpO,GACxEgE,GAAanU,EAAAA,GAAAA,GAAc6oB,EAAqB,CACpD5oB,gBAAiB,CAAC,YAAa,gBAE3B,WAAEiH,EAAaM,EAAAA,GAAAA,QAAqB2M,aAAU,EAAVA,EAAY9I,UAAW,CAAC,GAC5D,UAAEmE,GAAc8K,GAAiB,CACrCnG,aACAuG,cAAeokC,KAGX,WACJtgC,EAAU,8BACVC,EAA6B,wBAC7BC,EAAuB,wBACvBC,EAAuB,WACvBrT,EAAU,gCACVsT,IACEC,EAAAA,GAAAA,GAAmC,CAAE1K,aAAYhE,eAC/C,eAAE2O,EAAc,2BAAEC,EAA0B,sBAAEC,EAAqB,sBAAEC,IACzEC,EAAAA,EAAAA,0BAAyB,CACvBhY,aACAsX,aACAW,cAAeV,IAGbiB,EAAkBf,EAAwB,CAAExO,YAAWwP,YAAaxL,aAAU,EAAVA,EAAYhH,UAAWjG,eAC3FuY,EAAkBf,EAAwBvO,GAUhD,OACE5kB,IAAAA,cAAAA,IAAAA,SAAA,KACEA,IAAAA,cAAC60B,EAAAA,aAAY,CACXjQ,UAAWA,EACXnjB,KAAMA,EACN8mB,WAAY,EACZtJ,UAAUqG,EAAAA,EAAAA,MAAsB,UAAY,OAC5C4O,gBAAiBA,EACjBC,gBAAiBA,EACjBE,kBAAmBzL,aAAU,EAAVA,EAAY5H,UAC/BuT,kBAAmB3L,aAAU,EAAVA,EAAYhH,UAC/BkR,mBAAoBA,EACpB0B,kBAAkBg/B,QAAAA,EAAqBvvC,GAAY2E,aAAU,EAAVA,EAAY5H,eAAYzP,EAC3EkjB,kBAAoB30B,IAClB2zB,EAAsB3zB,GACtB20B,SAAAA,EAAoB30B,EAAM,EAE5Bw0B,kBAAmBA,EACnBK,0BAA2B3gB,IAAqC,IAApC,MAAElU,GAA6BkU,EACzD+e,EAAwBjzB,EAAM,EAEhCyzD,qBAAsBA,EACtBG,iBAAkB3qD,SAASE,KAC3B9H,UAAWA,EACXuzB,mBAAoB9P,EACpB6uC,wBAAyBA,IAG1B7qC,GACC5oB,IAAAA,cAAC80B,EAAAA,gBAAe,CACdC,YAAavB,EACb5R,UAAWgH,aAAU,EAAVA,EAAYhH,UACvBqR,WAAYA,EACZM,eAzCRriB,eAAuCtH,GACrC,MAAMoqB,EAAqBN,EAAsB9pB,EAAOgY,WACxD,IAAKoS,EAAoB,aAEHX,EAAgCW,IACzCT,EAAeS,EAC9B,EAoCQjU,WAAYA,IAKtB,ICxGA,SAAS4zC,GACPxxC,EACAyxC,EACAv5C,GAEA,GAAuB,QAAnBu5C,EAAUzvD,KAAgB,KAAA0vD,EAC5B,MAAMC,EAAuB,QAAhBD,EAAGx5C,aAAO,EAAPA,EAAS05C,YAAI,IAAAF,EAAAA,EAAI,GACV,IAAnBC,EAAQttD,QACVstD,EAAQ3lD,KAAK,IAEf2lD,EAAQhmD,SAAQ,SAAUkmD,IAf9B,SAA4B7xC,EAA+B6xC,GACzD,OAAO7xC,EAAMrb,MAAKlH,IAAA,IAAC,SAAEoQ,GAAUpQ,EAAA,OAC7BoQ,EAASlJ,MAAMuB,GAAYA,EAAQ7E,OAAS+J,EAAAA,EAAAA,KAAqBlF,EAAQ2rD,OAASA,GAAK,GAE3F,EAYWC,CAAmB9xC,EAAO6xC,IAC7B7xC,EAAMhU,KAAK,CACTmf,OAAQ4mC,EAAAA,GAAAA,UACRlkD,SAAU,CACR,CACExM,KAAM+J,EAAAA,EAAAA,IACNymD,UAKV,GACF,MACE7xC,EAAMhU,KAAK,CACTmf,OAAQ4mC,EAAAA,GAAAA,UACRlkD,SAAU,CACR,CACExM,KAAO,cAAgBowD,EAAUzvD,KACjCyX,OAAQg4C,EAAUO,cAK5B,CAEA,SAASC,GAA4B3xD,GAQnC,MAPqB,CACnB4xD,YAAarQ,EAAAA,GAAAA,YACbsQ,WAAYtQ,EAAAA,GAAAA,WACZuQ,kBAAmBvQ,EAAAA,GAAAA,kBACnBwQ,KAAMxQ,EAAAA,GAAAA,UACNyQ,KAAMzQ,EAAAA,GAAAA,WAEYvhD,EACtB,CAcO,MAAMiyD,GAAwB,SACnC9I,EACA+I,EACAt6C,GAEA,MAAM8H,EAAQypC,EAAYnqC,OAAO,GAAGU,MAC9BQ,EAAQipC,EAAYnqC,OAAO,GAlBnC,IAAsC+f,EAA2BozB,EAoB/DjyC,EAAM6e,OApB8BA,EAoBOmzB,EAASnzB,MAdK,QAAzDozB,EALsB,CACpBC,OAAQpzB,EAAAA,GAAAA,OACRqzB,WAAYrzB,EAAAA,GAAAA,WACZszB,YAAatzB,EAAAA,GAAAA,aAEMD,UAAoC,IAAAozB,EAAAA,EAAInzB,EAAAA,GAAAA,QAgB7DkzB,EAASK,WACNv/C,QAAQm+C,GAAcA,EAAUnmC,WAAawnC,EAAAA,GAAAA,QAC7CnnD,SAAS8lD,IACRD,GAAexxC,EAAOyxC,EAAWv5C,EAAQ,IAG7C,MAAMw8B,EAAW8d,EAAS9d,SAASxzC,KAAI,SAAUyzC,GAAS,IAAAoe,EAAAC,EACxD,MAAO,CACL3xD,KAAO,YAAcszC,EAAQ3yC,KAC7ByX,OAA0B,QAApBs5C,EAAEpe,EAAQqd,kBAAU,IAAAe,EAAAA,EAAI,GAC9B70D,MAAoB,QAAf80D,EAAEre,EAAQz2C,aAAK,IAAA80D,EAAAA,EAAI,GAE5B,IACAhzC,EAAMhU,KAAK,CACTmf,OAAQ4mC,EAAAA,GAAAA,MACRlkD,SAAU,CACR,CACExM,KAAM4wD,GAA4BO,EAASlyD,OAC3Co0C,SAAUA,MAKhB8d,EAASK,WACNv/C,QAAQm+C,GAAcA,EAAUnmC,WAAawnC,EAAAA,GAAAA,QAC7CnnD,SAAS8lD,IACRD,GAAexxC,EAAOyxC,EAAWv5C,EAAQ,IAG7CuxC,EAAYt+B,OAAS3K,EAAM2K,OAAS4mC,EAAAA,GAAAA,OAA6B/xC,EAAM3b,OAAS,GAAK0tD,EAAAA,GAAAA,SACvF,EAEakB,GAAW,SAAkBT,GACxC,MAAMt6C,EAAU,CAAC,EACX8H,EAAgC,GAEtCwyC,EAASK,WACNv/C,QAAQm+C,GAAcA,EAAUnmC,WAAawnC,EAAAA,GAAAA,QAC7CnnD,SAAS8lD,IACRD,GAAexxC,EAAOyxC,EAAWv5C,EAAQ,IAG7C,MAAMw8B,EAAW8d,EAAS9d,SAASxzC,KAAI,SAAUyzC,GAAS,IAAAue,EAAAC,EACxD,MAAO,CACL9xD,KAAO,YAAcszC,EAAQ3yC,KAC7ByX,OAA0B,QAApBy5C,EAAEve,EAAQqd,kBAAU,IAAAkB,EAAAA,EAAI,GAC9Bh1D,MAAoB,QAAfi1D,EAAExe,EAAQz2C,aAAK,IAAAi1D,EAAAA,EAAI,GAE5B,IAiBA,OAhBAnzC,EAAMhU,KAAK,CACTmf,OAAQ4mC,EAAAA,GAAAA,MACRlkD,SAAU,CACR,CACExM,KAAM4wD,GAA4BO,EAASlyD,OAC3Co0C,SAAUA,MAKhB8d,EAASK,WACNv/C,QAAQm+C,GAAcA,EAAUnmC,WAAawnC,EAAAA,GAAAA,QAC7CnnD,SAAS8lD,IACRD,GAAexxC,EAAOyxC,EAAWv5C,EAAQ,IAGtC8H,CACT,C,WC/IA,SAASozC,EAAoBC,GAC5B,IAAI1xD,EAAI,IAAIuO,MAAM,uBAAyBmjD,EAAM,KAEjD,MADA1xD,EAAEkwD,KAAO,mBACHlwD,CACP,CACAyxD,EAAoBhvD,KAAO,IAAM,GACjCgvD,EAAoBE,QAAUF,EAC9BA,EAAoBxgD,GAAK,KACzB2gD,EAAOC,QAAUJ,C,WC8FjB,MAAMK,EAAgBjnD,OAAO6mB,MAAMqgC,WAEnCH,EAAOC,QAAUC,C,WCtGjBF,EAAOC,QAAU,CACfG,MAAO,OACPC,MAAO,OACPC,QAAS,UACTC,YAAa,cACbzuD,QAAS,eACT0uD,OAAQ,CACN,YAAa,UACbC,KAAM,WAERC,KAAM,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,IAAK,CACH,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,OAAQ,CACN,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,MAAO,CACL,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,OAAQ,CACN,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,aAAc,CACZ,GAAI,UACJ,IAAK,WAEPC,KAAM,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,MAAO,CACL,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,QAAS,CACP,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,KAAM,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPV,KAAM,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPW,OAAQ,CACN,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,OAAQ,CACN,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,KAAM,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,W,WC7IT,MAAMC,EAAetoD,OAAO6mB,MAE5BkgC,EAAOC,QAAUsB,C,eChCjB,IAAIC,EAA6BC,EAAQ,MAErCC,EADsCD,EAAQ,WAEM,IAA7CC,EAAuC,QAAmBA,EAAuC,MAAI,CAAC,QAC/C,IAAvDA,EAAuC,MAAU,SAAmBA,EAAuC,MAAU,OAAIF,GACpIxB,EAAOC,QAAUuB,C,6iBCWjB,MAAMG,UAAyC/7C,EAAAA,EAM7C0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YAHf,SAAOA,EAAA,6BAkCS,KAAM,CAAGwE,EAAG,CAAC,KAAM,MAAOC,EAAG,CAAC,KAAM,UA9BzD/E,KAAK27B,cAAgB37B,KAAK27B,cAAcr4B,KAAKtD,MAC7CA,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,QAGT2uB,KAAK6F,MAAM7F,KAAKo8B,uBAClB,CAEAC,cACE,MAAO,CACLtK,OAAQ,CACN7rD,MAAO,EACPxB,MAAOs7B,KAAK4W,yBAAyB0lB,gBAAgBC,OAAO1D,MAGlE,CAIA8C,cAAcznB,GACZ,MAAM,GAAE8nB,EAAE,GAAEE,EAAE,GAAED,EAAE,GAAEE,GAAOn8B,KAAKsL,OAC1BkxB,GAAYC,EAAAA,EAAAA,IAAiB,CAAET,KAAIE,KAAID,KAAIE,OAC3CO,GAAcC,EAAAA,EAAAA,IAAoB,CAAEC,UAAW58B,KAAK+7B,MAAMhK,OAAO7rD,SAAUs2D,IAEjFtoB,EAAQ2oB,UAAUH,EAAY53B,EAAG43B,EAAY33B,GAC7CmP,EAAQ4oB,YACR5oB,EAAQ1lC,IAAI,UAAW,SACvB0lC,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OAE7C,MAAMq4D,EAAQ9yD,KAAK+yD,GAAK,EAGxB9oB,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOT,EAAUR,GAAIQ,EAAUP,IACvC/nB,EAAQgpB,OAAOV,EAAUN,GAAIM,EAAUL,IACvCjoB,EAAQipB,SAER,MAAMC,EAAYnzD,KAAKozD,MAAMb,EAAUL,GAAKK,EAAUP,GAAIO,EAAUN,GAAKM,EAAUR,IAC7EsB,EAAIrzD,KAAK+xB,IARL,GAQa/xB,KAAKszD,IAAIR,IAE1BS,EAASJ,EAAYL,EACrBU,EAAOjB,EAAUR,GAAK/xD,KAAKszD,IAAIC,GAAUF,EACzCI,EAAOlB,EAAUP,GAAKhyD,KAAK0zD,IAAIH,GAAUF,EACzCM,EAASR,EAAYL,EACrBc,EAAOrB,EAAUR,GAAK/xD,KAAKszD,IAAIK,GAAUN,EACzCQ,EAAOtB,EAAUP,GAAKhyD,KAAK0zD,IAAIC,GAAUN,EAE/CppB,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOQ,EAAMC,GACrBxpB,EAAQgpB,OAAOV,EAAUR,GAAIQ,EAAUP,IACvC/nB,EAAQgpB,OAAOW,EAAMC,GACrB5pB,EAAQipB,SACRjpB,EAAQ2oB,WAA2B,EAAjBH,EAAY53B,GAAyB,EAAjB43B,EAAY33B,GAE9C/E,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEAvF,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMC,IAAMl3B,EACjB9E,KAAK+7B,MAAMG,IAAMp3B,EACjB9E,KAAK+7B,MAAME,IAAMl3B,EACjB/E,KAAK+7B,MAAMI,IAAMp3B,CACnB,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EAC1C,MAAT4D,GACFm4B,KAAK+7B,MAAMC,IAAMlkB,EACjB9X,KAAK+7B,MAAME,IAAMr2B,IAEjB5F,KAAK+7B,MAAMG,IAAMpkB,EACjB9X,KAAK+7B,MAAMI,IAAMv2B,EAErB,CAEAkH,SAASnI,GACP,OAAIhB,MAAMs6B,sCACN1wC,EAAAA,GAAAA,kBAAuBoX,EAAK2G,OAAQtL,KAAKsL,SAAW,IAGjD3H,MAAMmJ,SAASnI,GACxB,EACDrE,EAzGKo7B,EAAK,OACKwC,EAAAA,GAAAA,OA0GhBxC,EAAMyC,UAAUC,YAAc,CAC5BpxD,OAAQ,CAAC,CAAEnF,KAAM,OAAQW,KAAM,YAGjC,S,qjBC7GA,MAAM61D,UAAuD1+C,EAAAA,EAc3D0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,2BAZiC,MAAIA,EAAA,YAEpD,SAAOA,EAAA,iBAEa,MAAIA,EAAA,kBAElB,CACXg+B,aAAc,GACdC,kBAAkB,IACnBj+B,EAAA,oBAyGar8B,IAA2E,IAA1E,KAAE6zC,EAAI,KAAElS,GAA6D3hC,EAClF+7B,KAAK2O,OAAOmJ,EAAMlS,EAAK,IACxBtF,EAAA,oCA6C6B,KAAM,IAAAk+B,EAClC,MAAMr6C,EAAkB,QAAbq6C,EAAGx+B,KAAK3uB,aAAK,IAAAmtD,GAAS,QAATA,EAAVA,EAAYx3C,eAAO,IAAAw3C,OAAA,EAAnBA,EAAqBr6C,QACnC,GAAIA,EAAO,CACT,MAAMs6C,EAA2Bz+B,KAAK+7B,MAAMruC,OAAOhmB,KAAI2Q,IAAA,IAAEysB,EAAGC,GAAE1sB,EAAA,MAAK,CAAC8L,EAAMu6C,yBAAyB55B,GAAIC,EAAE,IACzG/E,KAAKxxB,IAAI,CAAEiwD,4BACb,KACDn+B,EAAA,qBAcc,CAACn8B,EAAew6D,IAAmBz0D,OAAOvB,WAAW4kB,EAAAA,GAAAA,MAAW,CAAEppB,QAAOowD,eAAgBoK,OAAUr+B,EAAA,eAEzG,CAACyE,EAAW65B,KACnB,GAAIA,EAAa,EAAG,CAClB,MAAMC,EAAuB50D,KAAK+xB,IAAI/xB,KAAKuwC,MAAMvwC,KAAK60D,MAAM70D,KAAK+xB,IAAI4iC,IAAe,IACpF,OAAIC,EAAuB,EAClB7+B,KAAK++B,aAAah6B,EAAG85B,EAAuB,GAE5C7+B,KAAK++B,aAAah6B,EAAG85B,EAAuB,EAEvD,CAAO,OAAID,EAAa,GACf5+B,KAAK++B,aAAah6B,EAAG,GAEvB/E,KAAK++B,aAAah6B,EAAG,EAAE,IArL9B/E,KAAKg/B,qBAAsBtuB,EAAAA,EAAAA,GAAoBtjC,SAAS6xD,cAAc,WACtEj/B,KAAKk/B,cACP,CAEA7C,cACE,MAAM,gBAAEC,GAAoBt8B,KAAK4W,yBACjC,MAAO,CACLuoB,KAAM7C,EAAgB8C,uBACtBrN,OAAQ,CACN7rD,MAAO,EACPxB,MAAO43D,EAAgBC,OAAOxK,QAEhCsN,kBAAkB,EAEtB,CAEAH,eACEl/B,KAAKs/B,WAAWhB,aAAet+B,KAAK+7B,MAAMoD,KACX,IAA3Bn/B,KAAK+7B,MAAMoD,KAAKt0D,OAClBm1B,KAAKs/B,WAAWf,iBAAgD,OAA7Bv+B,KAAK+7B,MAAMoD,KAAKr1D,MAAM,GAEzDk2B,KAAKs/B,WAAWf,kBAAmB,CAEvC,CAEAgB,sBAIE,OAHIv/B,KAAK+7B,MAAMoD,OAASn/B,KAAKs/B,WAAWhB,cACtCt+B,KAAKk/B,eAEAl/B,KAAKs/B,WAAWf,gBACzB,CAEA5C,cAAcznB,GAAmC,IAAAsrB,EACtB,MAArBx/B,KAAK+7B,MAAMhK,QACb7d,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OAE/CwvC,EAAQ1lC,IAAI,UAAW,SACvB0lC,EAAQ1lC,IAAI,WAAY,SAExB,MAAMixD,EAAY,IAAIC,QAChB,OAAEhyC,GAAWsS,KAAK+7B,MAGxB,IAAI1lD,EACJ,GAHA69B,EAAQ4oB,YACR2C,EAAUxC,OAAOj9B,KAAK6W,GAAGnpB,EAAO,GAAG,IAAKsS,KAAK2/B,GAAGjyC,EAAO,GAAG,KAEtDA,EAAO7iB,OAAS,EAAG,CACrB,IAAKwL,EAAI,EAAGA,EAAIqX,EAAO7iB,OAAS,EAAGwL,IAAK,CACtC,MAAMupD,GAAM5/B,KAAK6W,GAAGnpB,EAAOrX,GAAG,IAAM2pB,KAAK6W,GAAGnpB,EAAOrX,EAAI,GAAG,KAAO,EAC3DwpD,GAAM7/B,KAAK2/B,GAAGjyC,EAAOrX,GAAG,IAAM2pB,KAAK2/B,GAAGjyC,EAAOrX,EAAI,GAAG,KAAO,EACjEopD,EAAUK,iBAAiB9/B,KAAK6W,GAAGnpB,EAAOrX,GAAG,IAAK2pB,KAAK2/B,GAAGjyC,EAAOrX,GAAG,IAAKupD,EAAIC,EAC/E,CACAJ,EAAUK,iBACR9/B,KAAK6W,GAAGnpB,EAAOrX,GAAG,IAClB2pB,KAAK2/B,GAAGjyC,EAAOrX,GAAG,IAClB2pB,KAAK6W,GAAGnpB,EAAOrX,EAAI,GAAG,IACtB2pB,KAAK2/B,GAAGjyC,EAAOrX,EAAI,GAAG,IAE1B,MACE,IAAK,MAAM0pD,KAASryC,EAClB+xC,EAAUvC,OAAOl9B,KAAK6W,GAAGkpB,EAAM,IAAK//B,KAAK2/B,GAAGI,EAAM,KAIlD//B,KAAK+7B,MAAMsD,kBACbI,EAAUO,YAEZhgC,KAAKy/B,UAAYA,EACbz/B,KAAK+7B,MAAMoD,MAAQn/B,KAAKu/B,wBAC1BrrB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMoD,MACpCjrB,EAAQirB,KAAKM,IAED,QAAdD,EAAIx/B,KAAK+7B,aAAK,IAAAyD,GAAQ,QAARA,EAAVA,EAAYzN,cAAM,IAAAyN,GAAlBA,EAAoBt5D,QACtBguC,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQipB,OAAOsC,IAEbz/B,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEA+rB,YACE,MAAOC,EAAQC,GAAUngC,KAAK+7B,MAAMruC,OAAO,IACpC2gB,EAAOC,GAAStO,KAAK+7B,MAAMruC,OAAOsS,KAAK+7B,MAAMruC,OAAO7iB,OAAS,GAEpE,MAAO,CACL,IAAIixD,EAAAA,EACF,SACA,IAAMoE,IACN,IAAMC,GACNngC,KAAKogC,YACLpgC,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,QACA,IAAMztB,IACN,IAAMC,GACNtO,KAAKogC,YACLpgC,KAAK3uB,OAGX,CAMAs9B,OAAO7J,EAAWC,GAChB,IAAI/E,KAAKiJ,eACT,IAAK,MAAM82B,KAAS//B,KAAK+7B,MAAMruC,OAC7BqyC,EAAM,IAAMj7B,EACZi7B,EAAM,IAAMh7B,CAEhB,CAEAs7B,YACE,MAAO35B,EAAkBC,GAAoB3G,KAAK3uB,MAAMw0B,MAAMd,EAAE6B,SAChE,IAAK,MAAMm5B,KAAS//B,KAAK+7B,MAAMruC,OAC7BqyC,EAAM,GAAK//B,KAAK++B,aAAagB,EAAM,GAAI,GACvCA,EAAM,GAAK//B,KAAKsgC,OAAOP,EAAM,GAAIr5B,EAAmBC,GAEtDhD,MAAM08B,WACR,CAEAvzB,SAASnI,GAAgB,IAAA47B,EACvB,GAAI58B,MAAMs6B,oCAAqC,OAAO,EACtD,MAAM,OAAEvwC,GAAWsS,KAAK+7B,MACxB,IACG/7B,KAAKu/B,uBAAyBv/B,KAAK+7B,MAAMsD,mBAC1Cr/B,KAAKy/B,WACmB,QADVc,EACdvgC,KAAKg/B,2BAAmB,IAAAuB,GAAxBA,EAA0BC,cAAcxgC,KAAKy/B,UAAW96B,EAAK2G,OAAOxG,EAAGH,EAAK2G,OAAOvG,GAEnF,OAAO,EACF,GAAIrX,EAAO7iB,OAAS,EACzB,IAAK,IAAIwL,EAAI,EAAGA,EAAIqX,EAAO7iB,OAAS,EAAGwL,IACrC,GACEkX,EAAAA,GAAAA,kBAAuBoX,EAAK2G,OAAQ,CAClC0wB,GAAIh8B,KAAK6W,GAAGnpB,EAAOrX,GAAG,IACtB4lD,GAAIj8B,KAAK2/B,GAAGjyC,EAAOrX,GAAG,IACtB6lD,GAAIl8B,KAAK6W,GAAGnpB,EAAOrX,EAAI,GAAG,IAC1B8lD,GAAIn8B,KAAK2/B,GAAGjyC,EAAOrX,EAAI,GAAG,OACtB,GAEN,OAAO,EAIb,OAAOstB,MAAMmJ,SAASnI,EACxB,CAUAvpB,eACE,MAAM+I,EAAQ6b,KAAK3uB,MAAM2V,QAAQ7C,SAC3B,yBAAEs6C,GAA6Bz+B,KAAK+7B,MAC1C,IAAK53C,IAAUs6C,EAGb,OAEF,MAAM/wC,EAAS+wC,EAAyB/2D,KAAImV,IAAA,IAAEioB,EAAGC,GAAEloB,EAAA,MAAK,CAACsH,EAAMs8C,0BAA0B37B,GAAIC,EAAE,IAC/F/E,KAAKxxB,IAAI,CAAEkf,UACb,CAkBAgzC,+BACE,MAAO,CAAC,SACV,EACDpgC,EA3MK+9B,EAAK,OACKH,EAAAA,GAAAA,SA4MhBG,EAAMF,UAAUC,YAAc,CAC5BpxD,OAAQ,CACN,CAAEnF,KAAM,aAAcW,KAAM,QAC5B,CAAEX,KAAM,SAAUW,KAAM,SAAUxC,IAAK,EAAGC,IAAK,GAAI2iB,QAAS,CAAC,GAC7D,CAAE/gB,KAAM,WAAYW,KAAM,mBAAoBtE,MAAO,gBAIzD,S,sHCjNO,IAAKy8D,EAAa,SAAbA,GAAa,OAAbA,EAAAA,EAAa,mBAAbA,EAAAA,EAAa,iCAAbA,EAAAA,EAAa,mCAAbA,EAAAA,EAAa,uCAAbA,EAAAA,EAAa,yCAAbA,EAAAA,EAAa,qBAAbA,EAAAA,EAAa,yBAAbA,EAAAA,EAAa,2BAAbA,EAAAA,EAAa,uBAAbA,CAAa,MAYlB,MAoEDC,EAAmBA,CAACC,EAAmBtqB,EAAkBC,KAC7D,MAAMsqB,EAAOvzC,EAAAA,GAAAA,SAAcgpB,EAAIC,GAC/B,OAAIsqB,EAAmB,EAAZD,EACFC,EAAO,EAEPD,CACT,E,wcCtEF,MAAME,UAAmEC,EAAAA,EAqBvE3gC,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YAnBf,WAASA,EAAA,6BAiCO,KAAM,CAAGwE,EAAG,CAAC,KAAM,MAAOC,EAAG,CAAC,KAAM,UAbzD/E,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,QACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,QAGT2uB,KAAK6F,MAAM7F,KAAKo8B,uBAClB,CAIA6E,qBACE,MAAO,CACLj0D,OAAQ,CACN,CAAEnF,KAAM,mBAAoBW,KAAM,OAAQR,UAAU,GACpD,CAAEH,KAAM,OAAQW,KAAM,QACtB,CACEX,KAAM,aACNW,KAAM,YACNtE,MAAO,QACP0kB,QAASoX,KAAK4W,yBAAyB0lB,gBAAgBC,OAAO2E,uBAEhE,CACEr5D,KAAM,aACNW,KAAM,aACNtE,MAAO,aACP0kB,QAAS,iBAEX,CACE/gB,KAAM,SACNW,KAAM,SACNxC,IAAK,IAIb,CAEAq2D,cACE,MAAM,gBAAEC,GAAoBt8B,KAAK4W,yBACjC,MAAO,CACL1iC,KAAM,GACNitD,KAAM,CACJr7D,KAAM,GACNY,OAAQ,QACRI,MAAO,SACPE,OAAQ,UAEVo6D,UAAW9E,EAAgBC,OAAO2E,sBAClCG,WAAY,GAEZC,UAAW,OAEXC,aAAc,aACdC,QAAS,CACP9vC,IAAK,EACL2Z,MAAO,EACP+D,OAAQ,EACRhR,KAAM,GAERqjC,WAAYnF,EAAgBoF,YAC5B3P,OAAQ,CAAErtD,MAAO43D,EAAgBC,OAAO1D,KAAM3yD,MAAO,GAEzD,CAEAy7D,aAAaztB,GACXlU,KAAKkU,QAAUA,EACfA,EAAQ1lC,IAAI,OAAQwxB,KAAKmhC,MACzBjtB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMqF,WACpCltB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMuF,WACpCptB,EAAQ1lC,IAAI,eAAgBwxB,KAAK+7B,MAAMwF,cACvCvhC,KAAK4hC,uBACP,CAEAA,wBAAwB,IAAAC,EAAAC,EAEpB9hC,KAAK+7B,MAAM7nD,QAAuB,QAAnB2tD,EAAK7hC,KAAK+hC,iBAAS,IAAAF,OAAA,EAAdA,EAAgB3tD,OACpCrH,KAAKE,UAAUizB,KAAK+7B,MAAMoF,QAAUt0D,KAAKE,UAAwB,QAAf+0D,EAAC9hC,KAAK+hC,iBAAS,IAAAD,OAAA,EAAdA,EAAgBX,QAEnEnhC,KAAK+hC,UAAYx3D,IAAM,CAAC,EAAGy1B,KAAK+7B,OAChC/7B,KAAKgiC,MAAQhiC,KAAKiiC,WAAWv6D,KAAKmxD,IAAI,CACpC3kD,KAAM2kD,EACNqJ,QAASliC,KAAKkU,QAAQiuB,YAAYtJ,OAEpC74B,KAAKoiC,eAAiBpiC,KAAKgiC,MAAM71D,QAAO,CAACC,EAAKP,EAASw2D,IAK9Cj2D,GAHLP,EAAQq2D,QAAQI,wBAChBz2D,EAAQq2D,QAAQK,0BACfF,IAAiBriC,KAAKgiC,MAAMn3D,OAAS,EAAI23D,EAAAA,GAAAA,EAAY,KAEvD,GAEP,CAEA7G,cAAcznB,GACZlU,KAAKW,OAAOuT,GACRlU,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEAuuB,aACE,IAAI19B,EAAI/E,KAAKsL,OAAO6wB,GAAKn8B,KAAK+7B,MAAMyF,QAAQ9vC,IACxCgxC,EAAkB,EACtB1iC,KAAKgiC,MAAM7vD,SAAQ,CAAC0mD,EAAM3gD,KACxB6sB,GAAe,IAAV7sB,EAAc,EAAI2gD,EAAKqJ,QAAQI,wBAA0BI,EAAkBF,EAAAA,GAAAA,EAChFxiC,KAAKkU,QAAQyuB,SAAS9J,EAAK3kD,KAAM8rB,KAAKsL,OAAO4wB,GAAKl8B,KAAK+7B,MAAMyF,QAAQpjC,KAAM2G,GAC3E29B,EAAkB7J,EAAKqJ,QAAQK,wBAAwB,GAE3D,CAEAK,mBACE,IAAK5iC,KAAK+7B,MAAM0F,WACd,OAEF,MAAMoB,EAAgC,KAApB7iC,KAAK+7B,MAAM7nD,KAAqC,EAAvB8rB,KAAK+7B,MAAMoF,KAAKr7D,KAAWk6B,KAAK95B,MACrE48D,EAAmC,GAAvB9iC,KAAK+7B,MAAMoF,KAAKr7D,KAC5B07D,EAAUxhC,KAAK+7B,MAAMhK,OAAO7rD,MAAQ,EAA2B,GAAvB85B,KAAK+7B,MAAMoF,KAAKr7D,KACxDi9D,EAASF,EAAYC,EAAYD,EAAY,EAAIC,EACvD9iC,KAAKgjC,sBAAwBF,EACzB9iC,KAAKoiC,eAAiBU,IACxB9iC,KAAKoiC,eAA0B,EAATW,GAExB,MAAM5G,EACJn8B,KAAKsL,OAAO6wB,IACXn8B,KAAKgiC,MAAM,GAAGE,QAAQI,wBACnBtiC,KAAKgiC,MAAM,GAAGE,QAAQI,wBACtBtiC,KAAKoiC,gBAYXpiC,KAAKijC,eDzKmCh/D,KAAA,IAAC,QAC3Cu9D,EAAO,OACPuB,EAAM,GACN7G,EAAE,GACFC,EAAE,UACF0G,EAAS,eACTT,GAQDn+D,EAAA,MAAkC,CACjCi/D,QAAS,CACPp+B,EAAGo3B,EAAKsF,EAAUuB,EAClBh+B,EAAGo3B,EAAKqF,GAEV2B,SAAU,CACRr+B,EAAGo3B,EAAK2G,EAAYrB,EAAUuB,EAC9Bh+B,EAAGo3B,EAAKqF,GAEV4B,SAAU,CACRt+B,EAAGo3B,EAAK2G,EAAYrB,EACpBz8B,EAAGo3B,EAAKqF,EAAUuB,GAEpBM,YAAa,CACXv+B,EAAGo3B,EAAK2G,EAAYrB,EACpBz8B,EAAGo3B,EAAKqF,EAAUY,EAAiBW,GAErCO,YAAa,CACXx+B,EAAGo3B,EAAK2G,EAAYrB,EAAUuB,EAC9Bh+B,EAAGo3B,EAAKqF,EAAUY,GAEpBmB,WAAY,CACVz+B,EAAGo3B,EAAKsF,EAAUuB,EAClBh+B,EAAGo3B,EAAKqF,EAAUY,GAEpBoB,WAAY,CACV1+B,EAAGo3B,EAAKsF,EACRz8B,EAAGo3B,EAAKqF,EAAUY,EAAiBW,GAErCU,QAAS,CACP3+B,EAAGo3B,EAAKsF,EACRz8B,EAAGo3B,EAAKqF,EAAUuB,GAErB,EC0HyBW,CAA6B,CACjDlC,UACAuB,SACA7G,GAAIl8B,KAAKsL,OAAO4wB,GAChBC,KACA0G,YACAT,eAAgBpiC,KAAKoiC,iBAEvBpiC,KAAK2jC,KDhIyBtrD,KAAA,IAAC,eACjC4qD,EAAc,GACdjH,EAAE,GACFC,GAKD5jD,EAAA,MAAwB,CACvBurD,SAAU,CACR9+B,EAAGm+B,EAAeC,QAAQp+B,GAAKm+B,EAAeE,SAASr+B,EAAIm+B,EAAeC,QAAQp+B,GAAK,EACvFC,EAAGk+B,EAAeQ,QAAQ1+B,GAAKk+B,EAAeO,WAAWz+B,EAAIk+B,EAAeQ,QAAQ1+B,GAAK,GAE3F8+B,QAAS,CACP/+B,EAAGk3B,EACHj3B,EAAGk3B,GAEN,EC+Ge6H,CAAmB,CAAEb,eAAgBjjC,KAAKijC,eAAgBjH,GAAIh8B,KAAKsL,OAAO0wB,GAAIC,GAAIj8B,KAAKsL,OAAO2wB,KAC1Gj8B,KAAK+jC,cDrGgClnD,KAMpB,IANqB,KACxC8mD,EAAI,eACJV,GAIDpmD,EACC,MAAM,QAAEqmD,EAAO,SAAEC,EAAQ,SAAEC,EAAQ,YAAEC,EAAW,YAAEC,EAAW,WAAEC,EAAU,WAAEC,EAAU,QAAEC,GAAYR,GAC7F,QAAEY,EAAO,SAAED,GAAaD,EAC9B,OAAIp2C,EAAAA,GAAAA,4BAAiCs2C,EAASD,EAAUV,EAASO,GACxD9C,EAAcqD,cACZz2C,EAAAA,GAAAA,4BAAiCs2C,EAASD,EAAUT,EAAUC,GAChEzC,EAAcsD,eACZ12C,EAAAA,GAAAA,4BAAiCs2C,EAASD,EAAUL,EAAYC,GAClE7C,EAAcuD,iBACZ32C,EAAAA,GAAAA,4BAAiCs2C,EAASD,EAAUN,EAAaD,GACnE1C,EAAcwD,kBACZ52C,EAAAA,GAAAA,4BAAiCs2C,EAASD,EAAUV,EAASC,GAC/DxC,EAAcyD,QACZ72C,EAAAA,GAAAA,4BAAiCs2C,EAASD,EAAUR,EAAUC,GAChE1C,EAAc0D,UACZ92C,EAAAA,GAAAA,4BAAiCs2C,EAASD,EAAUL,EAAYD,GAClE3C,EAAc2D,WACZ/2C,EAAAA,GAAAA,4BAAiCs2C,EAASD,EAAUH,EAASD,GAC/D7C,EAAc4D,SAEd5D,EAAc6D,MACvB,EC0EuBC,CAA0B,CAAEd,KAAM3jC,KAAK2jC,KAAMV,eAAgBjjC,KAAKijC,iBACvFjjC,KAAKkU,QAAQ4oB,YACb98B,KAAKkU,QAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAM0F,YACzCzhC,KAAKkU,QAAQwwB,SAAW,QDjEChyD,KAOD,IAPE,QAC5BwhC,EAAO,OACP6uB,EAAM,sBACNC,EAAqB,KACrBW,EAAI,eACJV,EAAc,cACdc,GACerxD,EACf,MAAM,QAAEwwD,EAAO,SAAEC,EAAQ,SAAEC,EAAQ,YAAEC,EAAW,YAAEC,EAAW,WAAEC,EAAU,WAAEC,EAAU,QAAEC,GAAYR,GAC7F,QAAEY,EAAO,SAAED,GAAaD,EAgB9B,GAVII,IAAkBpD,EAAcqD,eAClC9vB,EAAQ+oB,OAAOwG,EAAQ3+B,EAAG2+B,EAAQ1+B,GAClCmP,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAOgG,EAAQp+B,EAAGo+B,EAAQn+B,KAElCmP,EAAQ+oB,OAAOwG,EAAQ3+B,EAAG2+B,EAAQ1+B,GAClCmP,EAAQywB,MAAMlB,EAAQ3+B,EAAGo+B,EAAQn+B,EAAGm+B,EAAQp+B,EAAGo+B,EAAQn+B,EAAGg+B,IAIxDgB,IAAkBpD,EAAcyD,QAAS,CAC3C,MAAMQ,EAAgCr3C,EAAAA,GAAAA,4BAAiCs2C,EAASD,EAAUV,EAASC,GACnG,IAAKyB,EAEH,YADA1wB,EAAQgpB,OAAOiG,EAASr+B,EAAGq+B,EAASp+B,GAGtC,MAAM8/B,EAAgBjE,EAAiBoC,EAAuBE,EAASC,GACnEyB,EAA8B9/B,EAAI+/B,EAAgB3B,EAAQp+B,GAC5DoP,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAOgG,EAAQp+B,EAAoB,EAAhB+/B,EAAmBD,EAA8B7/B,IACnE6/B,EAA8B9/B,EAAI+/B,EAAgB1B,EAASr+B,GACpEoP,EAAQgpB,OAAOiG,EAASr+B,EAAoB,EAAhB+/B,EAAmBD,EAA8B7/B,GAC7EmP,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAOiG,EAASr+B,EAAG8/B,EAA8B7/B,KAEzDmP,EAAQgpB,OAAO0H,EAA8B9/B,EAAI+/B,EAAeD,EAA8B7/B,GAC9FmP,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAO0H,EAA8B9/B,EAAI+/B,EAAeD,EAA8B7/B,GAC9FmP,EAAQgpB,OAAOiG,EAASr+B,EAAGq+B,EAASp+B,GAExC,MACEmP,EAAQgpB,OAAOiG,EAASr+B,EAAGq+B,EAASp+B,GAatC,GATIg/B,IAAkBpD,EAAcsD,gBAClC/vB,EAAQgpB,OAAOiG,EAASr+B,EAAGq+B,EAASp+B,GACpCmP,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAOkG,EAASt+B,EAAGs+B,EAASr+B,IAEpCmP,EAAQywB,MAAMvB,EAASt+B,EAAGq+B,EAASp+B,EAAGq+B,EAASt+B,EAAGs+B,EAASr+B,EAAGg+B,GAI5DgB,IAAkBpD,EAAc0D,UAAW,CAC7C,MAAMS,EAAkCv3C,EAAAA,GAAAA,4BAAiCs2C,EAASD,EAAUR,EAAUC,GACtG,IAAKyB,EAEH,YADA5wB,EAAQgpB,OAAOmG,EAAYv+B,EAAGu+B,EAAYt+B,GAG5C,MAAM8/B,EAAgBjE,EAAiBoC,EAAuBI,EAAUC,GACpEyB,EAAgC//B,EAAI8/B,EAAgBzB,EAASr+B,GAC/DmP,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAOkG,EAASt+B,EAAGs+B,EAASr+B,EAAoB,EAAhB8/B,IAC/BC,EAAgC//B,EAAI8/B,EAAgBxB,EAAYt+B,GACzEmP,EAAQgpB,OAAOmG,EAAYv+B,EAAGu+B,EAAYt+B,EAAoB,EAAhB8/B,GAC9C3wB,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAOmG,EAAYv+B,EAAGu+B,EAAYt+B,KAE1CmP,EAAQgpB,OAAO4H,EAAgChgC,EAAGggC,EAAgC//B,EAAI8/B,GACtF3wB,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAO4H,EAAgChgC,EAAGggC,EAAgC//B,EAAI8/B,GACtF3wB,EAAQgpB,OAAOmG,EAAYv+B,EAAGu+B,EAAYt+B,GAE9C,MACEmP,EAAQgpB,OAAOmG,EAAYv+B,EAAGu+B,EAAYt+B,GAa5C,GATIg/B,IAAkBpD,EAAcwD,mBAClCjwB,EAAQgpB,OAAOmG,EAAYv+B,EAAGu+B,EAAYt+B,GAC1CmP,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAOoG,EAAYx+B,EAAGw+B,EAAYv+B,IAE1CmP,EAAQywB,MAAMtB,EAAYv+B,EAAGw+B,EAAYv+B,EAAGu+B,EAAYx+B,EAAGw+B,EAAYv+B,EAAGg+B,GAIxEgB,IAAkBpD,EAAc2D,WAAY,CAC9C,MAAMS,EAAmCx3C,EAAAA,GAAAA,4BACvCs2C,EACAD,EACAL,EACAD,GAEF,IAAKyB,EAEH,YADA7wB,EAAQgpB,OAAOqG,EAAWz+B,EAAGy+B,EAAWx+B,GAG1C,MAAM8/B,EAAgBjE,EAAiBoC,EAAuBO,EAAYD,GACtEyB,EAAiCjgC,EAAI+/B,EAAgBvB,EAAYx+B,GACnEoP,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAOoG,EAAYx+B,EAAoB,EAAhB+/B,EAAmBE,EAAiChgC,IAC1EggC,EAAiCjgC,EAAI+/B,EAAgBtB,EAAWz+B,GACzEoP,EAAQgpB,OAAOqG,EAAWz+B,EAAoB,EAAhB+/B,EAAmBE,EAAiChgC,GAClFmP,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAOqG,EAAWz+B,EAAGigC,EAAiChgC,KAE9DmP,EAAQgpB,OAAO6H,EAAiCjgC,EAAI+/B,EAAeE,EAAiChgC,GACpGmP,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAO6H,EAAiCjgC,EAAI+/B,EAAeE,EAAiChgC,GACpGmP,EAAQgpB,OAAOqG,EAAWz+B,EAAGy+B,EAAWx+B,GAE5C,MACEmP,EAAQgpB,OAAOqG,EAAWz+B,EAAGy+B,EAAWx+B,GAa1C,GATIg/B,IAAkBpD,EAAcuD,kBAClChwB,EAAQgpB,OAAOqG,EAAWz+B,EAAGy+B,EAAWx+B,GACxCmP,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAOsG,EAAW1+B,EAAG0+B,EAAWz+B,IAExCmP,EAAQywB,MAAMnB,EAAW1+B,EAAGy+B,EAAWx+B,EAAGy+B,EAAW1+B,EAAG0+B,EAAWz+B,EAAGg+B,GAIpEgB,IAAkBpD,EAAc4D,SAAU,CAC5C,MAAMS,EAAiCz3C,EAAAA,GAAAA,4BAAiCs2C,EAASD,EAAUH,EAASD,GACpG,IAAKwB,EAEH,YADA9wB,EAAQgpB,OAAOuG,EAAQ3+B,EAAG2+B,EAAQ1+B,GAGpC,MAAM8/B,EAAgBjE,EAAiBoC,EAAuBS,EAASD,GACnEwB,EAA+BjgC,EAAI8/B,EAAgBrB,EAAWz+B,GAChEmP,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAOsG,EAAW1+B,EAAG0+B,EAAWz+B,EAAoB,EAAhB8/B,IACnCG,EAA+BjgC,EAAI8/B,EAAgBpB,EAAQ1+B,GACpEmP,EAAQgpB,OAAOuG,EAAQ3+B,EAAG2+B,EAAQ1+B,EAAoB,EAAhB8/B,GACtC3wB,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAOuG,EAAQ3+B,EAAG2+B,EAAQ1+B,KAElCmP,EAAQgpB,OAAO8H,EAA+BlgC,EAAGkgC,EAA+BjgC,EAAI8/B,GACpF3wB,EAAQgpB,OAAO2G,EAAQ/+B,EAAG++B,EAAQ9+B,GAClCmP,EAAQgpB,OAAO8H,EAA+BlgC,EAAGkgC,EAA+BjgC,EAAI8/B,GACpF3wB,EAAQgpB,OAAOuG,EAAQ3+B,EAAG2+B,EAAQ1+B,GAEtC,MACEmP,EAAQgpB,OAAOuG,EAAQ3+B,EAAG2+B,EAAQ1+B,EACpC,ECxFEkgC,CAAc,CACZ/wB,QAASlU,KAAKkU,QACd6uB,SACAC,sBAAuBhjC,KAAKgjC,sBAC5BW,KAAM3jC,KAAK2jC,KACXV,eAAgBjjC,KAAKijC,eACrBc,cAAe/jC,KAAK+jC,gBAEtB/jC,KAAKkU,QAAQ8rB,YACbhgC,KAAKkU,QAAQirB,OACbn/B,KAAKkU,QAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMqF,WACzCphC,KAAKklC,cACP,CAEAp4B,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EAEtD,GACEj+B,KAAKgiC,OACLhiC,KAAKijC,gBACLjjC,KAAKijC,eAAeQ,QAAQ3+B,EAAIH,EAAK2G,OAAOxG,GAC5C9E,KAAKijC,eAAeC,QAAQn+B,EAAIJ,EAAK2G,OAAOvG,GAC5C/E,KAAKijC,eAAeI,YAAYv+B,EAAIH,EAAK2G,OAAOxG,GAChD9E,KAAKijC,eAAeK,YAAYv+B,EAAIJ,EAAK2G,OAAOvG,EAEhD,OAAO,EAGT,GAAI/E,KAAK2jC,KAAM,CACb,MAAMwB,EAAS53C,EAAAA,GAAAA,yBAA8B,CAC3C63C,SAAUplC,KAAKgjC,sBACfnK,KAAM,CAAEmD,GAAIh8B,KAAK2jC,KAAKE,QAAQ/+B,EAAGm3B,GAAIj8B,KAAK2jC,KAAKE,QAAQ9+B,EAAGm3B,GAAIl8B,KAAK2jC,KAAKC,SAAS9+B,EAAGq3B,GAAIn8B,KAAK2jC,KAAKC,SAAS7+B,KAEvGsgC,EAAeF,EAAOrgC,EAAI9E,KAAK2jC,KAAKC,SAAS9+B,EAC7CwgC,EAAeH,EAAOpgC,EAAI/E,KAAK2jC,KAAKC,SAAS7+B,EAC7CwgC,EAAS,CAAEzgC,EAAG9E,KAAK2jC,KAAKC,SAAS9+B,GAAK,EAAIugC,EAActgC,EAAG/E,KAAK2jC,KAAKC,SAAS7+B,GAAK,EAAIugC,GACvFE,EAAU,CAACxlC,KAAK2jC,KAAKE,QAASsB,EAAQI,GAC5C,GAAIh4C,EAAAA,GAAAA,eAAoBoX,EAAK2G,OAAQk6B,GACnC,OAAO,CAEX,CACA,OAAO7hC,MAAMmJ,SAASnI,EACxB,CAEAgK,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMG,IAAMp3B,EACjB9E,KAAK+7B,MAAMI,IAAMp3B,CACnB,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EAC1C,SAAT4D,IACFm4B,KAAK+7B,MAAMC,IAAMlkB,EACjB9X,KAAK+7B,MAAME,IAAMr2B,EAErB,EACDtF,EAzOKygC,EAAO,OACG7C,EAAAA,GAAAA,WA0OhB,S,miBC3PA,MAAMuH,UAAuD9lD,EAAAA,EAO3D0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YALf,SAAOA,EAAA,6BA2CS,KAAM,CAAGwE,EAAG,CAAC,KAAM,KAAM,MAAOC,EAAG,CAAC,KAAM,KAAM,UArCrE/E,KAAKW,OAASX,KAAKW,OAAO2C,KAAKtD,MAC/BA,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAM2J,IAAM1lC,KAAK+7B,MAAMG,KAClC,IAAMl8B,KAAK+7B,MAAM4J,IAAM3lC,KAAK+7B,MAAMI,IAClCn8B,KAAK47B,OACL57B,KAAK3uB,QAGT2uB,KAAK6F,MAAM7F,KAAKo8B,uBAClB,CAEAC,cACE,MAAO,CACLtK,OAAQ,CACN7rD,MAAO,EACPxB,MAAOs7B,KAAK4W,yBAAyB0lB,gBAAgBC,OAAO1D,MAGlE,CAIA+M,mBAAmB1xB,EAAmC2xB,GACpD,MAAM,OAAEn4C,GAAWm4C,EACnB3xB,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOvvC,EAAO,GAAGoX,EAAGpX,EAAO,GAAGqX,GACtCmP,EAAQ4rB,iBAAiBpyC,EAAO,GAAGoX,EAAGpX,EAAO,GAAGqX,EAAGrX,EAAO,GAAGoX,EAAGpX,EAAO,GAAGqX,GAC1EmP,EAAQipB,QACV,CAEAxB,cAAcznB,GACZ,MAAM,GAAE8nB,EAAE,GAAEE,EAAE,GAAEwJ,EAAE,GAAEzJ,EAAE,GAAEE,EAAE,GAAEwJ,GAAO3lC,KAAKsL,OACxC4I,EAAQ2oB,UAAU,GAAK,IACvB3oB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OACxCghE,GAAOC,GAOV3lC,KAAK6lC,MAAQC,EAAAA,EAAAA,oBAA2B,CAAEhhC,EAAGk3B,EAAIj3B,EAAGk3B,GAAM,CAAEn3B,EAAGo3B,EAAIn3B,EAAGo3B,GAAM,CAAEr3B,EAAG4gC,EAAI3gC,EAAG4gC,GAAM,IAC9F3lC,KAAK4lC,mBAAmB1xB,EAASlU,KAAK6lC,SAPtC3xB,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOjB,EAAIC,GACnB/nB,EAAQgpB,OAAOhB,EAAIC,GACnBjoB,EAAQgpB,OAAOwI,EAAIC,GACnBzxB,EAAQipB,UAMVjpB,EAAQ2oB,WAAW,IAAM,IACrB78B,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEAvF,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMC,IAAMl3B,EACjB9E,KAAK+7B,MAAMG,IAAMp3B,EACjB9E,KAAK+7B,MAAM2J,IAAM5gC,EACjB9E,KAAK+7B,MAAMgK,MAAQjhC,EACnB9E,KAAK+7B,MAAMiK,MAAQlhC,EAEnB9E,KAAK+7B,MAAME,IAAMl3B,EACjB/E,KAAK+7B,MAAMI,IAAMp3B,EACjB/E,KAAK+7B,MAAM4J,IAAM5gC,EACjB/E,KAAK+7B,MAAMkK,MAAQlhC,EACnB/E,KAAK+7B,MAAMmK,MAAQnhC,CACrB,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EACvD,OAAQ4D,GACN,IAAK,IACHm4B,KAAK+7B,MAAMC,IAAMlkB,EACjB9X,KAAK+7B,MAAME,IAAMr2B,EACjB,MACF,IAAK,IACH5F,KAAK+7B,MAAMG,IAAMpkB,EACjB9X,KAAK+7B,MAAMI,IAAMv2B,EACjB,MACF,IAAK,IACH5F,KAAK+7B,MAAM2J,IAAM5tB,EACjB9X,KAAK+7B,MAAM4J,IAAM//B,EAKvB,CAEAkH,SAASnI,GACP,OAAIhB,MAAMs6B,yCACNj+B,KAAK6lC,OAAS7lC,KAAK6lC,MAAMM,QAAQxhC,EAAK2G,QAAQ86B,GAAM,KAGjDpmC,KAAK8H,gBAAgBnD,GAC9B,EACDrE,EAtHKmlC,EAAK,OACKvH,EAAAA,GAAAA,OAuHhBuH,EAAMtH,UAAUC,YAAc,CAC5BpxD,OAAQ,CAAC,CAAEnF,KAAM,OAAQW,KAAM,YAGjC,S,qlBCvGA,MAAM69D,UAA6D1mD,EAAAA,EAOjE0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YALf,WAASA,EAAA,6BAoDO,KAAM,CAAGwE,EAAG,CAAC,KAAM,MAAOC,EAAG,CAAC,KAAM,UA9CzD/E,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK3uB,MAAMw0B,MAAMf,EAAEiB,OAAO/F,KAAKsmC,iBAAiBC,eACtD,IAAMvmC,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OAAO/F,KAAKsmC,iBAAiBE,cACtDxmC,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK3uB,MAAMw0B,MAAMf,EAAEiB,OAAO/F,KAAKsmC,iBAAiBG,gBACtD,IAAMzmC,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OAAO/F,KAAKsmC,iBAAiBI,eACtD1mC,KAAK47B,OACL57B,KAAK3uB,QAGT,MAAMs1D,EAAoB3mC,KAAKo8B,uBAC/Bp8B,KAAK6F,MAAM,CAAEf,EAAG,IAAI6hC,EAAkB7hC,EAAG,SAAUC,EAAG4hC,EAAkB5hC,GAC1E,CAEAs3B,cACE,MAAM,gBAAEC,GAAoBt8B,KAAK4W,yBACjC,MAAO,CACLuoB,KAAM7C,EAAgBoF,YACtB3P,OAAQ,CACN7rD,MAAO,EACPxB,MAAO43D,EAAgBC,OAAO1D,MAGpC,CAIA8C,cAAcznB,GACZ,MAAMnuB,EAAIia,KAAKsmC,iBAEfpyB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMoD,MAEpCjrB,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOl3C,EAAE6gD,cAAe7gD,EAAE8gD,eAClC3yB,EAAQ4yB,cAAc/gD,EAAEghD,aAAchhD,EAAEihD,aAAcjhD,EAAEkhD,UAAWlhD,EAAEmhD,UAAWnhD,EAAEohD,WAAYphD,EAAEqhD,YAChGlzB,EAAQ4yB,cAAc/gD,EAAEshD,SAAUthD,EAAEuhD,SAAUvhD,EAAEwhD,YAAaxhD,EAAEyhD,YAAazhD,EAAE6gD,cAAe7gD,EAAE8gD,eAC/F3yB,EAAQ8rB,YACR9rB,EAAQirB,OAERjrB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OAC6B,KAAhD,MAArBs7B,KAAK+7B,MAAMhK,OAAiB/xB,KAAK+7B,MAAMhK,OAAO7rD,WAAQ0P,IACzDs+B,EAAQipB,SAGNn9B,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEAvF,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMC,IAAMl3B,EACjB9E,KAAK+7B,MAAME,IAAMl3B,EACjB/E,KAAK+7B,MAAMG,IAAMp3B,EACjB9E,KAAK+7B,MAAMI,IAAMp3B,CACnB,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EACvD,OAAQ4D,GACN,IAAK,KACHm4B,KAAK+7B,MAAMC,IAAMlkB,EACjB9X,KAAK+7B,MAAME,IAAMr2B,EACjB,MACF,IAAK,KACH5F,KAAK+7B,MAAMG,IAAMpkB,EACjB9X,KAAK+7B,MAAMI,IAAMv2B,EACjB,MACF,IAAK,KACH5F,KAAK+7B,MAAM71D,OAAS4xC,EACpB,MACF,IAAK,KACH9X,KAAK+7B,MAAM71D,OAAS4xC,EAK1B,CAEAwuB,iBAGE,MAAMmB,EACJx9D,KAAK+yD,GAAK/yD,KAAKy9D,MAAM,IAAM1nC,KAAKsL,OAAO6wB,GAAKn8B,KAAKsL,OAAO2wB,KAAOj8B,KAAKsL,OAAO4wB,GAAKl8B,KAAKsL,OAAO0wB,MAExFpkB,EAAO5X,KAAKsL,OAAO2wB,GAAKj8B,KAAKsL,OAAO6wB,GAAK,GAAK,EAC9CwL,EAAU3nC,KAAKsL,OAAOplC,MAAQ,EACpC,IAAI0hE,EAAWhwB,EAAO3tC,KAAK+xB,IAAIgE,KAAKsL,OAAO2wB,GAAKj8B,KAAKsL,OAAO6wB,IAAOlyD,KAAKszD,IAAIkK,GAAiB,EACzFznC,KAAKsL,OAAO2wB,KAAOj8B,KAAKsL,OAAO6wB,KACjCyL,EAAU39D,KAAK+xB,IAAIgE,KAAKsL,OAAO0wB,GAAKh8B,KAAKsL,OAAO4wB,IAAM,GAGxD,MAAM2L,EAA8B,EAAVF,EAAe,EAEnCG,EAAM79D,KAAK0zD,IAAI8J,GAAiBG,EAChCG,EAAM99D,KAAKszD,IAAIkK,GAAiBG,EAChCI,EAAM/9D,KAAKszD,IAAIkK,GAAiBI,EAChCI,EAAMh+D,KAAK0zD,IAAI8J,GAAiBI,EAEhC/iC,EAAI9E,KAAKsL,OAAO0wB,GAAK8L,EACrB/iC,EAAI/E,KAAKsL,OAAO2wB,GAAK8L,EAErBZ,EAAariC,EAAIgjC,EACjBV,EAAariC,EAAIgjC,EAMjBnB,EAAgB9hC,EAAIgjC,EACpBjB,EAAgB9hC,EAAIgjC,EAW1B,MAAO,CACLZ,aACAC,aACAH,UApBgBE,EAAaa,EAqB7Bd,UApBgBE,EAAaa,EAqB7BZ,SApBeF,EAAaa,EAqB5BV,SApBeF,EAAaa,EAqB5B1B,YAVkBzhC,EAAIkjC,EAWtBxB,YAVkBzhC,EAAIkjC,EAWtBxB,aAdmB3hC,EAAIkjC,EAevBtB,aAdmB3hC,EAAIkjC,EAevBrB,gBACAC,gBACAU,YArBkBX,EAAgBoB,EAsBlCR,YArBkBX,EAAgBoB,EAsBlClB,aAzBmBH,EAAgBoB,EA0BnChB,aAzBmBH,EAAgBoB,EA2BvC,CAEAn7B,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,MAAMl4C,EAAIia,KAAKsmC,iBACTloC,EAAOn0B,KAAKjE,IAAIg6B,KAAKsL,OAAO0wB,GAAIh8B,KAAKsL,OAAO4wB,GAAIn2C,EAAE0gD,cAClDp7B,EAAQphC,KAAKhE,IAAI+5B,KAAKsL,OAAO0wB,GAAIh8B,KAAKsL,OAAO4wB,GAAIn2C,EAAEwgD,aACnD70C,EAAMznB,KAAKjE,IAAIg6B,KAAKsL,OAAO2wB,GAAIj8B,KAAKsL,OAAO6wB,GAAIp2C,EAAE2gD,cACjDt3B,EAASnlC,KAAKhE,IAAI+5B,KAAKsL,OAAO2wB,GAAIj8B,KAAKsL,OAAO6wB,GAAIp2C,EAAEygD,aAC1D,OAAIpoC,EAAOuG,EAAK2G,OAAOxG,GAAKH,EAAK2G,OAAOxG,EAAIuG,GAAS3Z,EAAMiT,EAAK2G,OAAOvG,GAAKJ,EAAK2G,OAAOvG,EAAIqK,GAGrFzL,MAAMmJ,SAASnI,EACxB,EACDrE,EAtLK+lC,EAAO,OACGnI,EAAAA,GAAAA,SAuLhBmI,EAAQlI,UAAUC,YAAc,CAC9BpxD,OAAQ,CACN,CAAEnF,KAAM,aAAcW,KAAM,QAC5B,CAAEX,KAAM,SAAUW,KAAM,SAAUxC,IAAK,EAAG4iB,QAAS,CAAC,KAIxD,U,+iBCrNA,MAAMs/C,UAAwFvoD,EAAAA,EAO5F0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YALf,qBAAmBA,EAAA,6BAoEH,KAAM,CAAGwE,EAAG,CAAC,KAAM,MAAOC,EAAG,CAAC,KAAM,UA9DzD/E,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/B,MAAM8E,EAAI9E,KAAK3uB,MAAMw0B,MAAMf,EAAEiB,OACvBhB,EAAI/E,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OAC7B/F,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAMh3B,EAAE9E,KAAKmoC,qBAAqB,GAAG,MACrC,IAAMpjC,EAAE/E,KAAKmoC,qBAAqB,GAAG,KACrCnoC,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAMh3B,EAAE9E,KAAKmoC,qBAAqB,GAAG,MACrC,IAAMpjC,EAAE/E,KAAKmoC,qBAAqB,GAAG,KACrCnoC,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAMh3B,EAAE9E,KAAKmoC,qBAAqB,GAAG,MACrC,IAAMpjC,EAAE/E,KAAKmoC,qBAAqB,GAAG,KACrCnoC,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAMh3B,EAAE9E,KAAKmoC,qBAAqB,GAAG,MACrC,IAAMpjC,EAAE/E,KAAKmoC,qBAAqB,GAAG,KACrCnoC,KAAK47B,OACL57B,KAAK3uB,QAGT,MAAMs1D,EAAoB3mC,KAAKo8B,uBAC/Bp8B,KAAK6F,MAAM,CAAEf,EAAG,IAAI6hC,EAAkB7hC,EAAG,UAAWC,EAAG4hC,EAAkB5hC,GAC3E,CAEAs3B,cACE,MAAM,gBAAEC,GAAoBt8B,KAAK4W,yBACjC,MAAO,CACLuoB,KAAM7C,EAAgBoF,YACtB3P,OAAQ,CACN7rD,MAAO,EACPxB,MAAO43D,EAAgBC,OAAOxK,QAGpC,CAIA4J,cAAcznB,GACZA,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMoD,MAEpCjrB,EAAQ4oB,YACR,MAAMsL,EAASpoC,KAAKmoC,qBACpB,IAAK,MAAMpI,KAASqI,EAClBl0B,EAAQgpB,OAAO6C,EAAM,GAAIA,EAAM,IAEjC7rB,EAAQgpB,OAAOkL,EAAO,GAAG,GAAIA,EAAO,GAAG,IACvCl0B,EAAQirB,OAERjrB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OAC6B,KAAhD,MAArBs7B,KAAK+7B,MAAMhK,OAAiB/xB,KAAK+7B,MAAMhK,OAAO7rD,WAAQ0P,IACzDs+B,EAAQipB,SAGNn9B,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEAi0B,qBACE,MAAME,EAAMroC,KAAKsL,OAAO0wB,GAClBsM,EAAMtoC,KAAKsL,OAAO4wB,GAClBqM,EAAMvoC,KAAKsL,OAAO2wB,GAClBuM,EAAMxoC,KAAKsL,OAAO6wB,IAClB,OAAExqC,GAAWqO,KAAKsL,OAGlBm9B,GAAM,IADDD,EAAMD,IAAQD,EAAMD,IAIzBK,GADOH,EAAMC,EAAM,GAAK,GACXv+D,KAAK0+D,KAAMh3C,EAASA,GAAW,EAAI82C,EAAKA,IAAQ,EAC7DG,EAAKH,EAAKC,EAEhB,IAAI1M,EAAKqM,EAAMK,EACXzM,EAAKsM,EAAMK,EACX1M,EAAKoM,EAAMI,EACXvM,EAAKqM,EAAMI,EAEXlD,EAAK4C,EAAMI,EACX/C,EAAK6C,EAAMI,EACXC,EAAKR,EAAMK,EACXI,EAAKP,EAAMK,EAcf,OAZIL,IAAQC,IACVxM,EAAKqM,EACLpM,EAAKsM,EAAM52C,EAAS,EACpBuqC,EAAKoM,EACLnM,EAAKqM,EAAM72C,EAAS,EAEpB+zC,EAAK4C,EACL3C,EAAK6C,EAAM72C,EAAS,EACpBk3C,EAAKR,EACLS,EAAKP,EAAM52C,EAAS,GAGf,CACL,CAACqqC,EAAIC,GACL,CAACC,EAAIC,GACL,CAACuJ,EAAIC,GACL,CAACkD,EAAIC,GAET,CAEAn6B,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMC,IAAMl3B,EACjB9E,KAAK+7B,MAAME,IAAMl3B,EACjB/E,KAAK+7B,MAAMG,IAAMp3B,EACjB9E,KAAK+7B,MAAMI,IAAMp3B,CACnB,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EACvD,OAAQ4D,GACN,IAAK,KACHm4B,KAAK+7B,MAAMC,IAAMlkB,EACjB9X,KAAK+7B,MAAME,IAAMr2B,EACjB,MACF,IAAK,KACH5F,KAAK+7B,MAAMG,IAAMpkB,EACjB9X,KAAK+7B,MAAMI,IAAMv2B,EACjB,MACF,IAAK,KACL,IAAK,KACH5F,KAAK+7B,MAAMpqC,QAAUiU,EACrB,MACF,IAAK,KACL,IAAK,KACH5F,KAAK+7B,MAAMpqC,QAAUiU,EACrB,MACF,QACE,OAEN,CAEAkH,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,MACMuH,EADSxlC,KAAKmoC,qBACGzgE,KAAKqe,IAAC,CAAQ+e,EAAG/e,EAAE,GAAIgf,EAAGhf,EAAE,OACnD,QAAIwH,EAAAA,GAAAA,eAAoBoX,EAAK2G,OAAQk6B,IAG9B7hC,MAAMmJ,SAASnI,EACxB,EACDrE,EAlLK4nC,EAAgB,OACNhK,EAAAA,GAAAA,kBAmLhBgK,EAAiB/J,UAAUC,YAAc,CACvCpxD,OAAQ,CACN,CAAEnF,KAAM,aAAcW,KAAM,QAC5B,CAAEX,KAAM,SAAUW,KAAM,SAAUxC,IAAK,EAAG4iB,QAAS,CAAC,KAIxD,U,yeC9LA,MAAMmgD,UAAiEppD,EAAAA,EASrE0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YAPf,UAAQA,EAAA,6BAwDQ,KAAM,CAAGwE,EAAG,CAAC,MAAOC,EAAG,CAAC,UA/C7C/E,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAE/B,MAAMgpC,EAAMpxB,GACV5X,KAAKipC,sBAAsBjpC,KAAKsL,OAAO0wB,GAAKpkB,GAAQ5X,KAAK6iC,UAAY,GAAK7iC,KAAK+7B,MAAMmN,OAAQlpC,KAAKsL,OAAO2wB,IACrGkN,EAAMvxB,GACV5X,KAAKipC,sBAAsBjpC,KAAKsL,OAAO0wB,GAAIh8B,KAAKsL,OAAO2wB,GAAKrkB,GAAQ5X,KAAKopC,WAAa,GAAKppC,KAAK+7B,MAAMsN,QACxGrpC,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,MACA,IAAM97B,KAAK3uB,MAAMw0B,MAAMf,EAAEiB,OAAOijC,EAAG,GAAIlkC,KACvC,IAAM9E,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OAAOijC,EAAG,GAAIjkC,IACvC/E,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK3uB,MAAMw0B,MAAMf,EAAEiB,OAAOijC,GAAI,GAAGlkC,KACvC,IAAM9E,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OAAOijC,GAAI,GAAGjkC,IACvC/E,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK3uB,MAAMw0B,MAAMf,EAAEiB,OAAOojC,EAAG,GAAIrkC,KACvC,IAAM9E,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OAAOojC,EAAG,GAAIpkC,IACvC/E,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK3uB,MAAMw0B,MAAMf,EAAEiB,OAAOojC,GAAI,GAAGrkC,KACvC,IAAM9E,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OAAOojC,GAAI,GAAGpkC,IACvC/E,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,QAGT2uB,KAAK6F,MAAM7F,KAAKo8B,wBAChBp8B,KAAK+7B,MAAMgB,MAAQ/8B,KAAK+7B,MAAMgB,OAAS,CACzC,CAIApB,cAAcznB,GACZA,EAAQ1lC,IAAI,OAAQ,oBACpB0lC,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMoD,MACpCjrB,EAAQ1lC,IAAI,YAAa,QACzB0lC,EAAQ1lC,IAAI,eAAgB,OAE5BwxB,KAAK6iC,UAAY3uB,EAAQiuB,YAAYniC,KAAK+7B,MAAMuN,QAAQpjE,MACxD85B,KAAKopC,WAAa,GAClB,MAAMG,EAASvpC,KAAK+7B,MAAMmN,OACpBM,EAASxpC,KAAK+7B,MAAMsN,OAEpBI,EAAUzpC,KAAK6iC,WAAa,EAC5B6G,EAAU1pC,KAAKopC,YAAc,EAEnCl1B,EAAQ/5B,OACR+5B,EAAQ2oB,UAAU78B,KAAKsL,OAAO0wB,GAAIh8B,KAAKsL,OAAO2wB,IAC9C/nB,EAAQy1B,OAAO3pC,KAAK+7B,MAAMgB,OAC1B7oB,EAAQrO,MAAM0jC,EAAQC,GACtBt1B,EAAQyuB,SAAS3iC,KAAK+7B,MAAMuN,OAAQG,EAASC,GAC7Cx1B,EAAQvJ,UAEJ3K,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEA+0B,sBAAsBnkC,EAAWC,GAC/B,MAAM6kC,EAAK5pC,KAAKsL,OAAO0wB,GACjB6N,EAAK7pC,KAAKsL,OAAO2wB,GACjByM,EAAK5jC,EAAI8kC,EACThB,EAAK7jC,EAAI8kC,EAGf,MAAO,CAAE/kC,EAAG8kC,GAFDlB,EAAKz+D,KAAKszD,IAAIv9B,KAAK+7B,MAAMgB,OAAS6L,EAAK3+D,KAAK0zD,IAAI39B,KAAK+7B,MAAMgB,QAEjDh4B,EAAG8kC,GADbjB,EAAK3+D,KAAKszD,IAAIv9B,KAAK+7B,MAAMgB,OAAS2L,EAAKz+D,KAAK0zD,IAAI39B,KAAK+7B,MAAMgB,QAExE,CAEApuB,OAAO7J,EAAWC,GAEhB,OADA/E,KAAK+7B,MAAMC,IAAMl3B,EACT9E,KAAK+7B,MAAME,IAAMl3B,CAC3B,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EACvD,OAAQ4D,GACN,IAAK,KACHm4B,KAAK+7B,MAAMmN,QAAUpxB,EACrB,MACF,IAAK,KACH9X,KAAK+7B,MAAMmN,QAAUpxB,EACrB,MACF,IAAK,KACH9X,KAAK+7B,MAAMsN,QAAUzjC,EACrB,MACF,IAAK,KACH5F,KAAK+7B,MAAMsN,QAAUzjC,EACrB,MACF,IAAK,IACH5F,KAAK+7B,MAAMgB,OAASjlB,EAAO,EAKjC,CAEAhL,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,MAAM4C,EAAa7gC,KAAK6iC,UAAY,EAAK7iC,KAAK+7B,MAAMmN,OAC9CY,EAAc9pC,KAAKopC,WAAa,EAAKppC,KAAK+7B,MAAMsN,OAChDjrC,EAAOn0B,KAAKjE,IAAIg6B,KAAKsL,OAAO0wB,GAAK6E,EAAW7gC,KAAKsL,OAAO0wB,GAAK6E,GAC7Dx1B,EAAQphC,KAAKhE,IAAI+5B,KAAKsL,OAAO0wB,GAAK6E,EAAW7gC,KAAKsL,OAAO0wB,GAAK6E,GAC9DnvC,EAAMznB,KAAKjE,IAAIg6B,KAAKsL,OAAO2wB,GAAK6N,EAAY9pC,KAAKsL,OAAO2wB,GAAK6N,GAC7D16B,EAASnlC,KAAKhE,IAAI+5B,KAAKsL,OAAO2wB,GAAK6N,EAAY9pC,KAAKsL,OAAO2wB,GAAK6N,GACtE,OAAI1rC,EAAOuG,EAAK2G,OAAOxG,GAAKH,EAAK2G,OAAOxG,EAAIuG,GAAS3Z,EAAMiT,EAAK2G,OAAOvG,GAAKJ,EAAK2G,OAAOvG,EAAIqK,GAGrFzL,MAAMmJ,SAASnI,EACxB,EACDrE,EAzIKyoC,EAAa,OACH7K,EAAAA,GAAAA,QA0IhB6K,EAAc5K,UAAU4L,SAAW,CAAE5K,KAAM,iBAE3C4J,EAAc5K,UAAUC,YAAc,CACpCpxD,OAAQ,CAAC,CAAEnF,KAAM,aAAcW,KAAM,OAAQtE,MAAO,UAGtD,U,2CCxIO,MAAM8lE,EAAqBr/D,OAAO6xC,OAAO,CAC9C,CAAC0hB,EAAAA,GAAAA,SAA4BxxD,EAAAA,EAC7B,CAACwxD,EAAAA,GAAAA,OAA0B+L,EAAAA,EAC3B,CAAC/L,EAAAA,GAAAA,SAA4BgM,EAAAA,EAC7B,CAAChM,EAAAA,GAAAA,WAA8BiM,EAAAA,EAC/B,CAACjM,EAAAA,GAAAA,OAA0B2H,EAAAA,EAC3B,CAAC3H,EAAAA,GAAAA,cAAiCkM,EAAAA,EAClC,CAAClM,EAAAA,GAAAA,SAA4BmM,EAC7B,CAACnM,EAAAA,GAAAA,WAA8BoM,EAAAA,EAC/B,CAACpM,EAAAA,GAAAA,uBAA0CqM,EAAAA,EAC3C,CAACrM,EAAAA,GAAAA,gBAAmCsM,EAAAA,EACpC,CAACtM,EAAAA,GAAAA,MAAyBrF,EAAAA,EAC1B,CAACqF,EAAAA,GAAAA,SAA4BuM,EAAAA,EAC7B,CAACvM,EAAAA,GAAAA,aAAgCwM,EAAAA,EACjC,CAACxM,EAAAA,GAAAA,SAA4BsH,EAAAA,EAC7B,CAACtH,EAAAA,GAAAA,UAA6BpsC,EAAAA,EAC9B,CAACosC,EAAAA,GAAAA,WAA8ByM,EAAAA,EAC/B,CAACzM,EAAAA,GAAAA,kBAAqC0M,EACtC,CAAC1M,EAAAA,GAAAA,oBAAuC2M,EAAAA,EACxC,CAAC3M,EAAAA,GAAAA,YAA+B4M,EAAAA,EAChC,CAAC5M,EAAAA,GAAAA,YAA+B6M,EAAAA,EAChC,CAAC7M,EAAAA,GAAAA,QAA2B8M,EAC5B,CAAC9M,EAAAA,GAAAA,MAAyBhqD,EAAAA,EAC1B,CAACgqD,EAAAA,GAAAA,UAA6B+M,EAAAA,EAC9B,CAAC/M,EAAAA,GAAAA,cAAiCgN,EAAAA,EAClC,CAAChN,EAAAA,GAAAA,OAA0BiN,EAAAA,G,qoBCb7B,MAAMxrD,UAAgGmgB,IAAAA,OAIpGC,kBAAqCqrC,EAAiB/5D,GACpD,OAAO,IAAI2uB,KAAKorC,EAAK/5D,EACvB,CAEA0uB,0BACEthB,GAEA,OAAO,CACT,CAmCA4hB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,kBAlCV,GAAKA,EAAA,4BACK,GAAKA,EAAA,aACZ,CAAC,GAACA,EAAA,qBAAAA,EAAA,uBAAAA,EAAA,mBAsBW,MAAIA,EAAA,oBAClB,GAAKA,EAAA,mBACN,GAAKA,EAAA,kBACN,GAAKA,EAAA,yBACE,GAAKA,EAAA,6BAqFD,SAA6CA,EAAA,WAE9DwE,GAAc9E,KAAK3uB,MAAMw0B,MAAMf,EAAEA,KAAExE,EAAA,WAEnCyE,GAAc/E,KAAK3uB,MAAMw0B,MAAMd,EAAEA,KAAEzE,EAAA,oCA4DX,KAAM,IAAAk+B,EAClC,MAAMr6C,EAAkB,QAAbq6C,EAAGx+B,KAAK3uB,aAAK,IAAAmtD,OAAA,EAAVA,EAAYx3C,QAAQ7C,QAClC,GAAIA,EAAO,CACT,MAAQ2gB,EAAGumC,GAAerrC,KAAKo8B,uBACzBkP,EAAqBD,EAAWl/D,QAAO,CAACC,EAAKjF,KACjD,MAAMokE,EAAYvrC,KAAK+7B,MAAM50D,GAE7B,MAAO,IACFiF,EACH,CAACjF,GAHeokE,GAAapnD,EAAMu6C,yBAAyB6M,GAI7D,GACA,CAAC,GACJvrC,KAAKxxB,IAAI,CAAE88D,sBACb,KA3JAtrC,KAAK3uB,MAAQA,EACT2uB,KAAKq8B,YACPr8B,KAAKxxB,IAAIwxB,KAAKq8B,eAAiB,CAAC,GAEhCr8B,KAAKxxB,IAAIwxB,KAAK+pC,UAAY,CAAC,GAE7B/pC,KAAKxxB,IAAIP,GACT+xB,KAAK67B,QAAU,GAEf77B,KAAK+S,YAAc/S,KAAK+S,YAAYzP,KAAKtD,MACzCA,KAAK2S,YAAc3S,KAAK2S,YAAYrP,KAAKtD,MACzCA,KAAKqgC,UAAYrgC,KAAKqgC,UAAU/8B,KAAKtD,MACrCA,KAAKsD,KAAK,YAAatD,KAAK+S,aAC5B/S,KAAKsD,KAAK,YAAatD,KAAK2S,aAC5B3S,KAAKsD,KAAK,UAAWtD,KAAKqgC,WAC1BrgC,KAAKsD,KAAK,UAAU,KAAM,IAAAkoC,EAAAC,EAAAC,EAAAC,EAExB,MAAMj/D,EAAUszB,KAAKsN,kBACK,QADYk+B,GAClCC,EAAAzrC,KAAK3uB,OAAMikB,mBAAW,IAAAk2C,GAAI,QAAJA,EAAtBA,EAAA3pD,KAAA4pD,UAA0B,IAAAD,OAAA,EAA1BA,EAA4BI,gBAAgB,WAAY5rC,MACrC,QAD0C0rC,GAC7DC,EAAA3rC,KAAK3uB,OAAMgD,gBAAQ,IAAAq3D,GAAI,QAAJA,EAAnBA,EAAA7pD,KAAA8pD,UAAuB,IAAAD,OAAA,EAAvBA,EAAyBE,gBAAgB,WAAY5rC,MAEzDtzB,SAAAA,EAASqB,QAAQ,SAAUrB,EAAQ,GAEvC,CAEI7E,WACF,OAAQm4B,KAAKK,YAA+Bx4B,IAC9C,CAEAo4D,YACE,OAAOjgC,KAAK67B,OACd,CAEAltB,OAAOlwB,EAAWotD,GAAa,CAE/Br8B,cAAcX,GACZ7O,KAAK6O,WAAaA,EAClB7O,KAAKjyB,QAAQ,SACf,CAEAo7B,aAAa/J,GACXY,KAAKZ,UAAYA,EACjBY,KAAKjyB,QAAQ,SACf,CAEAgwD,wBACE,OAAO/9B,KAAK6O,YAAc7O,KAAKZ,SACjC,CAEA0sC,qBAA8B,IAAAC,EAC5B,MAAM35D,EAAmE,QAA1D25D,EAAG/rC,KAAK3uB,MAAMgD,WAAWu3D,gBAAgB,WAAY5rC,aAAK,IAAA+rC,OAAA,EAAvDA,EAAyD9wD,OAC3E,OAAO7I,aAAS,EAATA,EAAW8I,aAAc8kB,IAClC,CAEAxxB,IAAI48D,GACF,MAAMY,EAAcrhE,OAAOC,KAAKwgE,GAAKj/D,QACnC,CAACC,EAAKjF,KAAQ,IAAMiF,EAAK,CAACjF,GAAM64B,KAAK+7B,MAAM50D,MAC3C,CAAC,GAEH,GAAI0F,KAAKE,UAAUq+D,KAASv+D,KAAKE,UAAUi/D,GAAc,CACvD,MAAMC,EAAaA,CAACC,EAA0BC,EAA0BhlE,KACtE,GAAI64B,KAAKnyB,gBAA0B,eAAR1G,EACzB,OAAOglE,QAAAA,EAAY,CAAC,CACtB,EAEFC,IAAUpsC,KAAK+7B,MAAOqP,EAAKa,GACvBjsC,KAAK8rC,uBAAyB9rC,KAAKiJ,gBACrCjJ,KAAKwQ,8BAEPxQ,KAAKjyB,QAAQ,SAAUiyB,KACzB,CACA,OAAOA,IACT,CAEAwf,IAA2Br4C,GACzB,OAAO64B,KAAK+7B,MAAM50D,EACpB,CAQA0+B,MAAK5hC,GAAyC,IAAxC,EAAE6gC,EAAC,EAAEC,GAAiC9gC,EAC1C+7B,KAAKsL,OAAS,CAAC,EACfxG,EAAE3yB,SAASgvB,IACTx2B,OAAO0hE,eAAersC,KAAKsL,OAAQnK,EAAI,CACrCqe,IAAKA,IAAMxf,KAAK6W,GAAG7W,KAAK+7B,MAAM56B,KAC9B,IAGJ4D,EAAE5yB,SAASgvB,IACTx2B,OAAO0hE,eAAersC,KAAKsL,OAAQnK,EAAI,CACrCqe,IAAKA,IAAMxf,KAAK2/B,GAAG3/B,KAAK+7B,MAAM56B,KAC9B,GAEN,CAEAR,OAAOliB,GAA4B,CAEnCu/C,aAAa9pB,GACiBlU,KAAKZ,YAAcY,KAAK6O,aAElDqF,EAAQo4B,YAAc,IAExBtsC,KAAKigC,YAAYv4D,KAAK6kE,GAAUA,EAAM5rC,OAAOuT,KAC7CA,EAAQo4B,YAAc,CACxB,CAEAv5B,YAAYpO,GACV3E,KAAKmZ,aAAc,EACnBnZ,KAAKlyB,kBAAmB,EACxB,IAAK,MAAMy+D,KAASvsC,KAAKigC,YACvB,GAAIsM,EAAMz/B,SAASnI,GAGjB,OAFA3E,KAAK0O,YAAc69B,OACnBvsC,KAAK0O,YAAY89B,aAAa7nC,EAIpC,CAEAgO,YAAYhO,GACLA,EAAKkI,WAGc,MAApB7M,KAAK0O,cACP1O,KAAK0O,YAAYuuB,OAAOt4B,GACxB3E,KAAKjyB,QAAQ,UAEjB,CAEAsyD,UAAU5hD,GACRuhB,KAAKmZ,aAAc,EACnBnZ,KAAKlyB,kBAAmB,EACxBkyB,KAAK0O,YAAc,KACd1O,KAAKiJ,gBAAmBjJ,KAAKsN,mBAChCtN,KAAKwQ,8BAEPxQ,KAAKjyB,QAAQ,SAAUiyB,KACzB,CAkBA5kB,eACE,MAAM+I,EAAQ6b,KAAK3uB,MAAM2V,QAAQ7C,SAC3B,mBAAEmnD,GAAuBtrC,KAAK+7B,MACpC,IAAK53C,IAAUmnD,EAGb,OAEF,MAAMmB,EAA6B9hE,OAAOm0C,QAAQwsB,GAAoBn/D,QACpE,CAACC,EAAGiM,KAAA,IAAGlR,EAAKulE,GAAUr0D,EAAA,MAAM,IACvBjM,EACH,CAACjF,GAAMulE,GAAavoD,EAAMs8C,0BAA0BiM,GACrD,GACD,CAAC,GAEH1sC,KAAKxxB,IAAIi+D,EACX,CAEA3kC,gBAAgBnD,GACd,IAAK,MAAM4nC,KAASvsC,KAAKigC,YACvB,GAAIsM,EAAMz/B,SAASnI,GACjB,OAAO,EAGX,OAAO,CACT,CAEAmI,SAASnI,GACP,OAAO3E,KAAK8H,gBAAgBnD,EAC9B,CAEAs5B,oCACE,OAAOj+B,KAAK3uB,MAAM2V,QAAQ2M,eAAe64B,uBAAyBxsB,KAAK2sC,cACzE,CAEAhgE,iBACE,IAAIF,EAEFA,EADEuzB,KAAKihC,mBACE12D,IAAM,CAAC,EAAGy1B,KAAKihC,sBAEf12D,IAAM,CAAC,EAAGy1B,KAAKo+B,aAEtBp+B,KAAKnyB,gBACPpB,EAAOO,OAAOwF,KAAK,CAAE3K,KAAM,aAAcW,KAAM,aAActE,MAAO,eAElD,MAAhBuI,EAAO4C,QACT5C,EAAO4C,MAAQ2wB,KAAKx3B,MAEtB,IAAK,MAAMuH,KAAStD,EAAOO,OACJ,MAAjB+C,EAAM6Y,UACR7Y,EAAM5L,MAAQ4L,EAAM6Y,SAEQ,MAA1BoX,KAAK+7B,MAAMhsD,EAAMvH,QACnBuH,EAAM5L,MAAQ67B,KAAK+7B,MAAMhsD,EAAMvH,OAGnC,OAAOiE,CACT,CAEAgZ,WACE,OAAOlb,IAAM,CAAC,EAAGy1B,KAAK+7B,MAAO,CAAEl0D,KAAMm4B,KAAKn4B,MAC5C,CAEAqf,WACE,OAAO8Y,KAAKva,UACd,CAEAi7C,+BACE,OAAO1gC,KAAK+7B,MAAMuP,mBAAqB3gE,OAAOC,KAAKo1B,KAAK+7B,MAAMuP,oBAAsB,EACtF,CAEAtwD,mBAGE,OAAO+L,IAAKiZ,KAAK9Y,WAAY8Y,KAAK0gC,+BACpC,CAEAkM,cAAclgE,GACZkL,YAAW,KACTlL,EAAQ8jC,8BACR,MAAMrP,EAAKnB,KAAK3uB,MAAMgD,WAAWu3D,gBAAgB,WAAY5rC,MACpD,IAAAnpB,EAAJsqB,EAwBHA,EAAG7a,QAAQ5Z,GArBE,QAAbmK,EAAA7D,OAAO8D,cAAM,IAAAD,GAAbA,EAAeg2D,eAAe,2BAA4B,CACxD/0D,MAAO,CACLg1D,WAAY,CACVjlE,KAAMm4B,gBAAI,EAAJA,KAAMn4B,KACZ+S,UAAWolB,gBAAI,EAAJA,KAAMplB,UACjBu+B,YAAanZ,gBAAI,EAAJA,KAAMmZ,YACnBtK,WAAY7O,gBAAI,EAAJA,KAAM6O,WAClBzP,UAAWY,gBAAI,EAAJA,KAAMZ,UACjBtxB,iBAAkBkyB,gBAAI,EAAJA,KAAMlyB,kBAE1Bi/D,WAAY,CACVllE,KAAM6E,aAAO,EAAPA,EAAS7E,KACf+S,UAAWlO,aAAO,EAAPA,EAASkO,UACpBu+B,YAAazsC,aAAO,EAAPA,EAASysC,YACtBtK,WAAYniC,aAAO,EAAPA,EAASmiC,WACrBzP,UAAW1yB,aAAO,EAAPA,EAAS0yB,UACpBtxB,iBAAkBpB,aAAO,EAAPA,EAASoB,oBAMnC,GAEJ,CAEAgyC,WACE,OAAO9f,KAAKx3B,IACd,CAEAygC,eACE,OAAOjJ,KAAKplB,SACd,CAEA4uB,yBACE,OAAOxJ,KAAKgtC,mBACd,CAEAC,UACEjtC,KAAKwQ,8BACLxQ,KAAKuD,QACP,CAEAqT,yBACE,OAAOA,EAAAA,EAAAA,wBAAuB5W,KAAK3uB,MAAM2V,QAAQ2M,eACnD,CAEA9lB,eACE,QAASmyB,KAAKn4B,KAAKw8B,WAAW,UAChC,CAEAiJ,kBACE,QAAStN,aAAAA,KAAMn4B,KAAKw8B,WAAW,eACjC,CAEAsoC,eAAe,IAAAO,EACb,MAAM,MAAEC,EAAK,MAAEC,GAAUC,EAAAA,GAAoBrtC,KAAK3uB,MAAM2V,QAAQ7C,QAAQkB,WAClE7a,EAAkC,QAAxB0iE,EAAGltC,KAAK+7B,MAAMvxD,kBAAU,IAAA0iE,OAAA,EAArBA,EAAwBE,GAG3C,YAAmBx3D,IAAfpL,GAEmC,IAAnCG,OAAOC,KAAKJ,GAAYK,SAErBU,EAAAA,EAAAA,IAAU,CAAEpH,MAAOgpE,EAAOnnE,IAAKwE,EAAWlB,KAAMrD,IAAKuE,EAAWhB,IACzE,CAEA4+B,gBAAgB3+B,GACd,MAAM,MAAE2jE,EAAK,MAAED,GAAUE,EAAAA,GAAoBrtC,KAAK3uB,MAAM2V,QAAQ7C,QAAQkB,WAClEg9C,EAAe13D,OAAOC,KAAKT,EAAAA,IAAgBmjE,QAAQF,GAEzD,IAAIG,EAA4B,GAC5BC,EAA6C,CAAC,EAElD,OAAQ/jE,GACN,KAAK4+B,EAAAA,GAAAA,gBACHklC,EAAkB5iE,OAAOC,KAAKT,EAAAA,IAAgB2P,QAAO,CAAC3S,EAAK+Q,IAAUA,EAAQmqD,IAC7EmL,EAAa,CAAElkE,KAAM6jE,GACrB,MAEF,KAAK9kC,EAAAA,GAAAA,gBACHklC,EAAkB5iE,OAAOC,KAAKT,EAAAA,IAAgB2P,QAAO,CAAC3S,EAAK+Q,IAAUA,EAAQmqD,IAC7EmL,EAAa,CAAEhkE,GAAI2jE,GACnB,MAEF,KAAK9kC,EAAAA,GAAAA,YACHklC,EAAkB5iE,OAAOC,KAAKT,EAAAA,IAAgB2P,QAAO,CAAC3S,EAAK+Q,IAAUA,IAAUmqD,IAC/EmL,EAAa,CAAElkE,KAAM6jE,EAAO3jE,GAAI2jE,GAChC,MAEF,KAAK9kC,EAAAA,GAAAA,IACL,QAEE,YADArI,KAAKxxB,IAAI,CAAEhE,WAAY,CAAC,IAK5Bw1B,KAAKxxB,IAAI,CACPhE,WAAYG,OAAO8iE,OAAO,CAAC,KAAMF,EAAgB7lE,KAAK0D,IAAI,CAAQ,CAACA,GAAO,CAAC,MAAO,CAAE,CAACgiE,GAAQI,KAEjG,CAEAE,iBAAiBjvD,GACf,OAAO,CACT,EACD6hB,EA5YK3gB,EAAO,OAETu+C,EAAAA,GAAAA,SA4YJ,S,+jBCtaA,MAAMyP,UAA4EhuD,EAAAA,EAMhF0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YAJf,gBAAcA,EAAA,aACb,CAAC,GAAI,IAAK,KAAM,MAAO,KAAM,MAAIA,EAAA,oCAqEX,KAAM,IAAAk+B,EAClC,MAAMr6C,EAAkB,QAAbq6C,EAAGx+B,KAAK3uB,aAAK,IAAAmtD,OAAA,EAAVA,EAAYx3C,QAAQ7C,QAClC,GAAIA,EAAO,CACT,MAAMypD,EAA0B5tC,KAAK+7B,MAAM8R,MAAMnmE,KAAKomE,IAAI,IACrDA,EACHhpC,EAAG3gB,EAAMu6C,yBAAyBoP,EAAKhpC,OAGzC9E,KAAKxxB,IAAI,CAAEo/D,2BACb,KA1EA5tC,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,KACjC,CAEAq8B,cACE,MAAO,CACLtK,OAAQ,CACN7rD,MAAO,EACPxB,MAAOs7B,KAAK4W,yBAAyB0lB,gBAAgBC,OAAO1D,MAGlE,CAEA8C,cAAcznB,GACZ,MAAMoD,GAASy2B,EAAAA,EAAAA,IAAuB/tC,KAAK+7B,MAAMhK,OAAO7rD,OACxDguC,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OAE7CwvC,EAAQ2oB,UAAUvlB,EAAQA,GAC1BpD,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOhzD,KAAKyrC,MAAM1V,KAAK6W,GAAG7W,KAAK+7B,MAAM8R,MAAM,GAAG/oC,IAAK76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK+7B,MAAM8R,MAAM,GAAG9oC,KAClG,IAAK,MAAM3kB,KAAK4f,KAAK+7B,MAAM8R,MAAM/jE,MAAM,GACrCoqC,EAAQgpB,OAAOjzD,KAAKyrC,MAAM1V,KAAK6W,GAAGz2B,EAAE0kB,IAAK76B,KAAKyrC,MAAM1V,KAAK2/B,GAAGv/C,EAAE2kB,KAEhEmP,EAAQipB,SACRjpB,EAAQ2oB,WAAoB,EAAVvlB,GAAuB,EAAVA,GAE/B,MAAMpjC,EAAO,IAAI8sD,EAAAA,EACf,CACEG,KAAM,CAAEr7D,KAAM,EAAGgB,MAAO,QACxBy6D,aAAcyM,EAAAA,GAAAA,OACd1M,UAAW2M,EAAAA,GAAAA,OACX7M,UAAWphC,KAAK4W,yBAAyB0lB,gBAAgBC,OAAO2E,uBAElElhC,KAAK3uB,OAEP,IAAK,IAAIgF,EAAI,EAAGA,EAAI2pB,KAAK+7B,MAAM8R,MAAMhjE,OAAQwL,IAAK,CAChD,IAAI0uB,EACJ,MAAM3kB,EAAI4f,KAAK+7B,MAAM8R,MAAMx3D,GAEzB0uB,EADE1uB,EAAI,GAAK2pB,KAAK+7B,MAAM8R,MAAMx3D,EAAI,GAAG0uB,EAAI3kB,EAAE2kB,EACrC/E,KAAK2/B,GAAGv/C,EAAE2kB,GAAK,EAEf/E,KAAK2/B,GAAGv/C,EAAE2kB,GAAK,EAErB7wB,EAAK1F,IAAI,CAAE0F,KAAM8rB,KAAK6tC,MAAMx3D,GAAIyuB,EAAG9E,KAAK6W,GAAGz2B,EAAE0kB,GAAIC,MACjD7wB,EAAKysB,OAAOuT,EACd,CAEIlU,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEA+rB,YACE,OAAOjgC,KAAK+7B,MAAM8R,MAAMnmE,KACtB,CAAComE,EAAM51D,IACL,IAAI4jD,EAAAA,EAAM,GAADt3D,OACJ0T,IACH,IAAM41D,EAAKhpC,IACX,IAAMgpC,EAAK/oC,GACX/E,KAAK47B,OACL57B,KAAK3uB,QAGb,CAcA+J,eACE,MAAM+I,EAAQ6b,KAAK3uB,MAAM2V,QAAQ7C,SAC3B,wBAAEypD,GAA4B5tC,KAAK+7B,MACzC,IAAK53C,IAAUypD,EAGb,OAEF,MAAMC,EAAQD,EAAwBlmE,KAAKomE,IAAI,IAC1CA,EACHhpC,EAAG3gB,EAAMs8C,0BAA0BqN,EAAKhpC,OAE1C9E,KAAKxxB,IAAI,CAAEq/D,SACb,CAEAl/B,OAAO7J,EAAWC,GAChB,IAAK,MAAMg7B,KAAS//B,KAAK+7B,MAAM8R,MAC7B9N,EAAMj7B,GAAKA,EACXi7B,EAAMh7B,GAAKA,CAEf,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EACvD+7B,KAAK+7B,MAAM8R,OAAOhmE,GAAMi9B,GAAKgT,EAC7B9X,KAAK+7B,MAAM8R,OAAOhmE,GAAMk9B,GAAKa,CAC/B,CAEAkH,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,MAAM4P,EAAQ7tC,KAAK+7B,MAAM8R,MACzB,IAAK,IAAIx3D,EAAI,EAAGA,EAAIw3D,EAAMhjE,OAAS,EAAGwL,IACpC,GACEkX,EAAAA,GAAAA,kBAAuBoX,EAAK2G,OAAQ,CAClC0wB,GAAIh8B,KAAK6W,GAAGg3B,EAAMx3D,GAAGyuB,GACrBm3B,GAAIj8B,KAAK2/B,GAAGkO,EAAMx3D,GAAG0uB,GACrBm3B,GAAIl8B,KAAK6W,GAAGg3B,EAAMx3D,EAAI,GAAGyuB,GACzBq3B,GAAIn8B,KAAK2/B,GAAGkO,EAAMx3D,EAAI,GAAG0uB,MACrB,GAEN,OAAO,EAGX,OAAOpB,MAAMmJ,SAASnI,EACxB,CAEA+7B,+BACE,MAAO,CAAC,QACV,EACDpgC,EArIKqtC,EAAY,OACFzP,EAAAA,GAAAA,cAsIhByP,EAAaxP,UAAUC,YAAc,CACnCpxD,OAAQ,CAAC,CAAEnF,KAAM,OAAQW,KAAM,YAGjC,S,6iBC3HA,MAAM0lE,UAA+DvuD,EAAAA,EASnE0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YAPf,WAASA,EAAA,2BAEuC,MAAIA,EAAA,6BAoDpC,KAAM,CAAGwE,EAAG,CAAC,KAAM,KAAM,iBAAkBC,EAAG,CAAC,KAAM,KAAM,qBAAmBzE,EAAA,mCAkHxEr8B,IAUvB,IAVwB,kBAC5BkqE,EAAiB,cACjBC,EAAa,aACbC,EAAY,aACZC,GAMDrqE,EACC,MAAM84D,EAAQxvC,EAAAA,GAAAA,sBAA2B,CACvCghD,YAAaJ,EACbE,eACAC,iBAEIE,EAAyBjhD,EAAAA,GAAAA,wBAA6B,CAC1D4gD,oBACApR,QACAqR,kBAEF,MAAO,CACLtpC,EAAG9E,KAAK3uB,MAAMw0B,MAAMf,EAAEiB,OAAOyoC,EAAuB1pC,GACpDC,EAAG/E,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OAAOyoC,EAAuBzpC,GACrD,IAxLD/E,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/BA,KAAKg/B,qBAAsBtuB,EAAAA,EAAAA,GAAoBtjC,SAAS6xD,cAAc,WACtEj/B,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,QACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,SACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,OACA,IAAM97B,KAAKyuC,kBAAiB,GAAMC,GAAG5pC,GAAK9E,KAAK+7B,MAAMC,KACrD,IAAMh8B,KAAKyuC,kBAAiB,GAAMC,GAAG3pC,GAAK/E,KAAK+7B,MAAME,IACrDj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,UACA,IAAM97B,KAAKyuC,kBAAiB,GAAME,GAAG7pC,GAAK9E,KAAK+7B,MAAMG,KACrD,IAAMl8B,KAAKyuC,kBAAiB,GAAME,GAAG5pC,GAAK/E,KAAK+7B,MAAMI,IACrDn8B,KAAK47B,OACL57B,KAAK3uB,QAGT2uB,KAAK6F,MAAM7F,KAAKo8B,uBAClB,CAEAC,cACE,MAAM,gBAAEC,GAAoBt8B,KAAK4W,yBACjC,MAAO,CACLuoB,KAAM7C,EAAgBoF,YACtB3P,OAAQ,CACN7rD,MAAO,EACPxB,MAAO43D,EAAgBC,OAAOxK,QAGpC,CAIA4J,cAAcznB,GACZ,MAAM06B,EAAc5uC,KAAKyuC,mBACnBpE,EAAU,IAAI3K,OACpBxrB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMoD,MACpCjrB,EAAQ4oB,YACJ8R,EAAYF,GAAG5pC,IAAM8pC,EAAYC,GAAG/pC,GAAK8pC,EAAYF,GAAG3pC,IAAM6pC,EAAYC,GAAG9pC,GAC/EslC,EAAQnN,OAAO0R,EAAYE,GAAGhqC,EAAG8pC,EAAYE,GAAG/pC,GAChDslC,EAAQnN,OAAO0R,EAAYF,GAAG5pC,EAAG8pC,EAAYF,GAAG3pC,KAEhDslC,EAAQpN,OAAO2R,EAAYD,GAAG7pC,EAAG8pC,EAAYD,GAAG5pC,GAChDslC,EAAQvD,cACN8H,EAAYG,IAAIjqC,EAChB8pC,EAAYG,IAAIhqC,EAChB6pC,EAAYI,IAAIlqC,EAChB8pC,EAAYI,IAAIjqC,EAChB6pC,EAAYF,GAAG5pC,EACf8pC,EAAYF,GAAG3pC,GAEjBslC,EAAQvD,cACN8H,EAAYK,IAAInqC,EAChB8pC,EAAYK,IAAIlqC,EAChB6pC,EAAYM,IAAIpqC,EAChB8pC,EAAYM,IAAInqC,EAChB6pC,EAAYD,GAAG7pC,EACf8pC,EAAYD,GAAG5pC,GAEjBslC,EAAQrK,YACRhgC,KAAKmvC,YAAc9E,EACnBn2B,EAAQirB,KAAKkL,IAGfn2B,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OAC7CwvC,EAAQipB,OAAOkN,GAEXrqC,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEAu6B,mBAAmC,IAAlBW,EAAQz1D,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,IAAAA,UAAA,GACvB,MAAM,GAAEqiD,EAAE,GAAEE,EAAE,GAAED,EAAE,GAAEE,EAAE,cAAEkT,EAAa,cAAEC,GAAkBtvC,KAAKsL,OAExDwjC,EAAK,CAAEhqC,EAAGo3B,EAAIn3B,EAAGo3B,GACjB0S,EAAK,CAAE/pC,EAAGk3B,EAAIj3B,EAAGk3B,GAEvB,IAAIsT,EACJ,GAAKxzC,MAAMszC,IAAmBtzC,MAAMuzC,GASlC,MAAO,CACLR,GAAID,EACJH,GAAII,EACJD,GAAIC,EACJH,GAAIE,GAb4C,CAClD,MAAMzgC,EAAS,CAAEtJ,EAAGuqC,EAAetqC,EAAGuqC,GAChCzW,EAAO,CAAEmD,KAAIC,KAAIC,KAAIC,MACrBiJ,EAAW73C,EAAAA,GAAAA,eAAoB6gB,EAAQyqB,GAC7C0W,EAAqBhiD,EAAAA,GAAAA,yBAA8B,CACjD63C,WACAvM,QAEJ,CASA,MAAM2W,GAAeV,EAAGhqC,EAAI+pC,EAAG/pC,GAAK,EAC9B2qC,GAAeX,EAAG/pC,EAAI8pC,EAAG9pC,GAAK,EAC9BsgC,EAAekK,EAAmBzqC,EAAIgqC,EAAGhqC,EACzCwgC,EAAeiK,EAAmBxqC,EAAI+pC,EAAG/pC,EAEzC2pC,EAAK,CAAE5pC,EAAG0qC,EAAcnK,EAActgC,EAAG0qC,EAAcnK,GACvDqJ,EAAK,CAAE7pC,EAAG0qC,GAAe,EAAInK,EAActgC,EAAG0qC,GAAe,EAAInK,GACjEoK,EAAU1vC,KAAK3uB,MAAMw0B,MAAMf,EAAEiB,OAC7B4pC,EAAU3vC,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OACnC,GAAIqpC,EACF,MAAO,CACLV,GAAI,CAAE5pC,EAAG4qC,EAAQhB,EAAG5pC,GAAIC,EAAG4qC,EAAQjB,EAAG3pC,IACtC4pC,GAAI,CAAE7pC,EAAG4qC,EAAQf,EAAG7pC,GAAIC,EAAG4qC,EAAQhB,EAAG5pC,KAI1C,MAAM6qC,GAAoCL,EAAmBzqC,EAAI4pC,EAAG5pC,GAAK,KAAQyqC,EAAmBzqC,EAAI4pC,EAAG5pC,GACrG+qC,GAAoCN,EAAmBxqC,EAAI2pC,EAAG3pC,GAAK,KAAQwqC,EAAmBxqC,EAAI2pC,EAAG3pC,GAErG+qC,EAAgBhB,EAAGhqC,EAAI8qC,EACvBG,EAAgBjB,EAAG/pC,EAAI8qC,EAEvBG,EAAgBnB,EAAG/pC,EAAI8qC,EACvBK,EAAgBpB,EAAG9pC,EAAI8qC,EAEvBb,EAAM,CACVlqC,EAAGyqC,EAAmBzqC,EAAI8qC,EAC1B7qC,EAAGwqC,EAAmBxqC,EAAI8qC,GAEtBK,EAAsBlB,EAAIlqC,EAAIgrC,EAC9BK,EAAsBnB,EAAIjqC,EAAIgrC,EAMpC,MAAO,CACLjB,KACAJ,KACAG,KACAF,KACAK,MACAC,IAVU,CAAEnqC,EAAGkrC,EAAgBE,EAAqBnrC,EAAGkrC,EAAgBE,GAWvEjB,IAVU,CAAEpqC,EAAGkrC,GAAiB,EAAIE,EAAqBnrC,EAAGkrC,GAAiB,EAAIE,GAWjFpB,IAVU,CAAEjqC,EAAGgrC,GAAiB,EAAII,EAAqBnrC,EAAGgrC,GAAiB,EAAII,GAYrF,CA6BAxhC,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMC,IAAMl3B,EACjB9E,KAAK+7B,MAAME,IAAMl3B,EACjB/E,KAAK+7B,MAAMG,IAAMp3B,EACjB9E,KAAK+7B,MAAMI,IAAMp3B,EACjB/E,KAAK+7B,MAAMsT,eAAiBvqC,EAC5B9E,KAAK+7B,MAAMuT,eAAiBvqC,CAC9B,CAEA62B,OAAMvjD,GAA2D,IAA1D,KAAExQ,EAAI,KAAEiwC,EAAI,KAAElS,EAAI,KAAEjB,GAAoCtsB,EAC7D,OAAQxQ,GACN,IAAK,OACH,MAAMuoE,EAAe,CACnBtrC,EAAG9E,KAAK+7B,MAAMC,GAAKlkB,EACnB/S,EAAG/E,KAAK+7B,MAAME,GAAKr2B,GAEfyqC,EAAyBrwC,KAAKswC,2BAA2B,CAC7DnC,kBAAmB,CAAErpC,EAAG9E,KAAKsL,OAAO4wB,GAAIn3B,EAAG/E,KAAKsL,OAAO6wB,IACvDiS,cAAe,CACbtpC,EAAG9E,KAAKsL,OAAO+jC,cACftqC,EAAG/E,KAAKsL,OAAOgkC,eAEjBjB,aAAc,CAAEvpC,EAAG9E,KAAKsL,OAAO0wB,GAAIj3B,EAAG/E,KAAKsL,OAAO2wB,IAClDqS,aAAc,CAAExpC,EAAG9E,KAAK3uB,MAAMw0B,MAAMf,EAAEsrC,EAAatrC,GAAIC,EAAG/E,KAAK3uB,MAAMw0B,MAAMd,EAAEqrC,EAAarrC,MAE5F/E,KAAK+7B,MAAQ,IACR/7B,KAAK+7B,MACRC,GAAIoU,EAAatrC,EACjBm3B,GAAImU,EAAarrC,EACjBsqC,cAAegB,EAAuBvrC,EACtCwqC,cAAee,EAAuBtrC,GAExC,MACF,IAAK,QACH,MAAMwrC,EAAgB,CACpBzrC,EAAG9E,KAAK+7B,MAAMG,GAAKpkB,EACnB/S,EAAG/E,KAAK+7B,MAAMI,GAAKv2B,GAEf4qC,EAA0BxwC,KAAKswC,2BAA2B,CAC9DnC,kBAAmB,CAAErpC,EAAG9E,KAAKsL,OAAO0wB,GAAIj3B,EAAG/E,KAAKsL,OAAO2wB,IACvDmS,cAAe,CACbtpC,EAAG9E,KAAKsL,OAAO+jC,cACftqC,EAAG/E,KAAKsL,OAAOgkC,eAEjBjB,aAAc,CAAEvpC,EAAG9E,KAAKsL,OAAO4wB,GAAIn3B,EAAG/E,KAAKsL,OAAO6wB,IAClDmS,aAAc,CAAExpC,EAAG9E,KAAK3uB,MAAMw0B,MAAMf,EAAEyrC,EAAczrC,GAAIC,EAAG/E,KAAK3uB,MAAMw0B,MAAMd,EAAEwrC,EAAcxrC,MAE9F/E,KAAK+7B,MAAQ,IACR/7B,KAAK+7B,MACRG,GAAIqU,EAAczrC,EAClBq3B,GAAIoU,EAAcxrC,EAClBsqC,cAAemB,EAAwB1rC,EACvCwqC,cAAekB,EAAwBzrC,GAEzC,MACF,IAAK,MACL,IAAK,SACH/E,KAAK+7B,MAAQ,IACR/7B,KAAK+7B,MACRsT,cAAe1qC,EAAKG,EACpBwqC,cAAe3qC,EAAKI,GAM5B,CAEA+H,SAASnI,GAAgB,IAAA47B,EACvB,OAAI58B,MAAMs6B,yCACNj+B,KAAKmvC,aAAuC,QAA5B5O,EAAIvgC,KAAKg/B,2BAAmB,IAAAuB,IAAxBA,EAA0BC,cAAcxgC,KAAKmvC,YAAaxqC,EAAK2G,OAAOxG,EAAGH,EAAK2G,OAAOvG,KAGtGpB,MAAMmJ,SAASnI,GACxB,EACDrE,EAjRK4tC,EAAS,OACChQ,EAAAA,GAAAA,WAkRhBgQ,EAAU/P,UAAUC,YAAc,CAChCpxD,OAAQ,CACN,CAAEnF,KAAM,aAAcW,KAAM,QAC5B,CAAEX,KAAM,SAAUW,KAAM,SAAUxC,IAAK,EAAG4iB,QAAS,CAAC,KAIxD,S,qjBCtSA,MAAM6nD,UAEI9wD,EAAAA,EAOR0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YALf,0BAAwBA,EAAA,6BAmDR,KAAM,CAAGwE,EAAG,CAAC,KAAM,MAAOC,EAAG,CAAC,KAAM,UA7CzD/E,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,oBACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,oBACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,qBACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,qBACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,QAGT2uB,KAAK0wC,kBAAkB1wC,KAAK+7B,MAAM4U,cAClC3wC,KAAK6F,MAAM7F,KAAKo8B,uBAClB,CAEAC,cACE,MAAO,CACLtK,OAAQ,CACN7rD,MAAO,EACPxB,MAAOs7B,KAAK4W,yBAAyB0lB,gBAAgBC,OAAO1D,MAE9D8X,aAAc,CAAC,EAAG,KAAO,KAAO,GAAK,KAAO,GAAG7wB,WAEnD,CAIA4wB,kBAAkBC,GAChB,IAAK3wC,KAAK2wC,cAAgBA,IAAiB3wC,KAAK2wC,aAAa/nD,QAAS,CACpE,MAAMgoD,EAASD,EAAatqD,MAAM,KAAK3e,KAAKo9B,GAAMn8B,WAAWm8B,EAAE+rC,UAC/D7wC,KAAK2wC,aAAe,CAAE/nD,QAAS+nD,EAAcC,SAAQ3qE,IAAKgE,KAAKhE,OAAO2qE,GACxE,CACF,CAEAE,6BACE,OAAO9wC,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OAAO/F,KAAKsL,OAAO6wB,GAAKn8B,KAAK2wC,aAAa1qE,KAAO+5B,KAAKsL,OAAO6wB,GAAKn8B,KAAKsL,OAAO2wB,IAC1G,CAEAN,cAAcznB,GACZ,MAAM,GAAE8nB,EAAE,GAAEE,EAAE,GAAED,EAAE,GAAEE,GAAOn8B,KAAKsL,OAC1BkxB,GAAYC,EAAAA,EAAAA,IAAiB,CAAET,KAAIE,KAAID,KAAIE,OAC3CO,GAAcC,EAAAA,EAAAA,IAAoB,CAAEC,UAAW58B,KAAK+7B,MAAMhK,OAAO7rD,SAAUs2D,EAAWL,GAAIK,EAAUP,KAE1G/nB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OAC7Cs7B,KAAK0wC,kBAAkB1wC,KAAK+7B,MAAM4U,cAElC,MAAMh/C,EAASqO,KAAK+7B,MAAMI,GAAKn8B,KAAK+7B,MAAME,GACpC8U,EAAevU,EAAUL,GAAKK,EAAUP,GAE9C/nB,EAAQ2oB,UAAUH,EAAY53B,EAAG43B,EAAY33B,GAC7CmP,EAAQ4oB,YACR,IAAK,MAAM18C,KAAK4f,KAAK2wC,aAAaC,OAChC18B,EAAQ+oB,OAAOT,EAAUR,GAAI/xD,KAAKyrC,MAAMymB,EAAK/7C,EAAI2wD,IACjD78B,EAAQgpB,OAAOV,EAAUN,GAAIjyD,KAAKyrC,MAAMymB,EAAK/7C,EAAI2wD,IAEnD78B,EAAQipB,SACRjpB,EAAQ2oB,WAA2B,EAAjBH,EAAY53B,GAAyB,EAAjB43B,EAAY33B,GAElD,MAAM7wB,EAAO,IAAI8sD,EAAAA,EACf,CACEl8B,EAAG03B,EAAUR,GACbmF,KAAM,CAAEr7D,KAAM,EAAGgB,MAAO,QACxBy6D,aAAcyM,EAAAA,GAAAA,OACd5M,UAAWphC,KAAK+7B,MAAMhK,OAAOrtD,MAC7B48D,UAAW2M,EAAAA,GAAAA,MAEbjuC,KAAK3uB,OAEHmrD,EAAUR,GAAKQ,EAAUN,IAC3BhoD,EAAK1F,IAAI,CAAE8yD,UAAW2M,EAAAA,GAAAA,QAGxB,IAAK,MAAM7tD,KAAK4f,KAAK2wC,aAAaC,OAAQ,CACxC,MAAM7rC,EAAI/E,KAAK+7B,MAAMI,GAAK/7C,EAAIuR,EAC9Bzd,EAAK1F,IAAI,CACP0F,MAAW,IAAJkM,GAAS4wD,QAAQ,GAAK,MAAQjsC,EAAEisC,QAAQ,GAC/CjsC,EAAG96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG56B,GAAK/E,KAAK+7B,MAAMhK,OAAO7rD,MAAQ,KAEvDgO,EAAKysB,OAAOuT,EACd,CAEIlU,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEA+rB,YAwBE,OAvBIjgC,KAAK2wC,aAAa1qE,IAAM,GAAK+5B,KAAK67B,QAAQhxD,OAAS,IACrDm1B,KAAK67B,QAAU,IACV77B,KAAK67B,QACR,IAAIC,EAAAA,EACF,oBACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK8wC,8BACX9wC,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,oBACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK8wC,8BACX9wC,KAAK47B,OACL57B,KAAK3uB,SAIP2uB,KAAK2wC,aAAa1qE,KAAO,GAAK+5B,KAAK67B,QAAQhxD,OAAS,GACtDm1B,KAAK67B,QAAQoV,OAAO,GAGfjxC,KAAK67B,OACd,CAEAltB,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMC,IAAMl3B,EACjB9E,KAAK+7B,MAAMG,IAAMp3B,EACjB9E,KAAK+7B,MAAME,IAAMl3B,EACjB/E,KAAK+7B,MAAMI,IAAMp3B,CACnB,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EACvD,OAAQ4D,GACN,IAAK,mBACHm4B,KAAK+7B,MAAMC,IAAMlkB,EACjB9X,KAAK+7B,MAAME,IAAMr2B,EACjB,MACF,IAAK,mBACH5F,KAAK+7B,MAAMG,IAAMpkB,EACjB9X,KAAK+7B,MAAME,IAAMr2B,EACjB,MACF,IAAK,oBACH5F,KAAK+7B,MAAMC,IAAMlkB,EACjB9X,KAAK+7B,MAAMI,IAAMv2B,EACjB,MACF,IAAK,oBACH5F,KAAK+7B,MAAMG,IAAMpkB,EACjB9X,KAAK+7B,MAAMI,IAAMv2B,EACjB,MACF,IAAK,mBACH5F,KAAK+7B,MAAMC,IAAMlkB,EACjB9X,KAAK+7B,MAAME,IAAMr2B,EAAO5F,KAAK2wC,aAAa1qE,IAC1C,MACF,IAAK,mBACH+5B,KAAK+7B,MAAMG,IAAMpkB,EACjB9X,KAAK+7B,MAAME,IAAMr2B,EAAO5F,KAAK2wC,aAAa1qE,IAKhD,CAEA6mC,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,MAAMiT,EAAkBlxC,KAAK2wC,aAAa1qE,IAAM,GAAK+5B,KAAK8wC,6BACpD1yC,EAAOn0B,KAAKjE,IAAIg6B,KAAK+7B,MAAMC,GAAIh8B,KAAK+7B,MAAMG,IAC1C7wB,EAAQphC,KAAKhE,IAAI+5B,KAAK+7B,MAAMC,GAAIh8B,KAAK+7B,MAAMG,IAC3CxqC,EAAMw/C,EACRjnE,KAAKjE,IAAIg6B,KAAK+7B,MAAME,GAAIj8B,KAAK+7B,MAAMI,GAAI+U,GACvCjnE,KAAKjE,IAAIg6B,KAAK+7B,MAAME,GAAIj8B,KAAK+7B,MAAMI,IACjC/sB,EAAS8hC,EACXjnE,KAAKhE,IAAI+5B,KAAK+7B,MAAME,GAAIj8B,KAAK+7B,MAAMI,GAAI+U,GACvCjnE,KAAKhE,IAAI+5B,KAAK+7B,MAAME,GAAIj8B,KAAK+7B,MAAMI,IACvC,OAAI/9B,EAAOuG,EAAKG,GAAKH,EAAKG,EAAIuG,GAAS3Z,EAAMiT,EAAKI,GAAKJ,EAAKI,EAAIqK,GAGzDzL,MAAMmJ,SAASnI,EACxB,EACDrE,EAvMKmwC,EAAqB,OAGXvS,EAAAA,GAAAA,uBAsMhBuS,EAAsBtS,UAAUC,YAAc,CAC5CpxD,OAAQ,CACN,CAAEnF,KAAM,OAAQW,KAAM,UACtB,CAAEX,KAAM,SAAUW,KAAM,eAAgBtE,MAAO,kBAInD,S,miBC1NA,MAAMitE,UAA0EC,EAAAA,EAQ9E/wC,YAAYpyB,EAAwBoD,GAQlC,GAPAsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YANf,mBAAiBA,EAAA,qBALK,GAMSA,EAAA,6BAwBf,KAAM,CAAGwE,EAAG,CAAC,KAAM,MAAOC,EAAG,CAAC,KAAM,UAjBzD/E,KAAKqxC,sBAEDrxC,KAAK+7B,MAAME,KACbj8B,KAAK+7B,MAAME,GAAK/xD,OAAOqjB,EAAAA,GAAAA,MAAW,CAAEppB,MAAO67B,KAAK+7B,MAAME,GAAI1H,eAAgBv0B,KAAKsxC,kBAE7EtxC,KAAKo+B,YAAa,CACpB,MAAMj4D,EAAO,KAAH3B,OAAQ,IAAI+sE,OAAOvxC,KAAKsxC,cAAgB,GAAE,KACpDtxC,KAAKo+B,YAAYpxD,OAAO,GAAK,IACxBgzB,KAAKo+B,YAAYpxD,OAAO,GAC3B7G,OACAH,IAAKkE,OAAO/D,GAEhB,CACA65B,KAAK27B,cAAgB37B,KAAK27B,cAAcr4B,KAAKtD,MAC7CA,KAAK67B,QAAU,EACjB,CAIAwV,sBACE,MAAMltD,EAAQ6b,KAAK3uB,MAAM2V,QAAQ7C,QACjC6b,KAAKsxC,cAAgBntD,EACjBoJ,EAAAA,GAAAA,2BAAgC,CAC9BvN,WAAYmE,EAAMnE,WAClB7b,MAAOggB,EAAMqJ,YArCQ,CAwC7B,CAEAmuC,cAAcznB,GACZ,MAAM,cAAE5uB,GAAkB0a,KAAK4W,yBAC/B5W,KAAK+7B,MAAMI,GAAKn8B,KAAK+7B,MAAME,GAE3Bj8B,KAAK+7B,MAAMC,IAAiC,EAA5B12C,EAAc8Y,KAAKl4B,MACnC85B,KAAK+7B,MAAMG,GACTl8B,KAAK3uB,MACF2V,QACA7C,QACA8yB,YAAYjX,KAAK3uB,MAAM2V,QAAQ7C,QAAQ+yB,MAAMrsC,OAAS,GAAKm1B,KAAK3uB,MAAM2V,QAAQ9gB,MACnFy9B,MAAMg4B,cAAcznB,EACtB,CAEAs9B,aAAat9B,GACX,GAAIlU,KAAK+7B,MAAME,GAAI,CACjBj8B,KAAKqxC,sBACL,MAAM,cAAE/rD,EAAa,kBAAEwR,GAAsBkJ,KAAK4W,yBAK5CrxB,EAJkBya,KAAK3uB,MAC1BgD,WACA4a,MACA9jB,MAAMuB,GAAYA,EAAQiF,gBACMmlB,EAAoBxR,EACvD4uB,EAAQ2oB,UAAU78B,KAAK3uB,MAAM2V,QAAQ9gB,MAAQqf,EAAS8lB,MAAMnlC,MAAOqf,EAASmM,IAAIC,QAChF,IAAIqvC,EAAAA,EACF,CACEl8B,EAAG,EACHC,EAAG/E,KAAKsL,OAAO2wB,GACfkF,KAAM,CAAEr7D,KAAM,EAAGgB,MAAO,QACxBu6D,WAAY,EACZG,QAAS,CACP9vC,IAAK,EACL2Z,MAAO,EACP+D,OAAQ,EACRhR,KAAM,GAERgjC,UAAW,OACXK,WAAY,OACZF,aAAcyM,EAAAA,GAAAA,OACd95D,KAAM8rB,KAAK+7B,MAAME,GAAG+U,QAAQhxC,KAAKsxC,eAAexxB,YAElD9f,KAAK3uB,OACLsvB,OAAOuT,EACX,CACF,CAEAvF,OAAO7J,EAAkBC,GACvB/E,KAAK+7B,MAAME,IAAMl3B,CACnB,CAEA62B,OAAM33D,GAAyD,IAAxD,KAAE2hC,GAAoD3hC,EAC3D+7B,KAAK2O,OAAO,EAAG/I,EACjB,EACDtF,EA5FK6wC,EAAc,OACJjT,EAAAA,GAAAA,gBA6FhBiT,EAAehT,UAAUC,YAAc,CACrCpxD,OAAQ,CACN,CAAEnF,KAAM,OAAQW,KAAM,UACtB,CAAEX,KAAM,SAAUW,KAAM,KAAMtE,MAAO,QAASuE,cAAc,KAIhE,S,6iBC5FA,MAAMgpE,UAAoD9xD,EAAAA,EAGxD0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,6BA4BC,KAAM,CAAGwE,EAAG,CAAC,KAAM,MAAOC,EAAG,CAAC,KAAM,UA3BzD/E,KAAKW,OAASX,KAAKW,OAAO2C,KAAKtD,MAC/BA,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,OAGX,CAEAgrD,cACE,MAAO,CACLO,UAAW,EACX8U,YAAa1xC,KAAK4W,yBAAyB0lB,gBAAgBC,OAAO1D,KAEtE,CAIAl4B,OAAOuT,GACL,MAAM,GAAE8nB,EAAE,GAAEC,EAAE,GAAEC,EAAE,GAAEC,EAAE,UAAES,GAAc58B,KAAK+7B,MACrCS,GAAYC,EAAAA,EAAAA,IAAiB,CAAET,KAAIC,KAAIC,KAAIC,OAC3CO,GAAcC,EAAAA,EAAAA,IAAoB,CAAEC,eAAcJ,IAExDtoB,EAAQ2oB,UAAUH,EAAY53B,EAAG43B,EAAY33B,GAC7CmP,EAAQ4oB,YACR5oB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMa,WACpC1oB,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAM2V,aAEtCx9B,EAAQ+oB,OAAOT,EAAUR,GAAIQ,EAAUP,IACnCj8B,KAAK+7B,MAAM4V,YACbz9B,EAAQ09B,YAAY,CAAC5xC,KAAK+7B,MAAM4V,aAElCz9B,EAAQgpB,OAAOV,EAAUN,GAAIM,EAAUL,IACvCjoB,EAAQipB,SACJn9B,KAAK+7B,MAAM4V,YACbz9B,EAAQ09B,YAAY,IAEtB19B,EAAQ2oB,WAA2B,EAAjBH,EAAY53B,GAAyB,EAAjB43B,EAAY33B,GAE9C/E,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEAvF,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMC,IAAMl3B,EACjB9E,KAAK+7B,MAAMG,IAAMp3B,EACjB9E,KAAK+7B,MAAME,IAAMl3B,EACjB/E,KAAK+7B,MAAMI,IAAMp3B,CACnB,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EAC1C,MAAT4D,GACFm4B,KAAK+7B,MAAMC,IAAMlkB,EACjB9X,KAAK+7B,MAAME,IAAMr2B,IAEjB5F,KAAK+7B,MAAMG,IAAMpkB,EACjB9X,KAAK+7B,MAAMI,IAAMv2B,EAErB,CAEAkH,SAASnI,GACP,OAAIhB,MAAMs6B,sCACN1wC,EAAAA,GAAAA,kBAAuBoX,EAAM3E,KAAK+7B,QAAU,IAGzCp4B,MAAMmJ,SAASnI,GACxB,EACDrE,EApFKmxC,EAAI,OACMvT,EAAAA,GAAAA,MAqFhB,S,ikBCnFA,MAAM2T,UAA6DlyD,EAAAA,EAWjE0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YATf,WAASA,EAAA,qBAAAA,EAAA,qBAAAA,EAAA,0BAAAA,EAAA,0BAAAA,EAAA,6BAkCO,KAAM,CAAGwE,EAAG,CAAC,KAAM,MAAOC,EAAG,CAAC,KAAM,UAAQzE,EAAA,2BAE9C,KACnB,MAAM,OAAEwxC,EAAM,SAAEvqC,GAAuDvH,KAAK3uB,MAAM2V,QAAQ7C,QACpF4tD,EAAY9nE,KAAKyrC,MAAM1V,KAAK+7B,MAAMC,IAClCgW,EAAY/nE,KAAKyrC,MAAM1V,KAAK+7B,MAAMG,IAGlC+V,EAAgB1qC,EAAS,GAAK,EAC9B2qC,EAAgB3qC,EAASA,EAAS18B,OAAS,GAAK,EAChDsnE,EAAcloE,KAAKjE,IAAIiE,KAAKhE,IAAIgE,KAAKjE,IAAI+rE,EAAWC,GAAYC,GAAgBC,GAChFE,EAAcnoE,KAAKjE,IAAIiE,KAAKhE,IAAIgE,KAAKhE,IAAI8rE,EAAWC,GAAYC,GAAgBC,GAEtF,IAAIG,EAAY,EAChB,IAAK,IAAIh8D,EAAI87D,EAAa97D,GAAK+7D,EAAa/7D,IAAK,CAC/C,MAAMi8D,EAAc/qC,EAAS+lC,QAAQj3D,GACjCi8D,GAAe,IACjBD,GAAaP,EAAOQ,GAExB,CAEA,MAAO,OAAP9tE,QAAc+tE,EAAAA,EAAAA,IAA8BF,GAAU,IA7CtDryC,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,QAGT2uB,KAAK6F,MAAM7F,KAAKo8B,wBAChBp8B,KAAKwyC,MAAQxyC,KAAKyyC,MAAQ,EAE1BzyC,KAAK0yC,WAAa1yC,KAAK+7B,MAAMC,GAC7Bh8B,KAAK2yC,WAAa3yC,KAAK+7B,MAAMG,EAC/B,CA0BAP,cAAcznB,GACZA,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMoD,MACpC,MAAM,GAAEnD,EAAE,GAAEE,EAAE,GAAED,EAAE,GAAEE,GAAOn8B,KAAKsL,OAC1BkxB,GAAYC,EAAAA,EAAAA,IAAiB,CAAET,KAAIE,KAAID,KAAIE,OAE3Cj2D,EAAQs2D,EAAUN,GAAKM,EAAUR,GACjCrqC,EAAS6qC,EAAUL,GAAKK,EAAUP,GACxC/nB,EAAQ0+B,SAAS5W,EAAIQ,EAAUP,GAAI/1D,EAAOyrB,GAE1C,MAAMkhD,EAAW7yC,KAAK+7B,MAAMI,GAAKn8B,KAAK+7B,MAAME,GACtC9C,EAAc,IAAMn5B,KAAK+7B,MAAME,GAAM4W,EACrCC,EAAY,GAAHtuE,OAAMquE,EAAS7B,QAAQ,GAAE,MAAAxsE,OAAK20D,EAAW6X,QAAQ,GAAE,MAE5D98D,EAAO,IAAI8sD,EAAAA,EACf,CACE9sD,KAAM,GAAF1P,QAAKuuE,EAAAA,EAAAA,IAAiB,CAAEC,OAAQ/oE,KAAK+xB,IAAIgE,KAAK+7B,MAAMG,GAAKl8B,KAAK+7B,MAAMC,IAAKiX,mBAAoB,IAAI,SACrG7R,UAAW,OACXD,KAAM,CAAEr7D,KAAM,GAAIY,OAAQ,QAASM,OAAQ,QAC3Cu6D,aAAcyM,EAAAA,GAAAA,QAEhBhuC,KAAK3uB,OAED6hE,EAAQlX,EAAK91D,EAAQ,EACrBitE,EAAQ3W,EAAUP,GAAKtqC,EAAS,EACtC,IAAIkxC,EAAY3uD,EAAKu2D,QAAQv2B,GAC7BhgC,EAAK1F,IAAI,CACPs2B,EAAGouC,EAAQrQ,EAAY,EACvB99B,EAAGouC,EAAQj/D,EAAKk/D,cAElBl/D,EAAKysB,OAAOuT,GAEZhgC,EAAK1F,IAAI,CAAE0F,KAAM4+D,IACjBjQ,EAAY3uD,EAAKu2D,QAAQv2B,GACzBhgC,EAAK1F,IAAI,CACPs2B,EAAGouC,EAAQrQ,EAAY,EACvB99B,IAEF7wB,EAAKysB,OAAOuT,GAEZhgC,EAAK1F,IAAI,CAAE0F,KAAM8rB,KAAKqzC,uBACtBxQ,EAAY3uD,EAAKu2D,QAAQv2B,GACzBhgC,EAAK1F,IAAI,CACPs2B,EAAGouC,EAAQrQ,EAAY,EACvB99B,EAAGouC,EAAQj/D,EAAKk/D,cAElBl/D,EAAKysB,OAAOuT,GAERlU,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEAo/B,iBAAiBC,GACfvzC,KAAK+7B,MAAME,IAAMsX,EAAKtX,IAAM,EAC5Bj8B,KAAK+7B,MAAMI,IAAMoX,EAAKpX,IAAM,EAE5Bn8B,KAAKwyC,OAASe,EAAKvX,IAAM,EACzBh8B,KAAKyyC,OAASc,EAAKrX,IAAM,EAGzB,MAAMsX,KAAWxzC,KAAK0yC,WAAa1yC,KAAKwyC,QAAUxyC,KAAKwyC,MAAQ,EAAI,EAAI,KACjExyC,KAAK+7B,MAAMC,GAAKwX,GAAU,IAC9BxzC,KAAK+7B,MAAMC,GAAKwX,GAElB,MAAMC,KAAWzzC,KAAK2yC,WAAa3yC,KAAKyyC,QAAUzyC,KAAKyyC,MAAQ,EAAI,EAAI,KACjEzyC,KAAK+7B,MAAMG,GAAKuX,GAAU,IAC9BzzC,KAAK+7B,MAAMG,GAAKuX,EAEpB,CAEA9kC,OAAO7J,EAAWC,GAChB,OAAO/E,KAAKszC,iBAAiB,CAC3BtX,GAAIl3B,EACJm3B,GAAIl3B,EACJm3B,GAAIp3B,EACJq3B,GAAIp3B,GAER,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EAC1C,OAAT4D,EACFm4B,KAAKszC,iBAAiB,CAAEtX,GAAIlkB,EAAMmkB,GAAIr2B,IAEtC5F,KAAKszC,iBAAiB,CAAEpX,GAAIpkB,EAAMqkB,GAAIv2B,GAE1C,CAEAkH,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,MAAMjC,EAAK/xD,KAAKyrC,MAAM1V,KAAK+7B,MAAMC,IAC3BE,EAAKjyD,KAAKyrC,MAAM1V,KAAK+7B,MAAMG,IAE3B99B,EAAOn0B,KAAKjE,IAAIg2D,EAAIE,GACpB7wB,EAAQphC,KAAKhE,IAAI+1D,EAAIE,GACrBxqC,EAAMznB,KAAKjE,IAAIg6B,KAAK+7B,MAAME,GAAIj8B,KAAK+7B,MAAMI,IACzC/sB,EAASnlC,KAAKhE,IAAI+5B,KAAK+7B,MAAME,GAAIj8B,KAAK+7B,MAAMI,IAClD,OAAI/9B,EAAOuG,EAAKG,GAAKH,EAAKG,EAAIuG,GAAS3Z,EAAMiT,EAAKI,GAAKJ,EAAKI,EAAIqK,GAGzDzL,MAAMmJ,SAASnI,EACxB,CAEAoO,YAAY2gC,GACV/vC,MAAMoP,YAAY2gC,GAClB1zC,KAAK0yC,WAAa1yC,KAAK+7B,MAAMC,GAC7Bh8B,KAAK2yC,WAAa3yC,KAAK+7B,MAAMG,EAC/B,CAEAmE,UAAUqT,GACR/vC,MAAM08B,UAAUqT,GAChB1zC,KAAKwyC,MAAQxyC,KAAKyyC,MAAQ,CAC5B,EACDnyC,EA7KKuxC,EAAO,OACG3T,EAAAA,GAAAA,SA8KhB2T,EAAQ1T,UAAU4L,SAAW,CAAE5K,KAAM,yBAErC0S,EAAQ1T,UAAUC,YAAc,CAC9BpxD,OAAQ,CAAC,CAAEnF,KAAM,aAAcW,KAAM,UAGvC,S,yHC7LO,MAAMmrE,EAA2B1vE,IAA4E,IAA3E,MAAE2vE,EAAK,UAAEC,EAAS,aAAEC,GAAkD7vE,EAC7G,GAAI4vE,EAAU/uC,IAAMgvC,EAAahvC,GAAK+uC,EAAU9uC,IAAM+uC,EAAa/uC,EAAG,OAAO+uC,EAE7E,IAAIC,EAAeD,EACfE,EAAuB,EAC3B,IAAK,IAAI97D,EAAQ,EAAGA,EAAQ07D,EAAM/oE,OAAQqN,IAAS,CACjD,MAAM+7D,EAAwB1mD,EAAAA,GAAAA,gCAC5BsmD,EACAC,EACAF,EAAM17D,GAAO,GACb07D,EAAM17D,GAAO,IAEf,GAAI+7D,EAAuB,CACzB,MAAM7O,EAAW73C,EAAAA,GAAAA,SAAc0mD,EAAuBJ,GAClDzO,EAAW4O,IAAwBzoE,EAAAA,EAAAA,IAAU,CAAEpH,MAAOihE,MACxD4O,EAAuB5O,EACvB2O,EAAe,CAAEjvC,EAAGmvC,EAAsBnvC,EAAGC,EAAGkvC,EAAsBlvC,GAE1E,CACF,CAEA,OAAOgvC,CAAY,EA4DRG,EAA0B77D,IAOP,IAPQ,UACtCjG,EAAS,UACTyhE,EAAS,0BACTM,EAAyB,0BACzBC,EAAyB,OACzBC,EAAM,OACNC,GACyBj8D,EACzB,MAAMu7D,EAjEsCxhE,KAC5C,MAAM,KAAEgsB,EAAI,MAAEiN,EAAK,IAAE3Z,EAAG,OAAE0d,GAAWh9B,EAAUwkC,yBAAyBtxB,eAClE,WAAEiP,EAAU,MAAEruB,GAAUkM,EAAU4U,QAElCutD,EAAwBtqE,KAAK+xB,IAAIzH,GACjCigD,EAAyBD,EAAwBruE,EAAQk4B,EAAKl4B,MAAQmlC,EAAMnlC,MAE5EuuE,EAA0BriE,EAAUuf,OAASD,EAAIC,OAASyd,EAAOzd,OAEjE+iD,EAA+B,CACnC5vC,EAAGyvC,EACHxvC,EAL2B,GAOvB4vC,EAAgC,CACpC7vC,EAAG0vC,EACHzvC,EAT2B,GAWvB6vC,EAAkC,CACtC9vC,EAAGyvC,EACHxvC,EAAG0vC,GAECI,EAAmC,CACvC/vC,EAAG0vC,EACHzvC,EAAG0vC,GASL,MAFc,CALE,CAACC,EAA8BC,GAC7B,CAACA,EAA+BE,GAC/B,CAACD,EAAiCC,GACpC,CAACH,EAA8BE,GAIpC,EAiCEE,CAA8B1iE,GAEtCw8D,EAA4B,CAChCmG,UAAW,CAAEjG,GAAI+E,EAAWnF,GAAIyF,GAChCa,gBAAYp/D,EACZq/D,gBAAYr/D,EACZs/D,gBAAYt/D,EACZu/D,gBAAYv/D,GAId,IAAKw+D,EAWH,OAVAxF,EAAYmG,UAAY,CACtBjG,IAAIrS,EAAAA,EAAAA,IAAiBoX,GACrBnF,IAAIjS,EAAAA,EAAAA,IACFkX,EAAyB,CACvBC,QACAC,YACAC,aAAcK,MAIbvF,EAGT,MAAMwG,EAA0B7nD,EAAAA,GAAAA,4BAAiC4mD,EAA2BC,GACtFiB,EAAgC,CACpCvwC,EAAGswC,EAAwBtwC,EAAI+uC,EAAU/uC,EACzCC,EAAGqwC,EAAwBrwC,EAAI8uC,EAAU9uC,GAGrCuwC,EAA0C,CAC9CxwC,EAAGqvC,EAA0BrvC,EAAIsvC,EAA0BtvC,EAC3DC,EAAGovC,EAA0BpvC,EAAIqvC,EAA0BrvC,GAGvDwwC,EAAoDhoD,EAAAA,GAAAA,gBACxD+nD,GAGIE,EAA6DjoD,EAAAA,GAAAA,SACjE6nD,EACAjB,GAaF,GAVAvF,EAAYmG,UAAY,CACtBjG,IAAIrS,EAAAA,EAAAA,IAAiBoX,GACrBnF,IAAIjS,EAAAA,EAAAA,IACFkX,EAAyB,CACvBC,QACAC,YACAC,aAAcsB,MAIhBf,EAAOtrE,OAAQ,CACjB,MAAM0sE,EAAYC,EAAuB,CACvC1sE,MAAOqrE,EAAOrrE,MACd2sE,6BAA8BH,EAC9BI,sCAAuCL,EACvCF,gCACAD,0BACAxB,UAGFhF,EAAYoG,WAAaS,EAAUI,UACnCjH,EAAYsG,WAAaO,EAAUK,SACrC,CACA,GAAIxB,EAAOvrE,OAAQ,CACjB,MAAMgtE,EAAYL,EAAuB,CACvC1sE,MAAOsrE,EAAOtrE,MACd2sE,6BAA8BH,EAC9BI,sCAAuCL,EACvCF,gCACAD,0BACAxB,UAGFhF,EAAYqG,WAAac,EAAUF,UACnCjH,EAAYuG,WAAaY,EAAUD,SACrC,CAEA,OAAOlH,CAAW,EAYd8G,EAAyB74D,IAOA,IAPC,MAC9B7T,EAAK,6BACL2sE,EAA4B,sCAC5BC,EAAqC,8BACrCP,EAA6B,wBAC7BD,EAAuB,MACvBxB,GACwB/2D,EACxB,MAAMm5D,EAA4BL,EAA+B3sE,EAE3DitE,EAAuB1oD,EAAAA,GAAAA,UAC3B6nD,EACA7nD,EAAAA,GAAAA,uBAA4BqoD,EAAuCI,IAE/DE,EAA6B3oD,EAAAA,GAAAA,eACjC6nD,EACA7nD,EAAAA,GAAAA,uBAA4BqoD,EAAuCI,IAG/DG,EAA+B,CACnCrxC,EAAGmxC,EAAqBnxC,EAAIuwC,EAA8BvwC,EAC1DC,EAAGkxC,EAAqBlxC,EAAIswC,EAA8BtwC,GAEtDqxC,EAA+B,CACnCtxC,EAAGoxC,EAA2BpxC,EAAIuwC,EAA8BvwC,EAChEC,EAAGmxC,EAA2BnxC,EAAIswC,EAA8BtwC,GAGlE,MAAO,CACL8wC,UAAW,CACT/G,IAAIrS,EAAAA,EAAAA,IAAiBwZ,GACrBvH,IAAIjS,EAAAA,EAAAA,IACFkX,EAAyB,CACvBC,QACAC,UAAWoC,EACXnC,aAAcqC,MAIpBL,UAAW,CACThH,IAAIrS,EAAAA,EAAAA,IAAiByZ,GACrBxH,IAAIjS,EAAAA,EAAAA,IACFkX,EAAyB,CACvBC,QACAC,UAAWqC,EACXpC,aAAcsC,MAIrB,E,wcCzNH,MAAMC,UAAmE12D,EAAAA,EAMvE0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YAHf,aAAWA,EAAA,6BAiDK,KAAM,CAAGwE,EAAG,CAAC,KAAM,KAAM,MAAOC,EAAG,CAAC,KAAM,KAAM,UA5CrE/E,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAE/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,mBACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,6BACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,6BACA,IAAM97B,KAAK+7B,MAAM2J,KACjB,IAAM1lC,KAAK+7B,MAAM4J,IACjB3lC,KAAK47B,OACL57B,KAAK3uB,QAGT2uB,KAAK6F,MAAM7F,KAAKo8B,uBAClB,CAEAC,cACE,MAAO,CACLia,OAAQ,CAAE5xE,MAAO,UAAWwB,MAAO,GACnCmuE,OAAQ,CACN3vE,MAAO,YACPqE,QAAQ,EACRC,MAAO,GAETsrE,OAAQ,CACN5vE,MAAO,YACPqE,QAAQ,EACRC,MAAO,IAGb,CAIA2yD,cAAcznB,GAAmC,IAAAqiC,EAC/C,MAAM,GAAEva,EAAE,GAAEE,EAAE,GAAEwJ,EAAE,GAAEzJ,EAAE,GAAEE,EAAE,GAAEwJ,GAAO3lC,KAAKsL,OAElCgM,GAASy2B,EAAAA,EAAAA,IAAuB/tC,KAAK+7B,MAAMua,OAAOpwE,OACxDguC,EAAQ2oB,UAAUvlB,EAAQA,GAE1B,MAAM,UAAEy9B,EAAS,WAAEC,EAAU,WAAEE,EAAU,WAAED,EAAU,WAAEE,GAAejB,EAAwB,CAC5F9hE,UAAW4tB,KAAK3uB,MAChBwiE,UAAW,CAAE/uC,EAAGk3B,EAAIj3B,EAAGk3B,GACvBkY,0BAA2B,CAAErvC,EAAGo3B,EAAIn3B,EAAGo3B,GACvCiY,0BAA2BlqE,OAAO6xB,MAAM2pC,IAAOx7D,OAAO6xB,MAAM4pC,QAAM/vD,EAAY,CAAEkvB,EAAG4gC,EAAI3gC,EAAG4gC,GAC1F0O,OAAQr0C,KAAK+7B,MAAMsY,OACnBC,OAAQt0C,KAAK+7B,MAAMuY,SAGrBpgC,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMua,OAAOpwE,OAE3C,MAAMswE,EAAa,CACjB,CAAExtE,MAAOg3B,KAAK+7B,MAAMsY,OAAQoC,MAAOzB,EAAY0B,MAAOxB,GACtD,CAAElsE,MAAOg3B,KAAK+7B,MAAMuY,OAAQmC,MAAOxB,EAAYyB,MAAOvB,IACtD/9D,MAAK,CAACC,EAAGC,IACLrN,KAAK+xB,IAAI3kB,EAAErO,MAAMA,OAASiB,KAAK+xB,IAAI1kB,EAAEtO,MAAMA,QACrC,EAENiB,KAAK+xB,IAAI3kB,EAAErO,MAAMA,OAASiB,KAAK+xB,IAAI1kB,EAAEtO,MAAMA,OACtC,EAEF,IAITwtE,EAAWrkE,SAAQ,CAACwkE,EAAWC,KAC7B,GAAID,EAAUF,OAASE,EAAUD,MAAO,CACtC,MAAM,MAAED,EAAK,MAAEC,GAAUC,EACnBE,GAAkBC,EAAAA,EAAAA,IAAwBH,EAAU3tE,MAAMtE,OAC1DqyE,EAAgBP,EAAWI,EAAiB,GAElD1iC,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOwZ,EAAM3H,GAAGhqC,EAAG2xC,EAAM3H,GAAG/pC,GACpCmP,EAAQgpB,OAAOuZ,EAAM/H,GAAG5pC,EAAG2xC,EAAM/H,GAAG3pC,GAChC6xC,IAAmBJ,EAAW3rE,OAAS,GAAKksE,EAAcN,OAASM,EAAcL,QACnFxiC,EAAQgpB,OAAO6Z,EAAcN,MAAM/H,GAAG5pC,EAAGiyC,EAAcN,MAAM/H,GAAG3pC,GAChEmP,EAAQgpB,OAAO6Z,EAAcN,MAAM3H,GAAGhqC,EAAGiyC,EAAcN,MAAM3H,GAAG/pC,GAChEmP,EAAQ+oB,OAAO8Z,EAAcL,MAAM5H,GAAGhqC,EAAGiyC,EAAcL,MAAM5H,GAAG/pC,GAChEmP,EAAQgpB,OAAO6Z,EAAcL,MAAMhI,GAAG5pC,EAAGiyC,EAAcL,MAAMhI,GAAG3pC,IAElEmP,EAAQgpB,OAAOwZ,EAAMhI,GAAG5pC,EAAG4xC,EAAMhI,GAAG3pC,GACpCmP,EAAQgpB,OAAOwZ,EAAM5H,GAAGhqC,EAAG4xC,EAAM5H,GAAG/pC,GACpCmP,EAAQ8rB,YACR9rB,EAAQ1lC,IAAI,YAAamoE,EAAU3tE,MAAMtE,OACzCwvC,EAAQirB,OAERjrB,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOwZ,EAAM3H,GAAGhqC,EAAG2xC,EAAM3H,GAAG/pC,GACpCmP,EAAQgpB,OAAOuZ,EAAM/H,GAAG5pC,EAAG2xC,EAAM/H,GAAG3pC,GACpCmP,EAAQ+oB,OAAOyZ,EAAM5H,GAAGhqC,EAAG4xC,EAAM5H,GAAG/pC,GACpCmP,EAAQgpB,OAAOwZ,EAAMhI,GAAG5pC,EAAG4xC,EAAMhI,GAAG3pC,GACpCmP,EAAQ1lC,IAAI,cAAeqoE,GAC3B3iC,EAAQipB,QACV,KAIFjpB,EAAQ4oB,YACR5oB,EAAQ+oB,OAAO8X,EAAUjG,GAAGhqC,EAAGiwC,EAAUjG,GAAG/pC,GAC5CmP,EAAQgpB,OAAO6X,EAAUrG,GAAG5pC,EAAGiwC,EAAUrG,GAAG3pC,GAG5C,MAAMiyC,EAGA,QAHeT,EACnBC,EAAW18D,QACR1O,GAASA,EAAKqrE,OAASrrE,EAAKsrE,OAAStrE,EAAKpC,MAAMD,QAAUkB,KAAK+xB,IAAI5wB,EAAKpC,MAAMA,QAAU,IACzF,UAAE,IAAAutE,EAAAA,EAAI,CAAC,EAEPS,EAAgBP,OAASO,EAAgBN,OAC3CxiC,EAAQ+oB,OAAO+Z,EAAgBP,MAAM3H,GAAGhqC,EAAGkyC,EAAgBP,MAAM3H,GAAG/pC,GACpEmP,EAAQgpB,OAAO8Z,EAAgBN,MAAM5H,GAAGhqC,EAAGkyC,EAAgBN,MAAM5H,GAAG/pC,IAC1D76B,OAAO6xB,MAAM2pC,IAAQx7D,OAAO6xB,MAAM4pC,KAC5CzxB,EAAQ+oB,OAAOf,EAAIC,GACnBjoB,EAAQgpB,OAAOwI,EAAIC,IAGrBzxB,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMua,OAAO5xE,OAC7CwvC,EAAQipB,SAERjpB,EAAQ2oB,WAAoB,EAAVvlB,GAAuB,EAAVA,GAE3BtX,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEAvF,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMC,IAAMl3B,EACjB9E,KAAK+7B,MAAME,IAAMl3B,EACjB/E,KAAK+7B,MAAMG,IAAMp3B,EACjB9E,KAAK+7B,MAAMI,IAAMp3B,EACjB/E,KAAK+7B,MAAM2J,IAAM5gC,EACjB9E,KAAK+7B,MAAM4J,IAAM5gC,CACnB,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EACvD,OAAQ4D,GACN,IAAK,kBACHm4B,KAAK+7B,MAAMC,IAAMlkB,EACjB9X,KAAK+7B,MAAME,IAAMr2B,EACjB,MACF,IAAK,4BACH5F,KAAK+7B,MAAMG,IAAMpkB,EACjB9X,KAAK+7B,MAAMI,IAAMv2B,EACjB,MACF,IAAK,4BACH5F,KAAK+7B,MAAM2J,IAAM5tB,EACjB9X,KAAK+7B,MAAM4J,IAAM//B,EAKvB,CAEAkH,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,MAAM,GAAEjC,EAAE,GAAEE,EAAE,GAAEwJ,EAAE,GAAEzJ,EAAE,GAAEE,EAAE,GAAEwJ,GAAO3lC,KAAKsL,QAClC,UAAEypC,EAAS,WAAEC,EAAU,WAAEE,EAAU,WAAED,EAAU,WAAEE,GAAejB,EAAwB,CAC5F9hE,UAAW4tB,KAAK3uB,MAChBwiE,UAAW,CAAE/uC,EAAGk3B,EAAIj3B,EAAGk3B,GACvBkY,0BAA2B,CAAErvC,EAAGo3B,EAAIn3B,EAAGo3B,GACvCiY,0BAA2BlqE,OAAO6xB,MAAM2pC,IAAOx7D,OAAO6xB,MAAM4pC,QAAM/vD,EAAY,CAAEkvB,EAAG4gC,EAAI3gC,EAAG4gC,GAC1F0O,OAAQr0C,KAAK+7B,MAAMsY,OACnBC,OAAQt0C,KAAK+7B,MAAMuY,SAEf0C,EACJ/sE,KAAK+xB,IAAIgE,KAAK+7B,MAAMsY,OAAOrrE,OAASiB,KAAK+xB,IAAIgE,KAAK+7B,MAAMuY,OAAOtrE,OAC3D,CAAEytE,MAAOzB,EAAY0B,MAAOxB,GAC5B,CAAEuB,MAAOxB,EAAYyB,MAAOvB,GAElC,OACE5nD,EAAAA,GAAAA,kBAAuBoX,EAAK2G,OAAQ,CAClC0wB,GAAI+Y,EAAUjG,GAAGhqC,EACjBm3B,GAAI8Y,EAAUjG,GAAG/pC,EACjBm3B,GAAI6Y,EAAUrG,GAAG5pC,EACjBq3B,GAAI4Y,EAAUrG,GAAG3pC,KACb,MAKL76B,OAAO6xB,MAAM2pC,KACbx7D,OAAO6xB,MAAM4pC,IACdp4C,EAAAA,GAAAA,kBAAuBoX,EAAK2G,OAAQ,CAClC0wB,GAAIE,EACJD,GAAIE,EACJD,GAAIwJ,EACJvJ,GAAIwJ,KACA,QAKNqR,EAAgBP,OAChBO,EAAgBN,OAChBnpD,EAAAA,GAAAA,eAAoBoX,EAAK2G,OAAQ,CAC/B0rC,EAAgBP,MAAM3H,GACtBkI,EAAgBP,MAAM/H,GACtBsI,EAAgBN,MAAMhI,GACtBsI,EAAgBN,MAAM5H,OAMnBnrC,MAAMmJ,SAASnI,IACxB,EACDrE,EAnOK+1C,EAAS,OACCnY,EAAAA,GAAAA,aAoOhBmY,EAAUlY,UAAUC,YAAc,CAChCpxD,OAAQ,CACN,CAAEnF,KAAM,OAAQW,KAAM,UACtB,CAAEX,KAAM,QAASW,KAAM,UACvB,CAAEX,KAAM,QAASW,KAAM,YAI3B,S,qjBCxPA,MAAMyuE,UAA6Dt3D,EAAAA,EAKjE0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YAHf,WAASA,EAAA,oCA6Dc,KAAM,IAAAk+B,EAClC,MAAMr6C,EAAkB,QAAbq6C,EAAGx+B,KAAK3uB,aAAK,IAAAmtD,GAAS,QAATA,EAAVA,EAAYx3C,eAAO,IAAAw3C,OAAA,EAAnBA,EAAqBr6C,QACnC,GAAIA,EAAO,CACT,MAAMs6C,EAA2Bz+B,KAAK+7B,MAAMruC,OAAOhmB,KAAKq4D,IAAK,IACxDA,EACHj7B,EAAG3gB,EAAMu6C,yBAAyBqB,EAAMj7B,OAG1C9E,KAAKxxB,IAAI,CAAEiwD,4BACb,KAlEAz+B,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/BA,KAAK+7B,MAAMoD,KAAOn/B,KAAK+7B,MAAMoD,MAAQ,uBACvC,CAEA9C,cACE,MAAM,gBAAEC,GAAoBt8B,KAAK4W,yBACjC,MAAO,CACLuoB,KAAM7C,EAAgBoF,YACtB3P,OAAQ,CACN7rD,MAAO,EACPxB,MAAO43D,EAAgBC,OAAOxK,QAGpC,CAEA4J,cAAcznB,GACZA,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMoD,MACpCjrB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OAE7C,MAAM4yC,GAASy2B,EAAAA,EAAAA,IAAuB/tC,KAAK+7B,MAAMhK,OAAO7rD,OACxDguC,EAAQ2oB,UAAUvlB,EAAQA,GAE1B,MAAM,OAAE5pB,GAAWsS,KAAK+7B,MACxB7nB,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOj9B,KAAK6W,GAAGnpB,EAAO,GAAGoX,GAAI9E,KAAK2/B,GAAGjyC,EAAO,GAAGqX,IACvD,IAAK,MAAM3kB,KAAKsN,EAAO5jB,MAAM,GAC3BoqC,EAAQgpB,OAAOl9B,KAAK6W,GAAGz2B,EAAE0kB,GAAI9E,KAAK2/B,GAAGv/C,EAAE2kB,IAGrC/E,KAAKk3C,cACPhjC,EAAQ8rB,YACR9rB,EAAQirB,QAEVjrB,EAAQ2oB,WAAoB,EAAVvlB,GAAuB,EAAVA,GAC2C,KAAhD,MAArBtX,KAAK+7B,MAAMhK,OAAiB/xB,KAAK+7B,MAAMhK,OAAO7rD,WAAQ0P,IACzDs+B,EAAQipB,SAGNn9B,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEA+rB,YACE,OAAOjgC,KAAK+7B,MAAMruC,OAAOhmB,KACvB,CAACq4D,EAAO7nD,IACN,IAAI4jD,EAAAA,EAAM,GAADt3D,OACJ0T,IACH,IAAM6nD,EAAMj7B,IACZ,IAAMi7B,EAAMh7B,GACZ/E,KAAK47B,OACL57B,KAAK3uB,QAGb,CAcA+J,eACE,MAAM+I,EAAQ6b,KAAK3uB,MAAM2V,QAAQ7C,SAC3B,yBAAEs6C,GAA6Bz+B,KAAK+7B,MAC1C,IAAK53C,IAAUs6C,EAGb,OAEF,MAAM/wC,EAAS+wC,EAAyB/2D,KAAKq4D,IAAK,IAC7CA,EACHj7B,EAAG3gB,EAAMs8C,0BAA0BV,EAAMj7B,OAE3C9E,KAAKxxB,IAAI,CAAEkf,UACb,CAEAihB,OAAO7J,EAAWC,GAChB,IAAK,MAAMg7B,KAAS//B,KAAK+7B,MAAMruC,OAC7BqyC,EAAMj7B,GAAKA,EACXi7B,EAAMh7B,GAAKA,CAEf,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EACvD,MAAM+rD,EAAOhwB,KAAK+7B,MAAMruC,OAAO7iB,OAAS,GACpCm1B,KAAKk3C,aAA0B,IAATrvE,IAAeA,IAASmoD,GAMhDhwB,KAAK+7B,MAAMruC,QAAQ7lB,GAAMi9B,GAAKgT,EAC9B9X,KAAK+7B,MAAMruC,QAAQ7lB,GAAMk9B,GAAKa,IAN9B5F,KAAK+7B,MAAMruC,OAAO,GAAGoX,GAAKgT,EAC1B9X,KAAK+7B,MAAMruC,OAAO,GAAGqX,GAAKa,EAC1B5F,KAAK+7B,MAAMruC,OAAOsiC,GAAMlrB,GAAKgT,EAC7B9X,KAAK+7B,MAAMruC,OAAOsiC,GAAMjrB,GAAKa,EAKjC,CAEAsxC,YAAY,IAAAC,EAAAC,EACV,OACEp3C,KAAK+7B,MAAMruC,OAAO,GAAGoX,KAA8B,QAA7BqyC,EAAKn3C,KAAK+7B,MAAMruC,OAAOsiC,cAAM,IAAAmnB,OAAA,EAAxBA,EAA0BryC,IAAK9E,KAAK+7B,MAAMruC,OAAO,GAAGqX,KAA8B,QAA7BqyC,EAAKp3C,KAAK+7B,MAAMruC,OAAOsiC,cAAM,IAAAonB,OAAA,EAAxBA,EAA0BryC,EAEnH,CAEA+H,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,MAAMoZ,EAAer3C,KAAK+7B,MAAMruC,OAAOhmB,KAAK0Y,IAAC,CAC3C0kB,EAAG9E,KAAK6W,GAAGz2B,EAAE0kB,GACbC,EAAG/E,KAAK2/B,GAAGv/C,EAAE2kB,OAEf,GAAI/E,KAAKk3C,aACP,GAAI3pD,EAAAA,GAAAA,eAAoBoX,EAAK2G,OAAQ+rC,GACnC,OAAO,OAGT,IAAK,IAAIhhE,EAAI,EAAGA,EAAIghE,EAAaxsE,OAAS,EAAGwL,IAC3C,GACEkX,EAAAA,GAAAA,kBAAuBoX,EAAK2G,OAAQ,CAClC0wB,GAAIqb,EAAahhE,GAAGyuB,EACpBm3B,GAAIob,EAAahhE,GAAG0uB,EACpBm3B,GAAImb,EAAahhE,EAAI,GAAGyuB,EACxBq3B,GAAIkb,EAAahhE,EAAI,GAAG0uB,KACpB,GAEN,OAAO,EAKb,OAAOpB,MAAMmJ,SAASnI,EACxB,CAEA+7B,+BACE,MAAO,CAAC,SACV,EACDpgC,EApJK22C,EAAO,OACG/Y,EAAAA,GAAAA,SAqJhB+Y,EAAQ9Y,UAAUC,YAAc,CAC9BpxD,OAAQ,CACN,CAAEnF,KAAM,aAAcW,KAAM,QAC5B,CAAEX,KAAM,SAAUW,KAAM,SAAUxC,IAAK,EAAG4iB,QAAS,CAAC,KAIxD,S,qjBCvJA,MAAM0wC,UAAgE35C,EAAAA,EAUpE0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YARf,YAAUA,EAAA,qBAAAA,EAAA,qBAAAA,EAAA,6BA0DM,KAAM,CAAGwE,EAAG,CAAC,KAAM,MAAOC,EAAG,CAAC,UAAW,UAAW,aAjDzE/E,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAMub,SACjBt3C,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMub,SACjBt3C,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAMwb,OACjBv3C,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMwb,OACjBv3C,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAMyb,SACjBx3C,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMyb,SACjBx3C,KAAK47B,OACL57B,KAAK3uB,QAGT2uB,KAAK6F,MAAM7F,KAAKo8B,wBAChBp8B,KAAKwyC,MAAQxyC,KAAKyyC,MAAQ,CAC5B,CAIA9W,cAAcznB,GACZ,MAAM,GAAE8nB,EAAE,GAAEE,EAAE,QAAEob,EAAO,QAAEE,EAAO,MAAED,GAAUv3C,KAAKsL,OAC3CkxB,GAAYC,EAAAA,EAAAA,IAAiB,CAAET,KAAIE,KAAIob,UAASE,UAASD,UAC/D,IAAI3/B,EAAM6/B,EAAcC,EACxB,MAAMxxE,EAAQs2D,EAAUN,GAAKM,EAAUR,GAEvC9nB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAM4b,aACpCzjC,EAAQ0+B,SAASpW,EAAUR,GAAIQ,EAAU8a,QAASpxE,EAAOs2D,EAAUgb,QAAUhb,EAAU8a,SAEvFpjC,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAM6b,WACpC1jC,EAAQ0+B,SAASpW,EAAUR,GAAIQ,EAAUgb,QAAStxE,EAAOs2D,EAAU+a,MAAQ/a,EAAUgb,SAErF,MAAMK,EAAY5tE,KAAK+xB,IAAIgE,KAAK+7B,MAAMub,QAAUt3C,KAAK+7B,MAAMyb,SACrDM,EAAc,IAAM93C,KAAK+7B,MAAMyb,QAAWK,EAC1CE,EAAY,WAAHvzE,OAAcqzE,EAAU7G,QAAQ,GAAE,MAAAxsE,OAAKszE,EAAW9G,QAAQ,GAAE,MAErEgH,EAAU/tE,KAAK+xB,IAAIgE,KAAK+7B,MAAMwb,MAAQv3C,KAAK+7B,MAAMyb,SACjDS,EAAY,IAAMj4C,KAAK+7B,MAAMyb,QAAWQ,EACxCE,EAAU,SAAH1zE,OAAYwzE,EAAQhH,QAAQ,GAAE,MAAAxsE,OAAKyzE,EAASjH,QAAQ,GAAE,MAE/DhxC,KAAK+7B,MAAMub,QAAUt3C,KAAK+7B,MAAMyb,SAClC5/B,EAAO,EACP8/B,EAAiB1J,EAAAA,GAAAA,OACjByJ,EAAezJ,EAAAA,GAAAA,MAEfp2B,GAAQ,EACR8/B,EAAiB1J,EAAAA,GAAAA,IACjByJ,EAAezJ,EAAAA,GAAAA,QAGjB,MAAM95D,EAAO,IAAI8sD,EAAAA,EACf,CACE9sD,KAAM6jE,EACN3W,UAAWphC,KAAK4W,yBAAyB0lB,gBAAgBC,OAAO2E,sBAChEC,KAAM,CAAEr7D,KAAM,GAAIY,OAAQ,QAASM,OAAQ,QAC3C+9B,EAAGy3B,EAAU8a,QAAiB,EAAP1/B,EACvB2pB,aAAcmW,GAEhB13C,KAAK3uB,OAEP,IAAIwxD,EAAY3uD,EAAKu2D,QAAQv2B,GAC7BhgC,EAAK1F,IAAI,CAAEs2B,EAAG03B,EAAUR,GAAK91D,EAAQ,EAAI28D,EAAY,IACrD3uD,EAAKysB,OAAOuT,GAEZhgC,EAAK1F,IAAI,CACP0F,KAAMgkE,EACNnzC,EAAGy3B,EAAU+a,MAAe,EAAP3/B,EACrB2pB,aAAckW,IAEhB5U,EAAY3uD,EAAKu2D,QAAQv2B,GACzBhgC,EAAK1F,IAAI,CAAEs2B,EAAG03B,EAAUR,GAAK91D,EAAQ,EAAI28D,EAAY,IACrD3uD,EAAKysB,OAAOuT,GAERlU,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEAo/B,iBAAiBC,GACf,IAAI4E,EAAQC,EAASzsE,EACjB4nE,EAAK+D,UACP3rE,EAASq0B,KAAK+7B,MAAMub,QAAU/D,EAAK+D,SAEhCt3C,KAAK+7B,MAAMub,QAAUt3C,KAAK+7B,MAAMyb,SAAW7rE,EAASq0B,KAAK+7B,MAAMyb,SAC/Dx3C,KAAK+7B,MAAMub,QAAUt3C,KAAK+7B,MAAMyb,SAAW7rE,EAASq0B,KAAK+7B,MAAMyb,WAEhEx3C,KAAK+7B,MAAMwb,MAAQv3C,KAAK+7B,MAAMyb,SAAWx3C,KAAK+7B,MAAMwb,MAAQv3C,KAAK+7B,MAAMyb,UAEzEx3C,KAAK+7B,MAAMub,QAAU3rE,GAGnB4nE,EAAKgE,QACP5rE,EAASq0B,KAAK+7B,MAAMwb,MAAQhE,EAAKgE,OAE9Bv3C,KAAK+7B,MAAMwb,MAAQv3C,KAAK+7B,MAAMyb,SAAW7rE,EAASq0B,KAAK+7B,MAAMyb,SAC7Dx3C,KAAK+7B,MAAMwb,MAAQv3C,KAAK+7B,MAAMyb,SAAW7rE,EAASq0B,KAAK+7B,MAAMyb,WAE9Dx3C,KAAK+7B,MAAMub,QAAUt3C,KAAK+7B,MAAMyb,SAAWx3C,KAAK+7B,MAAMub,QAAUt3C,KAAK+7B,MAAMyb,UAE7Ex3C,KAAK+7B,MAAMwb,MAAQ5rE,GAInB4nE,EAAKiE,UACHx3C,KAAK+7B,MAAMwb,OAASY,EAASn4C,KAAK+7B,MAAMyb,QAAUjE,EAAKiE,UAAYW,EAASn4C,KAAK+7B,MAAMub,SACtFt3C,KAAK+7B,MAAMwb,OAASa,EAAUp4C,KAAK+7B,MAAMyb,QAAUjE,EAAKiE,UAAYY,EAAUp4C,KAAK+7B,MAAMub,WAE5Ft3C,KAAK+7B,MAAMyb,SAAWjE,EAAKiE,SAG7Bx3C,KAAKwyC,OAASe,EAAKvX,IAAM,EACzBh8B,KAAKyyC,OAASc,EAAKrX,IAAM,EACzB,MAAMmc,IAAar4C,KAAKwyC,SAAWxyC,KAAKyyC,MACvB,IAAb4F,IACa,MAAX9E,EAAKvX,KACPh8B,KAAK+7B,MAAMC,IAAMqc,GAEJ,MAAX9E,EAAKrX,KACPl8B,KAAK+7B,MAAMG,IAAMmc,GAEnBr4C,KAAKwyC,MAAQxyC,KAAKyyC,MAAQ,EAE9B,CAEA9jC,OAAO7J,EAAWC,GAChB,OAAO/E,KAAKszC,iBAAiB,CAC3BtX,GAAIl3B,EACJo3B,GAAIp3B,EACJwyC,QAASvyC,EACTyyC,QAASzyC,EACTwyC,MAAOxyC,GAEX,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EACvD,MAAOq0E,EAAWC,GAAe1wE,EAAgBwe,MAAM,IAEjD+kD,EAA+B,CACnC,CAAC,IAAD5mE,OAAK+zE,IAAezgC,EACpB,CAHoD,CAAE33B,EAAG,UAAW4F,EAAG,UAAW5P,EAAG,SAG5EmiE,IAAa1yC,GAExB,OAAO5F,KAAKszC,iBAAiBlI,EAC/B,CAEAt+B,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,MAAMjC,EAAK/xD,KAAKyrC,MAAM1V,KAAK+7B,MAAMC,IAC3BE,EAAKjyD,KAAKyrC,MAAM1V,KAAK+7B,MAAMG,IAC3B99B,EAAOn0B,KAAKjE,IAAIg2D,EAAIE,GACpB7wB,EAAQphC,KAAKhE,IAAI+1D,EAAIE,GACrBxqC,EAAMznB,KAAKjE,IAAIg6B,KAAK+7B,MAAMub,QAASt3C,KAAK+7B,MAAMwb,OAC9CnoC,EAASnlC,KAAKhE,IAAI+5B,KAAK+7B,MAAMub,QAASt3C,KAAK+7B,MAAMwb,OACvD,OAAIn5C,EAAOuG,EAAKG,GAAKH,EAAKG,EAAIuG,GAAS3Z,EAAMiT,EAAKI,GAAKJ,EAAKI,EAAIqK,GAGzDzL,MAAMmJ,SAASnI,EACxB,EACDrE,EAxMKg5B,EAAQ,OACE4E,EAAAA,GAAAA,UAyMhB5E,EAAS6E,UAAU4L,SAAW,CAC5B4N,YAAa,oBACbC,UAAW,qBAGbte,EAAS6E,UAAUC,YAAc,CAC/BpxD,OAAQ,CACN,CAAEnF,KAAM,aAAcW,KAAM,eAC5B,CAAEX,KAAM,aAAcW,KAAM,eAIhC,S,kiBC7NA,MAAMgwE,UAAmE74D,EAAAA,EAOvE0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YALf,aAAWA,EAAA,6BAqCK,KAAM,CAAGwE,EAAG,CAAC,KAAM,MAAOC,EAAG,CAAC,KAAM,UA/BzD/E,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,MACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,QAGT2uB,KAAK6F,MAAM7F,KAAKo8B,uBAClB,CAEAC,cACE,MAAM,gBAAEC,GAAoBt8B,KAAK4W,yBACjC,MAAO,CACLuoB,KAAM7C,EAAgBoF,YACtB3P,OAAQ,CACN7rD,MAAO,EACPxB,MAAO43D,EAAgBC,OAAOxK,QAGpC,CAIA4J,cAAcznB,GACZ,MAAM,GAAE8nB,EAAE,GAAEE,EAAE,GAAED,EAAE,GAAEE,GAAOn8B,KAAKsL,OAC1BkxB,GAAYC,EAAAA,EAAAA,IAAiB,CAAET,KAAIE,KAAID,KAAIE,OAC3Cj2D,EAAQs2D,EAAUN,GAAKM,EAAUR,GACjCrqC,EAAS6qC,EAAUL,GAAKK,EAAUP,GAMxC,GAJA/nB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMoD,MAEpCjrB,EAAQ0+B,SAASpW,EAAUR,GAAIQ,EAAUP,GAAI/1D,EAAOyrB,GAEsB,KAAhD,MAArBqO,KAAK+7B,MAAMhK,OAAiB/xB,KAAK+7B,MAAMhK,OAAO7rD,WAAQ0P,GAAkB,CAC3Es+B,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OAC7C,MAAM4yC,GAASy2B,EAAAA,EAAAA,IAAuB/tC,KAAK+7B,MAAMhK,OAAO7rD,OACxDguC,EAAQukC,WAAWjc,EAAUR,GAAK1kB,EAAQklB,EAAUP,GAAK3kB,EAAQpxC,EAAOyrB,EAC1E,CAEIqO,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEAvF,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMC,IAAMl3B,EACjB9E,KAAK+7B,MAAMG,IAAMp3B,EACjB9E,KAAK+7B,MAAME,IAAMl3B,EACjB/E,KAAK+7B,MAAMI,IAAMp3B,CAMnB,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EACvD,GAAa,OAAT4D,EAEF,OADAm4B,KAAK+7B,MAAMC,IAAMlkB,EACT9X,KAAK+7B,MAAME,IAAMr2B,EAEzB5F,KAAK+7B,MAAMG,IAAMpkB,EACjB9X,KAAK+7B,MAAMI,IAAMv2B,CAErB,CAEAkH,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,MAAM7/B,EAAOn0B,KAAKjE,IAAIg6B,KAAK+7B,MAAMC,GAAIh8B,KAAK+7B,MAAMG,IAC1C7wB,EAAQphC,KAAKhE,IAAI+5B,KAAK+7B,MAAMC,GAAIh8B,KAAK+7B,MAAMG,IAC3CxqC,EAAMznB,KAAKjE,IAAIg6B,KAAK+7B,MAAME,GAAIj8B,KAAK+7B,MAAMI,IACzC/sB,EAASnlC,KAAKhE,IAAI+5B,KAAK+7B,MAAME,GAAIj8B,KAAK+7B,MAAMI,IAClD,OAAI/9B,EAAOuG,EAAKG,GAAKH,EAAKG,EAAIuG,GAAS3Z,EAAMiT,EAAKI,GAAKJ,EAAKI,EAAIqK,GAGzDzL,MAAMmJ,SAASnI,EACxB,EACDrE,EAjGKk4C,EAAS,OACCta,EAAAA,GAAAA,WAkGhBsa,EAAUra,UAAUC,YAAc,CAChCpxD,OAAQ,CACN,CAAEnF,KAAM,aAAcW,KAAM,QAC5B,CAAEX,KAAM,SAAUW,KAAM,SAAUxC,IAAK,EAAG4iB,QAAS,CAAC,KAIxD,S,6iBCvGA,MAAM8vD,UAA8F/4D,EAAAA,EAOlG0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YALf,yBAAuBA,EAAA,6BAiEP,KAAM,CAAGwE,EAAG,CAAC,KAAM,KAAM,iBAAkBC,EAAG,CAAC,KAAM,KAAM,qBAAmBzE,EAAA,mCA8ExEr8B,IAUvB,IAVwB,kBAC5BkqE,EAAiB,cACjBC,EAAa,aACbC,EAAY,aACZC,GAMDrqE,EACC,MAAM84D,EAAQxvC,EAAAA,GAAAA,sBAA2B,CACvCghD,YAAaJ,EACbE,eACAC,iBAEIE,EAAyBjhD,EAAAA,GAAAA,wBAA6B,CAC1D4gD,oBACApR,QACAqR,kBAEF,MAAO,CACLtpC,EAAG9E,KAAK3uB,MAAMw0B,MAAMf,EAAEiB,OAAOyoC,EAAuB1pC,GACpDC,EAAG/E,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OAAOyoC,EAAuBzpC,GACrD,IAjKD/E,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAC/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,cACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,eACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,YACA,IAAM97B,KAAKmoC,oBAAmB,GAAM2G,GAAGhqC,GAAK9E,KAAK+7B,MAAMG,KACvD,IAAMl8B,KAAKmoC,oBAAmB,GAAM2G,GAAG/pC,GAAK/E,KAAK+7B,MAAMI,IACvDn8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,WACA,IAAM97B,KAAKmoC,oBAAmB,GAAMuG,GAAG5pC,GAAK9E,KAAK+7B,MAAMG,KACvD,IAAMl8B,KAAKmoC,oBAAmB,GAAMuG,GAAG3pC,GAAK/E,KAAK+7B,MAAMI,IACvDn8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,cACA,IAAM97B,KAAKmoC,oBAAmB,GAAM0G,GAAG/pC,GAAK9E,KAAK+7B,MAAMC,KACvD,IAAMh8B,KAAKmoC,oBAAmB,GAAM0G,GAAG9pC,GAAK/E,KAAK+7B,MAAME,IACvDj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,eACA,IAAM97B,KAAKmoC,oBAAmB,GAAMwG,GAAG7pC,GAAK9E,KAAK+7B,MAAMC,KACvD,IAAMh8B,KAAKmoC,oBAAmB,GAAMwG,GAAG5pC,GAAK/E,KAAK+7B,MAAME,IACvDj8B,KAAK47B,OACL57B,KAAK3uB,QAGT2uB,KAAK6F,MAAM7F,KAAKo8B,uBAClB,CAEAC,cACE,MAAM,gBAAEC,GAAoBt8B,KAAK4W,yBACjC,MAAO,CACLuoB,KAAM7C,EAAgBoF,YACtB3P,OAAQ,CACN7rD,MAAO,EACPxB,MAAO43D,EAAgBC,OAAOxK,QAGpC,CAIA4J,cAAcznB,GACZ,MAAM,GAAE46B,EAAE,GAAEJ,EAAE,GAAEG,EAAE,GAAEF,GAAO3uC,KAAKmoC,qBAC1B3L,EAAY,CAChBsS,IAAIrS,EAAAA,EAAAA,IAAiBqS,GACrBJ,IAAIjS,EAAAA,EAAAA,IAAiBiS,GACrBG,IAAIpS,EAAAA,EAAAA,IAAiBoS,GACrBF,IAAIlS,EAAAA,EAAAA,IAAiBkS,IAEjBr3B,GAASy2B,EAAAA,EAAAA,IAAuB/tC,KAAK+7B,MAAMhK,OAAO7rD,OACxDguC,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMoD,MAEpCjrB,EAAQ2oB,UAAUvlB,EAAQA,GAC1BpD,EAAQ4oB,YACJN,EAAUsS,GAAGhqC,IAAM03B,EAAUmS,GAAG7pC,GAAK03B,EAAUsS,GAAG/pC,IAAMy3B,EAAUmS,GAAG5pC,GACvEmP,EAAQgpB,OAAOV,EAAUsS,GAAGhqC,EAAG03B,EAAUsS,GAAG/pC,GAC5CmP,EAAQgpB,OAAOV,EAAUkS,GAAG5pC,EAAG03B,EAAUkS,GAAG3pC,KAE5CmP,EAAQgpB,OAAOV,EAAUsS,GAAGhqC,EAAG03B,EAAUsS,GAAG/pC,GAC5CmP,EAAQgpB,OAAOV,EAAUkS,GAAG5pC,EAAG03B,EAAUkS,GAAG3pC,GAC5CmP,EAAQgpB,OAAOV,EAAUqS,GAAG/pC,EAAG03B,EAAUqS,GAAG9pC,GAC5CmP,EAAQgpB,OAAOV,EAAUmS,GAAG7pC,EAAG03B,EAAUmS,GAAG5pC,GAC5CmP,EAAQ8rB,YACR9rB,EAAQirB,QAEVjrB,EAAQ2oB,WAAoB,EAAVvlB,GAAuB,EAAVA,GAE/BpD,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OAC7CwvC,EAAQipB,SAEJn9B,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEAi0B,qBAAqC,IAAlBiH,EAAQz1D,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,IAAAA,UAAA,GACzB,MAAM,GAAEqiD,EAAE,GAAEE,EAAE,GAAED,EAAE,GAAEE,EAAE,cAAEkT,EAAa,cAAEC,GAAkBtvC,KAAKsL,OAC9D,IAAIikC,EACJ,GAAKxzC,MAAMszC,IAAmBtzC,MAAMuzC,GASlC,MAAO,CACLR,GAAI,CAAEhqC,EAAGo3B,EAAIn3B,EAAGo3B,GAChBuS,GAAI,CAAE5pC,EAAGk3B,EAAIj3B,EAAGk3B,GAChB4S,GAAI,CAAE/pC,EAAGk3B,EAAIj3B,EAAGk3B,GAChB0S,GAAI,CAAE7pC,EAAGo3B,EAAIn3B,EAAGo3B,IAbgC,CAClD,MAAM/tB,EAAS,CAAEtJ,EAAGuqC,EAAetqC,EAAGuqC,GAChCzW,EAAO,CAAEmD,KAAIC,KAAIC,KAAIC,MACrBiJ,EAAW73C,EAAAA,GAAAA,eAAoB6gB,EAAQyqB,GAC7C0W,EAAqBhiD,EAAAA,GAAAA,yBAA8B,CACjD63C,WACAvM,QAEJ,CASA,MAAMwM,EAAekK,EAAmBzqC,EAAIo3B,EACtCoJ,EAAeiK,EAAmBxqC,EAAIo3B,EAEtC2S,EAAK,CAAEhqC,EAAGo3B,EAAKmJ,EAActgC,EAAGo3B,EAAKmJ,GACrCoJ,EAAK,CAAE5pC,EAAGk3B,EAAKqJ,EAActgC,EAAGk3B,EAAKqJ,GACrCuJ,EAAK,CAAE/pC,EAAGk3B,GAAM,EAAIqJ,EAActgC,EAAGk3B,GAAM,EAAIqJ,GAC/CqJ,EAAK,CAAE7pC,EAAGo3B,GAAM,EAAImJ,EAActgC,EAAGo3B,GAAM,EAAImJ,GAE/CoK,EAAU1vC,KAAK3uB,MAAMw0B,MAAMf,EAAEiB,OAC7B4pC,EAAU3vC,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OACnC,OAAIqpC,EACK,CACLN,GAAI,CAAEhqC,EAAG4qC,EAAQZ,EAAGhqC,GAAIC,EAAG4qC,EAAQb,EAAG/pC,IACtC2pC,GAAI,CAAE5pC,EAAG4qC,EAAQhB,EAAG5pC,GAAIC,EAAG4qC,EAAQjB,EAAG3pC,IACtC8pC,GAAI,CAAE/pC,EAAG4qC,EAAQb,EAAG/pC,GAAIC,EAAG4qC,EAAQd,EAAG9pC,IACtC4pC,GAAI,CAAE7pC,EAAG4qC,EAAQf,EAAG7pC,GAAIC,EAAG4qC,EAAQhB,EAAG5pC,KAGnC,CAAE+pC,KAAIJ,KAAIG,KAAIF,KACvB,CA6BAhgC,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMC,IAAMl3B,EACjB9E,KAAK+7B,MAAME,IAAMl3B,EACjB/E,KAAK+7B,MAAMG,IAAMp3B,EACjB9E,KAAK+7B,MAAMI,IAAMp3B,EACjB/E,KAAK+7B,MAAMsT,eAAiBvqC,EAC5B9E,KAAK+7B,MAAMuT,eAAiBvqC,CAC9B,CAEA62B,OAAMvjD,GAA2D,IAA1D,KAAExQ,EAAI,KAAEiwC,EAAI,KAAElS,EAAI,KAAEjB,GAAoCtsB,EAC7D,OAAQxQ,GACN,IAAK,aACH,MAAM8wE,EAAqB,CACzB7zC,EAAG9E,KAAK+7B,MAAMC,GAAKlkB,EACnB/S,EAAG/E,KAAK+7B,MAAME,GAAKr2B,GAEfgzC,EAA+B54C,KAAKswC,2BAA2B,CACnEnC,kBAAmB,CAAErpC,EAAG9E,KAAKsL,OAAO4wB,GAAIn3B,EAAG/E,KAAKsL,OAAO6wB,IACvDiS,cAAe,CACbtpC,EAAG9E,KAAKsL,OAAO+jC,cACftqC,EAAG/E,KAAKsL,OAAOgkC,eAEjBjB,aAAc,CAAEvpC,EAAG9E,KAAKsL,OAAO0wB,GAAIj3B,EAAG/E,KAAKsL,OAAO2wB,IAClDqS,aAAc,CAAExpC,EAAG9E,KAAK3uB,MAAMw0B,MAAMf,EAAE6zC,EAAmB7zC,GAAIC,EAAG/E,KAAK3uB,MAAMw0B,MAAMd,EAAE4zC,EAAmB5zC,MAExG/E,KAAK+7B,MAAQ,IACR/7B,KAAK+7B,MACRC,GAAI2c,EAAmB7zC,EACvBm3B,GAAI0c,EAAmB5zC,EACvBsqC,cAAeuJ,EAA6B9zC,EAC5CwqC,cAAesJ,EAA6B7zC,GAE9C,MACF,IAAK,cACH,MAAM8zC,EAAsB,CAC1B/zC,EAAG9E,KAAK+7B,MAAMG,GAAKpkB,EACnB/S,EAAG/E,KAAK+7B,MAAMI,GAAKv2B,GAEfkzC,EAAgC94C,KAAKswC,2BAA2B,CACpEnC,kBAAmB,CAAErpC,EAAG9E,KAAKsL,OAAO0wB,GAAIj3B,EAAG/E,KAAKsL,OAAO2wB,IACvDmS,cAAe,CACbtpC,EAAG9E,KAAKsL,OAAO+jC,cACftqC,EAAG/E,KAAKsL,OAAOgkC,eAEjBjB,aAAc,CAAEvpC,EAAG9E,KAAKsL,OAAO4wB,GAAIn3B,EAAG/E,KAAKsL,OAAO6wB,IAClDmS,aAAc,CAAExpC,EAAG9E,KAAK3uB,MAAMw0B,MAAMf,EAAE+zC,EAAoB/zC,GAAIC,EAAG/E,KAAK3uB,MAAMw0B,MAAMd,EAAE8zC,EAAoB9zC,MAE1G/E,KAAK+7B,MAAQ,IACR/7B,KAAK+7B,MACRG,GAAI2c,EAAoB/zC,EACxBq3B,GAAI0c,EAAoB9zC,EACxBsqC,cAAeyJ,EAA8Bh0C,EAC7CwqC,cAAewJ,EAA8B/zC,GAE/C,MACF,IAAK,WACL,IAAK,UACL,IAAK,aACL,IAAK,cACH/E,KAAK+7B,MAAQ,IACR/7B,KAAK+7B,MACRsT,cAAe1qC,EAAKG,EACpBwqC,cAAe3qC,EAAKI,GAM5B,CAEA+H,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,MAAM2Q,EAAc5uC,KAAKmoC,qBACnB3C,EAAU76D,OAAOC,KAAKgkE,GAAalnE,KAAKq4D,IAAK,CACjDj7B,EAAG8pC,EAAY7O,GAAoCj7B,EACnDC,EAAG6pC,EAAY7O,GAAoCh7B,MAErD,QAAIxX,EAAAA,GAAAA,eAAoBoX,EAAK2G,OAAQk6B,IAG9B7hC,MAAMmJ,SAASnI,EACxB,EACDrE,EA/PKo4C,EAAkB,OACRxa,EAAAA,GAAAA,oBAgQhBwa,EAAmBva,UAAUC,YAAc,CACzCpxD,OAAQ,CACN,CAAEnF,KAAM,aAAcW,KAAM,QAC5B,CAAEX,KAAM,SAAUW,KAAM,SAAUxC,IAAK,EAAG4iB,QAAS,CAAC,KAIxD,S,miBCzQA,MAAMwoD,UAAsEK,EAAAA,EAO1EpxC,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YALf,QAAMA,EAAA,6BAmBU,KAAM,CAAGwE,EAAG,CAAC,KAAM,MAAOC,EAAG,CAAC,KAAM,UAbzD/E,KAAK27B,cAAgB37B,KAAK27B,cAAcr4B,KAAKtD,MAC7CA,KAAK6F,MAAM7F,KAAKo8B,uBAClB,CAEAC,cACE,MAAO,CACLtK,OAAQ,CACN7rD,MAAO,EACPxB,MAAOs7B,KAAK4W,yBAAyB0lB,gBAAgBC,OAAOxK,QAGlE,CAIA4J,cAAcznB,GACZ,MAAM,GAAE8nB,EAAE,GAAEE,EAAE,GAAED,EAAE,GAAEE,GAAOn8B,KAAKsL,OAC1BkxB,GAAYC,EAAAA,EAAAA,IAAiB,CAAET,KAAIE,KAAID,KAAIE,OAC3CO,GAAcC,EAAAA,EAAAA,IAAoB,CAAEC,UAAW58B,KAAK+7B,MAAMhK,OAAO7rD,SAAUs2D,IAEjFtoB,EAAQ2oB,UAAUH,EAAY53B,EAAG43B,EAAY33B,GAC7CmP,EAAQ4oB,YACR5oB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OAE7CwvC,EAAQ+oB,OAAOT,EAAUR,GAAIQ,EAAUP,IACnCj8B,KAAK+7B,MAAM4V,YACbz9B,EAAQ09B,YAAY,CAAC5xC,KAAK+7B,MAAM4V,aAElCz9B,EAAQgpB,OAAOV,EAAUN,GAAIM,EAAUL,IACvCjoB,EAAQipB,SACRjpB,EAAQ2oB,WAA2B,EAAjBH,EAAY53B,GAAyB,EAAjB43B,EAAY33B,GAE9C/E,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,EAEtB,CAEApH,SAASnI,GACP,OAAIhB,MAAMs6B,sCACN1wC,EAAAA,GAAAA,kBAAuBoX,EAAK2G,OAAQtL,KAAKsL,SAAW,IAGjDtL,KAAK8H,gBAAgBnD,GAC9B,EACDrE,EAtDK8wC,EAAU,OACAlT,EAAAA,GAAAA,YAuDhBkT,EAAWjT,UAAUC,YAAc,CACjCpxD,OAAQ,CAAC,CAAEnF,KAAM,OAAQW,KAAM,YAGjC,S,yiBC3DA,MAAMuwE,UAA0D/X,EAAAA,EAgB9D3gC,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YAdf,QAAMA,EAAA,6BAkBU,KAAM,CAAGwE,EAAG,CAAC,KAAMC,EAAG,CAAC,SAH5C/E,KAAK6F,MAAM,CAAEf,EAAG,CAAC,KAAMC,EAAG,CAAC,MAC7B,CAIA42B,cAAcznB,GACZlU,KAAKW,OAAOuT,EACd,CAEA0tB,wBAAwB,IAAAC,EAAAC,EAEpB9hC,KAAK+7B,MAAM7nD,QAAuB,QAAnB2tD,EAAK7hC,KAAK+hC,iBAAS,IAAAF,OAAA,EAAdA,EAAgB3tD,OACpCrH,KAAKE,UAAUizB,KAAK+7B,MAAMoF,QAAUt0D,KAAKE,UAAwB,QAAf+0D,EAAC9hC,KAAK+hC,iBAAS,IAAAD,OAAA,EAAdA,EAAgBX,QAEnEnhC,KAAK+hC,UAAYx3D,IAAM,CAAC,EAAGy1B,KAAK+7B,OAChC/7B,KAAKgiC,MAAQhiC,KAAKiiC,WAAWv6D,KAAKmxD,IAAI,CACpC3kD,KAAM2kD,EACNqJ,QAASliC,KAAKkU,QAAQiuB,YAAYtJ,OAEpC74B,KAAKoiC,eAAiBpiC,KAAKgiC,MAAM71D,QAAO,CAACC,EAAKP,EAASw2D,IAK9Cj2D,GAHLP,EAAQq2D,QAAQI,wBAChBz2D,EAAQq2D,QAAQK,0BACfF,IAAiBriC,KAAKgiC,MAAMn3D,OAAS,EAAI23D,EAAAA,GAAAA,KAAe,KAE1D,GAEP,CAGAb,aAAaztB,GACXlU,KAAKkU,QAAUA,EACfA,EAAQ1lC,IAAI,OAAQwxB,KAAKmhC,MACzBjtB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMqF,WACpCltB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMuF,WACpCptB,EAAQ1lC,IAAI,eAAgBwxB,KAAK+7B,MAAMwF,cACvCvhC,KAAK4hC,uBACP,CAGAa,aACE,IAAI19B,EAAI/E,KAAKsL,OAAOvG,EAAK/E,KAAK+7B,MAAMyF,QAAQ9vC,IACxCgxC,EAAkB,EACtB,IAAK,IAAIrsD,EAAI,EAAGA,EAAI2pB,KAAKgiC,MAAMn3D,OAAQwL,IACrC0uB,GAAW,IAAN1uB,EAAU,EAAI2pB,KAAKgiC,MAAM3rD,GAAG6rD,QAAQI,wBAA0BI,EAAkBF,EAAAA,GAAAA,KACrFxiC,KAAKkU,QAAQyuB,SAAS3iC,KAAKgiC,MAAM3rD,GAAGnC,KAAM8rB,KAAKsL,OAAOxG,EAAK9E,KAAK+7B,MAAMyF,QAAQpjC,KAAM2G,GACpF29B,EAAkB1iC,KAAKgiC,MAAM3rD,GAAG6rD,QAAQK,wBAE5C,CAGAK,mBACE,IAAK5iC,KAAK+7B,MAAM0F,WACd,OAEF,MAAMD,EAAUxhC,KAAK+7B,MAAMhK,OAAQ7rD,MAAQ,EAAIs8D,EAAAA,GAAAA,IAE/CxiC,KAAKkU,QAAQ4oB,YACb98B,KAAKkU,QAAQ8kC,KACXh5C,KAAKsL,OAAOxG,EAAK08B,EACjBxhC,KAAKsL,OAAOvG,EAAK/E,KAAKgiC,MAAM,GAAGE,QAAQI,wBAA0Bd,EACjExhC,KAAK95B,MAAkB,EAAVs7D,EACbxhC,KAAKoiC,eAA2B,EAAVZ,GAExBxhC,KAAKkU,QAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAM0F,YACzCzhC,KAAKkU,QAAQirB,OACbn/B,KAAKkU,QAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMqF,WACzCphC,KAAKklC,eACLllC,KAAKkU,QAAQ8rB,WACf,CAEAlzB,SAASnI,GACP,OAAIhB,MAAMs6B,yCAKRj+B,KAAKgiC,OACLhiC,KAAKsL,OAAOxG,EAAKH,EAAK2G,OAAOxG,GAC7BH,EAAK2G,OAAOxG,EAAI9E,KAAKsL,OAAOxG,EAAK9E,KAAK95B,OACtC85B,KAAKsL,OAAOvG,EAAK/E,KAAKgiC,MAAM,GAAGE,QAAQI,wBAA0B39B,EAAK2G,OAAOvG,GAC7EJ,EAAK2G,OAAOvG,EAAI/E,KAAKsL,OAAOvG,EAAK/E,KAAKgiC,MAAM,GAAGE,QAAQI,wBAA0BtiC,KAAKoiC,iBAIjFpiC,KAAK8H,gBAAgBnD,GAC9B,CAEAgK,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMj3B,GAAMA,EACjB9E,KAAK+7B,MAAMh3B,GAAMA,CACnB,EACDzE,EA9GKy4C,EAAU,OACA7a,EAAAA,GAAAA,YA+GhB,S,+hBCxHA,MAAMl0D,EAA+B,CACnCkK,KAAM,GACNitD,KAAM,CACJr7D,KAAM,GACNY,OAAQ,QACRI,MAAO,SACPE,OAAQ,UAEVq6D,WAAY,GAEZC,UAAW2M,EAAAA,GAAAA,KAEX1M,aAAcyM,EAAAA,GAAAA,WACdxM,QAAS,CACP9vC,IAAK,EACL2Z,MAAO,EACP+D,OAAQ,EACRhR,KAAM,IAIV,MAAM4iC,UAAoDrhD,EAAAA,EAAe0gB,cAAA,SAAA1mB,WAAA2mB,EAAA,YAahE,iBAAeA,EAAA,6BAkEC,KAAM,CAAGwE,EAAG,CAAC,KAAMC,EAAG,CAAC,QAAO,CA5ErDhF,kCACEk5C,GAEA,IADA1wE,EAA4BoR,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,CAAC,EAEhC,MAAO,IACF3P,EAASivE,MACTtuE,OAAOm0C,QAAQv2C,GAAO4D,QAAO,CAACC,EAAGnI,KAAA,IAAGkD,EAAKhD,GAAMF,EAAA,OAAME,EAAQ,IAAKiI,EAAK,CAACjF,GAAMhD,GAAUiI,CAAG,GAAG,CAAC,GAEtG,CAQA2zB,mBACEp1B,OAAO0hE,eAAersC,KAAKm+B,UAAW,QAAS,CAC7C3e,MAKE,OAHIxf,KAAKkU,SACPlU,KAAK2hC,aAAa3hC,KAAKkU,SAElBlU,KAAKyqC,UAAYzqC,KAAK+7B,MAAMyF,QAAQpjC,KAAO4B,KAAK+7B,MAAMyF,QAAQn2B,KACvE,IAGF1gC,OAAO0hE,eAAersC,KAAKm+B,UAAW,SAAU,CAC9C3e,MACE,MAAM3qC,EAAQmrB,KAAKiiC,WAAWp3D,OAC9B,OAAOm1B,KAAK+7B,MAAMsF,WAAaxsD,EAAQmrB,KAAK+7B,MAAMyF,QAAQ9vC,IAAMsO,KAAK+7B,MAAMyF,QAAQpyB,MACrF,IAGFzkC,OAAO0hE,eAAersC,KAAKm+B,UAAW,OAAQ,CAC5C3e,MACE,MAAM05B,EAAIl5C,KAAK+7B,MAAMoF,KACrB,MAAO,GAAP38D,OAAU00E,EAAEpyE,MAAK,KAAAtC,OAAI00E,EAAElyE,OAAM,KAAAxC,OAAI00E,EAAEpzE,KAAI,OAAAtB,OAAM00E,EAAExyE,OACjD,GAEJ,CAEAu6D,qBACE,MAAO,CACLj0D,OAAQ,CACN,CAAEnF,KAAM,mBAAoBW,KAAM,OAAQR,UAAU,GACpD,CAAEH,KAAM,OAAQW,KAAM,QACtB,CACEX,KAAM,aACNW,KAAM,YACNtE,MAAO,QACP0kB,QAASoX,KAAK4W,yBAAyB0lB,gBAAgBC,OAAO2E,uBAEhE,CACEr5D,KAAM,aACNW,KAAM,aACNtE,MAAO,aACP0kB,QAAS,iBAEX,CACE/gB,KAAM,SACNW,KAAM,SACNxC,IAAK,EACL4iB,QAAS,CAAElkB,MAAO,cAAewB,MAAO,KAIhD,CAEAm2D,cACE,MAAO,IACFryD,EACHo3D,UAAWphC,KAAK4W,yBAAyB0lB,gBAAgBC,OAAO2E,sBAEpE,CAIA1yD,IAAI48D,GAAqB,IAAA+N,EAKvB,OAJAx1C,MAAMn1B,IAAI48D,GACE,QAAR+N,EAAA/N,EAAIjK,YAAI,IAAAgY,GAARA,EAAUrzE,OAASslE,EAAI/J,aACzBrhC,KAAK+7B,MAAMsF,WAAap3D,KAAKhE,IAAImlE,EAAIjK,KAAKr7D,KAAMk6B,KAAK+7B,MAAMsF,aAEtDrhC,IACT,CAEAW,OAAOuT,GACLlU,KAAK2hC,aAAaztB,GACdlU,KAAK+7B,MAAMgB,OAEb/8B,KAAKkU,QAAQ/5B,OACb6lB,KAAKkU,QAAQ2oB,UAAU78B,KAAK+7B,MAAMj3B,EAAI9E,KAAK+7B,MAAMh3B,GACjD/E,KAAKkU,QAAQy1B,OAAQ3pC,KAAK+7B,MAAMgB,MAAQ9yD,KAAK+yD,GAAM,KACnDh9B,KAAKkU,QAAQyuB,SAAS3iC,KAAK+7B,MAAM7nD,KAAM,EAAG,GAC1C8rB,KAAKkU,QAAQvJ,YAEb3K,KAAK4iC,mBACL5iC,KAAKyiC,aAET,CAEAgI,QAAQv2B,GACFA,GACFlU,KAAK2hC,aAAaztB,GAEpB,MAAM8tB,EAAQhiC,KAAKiiC,WACnB,IAAIh8D,EAAM,EACV,IAAK,MAAM4yD,KAAQmJ,EACjB/7D,EAAMgE,KAAKhE,IAAI+5B,KAAKkU,QAAQiuB,YAAYtJ,GAAM3yD,MAAOD,GAEvD,QAASA,CACX,CAEA6mC,SAASssC,GACP,MAAMz0C,EAAO3E,KAAKq5C,YAAYD,GAE9B,OACEp5C,KAAK+7B,MAAMj3B,EAAKH,EAAKG,GACrBH,EAAKG,EAAI9E,KAAK+7B,MAAMj3B,EAAK9E,KAAK95B,OAC9B85B,KAAK+7B,MAAMh3B,EAAK/E,KAAK+7B,MAAMoF,KAAKr7D,KAAO6+B,EAAKI,GAC5CJ,EAAKI,EAAI/E,KAAK+7B,MAAMh3B,EAAK/E,KAAK+7B,MAAMoF,KAAKr7D,KAAOk6B,KAAKrO,QAIhDgS,MAAMmJ,SAASssC,EACxB,CAEAzX,aAAaztB,GACXlU,KAAKkU,QAAUA,EACfA,EAAQ1lC,IAAI,OAAQwxB,KAAKmhC,MACzBjtB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMqF,WACpCltB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMuF,WACpCptB,EAAQ1lC,IAAI,eAAgBwxB,KAAK+7B,MAAMwF,aACzC,CAEAU,WACE,OAAOjiC,KAAK+7B,MAAM7nD,KAAK4rC,WAAWz5B,MAAM,KAC1C,CAEAo8C,aACE,IAAI,EAAE19B,GAAM/E,KAAK+7B,MACjB,IAAK,MAAMlD,KAAQ74B,KAAKiiC,WACtBjiC,KAAKkU,QAAQyuB,SAAS9J,EAAM74B,KAAK+7B,MAAMj3B,EAAK9E,KAAK+7B,MAAMyF,QAAQpjC,KAAM2G,GACrEA,GAAM/E,KAAK+7B,MAAMsF,UAErB,CAEAuB,mBACE,IAAK5iC,KAAK+7B,MAAM0F,WACd,OAGF,MAAM,MAAEv7D,GAAU85B,MACZ,OAAErO,GAAWqO,KACbs5C,EAAW3nD,EAASqO,KAAK+7B,MAAMyF,QAAQ9vC,IAAMsO,KAAK+7B,MAAMyF,QAAQpyB,QAChE,EAAEtK,GAAM9E,KAAK+7B,MACnB,IAAIh3B,EAAI/E,KAAK+7B,MAAMh3B,EAAKpT,EAEQ,WAA5BqO,KAAK+7B,MAAMwF,aACbx8B,EAAI/E,KAAK+7B,MAAMh3B,EAAKu0C,EAAW,EAAIt5C,KAAK+7B,MAAMyF,QAAQ9vC,IAAM,EACvB,eAA5BsO,KAAK+7B,MAAMwF,eACpBx8B,EAAI/E,KAAK+7B,MAAMh3B,EAAK/E,KAAK+7B,MAAMsF,YAGjCrhC,KAAKkU,QAAQ4oB,YACb98B,KAAKkU,QAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAM0F,YACzCzhC,KAAKkU,QAAQ8kC,KAAKl0C,EAAIC,EAAG7+B,EAAOyrB,GAChCqO,KAAKkU,QAAQirB,OACbn/B,KAAKkU,QAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMqF,WACzCphC,KAAKklC,eACLllC,KAAKkU,QAAQ8rB,WACf,CAEAkF,eAAe,IAAAqU,EACb,MAAM,UAAE3c,EAAY,EAAC,YAAE8U,EAAW,OAAE3f,GAAW/xB,KAAK+7B,MAC9Cyd,EAA2B,QAAhBD,EAAGxnB,aAAM,EAANA,EAAQ7rD,aAAK,IAAAqzE,EAAAA,EAAI,EAEuB,IAAAlhE,GAAxDukD,GAAa58B,KAAK+7B,MAAM2V,aAAe8H,EAAc,KACvDx5C,KAAKkU,QAAQ1lC,IAAI,cAA2C,QAA9B6J,EAAEq5D,QAAAA,EAAe3f,aAAM,EAANA,EAAQrtD,aAAK,IAAA2T,EAAAA,EAAI,IAChE2nB,KAAKkU,QAAQ1lC,IAAI,YAAavE,KAAKhE,IAAI22D,EAAW4c,IAClDx5C,KAAKkU,QAAQipB,SAEjB,CAEQkc,YAAY10C,GAClB,MAAM,cAAErf,GAAkB0a,KAAK4W,yBAC/B,MAAO,CACL9R,EAAG9E,KAAK3uB,MAAMw0B,MAAMf,EAAEH,EAAKG,GAAK9E,KAAK3uB,MAAM2V,QAAQuN,WAAajP,EAAc8Y,KAAKl4B,MACnF6+B,EAAG/E,KAAK3uB,MAAMw0B,MAAMd,EAAEJ,EAAKI,GAAKzf,EAAcoM,IAAIC,OAEtD,CAEAgd,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMj3B,GAAM9E,KAAK3uB,MAAMw0B,MAAMf,EAAEA,GAAK,EACzC9E,KAAK+7B,MAAMh3B,GAAM/E,KAAK3uB,MAAMw0B,MAAMd,EAAEA,GAAK/E,KAAK3uB,MAAMw0B,MAAMd,EAAE,EAC9D,CAEAquC,YACE,OAAOpzC,KAAKrO,MACd,EACD2O,EA3MK0gC,EAAI,OACM9C,EAAAA,GAAAA,MA4MhB8C,EAAK9gC,YAEL,S,qgBC3JA,QA5EA,MASEG,YAAYx4B,EAAiBgvC,EAAe8oB,EAAe/D,EAAoBvqD,GAAkBivB,EAAA,oBAAAA,EAAA,aAPzF,GAACA,EAAA,aACD,GAACA,EAAA,kBAAAA,EAAA,kBAAAA,EAAA,sBAAAA,EAAA,qBAOPN,KAAKn4B,KAAOA,EACZm4B,KAAK6W,GAAKA,EACV7W,KAAK2/B,GAAKA,EACV3/B,KAAK47B,OAASA,EACd57B,KAAK3uB,MAAQA,CACf,CAEAsvB,OAAOuT,GACL,MAAM,cAAEsc,GAAkBxwB,KAAK3uB,MAAMulC,yBACrC1C,EAAQ1lC,IAAI,YAAagiD,EAAc9rD,OACvCwvC,EAAQ1lC,IAAI,cAAegiD,EAAcipB,aACzCvlC,EAAQ1lC,IAAI,YAAagiD,EAAcgpB,aACvC,MAAM10C,IAAM9E,KAAK8E,IACXC,IAAM/E,KAAK+E,IACX20C,EAAa15C,KAAK25C,gBAClBriC,GAASy2B,EAAAA,EAAAA,IAAuBvd,EAAcgpB,aACpDtlC,EAAQ4oB,YACR5oB,EAAQ8kC,KAAKl0C,EAAIwS,EAAQvS,EAAIuS,EAAQoiC,EAAYA,GACjDxlC,EAAQirB,OACRjrB,EAAQipB,QACV,CAEAqP,aAAa7nC,GAEX,OADA3E,KAAKqO,MAAQ1J,EAAKG,EACV9E,KAAKsO,MAAQ3J,EAAKI,CAC5B,CAEAk4B,OAAOt4B,GACL,MAAMmT,EAAOnT,EAAKG,EAAI9E,KAAKqO,MACrBzI,EAAOjB,EAAKI,EAAI/E,KAAKsO,MAC3BtO,KAAK47B,OAAO,CAAE/zD,KAAMm4B,KAAKn4B,KAAMiwC,OAAMlS,OAAMjB,SAC3C3E,KAAKqO,MAAQ1J,EAAKG,EAClB9E,KAAKsO,MAAQ3J,EAAKI,CACpB,CAEA+H,SAASnI,GACP,MAAMz+B,EAAQ85B,KAAK3uB,MAAMw0B,MAAMf,EAAEiB,OAAO/F,KAAK25C,iBACvChoD,EAASqO,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OAAO,GAAK/F,KAAK3uB,MAAMw0B,MAAMd,EAAEgB,OAAO/F,KAAK25C,iBAE7E,OACE35C,KAAK6W,KAAO3wC,EAAQ,GAAKy+B,EAAKG,GAC9B9E,KAAK6W,KAAO3wC,EAAQ,GAAKy+B,EAAKG,GAC9B9E,KAAK2/B,KAAOhuC,EAAS,EAAIgT,EAAKI,GAC9B/E,KAAK2/B,KAAOhuC,EAAS,EAAIgT,EAAKI,CAKlC,CAEA40C,gBACE,MAAM,cAAEnpB,GAAkBxwB,KAAK3uB,MAAMulC,yBACrC,OAAO4Z,EAAc1qD,KAAmC,EAA5B0qD,EAAcgpB,WAC5C,CAEA10C,IACE,MAAM,cAAE0rB,GAAkBxwB,KAAK3uB,MAAMulC,yBACrC,OAAO5W,KAAK3uB,MAAMw0B,MAAMf,EAAE9E,KAAK6W,MAAQ2Z,EAAc1qD,KAAO,CAC9D,CAEAi/B,IACE,MAAM,cAAEyrB,GAAkBxwB,KAAK3uB,MAAMulC,yBACrC,OAAO5W,KAAK3uB,MAAMw0B,MAAMd,EAAE/E,KAAK2/B,MAAQnP,EAAc1qD,KAAO,CAC9D,E,6iBC9DF,MAAM8zE,UAAgEj6D,EAAAA,EAMpE0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YAHf,YAAUA,EAAA,6BAsCM,KAAM,CAAGwE,EAAG,CAAC,KAAM,KAAM,MAAOC,EAAG,CAAC,KAAM,KAAM,UAjCrE/E,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAE/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAMC,KACjB,IAAMh8B,KAAK+7B,MAAME,IACjBj8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAMG,KACjB,IAAMl8B,KAAK+7B,MAAMI,IACjBn8B,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAM2J,KACjB,IAAM1lC,KAAK+7B,MAAM4J,IACjB3lC,KAAK47B,OACL57B,KAAK3uB,QAGT2uB,KAAK6F,MAAM7F,KAAKo8B,uBAClB,CAEAC,cACE,MAAM,gBAAEC,GAAoBt8B,KAAK4W,yBACjC,MAAO,CAAEuoB,KAAM7C,EAAgBoF,YAAa3P,OAAQuK,EAAgBC,OAAOxK,OAC7E,CAIA4J,cAAcznB,GACZ,MAAM,GAAE8nB,EAAE,GAAEE,EAAE,GAAEwJ,EAAE,GAAEzJ,EAAE,GAAEE,EAAE,GAAEwJ,GAAO3lC,KAAKsL,OAClCkxB,GAAYC,EAAAA,EAAAA,IAAiB,CAAET,KAAIE,KAAIwJ,KAAIzJ,KAAIE,KAAIwJ,OAEzDzxB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMoD,MAEpC,MAAM7nB,EAAStX,KAAK+9B,yBAA0BgQ,EAAAA,EAAAA,IAAuB,GAAK,EAE1E75B,EAAQ2oB,UAAUvlB,EAAQA,GAC1BpD,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOT,EAAUR,GAAIQ,EAAUP,IACvC/nB,EAAQgpB,OAAOV,EAAUN,GAAIM,EAAUL,IACvCjoB,EAAQgpB,OAAOV,EAAUkJ,GAAIlJ,EAAUmJ,IACvCzxB,EAAQgpB,OAAOV,EAAUR,GAAIQ,EAAUP,IACvC/nB,EAAQirB,OACRjrB,EAAQ2oB,WAAoB,EAAVvlB,GAAuB,EAAVA,GAE3BtX,KAAK+9B,0BACP7pB,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,QACtC7d,EAAQipB,SACRn9B,KAAKg+B,aAAa9pB,GAEtB,CAEAvF,OAAO7J,EAAWC,GAChB/E,KAAK+7B,MAAMC,IAAMl3B,EACjB9E,KAAK+7B,MAAME,IAAMl3B,EACjB/E,KAAK+7B,MAAMG,IAAMp3B,EACjB9E,KAAK+7B,MAAMI,IAAMp3B,EACjB/E,KAAK+7B,MAAM2J,IAAM5gC,EACjB9E,KAAK+7B,MAAM4J,IAAM5gC,CACnB,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EACvD,OAAQ4D,GACN,IAAK,IACHm4B,KAAK+7B,MAAMC,IAAMlkB,EACjB9X,KAAK+7B,MAAME,IAAMr2B,EACjB,MACF,IAAK,IACH5F,KAAK+7B,MAAMG,IAAMpkB,EACjB9X,KAAK+7B,MAAMI,IAAMv2B,EACjB,MACF,IAAK,IACH5F,KAAK+7B,MAAM2J,IAAM5tB,EACjB9X,KAAK+7B,MAAM4J,IAAM//B,EAKvB,CAEAkH,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,MAAMuH,EAAU,CAAC,EAAG,EAAG,GAAG99D,KAAK2O,IAAC,CAC9ByuB,EAAG9E,KAAKsL,OAAO,IAAD9mC,OAAK6R,IACnB0uB,EAAG/E,KAAKsL,OAAO,IAAD9mC,OAAK6R,QAErB,QAAIkX,EAAAA,GAAAA,eAAoBoX,EAAK2G,OAAQk6B,IAG9B7hC,MAAMmJ,SAASnI,EACxB,EACDrE,EA3GKs5C,EAAQ,OACE1b,EAAAA,GAAAA,UA4GhB0b,EAASzb,UAAUC,YAAc,CAC/BpxD,OAAQ,CAAC,CAAEnF,KAAM,aAAcW,KAAM,UAGvC,S,8gBC/HA,MAAMqxE,UAAwEzI,EAAAA,EAK5E/wC,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YAHf,iBAAeA,EAAA,6BAWC,KAAM,CAAGwE,EAAG,CAAC,KAAM,MAAOC,EAAG,CAAC,KAAM,UANzD/E,KAAK27B,cAAgB37B,KAAK27B,cAAcr4B,KAAKtD,MAE7CA,KAAK+7B,MAAMG,GAAKl8B,KAAK+7B,MAAMC,GAC3Bh8B,KAAK67B,QAAU,CAAC77B,KAAK67B,QAAQ,GAC/B,CAIAF,cAAcznB,GACZ,MAAMtN,EAAS5G,KAAK3uB,MAAMw0B,MAAMd,EAAE6B,SAClC5G,KAAK+7B,MAAME,GAAKr1B,EAAO,GACvB5G,KAAK+7B,MAAMI,GAAKv1B,EAAO,GACvB5G,KAAK67B,QAAQ,GAAG8D,GAAK,KAAO3/B,KAAK+7B,MAAME,GAAKj8B,KAAK+7B,MAAMI,IAAM,EAC7Dx4B,MAAMg4B,cAAcznB,EACtB,CAEAvF,OAAO7J,GACL,OAAQ9E,KAAK+7B,MAAMC,GAAKh8B,KAAK+7B,MAAMG,IAAMp3B,CAC3C,CAEA82B,OAAM33D,GAAyD,IAAxD,KAAE6zC,GAAoD7zC,EAC3D,OAAO+7B,KAAK2O,OAAOmJ,EACrB,EACDxX,EA/BKu5C,EAAY,OACF3b,EAAAA,GAAAA,cAgChB,S,+jBCPA,MAAM4b,UAAuDn6D,EAAAA,EAO3D0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,YALf,iBAAeA,EAAA,6BA+DC,KAAM,CAC3BwE,EAAG,CAAC,KAAM,KAAM,KAAM,KAAM,MAC5BC,EAAG,CAAC,KAAM,KAAM,KAAM,KAAM,UA1D5B/E,KAAK47B,OAAS57B,KAAK47B,OAAOt4B,KAAKtD,MAE/BA,KAAK67B,QAAU,CACb,IAAIC,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAMge,KACjB,IAAM/5C,KAAK+7B,MAAMie,IACjBh6C,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAMke,KACjB,IAAMj6C,KAAK+7B,MAAMme,IACjBl6C,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAMoe,KACjB,IAAMn6C,KAAK+7B,MAAMqe,IACjBp6C,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAM6N,KACjB,IAAM5pC,KAAK+7B,MAAM8N,IACjB7pC,KAAK47B,OACL57B,KAAK3uB,OAEP,IAAIyqD,EAAAA,EACF,KACA,IAAM97B,KAAK+7B,MAAM2M,KACjB,IAAM1oC,KAAK+7B,MAAM6M,IACjB5oC,KAAK47B,OACL57B,KAAK3uB,QAGmB,MAAxB2uB,KAAK+7B,MAAMa,YACb58B,KAAK+7B,MAAMa,UAAY,GAEzB58B,KAAK6F,MAAM7F,KAAKo8B,uBAClB,CAEAC,cACE,MAAM,gBAAEC,GAAoBt8B,KAAK4W,yBACjC,MAAO,CACLuoB,KAAM7C,EAAgBoF,YACtB3P,OAAQ,CACN7rD,MAAO,EACPxB,MAAO43D,EAAgBC,OAAOxK,QAGpC,CAOA4J,cAAcznB,GACZ,MAAM,GAAE6lC,EAAE,GAAEC,EAAE,GAAEC,EAAE,GAAEC,EAAE,GAAEC,EAAE,GAAEC,EAAE,GAAExQ,EAAE,GAAEC,EAAE,GAAEnB,EAAE,GAAEE,GAAO5oC,KAAKsL,OAClDkxB,GAAYC,EAAAA,EAAAA,IAAiB,CAAEsd,KAAIC,KAAIC,KAAIC,KAAIC,KAAIC,KAAIxQ,KAAIC,KAAInB,KAAIE,OAEzE10B,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMoD,MACpCjrB,EAAQ1lC,IAAI,YAAawxB,KAAK+7B,MAAMhK,OAAO7rD,OAC3CguC,EAAQ1lC,IAAI,cAAewxB,KAAK+7B,MAAMhK,OAAOrtD,OAE7C,MAAM4yC,GAASy2B,EAAAA,EAAAA,IAAuB/tC,KAAK+7B,MAAMhK,OAAO7rD,OACxDguC,EAAQ2oB,UAAUvlB,EAAQA,GAE1BpD,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOT,EAAUud,GAAIvd,EAAUwd,IACvC9lC,EAAQgpB,OAAOV,EAAUyd,GAAIzd,EAAU0d,IACvChmC,EAAQgpB,OAAOV,EAAU2d,GAAI3d,EAAU4d,IACvClmC,EAAQgpB,OAAOV,EAAUud,GAAIvd,EAAUwd,IACvC9lC,EAAQirB,OACkE,KAAhD,MAArBn/B,KAAK+7B,MAAMhK,OAAiB/xB,KAAK+7B,MAAMhK,OAAO7rD,WAAQ0P,IACzDs+B,EAAQipB,SAGVjpB,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOT,EAAU2d,GAAI3d,EAAU4d,IACvClmC,EAAQgpB,OAAOV,EAAUoN,GAAIpN,EAAUqN,IACvC31B,EAAQgpB,OAAOV,EAAUkM,GAAIlM,EAAUoM,IACvC10B,EAAQgpB,OAAOV,EAAU2d,GAAI3d,EAAU4d,IACvClmC,EAAQirB,OACkE,KAAhD,MAArBn/B,KAAK+7B,MAAMhK,OAAiB/xB,KAAK+7B,MAAMhK,OAAO7rD,WAAQ0P,IACzDs+B,EAAQipB,SAGVjpB,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOT,EAAUyd,GAAIzd,EAAU0d,IACvChmC,EAAQgpB,OAAOV,EAAUoN,GAAIpN,EAAUqN,IACvC31B,EAAQ+oB,OAAOT,EAAUud,GAAIvd,EAAUwd,IACvC9lC,EAAQgpB,OAAOV,EAAUkM,GAAIlM,EAAUoM,IACvC10B,EAAQipB,SAER,MAAMjpD,EAAO,IAAI8sD,EAAAA,EACf,CACEG,KAAM,CAAEr7D,KAAM,EAAGgB,MAAO,QACxBu6D,WAAY,EACZG,QAAS,CACP9vC,IAAK,EACL2Z,MAAO,EACP+D,OAAQ,EACRhR,KAAM,GAERmjC,aAAcyM,EAAAA,GAAAA,OAEd1M,UAAW,SACXF,UAAW,UACXK,WAAYzhC,KAAK+7B,MAAMoD,MAAQ,WAEjCn/B,KAAK3uB,OAGP,IAAK,MAAM8O,KAAKgP,MAAM7lB,KAAK,SACzB4K,EACG1F,IAAI,CACH0F,KAAMiM,EAAEtW,cACRi7B,EAAG03B,EAAWr8C,EAAI,KAAmB,EACrC4kB,EAAGy3B,EAAWr8C,EAAI,KAAmB,KAEtCwgB,OAAOuT,GAGZ,MAAMmmC,EAAWA,CAACpe,EAAYE,EAAYwJ,KACxC,MAAM2U,EAAMrwE,KAAK+xB,IAAIgE,KAAK+7B,MAAOE,EAAK,KAAmBj8B,KAAK+7B,MAAOI,EAAK,MACpEoe,EAAMtwE,KAAK+xB,IAAIgE,KAAK+7B,MAAO4J,EAAK,KAAmB3lC,KAAK+7B,MAAOI,EAAK,MAAoBme,EACxFx1C,GAAK03B,EAAWP,EAAK,KAAmBO,EAAWmJ,EAAK,MAAoB,EAC5E5gC,GAAKy3B,EAAWP,EAAK,KAAmBO,EAAWmJ,EAAK,MAAoB,EAClF,OAAOzxD,EACJ1F,IAAI,CACH0F,KAAMqmE,EAAIvJ,QAAQ,GAClBlsC,IACAC,MAEDpE,OAAOuT,EAAQ,EAGpBmmC,EAAS,IAAK,IAAK,KACnBA,EAAS,IAAK,IAAK,KACnBA,EAAS,IAAK,IAAK,KACnBA,EAAS,IAAK,IAAK,KAEfr6C,KAAK+9B,yBACP/9B,KAAKg+B,aAAa9pB,GAEpBA,EAAQ2oB,WAAoB,EAAVvlB,GAAuB,EAAVA,EACjC,CAEA3I,OAAO7J,EAAWC,GAChB,IAAK,MAAM5kB,KAAKgP,MAAM7lB,KAAK,SACzB02B,KAAK+7B,MAAO57C,EAAI,MAAoB2kB,EACpC9E,KAAK+7B,MAAO57C,EAAI,MAAoB4kB,CAExC,CAEA62B,OAAM33D,GAAqD,IAApD,KAAE4D,EAAI,KAAEiwC,EAAI,KAAElS,GAAoC3hC,EAEvD,OADA+7B,KAAK+7B,MAAOl0D,EAAO,MAAoBiwC,EAC/B9X,KAAK+7B,MAAOl0D,EAAO,MAAoB+9B,CACjD,CAEAkH,SAASnI,GACP,GAAIhB,MAAMs6B,oCAAqC,OAAO,EACtD,IAAI99C,EACJ,MAAMq6D,EAAM,MACV,MAAM7uE,EAAS,GACf,IAAKwU,KAAKgP,MAAM7lB,KAAK,OACnBqC,EAAO6G,KAAK,CAAEsyB,EAAG9E,KAAKsL,OAAQnrB,EAAI,KAAkB4kB,EAAG/E,KAAKsL,OAAQnrB,EAAI,OAE1E,OAAOxU,CACR,EANW,GAON8uE,EAAM,MACV,MAAMC,EAAU,GAChB,IAAKv6D,KAAKgP,MAAM7lB,KAAK,OACnBoxE,EAAQloE,KAAK,CAAEsyB,EAAG9E,KAAKsL,OAAQnrB,EAAI,KAAkB4kB,EAAG/E,KAAKsL,OAAQnrB,EAAI,OAE3E,OAAOu6D,CACR,EANW,GAOZ,SAAIntD,EAAAA,GAAAA,eAAoBoX,EAAK2G,OAAQkvC,KAAQjtD,EAAAA,GAAAA,eAAoBoX,EAAK2G,OAAQmvC,KAGvE92C,MAAMmJ,SAASnI,EACxB,EACDrE,EArMKw5C,EAAK,OACK5b,EAAAA,GAAAA,OAsMhB4b,EAAM3b,UAAUC,YAAc,CAC5BpxD,OAAQ,CACN,CAAEnF,KAAM,aAAcW,KAAM,QAC5B,CAAEX,KAAM,SAAUW,KAAM,SAAUxC,IAAK,KAI3C,S,wMCxJA,QAjFA,MACEq6B,cACEL,KAAKgL,QAAS2vC,EAAAA,EAAAA,MAAa,KAAOvtE,SAAS6xD,cAAc,SAC3D,CAEAzwD,IAAIgwB,EAAUt4B,EAAOyrB,GACnBqO,KAAKxB,SAAWA,EAChBwB,KAAK95B,MAAQA,EACb85B,KAAKrO,OAASA,EACdqO,KAAK46C,UAAW,CAClB,CAEAj6C,OAAOuT,EAASpP,EAAGC,GAUjB,GATS,MAALD,IACFA,EAAI,GAEG,MAALC,IACFA,EAAI,GAED/E,KAAK46C,UACR56C,KAAK66C,YAEH76C,KAAK95B,MAAQ,GAAK85B,KAAKrO,OAAS,GAIpC,IACMqO,KAAK0L,OAAS,GAAK1L,KAAKgL,OAC1BkJ,EAAQ4mC,UACN96C,KAAKgL,OACL,EACA,KACGhL,KAAK95B,MAAQ85B,KAAK0L,UAClB1L,KAAKrO,OAASqO,KAAK0L,OACtB5G,EACAC,EACA/E,KAAK95B,MACL85B,KAAKrO,SAGPuiB,EAAQ/5B,OACR+5B,EAAQ2oB,UAAU/3B,EAAGC,GACrB/E,KAAKxB,SAAS0V,GACdA,EAAQvJ,UAEZ,CAAE,MAAOxiC,IACP4O,EAAAA,EAAAA,IACE5O,EACA63B,KAAKgL,OACD,CACElzB,MAAO,CACL5R,MAAO85B,KAAK95B,MACZyrB,OAAQqO,KAAKrO,OACb+Z,MAAO1L,KAAK0L,MACZqvC,OAAQ/6C,KAAKgL,OAAO9kC,MACpB80E,QAASh7C,KAAKgL,OAAOrZ,OACrBspD,OAAQjoE,OAAOkoE,OAAOh1E,MACtBi1E,QAASnoE,OAAOkoE,OAAOvpD,SAG3B,CAAC,EAET,CACF,CAEAkpD,WACMF,EAAAA,EAAAA,QAGJ36C,KAAKgL,OAAO9kC,MAAQ85B,KAAK95B,MACzB85B,KAAKgL,OAAOrZ,OAASqO,KAAKrO,OAC1BqO,KAAKkU,SAAUxD,EAAAA,EAAAA,GAAoB1Q,KAAKgL,QACxChL,KAAK0L,MAAQ9M,EAAAA,GAAAA,gBACbA,EAAAA,GAAAA,uBAA6B,CAAE+M,cAAe3L,KAAKgL,OAAQ9kC,MAAO85B,KAAK95B,MAAOyrB,OAAQqO,KAAKrO,SAC3FqO,KAAKkU,QAAQrO,MAAM7F,KAAK0L,MAAO1L,KAAK0L,OAEpC1L,KAAKxB,SAASwB,KAAKkU,SACnBlU,KAAK46C,UAAW,EAClB,G,iIClFK,IAAKQ,EAAwB,SAAxBA,GAAwB,OAAxBA,EAAAA,EAAwB,WAAxBA,EAAAA,EAAwB,WAAxBA,EAAAA,EAAwB,WAAxBA,EAAAA,EAAwB,YAAxBA,CAAwB,MAO7B,SAASC,EAAoBC,GAClC,MAAO,CACLC,KAAMD,GAAkBF,EAAyBI,GACjDC,IAAKH,GAAkBF,EAAyBjlE,EAChDulE,IAAKJ,GAAkBF,EAAyBO,EAChDC,IAAKN,GAAkBF,EAAyB9kE,EAEpD,C,wcC8FA,MAAMulE,EAAgB53E,IAA+D,IAA9D,KAAEif,EAAI,UAAEmC,GAAiDphB,EAC1E63E,EAAa,GACjB,MAAM1/C,EAAQlZ,EAAKwL,WACb8M,EAAOtY,EAAK64D,cACZ1/C,EAAMnZ,EAAK84D,UACjB,OAAQ32D,GACN,KAAK6kC,EAAAA,GAAAA,GACL,KAAKA,EAAAA,GAAAA,GACL,KAAKA,EAAAA,GAAAA,GACL,KAAKA,EAAAA,GAAAA,GACL,KAAKA,EAAAA,GAAAA,IACL,KAAKA,EAAAA,GAAAA,IACL,KAAKA,EAAAA,GAAAA,IACL,KAAKA,EAAAA,GAAAA,EACL,KAAKA,EAAAA,GAAAA,GACL,KAAKA,EAAAA,GAAAA,GACH,MAAM/pC,IACD+C,EAAK+4D,WAAa,IAAM,GAAM,GAAGn8B,WAAWo8B,QAAQ,MACvD,IACAh5D,EAAKi5D,aAAar8B,WAAWo8B,QAAQ,OACpCh5D,EAAK+4D,WAAa,GAAK,KAAO,MACjCH,EAAa,GAAHt3E,OAAM43E,EAAAA,GAAOhgD,GAAM,KAAA53B,OAAI63B,EAAG,KAAA73B,OAAI2b,GACxC,MACF,KAAK+pC,EAAAA,GAAAA,EACL,KAAKA,EAAAA,GAAAA,EACH4xB,EAAa,GAAHt3E,OAAM43E,EAAAA,GAAOhgD,GAAM,KAAA53B,OAAI63B,GACjC,MACF,KAAK6tB,EAAAA,GAAAA,EACH4xB,EAAa,GAAHt3E,OAAM43E,EAAAA,GAAOhgD,GAAM,KAAA53B,OAAIg3B,GAMrC,OAAOsgD,CAAU,EAoBbO,EAAUC,IAAAA,KAAAA,KAEhB,MAAMC,UAA6D58D,EAAAA,EACjEogB,mBACEp1B,OAAO0hE,eAAersC,KAAKm+B,UAAW,QAAS,CAC7C3e,MACE,MAAM,cAAEl6B,GAAkB0a,KAAK4W,yBAC/B,OAAO5W,KAAK3uB,MAAMnL,MAAQof,EAAc8Y,KAAKl4B,MAAQof,EAAc+lB,MAAMnlC,KAC3E,IAGFyE,OAAO0hE,eAAersC,KAAKm+B,UAAW,SAAU,CAC9C3e,MACE,MAAM,cAAEl6B,GAAkB0a,KAAK4W,yBAC/B,OAAO5W,KAAK5tB,UAAUuf,OAASrM,EAAcoM,IAAIC,OAASrM,EAAc8pB,OAAOzd,MACjF,GAEJ,CAEAoO,0BAAyBrtB,GAAsE,IAArE,SAAEwoC,GAAiExoC,EAC3F,OAAOzI,KAAKhE,IAAI,KAAMi1C,EAASxzC,KAAKyzC,GAAYqhC,EAAAA,EAAerhC,EAAQtzC,MAAM40E,mBAAmBthC,KAClG,CA+BA9a,YAAYpyB,EAAoBmE,GAC9BuxB,MAAM11B,EAAQmE,GAAUkuB,EAAA,yBAAAA,EAAA,qBAAAA,EAAA,oBAAAA,EAAA,0CAAAA,EAAA,mBAvBZ,GAACA,EAAA,mBACD,GAACA,EAAA,gBAC2B,IAAEA,EAAA,gBACtB,IAAEA,EAAA,4BAAAA,EAAA,2BAEH,GAAIA,EAAA,mBAKd,MAAIA,EAAA,WAm3DTwE,GAAc9E,KAAK5tB,UAAUyzB,MAAMf,EAAE9E,KAAK7Y,KAAKogB,SAASzC,MAAGxE,EAAA,WAE3DyE,GAAc/E,KAAK5tB,UAAUyzB,MAAMd,EAAEA,KAt2DzC/E,KAAK5tB,UAAYA,EACjB4tB,KAAK3uB,MAAQ2uB,KAAK5tB,UAAU4U,QAC5BgZ,KAAK7Y,KAAO6Y,KAAK3uB,MAAM8S,QACvB,MAAM3Q,EAAmBwsB,KAAK3uB,MAAMsiB,eAMpC,GALAqM,KAAK5iB,2BAA6B5J,EAAiB4J,2BACnD4iB,KAAK08C,aAAelpE,EAAiBkpE,aACrC18C,KAAKrB,SAAWhQ,EAAAA,GAAAA,UAAe,GAE/BqR,KAAKkb,SAAW,GACZjtC,EAAOitC,SAAU,CACnB,IAAK,MAAMyhC,KAAqB1uE,EAAOitC,SAAU,CAO/C,MAAMC,EAAUqhC,EAAAA,EAAeG,EAAkB90E,MAAMyT,WACrD,IACKqhE,EACHj4E,OACGi4E,EAAkBj4E,OAASi4E,EAAkBj4E,MAAMoH,SAAS,KACzD,IACAnH,EAAAA,EAAAA,IAAkBg4E,EAAkBj4E,QAE5Cs7B,KAAK5tB,WAEP4tB,KAAK48C,WAAWzhC,EAClB,QACOltC,EAAOitC,QAChB,CAEAlb,KAAK68C,YAAc78C,KAAK68C,YAAYv5C,KAAKtD,MACzCA,KAAKyiC,WAAaziC,KAAKyiC,WAAWn/B,KAAKtD,MACvCA,KAAKyK,gBAAkBzK,KAAKyK,gBAAgBnH,KAAKtD,MACjDA,KAAK88C,WAAa98C,KAAK88C,WAAWx5C,KAAKtD,MACvCA,KAAK+8C,qBAAuB/8C,KAAK+8C,qBAAqBz5C,KAAKtD,MAG3DA,KAAK5tB,UAAUkxB,KAAK,SAAUtD,KAAK88C,YACnC98C,KAAK5tB,UAAUkxB,KAAK,SAAUtD,KAAKjyB,QAAQu1B,KAAKtD,KAAM,WACtDA,KAAK3uB,MAAQ2uB,KAAK5tB,UAAU4U,QAE5BgZ,KAAK3uB,MAAMiyB,KAAK,SAAUtD,KAAK88C,YAC/B98C,KAAK3uB,MAAMiyB,KAAK,SAAUtD,KAAKjyB,QAAQu1B,KAAKtD,KAAM,WAClDA,KAAK3uB,MAAMiyB,KAAK5jB,EAAAA,GAAAA,iBAAoCsgB,KAAKg9C,uBAAuB15C,KAAKtD,OACrF,MAAMi9C,EAA0Bj9C,KAAKjyB,QAAQu1B,KAAKtD,KAAM,SAAU,SAClEA,KAAK3uB,MAAMiyB,KAAK,WAAW,KACzBtD,KAAK3uB,MAAMkyB,OAAO,SAAUvD,KAAK88C,YACjC98C,KAAK3uB,MAAMkyB,OAAO7jB,EAAAA,GAAAA,iBAAoCsgB,KAAKg9C,uBAAuB15C,KAAKtD,OACvFk9C,EAAAA,EAAAA,OAAkB,SAAUD,IAC5BlrC,EAAAA,EAAAA,IAAc/R,KAAKm9C,UAAUnyC,OAAO,IAEtCkyC,EAAAA,EAAAA,KAAgB,SAAUD,GAE1Bj9C,KAAK3uB,MAAMsiB,eAAe2P,KAAK,QAAStD,KAAK88C,YAC7C98C,KAAK3uB,MAAMsiB,eAAe2P,KAAK,SAAUtD,KAAKo9C,yBAAyB95C,KAAKtD,OAE5EA,KAAK88C,YACP,CAEAO,cACE,MAAM3mE,MAAM,wBACd,CAEAiqB,OAAOuT,GAKL,GAJAlU,KAAK7Y,KAAO6Y,KAAK3uB,MAAM8S,QACvB6b,KAAKzL,WAAayL,KAAK3uB,MAAMkjB,WAC7ByL,KAAKkU,QAAUA,EAEgB,IAA3BlU,KAAK7Y,KAAK+vB,MAAMrsC,OAGlB,OAFAm1B,KAAKs9C,+BACAt9C,KAAKu9C,wBAAwBv9C,KAAKw9C,aAAatpC,IAItDlU,KAAKkU,QAAQ/5B,OACb6lB,KAAKy9C,OACLz9C,KAAK09C,eACL19C,KAAKq9C,cACLr9C,KAAK29C,iBACL39C,KAAK49C,kBACL59C,KAAK69C,0BACL79C,KAAKkU,QAAQvJ,UACR3K,KAAKu9C,wBAAwBv9C,KAAKw9C,aAAatpC,EACtD,CAEA4pC,WAAW5pC,GACTlU,KAAK7Y,KAAO6Y,KAAK3uB,MAAM8S,QACvB6b,KAAKzL,WAAayL,KAAK3uB,MAAMkjB,WAC7ByL,KAAKkU,QAAUA,EAEflU,KAAK+9C,cACL/9C,KAAKm9C,UAAUx8C,OAAOuT,EACxB,CAEAspC,aAAatpC,GACX,GAAIlU,KAAKg+C,WAAY,CACnB,MAAM,cAAE14D,GAAkB0a,KAAK4W,yBAI/B,GAHA1C,EAAQ2oB,UAAUv3C,EAAc8Y,KAAKl4B,MAAO,GAC5C85B,KAAKg+C,WAAWr9C,OAAOuT,IAEnB6E,EAAAA,EAAAA,IAAqB/Y,KAAK5iB,6BAAoD,iBAArB4iB,KAAK7Y,KAAK9U,OAA2B,CAChG,MAAM,OAAEkqD,GAAWj3C,EAAciuC,QACjC,IAAIyN,EAAAA,EACF,CACE9sD,KAAM,MACN4wB,EAAGxf,EAAcoM,IAAIrf,OAAO4rE,OAAO7/C,KACnC2G,EAAGzf,EAAcoM,IAAIrf,OAAO4rE,OAAOvsD,IAAOwsD,EAAAA,GAAAA,IAAgBC,EAAAA,GAAAA,IAC1Dhd,KAAM,CAAEr7D,KAAMo4E,EAAAA,GAAAA,KACd9c,UAAW7E,EAAOroD,KAClBqtD,aAAcj8C,EAAcoM,IAAI0sD,UAElCp+C,KAAK5tB,WACLuuB,OAAOuT,EACX,CAEAA,EAAQ2oB,WAAWv3C,EAAc8Y,KAAKl4B,MAAO,EAC/C,CACF,CAEAm4E,gBAAgBnqC,GAAmC,IAAAoqC,EACjD,MAAM,cAAEh5D,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAC3BpvC,EAAQ6b,KAAK3uB,MAAM8S,QACnB4gB,GAAK/E,KAAKrO,OAASqO,KAAKu+C,SAASC,QAAQ,GAAK,GAAK,EAEzD,OAAO,IAAIxd,EAAAA,EACT,CACE9sD,KAAMiQ,EAAMnE,aAAeM,EAAAA,GAAAA,MAAmB,sBAAuBm+D,EAAAA,EAAAA,IAAkBt6D,EAAMkB,WAC7Fyf,EAAGxf,EAAc8Y,KAAK/Y,UAAU44D,OAAO7/C,KACvC2G,EAAGzf,EAAcoM,IAAIC,OAASoT,GAA4C,QAA3Cu5C,EAAIh5D,EAAc8Y,KAAK/Y,UAAU44D,OAAOvsD,WAAG,IAAA4sD,EAAAA,EAAI,GAC9EvhB,OAAQ,GACRoE,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ17C,EAAc8Y,KAAK/Y,UAAU87C,MAC3EC,UAAW7E,EAAOmiB,cAClBpd,UAAW2M,EAAAA,GAAAA,OACX1M,aAAcyM,EAAAA,GAAAA,YAEhBhuC,KAAK5tB,WACLuuB,OAAOuT,EACX,CAEAuuB,WAAWvuB,GACT,MAAM,cAAE5uB,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QACjCrf,EAAQ/5B,OACR+5B,EAAQ2oB,UAAUv3C,EAAc8Y,KAAKl4B,MAAO,IAEvC6yC,EAAAA,EAAAA,IAAqB/Y,KAAK5iB,4BAa7B4iB,KAAKg+C,WAAa,IAAIhd,EAAAA,EACpB,CACE9sD,KAAM8rB,KAAK7Y,KAAK3e,MAAQw3B,KAAK7Y,KAAK9U,OAClCyyB,EAAGxf,EAAcoM,IAAIrf,OAAO4rE,OAAO7/C,KACnC2G,EAAGzf,EAAcoM,IAAIrf,OAAO4rE,OAAOvsD,IACnCyvC,KAAM,CAAEr7D,KAAMo4E,EAAAA,GAAAA,EAAap3E,MAAO,QAClCs6D,UAAW7E,EAAOroD,MAEpB8rB,KAAK5tB,WApBP4tB,KAAKg+C,WAAa,IAAIhd,EAAAA,EACpB,CACE9sD,KAAM8rB,KAAK7Y,KAAK3e,MAAQw3B,KAAK7Y,KAAK9U,OAClCyyB,EAAGxf,EAAcoM,IAAIrf,OAAO4rE,OAAO7/C,KACnC2G,EAAGzf,EAAcoM,IAAIrf,OAAO4rE,OAAOvsD,IACnCyvC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ17C,EAAcoM,IAAIrf,OAAO8uD,MACvEI,aAAcj8C,EAAcoM,IAAI0sD,SAChChd,UAAW7E,EAAOroD,MAEpB8rB,KAAK5tB,WAcT4tB,KAAK2+C,YAAc3+C,KAAKg+C,WAAWvT,QAAQv2B,GAGvClU,KAAK5iB,6BAA+BC,EAAAA,GAAAA,WACtC,IAAI2jD,EAAAA,EACF,CACE9sD,KAAM,eACN4wB,EAAG9E,KAAK95B,MAAQof,EAAc+lB,MAAMnlC,MAAQ,EAC5C6+B,EAAG,EACHo8B,KAAM,CAAEr7D,KAAMo4E,EAAAA,GAAAA,IACd5c,UAAW2M,EAAAA,GAAAA,MACX1M,aAAcyM,EAAAA,GAAAA,IACd5M,UAAW,sBAEbphC,KAAK5tB,WACLuuB,OAAOuT,GAGNlU,KAAKu9C,yBACRv9C,KAAK4+C,aAAa,CAAE1qC,YACflU,KAAK6+C,SAAS,IACjB7+C,KAAK8+C,QAAQ,CAAE5qC,UAAS6qC,cAAc,IAExC/+C,KAAK8+C,QAAQ,CAAE5qC,aAGjBA,EAAQvJ,UACH3K,KAAKu9C,yBAA2BxkC,EAAAA,EAAAA,IAAqB/Y,KAAK5iB,6BAC7D4iB,KAAKq+C,gBAAgBnqC,EAEzB,CAEA4qC,QAAOvrE,GAoBJ,IApBK,QACN2gC,EAAO,aACP6qC,GAAe,EAAI,KACnB53D,EAAI,KACJjE,EAAI,WACJ44D,EAAa,KAAI,iBACjBkD,EAAmB,MAcpBzrE,EACC,IAAKysB,KAAK7Y,KAAK83D,SAAU,OAGzB,MAAMA,EAAW,GAAHz6E,OAAM43E,EAAAA,MAAWp8C,KAAK7Y,KAAK83D,SAAW,KAAO,IAAO,GAAE,KAAAz6E,OAAIw7B,KAAK7Y,KAAK83D,SAAW,MACzFlmC,EAAAA,EAAAA,IAAqB/Y,KAAK5iB,4BAC5B4iB,KAAKk/C,WAAW,CACdhrC,UACAhxB,KAAM+7D,EACNE,mBAAmB,EACnBC,cAAc,EACdL,iBAEO53D,GAAQjE,EACjB8c,KAAKk/C,WAAW,CACdhrC,UACAhxB,KAAM24D,EAAc,CAAE34D,OAAMmC,UAAW2a,KAAK7Y,KAAK9B,YACjDiC,KAAMH,EAAKG,KACX+3D,KAAMl4D,EAAKk4D,KACXC,IAAKn4D,EAAKm4D,IACVpoC,MAAO/vB,EAAK+vB,MACZ46B,QAAQS,EAAAA,EAAAA,IAA8BroE,OAAOid,EAAK2qD,SAClDiN,eACAC,qBAEsB,OAAflD,EACT97C,KAAKk/C,WAAW,CACdhrC,UACAhxB,KAAM44D,EACNx0D,KAAM,KACN+3D,KAAM,KACNC,IAAK,KACLpoC,MAAO,KACP46B,OAAQ,KACRiN,iBAGF/+C,KAAKk/C,WAAW,CACdhrC,UACAhxB,KAAM+7D,EACNM,UACEr1E,OAAOs1E,SAASx/C,KAAK7Y,KAAKitC,aAAep0B,KAAK7Y,KAAKitC,aAAep0B,KAAK7Y,KAAKqG,UACxEwS,KAAKy/C,UAAUz/C,KAAK7Y,KAAKitC,iBACzBx+C,EACNk8D,QAAQS,EAAAA,EAAAA,IAA8BvyC,KAAK7Y,KAAKu4D,YAChDN,cAAc,EACdpuC,KAAMriB,EAAAA,GAAAA,sBAA4BqR,KAAK7Y,KAAKjE,KAAK8sC,QAAS2vB,mBAAmB,QAAS,CACpFC,KAAM,UACNC,OAAQ,YAEVd,kBACG/+C,KAAK8/C,sBAGd,CAEAA,qBACE,MAAO,CACLx4D,KAAM0Y,KAAKy/C,UAAUz/C,KAAK7Y,KAAK44D,UAC/BV,KAAMr/C,KAAKy/C,UAAUz/C,KAAK7Y,KAAK64D,UAC/BV,IAAKt/C,KAAKy/C,UAAUz/C,KAAK7Y,KAAK84D,SAC9B/oC,MAAOlX,KAAKy/C,UAAUz/C,KAAK7Y,KAAKqG,WAEpC,CAEAuvD,qBAAqB7oC,GACdlU,KAAKu9C,uBAE4B,IAA3Bv9C,KAAK7Y,KAAK+vB,MAAMrsC,QACzBm1B,KAAKkgD,+BAA+BhsC,GAFpClU,KAAKmgD,8BAA8BjsC,EAIvC,CAEAisC,8BAA8BjsC,GAC5B,MAAM,cAAE5uB,GAAkB0a,KAAK4W,yBACzB1iC,EAAO,IAAI8sD,EAAAA,EACf,CACEl8B,EAAGxf,EAAc8Y,KAAKgiD,aAAanC,OAAO7/C,KAC1C2G,EAAGzf,EAAcoM,IAAIC,OAASrM,EAAc8Y,KAAKgiD,aAAanC,OAAOvsD,IACrEyvC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ17C,EAAc8Y,KAAKgiD,aAAajf,MAC9EI,aAAcyM,EAAAA,GAAAA,KAEhBhuC,KAAK5tB,WAEP,IAAK,MAAM+oC,KAAWnb,KAAKkb,SACpBC,EAAQklC,2BAGbnsE,EACG1F,IAAI,CACH0F,KAAMinC,EAAQ2E,WACd/a,EAAG7wB,EAAKsrC,IAAI,KAAQl6B,EAAc8Y,KAAKgiD,aAAaE,aACpDlf,UAAWjmB,EAAQolC,kBAEpB5/C,OAAOuT,EAEd,CAEAssC,qBACE,OAAIxgD,KAAK7Y,KAAKnH,aAAeM,EAAAA,GAAAA,QAAqB0f,KAAK7Y,KAAKqG,WAAa,KAChE,EAEF,CACT,CAEAizD,uBAAsB1sE,GAA6F,IAA5F,UAAEyZ,EAAS,kBAAEkzD,GAA6E3sE,EAC/G,MAAiC,iBAAtB2sE,GAAkC1gD,KAAK3uB,MAAMw0B,QAAUC,EAAAA,GAAAA,WACzD,GAAPthC,OAAUw7B,KAAK0V,OAAMirC,EAAAA,EAAAA,IAAuB,CAAE3N,OAAQxlD,EAAWozD,KAAMF,IAAsB,GAAE,KAE1F1gD,KAAK0V,MAAMloB,EACpB,CAEAqvD,YACE3oC,GAGA,IAFA,UAAE1mB,GAAsD7T,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAGqmB,KAAK7Y,KAChEqqD,IAAY73D,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,KAAAA,UAAA,GAEZ,MAAM,cAAE2L,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAC3BstB,EAAgB7gD,KAAK5tB,UAAUuf,OAASrM,EAAcoM,IAAIC,OAASrM,EAAc8pB,OAAOzd,OAC9F,IAAIoT,EAAG+7C,EAAWC,EAAWC,EAC7B,MAAMnkB,GAAYokB,EAAAA,EAAAA,IAAa,CAAE/sC,UAASu1B,QAASnkD,EAAc8Y,KAAKl4B,MAAOwjE,QAASpkD,EAAcoM,IAAIC,SACxGkrC,EAAUqkB,KACV,MAAMC,EAAYl3E,KAAKuwC,MAAMxa,KAAK5tB,UAAUuf,OAAS,IAC/CyvD,EAASphD,KAAKiG,aACd,kBAAEy6C,GAAsBU,EAC9B,IACIC,EADAC,EAAY,EAGhB,OAAQthD,KAAK3uB,MAAMw0B,OACjB,KAAKC,EAAAA,GAAAA,WAAsB,CACzB,IAAK46C,EAAmB,OAExB,MAAMn7C,EAAavF,KAAK5tB,UAAUmzB,YAC5B,IAAEv/B,EAAG,IAAEC,GAAQs/B,GAAc67C,EAEnCphD,KAAK3uB,MAAM0K,gBAAgB,gBAAiB2kE,GAE5C,MAAMa,GAAUZ,EAAAA,EAAAA,IAAuB,CAAE3N,OAAQhtE,EAAK46E,KAAMF,IACtDc,GAAUb,EAAAA,EAAAA,IAAuB,CAAE3N,OAAQ/sE,EAAK26E,KAAMF,IAG5DK,EADkBU,EAAAA,cAAiBjD,MAAM,CAAC,EAAGqC,IAAgBj6C,OAAO,CAAC46C,EAASD,IAAUG,KAAK,IACvEC,MAAM13E,KAAKjE,IAAIm7E,EAAW,IAChDL,EAAYC,EAAUr5E,KAAKk6E,IAASC,EAAAA,EAAAA,IAAuB,CAAE7O,OAAQ4O,EAAMhB,KAAMF,MACjFM,EAAiBhhD,KAAKygD,uBAAuB,CAAEjzD,YAAWkzD,sBAC1D,KACF,CACA,KAAK56C,EAAAA,GAAAA,YAAuB,CAC1B,IAAK46C,EAAmB,OAExB,MAAMn7C,EAAavF,KAAK5tB,UAAUmzB,YAC5B,IAAEv/B,EAAG,IAAEC,GAAQs/B,GAAc67C,EACnCN,EAAY,CAAC72E,KAAKuwC,MAAMx0C,IACxB,MAAM87E,EAAW,GAEXC,EAAgB,GACtB,GAAI/7E,EAAM,EAAG,CACX,IAAIg8E,EAAuB/3E,KAAKjE,IAAI,EAAGC,GACvC,KAAO+5B,KAAK5tB,UAAUyzB,MAAMd,EAAEi9C,GAAwBF,EAAW9hD,KAAK5tB,UAAUyzB,MAAMd,EAAE/+B,IAAM,CAC5F,MAAM47E,EAAO5hD,KAAK5tB,UAAUyzB,MAAMd,EAAEgB,OAAO/F,KAAK5tB,UAAUyzB,MAAMd,EAAEi9C,GAAwBF,GACpFtD,EAAQiD,EAAAA,MAASO,GAAuBJ,EAAM,GACpDI,GAAwBxD,EAAMA,EAAM3zE,OAAS,GAC7Ck3E,EAAcE,QAAQD,EACxB,CACF,CAEA,MAAME,EAAgB,GAItB,IAHIj8E,EAAM,GACRi8E,EAAc1vE,KAAKvI,KAAKhE,IAAI+5B,KAAK5tB,UAAUyzB,MAAMd,EAAEgB,OAAO/F,KAAK5tB,UAAUyzB,MAAMd,EAAE/+B,GAAO87E,GAAW,IAE9F9hD,KAAK5tB,UAAUyzB,MAAMd,EAAEm9C,EAAcA,EAAcr3E,OAAS,IAAMi3E,EAAW,GAAG,CACrF,MAAMF,EAAO5hD,KAAK5tB,UAAUyzB,MAAMd,EAAEgB,OAClC/F,KAAK5tB,UAAUyzB,MAAMd,EAAEm9C,EAAcA,EAAcr3E,OAAS,IAAMi3E,GAE9DtD,EAAQiD,EAAAA,KAAQS,EAAcA,EAAcr3E,OAAS,GAAI+2E,EAAM,GACrEM,EAAc1vE,KAAKgsE,EAAMA,EAAM3zE,OAAS,GAC1C,CACAi2E,EAAY,IAAIiB,KAAkBG,GAClCnB,EAAYD,EACZE,EAAiBhhD,KAAKygD,uBAAuB,CAAEjzD,cAC/C,KACF,CACA,QAEEszD,EAAY9gD,KAAK5tB,UAAUyzB,MAAMd,EAAE48C,MAAM13E,KAAKjE,IAAIm7E,EAAW,IAC7DJ,EAAYD,EACZE,EAAiBhhD,KAAKygD,uBAAuB,CAAEjzD,cAG/CuzD,EAAUl2E,QAAU,IACtBy2E,EAAYr3E,KAAK+xB,IAAI+kD,EAAU,GAAKA,EAAU,MAE5CO,EAAY,KAAMvoC,EAAAA,EAAAA,IAAqB/Y,KAAK5iB,+BAC9CikE,EAAa,GAGf,MAAMc,EAAeA,CAAC7zB,EAAaqQ,IACzB3+B,KAAK3uB,MAAMw0B,QACZC,EAAAA,GAAAA,WACI,GAAPthC,OAAU8pD,EAAG,KAENtuB,KAAK0V,MAAM4Y,EAAKqQ,GAIvByjB,EAAY,IAAIphB,EAAAA,EACpB,CACEl8B,EAAG9E,KAAK95B,MAAQ85B,KAAKwgD,qBAAuBl7D,EAAc+lB,MAAMg3C,KAAKpE,OAAO7/C,KAC5E+iC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ17C,EAAc+lB,MAAMg3C,KAAKlhB,MACvEC,UAAW7E,EAAOroD,KAClBqtD,aAAcyM,EAAAA,GAAAA,QAEhBhuC,KAAK5tB,WAGP,IAAIkwE,EAAYtiD,KAAKuiD,WACrB,MAAMC,EAAoBA,KACxBJ,EAAU5zE,IAAI,CACZ2yD,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ17C,EAAc+lB,MAAMg3C,KAAKlhB,MACvEC,UAAW7E,EAAOroD,KAClBqtD,aAAcyM,EAAAA,GAAAA,SAEhBsU,EAAYtiD,KAAKuiD,UAAU,EAE7B,IAAK,IAAIlsE,EAAI,EAAGA,EAAIyqE,EAAUj2E,OAAQwL,IACpC0uB,EAAI96B,KAAKyrC,MAAM1V,KAAK2/B,GAAGmhB,EAAUzqE,KAC7B0uB,EAAI,GAAKA,EAAI87C,IACb97C,IAAM87C,IAAe97C,GAAK,GAC9Bu9C,EAAU9zE,IAAI,CAAEytD,GAAIl3B,EAAGo3B,GAAIp3B,IAC3Bq9C,EAAU5zE,IAAI,CACZ0F,KAAMiuE,EAAapB,EAAU1qE,GAAIgrE,GACjCt8C,MAEE/E,KAAK3uB,MAAMw0B,QAAUC,EAAAA,GAAAA,YAAyC,IAAjBi7C,EAAU1qE,IACzDisE,EAAU9zE,IAAI,CAAEkjE,YAAanV,EAAOroD,OACpCkuE,EAAU5zE,IAAI,CACZ2yD,KAAM,CAAEn6D,OAAQ,OAAQlB,KAAMs8E,EAAUrmB,MAAMoF,KAAKr7D,MACnDs7D,UAAW7E,EAAOkmB,yBAEpBH,EAAU3hD,OAAOuT,GACjBkuC,EAAUzhD,OAAOuT,GACjBsuC,MAEAF,EAAU3hD,OAAOuT,GACjBkuC,EAAUzhD,OAAOuT,KAGrB2oB,EAAU6lB,OAENlR,GACFxxC,KAAK2iD,iBAAiB,CAAEzuC,UAAS0uC,YAAa34E,KAAKyrC,MAAM1V,KAAK2/B,GAAGnyC,IAAatpB,MAAO88E,GAazF,CAEA6B,mCACE,OAAOC,EAAAA,EAAAA,IACL,KACKC,EAAAA,EAAAA,IAAiB/iD,KAAK4W,yBAAyBtxB,cAAciuC,QAAQgJ,OAAOymB,mBAC/E7sE,EAAG,IAEL,MAEJ,CAEA8sE,kCAAiC7uE,GAM9B,IAAA8uE,EAAAC,EAAA,IAN+B,eAChCC,EAAc,oBACdC,GAIDjvE,EACC,MAAM,cAAEkR,GAAkB0a,KAAK4W,0BACzB,WAAEyqB,GAAe/7C,EAAc+lB,MAAMg3C,KAAKlhB,KAC1CK,EAAUR,EAAAA,EAAAA,2BAAgC,UAAW17C,EAAc+lB,MAAMg3C,KAAKlhB,KAAKK,SAEnF7jB,EAAY1zC,KAAK2tC,KAAKwrC,EAAiBC,IAAwB,EAC/D/rC,GAAU+pB,QAAAA,EAAciiB,EAAAA,GAAAA,IAA6B,QAAhBJ,EAAK1hB,EAAQ9vC,WAAG,IAAAwxD,EAAAA,EAAI1gB,EAAAA,GAAAA,MAA8B,QAAlB2gB,EAAI3hB,EAAQpyB,cAAM,IAAA+zC,EAAAA,EAAI3gB,EAAAA,GAAAA,KAC3F+gB,EAAyBt5E,KAAKyrC,MAAM1V,KAAK2/B,GAAGyjB,IAC5CI,EAA8Bv5E,KAAKyrC,MAAM1V,KAAK2/B,GAAG0jB,IACjDI,EAAYF,EAAyBjsC,EAASqG,EAEpD,OAAO1zC,KAAK+xB,IAAIwnD,EAA8BD,GAA0BjsC,EACpEksC,EACAC,CACN,CAEAd,iBAAgBruE,GAUb,IAVc,QACf4/B,EAAO,YACP0uC,EAAW,MACX1+E,EAAK,WACLu9D,GAMDntD,EACC,MAAM,cAAEgR,GAAkB0a,KAAK4W,yBACzBimB,GAAYokB,EAAAA,EAAAA,IAAa,CAAE/sC,UAASu1B,QAASnkD,EAAc8Y,KAAKl4B,MAAOwjE,QAASpkD,EAAcoM,IAAIC,UAClG,OAAE4qC,GAAWj3C,EAAciuC,SAC3B,KAAEztD,EAAI,WAAEu7D,GAAe/7C,EAAc+lB,MAAMg3C,KAAKlhB,KAChDK,EAAUR,EAAAA,EAAAA,2BAAgC,UAAW17C,EAAc+lB,MAAMg3C,KAAKlhB,KAAKK,SAEzF3E,EAAUqkB,KACV,IAAIlgB,EAAAA,EACF,CACE9sD,KAAMhQ,EACN4gC,EAAG9E,KAAK95B,MAAQ85B,KAAKwgD,qBAAuBhf,EAAQpjC,KAAO9Y,EAAc+lB,MAAMg3C,KAAKpE,OAAO7/C,KAC3F2G,EAAG69C,EACHzhB,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ,CAAEl7D,OAAMgB,MAAO,SAC7Du6D,aACAG,UACAD,aAAcyM,EAAAA,GAAAA,OACd5M,UACEphC,KAAK5iB,6BAA+BC,EAAAA,GAAAA,UAAuC,QAAUk/C,EAAOmnB,YAC9FjiB,WAAYA,GAAclF,EAAOymB,mBAEnChjD,KAAK5tB,WACLuuB,OAAOuT,GACT2oB,EAAU6lB,MACZ,CAEA3E,cACE,MAAM,cAAEz4D,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QACjCvzB,KAAKkU,QAAQ/5B,OAEiB,IAA5B6lB,KAAK7Y,KAAKw8D,gBACT5qC,EAAAA,EAAAA,IAAqB/Y,KAAK5iB,6BAC3B4iB,KAAK7Y,KAAKnH,aAAeM,EAAAA,GAAAA,iBAEzB0f,KAAKy9C,MAAK,GAEZz9C,KAAKkU,QAAQ2oB,UAAUv3C,EAAc8Y,KAAKl4B,MAAOof,EAAcoM,IAAIC,QACnE,MAAMzd,EAAO,IAAI8sD,EAAAA,EACf,CACEj8B,EAAG/E,KAAKrO,OAASrM,EAAc8pB,OAAOizC,KAAKpE,OAAOvsD,IAClDyvC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ,CAAEl7D,KAAMwf,EAAc8pB,OAAOizC,KAAKlhB,KAAKr7D,OACrFs7D,UAAW7E,EAAOroD,KAClBqtD,aAAcyM,EAAAA,GAAAA,IACd1M,UAAW2M,EAAAA,GAAAA,QAEbjuC,KAAK5tB,WAEP,OAAQ4tB,KAAK7Y,KAAK9B,WAChB,KAAK6kC,EAAAA,GAAAA,GACL,KAAKA,EAAAA,GAAAA,GACL,KAAKA,EAAAA,GAAAA,GACL,KAAKA,EAAAA,GAAAA,GACClqB,KAAK7Y,KAAKnH,aAAeM,EAAAA,GAAAA,MAEzB0f,KAAKn4B,OAASwgD,EAAAA,GAAAA,WACdroB,KAAK5iB,6BAA+BC,EAAAA,GAAAA,WACZ,OAAxB2iB,KAAK7Y,KAAK9B,UAEV2a,KAAK4jD,iBAAiB1vE,GAEtB8rB,KAAK6jD,oBAAoB3vE,GAG3B8rB,KAAK8jD,2BAA2B5vE,GAElC,MACF,KAAKg2C,EAAAA,GAAAA,KACCnR,EAAAA,EAAAA,IAAqB/Y,KAAK5iB,4BAC5B4iB,KAAK6jD,oBAAoB3vE,GAEzB8rB,KAAK4jD,iBAAiB1vE,GAExB,MACF,KAAKg2C,EAAAA,GAAAA,IACL,KAAKA,EAAAA,GAAAA,IACL,KAAKA,EAAAA,GAAAA,EACL,KAAKA,EAAAA,GAAAA,GACL,KAAKA,EAAAA,GAAAA,GACHlqB,KAAK4jD,iBAAiB1vE,GACtB,MACF,KAAKg2C,EAAAA,GAAAA,EACHlqB,KAAK+jD,iBAAiB7vE,GACtB,MACF,KAAKg2C,EAAAA,GAAAA,EACHlqB,KAAKgkD,kBAAkB9vE,GACvB,MACF,KAAKg2C,EAAAA,GAAAA,EACHlqB,KAAKikD,mBAAmB/vE,GAK5B8rB,KAAKkU,QAAQvJ,SACf,CAEAu5C,gBAAgBp/C,GAAuB,IAAZq/C,EAAMxqE,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,EAClC,OAAOmrB,GAAK,EAAIq/C,GAAUr/C,GAAK9E,KAAK95B,MAAQi+E,CAC9C,CAEAC,kBAAiBC,GAQd,IARe,OAChBC,EAAM,aACNC,EAAY,gBACZC,EAAkB,GAKnBH,EACC,MAAMI,EAA6B,GAC7BC,EAA2D,GACjEJ,EAAOK,UAAUxyE,SAASjO,IACxBqgF,EAAa/1E,IAAI,CAAE0F,KAAMhQ,EAAMgQ,OAC/B,MAAM2uD,EAAY54D,KAAKuwC,MAAM+pC,EAAa9Z,QAAQzqC,KAAKkU,UACjD0wC,EAAW,IAAK1gF,EAAO2+D,aACzB3+D,EAAM2gF,YACRJ,EAAaxC,QAAQ2C,GAErBH,EAAajyE,KAAKoyE,EACpB,IAGFH,EAAatyE,SAAQ2yE,IAA4B,IAA3B,EAAEhgD,EAAC,KAAE5wB,EAAI,UAAE2uD,GAAWiiB,EAC1C,IAAK9kD,KAAKkkD,gBAAgBp/C,EAAG0/C,GAC3B,OAEF,MAAMO,EAAkBliB,EAAY,EAC9BmiB,EAAelgD,EAAIigD,EAAkBP,EACrCS,EAAgBjlD,KAAK95B,OAAS4+B,EAAIigD,GAAmBP,EAC3D,IAAIU,EAASpgD,EACTkgD,EAAe,EACjBE,EAASj7E,KAAKyrC,MAAM5Q,EAAIkgD,GACfC,EAAgB,IACzBC,EAASj7E,KAAKyrC,MAAM5Q,EAAImgD,IAhuBP5sE,KAAA,IAAC,EACxBysB,EAAC,UACD+9B,EAAS,oBACT6hB,GAKDrsE,EAAA,OACCqsE,EAAoBv5E,MAAK0R,IAAkB,IAAjB,KAAEvT,EAAI,GAAEE,GAAIqT,EACpC,MAAMsoE,EAAOrgD,EAAI+9B,EAAY,EACvBuiB,EAAOtgD,EAAI+9B,EAAY,EAC7B,OAAQv5D,EAAO87E,GAAQA,EAAO57E,GAAQF,EAAO67E,GAAQA,EAAO37E,CAAG,GAC/D,EAqtBM67E,CAAiB,CAAEvgD,EAAGogD,EAAQriB,YAAW6hB,0BAG7CA,EAAoBlyE,KAAK,CACvBlJ,KAAM47E,EAASH,EAAkB5G,EAAAA,GAAAA,EACjC30E,GAAI07E,EAASH,EAAkB5G,EAAAA,GAAAA,IAEjCoG,EAAa/1E,IAAI,CAAE0F,OAAM4wB,EAAGogD,IAC5BX,EAAa5jD,OAAOX,KAAKkU,SAAQ,GAErC,CAEA2vC,oBAAoB3vE,GAClB,MAAMoxE,EAAWC,EAAAA,GAA0BvlD,KAAK7Y,KAAK9B,WAC/CmgE,KAAqBxlD,KAAK7Y,KAAKs+D,mBAAqB,IAC1D,IAAIC,EAAgB,GAAKz7E,KAAK07E,KAAK3lD,KAAK7Y,KAAKy+D,yBAA2B,IACxE,MAAMtB,EAAS,IACXvrC,EAAAA,EAAAA,IAAqB/Y,KAAK5iB,8BAC5BsoE,EAAgB,IAGlB,MAAMG,EAAQ7lD,KAAK8lD,WACbngE,GAAWyhB,EAAAA,EAAAA,IAAsB,CACrCjE,WAAYnD,KAAK3uB,MAAM8xB,WACvBpxB,YAAaiuB,KAAK3uB,MAAMsiB,iBAGpBoyD,EAAc/lD,KAAK7Y,KAAK6+D,iBACxB7G,GAAoBpmC,EAAAA,EAAAA,IAAqB/Y,KAAK5iB,4BAC9ConE,EAAkBrF,EAhvBW,GAgvB0C,EAC7E,IAAK,MAAM9iD,KAAO0pD,EAAa,CAC7B,MAAME,EAAWF,EAAY1pD,GACvBnZ,GAAOgjE,EAAAA,EAAAA,IAAmB7pD,GAEhC,IAAK,IAAIhmB,EAAImvE,EAAiBnvE,GAAKqvE,EAAervE,IAAK,CACrD,IAAIyuB,GACI,GAAJzuB,EAAS2pB,KAAK7Y,KAAKs+D,oBAAsBH,EAAY3/D,EACvDsgE,GAAYjmD,KAAK7Y,KAAKg/D,kBAAoBb,GAAY3/D,EACtDqa,KAAKzL,WACP,IAAKyL,KAAKkkD,gBAAgBp/C,EAAG0/C,GAC3B,SAEF,IAAI4B,EAAWn8E,KAAKyrC,MAAM5Q,GAE1B,GAAIzuB,IAAMmvE,EAAiB,CACzB,GAAIrG,EAAmB,CACrBiH,EAAWn8E,KAAKyrC,MAAM5Q,EAAI,EAAK,GAAKwgD,EAAY3/D,GAEhDkgE,EACGr3E,IAAI,CACHwtD,GAAIoqB,EACJlqB,GAAIkqB,IAELzlD,OAAOX,KAAKkU,SACf,QACF,CACyC,IAArClU,KAAK7Y,KAAKk/D,yBAEZvhD,GAAM,GAAKwgD,EAAY3/D,GAEzBygE,EAAWn8E,KAAKyrC,MAAM5Q,GACtB+gD,EAAMr3E,IAAI,CAAEwtD,GAAIoqB,EAAUlqB,GAAIkqB,IAAYzlD,OAAOX,KAAKkU,SACtDowC,EAAO9xE,KAAK,CACVqyE,aAAa,EACb3wE,KAAMkoE,EAAAA,GAAOl5D,EAAKwL,YAAc,IAAMxL,EAAK84D,UAAUl8B,WAAWo8B,QAAQ,MACxEp3C,EAAGshD,GAEP,MACEP,EAAMr3E,IAAI,CAAEwtD,GAAIoqB,EAAUlqB,GAAIkqB,IAAYzlD,OAAOX,KAAKkU,SACtDowC,EAAO9xE,KAAK,CACV0B,MAAQmC,EAAI,IAAM,GAAM,GAAKA,EAAI,GAAK,KAAO,MAC7CyuB,EAAGshD,GAGT,CACF,CACApmD,KAAKokD,kBAAkB,CAAEE,SAAQC,aAAcrwE,EAAMswE,mBACvD,CAEAV,2BAA2BS,GACzB,IAAI+B,EAAU,GACVC,EAAY77C,IAEhB,MAAM45C,EAAS,GACTuB,EAAQ7lD,KAAK8lD,WACnB,IAAK,IAAIzvE,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAKjE,KAAKrY,OAAQwL,IAAK,CAC9C,MAAM6M,EAAOyL,EAAAA,GAAAA,sBAA4BqR,KAAK7Y,KAAKjE,KAAK7M,IAClDgmB,EAAMnZ,EAAK84D,UAAY,IAAM94D,EAAKwL,WAClC83D,EAAQtjE,EAAK+4D,WACbn3C,EAAI76B,KAAKyrC,MAAM1V,KAAK6W,GAAGxgC,GAAK2pB,KAAKzL,YAEvC,GAAI8H,IAAQiqD,EAAS,CAGnB,GAFAA,EAAUjqD,EACVkqD,EAAYC,GACPxmD,KAAKkkD,gBAAgBp/C,GACxB,SAEF+gD,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SACxCowC,EAAO9xE,KAAK,CACVsyB,IACA5wB,KAAMkoE,EAAAA,GAAOl5D,EAAKwL,YAAc,IAAMxL,EAAK84D,UAAUl8B,WAAWo8B,QAAQ,OAE5E,MAAO,GAAIsK,EAAQ,GAAM,GAAKA,IAAUD,EAAW,CAEjD,GADAA,EAAYC,GACPxmD,KAAKkkD,gBAAgBp/C,GACxB,SAEF+gD,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SACxCowC,EAAO9xE,KAAK,CAAEsyB,IAAG5wB,MAAQsyE,EAAQ,IAAM,GAAM,GAAKA,EAAQ,GAAK,KAAO,OACxE,CACF,CACAxmD,KAAKokD,kBAAkB,CAAEE,SAAQC,gBACnC,CAEAX,iBAAiBW,GACf,IAAI+B,EAAU,GACVxhD,EAAI,EAER,MAAMw/C,EAAS,GACTuB,EAAQ7lD,KAAK8lD,WACnB,IAAK,IAAIzvE,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAKjE,KAAKrY,OAAQwL,IAAK,CAC9C,MAAM6M,EAAOyL,EAAAA,GAAAA,sBAA4BqR,KAAK7Y,KAAKjE,KAAK7M,IAClDgmB,EAAMnZ,EAAK84D,UAAY,IAAM94D,EAAKwL,WACxC,GAAI2N,IAAQiqD,EAAS,CAEnB,GADAA,EAAUjqD,EACN2D,KAAK7Y,KAAKnH,aAAeM,EAAAA,GAAAA,MAAkB,CAC7C,MACMmmE,GADcvjE,EAAKi5D,aAAiC,GAAlBj5D,EAAK+4D,WACVj8C,KAAK7Y,KAAKs+D,oBAAsBzlD,KAAK7Y,KAAKm+D,SAC7ExgD,EAAI76B,KAAKyrC,MAAM1V,KAAK5tB,UAAUyzB,MAAMf,EAAE9E,KAAK7Y,KAAKogB,SAASlxB,GAAKowE,GAAezmD,KAAKzL,WACpF,MACEuQ,EAAI76B,KAAKyrC,MAAM1V,KAAK6W,GAAGxgC,GAAK2pB,KAAKzL,YAEnC,IAAKyL,KAAKkkD,gBAAgBp/C,GACxB,SAEF+gD,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SACxCowC,EAAO9xE,KAAK,CACV0B,KAAMkoE,EAAAA,GAAOl5D,EAAKwL,YAAc,IAAMxL,EAAK84D,UAAUl8B,WAAWo8B,QAAQ,MACxEp3C,KAEJ,CACF,CAGA,GAAI9E,KAAK5iB,6BAA+BC,EAAAA,GAAAA,UAAsC,CAC5E,MAAM4hE,EAAW,GAAHz6E,OAAM43E,EAAAA,MAAWp8C,KAAK7Y,KAAK83D,SAAW,KAAO,IAAO,GAAE,KAAAz6E,QAAKw7B,KAAK7Y,KAAK83D,SAAW,KAC3Fn/B,WACAo8B,QAAQ,OAEX,GAAIoI,EAAOz5E,OAAS,GAAKy5E,EAAOA,EAAOz5E,OAAS,GAAGqJ,OAAS+qE,EAAU,CAOpEn6C,GANkB9E,KAAK7Y,KAAKu/D,gBACXt/C,EAAAA,EAAAA,IAAsB,CACrCjE,WAAYnD,KAAK3uB,MAAM8xB,WACvBpxB,YAAaiuB,KAAK3uB,MAAMsiB,iBAI1B2wD,EAAO9xE,KAAK,CACV0B,KAAM+qE,EACNn6C,MAEF+gD,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,QAC1C,CACF,CAEAlU,KAAKokD,kBAAkB,CAAEE,SAAQC,gBACnC,CAEAR,iBAAiBQ,GACf,IAAIoC,EAAY,GAEhB,MAAMrC,EAAS,GACTuB,EAAQ7lD,KAAK8lD,WACnB,IAAK,IAAIzvE,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAKjE,KAAKrY,OAAQwL,IAAK,CAC9C,MAAM6M,EAAO,IAAI1K,KAAyB,IAApBwnB,KAAK7Y,KAAKjE,KAAK7M,IAC/B+lB,EAAQlZ,EAAKwL,WAAa,IAAMxL,EAAK64D,cAC3C,GAAI3/C,IAAUuqD,EAAW,CACvBA,EAAYvqD,EACZ,MAAM0I,EAAI76B,KAAKyrC,MAAM1V,KAAK6W,GAAGxgC,GAAK2pB,KAAKzL,YACvC,IAAKyL,KAAKkkD,gBAAgBp/C,GACxB,SAEF+gD,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SACxCowC,EAAO9xE,KAAK,CACVqyE,YAAiC,IAApB3hE,EAAKwL,WAClBxa,KAA0B,IAApBgP,EAAKwL,WAAmBxL,EAAK64D,cAAcj8B,WAAas8B,EAAAA,GAAOl5D,EAAKwL,YAC1EoW,KAEJ,CACF,CACA9E,KAAKokD,kBAAkB,CAAEE,SAAQC,gBACnC,CAEAP,kBAAkBO,GAChB,IAAIoC,EAAY,GAEhB,MAAMrC,EAAS,GACTuB,EAAQ7lD,KAAK8lD,YACb,OAAEvpB,GAAWv8B,KAAK4W,yBAAyBtxB,cAAciuC,QAC/D,IAAK,IAAIl9C,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAKjE,KAAKrY,OAAQwL,IAAK,CAC9C,MAAM6M,EAAO,IAAI1K,KAAyB,IAApBwnB,KAAK7Y,KAAKjE,KAAK7M,IAC/B+lB,EAAQlZ,EAAKwL,WAAa,IAAMxL,EAAK64D,cAC3C,GAAI3/C,IAAUuqD,EAAW,CACvBA,EAAYvqD,EACZ,MAAM0I,EAAI76B,KAAKyrC,MAAM1V,KAAK6W,GAAGxgC,GAAK2pB,KAAKzL,YACvC,IAAKyL,KAAKkkD,gBAAgBp/C,GACxB,SAEE5hB,EAAKwL,WAAa,GAAM,EAC1Bm3D,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SAExC,IAAIu9B,EAAAA,EACF,CACEzV,GAAIl3B,EACJo3B,GAAIp3B,EACJm3B,GAAI,EACJE,GAAIn8B,KAAKrO,OACT+/C,YAAanV,EAAOqqB,cACpBjV,WAAY,GAEd3xC,KAAK5tB,WACLuuB,OAAOX,KAAKkU,SAEhB,MAAM2yC,EAAkC,IAApB3jE,EAAKwL,WACzB41D,EAAO9xE,KAAK,CACV0B,KAAM2yE,EAAc3jE,EAAK64D,cAAcj8B,WAAWgnC,UAAU,GAAK1K,EAAAA,GAAOl5D,EAAKwL,YAAY,GACzFm2D,YAAagC,EACb/hD,KAEJ,CACF,CACA9E,KAAKokD,kBAAkB,CAAEE,SAAQC,gBACnC,CAEAN,mBAAmBM,GACjB,IAAIwC,EAAW,KAEf,MAAMzC,EAAS,GACTuB,EAAQ7lD,KAAK8lD,WACnB,IAAK,IAAIzvE,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAKjE,KAAKrY,OAAQwL,IAAK,CAC9C,MAAM6M,EAAO,IAAI1K,KAAyB,IAApBwnB,KAAK7Y,KAAKjE,KAAK7M,IAC/BmlB,EAAOtY,EAAK64D,cACZiL,EAAgC,IAApB9jE,EAAKwL,WACvB,GAAI8M,IAASurD,IAA+B,IAAlBzC,EAAOz5E,QAAgBm8E,GAAY,CAC3DD,EAAWvrD,EACX,MAAMsJ,EAAI76B,KAAKyrC,MAAM1V,KAAK6W,GAAGxgC,GAAK2pB,KAAKzL,YACvC,IAAKyL,KAAKkkD,gBAAgBp/C,GACxB,SAEF+gD,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SACxCowC,EAAO9xE,KAAK,CACV0B,KAAMgP,EAAK64D,cAAcj8B,WACzBhb,KAEJ,CACF,CACA9E,KAAKokD,kBAAkB,CAAEE,SAAQC,gBACnC,CAEAvH,yBACEh9C,KAAKo9C,2BACLp9C,KAAK88C,aACL98C,KAAKjyB,QAAQ,SACf,CAEAqvE,2BACEp9C,KAAKinD,oBAAsBjnD,KAAK3uB,MAAMsiB,eAAeuzD,sBAAsBt1E,EAAAA,EAAAA,IAC7E,CAEAu1E,eAAetyE,EAAe+c,EAAmBw1D,GAG3CvyE,EAFa,IAGfA,EAHe,GAKjB,MAAM8sE,EAAQ3hD,KAAKu+C,SAASoD,MAAM9sE,GAAOiF,QAAQ8nE,GAAkB,IAATA,IAC1D,OAAI/sE,GALa,EAMR,CAAC8sE,EAAMA,EAAM92E,OAAS,IAK3B82E,EAAM92E,OAASu8E,EAAkC,GAApBzF,EAAM92E,OAAS,GAAS+mB,EAChDoO,KAAKmnD,eAAetyE,EAAQ,EAAG+c,EAAWw1D,GAE5CzF,CACT,CAEA0F,iBAAiBnzC,GACf,MAAM,cAAE5uB,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QACjC,IAAIxa,EAAAA,EAAAA,IAAqB/Y,KAAK5iB,4BAA6B,CACzD82B,EAAQ/5B,OACR,MAAMmtE,EAAiBr9E,KAAKhE,IAAI,EAAGgE,KAAKjE,IAAI,EAAGg6B,KAAK7Y,KAAKmgE,iBAEnDxiD,EAAI,GACJ66B,EAAM56B,GAAczf,EAAcoM,IAAIC,OAASqO,KAAKrO,OAASqO,KAAKrO,QAAU,GAAMoT,GAClFpT,EAASqO,KAAKrO,QAAU,GAAM21D,GAE9BpjF,EAAQ,IAAI88D,EAAAA,EAChB,CACEl8B,EAAG,GACHq8B,KAAM,CAAEr7D,KAAM,GACds7D,UAAW7E,EAAOroD,KAClBqtD,aAAcyM,EAAAA,GAAAA,OACd1M,UAAW2M,EAAAA,GAAAA,OAEbjuC,KAAK5tB,WAEP,IAAK,IAAIiE,EAAI,GAAKA,GAAK,EAAGA,GAAK,GAAK,CAClC,MAAM0uB,EAAI96B,KAAKyrC,MAAMiqB,EAAGtpD,IACxBnS,EACGsK,IAAI,CACH0F,KAAMmC,EAAE26D,QAAQ,GAChBjsC,EAAGA,IAEJpE,OAAOuT,GAEVA,EAAQ1lC,IAAI,cAAe,sBAC3B0lC,EAAQ4oB,YACR5oB,EAAQ09B,YAAY,CAAC,EAAG,IACxB19B,EAAQ2oB,UAAU,EAAG,IACrB3oB,EAAQ+oB,OAAOn4B,EAAGC,GAClBmP,EAAQgpB,OAAOp4B,EAAI,EAAGC,GACtBmP,EAAQ2oB,UAAU,GAAI,IACtB3oB,EAAQipB,QACV,CA0BA,OAxBAjpB,EAAQ1lC,IAAI,YAAa,2BACzB0lC,EAAQ1lC,IAAI,YAAa,GACzB0lC,EAAQ1lC,IAAI,cAAe+tD,EAAOgrB,MAClCrzC,EAAQ09B,YAAY,IAEpB19B,EAAQ0+B,SAAS9tC,EAAG76B,KAAKyrC,MAAMpwB,EAAcoM,IAAIC,OAASqO,KAAKrO,OAASA,GAAS,EAAG1nB,KAAKyrC,MAAM/jB,IAC/FuiB,EAAQ2oB,UAAU,GAAK,IACvB3oB,EAAQukC,WAAW3zC,EAAGxf,EAAcoM,IAAIC,OAAQ,EAAGqO,KAAKrO,QACxDuiB,EAAQ2oB,WAAW,IAAM,IAEzB,IAAImE,EAAAA,EACF,CACE9sD,KAAM,mBACN4wB,EAAG,GACHC,EAAGzf,EAAcoM,IAAIC,OAASqO,KAAKrO,OAAS,EAC5CwvC,KAAM,CAAEr7D,KAAMo4E,EAAAA,GAAAA,KACd7c,WAAYiiB,EAAAA,GAAAA,GACZliB,UAAW7E,EAAOroD,KAClBqtD,aAAcyM,EAAAA,GAAAA,IACd1M,UAAW2M,EAAAA,GAAAA,OAEbjuC,KAAK5tB,WACLuuB,OAAOuT,QACTA,EAAQvJ,SAEV,CACA,MAAM68C,EAAWxnD,KAAKu+C,SAASC,QAAQ,GACjCiJ,EAAqBniE,EAAc8Y,KAAKspD,WAAWvmB,KAAKr7D,KACxDq7E,EAAYl3E,KAAKuwC,MAAMgtC,EAAWC,GAClC9F,EAAQ3hD,KAAKmnD,eAAehG,EAAWqG,EAAUC,GACjDE,EAAS3nD,KAAKu+C,SAASqJ,WAAW,EAAG,KACrC1zE,EAAO,IAAI8sD,EAAAA,EACf,CACEl8B,EAAGxf,EAAc8Y,KAAKspD,WAAWzJ,OAAO7/C,KACxC+iC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ,CAAEl7D,KAAMwf,EAAc8Y,KAAKspD,WAAWvmB,KAAKr7D,OACzFs7D,UAAW7E,EAAOroD,KAClBqtD,aAAcyM,EAAAA,GAAAA,OACd1M,UAAW2M,EAAAA,GAAAA,OAEbjuC,KAAK5tB,WAEPuvE,EAAMxvE,SAASyvE,GACb1tE,EACG1F,IAAI,CACH0F,KAAMyzE,EAAO/F,GAAMt7D,QAAQ,IAAK,KAChCye,EAAGzf,EAAcoM,IAAIC,OAASqO,KAAKrO,OAASqO,KAAKu+C,SAASqD,KAE3DjhD,OAAOuT,IAEd,CAEAwpC,eACE,IAAK19C,KAAKinD,mBAAoB,OAE9B,MAAM,cAAE3hE,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,SAE1Bs0B,EAAYC,GAAY9nD,KAAKu+C,SAAS33C,SAC7C,GAAI5G,KAAK+nD,qBAAuB/nD,KAAK7Y,KAAK9B,WAAawiE,IAAeC,EACpE,OAEF,MAAMjrB,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASzpC,KAAKzL,WAAajP,EAAc8Y,KAAKl4B,MAC9CwjE,QAASpkD,EAAcoM,IAAIC,OAASqO,KAAKrO,OAAS,KAEpDkrC,EAAUqkB,KACV,MAAM8G,EAAehoD,KAAKioD,kBACpBC,EAAwBloD,KAAKmoD,4BACnCC,EAAAA,EAAAA,IAAkB,CAChBjkE,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK5tB,UAAUyzB,MACtBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZmiF,gBAAiBA,CAAChyE,EAAGyuB,KAEnB,GAAI9E,KAAK7Y,KAAK2qD,OAAOz7D,IAAM,EACzB,OAGF2pB,KAAKkU,QAAQktB,UAAYphC,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAKG,KAAKjR,GAAKkmD,EAAO+rB,gBAAkB/rB,EAAOgsB,cAClG,MAAMxjD,EAAI96B,KAAKyrC,MAAM1V,KAAKu+C,SAASv+C,KAAK7Y,KAAK2qD,OAAOz7D,KACpD2pB,KAAKkU,QAAQ0+B,SAAS9tC,EAAIkjD,EAAc,GAAIE,GAAwBnjD,EAAE,IAG1E83B,EAAU6lB,MACZ,CAEA/E,iBACE,MAAM,cAAEr4D,GAAkB0a,KAAK4W,yBACzBimB,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASzpC,KAAKzL,WAAajP,EAAc8Y,KAAKl4B,MAC9CwjE,QAASpkD,EAAcoM,IAAIC,SAE7BkrC,EAAUqkB,KACV,IAAK,MAAM/lC,KAAWnb,KAAKkb,SACzBC,EAAQwgB,cAAc37B,KAAKkU,SAE7B2oB,EAAU6lB,MACZ,CAEA94C,YAAYsK,GACV,MAAMs0C,GAAa5+C,EAAAA,EAAAA,IAAY,CAC7BsK,UACAgpC,WAAU,IACV9qE,UAAW4tB,KAAK5tB,UAChBq2E,aAAczoD,KAAK95B,MACnB26E,cAAe7gD,KAAKrO,OACpBxN,MAAO6b,KAAK7Y,KACZuhE,sBAAwBC,GAAU3oD,KAAK4oD,mBAAmBD,GAC1DE,kBAAoB7oD,KAAKu9C,4BAAgD3nE,EAAvBoqB,KAAKyK,kBAErDzK,KAAKu9C,wBACPv9C,KAAKyK,gBAAgByJ,EAASgpC,EAAAA,EAAAA,qBAAgCl9C,KAAK5tB,iBAGlDwD,IAAf4yE,IACFt6C,EAAAA,EAAAA,GAAiB,CACf35B,UAAWyrB,KAAK3uB,MAAMsiB,eAAewa,mBACrCC,OAAQo6C,EAAa,YAAc,UACnCM,kBAAmB,YAGzB,CAEAC,oBAAoBC,EAAoB7hF,GAAoD,IAAlC8hF,IAAyBtvE,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,KAAAA,UAAA,GACjF,MAAMvD,EAAI4pB,KAAK7Y,KAAK+hE,kBAAkB/hF,EAAK6hF,GAC3C,GAAU,OAAN5yE,EACF,OAAO6yE,EAA4BjpD,KAAKy/C,UAAUrpE,GAAK,GAAH5R,OAAM4R,EAE9D,CAEA+yE,oBAAoBH,GAAoB,IAAAI,EAAAC,EACtC,MAAMC,EAAiBtpD,KAAK7Y,KAAKoiE,uBAAuBP,GAClDQ,EAA4C,QAAlCJ,EAAGppD,KAAK7Y,KAAK+vB,MAAMoyC,UAAe,IAAAF,EAAAA,EAAI,KAChDK,EAAmD,QAAtCJ,EAAGrpD,KAAK7Y,KAAK+vB,MAAMoyC,EAAiB,UAAE,IAAAD,EAAAA,EAAI,KAC7D,OAAmB,OAAfG,GAAyC,OAAlBC,GAClBC,EAAAA,EAAAA,IAA+B,CAAEviE,KAAM6Y,KAAK7Y,KAAMwiE,YAAaH,EAAYn1B,UAAWo1B,IAGxF,IACT,CAEAh/C,gBAAgByJ,EAAmC80C,GACjD,MAAM,cAAE1jE,GAAkB0a,KAAK4W,yBAI/B,GAHA1C,EAAQ/5B,OACR+5B,EAAQ2oB,UAAUv3C,EAAc8Y,KAAKl4B,MAAO,GAExC85B,KAAKu9C,yBACPv9C,KAAK+8C,qBAAqB7oC,GACtBhqC,OAAO6xB,MAAMitD,IAGf,OAFAhpD,KAAK8+C,QAAQ,CAAE5qC,iBACfA,EAAQvJ,UAKZ,MAAMi/C,EAAiB5pD,KAAK7Y,KAAK+hE,kBAAkB,OAAQF,GACrD9lE,EAAO0mE,EAAiBj7D,EAAAA,GAAAA,sBAA4Bi7D,GAAkB,KAE5E,GAAa,OAAT1mE,EAAe,CACjB,MAAM2mE,EACJ7pD,KAAK7Y,KAAKjE,KAAKrY,OAAS,GACpBi/E,EAAAA,EAAAA,IAA+B,CAC7BC,UAAW/pD,KAAK7Y,KAAKjE,KAAK,GAC1B8mE,QAAShqD,KAAK7Y,KAAKjE,KAAK8c,KAAK7Y,KAAKjE,KAAKrY,OAAS,GAChDsZ,MAAO6b,KAAK7Y,OAEd,GAWN,OAVA6Y,KAAK8+C,QAAQ,CACX5qC,UACA4nC,WAAY+N,EAAmBb,GAC3BnN,EAAc,CACZ34D,KAAMyL,EAAAA,GAAAA,sBAA4Bk7D,EAAmBb,IACrD3jE,UAAW2a,KAAK7Y,KAAK9B,YAEvB,YAEN6uB,EAAQvJ,SAEV,CAEA3K,KAAK8+C,QAAQ,CACX5qC,UACAhxB,OACAiE,KAAM,CACJG,KAAM0Y,KAAK+oD,oBAAoBC,EAAY,QAC3C3J,KAAMr/C,KAAK+oD,oBAAoBC,EAAY,QAC3C1J,IAAKt/C,KAAK+oD,oBAAoBC,EAAY,OAC1C9xC,MAAOlX,KAAK+oD,oBAAoBC,EAAY,SAC5ClX,OAAQ9xC,KAAK+oD,oBAAoBC,EAAY,UAAU,IAEzDhK,iBAAkBh/C,KAAKmpD,oBAAoBH,KAG7C90C,EAAQvJ,SACV,CAEAi0C,aAAYqL,GAAqD,IAApD,QAAE/1C,GAAgD+1C,EAC7D,MACM,cAAE3kE,GAAkB0a,KAAK4W,0BACzB,OAAEvkC,EAAM,OAAE63E,EAAM,KAAEpxB,GAASxzC,EAAcoM,KACzC,aAAErE,EAAY,kBAAEI,IAAsBH,EAAAA,EAAAA,IAAgB,CAAEnG,KAAM6Y,KAAK7Y,OAEzE,IAAKkG,EACH,OAGF,MAAM88D,EAAcnqD,KAAK5iB,6BAA+BC,EAAAA,GAAAA,UAClD+sE,EAAoBpqD,KAAK7Y,KAAKnH,aAAeM,EAAAA,GAAAA,MAC7C+pE,EAAa,IAAIrpB,EAAAA,EACrB,CACE9sD,KAAMi2E,GAAeC,EAAoB/8D,EAAai9D,cAAgBj9D,EAAaM,OACnFmX,GAAIiU,EAAAA,EAAAA,IAAqB/Y,KAAK5iB,4BAE1B4iB,KAAK95B,MADL85B,KAAK95B,MAAQof,EAAcoM,IAAIw4D,OAAOjM,OAAO5yC,MAEjDtG,EAAGzf,EAAcoM,IAAIw4D,OAAOjM,OAAOvsD,IACnCyvC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ17C,EAAcoM,IAAIw4D,OAAO/oB,MACvEG,UAAW2M,EAAAA,GAAAA,MACX1M,aAAcj8C,EAAcoM,IAAI0sD,SAChChd,WAAWmpB,EAAAA,EAAAA,IAAe,CAAEL,OAAQ78D,EAAaK,OAAQpI,mBAE3D0a,KAAK5tB,WAKP,GAHA4tB,KAAKwqD,YAAcH,EAAW5f,QAAQv2B,GACtCm2C,EAAW1pD,OAAOuT,KAEdi2C,GAAiBnqD,KAAK08C,eAAgB0N,IAGtC38D,EAAmB,CACrB,MAAMg9D,EAAkB,IAAIzpB,EAAAA,EAC1B,CACE9sD,KAAMuZ,aAAiB,EAAjBA,EAAmBE,OACzBwzC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ17C,EAAcoM,IAAIw4D,OAAO/oB,MACvEG,UAAW2M,EAAAA,GAAAA,MACX1M,aAAcj8C,EAAcoM,IAAI0sD,SAChChd,WAAWmpB,EAAAA,EAAAA,IAAe,CAAEL,OAAQz8D,EAAkBC,OAAQpI,mBAEhE0a,KAAK5tB,WAEDs4E,EAAuBD,EAAgBhgB,QAAQv2B,GAC/Cy2C,EAAuB3qD,KAAKwqD,YA3Cd,GA2C4CE,EAG9DplE,EAAc8Y,KAAKl4B,MAAQ85B,KAAK2+C,YAActsE,EAAO4rE,OAAO7/C,KAAQ+/C,EAAAA,GAAAA,EACpE74D,EAAc8Y,KAAKl4B,MAAQ85B,KAAK95B,MAAQykF,EAAuBT,EAAOjM,OAAO5yC,OAE7Eo/C,EACGj8E,IAAI,CACHs2B,EAAG9E,KAAK95B,MAAQof,EAAcoM,IAAIw4D,OAAOjM,OAAO5yC,MAASrL,KAAKwqD,YAnDhD,GAoDdzlD,EAAGzf,EAAcoM,IAAIw4D,OAAOjM,OAAOvsD,MAEpCiP,OAAOuT,GACVlU,KAAK4qD,YAAc,KACnB5qD,KAAKwqD,YAAcG,GAEnB3qD,KAAK6+C,SAAS,IACdv5D,EAAc8Y,KAAKl4B,MACjB85B,KAAK2+C,YACLtsE,EAAO4rE,OAAO7/C,KACd4B,KAAK6+C,SAAS,GAAG34E,MACjB4yD,EAAKmlB,OAAO7/C,KACZ06B,EAAKmlB,OAAO5yC,MACZ/lB,EAAc8Y,KAAKl4B,MAAQ85B,KAAK95B,MAAQwkF,EAAuBR,EAAOjM,OAAO5yC,QAE/Eo/C,EACGj8E,IAAI,CACHs2B,EAAG9E,KAAK95B,MAAQof,EAAcoM,IAAIw4D,OAAOjM,OAAO5yC,MAChDtG,EAAGzf,EAAcoM,IAAIw4D,OAAOjM,OAAOvsD,IAAOpM,EAAcoM,IAAIw4D,OAAO/oB,KAAKr7D,KAAQq4E,EAAAA,GAAAA,IAEjFx9C,OAAOuT,GACVlU,KAAKwqD,YAAcvgF,KAAKhE,IAAI+5B,KAAKwqD,YAAaE,GAC9C1qD,KAAK4qD,YAAc,CACjB9lD,EAAG9E,KAAK95B,MAAQof,EAAcoM,IAAIw4D,OAAOjM,OAAO5yC,MAChDtG,EAAGzf,EAAcoM,IAAIw4D,OAAOjM,OAAOvsD,IAAOpM,EAAcoM,IAAIw4D,OAAO/oB,KAAKr7D,KAAQq4E,EAAAA,GAAAA,EAChFj4E,MAAOwkF,GAGb,CACF,CAEAxL,WAAW1mB,GACJx4B,KAAKu9C,uBAGRv9C,KAAK6qD,qBAAqBryB,GAF1Bx4B,KAAK8qD,oBAAoBtyB,EAI7B,CAEAqyB,qBAAoBE,GAA6F,IAA5F,QAAE72C,EAAO,KAAEhxB,EAAI,KAAEoE,EAAI,KAAE+3D,EAAI,IAAEC,EAAG,MAAEpoC,EAAK,OAAE46B,EAAM,iBAAEkN,GAAyC+L,EAC7G,MAAMC,EAAmB3P,EAAoBr7C,KAAK95B,QAC5C,cAAEof,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAE3B03B,EAAW,IAAIjqB,EAAAA,EACnB,CACEG,KAAM,CAAEr7D,KAAMo4E,EAAAA,GAAAA,GACd7c,WAAY,GACZD,UAAW7E,EAAOroD,KAClBotD,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,OACdvM,YAAYqV,EAAAA,EAAAA,IAAwBva,EAAO2uB,WAAY,KAEzDlrD,KAAK5tB,WAGD+4E,EAAejoE,EAAO,CAAC,CAAEhP,KAAMgP,EAAMxe,MAAO23E,IAAa,GACzD+O,GAAc9jE,QAAAA,EAAQ,IAAM4vB,QAAAA,EAAS,GAAKolC,IAAAA,IAAAA,KAA0BA,IAAAA,MAAAA,KACpE+O,EAAY/jE,EACd,CACE,CAAEpT,KAAM,IAAKxP,MAAO23E,GACpB,CAAEnoE,KAAMoT,EAAM5iB,MAAO0mF,IAEvB,GACEE,EAAYjM,EACd,CACE,CAAEnrE,KAAM,IAAKxP,MAAO23E,GACpB,CAAEnoE,KAAMmrE,EAAM36E,MAAO0mF,IAEvB,GACEG,EAAYjM,EACd,CACE,CAAEprE,KAAM,IAAKxP,MAAO23E,GACpB,CAAEnoE,KAAMorE,EAAK56E,MAAO0mF,IAEtB,GACEI,EAAYt0C,EACd,CACE,CAAEhjC,KAAM,IAAKxP,MAAO23E,GACpB,CAAEnoE,KAAMgjC,EAAOxyC,MAAO0mF,IAExB,GACEK,EAAc3Z,EAChB,CACE,CAAE59D,KAAM,MAAOxP,MAAO23E,GACtB,CAAEnoE,KAAM49D,EAAQptE,MAAO0mF,IAEzB,GACEM,EAAqC,MAApB1M,EAA2B,CAAC,CAAE9qE,KAAM8qE,EAAiBrxD,OAAQjpB,MAAO0mF,IAAgB,GAErGppB,EAA4B,GAE5B2pB,EAA8BC,GAClCA,EAAaj+B,SAAQ,CAACt5C,EAAU6D,IAC9BA,EAAQ,EAAK,IAAK7D,EAASxJ,OAAS,EAAI,CAAC,SAAW,MAAQwJ,GAAiCA,IAE7F22E,EAAiBtP,IACnB1Z,EAAMxvD,KACJm5E,EAA2B,CACzBR,EACAE,EACAC,EACAC,EACAC,EACAC,EACAC,KAGKV,EAAiBvP,KAC1BzZ,EAAMxvD,KAAKm5E,EAA2B,CAACR,EAAcO,KACrD1pB,EAAMxvD,KAAKm5E,EAA2B,CAACN,EAAWC,EAAWC,EAAWC,EAAWC,OAEnFzpB,EAAMxvD,KAAKm5E,EAA2B,CAACR,EAAcM,EAAaC,KAClE1pB,EAAMxvD,KAAKm5E,EAA2B,CAACN,EAAWC,EAAWC,EAAWC,MAG1E,MAAMK,EAAS1N,EAAAA,GAAAA,EAAW74D,EAAc8Y,KAAKl4B,MAC7C,IAAI4+B,EAAI+mD,EACJ9mD,EAAIo5C,EAAAA,GAAAA,EAAW8M,EAASlvB,MAAMsF,WAAa,EAE/CW,EAAM7vD,SAAS0mD,IACb/zB,EAAI+mD,EACJhzB,EAAK1mD,SAAQ,CAAC25E,EAAa5zE,EAAO0zE,KAChC,MAAMpqB,EAAU,CAAEpjC,KAAM,EAAGiN,MAAO,EAAG3Z,IAAK,EAAG0d,OAAQ,IAC/C,KAAEl7B,EAAO,GAAE,MAAExP,GAAsC,UAAhBonF,EAA0B,CAAC,EAAIA,EAC1D,IAAV5zE,EACFspD,EAAQpjC,KAAO,EACNlmB,IAAU0zE,EAAa/gF,OAAS,EACzC22D,EAAQn2B,MAAQ,EACS,UAAhBygD,IACTtqB,EAAQpjC,KAAO,EACfojC,EAAQn2B,MAAQ,EACX2/C,EAAiBvP,MACpBja,EAAQpjC,KAAO,EACfojC,EAAQn2B,MAAQ,IAGpB4/C,EAASz8E,IAAI,CAAE0F,OAAMktD,UAAW18D,EAAOogC,IAAGC,IAAGy8B,YAC7CypB,EAAStqD,OAAOuT,GAChBpP,GAAKmmD,EAAS/kF,KAAK,IAErB6+B,GAAKkmD,EAASlvB,MAAMsF,UAAU,GAElC,CAEA6e,+BAA+BhsC,GAC7B,MAAM,cAAE5uB,GAAkB0a,KAAK4W,yBACzBo0C,EAAmB3P,EAAoBr7C,KAAK95B,OAC5C6lF,EAAa,IAAI/qB,EAAAA,EACrB,CACEG,KAAM,CAAEr7D,KAAMo4E,EAAAA,GAAAA,GACd7c,WAAY,GACZC,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,OACdvM,YAAYqV,EAAAA,EAAAA,IAAwBxxD,EAAciuC,QAAQgJ,OAAO2uB,WAAY,IAE7EpmD,EAAGq5C,EAAAA,GAAAA,EAAW74D,EAAc8Y,KAAKl4B,MACjCs7D,QAAS,CAAEpjC,KAAMokC,EAAAA,GAAAA,EAAWn3B,MAAOm3B,EAAAA,GAAAA,EAAW9wC,IAAK,EAAG0d,OAAQ,IAEhEpP,KAAK5tB,WAGP,IAAI45E,EAAuB,EACvBhB,EAAiBtP,IACnBsQ,EAAuB,EACdhB,EAAiBvP,MAC1BuQ,EAAuB,GAIzB,MAAM,WAAE3qB,GAAe0qB,EAAWhwB,MAClC,IAAIh3B,EAAIs8B,EAAa2qB,EAAuB3qB,EAAa,EAAI8c,EAAAA,GAAAA,EAE7D,IAAK,MAAMhjC,KAAWnb,KAAKkb,SACpBC,EAAQklC,4BAGb0L,EAAWv9E,IAAI,CACb0F,KAAMinC,EAAQ2E,WACd/a,IACAq8B,UAAWjmB,EAAQolC,kBAClB5/C,OAAOuT,GACVnP,GAAKs8B,EAET,CAEAypB,oBAAmBmB,GAcO,IAdN,QAClB/3C,EAAO,KACPhxB,EAAI,KACJoE,EAAI,KACJ+3D,EAAI,IACJC,EAAG,MACHpoC,EAAK,OACL46B,EAAM,UACNyN,EAAS,kBACTJ,GAAoB,EAAK,aACzBC,GAAe,EAAK,KACpBpuC,EAAI,aACJ+tC,GAAe,EAAK,iBACpBC,GACsBiN,EACtB,MAAM,cAAE3mE,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,SAC3B,KAAEuF,GAASxzC,EAAcoM,IACzBy4D,EAAcnqD,KAAK5iB,6BAA+BC,EAAAA,GAAAA,UAClD+sE,EAAoBpqD,KAAK7Y,KAAKnH,aAAeM,EAAAA,GAAAA,MAC/C6pE,GAAeC,EACjBtxB,EAAKjxD,KAAOqkF,EAAAA,EAAAA,SACH/B,GAAenqD,KAAK7Y,KAAKnH,aAAeM,EAAAA,GAAAA,OAAoB0wB,IACrE8nB,EAAKjxD,KAAOqkF,EAAAA,EAAAA,UAGd,MAAMC,EAAWrzB,EAAKjxD,KAAOixD,EAAKmlB,OAAOvsD,IAAMonC,EAAKmlB,OAAOvsD,IAAOpM,EAAcoM,IAAIrf,OAAO8uD,KAAKr7D,KAC1FsmF,EAAetzB,EAAKqI,KAAKr7D,KACzBumF,EACJrsD,KAAK2+C,YACLr5D,EAAcoM,IAAIrf,OAAO4rE,OAAO7/C,MAC/B4B,KAAK95B,OACH85B,KAAK2+C,YACJr5D,EAAcoM,IAAIrf,OAAO4rE,OAAO7/C,KAChC4B,KAAKwqD,aACJrL,EAAoB,EAAI75D,EAAcoM,IAAIw4D,OAAOjM,OAAO5yC,SAC3D,EACEihD,EAActsD,KAAK2+C,YAAcr5D,EAAcoM,IAAIrf,OAAO4rE,OAAO7/C,KAAQ06B,EAAKmlB,OAAO7/C,KAErFmuD,GADW,CAACjlE,EAAM+3D,EAAMC,EAAKpoC,EAAO46B,GAAQ3mE,MAAMqhF,IAAgBA,IAEpE,CACEtpE,KAAM,CAACA,QAAAA,EAAQ,IACfupE,WAAY,CAAC,GAADjoF,OACP0e,EAAI,YAAA1e,OAAW8iB,EAAI,QAAA9iB,OAAO66E,EAAI,QAAA76E,OAAO86E,EAAG,QAAA96E,OAAO0yC,GAAK1yC,OACrD+6E,EAAY,QAAH/6E,OAAW+6E,GAAc,GAAE,cAAA/6E,OACzBstE,EAAM,UAKnBkN,EAAmBA,EAAiBrxD,YAAS/X,GAC7CkE,QAAQ3V,QAAoByR,IAAVzR,KAEtB,CACE+e,KAAM,CAACA,QAAAA,EAAQ,IACfupE,WAAY,CAAC,GAADjoF,OAAI0e,QAAAA,EAAQ,MAGxBwpE,EAAY,IAAI1rB,EAAAA,EACpB,CACEG,KAAM,CAAEr7D,KAAMsmF,IAEhBpsD,KAAK5tB,WAGDu6E,EAAcA,IACbxN,EAGE+M,EAAAA,EAAAA,SAFEA,EAAAA,EAAAA,WAoEN9M,EAsBHp/C,KAAK6+C,SAAW,IArBhB3qC,EAAQktB,UAAY7E,EAAO2uB,WAC3BlrD,KAAK6+C,SAAS1sE,SAAS0mD,IACrB,MAAM/zB,EAAK+zB,EAAKyI,YAAc2M,EAAAA,GAAAA,KAAiBpV,EAAK/zB,EAAI+zB,EAAK/zB,EAAK+zB,EAAK3yD,MAAS,EAC1E6+B,EAAK8zB,EAAK0I,eAAiByM,EAAAA,GAAAA,IAAmBnV,EAAK9zB,EAAI8zB,EAAK9zB,EAAKqnD,EACvEl4C,EAAQ0+B,SACN9tC,EAAI09B,EAAAA,GAAAA,IACJz9B,EAAIy9B,EAAAA,GAAAA,IACJA,EAAAA,GAAAA,IAAc3J,EAAK3yD,MAASs8D,EAAAA,GAAAA,IAC5BA,EAAAA,GAAAA,IAAc4pB,EAAe5pB,EAAAA,GAAAA,IAC9B,IAGCxiC,KAAK4qD,aACP12C,EAAQ0+B,SACN5yC,KAAK4qD,YAAY9lD,EAAI9E,KAAK4qD,YAAY1kF,MAAQs8D,EAAAA,GAAAA,IAC9CxiC,KAAK4qD,YAAY7lD,EAAIzf,EAAcoM,IAAIw4D,OAAO/oB,KAAKr7D,KAAQ08D,EAAAA,GAAAA,IAC3DA,EAAAA,GAAAA,IAAcxiC,KAAK4qD,YAAY1kF,MAAQs8D,EAAAA,GAAAA,IACvCA,EAAAA,GAAAA,IAAcl9C,EAAcoM,IAAIw4D,OAAO/oB,KAAKr7D,KAAQ08D,EAAAA,GAAAA,KAO1D,MAAMoqB,EAxFkBC,MACtB,OAAQ/zB,EAAKjxD,MAAQ8kF,KACnB,KAAKT,EAAAA,EAAAA,WACH,MAAO,CACLh4E,KAAMq4E,EAAKE,WACX3nD,EAAG,CAACwnD,EAAaA,GACjBvnD,EAAG,CAAC+zB,EAAKmlB,OAAOvsD,KAChB4vC,UAAW2M,EAAAA,GAAAA,KACX1M,aAAc,CAACyM,EAAAA,GAAAA,aAEnB,KAAKke,EAAAA,EAAAA,SACH,GAAI/B,GAAeC,EAAmB,CACpC,MAAMl2E,EAAO,GAAH1P,OAAM+nF,EAAKrpE,KAAI,+BAAA1e,OAA8BstE,GACjDjP,EAAY6pB,EAAUl+E,IAAI,CAAE0F,SAAQu2D,QAAQv2B,GAClD,MAAO,CACLhgC,KAAM,CAACA,GACP4wB,EAAG,CACD9E,KAAK95B,MAAQof,EAAcoM,IAAIw4D,OAAOjM,OAAO5yC,MAASrL,KAAKwqD,YAAc3nB,EAAYiqB,EAAAA,GAAAA,KAEvF/nD,EAAG,CAAC+zB,EAAKmlB,OAAOvsD,KAChB4vC,UAAW2M,EAAAA,GAAAA,OACX1M,aAAc,CAACyM,EAAAA,GAAAA,YAEnB,CAAO,GAAImR,EACT,MAAO,CACLjrE,KAAMq4E,EAAKrpE,KACX4hB,EAAG,CAACunD,GACJtnD,EAAG,CAAC+zB,EAAKmlB,OAAOvsD,KAChB4vC,UAAW2M,EAAAA,GAAAA,OACX1M,aAAc,CAACyM,EAAAA,GAAAA,aAEZ,CACL,MASM+e,IARJ/sD,KAAK95B,OACF85B,KAAK2+C,YACJr5D,EAAcoM,IAAIrf,OAAO4rE,OAAO7/C,KAChC06B,EAAKmlB,OAAO7/C,KACZ06B,EAAKmlB,OAAO5yC,MACZrL,KAAKwqD,YACLllE,EAAcoM,IAAIw4D,OAAOjM,OAAO5yC,OACpCqhD,EAAUl+E,IAAI,CAAE0F,KAAMq4E,EAAKrpE,KAAK,KAAMunD,QAAQv2B,KACb4kB,EAAKqI,KAAKid,WAAapQ,EAAAA,GAAAA,IAC1D,MAAO,CACL95D,KAAMq4E,EAAKrpE,KACX4hB,EAAG,CAACwnD,GACJvnD,EAAGgoD,EAAW,CAACZ,GAAY,CAACrzB,EAAKmlB,OAAOvsD,KACxC4vC,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcwrB,EAAW,CAAC/e,EAAAA,GAAAA,KAAoB,CAACA,EAAAA,GAAAA,YAEnD,CACF,KAAKke,EAAAA,EAAAA,SACH,MAAO,CACLh4E,KAAM,CAAC88B,GACPlM,EAAG,CAACunD,EAAgBK,EAAUl+E,IAAI,CAAE0F,KAAM88B,IAAQy5B,QAAQv2B,GAAW,GACrEnP,EAAG,CAAConD,GACJ7qB,UAAW2M,EAAAA,GAAAA,OACX1M,aAAc,CAACzI,EAAKqI,KAAKid,WAE7B,QACE,OACJ,EA4BmByO,GAEfG,EAAqBC,IAYrB,IAZsB,QAC1BC,EAAO,OACPvsD,GAAS,GAUVssD,EACC,MAAME,GAA0Br0B,EAAKjxD,MAAQ8kF,OAAmBT,EAAAA,EAAAA,YAAuBlN,EACvFkO,SAAAA,EAASh5E,KAAK/B,SAAQ,CAAC0mD,EAA0B3gD,KAC/C,IAAI7B,EAAI6B,EACJqc,EAAa,EACb6sC,EAAY7E,EAAOroD,KACnBA,EAAO2kD,EACP3gD,EAAQ,GAAKi1E,IACf92E,GAAK,EACLke,EAAam4D,EAAUjiB,QAAQv2B,GAC/BhgC,EAAO2kD,EAEPuI,GAAYmpB,EAAAA,EAAAA,IAAe,CAAEL,OAAQlL,EAAiBtxD,OAAQpI,mBAEhE,MAAM5G,EAAU,CACdxK,OACA4wB,EAAGooD,EAAQpoD,EAAEzuB,GAAKke,EAClBwQ,EAAGmoD,EAAQnoD,EAAE1uB,GACbkrD,aAAczI,EAAKqI,KAAKid,SAAWtlB,EAAKqI,KAAKid,SAAW8O,EAAQ3rB,aAAalrD,GAC7EirD,UAAWxI,EAAKqI,KAAKG,UAAYxI,EAAKqI,KAAKG,UAAY4rB,EAAQ5rB,UAC/DF,aAEFsrB,EAAUl+E,IAAIkQ,GACV0gE,IACFp/C,KAAK6+C,SAASxoE,GAAK,CAAEnQ,MAAOwmF,EAAUjiB,QAAQv2B,MAAax1B,IAEzDiiB,GACF+rD,EAAU/rD,OAAOuT,EACnB,GACA,EAIJ,OAFA84C,EAAmB,CAAEE,QAASN,EAAcjsD,OAAQo+C,IAE7C,CACL6N,eACAI,qBAEJ,CAGAnP,0BACE,MAAM,cAAEv4D,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAC3BtzC,EAAS+f,KAAK3uB,MAAM8S,QAAQkB,UAClC,GAAI2a,KAAK7Y,KAAKnH,aAAeM,EAAAA,GAAAA,MAC3B,OAEF,IAAK,CAAC4pC,EAAAA,GAAAA,GAAcA,EAAAA,GAAAA,GAAcA,EAAAA,GAAAA,GAAcA,EAAAA,GAAAA,IAAcp+C,SAASmU,GACrE,OAGF,MAAMqlE,EAAW18E,SAASqX,EAAO6mE,UAAU,GAAI,IACzCf,EAAc/lD,KAAK7Y,KAAK6+D,iBACxBnpB,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASzpC,KAAKzL,WAAajP,EAAc8Y,KAAKl4B,MAC9CwjE,QAASpkD,EAAcoM,IAAIC,SAE7BkrC,EAAUqkB,KACV,MAAM8G,EAAehoD,KAAKioD,kBAC1B,IAAK,MAAM5rD,KAAO0pD,EAAa,CAE7B,MAAME,EAAWF,EAAY1pD,GAC7B,IAAI+wD,EAAMptD,KAAK7Y,KAAKg/D,kBAAoBb,EAAYW,EAChDoH,EAAKrtD,KAAK7Y,KAAKk/D,uBAAyBf,EAAW8H,EACnDE,EAAKttD,KAAK5tB,UAAUyzB,MAAMf,EAAEsoD,GAAMpF,EAClC9hF,EAAQ85B,KAAK5tB,UAAUyzB,MAAMf,EAAEuoD,GAAMrtD,KAAK5tB,UAAUyzB,MAAMf,EAAEsoD,GAChEptD,KAAKkU,QAAQ1lC,IAAI,YAAa+tD,EAAOgxB,eACrCvtD,KAAKkU,QAAQ0+B,SAAS0a,EAAI,EAAGpnF,EAAO85B,KAAKrO,OAAS,GAE9CqO,KAAK7Y,KAAKy+D,yBAA2B,IACvCwH,EACGptD,KAAK7Y,KAAKg/D,kBAAoBb,EAAYW,GAC1CjmD,KAAK7Y,KAAKg/D,kBAAoBnmD,KAAK7Y,KAAKy+D,0BAA4BN,EACvE+H,EAAKrtD,KAAK7Y,KAAKy+D,yBAA2BN,EAAW8H,EACrDE,EAAKttD,KAAK5tB,UAAUyzB,MAAMf,EAAEsoD,GAAMpF,EAClC9hF,EAAQ85B,KAAK5tB,UAAUyzB,MAAMf,EAAEuoD,GAAMrtD,KAAK5tB,UAAUyzB,MAAMf,EAAEsoD,GAE5DptD,KAAKkU,QAAQ1lC,IAAI,YAAa+tD,EAAOixB,iBACrCxtD,KAAKkU,QAAQ0+B,SAAS0a,EAAI,EAAGpnF,EAAO85B,KAAKrO,OAAS,GAEtD,CACAkrC,EAAU6lB,MACZ,CAEA+K,sBACE,MAAMtpE,EAAQ6b,KAAK3uB,MAAM8S,QACnB9D,EAAU8D,EAAMnE,aAAeM,EAAAA,GAAAA,MAC/BotE,EAA0BC,EAAAA,GAAAA,SAAoCxpE,EAAMkB,WACpEuoE,EAAe5tD,KAAK5iB,6BAA+BC,EAAAA,GAAAA,WAEzD,OAAOgD,IAAYqtE,GAA2BE,EAChD,CAEAhQ,kBACE,MAAM,cAAEt4D,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QACjC,IAAKvzB,KAAKytD,sBACR,OAEF,MAAM5wB,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASnkD,EAAc8Y,KAAKl4B,MAC5BwjE,QAASpkD,EAAcoM,IAAIC,SAE7BkrC,EAAUqkB,KAEV,MAAMn8C,EAAI96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK3uB,MAAM8S,QAAQkwC,YAChD,IAAIod,EAAAA,EACF,CACEzV,GAAI,EACJE,GAAIl8B,KAAK95B,MACT+1D,GAAIl3B,EACJo3B,GAAIp3B,EACJ2sC,YAAanV,EAAOlI,UACpBsd,WAAY,GAEd3xC,KAAK5tB,WACLuuB,OAAOX,KAAKkU,SACd2oB,EAAU6lB,MACZ,CAEApF,0BACE,MAAM,cAAEh4D,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAC3BzuB,MAAQxf,EAAc8Y,KAAKl4B,MAAQof,EAAc+lB,MAAMnlC,MAAQ85B,KAAK95B,OAAS,GAC7E6+B,MAAQzf,EAAcoM,IAAIC,OAASrM,EAAc8pB,OAAOzd,OAASqO,KAAKrO,QAAU,GACtF,IAAIqvC,EAAAA,EACF,CACE9sD,KAAM,sBACN4wB,IACAC,IACAo8B,KAAM,CAAEr7D,KAAMo4E,EAAAA,GAAAA,EAAap3E,MAAO,QAClCs6D,UAAW7E,EAAOroD,KAClBotD,UAAW2M,EAAAA,GAAAA,OACX1M,aAAcyM,EAAAA,GAAAA,QAEhBhuC,KAAK5tB,WACLuuB,OAAOX,KAAKkU,QAChB,CAGA4oC,aACE,MAAM,cAAEx3D,GAAkB0a,KAAK4W,yBAQ/B5W,KAAKm9C,UAAYn9C,KAAKm9C,WAAa,IAAI0Q,EAEvC7tD,KAAKm9C,UAAU3uE,KACZ0lC,IACgC,IAA3BlU,KAAK7Y,KAAK+vB,MAAMrsC,QAIpBm1B,KAAK68C,YAAY3oC,GACjBlU,KAAKyiC,WAAWvuB,IACXlU,KAAK8tD,wBAA0B9tD,KAAKinD,oBACvCjnD,KAAKqnD,iBAAiBnzC,GAEnBlU,KAAKu9C,wBACRv9C,KAAK+8C,qBAAqB7oC,IAT1BlU,KAAKyiC,WAAWvuB,EAUlB,GAEFlU,KAAK95B,MAAQof,EAAc8Y,KAAKl4B,MAAQof,EAAc+lB,MAAMnlC,MAC5D85B,KAAKrO,OAASrM,EAAcoM,IAAIC,OAASrM,EAAc8pB,OAAOzd,OAElE,CAGAo8D,UAAUl3C,GAAe,IAAAm3C,EACvBhuD,KAAK7Y,KAAO6Y,KAAK3uB,MAAM8S,QACvB,MAAM,aAAE8pE,GAAiBjuD,KAAK4W,yBAAyBtxB,cAAcM,OAErE,GAAkB,mBAAPixB,EACT,OAGF,MAAMmxC,EAAehoD,KAAKioD,kBAEpBiG,EAAU,GAChB,IAAK,IAAI73E,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK2qD,OAAOjnE,OAAQwL,IAAK,CAChD,MAAMyuB,EAAI+R,EAAG7W,KAAK7Y,KAAKogB,SAASlxB,IAAM2xE,EAClCljD,EAAI9E,KAAK3uB,MAAMkjB,WAAa,GAAKuQ,EAAI9E,KAAK3uB,MAAMkjB,WAAayL,KAAK95B,OAItEgoF,EAAQ17E,KAAKwtB,KAAK7Y,KAAK2qD,OAAOz7D,GAChC,CAEA,MAAMpQ,EAAwB,QAArB+nF,EAAGr/D,EAAAA,GAAAA,IAAUu/D,UAAQ,IAAAF,EAAAA,EAAI,EAC5BxG,EAAWyG,GAAgB,GACjCjuD,KAAKu+C,SAAWkD,EAAAA,cAAiBjD,MAAM,CAAC,EAAGgJ,IAAW5gD,OAAO,CAAC,EAAG3gC,IAAMy7E,KAAK,GAC5E1hD,KAAK+nD,mBAAqB/nD,KAAK7Y,KAAK9B,SACtC,CAGAo4D,KAAK0Q,GACH,MAAM,cAAE7oE,GAAkB0a,KAAK4W,yBACR,MAAnBu3C,IACFA,GAAkB,GAEpBnuD,KAAKkU,QAAQ4oB,YACb,IAAIsxB,EAAe,EACfD,IACFC,EAAe9oE,EAAc8pB,OAAOzd,QAEtCqO,KAAKkU,QAAQ8kC,KAAK1zD,EAAc8Y,KAAKl4B,MAAOof,EAAcoM,IAAIC,OAAQqO,KAAK95B,MAAO85B,KAAKrO,OAASy8D,GAChGpuD,KAAKkU,QAAQupC,MACf,CAEAb,WAAWzhC,GAGT,OAFAA,EAAQn0B,MAAQgZ,KAChBA,KAAKkb,SAAS1oC,KAAK2oC,GACZnb,KAAKjyB,QAAQ,SACtB,CAEAsgF,YAAYnzC,GAEV,OADAlb,KAAKkb,SAAWA,EACTlb,KAAKjyB,QAAQ,SACtB,CAEAugF,cAAcnzC,GACZ,IAAK,IAAIjjC,EAAQ,EAAGA,EAAQ8nB,KAAKkb,SAASrwC,OAAQqN,IAAS,CAEzD,GADW8nB,KAAKkb,SAAShjC,KACdijC,EAAS,CAClBnb,KAAK+7B,MAAM7gB,SAAS+1B,OAAO/4D,EAAO,GAClC8nB,KAAKkb,SAAS+1B,OAAO/4D,EAAO,GAC5B8nB,KAAKjyB,QAAQ,UACb,KACF,CACF,CACF,CAEAk4B,YACE,IAAIjgC,EAAMkE,OAAOqkF,UACbtoF,EAAMiE,OAAOskF,UACb9N,EAAoB,KACxB,MAAMv5D,EAAQ6Y,KAAK7Y,KAAO6Y,KAAK3uB,MAAM8S,QAErC,IAAK,IAAI9N,EAAI,EAAGA,EAAI8Q,EAAKG,KAAKzc,OAAQwL,IAAK,CACzC,MAAMuP,EAASoa,KAAK6W,GAAGxgC,GACnBuP,EAASoa,KAAK3uB,MAAMkjB,WAAa,GAAK3O,EAASoa,KAAK3uB,MAAMkjB,WAAayL,KAAK95B,QAItD,OAAtBw6E,IACFA,EAAoBv5D,EAAK+vB,MAAM7gC,IAEjCrQ,EAAMiE,KAAKjE,IAAIA,EAAKmhB,EAAKm4D,IAAIjpE,IAC7BpQ,EAAMgE,KAAKhE,IAAIA,EAAKkhB,EAAKk4D,KAAKhpE,IAChC,CAEA,GAAIrQ,IAAQkE,OAAOqkF,WAAatoF,IAAQiE,OAAOskF,UAC7C,IACE,IAAIC,EAAQxkF,KAAKhE,IAAIkhB,EAAKG,KAAKzc,OAAS,GAAI,GAAIwL,EAAIo4E,EAAOC,EAAOvnE,EAAKG,KAAKzc,OAAQ8jF,EAAOF,GAASC,EACpGC,EAAOt4E,EAAIq4E,EAAOr4E,EAAIq4E,EACtBC,EAAOt4E,IAAMA,IAEbrQ,EAAMiE,KAAKjE,IAAIA,EAAKmhB,EAAKm4D,IAAIjpE,IAC7BpQ,EAAMgE,KAAKhE,IAAIA,EAAKkhB,EAAKk4D,KAAKhpE,IAalC,OATI2pB,KAAKytD,uBAA4C,OAAnBtmE,EAAKktC,YACrCruD,EAAMiE,KAAKjE,IAAIA,EAAKmhB,EAAKktC,WACzBpuD,EAAMgE,KAAKhE,IAAIA,EAAKkhB,EAAKktC,YAGvBr0B,KAAK5iB,6BAA+BC,EAAAA,GAAAA,WAAyC2iB,KAAK3uB,MAAM4U,YAC1FjgB,EAAMiE,KAAKjE,IAAIA,EAAKmhB,EAAKqG,WACzBvnB,EAAMgE,KAAKhE,IAAIA,EAAKkhB,EAAKqG,YAEpB,CAAExnB,MAAKC,MAAKy6E,oBACrB,CAEA/xC,SAAU,CAEV7B,WACE,OAAO,CACT,CAMA4I,MAAMt/B,EAAWm+C,GACf,OAAO7e,EAAAA,EAAAA,IAAM,CAAEvuB,KAAM6Y,KAAK7Y,KAAM6rC,IAAK58C,EAAGm+C,eAAgBA,QAAAA,EAAkBv0B,KAAK4oD,sBACjF,CAEAnJ,UAAUrpE,GACR,MAAMw4E,EAAkB5uD,KAAK4oD,qBAC7B,OAAOlzC,EAAAA,EAAAA,IAAM,CACXvuB,KAAM6Y,KAAK7Y,KACX6rC,IAAK58C,EACLm+C,eAAgBq6B,EAAkB3kF,KAAKhE,IAAI2oF,EAAiB,QAAKh5E,GAErE,CAEA6P,WACE,MAAMy1B,EAAWlb,KAAKkb,SAASxzC,KAAKyzC,GAAYA,EAAQ11B,aACxD,OAAOlb,IAAM,CAAC,EAAGy1B,KAAK+7B,MAAO,CAAEl0D,KAAMm4B,KAAKn4B,KAAMqzC,YAClD,CAEAh0B,WACE,MAAMg0B,EAAWlb,KAAKkb,SAASxzC,KAAKyzC,GAAYA,EAAQj0B,aACxD,OAAO3c,IAAM,CAAC,EAAGy1B,KAAK+7B,MAAO,CAAEl0D,KAAMm4B,KAAKn4B,KAAMqzC,YAClD,CAEAitC,2BACE,MAAM,aAAE0G,EAAY,eAAEC,IAAmBC,EAAAA,EAAAA,IAA6B,CACpEh9E,YAAaiuB,KAAK3uB,MAAMsiB,eACxBwP,WAAYnD,KAAK3uB,MAAM8xB,aAEzB,OAAO0rD,EAAgC,EAAjBC,CACxB,CAEA7G,kBACE,QAASh+E,KAAKhE,IAAI,EAAG+5B,KAAKmoD,2BAA6B,EACzD,CAEAS,mBAAmBD,GACjB,MAAM,UAAEn7D,EAAS,WAAExN,GAAeggB,KAAK7Y,KACjC6nE,EAAWrG,GAAS1+E,KAAK+xB,IAAI2sD,GACnC,OAAIn7D,GAAa,IACR,EACEA,GAAa,IACf,EACExN,IAAeM,EAAAA,GAAAA,QAAqB0uE,QAAAA,EAAYxhE,GAAa,EAC/D,OACgB5X,IAAd4X,EAEF,OAFF,CAMT,CAEAyhE,WAAWpnF,GACT,OAAOm4B,KAAKkb,SAAS/vC,MAAM25B,GAAMA,EAAEj9B,OAAS,YAAcA,GAC5D,CAEAi+E,WACE,OAAO,IAAIrU,EAAAA,EACT,CACExV,GAAI,EACJE,GAAIn8B,KAAKrO,OACT+/C,YAAa1xC,KAAK4W,yBAAyBtxB,cAAciuC,QAAQgJ,OAAOgrB,KACxE5V,WAAY,GAEd3xC,KAAK5tB,UAET,CAEAmwE,WACE,OAAO,IAAI9Q,EAAAA,EACT,CACEzV,GAAI,EACJE,GAAIl8B,KAAK95B,MACTwrE,YAAa1xC,KAAK4W,yBAAyBtxB,cAAciuC,QAAQgJ,OAAOgrB,KACxE5V,WAAY,GAEd3xC,KAAK5tB,UAET,CAEAwkC,yBACE,OAAOA,EAAAA,EAAAA,wBAAuB5W,KAAK3uB,MAAMsiB,eAC3C,CAEAm6D,uBACE,OACE9tD,KAAKrB,UAAYqB,KAAK3uB,MAAMsiB,eAAevW,6BAA+BC,EAAAA,GAAAA,SAE9E,CAEA6xE,qCACE,MAAM,cAAE5pE,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,SAC3B,MAAEhjD,EAAK,2BAAE6M,GAA+B4iB,KAAK3uB,MAAMsiB,eACzD,IAAIw7D,EAAS5yB,EACb,MAAM6yB,GAAoBC,EAAAA,EAAAA,IAAmB,CAC3CF,SACA5+E,UAEI++E,EAAuB3kF,OAAOC,KAAKwkF,GACnCG,EAA4B,CAAC,WAAY,SAAU,aAAc,WAAY,UAAW,aAAapkF,MACxGqkF,GAAaF,EAAqBxjF,SAAS0jF,KAI5Cj/E,IAAUu7C,EAAAA,GAAAA,QACV2jC,EAAAA,EAAAA,IAA6B,CAC3BryE,2BAA4BA,EAC5BsyE,cAAepqE,EAAcM,OAAOD,SAAyC,EAA9BL,EAAcM,OAAOmsC,WAG1Cw9B,IAC5BJ,EAAS,IAAKA,KAAWQ,EAAAA,KAQ3B,OALEvyE,IAA+BC,EAAAA,GAAAA,WAAwE,IAAhCiI,EAAcM,OAAOmsC,SAC9Dw9B,IAC9BJ,EAAS,IAAKA,KAAWS,EAAAA,MAA0BR,IAG9CD,CACT,CAEA5R,uBACE,OAAOv9C,KAAK5iB,6BAA+BC,EAAAA,GAAAA,YAAwC02B,EAAAA,EAAAA,IAAiB/T,KACtG,EACDM,EA3hEKi8C,EAAS,QAqBE,SAAOj8C,EArBlBi8C,EAAS,WAsBK,IAugEpBA,EAAUr8C,YAEV,U,wcCxrEA,MAAM2vD,UAAoBn7C,EAKxBo7C,uBAAsB7rF,GAA0E,IAAzE,MAAEiU,EAAK,oBAAE63E,EAAmB,iBAAEC,GAAyC/rF,EAC5F,MAAM,UAAEgsF,EAAS,QAAEC,EAAO,WAAEC,EAAU,SAAEC,EAAQ,SAAEC,EAAQ,OAAEC,GAAWP,EACjEzoE,EAAO0Y,KAAK7Y,KAAKG,KAAKpP,GACtBg/B,EAAQlX,KAAK7Y,KAAK+vB,MAAMh/B,GACxBkzE,EAAal0C,EAAQ5vB,EAAO2oE,EAAYC,EACxCK,EAAYr5C,EAAQ5vB,EAAO+oE,EAAWC,EAC5C,MAAO,CACLhpE,OACA4vB,QACAmoC,KAAMr/C,KAAK7Y,KAAKk4D,KAAKnnE,GACrBonE,IAAKt/C,KAAK7Y,KAAKm4D,IAAIpnE,GACnBs4E,aAAcpF,EACd3R,YAAaviC,EAAQ5vB,EAAO6oE,EAAaC,EACzCG,UAAWP,EAAmBO,EAAYnF,EAE9C,CAEA/N,cACE,GAAIr9C,KAAK+nD,qBAAuB/nD,KAAK7Y,KAAK9B,UACxC,OAEF,MAAM,cAAEC,GAAkB0a,KAAK4W,yBACzB2lB,EAASv8B,KAAKkvD,sCACd,aAAEL,EAAY,eAAEC,IAAmBC,EAAAA,EAAAA,IAA6B,CACpEh9E,YAAaiuB,KAAK3uB,MAAMsiB,eACxBwP,WAAYnD,KAAK3uB,MAAM8xB,aAEnBstD,EACJ5B,EAAgC,EAAjBC,GAAsB,KACnC9uD,KAAKn4B,OAASwgD,EAAAA,GAAAA,mBAAyD,IAAnBymC,GAClDjyB,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASzpC,KAAKzL,WAAajP,EAAc8Y,KAAKl4B,MAC9CwjE,QAASpkD,EAAcoM,IAAIC,SAEvB++D,GAAmBzP,EAAAA,EAAAA,IAAa,CACpC/sC,QAASlU,KAAKkU,QACdu1B,QAASknB,GACTjnB,QAAS,IAGX7M,EAAUqkB,MACVkH,EAAAA,EAAAA,IAAkB,CAChBjkE,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK5tB,UAAUyzB,MACtBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZmiF,gBAAiBA,CAAChyE,EAAWuP,KAC3B,MAAM,KAAE0B,EAAI,MAAE4vB,EAAK,KAAEmoC,EAAI,IAAEC,EAAG,UAAEiR,EAAS,YAAE9W,EAAW,aAAE+W,GAAiBxwD,KAAK8vD,uBAAuB,CACnG53E,MAAO7B,EACP05E,oBAAqBxzB,EACrByzB,iBAAkBS,IAGdG,EAAiB3mF,KAAKyrC,MAAM1V,KAAK2/B,GAAGhxC,EAAAA,GAAAA,IAAUrH,EAAM4vB,KACpD25C,EAAgB5mF,KAAKyrC,MAAM1V,KAAK2/B,GAAGhxC,EAAAA,GAAAA,IAAUrH,EAAM4vB,KACnD45C,EAAiB7mF,KAAKyrC,MAAM1V,KAAK2/B,GAAG0f,IACpC0R,EAAgB9mF,KAAKyrC,MAAM1V,KAAK2/B,GAAG2f,IAEnC0R,EAAmBH,EAAgBD,EACnCK,EAAkBrrE,EAAS3b,KAAKuwC,MAAMs0C,EAAiBD,EAAe,GACtEqC,EAAkBpC,EAAiB,EAIzC,IAAInU,EAAAA,EAAAA,OAAcsW,EAAkBjxD,KAAKzL,WAAa,EACpD,OAGF,MAAM48D,EAAoCH,GAAqC,EAAjBlC,EACxDsC,GAAoCX,GAA6BM,EAAgBD,EAAiB,EAiBxG,GAfAJ,EAAiBxP,KACjBlhD,KAAKkU,QAAQ1lC,IAAI,cAAe+hF,GAChCvwD,KAAKkU,QAAQ4oB,YACb98B,KAAKkU,QAAQ+oB,OAAOr3C,EAAQkrE,GACxBL,IACFzwD,KAAKkU,QAAQgpB,OAAOt3C,EAAQgrE,GAC5B5wD,KAAKkU,QAAQ+oB,OACXr3C,EACAgrE,GAAkBO,EAAoCH,EAvF/C,KA0FXhxD,KAAKkU,QAAQgpB,OAAOt3C,EAAQwrE,EAAmCN,EAAiB,EAAIC,GACpF/wD,KAAKkU,QAAQipB,SACbuzB,EAAiBhO,OAEb+N,EAA2B,CAC7B,MAAMY,EAAYvC,EAAiB,EAC/BuC,IACFrxD,KAAKkU,QAAQ1lC,IAAI,cAAeirE,GAC5B0X,GACFnxD,KAAKkU,QAAQ1lC,IAAI,YAAasgF,GAC9B9uD,KAAKkU,QAAQukC,WACXwY,EAAkBC,EAClBN,EAAiBM,EACjBrC,EAAe,EAAIqC,EACnBF,EAAmB,EAAIE,GAEzBlxD,KAAKkU,QAAQ1lC,IAAI,YA1GZ,KA4GLwxB,KAAKkU,QAAQ4oB,YACb98B,KAAKkU,QAAQ+oB,OAAOg0B,EAAiBL,EAAiBD,IACtD3wD,KAAKkU,QAAQgpB,OAAO+zB,EAAkBpC,EAAe,EAAIC,EAAgB8B,EAAiBD,IAC1F3wD,KAAKkU,QAAQipB,WAIjB,MAAMm0B,EAAaN,EAAmB,EAAIlC,EACpCyC,EAAUD,EAAa,GACzBC,GAAYF,IACdrxD,KAAKkU,QAAQ1lC,IAAI,YAAa+iF,EAAUf,EAAe/W,GACvDz5C,KAAKkU,QAAQ0+B,SACXqe,EAAkBnC,EAClB8B,EAAiB9B,EACjBD,EACA0C,EAAUD,EA3HL,GA8HX,KAGJz0B,EAAU6lB,MACZ,CAEA5iC,WACE,MAAO,gBAAPt7C,OAAuBw7B,KAAK7Y,KAAK9U,OACnC,EACDiuB,EArIKuvD,EAAW,OACDxnC,EAAAA,GAAAA,aAA4B/nB,EADtCuvD,EAAW,QAEA,UAAQvvD,EAFnBuvD,EAAW,WAGG,kBAoIpB,U,wcC9IA,MAAM2B,UAA0B3B,EAK9B9vD,0BAA0BrzB,GACxB,OAAOzC,KAAKhE,IAAI,EAAG09B,MAAM84C,mBAAmB/vE,GAC9C,CAEAojF,uBAAsB7rF,GAAwD,IAAvD,MAAEiU,EAAK,oBAAE63E,GAA4C9rF,EAC1E,MAAMqjB,EAAO0Y,KAAK7Y,KAAKG,KAAKpP,GACtBg/B,EAAQlX,KAAK7Y,KAAK+vB,MAAMh/B,GACxBu5E,EAAWv6C,EAAQ5vB,EACnBoqE,EACJx6C,EAAQlX,KAAK7Y,KAAK+vB,MAAMh/B,EAAQ,GAAK63E,EAAoB4B,YAAc5B,EAAoB6B,cACvFxG,EAAuB,IAAVlzE,EAAc63E,EAAoB8B,WAAaH,EAClE,MAAO,CACLpqE,OACA4vB,QACAmoC,KAAMr/C,KAAK7Y,KAAKk4D,KAAKnnE,GACrBonE,IAAKt/C,KAAK7Y,KAAKm4D,IAAIpnE,GAEnBs4E,aAAciB,EAAW,mBAAqBrG,EAC9C3R,YAAa2R,EACbmF,UAAWnF,EAEf,CAEAtrC,WACE,MAAO,uBAAPt7C,OAA8Bw7B,KAAK7Y,KAAK9U,OAC1C,EACDiuB,EA/BKkxD,EAAiB,OACPnpC,EAAAA,GAAAA,mBAAkC/nB,EAD5CkxD,EAAiB,QAEN,iBAAelxD,EAF1BkxD,EAAiB,WAGH,mBA8BpB,U,wcC7BA,MAAMM,UAAmBjC,EAAYxvD,cAAA,SAAA1mB,WAAA2mB,EAAA,+BASVr8B,IAA6E,IAA5E,MAAEiU,EAAK,oBAAE63E,EAAmB,iBAAEC,GAAyC/rF,EAC/F,MAAM8tF,EAAS/xD,KAAK7Y,KAAK6qE,oBAEnB1qE,EAAOyqE,EAAOzqE,KAAKpP,GACnBg/B,EAAQ66C,EAAO76C,MAAMh/B,GACrBkzE,EAAal0C,EAAQ5vB,EAAOyoE,EAAoBE,UAAYF,EAAoBG,QAChFK,EAAYr5C,EAAQ5vB,EAAOyoE,EAAoBM,SAAWN,EAAoBO,OACpF,MAAO,CACLhpE,OACA4vB,QACAmoC,KAAMp1E,KAAKhE,IAAI+5B,KAAK7Y,KAAKk4D,KAAKnnE,GAAQoP,EAAM4vB,GAC5CooC,IAAKr1E,KAAKjE,IAAIshB,EAAM4vB,EAAOlX,KAAK7Y,KAAKm4D,IAAIpnE,IACzCs4E,aAAcpF,EACd3R,YAAaviC,EAAQ5vB,EAAOyoE,EAAoBI,WAAaJ,EAAoBK,SACjFG,UAAWP,EAAmBO,EAAYnF,EAC3C,IACF9qD,EAAA,sBAEe,KACd,MAAMi8B,EAASv8B,KAAKkvD,sCAElB5nE,KAAMy4D,EACN7oC,MAAO1pB,EACP6xD,KAAMW,EACNV,IAAKW,GACHjgD,KAAK8vD,uBAAuB,CAC9B53E,MAAO8nB,KAAK7Y,KAAKjE,KAAKrY,OAAS,EAC/BklF,oBAAqBxzB,IAGvB,MAAO,CAAEwjB,WAAUvyD,YAAWwyD,WAAUC,UAAS,IAClD3/C,EAAA,oBAYc4T,IACb,MAAM,UAAE1mB,GAAcwS,KAAKiyD,gBAC3BtuD,MAAMk5C,YAAY3oC,EAAS,CAAE1mB,cAAa,GAE1C,MAAM,kBAAEkzD,GAAsB1gD,KAAKiG,YACnC,GAAIjG,KAAK3uB,MAAMw0B,QAAUC,EAAAA,GAAAA,aAAyB46C,EAAmB,OAErE,MAAMwR,EAAsBlyD,KAAK7Y,KAAK+vB,MAAMlX,KAAK7Y,KAAK+vB,MAAMrsC,OAAS,GAC/DsnF,EAAyBnyD,KAAKygD,uBAAuB,CAAEjzD,YAAWkzD,sBAClE0R,EAA2BpyD,KAAKygD,uBAAuB,CAAEjzD,UAAW0kE,EAAqBxR,sBAE/F1gD,KAAK2iD,iBAAiB,CAAEzuC,UAAS0uC,YAAa34E,KAAKyrC,MAAM1V,KAAK2/B,GAAGnyC,IAAatpB,MAAOiuF,IAEjFA,IAA2BC,GAE/BpyD,KAAK2iD,iBAAiB,CACpBzuC,UACA0uC,YAAa5iD,KAAKijD,kCAAkC,CAClDG,eAAgB51D,EAChB61D,oBAAqB6O,IAEvBhuF,MAAOkuF,EACP3wB,WAAYzhC,KAAK6iD,oCACjB,GACH,CAvED9iD,0BAA0BrzB,GACxB,OAAOzC,KAAKhE,IAAI,EAAG09B,MAAM84C,mBAAmB/vE,GAC9C,CAmCAozE,qBACE,MAAMjB,EAAW7+C,KAAKiyD,gBACtB,MAAO,CACL3qE,KAAM0Y,KAAKy/C,UAAUZ,EAASkB,UAC9BV,KAAMr/C,KAAKy/C,UAAUZ,EAASmB,UAC9BV,IAAKt/C,KAAKy/C,UAAUZ,EAASoB,SAC7B/oC,MAAOlX,KAAKy/C,UAAUZ,EAASrxD,WAEnC,CA4BAu7D,oBAAoBC,EAAoB7hF,GAAoD,IAAlC8hF,IAAyBtvE,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,KAAAA,UAAA,GACjF,MAAM4iD,EAASv8B,KAAKkvD,qCACd3nD,EAAWvH,KAAK7Y,KAAKoiE,uBAAuBP,GAClD,GAAIzhD,GAAY,EAAG,CACjB,IAAIpjC,EAAQ,KACZ,GAAI,CAAC,OAAQ,MAAO,OAAQ,SAAS2H,SAAS3E,GAAM,CAElDhD,EADa67B,KAAK8vD,uBAAuB,CAAE53E,MAAOqvB,EAAUwoD,oBAAqBxzB,IACpEp1D,EACf,CAEA,GADAhD,EAAkB,OAAVA,EAAiB67B,KAAK7Y,KAAK+hE,kBAAkB/hF,EAAK6hF,GAAc7kF,EAC1D,OAAVA,EACF,OAAO8kF,EAA4BjpD,KAAKy/C,UAAUt7E,GAAS,GAAHK,OAAML,EAElE,CACF,CAEAglF,oBAAoBH,GAAoB,IAAAqJ,EAAAC,EACtC,MAAM/qD,EAAWvH,KAAK7Y,KAAKoiE,uBAAuBP,GAC5C+I,EAAS/xD,KAAK7Y,KAAK6qE,oBACnBxI,EAAmC,QAAzB6I,EAAGN,EAAO76C,MAAM3P,UAAS,IAAA8qD,EAAAA,EAAI,KACvC5I,EAA0C,QAA7B6I,EAAGP,EAAO76C,MAAM3P,EAAW,UAAE,IAAA+qD,EAAAA,EAAI,KACpD,OAAmB,OAAf9I,GAAyC,OAAlBC,GAClBC,EAAAA,EAAAA,IAA+B,CAAEviE,KAAM6Y,KAAK7Y,KAAMwiE,YAAaH,EAAYn1B,UAAWo1B,IAGxF,IACT,CAEA3pC,WACE,MAAO,mBAAPt7C,OAA0Bw7B,KAAK7Y,KAAK9U,OACtC,EACDiuB,EA7GKwxD,EAAU,OACAzpC,EAAAA,GAAAA,YAA2B/nB,EADrCwxD,EAAU,QAEC,eAAaxxD,EAFxBwxD,EAAU,WAGI,uBA4GpB,U,wcClHA,MAAMS,UAAkB79C,EAKtB2oC,cACE,MAAM,cAAE/3D,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QACjC,IAAIzc,EAA2BkZ,EAC/B,MAAM6M,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASzpC,KAAKzL,WAAajP,EAAc8Y,KAAKl4B,MAAQ,GACtDwjE,QAASpkD,EAAcoM,IAAIC,OAAS,KAEtCkrC,EAAUqkB,KACVlhD,KAAKkU,QAAQ4oB,YACb98B,KAAKkU,QAAQ1lC,IAAI,YAAa,GAC9BwxB,KAAKkU,QAAQ1lC,IAAI,cAAe+tD,EAAO1D,OACvCuvB,EAAAA,EAAAA,IAAkB,CAChBjkE,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK5tB,UAAUyzB,MACtBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZmiF,gBAAiBA,CAAChyE,EAAWyuB,KAC3B,MAAMC,EAAI96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK7Y,KAAK+vB,MAAM7gC,KAC7C2pB,KAAKkU,QAAQgpB,OAAOp4B,EAAGC,GACvBirB,EAAOlrB,OACOlvB,IAAVkhC,IACFA,EAAQhS,EACV,SAGUlvB,IAAVkhC,QAAgClhC,IAATo6C,IACzBhwB,KAAKkU,QAAQipB,SACbn9B,KAAKkU,QAAQ1lC,IAAI,YAAa+tD,EAAOkF,YACrCzhC,KAAKkU,QAAQgpB,OAAOlN,EAAOhwB,KAAKrO,QAChCqO,KAAKkU,QAAQgpB,OAAOpmB,EAAQ9W,KAAKrO,QACjCqO,KAAKkU,QAAQirB,QAGftC,EAAU6lB,MACZ,CAEA5iC,WACE,MAAO,cAAPt7C,OAAqBw7B,KAAK7Y,KAAK9U,OACjC,EACDiuB,EA9CKiyD,EAAS,OACClqC,EAAAA,GAAAA,WAA0B/nB,EADpCiyD,EAAS,QAEE,QAAMjyD,EAFjBiyD,EAAS,WAGK,iBA6CpB,UC9CA,MAIMC,EAAU,iBAEVC,EAAY,iBAElB,MAAMC,UAAwBh+C,EAG5B3U,mBACEp1B,OAAO0hE,eAAersC,KAAKm+B,UAAW,QAAS,CAC7C3e,MACE,MAAM,wBAAEmzC,GAA4B3yD,KAAK4W,yBACzC,OAAO5W,KAAK3uB,MAAMnL,MAAQysF,EAAwBv0D,KAAKl4B,MAAQysF,EAAwBtnD,MAAMnlC,KAC/F,IAGFyE,OAAO0hE,eAAersC,KAAKm+B,UAAW,SAAU,CAC9C3e,MACE,MAAM,wBAAEmzC,GAA4B3yD,KAAK4W,yBACzC,OAAO5W,KAAK5tB,UAAUuf,OAASghE,EAAwBjhE,IAAIC,OAASghE,EAAwBvjD,OAAOzd,MACrG,GAEJ,CAKA0O,YAAYpyB,EAAiCoD,GAC3CsyB,MAAM11B,EAAQoD,GACd2uB,KAAKyiC,WAAaziC,KAAKyiC,WAAWn/B,KAAKtD,MACvCA,KAAK+8C,qBAAuB/8C,KAAK+8C,qBAAqBz5C,KAAKtD,MAC3DA,KAAK68C,YAAc78C,KAAK68C,YAAYv5C,KAAKtD,MACzCA,KAAK88C,WAAa98C,KAAK88C,WAAWx5C,KAAKtD,KACzC,CAEA88C,aAEE,GADAn5C,MAAMm5C,cACD98C,KAAK7Y,KACR,OAEF,MAAM0uC,EAAgB,GACtB71B,KAAK7Y,KAAK+vB,MAAM/kC,SAAQ,CAACojC,EAAKl/B,KAC5Bw/C,EAAIx/C,GAAKk/B,EAAMvV,KAAK7Y,KAAK2qD,OAAOz7D,EAAE,IAEpC2pB,KAAK4yD,MAAQ/8B,EAEb,IAAIg9B,EAAY,KAChB,IAAK,IAAIx8E,EAAI2pB,KAAK7Y,KAAK2qD,OAAOjnE,OAAS,EAAGwL,GAAK,EAAGA,IAChD,GAA4B,IAAxB2pB,KAAK7Y,KAAK2qD,OAAOz7D,GAAU,CAC7Bw8E,EAAYx8E,EACZ,KACF,CAEF2pB,KAAK8yD,eACW,OAAdD,EACI,KACA5oF,KAAKjE,IAAI6sF,EAAW5oF,KAAKyrC,OAAO1V,KAAK7Y,KAAKg/D,kBAAoBnmD,KAAK7Y,KAAKs+D,oBA3DjE,GA4Df,CAEApI,cACE,MAAM,wBAAEsV,GAA4B3yD,KAAK4W,yBACnCimB,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASzpC,KAAKzL,WAAao+D,EAAwBv0D,KAAKl4B,MAAQ,GAChEwjE,QAASipB,EAAwBjhE,IAAIC,OAAS,KAEhDkrC,EAAUqkB,KACVlhD,KAAK+yD,mBAAmB/yD,KAAKkU,QAASlU,KAAK4yD,MAAO,EAAG,EAAG,GACxD/1B,EAAU6lB,MACZ,CAEAqQ,mBACE7+C,EACAttB,EACAtd,EACA0pF,EACAC,GAEA,GAA4B,OAAxBjzD,KAAK8yD,eACP,OAEF,MAAMI,GAAavpE,EAAAA,EAAAA,OACb,cAAErE,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAE3B3sB,EAAS,CAtFD,GADA,GAyFdsN,EAAQ/5B,OACR+5B,EAAQ4oB,YACR5oB,EAAQ8kC,MACLh5C,KAAKzL,WACNyL,KAAK2/B,GAAG/4B,EAAO,IACf5G,KAAK6W,GAAG7W,KAAK8yD,gBACb7oF,KAAKyrC,MAAM1V,KAAK2/B,GAAGqzB,GAAYhzD,KAAK2/B,GAAG/4B,EAAO,KAAO,IAEvDsN,EAAQupC,OACRvpC,EAAQ1lC,IAAI,YAhGJ,0BAiGR0lC,EAAQ1lC,IAAI,cAAe0kF,EAAa32B,EAAO42B,WAAaX,GAC5Dt+C,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOj9B,KAAK6W,GAAG,GAAI5sC,KAAKyrC,MAAM1V,KAAK2/B,GAAG/4B,EAAO,MACrD,IAAK,IAAIvwB,EAAI/M,EAAM+M,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAC7C69B,EAAQgpB,OAAOl9B,KAAK6W,GAAGxgC,GAAIpM,KAAKyrC,MAAM1V,KAAK2/B,GAAG/4C,EAAMvQ,MAEtD69B,EAAQgpB,OAAOl9B,KAAK6W,GAAG7W,KAAK7Y,KAAK+vB,MAAMrsC,OAAS,GAAIZ,KAAKyrC,MAAM1V,KAAK2/B,GAAG/4B,EAAO,MAC9EsN,EAAQirB,OACRjrB,EAAQipB,SACRjpB,EAAQvJ,UAERuJ,EAAQ/5B,OACR+5B,EAAQ4oB,YACR5oB,EAAQ8kC,MACLh5C,KAAKzL,WACNyL,KAAK2/B,GAAG/4B,EAAO,IACf5G,KAAK6W,GAAG7W,KAAK8yD,gBACb7oF,KAAKyrC,MAAM1V,KAAK2/B,GAAGszB,IAAe,IAEpC/+C,EAAQupC,OACRvpC,EAAQ1lC,IAAI,YAnHF,0BAoHV0lC,EAAQ1lC,IAAI,cAAe0kF,EAAa32B,EAAO62B,SAAWX,GAC1Dv+C,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOj9B,KAAK6W,GAAG,GAAI5sC,KAAKyrC,MAAM1V,KAAK2/B,GAAG/4B,EAAO,MACrD,IAAK,IAAIvwB,EAAI/M,EAAM+M,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAC7C69B,EAAQgpB,OAAOl9B,KAAK6W,GAAGxgC,GAAIpM,KAAKyrC,MAAM1V,KAAK2/B,GAAG/4C,EAAMvQ,MAEtD69B,EAAQgpB,OAAOl9B,KAAK6W,GAAG7W,KAAK7Y,KAAK+vB,MAAMrsC,OAAS,GAAIZ,KAAKyrC,MAAM1V,KAAK2/B,GAAG/4B,EAAO,MAC9EsN,EAAQirB,OACRjrB,EAAQipB,SACRjpB,EAAQvJ,SACV,CAEAozC,cACE,MAAM,wBAAE4U,GAA4B3yD,KAAK4W,0BACnC,OAAE2lB,GAAWo2B,EAAwBp/B,QACrCsJ,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASzpC,KAAKzL,WAAao+D,EAAwBv0D,KAAKl4B,MACxDwjE,QAASipB,EAAwBjhE,IAAIC,SAEvCkrC,EAAUqkB,KAEV,MAAM2E,EAAQ7lD,KAAK8lD,WACb5xE,EAAO,IAAI8sD,EAAAA,EACf,CACEj8B,EAAG/E,KAAKrO,OAAS,GACjBwvC,KAAM,CAAEr7D,KAAM,GACds7D,UAAW7E,EAAOroD,KAClBqtD,aAAcyM,EAAAA,GAAAA,OACd1M,UAAW2M,EAAAA,GAAAA,QAEbjuC,KAAK5tB,WAEP,IAAI0yB,EAEJA,EAAI9E,KAAK6W,GAAG,GACZgvC,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SAExCpP,EAAI9E,KAAK6W,GAAG,IAAM,EAClB3iC,EAAK1F,IAAI,CAAE0F,KAAM,OAAQ4wB,MAAKnE,OAAOX,KAAKkU,SAC1C2xC,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SAExCpP,EAAI9E,KAAK6W,GAAG,IACZgvC,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SAExCpP,EAAI9E,KAAK6W,GAAG,IACZ3iC,EAAK1F,IAAI,CAAE0F,KAAM,OAAQ4wB,MAAKnE,OAAOX,KAAKkU,SAC1C2xC,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SAExCpP,EAAI9E,KAAK6W,GAAG,IACZgvC,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SAExCpP,EAAI9E,KAAK6W,GAAG,IACZ3iC,EAAK1F,IAAI,CAAE0F,KAAM,MAAO4wB,MAAKnE,OAAOX,KAAKkU,SACzC2xC,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SAExCpP,EAAI9E,KAAK6W,GAAG,KACZgvC,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SAExCpP,EAAI9E,KAAK6W,GAAG,KACZ3iC,EAAK1F,IAAI,CAAE0F,KAAM,MAAO4wB,MAAKnE,OAAOX,KAAKkU,SACzC2xC,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,SAExC2oB,EAAU6lB,MACZ,CAEAjgB,aAAc,CAEdh4B,kBAAmB,CAEnBsyC,uBAAwB,CAExBsW,WACE,MAAO,CAAErtF,KAjMK,EAiMWC,IAhMX,EAiMhB,CAEAqtF,uBACE,OAAOtzD,KAAKqzD,UACd,CAEAxW,YAAY3oC,GACV,MAAM,wBAAEy+C,EAAuB,cAAErtE,GAAkB0a,KAAK4W,0BAClD,OAAE2lB,GAAWj3C,EAAciuC,QAC3B2/B,GAAavpE,EAAAA,EAAAA,MACbkzC,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASkpB,EAAwBv0D,KAAKl4B,MACtCwjE,QAASipB,EAAwBjhE,IAAIC,SAEvCkrC,EAAUqkB,KAEV,MAAMqS,EAAQvzD,KAAKuiD,WACnB,IAAK,MAAMX,IAAQ,EApNL,EAoNiB,EAnNjB,GAmNgC,CAC5C,MAAM78C,EAAI96B,KAAKyrC,MAAM1V,KAAK2/B,GAAGiiB,IAC7B2R,EAAM/kF,IAAI,CAAEytD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKpE,OAAOuT,EACrC,CAEA,MAAMhgC,EAAO,IAAI8sD,EAAAA,EACf,CACEl8B,EAAG9E,KAAK95B,MAAQ,GAChBi7D,KAAM,CAAEr7D,KAAM,GACdy7D,aAAcyM,EAAAA,GAAAA,OACd1M,UAAW2M,EAAAA,GAAAA,OAEbjuC,KAAK5tB,WAGDohF,EAASN,EAAa32B,EAAO62B,SAAWX,EACxCgB,EAAWP,EAAa32B,EAAO42B,WAAaX,EAC5CxiC,EAAOhwB,KAAK4yD,MAAM5yD,KAAK8yD,gBACvBj3D,EAAkC,OAAxBmE,KAAK8yD,eAA0B7oF,KAAKuwC,MAAa,GAAPwV,EAAY,IAAM,GAC5E97C,EAAK1F,IAAI,CAAEu2B,EAAG/E,KAAK2/B,GAAG,GAAK,EAAGyB,UAAWoyB,EAAQt/E,KAAM,GAAF1P,OAAKq3B,EAAO,OAAO8E,OAAOuT,GAC/EhgC,EAAK1F,IAAI,CAAEu2B,EAAG/E,KAAK2/B,GAAG,GAAK,EAAGyB,UAAWqyB,EAAUv/E,KAAM,GAAF1P,OAAK,IAAMq3B,EAAO,OAAO8E,OAAOuT,GAEvF2oB,EAAU6lB,MACZ,CAEAjF,OACE,MAAM,wBAAEkV,GAA4B3yD,KAAK4W,yBACzC5W,KAAKkU,QAAQ4oB,YACb98B,KAAKkU,QAAQ8kC,KAAK2Z,EAAwBv0D,KAAKl4B,MAAOysF,EAAwBjhE,IAAIC,OAAQqO,KAAK95B,MAAO85B,KAAKrO,QAC3GqO,KAAKkU,QAAQupC,MACf,CAEAx3C,YACE,OAAOjG,KAAKqzD,UACd,CAEAhM,mBAAoB,CAEpB3J,eAAgB,CAEhB59B,WACE,MAAO,wBACT,E,YAvPI4yC,E,EAAe,O,EACLrqC,EAAAA,GAAAA,iB,6aAwPhBqqC,EAAgBxyD,YAEhB,U,wdC1PA,MAAM0oB,GAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAE7F,MAAM8qC,WAAuBh/C,EAI3BrU,YAAYpyB,EAAsCoD,GAChDsyB,MAAM11B,EAAQoD,GAAMivB,GAAA,yBAHQ,IAI5BN,KAAKyiC,WAAaziC,KAAKyiC,WAAWn/B,KAAKtD,KACzC,CAEAq9C,cACE,MAAM,cAAE/3D,EAAa,eAAEquE,GAAmB3zD,KAAK4W,yBACzCimB,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASzpC,KAAKzL,WAAajP,EAAc8Y,KAAKl4B,MAAQ,GACtDwjE,QAASpkD,EAAcoM,IAAIC,OAAS,KAEtCkrC,EAAUqkB,KAEVlhD,KAAKkU,QAAQ1lC,IAAI,YAAa,GAE9B,MAAMiY,EAA4B,CAAC,EACnC,IAAK,MAAMtC,KAAS6b,KAAK4zD,YACvBntE,EAAOtC,EAAM9R,QAAU8R,EAGzB,IAAK,IAAIjM,EAAQ8nB,KAAK+7B,MAAM/pD,QAAQnH,OAAS,EAAGqN,GAAS,EAAGA,IAAS,CACnE,MACMiM,EAAQsC,EADCuZ,KAAK+7B,MAAM/pD,QAAQkG,IAElC8nB,KAAKkU,QAAQ1lC,IAAI,cAAemlF,EAAez7E,EAAQy7E,EAAe9oF,SACtEm1B,KAAKkU,QAAQ4oB,YACb,IAAK,IAAIzmD,EAAI,EAAGw9E,EAAM1vE,EAAM+yB,MAAMrsC,OAAQipF,EAAMD,GAAO,EAAGC,EAAMz9E,EAAIw9E,EAAMx9E,EAAIw9E,EAAKC,EAAMz9E,IAAMA,IAAK,CAClG,MAAMyuB,EAAI9E,KAAK6W,GAAGxgC,GAClB,GAAIyuB,EAAI9E,KAAKzL,YAAc,IAAMuQ,EAAI9E,KAAKzL,WAAayL,KAAK3uB,MAAMnL,MAAQ,GAExE,SAEF,MAAM6+B,EAAI96B,KAAKyrC,MAAM1V,KAAK2/B,GAAGx7C,EAAM+yB,MAAM7gC,KACzC2pB,KAAKkU,QAAQgpB,OAAOp4B,EAAGC,EACzB,CACA/E,KAAKkU,QAAQipB,QACf,CAEAN,EAAU6lB,MACZ,CAEAjgB,WAAWvuB,GACT,MAAM,cAAE5uB,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAC3Br/C,EAAO8rB,KAAK+7B,MAAM73D,OAAS,GAC3B6gC,GAAK/E,KAAKrO,OAAS,GAAK,EAc9B,OAbA,IAAIqvC,EAAAA,EACF,CACE9sD,OACA4wB,EAAG,GACHC,EAAGzf,EAAcoM,IAAIC,OAASoT,EAC9Bg4B,OAAQ,GACRoE,KAAM,CAAEr7D,KAAM,GAAIkB,OAAQ,MAAON,OAAQ,oBACzC06D,UAAW7E,EAAOmiB,cAClBpd,UAAW2M,EAAAA,GAAAA,OACX1M,aAAcyM,EAAAA,GAAAA,YAEhBhuC,KAAK5tB,WACLuuB,OAAOuT,GACFlU,KAAKyK,gBAAgByJ,EAASlU,KAAK7Y,KAAK+vB,MAAMrsC,OAAS,EAChE,CAEA4/B,gBAAgByJ,EAAmC80C,GAAoB,IAAA+K,EACrE,MAAM,cAAEzuE,EAAa,eAAEquE,GAAmB3zD,KAAK4W,0BACzC,OAAE2lB,GAAWj3C,EAAciuC,QAC3BygC,EAAkBrlE,EAAAA,GAAAA,IAAUqR,KAAK+7B,MAAM/pD,QAAQtK,KAAKyY,GAAMA,EAAEtV,UAE5DqY,EAAOyL,EAAAA,GAAAA,sBAA2E,QAAhDolE,EAAC/zD,KAAK7Y,KAAK+hE,kBAAkB,OAAQF,UAAW,IAAA+K,EAAAA,EAAI,GACtF33D,EAAQlZ,EAAKwL,WACb8M,EAAOtY,EAAK64D,cACZ1/C,EAAMnZ,EAAK84D,UACXiY,EAAajL,IAAehpD,KAAK7Y,KAAK+vB,MAAMrsC,OAAS,EAE3D,IAAIm2D,EAAAA,EACF,CACE9sD,KAAM,GAAF1P,OAAKokD,GAAOxsB,GAAM,KAAA53B,OAAI63B,EAAG,KAAA73B,OAAIg3B,EAAI,iBACrCsJ,EAAGxf,EAAc8Y,KAAKl4B,OAAS8tF,EAAkB,GAAK,IAAM,KAC5DjvD,EAAG,GACHo8B,KAAM,CAAEr7D,KAAM,GACds7D,UAAW7E,EAAOroD,KAClButD,WAAYlF,EAAO2uB,YAErBlrD,KAAK5tB,WACLuuB,OAAOuT,GAET,MAAMztB,EAA4B,CAAC,EACnC,IAAK,MAAMtC,KAAS6b,KAAK4zD,YACvBntE,EAAOtC,EAAM9R,QAAU8R,EAEzB,IAAK,IAAIjM,EAAQ,EAAGA,EAAQ8nB,KAAK+7B,MAAM/pD,QAAQnH,OAAQqN,IAAS,CAC9D,MAAM6sB,EAAIy9B,EAAAA,GAAAA,GAAaA,EAAAA,GAAAA,EAAY8gB,EAAAA,GAAAA,GAAiBprE,EAChD8nB,KAAKk0D,kBAAkBh8E,KACzBg8B,EAAQktB,UAAY7E,EAAO2uB,WAC3Bh3C,EAAQ0+B,SACNttD,EAAc8Y,KAAKl4B,MAAQs8D,EAAAA,GAAAA,KAC3Bz9B,EAAIy9B,EAAAA,GAAAA,KACJA,EAAAA,GAAAA,KAAexiC,KAAKk0D,kBAAkBh8E,GAASsqD,EAAAA,GAAAA,KAC/CA,EAAAA,GAAAA,KAAe0b,EAAAA,GAAAA,EAAc1b,EAAAA,GAAAA,OAGjC,MAAMnwD,EAAS2tB,KAAK+7B,MAAM/pD,QAAQkG,GAC5Bi8E,EAAa1tE,EAAOpU,GAAQ6kC,MAAM8xC,GAClC90E,EAAO,IAAI8sD,EAAAA,EACf,CACE9sD,KAAM,GAAF1P,OAAK6N,EAAM,KAAA7N,OAA0B,iBAAf2vF,EAA0BA,EAAWnjB,QAAQ,GAAKtmC,IAAG,MAC/E5F,EAAGxf,EAAc8Y,KAAKl4B,MACtB6+B,IACAo8B,KAAM,CAAEr7D,KAAMo4E,EAAAA,GAAAA,EAAap3E,MAAO,QAClCu6D,WAAYiiB,EAAAA,GAAAA,EACZliB,UAAWuyB,EAAez7E,EAAQy7E,EAAe9oF,QACjDy2D,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,KAEhBhuC,KAAK5tB,WAEH6hF,IACFj0D,KAAKk0D,kBAAkBh8E,GAAShE,EAAKu2D,QAAQv2B,IAE/ChgC,EAAKysB,OAAOuT,EACd,CACF,CAEAo/C,uBACE,IAAIttF,EAAMkE,OAAOqkF,UACbtoF,EAAMiE,OAAOskF,UAEjB,MAAM,WAAEj6D,GAAeyL,KAAK3uB,MAAK,QAAA+iF,EAAAz6E,UAAA9O,OAJXwpF,EAAM,IAAAllE,MAAAilE,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAND,EAAMC,GAAA36E,UAAA26E,GAK5B,IAAK,MAAMz+B,KAAOw+B,EAChB,IAAK,IAAIh+E,EAAI,EAAGw9E,EAAMh+B,EAAIhrD,OAAQipF,EAAMD,GAAO,EAAGC,EAAMz9E,EAAIw9E,EAAMx9E,EAAIw9E,EAAKC,EAAMz9E,IAAMA,IAAK,CAC1F,MAAMuP,EAASoa,KAAK6W,GAAGxgC,GACnBuP,EAAS2O,EAAa,GAAK3O,EAAS2O,EAAayL,KAAK95B,QAKtDF,EAAM6vD,EAAIx/C,KACZrQ,EAAM6vD,EAAIx/C,IAERpQ,EAAM4vD,EAAIx/C,KACZpQ,EAAM4vD,EAAIx/C,IAEd,CAGF,MAAO,CAAErQ,MAAKC,MAChB,CAEAggC,YACE,MAAMxf,EAASuZ,KAAK4zD,YACpB,IAAI,IAAE5tF,EAAG,IAAEC,GAAQ+5B,KAAKszD,wBAAwB7sE,EAAO/e,KAAKof,GAAMA,EAAEowB,SAOpE,YAN8B,IAAnBlX,KAAK+7B,MAAM/1D,MACpBA,EAAMg6B,KAAK+7B,MAAM/1D,UAEW,IAAnBg6B,KAAK+7B,MAAM91D,MACpBA,EAAM+5B,KAAK+7B,MAAM91D,KAEZ,CAAED,MAAKC,MAChB,CAEAohF,mBAAoB,CAEpB3J,eAAgB,CAEhBkW,YACE,OAAO1vE,GAAAA,EAAAA,QACJ4C,IAAQ,IAAAytE,EAAA,OACPv0D,KAAK+7B,MAAM/pD,QAAQlG,SAASgb,EAAEzU,SAC9ByU,EAAEzB,aAAuB,QAAdkvE,EAAKv0D,KAAK7Y,YAAI,IAAAotE,OAAA,EAATA,EAAWlvE,YAC3B2a,KAAK3uB,MAAMsiB,eAAejN,SAASI,EAAEH,OAAO,GAElD,CAEAm5B,WACE,MAAO,cAAPt7C,OAAqBw7B,KAAK7Y,KAAK9U,OACjC,EACDiuB,GAnLKozD,GAAc,OACJrrC,EAAAA,GAAAA,gBAoLhB,Y,ycClMA,MAAMmsC,WAAkB9/C,EAKtB2oC,cACE,MAAM,cAAE/3D,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAC3BsJ,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASzpC,KAAKzL,WAAajP,EAAc8Y,KAAKl4B,MAC9CwjE,QAASpkD,EAAcoM,IAAIC,SAE7BkrC,EAAUqkB,KAEV,MAAMuT,EAAwBz0D,KAAKmoD,2BAEnC,IAAIvrB,EAAY,EACZ63B,GAAyB,GAC3B73B,EAAY,EACH63B,GAAyB,GAClC73B,EAAY,EACH63B,GAAyB,KAClC73B,EAAY,GAEd,MAAM83B,EAAgB93B,EAAY,EAC5B+3B,EAAuB1qF,KAAKyrC,MAAM++C,EAAwB,EAAIC,GAC9DE,EAAah4B,EAAY,GAAM,EAAI,EAAI,GAC7C58B,KAAKkU,QAAQ1lC,IAAI,YAAaouD,IAE9BwrB,EAAAA,EAAAA,IAAkB,CAChBjkE,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK5tB,UAAUyzB,MACtBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZmiF,gBAAiBA,CAAChyE,EAAWyuB,KAC3B,MAAM+vD,KAAU/vD,EAAI,GAAK8vD,EAWzB,GATA50D,KAAKkU,QAAQ4oB,YACb98B,KAAKkU,QAAQ1lC,IACX,cACAwxB,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAKG,KAAKjR,GAAKkmD,EAAOq1B,cAAgBr1B,EAAOo1B,aAGzE3xD,KAAKkU,QAAQ+oB,OAAO43B,EAAM5qF,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK7Y,KAAKk4D,KAAKhpE,MAC5D2pB,KAAKkU,QAAQgpB,OAAO23B,EAAM5qF,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK7Y,KAAKm4D,IAAIjpE,MAEvDs+E,GAAwB,EAAG,CAC7B,MAAMrtE,EAAOrd,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK7Y,KAAKG,KAAKjR,KAC/C2pB,KAAKkU,QAAQ+oB,OAAO43B,EAAOH,EAAeptE,EAAOstE,GACjD50D,KAAKkU,QAAQgpB,OAAO23B,EAAOH,EAAgBC,EAAsBrtE,EAAOstE,GAExE,MAAM19C,EAAQjtC,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK7Y,KAAK+vB,MAAM7gC,KACjD2pB,KAAKkU,QAAQ+oB,OAAO43B,EAAOH,EAAex9C,EAAQ09C,GAClD50D,KAAKkU,QAAQgpB,OAAO23B,EAAOH,EAAgBC,EAAsBz9C,EAAQ09C,EAC3E,CAEA50D,KAAKkU,QAAQipB,QAAQ,IAIzBN,EAAU6lB,MACZ,CAEA5iC,WACE,MAAO,QAAPt7C,OAAew7B,KAAK7Y,KAAK9U,OAC3B,EACDiuB,GAnEKk0D,GAAS,OACCnsC,EAAAA,GAAAA,WAA0B/nB,GADpCk0D,GAAS,QAEE,QAAMl0D,GAFjBk0D,GAAS,WAGK,iBAkEpB,Y,ycC/DA,MAAM5rC,GAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAW7F,MAAMksC,WAAkBpgD,EAMtBrU,YAAYpyB,EAAiCoD,GAC3CsyB,MAAM11B,EAAQoD,GAAMivB,GAAA,iCAAAA,GAAA,YAHO,CAAC,GAI5BN,KAAKyiC,WAAaziC,KAAKyiC,WAAWn/B,KAAKtD,MACvCA,KAAK+8C,qBAAuB/8C,KAAK+8C,qBAAqBz5C,KAAKtD,MAC3DA,KAAK68C,YAAc78C,KAAK68C,YAAYv5C,KAAKtD,MACzCA,KAAK+0D,kBAAoB,CAAC,CAC5B,CAEA1X,cACE,MAAM,cAAE/3D,EAAa,eAAEquE,GAAmB3zD,KAAK4W,yBACzCimB,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASzpC,KAAKzL,WAAajP,EAAc8Y,KAAKl4B,MAAQ,GACtDwjE,QAASpkD,EAAcoM,IAAIC,OAAS,KAEtCkrC,EAAUqkB,KAEVlhD,KAAKkU,QAAQ4oB,YACb98B,KAAKkU,QAAQ1lC,IAAI,YAAa,GAC9B,IAAK,IAAI0J,EAAQ,EAAGA,EAAQ8nB,KAAK+7B,MAAM/pD,QAAQnH,OAAQqN,IAAS,CAC9D,MAAM7F,EAAS2tB,KAAK+7B,MAAM/pD,QAAQkG,GAClC,IAA0B,MAArB8nB,KAAKg1D,KAAK3iF,GAAkB2tB,KAAKg1D,KAAK3iF,GAAQxH,OAAS,GAAK,EAAG,CAClEm1B,KAAKkU,QAAQ1lC,IAAI,cAAemlF,EAAez7E,EAAQy7E,EAAe9oF,SACtEm1B,KAAKkU,QAAQ4oB,YACb,IAAK,IAAIzmD,EAAI,EAAGw9E,EAAM7zD,KAAK7Y,KAAK+vB,MAAMrsC,OAAQipF,EAAMD,GAAO,EAAGC,EAAMz9E,EAAIw9E,EAAMx9E,EAAIw9E,EAAKC,EAAMz9E,IAAMA,IACjG2pB,KAAKkU,QAAQgpB,OAAOl9B,KAAK6W,GAAGxgC,GAAIpM,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKg1D,KAAK3iF,GAAQgE,MAEvE2pB,KAAKkU,QAAQipB,QACf,CACF,CAEAN,EAAU6lB,MACZ,CAEAjgB,WAAWvuB,GACT,MAAM,cAAE5uB,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAC3BtzC,EAAS,MACb,OAAQ+f,KAAK3uB,MAAM8S,QAAQkB,WACzB,IAAK,IACH,MAAO,QACT,IAAK,IACH,MAAO,SACT,IAAK,IACH,MAAO,UACT,QACE,OAEL,EAXc,GAYT0f,GAAK/E,KAAKrO,OAAS,GAAK,EAC9B,IAAIqvC,EAAAA,EACF,CACE9sD,KAAM+L,EACN6kB,EAAG,GACHC,EAAGzf,EAAcoM,IAAIC,OAASoT,EAC9Bg4B,OAAQ,GACRoE,KAAM,CAAEr7D,KAAM,GAAIkB,OAAQ,MAAON,OAAQ,oBACzC06D,UAAW7E,EAAOmiB,cAClBpd,UAAW2M,EAAAA,GAAAA,OACX1M,aAAcyM,EAAAA,GAAAA,YAEhBhuC,KAAK5tB,WACLuuB,OAAOuT,EACX,CAEAzJ,gBAAgByJ,EAAmC80C,GAAoB,IAAA+K,EACrE,MAAM,cAAEzuE,EAAa,eAAEquE,GAAmB3zD,KAAK4W,0BACzC,OAAE2lB,GAAWj3C,EAAciuC,QAC3BrwC,EAAOyL,EAAAA,GAAAA,sBAA2E,QAAhDolE,EAAC/zD,KAAK7Y,KAAK+hE,kBAAkB,OAAQF,UAAW,IAAA+K,EAAAA,EAAI,GAC5F,IAAIjY,EAAa,GACjB,MAAM1/C,EAAQlZ,EAAKwL,WACb8M,EAAOtY,EAAK64D,cACZ1/C,EAAMnZ,EAAK84D,UACjB,OAAQh8C,KAAK7Y,KAAK9B,WAChB,IAAK,IACL,IAAK,IACHy2D,EAAa,GAAHt3E,OAAMokD,GAAOxsB,GAAM,KAAA53B,OAAI63B,GACjC,MACF,IAAK,IACHy/C,EAAa,GAAHt3E,OAAMokD,GAAOxsB,GAAM,KAAA53B,OAAIg3B,GACjC,MACF,QACE,OAGJ,IAAIy5D,GAAmB,EACvB,IAAK,IAAI/8E,EAAQ,EAAGA,EAAQ8nB,KAAK+7B,MAAM/pD,QAAQnH,OAAQqN,IAAS,CAC9D,MAAM7F,EAAS2tB,KAAK+7B,MAAM/pD,QAAQkG,GAC5Bg9E,EAAal1D,KAAKg1D,KAAK3iF,GAC7B,GAAI6iF,SAAAA,EAAYrqF,OAAQ,CACtBqpC,EAAQktB,UAAY7E,EAAO2uB,WAC3Bh3C,EAAQ0+B,SACNttD,EAAc8Y,KAAKl4B,MAAQs8D,EAAAA,GAAAA,KAC3B2b,EAAAA,GAAAA,GAAYD,EAAAA,GAAAA,EAAciX,EAAAA,GAAAA,IAAaj9E,EAAQsqD,EAAAA,GAAAA,KAC/CA,EAAAA,GAAAA,KAAexiC,KAAK+0D,kBAAkB1iF,GAAUmwD,EAAAA,GAAAA,KAChDA,EAAAA,GAAAA,KAAe0b,EAAAA,GAAAA,EAAc1b,EAAAA,GAAAA,MAE/B,MAAMzf,EAAU74C,OAAOs1E,SAAS0V,EAAWlM,IACrCoM,EAAiBryC,EAAU,GAAHv+C,OAAM0wF,EAAWlM,GAAYhY,QAAQ,GAAE,KAAM,GAC3EikB,EAAmBA,GAAoBlyC,EACvC,IAAIie,EAAAA,EACF,CACE9sD,KAAM,GAAF1P,OAAK6N,EAAM,KAAA7N,OAAI4wF,GACnBtwD,EAAGxf,EAAc8Y,KAAKl4B,MACtB6+B,EAAGo5C,EAAAA,GAAAA,GAAYD,EAAAA,GAAAA,EAAciX,EAAAA,GAAAA,IAAaj9E,EAC1CipD,KAAM,CAAEr7D,KAAMo4E,EAAAA,GAAAA,EAAap3E,MAAO,QAClCs6D,UAAWuyB,EAAez7E,EAAQy7E,EAAe9oF,QACjDy2D,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,KAEhBhuC,KAAK5tB,WACLuuB,OAAOuT,EACX,CACF,CAEI+gD,GACF,IAAIj0B,EAAAA,EACF,CACE9sD,KAAM,GAAF1P,OAAKs3E,EAAU,iBACnBh3C,EAAGxf,EAAc8Y,KAAKl4B,MAAQ,IAC9B6+B,EAAG,GACHo8B,KAAM,CAAEr7D,KAAM,GACds7D,UAAW7E,EAAOroD,KAClButD,WAAYlF,EAAO2uB,YAErBlrD,KAAK5tB,WACLuuB,OAAOuT,EAEb,CAEA6oC,qBAAqB7oC,GACnBvQ,MAAMo5C,qBAAqB7oC,GAC3B,MAAM,cAAE5uB,EAAa,eAAEquE,GAAmB3zD,KAAK4W,yBAE/C,IAAK,IAAI1+B,EAAQ,EAAGA,EAAQ8nB,KAAK+7B,MAAM/pD,QAAQnH,OAAQqN,IAAS,CAC9D,MAAM7F,EAAS2tB,KAAK+7B,MAAM/pD,QAAQkG,GAC5Bg9E,EAAal1D,KAAKg1D,KAAK3iF,GAC7B,GAAI6iF,SAAAA,EAAYrqF,OAAQ,CACtB,MAAMwqF,EAAiBr1D,KAAKg1D,KAAK3iF,GAAQxH,OAAS,EAE5CuqF,EADUlrF,OAAOs1E,SAAS0V,EAAWG,IACV,GAAH7wF,OAAM0wF,EAAWG,GAAgBrkB,QAAQ,GAAE,KAAM,GACzE98D,EAAO,IAAI8sD,EAAAA,EACf,CACE9sD,KAAM,GAAF1P,OAAK6N,EAAM,KAAA7N,OAAI4wF,GACnBtwD,EAAGxf,EAAc8Y,KAAKl4B,MACtB6+B,EAAGo5C,EAAAA,GAAAA,GAAYD,EAAAA,GAAAA,EAAciX,EAAAA,GAAAA,IAAaj9E,EAC1CipD,KAAM,CAAEr7D,KAAMo4E,EAAAA,GAAAA,EAAap3E,MAAO,QAClCs6D,UAAWuyB,EAAez7E,EAAQy7E,EAAe9oF,QACjDy2D,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,KAEhBhuC,KAAK5tB,WAEP4tB,KAAK+0D,kBAAoB,IAAK/0D,KAAK+0D,kBAAmB,CAAC1iF,GAAS6B,EAAKu2D,QAAQv2B,IAC7EhgC,EAAKysB,OAAOuT,EACd,CACF,CACF,CAEAm/C,WAAW,IAAAiC,EACTt1D,KAAKg1D,KAAO,CAAC,EACb,MAAMvuE,EAASuZ,KAAK4zD,YAEd2B,EAAW,IAAI/8E,KAAKwnB,KAAK+7B,MAAMw5B,SAAW,UAC1CC,EAAS,IAAIh9E,KAAKwnB,KAAK+7B,MAAMy5B,OAAS,UACtCC,EAAiB,GACvB,IAAK,MAAMtxE,KAASsC,EAAQ,CAC1B,MAAMivE,EAAS,GACf,IAAK,IAAIr/E,EAAI,EAAGw9E,EAAM1vE,EAAM+yB,MAAMrsC,OAAQipF,EAAMD,GAAO,EAAGC,EAAMz9E,EAAIw9E,EAAMx9E,EAAIw9E,EAAKC,EAAMz9E,IAAMA,IAAK,CAClG,MAAM6M,EAAOyL,EAAAA,GAAAA,sBAA4BxK,EAAMjB,KAAK7M,IAChDk/E,GAAYryE,GAAQA,GAAQsyE,GAC9BE,EAAOljF,KAAK2R,EAAM+yB,MAAM7gC,GAE5B,CACAo/E,EAAejjF,KAAK,CAAEH,OAAQ8R,EAAM9R,OAAQ6kC,MAAOw+C,GACrD,CAEA,MAAMC,EAAyD,QAAhDL,EAAG7T,EAAAA,IAAOgU,GAAiB3uE,GAAMA,EAAEowB,MAAMrsC,gBAAO,IAAAyqF,EAAAA,EAAI,EACnE,IAAK,MAAMnxE,KAASsxE,EAAgB,CAClCz1D,KAAKg1D,KAAK7wE,EAAM9R,QAAU,GAC1B,MAAMykC,EAAQ3yB,EAAM+yB,MAAM,GAC1B,IAAII,EAAS,EACb,GAAIq+C,EAAYxxE,EAAM+yB,MAAMrsC,OAAQ,CAClCysC,EAASq+C,EAAYxxE,EAAM+yB,MAAMrsC,OACjC,IAAK,IAAIwL,EAAI,EAAGq4E,EAAOp3C,EAAQq3C,EAAOD,GAAQ,EAAGC,EAAOt4E,EAAIq4E,EAAOr4E,EAAIq4E,EAAMC,EAAOt4E,IAAMA,IACxF2pB,KAAKg1D,KAAK7wE,EAAM9R,QAAQgE,GAAKq0B,GAEjC,CACA,IAAK,IAAIr0B,EAAI,EAAGu/E,EAAOzxE,EAAM+yB,MAAMrsC,OAAQgrF,EAAOD,GAAQ,EAAGC,EAAOx/E,EAAIu/E,EAAOv/E,EAAIu/E,EAAMC,EAAOx/E,IAAMA,IACpG2pB,KAAKg1D,KAAK7wE,EAAM9R,QAAQilC,EAASjhC,GAAuB,IAAjB8N,EAAM+yB,MAAM7gC,GAAYygC,EAAQ,GAE3E,CACA,MAAM,IAAE9wC,EAAG,IAAEC,GAAQ+5B,KAAKszD,wBAAwB3oF,OAAOC,KAAKo1B,KAAKg1D,MAAMttF,KAAKo9B,GAAM9E,KAAKg1D,KAAKlwD,MAC9F,MAAO,CAAE9+B,MAAKC,MAChB,CAGAqtF,uBACE,IAAIttF,EAAMkE,OAAOqkF,UACbtoF,EAAMiE,OAAOskF,UAEjB,MAAM,WAAEj6D,GAAeyL,KAAK3uB,MAAK,QAAA+iF,EAAAz6E,UAAA9O,OAJXwpF,EAAM,IAAAllE,MAAAilE,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAND,EAAMC,GAAA36E,UAAA26E,GAK5B,IAAK,MAAMz+B,KAAOw+B,EAChB,IAAK,IAAIh+E,EAAI,EAAGw9E,EAAMh+B,EAAIhrD,OAAQipF,EAAMD,GAAO,EAAGC,EAAMz9E,EAAIw9E,EAAMx9E,EAAIw9E,EAAKC,EAAMz9E,IAAMA,IAAK,CAC1F,MAAMuP,EAASoa,KAAK6W,GAAGxgC,GACnBuP,EAAS2O,EAAa,GAAK3O,EAAS2O,EAAayL,KAAK95B,QAKtDF,EAAM6vD,EAAIx/C,KACZrQ,EAAM6vD,EAAIx/C,IAERpQ,EAAM4vD,EAAIx/C,KACZpQ,EAAM4vD,EAAIx/C,IAEd,CAGF,MAAO,CAAErQ,MAAKC,MAChB,CAEA42E,YAAY3oC,GACV,MAAM,cAAE5uB,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAC3BsJ,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,UACAu1B,QAASnkD,EAAc8Y,KAAKl4B,MAC5BwjE,QAASpkD,EAAcoM,IAAIC,SAE7BkrC,EAAUqkB,KACV,MAAMS,EAAQ3hD,KAAK5tB,UAAUyzB,MAAMd,EAAE48C,MAAM,IACrC4R,EAAQvzD,KAAKuiD,WACbruE,EAAO,IAAI8sD,EAAAA,EACf,CACEl8B,EAAG9E,KAAK95B,MAAQ,EAChBi7D,KAAM,CAAEr7D,KAAM,GACds7D,UAAW7E,EAAOroD,KAClBqtD,aAAcyM,EAAAA,GAAAA,QAEhBhuC,KAAK5tB,WAEP,IAAK,MAAMwvE,KAAQD,EAAO,CACxB,MAAM58C,EAAI96B,KAAKyrC,MAAM1V,KAAK2/B,GAAGiiB,IAC7B2R,EAAM/kF,IAAI,CAAEytD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKpE,OAAOuT,GACnChgC,EAAK1F,IAAI,CAAE0F,KAAM0tE,EAAK5Q,QAAQ,GAAIjsC,MAAKpE,OAAOuT,EAChD,CACA2oB,EAAU6lB,MACZ,CAEA3E,cACE,MAAM,cAAEz4D,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAC3BsJ,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,QAASlU,KAAKkU,QACdu1B,QAASzpC,KAAKzL,WAAajP,EAAc8Y,KAAKl4B,MAC9CwjE,QAASpkD,EAAcoM,IAAIC,SAE7BkrC,EAAUqkB,KACV,MAAMhtE,EAAO,IAAI8sD,EAAAA,EACf,CACEj8B,EAAG/E,KAAKrO,OAAS,GACjBwvC,KAAM,CAAEr7D,KAAM,GACds7D,UAAW7E,EAAOroD,KAClBqtD,aAAcyM,EAAAA,GAAAA,OACd1M,UAAW2M,EAAAA,GAAAA,QAEbjuC,KAAK5tB,WAEDywD,EAAY3uD,EAAK1F,IAAI,CAAE0F,KAAM,SAAUu2D,QAAQzqC,KAAKkU,SAE1D,IAAIhxB,EAAO,IAAI1K,KAAyB,IAApBwnB,KAAK7Y,KAAKjE,KAAK,IAC/ByjE,EAAYzjE,EAAKwL,WAAa,IAAMxL,EAAK64D,cAEzC+Z,EAAe,EACnB91D,KAAK7Y,KAAKjE,KAAK/Q,SAAQ,CAACi0D,EAAGluD,KACzB,GAAIA,EAAQ,EACV,OAGF,MAAMgL,EAAO,IAAI1K,KAAS,IAAJ4tD,GAChBhqC,EAAQlZ,EAAKwL,WAAa,IAAMxL,EAAK64D,cACvC3/C,IAAUuqD,GACZmP,IAEFnP,EAAYvqD,CAAK,IAGnB,MAAM25D,KAAwB/1D,KAAK95B,MAAQ28D,GACrCmzB,EAAgBF,EAAeC,EACrC,IAAIE,EAEFA,EADED,GAAiB,EACLC,KAAM,EACXD,GAAiB,EACXlxD,GAAcA,EAAI,GAAM,EAC9BkxD,GAAiB,EACXlxD,GAAcA,EAAI,GAAM,EAC9BkxD,GAAiB,EACXlxD,GAAcA,EAAI,GAAM,EAC9BkxD,GAAiB,EACXlxD,GAAcA,EAAI,GAAM,EAExBA,GAAoB,IAANA,EAG/B5hB,EAAO,IAAI1K,KAAyB,IAApBwnB,KAAK7Y,KAAKjE,KAAK,IAC/ByjE,EAAYzjE,EAAKwL,WAAa,IAAMxL,EAAK64D,cAEzC,MAAM8J,EAAQ7lD,KAAK8lD,WAEnB,IAAK,IAAIzvE,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAKjE,KAAKrY,OAAQwL,IAAK,CAC9C6M,EAAO,IAAI1K,KAAyB,IAApBwnB,KAAK7Y,KAAKjE,KAAK7M,IAC/B,MAAM+lB,EAAQlZ,EAAKwL,WAAa,IAAMxL,EAAK64D,cAC3C,GAAI3/C,IAAUuqD,EAAW,CACvBA,EAAYvqD,EACZ,MAAM0I,EAAI9E,KAAK6W,GAAGxgC,GAClB,GAAIyuB,EAAI9E,KAAKzL,YAAc,IAAMuQ,EAAI9E,KAAKzL,WAAayL,KAAK95B,MAAQ,GAElE,SAIF,GAFA2/E,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOX,KAAKkU,UAEnC+hD,EAAY/yE,EAAKwL,YACpB,SAGFxa,EACG1F,IAAI,CACH0F,KAA0B,IAApBgP,EAAKwL,WAAmBxL,EAAK64D,cAAcj8B,WAAa8I,GAAO1lC,EAAKwL,YAC1EoW,EAAGA,IAEJnE,OAAOX,KAAKkU,QACjB,CACF,CAEA2oB,EAAU6lB,MACZ,CAEAz8C,YACE,OAAOjG,KAAKqzD,UACd,CAEAhM,mBAAoB,CAEpB3J,eAAgB,CAEhBkW,YACE,OAAO1vE,GAAAA,EAAAA,QACJ4C,IAAQ,IAAAytE,EAAA,OACPv0D,KAAK+7B,MAAM/pD,QAAQlG,SAASgb,EAAEzU,SAC9ByU,EAAEzB,aAAuB,QAAdkvE,EAAKv0D,KAAK7Y,YAAI,IAAAotE,OAAA,EAATA,EAAWlvE,YAC3B2a,KAAK3uB,MAAMsiB,eAAejN,SAASI,EAAEH,OAAO,GAElD,CAEAm5B,WACE,MAAO,cAAPt7C,OAAqBw7B,KAAK7Y,KAAK9U,OACjC,EACDiuB,GA5WKw0D,GAAS,OACCzsC,EAAAA,GAAAA,WA6WhB,YC1Xa6tC,GAAevrF,OAAO6xC,OAAO,CACxC,CAAC6L,EAAAA,GAAAA,aAA+B8tC,EAChC,CAAC9tC,EAAAA,GAAAA,YAA8B+tC,EAC/B,CAAC/tC,EAAAA,GAAAA,mBAAqCguC,EACtC,CAAChuC,EAAAA,GAAAA,WAA6BiuC,EAC9B,CAACjuC,EAAAA,GAAAA,iBAAmCkuC,EACpC,CAACluC,EAAAA,GAAAA,gBAAkCmuC,GACnC,CAACnuC,EAAAA,GAAAA,WAA6BouC,GAC9B,CAACpuC,EAAAA,GAAAA,WAA6BquC,I,6dClBzB,MAAMxY,EAAY,CACvByY,IAAK,EACLC,GAAI,EACJC,EAAG,EACHC,EAAG,GACHC,EAAG,GACHC,IAAK,GACLC,KAAM,IAEK3T,EAAc,CACzBsT,GAAI,EACJC,EAAG,EACHC,EAAG,IAEQt0B,EAAU,CACrB00B,KAAM,EACNP,IAAK,EACLC,GAAI,EACJC,EAAG,GAEQ1B,EAAS,CACpByB,GAAI,GAEO9J,EAAe,CAC1B+J,EAAG,GACHC,EAAG,GACHC,EAAG,GACHI,GAAI,GACJH,IAAK,IAEMI,EAAkB,GAClBC,EAAiC,GACjClZ,EAAS,CACpBwY,IAAK,EACLC,GAAI,EACJC,EAAG,EACHC,EAAG,EACHE,IAAK,IAEM5a,EAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAE7F,IAAK7iD,EAAe,SAAfA,GAAe,OAAfA,EAAe,kBAAfA,EAAe,cAAfA,EAAe,cAAfA,EAAe,oBAAfA,EAAe,sBAAfA,CAAe,MAQf7T,EAAU,SAAVA,GAAU,OAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,CAAU,MAYVw4C,EAAiB,SAAjBA,GAAiB,OAAjBA,EAAiB,yBAAjBA,EAAiB,qBAAjBA,EAAiB,gCAAjBA,EAAiB,qBAAjBA,EAAiB,yBAAjBA,EAAiB,sDAAjBA,EAAiB,wCAAjBA,EAAiB,mBAAjBA,EAAiB,yBAAjBA,EAAiB,4CAAjBA,EAAiB,yBAAjBA,EAAiB,2BAAjBA,EAAiB,6BAAjBA,EAAiB,4CAAjBA,EAAiB,gCAAjBA,EAAiB,gCAAjBA,EAAiB,uBAAjBA,EAAiB,mBAAjBA,EAAiB,2BAAjBA,EAAiB,oCAAjBA,EAAiB,qBAAjBA,EAAiB,sCAAjBA,EAAiB,kDAAjBA,EAAiB,sCAAjBA,EAAiB,mEAAjBA,CAAiB,MA4BjB7V,EAAgB,SAAhBA,GAAgB,OAAhBA,EAAgB,kCAAhBA,EAAgB,gCAAhBA,EAAgB,+CAAhBA,EAAgB,8BAAhBA,EAAgB,8BAAhBA,EAAgB,0CAAhBA,EAAgB,yCAAhBA,EAAgB,8BAAhBA,CAAgB,MAWhBz2C,EAAa,SAAbA,GAAa,OAAbA,EAAa,iCAAbA,EAAa,uBAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,2BAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,mBAAbA,EAAa,uBAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,uBAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,uBAAbA,EAAa,qBAAbA,EAAa,yBAAbA,EAAa,yBAAbA,EAAa,yBAAbA,EAAa,uBAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,mBAAbA,CAAa,MA4Bb0lF,EAAW,SAAXA,GAAW,OAAXA,EAAW,2BAAXA,EAAW,qBAAXA,EAAW,iBAAXA,EAAW,mBAAXA,EAAW,mBAAXA,EAAW,qBAAXA,EAAW,qBAAXA,EAAW,uBAAXA,EAAW,iBAAXA,EAAW,mBAAXA,EAAW,mBAAXA,EAAW,6BAAXA,EAAW,mBAAXA,EAAW,mBAAXA,EAAW,qBAAXA,EAAW,mBAAXA,EAAW,iBAAXA,EAAW,qBAAXA,CAAW,MAqBXC,EAAgB,SAAhBA,GAAgB,OAAhBA,EAAgB,iCAAhBA,EAAgB,yBAAhBA,EAAgB,+BAAhBA,CAAgB,MAMhBC,EAAc,SAAdA,GAAc,OAAdA,EAAc,mCAAdA,EAAc,iCAAdA,EAAc,yBAAdA,EAAc,+BAAdA,CAAc,MAOd15D,EAAmB,SAAnBA,GAAmB,OAAnBA,EAAmB,iCAAnBA,EAAmB,yBAAnBA,EAAmB,uCAAnBA,EAAmB,+CAAnBA,EAAmB,6CAAnBA,EAAmB,2CAAnBA,CAAmB,MASxB,MAAM7C,EAAwD,CACnE,CAAC6C,EAAoB25D,WAAY,YACjC,CAAC35D,EAAoB45D,OAAQ,QAC7B,CAAC55D,EAAoB65D,kBAAmB,qBACxC,CAAC75D,EAAoB85D,kBAAmB,qBACxC,CAAC95D,EAAoB+5D,iBAAkB,qBACvC,CAAC/5D,EAAoBg6D,gBAAiB,sBAU3BtmC,EAA0C,CACrD,OAAQ,CAAEQ,QAAS,EAAGhO,KAAM,EAAGnvC,MAAO,GACtC,OAAQ,CAAEm9C,QAAS,EAAGhO,KAAM,EAAGnvC,MAAO,GACtC,OAAQ,CAAEm9C,QAAS,EAAGhO,KAAM,EAAGnvC,MAAO,GACtC,OAAQ,CAAEm9C,QAAS,EAAGhO,KAAM,EAAGnvC,MAAO,GACtC,OAAQ,CAAEm9C,QAAS,EAAGhO,KAAM,EAAGnvC,MAAO,GACtC,OAAQ,CAAEm9C,QAAS,EAAGhO,KAAM,EAAGnvC,MAAO,GACtC,OAAQ,CAAEm9C,QAAS,EAAGhO,KAAM,EAAGnvC,MAAO,GACtC,OAAQ,CACNm9C,QAAS,EACThO,KAAM,EACNnvC,MAAO,EACPs9C,UAAW,CAAC,gBAAiB,gBAAiB,kBAEhD,OAAQ,CACNH,QAAS,EACThO,KAAM,EACNnvC,MAAO,EACPs9C,UAAW,CAAC,gBAAiB,gBAAiB,mBAIrC6D,EAAiB,CAC5B+hC,IAAK,MACLC,KAAM,QAQD,IAAK9tC,EAAS,SAATA,GAAS,OAATA,EAAS,QAATA,EAAS,QAATA,EAAS,QAATA,EAAS,QAATA,EAAS,UAATA,EAAS,UAATA,EAAS,UAATA,EAAS,MAATA,EAAS,QAATA,EAAS,QAATA,EAAS,MAATA,EAAS,MAATA,EAAS,MAATA,CAAS,MAkBd,MAAMyjC,EAA6B,CAACzjC,EAAU+tC,GAAI/tC,EAAUguC,GAAIhuC,EAAUiuC,GAAIjuC,EAAUkuC,IAElF7S,EAA4B,CACvC,CAACr7B,EAAU+tC,IAAK,EAChB,CAAC/tC,EAAUguC,IAAK,EAChB,CAAChuC,EAAUiuC,IAAK,EAChB,CAACjuC,EAAUkuC,IAAK,EAChB,CAACluC,EAAUmuC,KAAM,GACjB,CAACnuC,EAAUouC,KAAM,GACjB,CAACpuC,EAAUquC,KAAM,GACjB,CAACruC,EAAUoT,GAAI,GACf,CAACpT,EAAUsuC,IAAK,IAChB,CAACtuC,EAAUuuC,IAAK,KAGX,IAAKC,EAAa,SAAbA,GAAa,OAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,UAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,UAAbA,CAAa,MAalB,MAAMC,EAAoB,CAC/B,CAACzuC,EAAU+tC,IAAK,GAChB,CAAC/tC,EAAUguC,IAAK,IAChB,CAAChuC,EAAUiuC,IAAK,IAChB,CAACjuC,EAAUkuC,IAAK,IAChB,CAACluC,EAAUmuC,KAAM,IACjB,CAACnuC,EAAUouC,KAAM,IACjB,CAACpuC,EAAUquC,KAAM,KACjB,CAACruC,EAAUoT,GAAI,KACf,CAACpT,EAAUsuC,IAAK,KAChB,CAACtuC,EAAUuuC,IAAK,MAChB,CAACvuC,EAAUkc,GAAI,MACf,CAAClc,EAAU0uC,GAAI,OACf,CAAC1uC,EAAUyxB,GAAI,QAGJkd,EAAU,CACrBC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,UAGH,IAAKt8E,EAA0B,SAA1BA,GAA0B,OAA1BA,EAA0B,kBAA1BA,EAA0B,sBAA1BA,EAA0B,sBAA1BA,EAA0B,sBAA1BA,EAA0B,wBAA1BA,EAA0B,sBAA1BA,EAA0B,sBAA1BA,EAA0B,0BAA1BA,EAA0B,wBAA1BA,CAA0B,MAY1B4wD,EAAS,SAATA,GAAS,OAATA,EAAS,YAATA,EAAS,cAATA,EAAS,gBAATA,EAAS,cAATA,EAAS,UAATA,CAAS,MAQTD,EAAY,SAAZA,GAAY,OAAZA,EAAY,UAAZA,EAAY,2BAAZA,EAAY,gBAAZA,EAAY,wBAAZA,EAAY,mCAAZA,EAAY,gBAAZA,CAAY,MASZloC,EAAS,SAATA,GAAS,OAATA,EAAS,gBAATA,EAAS,wBAATA,EAAS,0BAATA,CAAS,MAMT8zD,EAAwB,SAAxBA,GAAwB,OAAxBA,EAAAA,EAAwB,uBAAxBA,EAAAA,EAAwB,kBAAxBA,EAAAA,EAAwB,mBAAxBA,EAAAA,EAAwB,6CAAxBA,CAAwB,MAO7B,MAAMxsC,EAA8B,GAE9BysC,EAAa,CACxB,CAAC/zD,EAAUg0D,QAAS,SACpB,CAACh0D,EAAUi0D,YAAa,aACxB,CAACj0D,EAAUk0D,aAAc,eAGdzhC,EAAsB,CACjCvxC,MAAO,IACPixC,UAAW,KAGAgiC,EAAyB,GAEzBxvC,EAAsB,IAEtBD,EAA+B,IAE/B0vC,EAAmB,CAAC,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,OAE/Dzb,EAAqBp5D,IAChC,OAAQA,GACN,KAAK6kC,EAAU+tC,GACb,MAAO,QACT,KAAK/tC,EAAUguC,GACb,MAAO,QACT,KAAKhuC,EAAUiuC,GACb,MAAO,QACT,KAAKjuC,EAAUkuC,GACb,MAAO,QACT,KAAKluC,EAAUmuC,IACb,MAAO,SACT,KAAKnuC,EAAUouC,IACb,MAAO,SACT,KAAKpuC,EAAUquC,IACb,MAAO,SACT,KAAKruC,EAAUoT,EACb,MAAO,OACT,KAAKpT,EAAUsuC,GACb,MAAO,OACT,KAAKtuC,EAAUuuC,GACb,MAAO,OACT,KAAKvuC,EAAUkc,EACb,MAAO,QACT,KAAKlc,EAAU0uC,EACb,MAAO,SACT,KAAK1uC,EAAUyxB,EACb,MAAO,UACT,QACE,MAAO,GACX,EAoBK,IAAKvzB,EAAwB,SAAxBA,GAAwB,OAAxBA,EAAwB,MAAxBA,EAAwB,MAAxBA,EAAwB,QAAxBA,EAAwB,QAAxBA,EAAwB,QAAxBA,EAAwB,MAAxBA,EAAwB,MAAxBA,CAAwB,MAYxBj+C,EAAc,SAAdA,GAAc,OAAdA,EAAc,kBAAdA,EAAc,cAAdA,EAAc,YAAdA,EAAc,cAAdA,EAAc,gBAAdA,CAAc,MASnB,MAAMkjE,EAAsB,CACjC,CAACnjB,EAAU+tC,IAAK,CACd9qB,MAAO,EACPC,MAAOjjE,EAAegwF,SAExB,CAACjwC,EAAUguC,IAAK,CACd/qB,MAAO,EACPC,MAAOjjE,EAAegwF,SAExB,CAACjwC,EAAUiuC,IAAK,CACdhrB,MAAO,EACPC,MAAOjjE,EAAegwF,SAExB,CAACjwC,EAAUkuC,IAAK,CACdjrB,MAAO,EACPC,MAAOjjE,EAAegwF,SAExB,CAACjwC,EAAUmuC,KAAM,CACflrB,MAAO,GACPC,MAAOjjE,EAAegwF,SAExB,CAACjwC,EAAUouC,KAAM,CACfnrB,MAAO,GACPC,MAAOjjE,EAAegwF,SAExB,CAACjwC,EAAUquC,KAAM,CACfprB,MAAO,GACPC,MAAOjjE,EAAegwF,SAExB,CAACjwC,EAAUoT,GAAI,CACb6P,MAAO,EACPC,MAAOjjE,EAAeq8E,OAExB,CAACt8B,EAAUsuC,IAAK,CACdrrB,MAAO,EACPC,MAAOjjE,EAAeq8E,OAExB,CAACt8B,EAAUuuC,IAAK,CACdtrB,MAAO,EACPC,MAAOjjE,EAAeq8E,OAExB,CAACt8B,EAAUkc,GAAI,CACb+G,MAAO,EACPC,MAAOjjE,EAAeiwF,MAExB,CAAClwC,EAAU0uC,GAAI,CACbzrB,MAAO,EACPC,MAAOjjE,EAAekwF,OAExB,CAACnwC,EAAUyxB,GAAI,CACbxO,MAAO,EACPC,MAAOjjE,EAAey+C,SAIb19C,EAAuBP,OAAOC,KAAKyiE,GAAqClhE,QACnF,CAACmuF,EAAMC,KAAS,IACXD,EACH,CAACjtB,EAAoBktB,GAAMntB,OAAQktB,EAAKjtB,EAAoBktB,GAAMntB,OAC9D,IAAIktB,EAAKjtB,EAAoBktB,GAAMntB,OAAQC,EAAoBktB,GAAMptB,OACrE,CAACE,EAAoBktB,GAAMptB,UAEjC,CAAC,GAYI,IAAK9kC,EAAe,SAAfA,GAAe,OAAfA,EAAAA,EAAe,qCAAfA,EAAAA,EAAe,qCAAfA,EAAAA,EAAe,6BAAfA,EAAAA,EAAe,aAAfA,CAAe,MAOpB,MAAM2lB,EAAoB,kBAGpBwsC,EAA8B,G,2JCrepC,SAAS7iE,EAAkC1zB,GAM/C,IAAAyoB,EAAA+tE,EAAA,IANgD,WACjDxtE,EAAU,UACVhE,GAIDhlB,EACC,MAAMkoC,GAAsBuuD,EAAAA,EAAAA,mBACtBjlF,GAAWmV,EAAAA,EAAAA,gBACVxG,EAAYu2E,GAAiBt2F,IAAAA,UAAe,GAC7CmP,GAAmByZ,aAAU,EAAVA,EAAY0G,iBAAkB,KACjD/G,EAA0F,QAAhFF,EAAGlZ,aAAgB,EAAhBA,EAAkB0Z,eAAetQ,WAAWoK,GAAUiG,EAAY2H,IAAI5N,YAAO,IAAA0F,EAAAA,GAAK,GAC/F,gBAAE2pC,IAAoBC,EAAAA,EAAAA,GAAsB,CAAE9iD,mBAAkBoZ,eAChExP,EAAyE,QAA/Cq9E,EAAGjnF,aAAgB,EAAhBA,EAAkB4J,kCAA0B,IAAAq9E,EAAAA,EAAIp9E,EAAAA,GAAAA,QAE7Eia,EAAajzB,IAAAA,SAAc,KAC/B,IAAK4oB,EAAY,OAAO,IAAIzU,KAC5B,MAAM2L,EAAQ8I,EAAW9I,QACzB,OAAOy2E,EAAAA,EAAAA,IAAsBz2E,EAAMjB,KAAKiB,EAAMjB,KAAKrY,OAAS,GAAG,GAC9D,CAACoiB,IAEEsK,EAAgClzB,IAAAA,aACpCgU,IAAuE,IAAtE,OAAEhG,EAAM,UAAEgT,EAAS,UAAEY,GAA4C5N,EAChE,OAAI+E,IAA+BC,EAAAA,GAAAA,UAC1Bg5C,EAAgB,CACrBhkD,OAAQA,EACRgT,UAAWA,EACXY,UAAWA,KAIR40E,EAAAA,EAAAA,mCAAkC,CACvC5xE,YACAxI,SAAUhL,EAASgL,SACnB4E,UAAWA,EACXY,UAAWA,EACX6H,YAAagtE,EAAAA,aAAa19E,IAC1B,GAEJ,CAACi5C,EAAiBptC,EAAW7L,EAA4B3H,EAASgL,WAkEpE,MAAO,CACL6W,aACAC,gCACAC,wBAlE+BvO,IAC/B8xE,EAAAA,EAAAA,IAA2B,CACzB9xE,YACA+xE,aAAeC,GAAc1jE,EAA8B,CAAElS,UAAW41E,EAAU92F,MAAO8hB,UAAW,SAgEtGwR,wBA7D8B5a,IAAA,IAAC,UAC/BoM,EAAS,YACTwP,EAAW,WACXzY,GAKDnD,EAAA,OACCq+E,EAAAA,EAAAA,4BAA2B,CACzBjyE,YACAwP,cACAzY,aACAg7E,aAAe/0E,GACbsR,EAA8B,CAAElS,UAAWY,EAAUZ,UAAYY,UAAWA,EAAU9hB,SACxF,EA+CFigB,aACAsT,gCA9CsCniB,UACtC,GAA6B,OAAzB4lF,EAAeh3F,MAAgB,CACjC,MAAM,UAAEkhB,EAAS,OAAEhT,EAAM,WAAE2N,EAAU,UAAE0V,EAAS,YAAEC,IAAgB1I,aAAU,EAAVA,EAAY9I,UAAW,CAAC,EACpFyR,IAAa3I,UAAAA,EAAY4I,kBAC/B,KAAKyB,GAAetX,GAAe3N,GAAWgT,GAAc81E,EAAeh3F,OAAO,OAAO,EACzFw2F,GAAc,GACd,MAAMx2E,QAAcD,EAAAA,EAAAA,IAAU,CAC5B7R,SACA2N,aACAqF,UAAW81E,EAAe91E,UAC1B3G,QAAS,CACPgX,YACAC,cACAC,WACAO,eAAiBhS,QAA2BvO,IAAjBuO,EAAMwC,OACjCyP,2BAA2B,KAG/BukE,GAAc,GAEd,MAAM,iBAAEniD,IAAqB4iD,EAAAA,EAAAA,IAAqB,KAC7CC,EAAAA,EAAAA,IAAsB,CAAEp1E,UAAWk1E,EAAeh3F,MAAOggB,UAC5DA,QACA8B,UAAWk1E,EAAeh3F,QAE5B,GAAyB,IAArBq0C,EASF,OARArM,EAAoBj7B,KAClB7M,IAAAA,cAAC+nC,EAAAA,aAAY,CAACC,QAAS,GAAIivD,YAAa,KACtCj3F,IAAAA,cAACuB,EAAAA,UAAS,CAACJ,UAAU,iBAAgB,oFAMlC,CAEX,CACA,OAAO,CAAI,EAWf,C,gICtIO,SAAS8wD,EAAqBryD,GAMlC,IALDuP,iBAAkB+nF,EAAyB,WAC3C3uE,GAAa,GAId3oB,EACC,MAAMwR,GAAWmV,EAAAA,EAAAA,eACXpX,GAAmBsF,EAAAA,EAAAA,GAAcyiF,EAA2B,CAChExiF,gBAAiB,CAAC,oBAEdyiF,EAAqBn3F,EAAAA,SACzB,MAAQmP,UAAAA,EAAkBmjD,qBAAqB8kC,EAAAA,GAAAA,aAE/C,CAACjoF,aAAgB,EAAhBA,EAAkBkoF,iBAEfC,EAAkBt3F,EAAAA,SACtB,MAAQmP,UAAAA,EAAkBmjD,qBAAqB8kC,EAAAA,GAAAA,UAE/C,CAACjoF,aAAgB,EAAhBA,EAAkBkoF,iBAgErB,MAAO,CAAErlC,gBA7DehyD,EAAAA,aACtBgU,IAUM,IAAA6wC,EAAA0yC,EAAAzyC,EAAAC,EAAAE,EAAA,IAVL,OACCj3C,EAAM,UACNgT,EAAS,UACTY,EAAS,OACTT,GAMDnN,EACC,IAAK7E,EACH,MAAO,CACLiN,SAAUhL,EAASgL,SACnB6B,OAAQ,IAIZ,MAAMymC,GAAgBvnC,EAAAA,EAAAA,GAAyC/L,EAAS6M,SAClE,MAAEzN,GAAU28C,EAAAA,GAAShsC,QAAAA,EAAUhS,EAAiBgS,QAChDwJ,EAAwC,QAA9Bk6B,EAAkB,QAAlB0yC,EAAG7yC,EAAc5oC,SAAC,IAAAy7E,OAAA,EAAfA,EAAiBv1E,MAAM,YAAI,IAAA6iC,EAAAA,EAAI,GAC5C2yC,EAA2C,QAA9B1yC,EAAkB,QAAlBC,EAAGL,EAAc3oC,SAAC,IAAAgpC,OAAA,EAAfA,EAAiB/iC,MAAM,YAAI,IAAA8iC,EAAAA,EAAI,GAC/C2yC,EAA+B,QAAlBxyC,EAAGP,EAAcpxC,SAAC,IAAA2xC,OAAA,EAAfA,EAAiBjjC,MAAM,KAEvC01E,EAAyB5sE,MAAM7lB,KAAK,CAAEuB,OAAQgK,IAC9C7C,EAAU+pF,EACbr0F,KAAI,CAAC+W,EAAGvG,KAAU,IAAA8jF,EACjB,MAAMC,EAAiC,QAApBD,EAAGhtE,EAAW9W,UAAM,IAAA8jF,EAAAA,EAAIhtE,EAAWA,EAAWnkB,OAAS,GAC1E,OAAQ+hB,IAAe1U,GAASyjF,IAAoBtpF,EAASA,EAAS4pF,CAAa,IAEpFtmF,KAAK,KACFumF,EAAaH,EAChBr0F,KAAI,CAAC+W,EAAGvG,KAAU,IAAAikF,EACjB,MAAMC,EAAuC,QAAvBD,EAAGN,EAAc3jF,UAAM,IAAAikF,EAAAA,EAAIN,EAAcA,EAAchxF,OAAS,GACtF,OAAQ+hB,IAAe1U,GAASsjF,IAAuBn2E,EAAYA,EAAY+2E,CAAgB,IAEhGzmF,KAAK,KACFghB,EAASolE,EACZr0F,KAAI,CAAC+W,EAAGvG,KAAU,IAAAmkF,EACjB,MAAMC,EAAmBR,EACD,QADcO,EAClCP,EAAc5jF,UAAM,IAAAmkF,EAAAA,EAAIP,EAAcA,EAAcjxF,OAAS,QAC7D+K,EACJ,OAAQgX,IAAe1U,IAASsjF,QAAqC5lF,IAAdqQ,EAAsCq2E,EAAZr2E,CAA4B,IAE9GtQ,KAAK,KAER,MAAO,CACL8K,SAAUhL,EAASgL,SACnB6B,OAAQ,IAAF9d,QAAMqjB,EAAAA,EAAAA,GAAkB,CAC5B1H,EAAGnO,EACHoO,EAAG87E,EACHvkF,EAAGgf,EAAOtQ,MAAM,KAAKlb,KAAKye,SAAW+M,OAAS/gB,EAC9CU,EAAGkP,QAAAA,EAAUhS,EAAiBgS,OAC9B+2E,SAASv8C,EAAAA,EAAAA,WAAwBpqC,EAAYmzC,EAAcwzC,WAE9D,GAEH,CAAC/oF,EAAkBoZ,EAAYnX,EAAUkmF,EAAiBH,IAI9D,C,2HC7EO,SAAST,EAA0B92F,GAMvC,IANwC,UACzCglB,EAAS,aACT+xE,GAID/2F,EACC,OAAOu4F,EAAAA,EAAAA,oBAAmBvzE,GAAWvhB,KAAK+0F,IAA+B,CACvEv4F,MAAOu4F,EAAev4F,MACtBg4F,WAAYO,EAAeP,WAAWx0F,KAAKuzF,IAAS,IAC/CA,EACHt4E,KAAMq4E,EAAaC,UAGzB,CAEO,IAAK/vE,EAAmB,SAAnBA,GAAmB,OAAnBA,EAAmB,sCAAnBA,EAAmB,0BAAnBA,EAAmB,YAAnBA,EAAmB,YAAnBA,EAAmB,wBAAnBA,EAAmB,sCAAnBA,CAAmB,MASnBwxE,EAAkB,SAAlBA,GAAkB,OAAlBA,EAAkB,QAAlBA,EAAkB,MAAlBA,EAAkB,MAAlBA,EAAkB,MAAlBA,EAAkB,QAAlBA,EAAkB,QAAlBA,CAAkB,MASvB,MAAM1xE,EAAuB,CAClC,CAAC0xE,EAAmBC,IAAKzxE,EAAoB0xE,kBAC7C,CAACF,EAAmB32E,GAAImF,EAAoBwtC,YAC5C,CAACgkC,EAAmBpmF,GAAI4U,EAAoB2tC,KAC5C,CAAC6jC,EAAmBG,GAAI3xE,EAAoB4tC,KAC5C,CAAC4jC,EAAmBI,IAAK5xE,EAAoBytC,WAC7C,CAAC+jC,EAAmBK,IAAK7xE,EAAoB0tC,mBAGlCvtC,EAAuB,CAClC,CAACH,EAAoB0xE,mBAAoBF,EAAmBC,GAC5D,CAACzxE,EAAoBwtC,aAAcgkC,EAAmB32E,EACtD,CAACmF,EAAoB2tC,MAAO6jC,EAAmBpmF,EAC/C,CAAC4U,EAAoB4tC,MAAO4jC,EAAmBG,EAC/C,CAAC3xE,EAAoBytC,YAAa+jC,EAAmBI,GACrD,CAAC5xE,EAAoB0tC,mBAAoB8jC,EAAmBK,IAGjDzxE,EAAgB,CAC3B,CAAEQ,SAAU,iBAAkB3nB,MAAO+mB,EAAoBwtC,YAAax0D,MAAO,UAC7E,CAAE4nB,SAAU,gBAAiB3nB,MAAO+mB,EAAoB2tC,KAAM30D,MAAO,QACrE,CAAE4nB,SAAU,gBAAiB3nB,MAAO+mB,EAAoB4tC,KAAM50D,MAAO,QACrE,CAAE4nB,SAAU,kBAAmB3nB,MAAO+mB,EAAoB0tC,kBAAmB10D,MAAO,iBACpF,CAAE4nB,SAAU,sBAAuB3nB,MAAO+mB,EAAoBytC,WAAYz0D,MAAO,gBAGtEqnB,EAAmB,CAC9B,CAAEO,SAAU,iBAAkB3nB,MAAO,oBAAqBD,MAAO,mBACjE,CAAE4nB,SAAU,iBAAkB3nB,MAAO+mB,EAAoBwtC,YAAax0D,MAAO,wBAE1EonB,EAAcxR,QAAQjS,GAASA,EAAK1D,QAAU+mB,EAAoBwtC,eAG1DttC,EAA0B,CAAC,oBAAqB,cAAe,O,mGC/E5E,MAAM4xE,EAAc,CAAC,EACRhiE,EAAyB,GAItC,SAASiiE,EAAoB10F,GAC3B,MAAO,GAAP/D,OAAU+D,EAAM2xB,UAAS,KAAA11B,OAAI+D,EAAMgI,MAAK,KAAA/L,OAAI+D,EAAMkG,MACpD,CA4BO,SAASyuF,EAAwB30F,GACtC,MAAM4f,EAAW80E,EAAoB10F,GACrC,OAAOy0F,EAAY70E,EACrB,CAPsB,oBAAXnV,QAbTrI,OAAOsD,OAAO8sB,EAAAA,IAAsB5oB,SAASgrF,IAC3CxyF,OAAOsD,OAAO6vB,EAAAA,IAAqB3rB,SAAS+nB,IAC1CvvB,OAAOsD,OAAO69C,EAAAA,IAAO35C,SAAS5B,KAXpCgF,eAAkChN,GAChC,MAAM4f,EAAW80E,EAAoB10F,GAC/B60F,EAAUnjE,EAAAA,EAAoB1xB,EAAM2xB,WAAW,IAAK3xB,EAAOrC,MAAO80B,IAClEqiE,EAAM,IAAIC,MAChBD,EAAIr2C,IAAM,sBAAHxiD,OAAyB+4F,mBAAmBH,IACnDJ,EAAY70E,GAAYk1E,CAC1B,CAMaG,CAAmB,CACtBtjE,YACAzrB,MAAO0uF,EACP5sF,SACA,GACF,GACF,G,iFCxBC,SAASktF,EAA6Bx5F,GAKK,IALJ,MAC5CsM,EAAQu7C,EAAAA,GAAAA,MAAW,MACnBr9C,EAAQssB,EAAAA,GAAAA,QAA4B,MACpC70B,EAAK,SACLw3F,GAAW,GACmCz5F,EAC9C,MAAM,YAAE05F,EAAW,YAAEC,EAAW,UAAEC,EAAS,SAAEC,IAAaC,EAAAA,EAAAA,IAAyB,CACjFxtF,QACA9B,QACA0gF,QAAQ6O,EAAAA,EAAAA,IAAwBN,EAAW,SAAW,UAMxD,MAAO,qHAAPl5F,OAIa0B,EAAK,qBAAA1B,OACJ0B,EAAK,2GAAA1B,OAG+Cm5F,EAAW,YAAAn5F,OAAWm5F,EAAW,sEAAAn5F,OACvCq5F,EAAS,wEAAAr5F,OACPo5F,EAAW,yIAAAp5F,OACkBs5F,EAAQ,uBAGrG,CC7BO,MAAM7jE,EAAsBtvB,OAAO6xC,OAAO,CAC/C,CAAC1e,EAAAA,GAAAA,OCDI,SAAoC75B,GAIjB,IAJkB,MAC1CsM,EAAQu7C,EAAAA,GAAAA,MAAW,MACnBr9C,EAAQssB,EAAAA,GAAAA,QAA4B,MACpC70B,GACsBjC,EACtB,MAAM,YAAE05F,EAAW,YAAEC,EAAW,UAAEC,EAAS,SAAEC,IAAaC,EAAAA,EAAAA,IAAyB,CACjFxtF,QACA9B,QACA0gF,QAAQ6O,EAAAA,EAAAA,IAAwB,YAMlC,MAAO,qHAAPx5F,OAIa0B,EAAK,qBAAA1B,OACJ0B,EAAK,8GAAA1B,OAGkDm5F,EAAW,YAAAn5F,OAAWm5F,EAAW,sEAAAn5F,OAC1Cq5F,EAAS,wEAAAr5F,OACPo5F,EAAW,i1BAAAp5F,OAI3Ds5F,EAAQ,8BAIxB,ED9BE,CAAChgE,EAAAA,GAAAA,WEFI,SAAwC75B,GAIrB,IAJsB,MAC9CsM,EAAQu7C,EAAAA,GAAAA,MAAW,MACnBr9C,EAAQssB,EAAAA,GAAAA,QAA4B,MACpC70B,GACsBjC,EACtB,MAAM,YAAE05F,EAAW,YAAEC,EAAW,UAAEC,EAAS,SAAEC,IAAaC,EAAAA,EAAAA,IAAyB,CACjFxtF,QACA9B,QACA0gF,QAAQ6O,EAAAA,EAAAA,IAAwB,UAMlC,MAAO,qHAAPx5F,OAIa0B,EAAK,qBAAA1B,OACJ0B,EAAK,8GAAA1B,OAGkDm5F,EAAW,YAAAn5F,OAAWm5F,EAAW,sEAAAn5F,OAC1Cq5F,EAAS,wEAAAr5F,OACPo5F,EAAW,6ZAAAp5F,OAI3Ds5F,EAAQ,8BAIxB,EF7BE,CAAChgE,EAAAA,GAAAA,kBGHI,SAA+C75B,GAI5B,IAJ6B,MACrDsM,EAAQu7C,EAAAA,GAAAA,MAAW,MACnBr9C,EAAQssB,EAAAA,GAAAA,QAA4B,MACpC70B,GACsBjC,EACtB,MAAM,YAAE05F,EAAW,YAAEC,EAAW,UAAEC,EAAS,SAAEC,IAAaC,EAAAA,EAAAA,IAAyB,CACjFxtF,QACA9B,QACA0gF,QAAQ6O,EAAAA,EAAAA,IAAwB,WAMlC,MAAO,qHAAPx5F,OAIa0B,EAAK,qBAAA1B,OACJ0B,EAAK,qOAAA1B,OAKHm5F,EAAW,qBAAAn5F,OACbm5F,EAAW,oMAAAn5F,OAKXq5F,EAAS,uBAAAr5F,OACPo5F,EAAW,4GAAAp5F,OAEgEs5F,EAAQ,uBAGrG,EHhCE,CAAChgE,EAAAA,GAAAA,kBIJI,SAA+C75B,GAI5B,IAJ6B,MACrDsM,EAAQu7C,EAAAA,GAAAA,MAAW,MACnBr9C,EAAQssB,EAAAA,GAAAA,QAA4B,MACpC70B,GACsBjC,EACtB,MAAM,YAAE05F,EAAW,YAAEC,EAAW,UAAEC,EAAS,SAAEC,IAAaC,EAAAA,EAAAA,IAAyB,CACjFxtF,QACA9B,QACA0gF,QAAQ6O,EAAAA,EAAAA,IAAwB,SAMlC,MAAO,qHAAPx5F,OAIa0B,EAAK,qBAAA1B,OACJ0B,EAAK,8NAAA1B,OAKHm5F,EAAW,qBAAAn5F,OACbm5F,EAAW,uMAAAn5F,OAKXq5F,EAAS,uBAAAr5F,OACPo5F,EAAW,4GAAAp5F,OAEgEs5F,EAAQ,uBAGrG,EJ/BE,CAAChgE,EAAAA,GAAAA,iBKVI,SAA+CkzB,GACpD,OAAOysC,EAA8B,IAAKzsC,EAAM0sC,UAAU,GAC5D,ELSE,CAAC5/D,EAAAA,GAAAA,gBMXI,SAA8CkzB,GACnD,OAAOysC,EAA8B,IAAKzsC,EAAM0sC,UAAU,GAC5D,G,iJC6BO,IAAK3iE,EAAoB,SAApBA,GAAoB,OAApBA,EAAoB,kBAApBA,EAAoB,cAApBA,EAAoB,oBAApBA,CAAoB,MAoCzB,SAASgjE,EAAwB95F,GAAsD,IAArD,MAAEsM,EAAK,MAAE9B,EAAK,OAAE0gF,GAAmClrF,EAC1F,MAAO,CACL05F,YAAaxO,EAAO5+E,GAAOotF,YAC3BC,YAAazO,EAAO5+E,GAAOqtF,YAC3BC,UAAW1O,EAAO5+E,GAAOstF,UAAUpvF,GACnCqvF,SAAU3O,EAAO5+E,GAAOutF,SAASrvF,GAErC,CAEO,SAASisB,EACdujE,GAKA,IAJAC,EAAqBvkF,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,IAAAA,UAAA,GACrB+E,EAAmB/E,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,CACpByiB,MAAO,SAGT,MAAM+hE,EAAaxvE,EAAAA,GAAAA,sBAA4BsvE,GAEzCzX,EAAQ2X,EAAWliB,WACnBmiB,GAAgBC,EAAAA,EAAAA,IAAqBF,EAAYz/E,GAEvD,GAAIw/E,EAAuB,CACzB,IAAII,EAAS,GAQb,OANI9X,GAAS,EACX8X,EAAS,MACA9X,GAAS,KAClB8X,EAAS,OAGJ,GAAP95F,OAAU45F,EAAa,KAAA55F,OAAI85F,EAC7B,CAEA,OAAOF,CACT,CAEO,SAASvjE,EAAiBxiB,GAQ9B,IAR+B,MAChClU,EAAK,cACL84B,EAAa,iBACbhB,EAAmB,GAKpB5jB,EACKkmF,EAAe,GACfD,EAAS,GAEb,QAAsB1oF,IAAlBqnB,EACFshE,EAAehxE,EAAAA,GAAAA,MAAW,CAAEppB,QAAOowD,eAAgB,QAC9C,CACL,MAAMiqC,EAAYjxE,EAAAA,GAAAA,gBAAqBppB,EAAQs6F,EAAAA,GAAkBxhE,GAAgB,EAAGC,EAAAA,GAAAA,SACpFqhE,EAAe51F,WAAW61F,EAAU1X,UAAU,EAAG0X,EAAU3zF,OAAS,IAAIi1C,WACxEw+C,EAASE,EAAU1X,UAAU0X,EAAU3zF,OAAS,EAClD,CAEA,MAAO6zF,EAAaC,GAAiBJ,EAAal4E,MAAM,KAExD,QAAsBzQ,IAAlB+oF,EAA6B,MAAO,GAAPn6F,OAAUk6F,GAAWl6F,OAAG85F,GAEzD,IAAIM,EAAyBD,EAK7B,OAJyB,IAArB1iE,GAAsE,MAA5C0iE,EAAcA,EAAc9zF,OAAS,KACjE+zF,EAAyBD,EAAc70F,MAAM,GAAI,IAG5C,GAAPtF,OAAU,CAACk6F,EAAaE,GAAwBjpF,KAAK,MAAInR,OAAG85F,EAC9D,CAEO,SAASN,EAAwBxO,GACtC,MAAO,CACLqP,MAAO,CACLlB,YAAamB,IAAAA,MACblB,YAAakB,IAAStP,GAAU,KAChCqO,UAAW,CACTj1E,QAASk2E,IAAStP,GAAU,IAC5BuP,MAAOD,IAAStP,GAAU,KAC1B/nF,SAAUq3F,IAAStP,GAAU,MAE/BsO,SAAU,CACRl1E,QAASk2E,IAAStP,GAAU,KAC5BuP,MAAOD,IAAStP,GAAU,KAC1B/nF,SAAUq3F,IAAAA,QAGdE,KAAM,CACJrB,YAAamB,IAAAA,KAAAA,KACblB,YAAakB,IAAStP,GAAU,KAChCqO,UAAW,CACTj1E,QAASk2E,IAAStP,GAAU,KAC5BuP,MAAOD,IAAStP,GAAU,KAC1B/nF,SAAUq3F,IAAStP,GAAU,MAE/BsO,SAAU,CACRl1E,QAASk2E,IAAAA,MACTC,MAAOD,IAAAA,MACPr3F,SAAUq3F,IAAAA,QAIlB,C,uDCzKO,MAAMhyE,EAA2B,CACtC5E,SAAUA,IAAM,sDAChBC,SAAU,iB,wSCQL,IAAK82E,EAAyB,SAAzBA,GAAyB,OAAzBA,EAAyB,cAAzBA,EAAyB,YAAzBA,CAAyB,MAK9B,MACMC,EAA6B,IAInC,SAASC,EAAmBl5E,GACjC,OAAOA,EAAUI,MAAM64E,EACzB,C,cCyBO,MAAM9D,EAAuBn3F,IAA6D,IAA5D,MAAEwqF,EAAK,IAAEoF,EAAG,MAAE1vE,EAAK,UAAE8B,GAAkChiB,EAC1F,MAAMm7F,EAAa3Q,EAAQA,EAAM4Q,UAAY,IAAO,EAC9CC,EAAWzL,EAAIwL,UAAY,IAE3BE,EAAqBp7E,EAAMjB,KAAKrY,OAAS,EAC/C,IAAI20F,EAAsBD,EACtB/mD,EAAmB,EACvB,GACE,CAACkgD,EAAAA,GAAAA,GAAkBA,EAAAA,GAAAA,IAAkB5sF,SAASma,IAC9C9B,EAAMnE,aAAeM,EAAAA,GAAAA,MAErBk4B,EAAmBr0B,EAAMgiE,sBACpB,CACL,IAAIsZ,GAAwB,EAY5B,GAXAD,GAAuB,EACvBr7E,EAAMjB,KAAK/Q,SAAQ,CAACutF,EAAWxnF,KAZLwnF,IAAsBA,GAAaN,GAAcM,GAAaJ,EAalFK,CAAmBD,MACS,IAA1BD,IACFA,EAAuBvnF,GAEzBsnF,EAAsBtnF,EACxB,IAEFsgC,EAAmBgnD,EAAsBC,EAAuB,GAElC,IAA1BA,IAAwD,IAAzBD,EACjC,MAAO,CAAEhnD,iBAAkB,EAAGonD,gBAAiB,EAEnD,CAEA,MAAO,CAAEpnD,mBAAkBonD,gBAAiBL,EAAqBC,EAAqB,EAG3EK,EAA4BxnF,IAON,IAPO,kBACxCkgC,EAAiB,MACjBk2C,EAAK,IACLoF,EAAG,MACH1vE,EAAK,WACL8I,EAAU,kBACV6yE,GAC4BznF,EAC5B,MAAM,iBAAEmgC,EAAgB,gBAAEonD,GAAoBxE,EAAqB,CACjE3M,QACAoF,MACA1vE,QACA8B,UAAWgH,EAAWhH,YAExB,GAAyB,IAArBuyB,EACF,MAAO,CAAErV,WAAYlW,EAAWkW,WAAY5O,WAAYtH,EAAWsH,YAGrE,MAAMxiB,EAAckb,EAAW0G,eACzBwP,GAAamV,EAAAA,EAAAA,IAA8B,CAC/CvmC,cACAwmC,oBACAC,iBAAkBsnD,QAAAA,EAAqBtnD,IAEnC7yB,GAAWyhB,EAAAA,EAAAA,IAAsB,CAAEr1B,cAAaoxB,eAUtD,MAAO,CAAEA,aAAY5O,WARnBC,EAAc,CACZrQ,QACA8I,aACAxgB,OAAQ,CAAC,EACTkZ,WACAo6E,mBAAoBD,IAEtBF,EAAkBj6E,EACa,EAGtB01E,EAAwBx+E,IAAmD,IAAlD,UAAEoJ,EAAS,MAAE9B,GAAgCtH,EACjF,MAAMmjF,EAAc77E,EAAM87E,iBACpBhhB,GAAW2b,EAAAA,EAAAA,IAAsBz2E,EAAMjB,KAAKiB,EAAMjB,KAAKrY,OAAS,IAEtE,GAAIob,EAAUna,SAASozF,GAA6B,CAClD,MAAM1gB,EDlGH,SAAqCv6E,GAAqE,IAApE,UAAEgiB,EAAS,WAAEqR,GAAqDrzB,EAC7G,MAAOi8F,EAAiBC,GAAkBhB,EAAmBl5E,GAE7D,GAAIi6E,IAAoBjB,EAA0BmB,MAAO,CACvD,MAAOC,EAAgBC,GAAgBH,EAAe75E,QAAQ,KAAM,KAAKD,MAXzC,KAY1Bk6E,EAAWF,EAAiB,IAAI7nF,KAAK6nF,GAAkB,KACvDG,EAASF,EAAe,IAAI9nF,KAAK8nF,GAAgB,KACvD,MAAO,CACL7R,MAAO8R,IAAar2F,OAAO6xB,MAAMwkE,EAASlB,WAAakB,EAAW,KAClE1M,IAAK2M,IAAWt2F,OAAO6xB,MAAMykE,EAAOnB,WAAa12C,EAAAA,SAAiB63C,GAAU,KAEhF,CAEA,GAAIN,IAAoBjB,EAA0BwB,KAAM,CACtD,MAAOC,EAAO93C,EAAQwxC,GAAQ+F,EAAe95E,MApBb,KAoBgD3e,IAAIwC,QAEpF,MAAI,CAACw2F,EAAO93C,EAAQwxC,GAAMjvF,KAAKjB,OAAO6xB,OAC7B,CAAE0yD,MAAO,KAAMoF,IAAK,MAGtB,CACLpF,MAAO9lC,EAAAA,WAAmBA,EAAAA,IAAYrxB,EAAY,CAAEopE,QAAO93C,SAAQwxC,KAAMA,EAAO,KAChFvG,IAAKv8D,EAET,CAEA,MAAO,CAAEm3D,MAAO,KAAMoF,IAAKv8D,EAC7B,CCuEkBqpE,CAA6B,CAAE16E,YAAWqR,WAAY2nD,IAC9D4U,GAAM+M,EAAAA,EAAAA,IACVpiB,EAAMqV,KAAOrV,EAAMqV,IAAIwL,WAAapgB,EAASogB,UAAY7gB,EAAMqV,IAAM5U,GACrE,GAEF,MAAO,CACLwP,MAAOjQ,EAAMiQ,QAASmS,EAAAA,EAAAA,IAAqBpiB,EAAMiQ,OAAO,GACxDoF,MAEJ,CAEA,IAAIpF,EAEJ,OAAQxoE,GACN,KAAKyyE,EAAAA,GAAAA,GACHzZ,EAAS4hB,SAAS,GAAI,GAAI,GAAI,KAC9BpS,EAA+B,IAAvBuR,EAAYn1F,OAAeo0E,EAAW+gB,EAAYA,EAAYn1F,OAAS,GAC/E,MACF,KAAK6tF,EAAAA,GAAAA,GACHzZ,EAAS4hB,SAAS,GAAI,GAAI,GAAI,KAC9B,MAAMC,EAAwC,IAAvBd,EAAYn1F,QAAgB,EAAIZ,KAAKhE,IAAI+5F,EAAYn1F,OAAS,EAAG,GACxF4jF,GAA4B,IAApBqS,EAAwB7hB,EAAW+gB,EAAYc,GACvD,MACF,KAAKpI,EAAAA,GAAAA,GACHjK,EAAQ9lC,EAAAA,UAAkBs2B,EAAU,GACpC,MACF,KAAKyZ,EAAAA,GAAAA,GACHjK,EAAQ9lC,EAAAA,UAAkBs2B,EAAU,GACpC,MACF,KAAKyZ,EAAAA,GAAAA,GACHjK,EAAQ9lC,EAAAA,UAAkBs2B,EAAU,GACpC,MACF,KAAKyZ,EAAAA,GAAAA,IACHjK,EAAQ9lC,EAAAA,YAAoBs2B,GAC5B,MACF,KAAKyZ,EAAAA,GAAAA,GACHjK,EAAQ9lC,EAAAA,SAAiBs2B,EAAU,GACnC,MACF,KAAKyZ,EAAAA,GAAAA,GACHjK,EAAQ9lC,EAAAA,SAAiBs2B,EAAU,GACnC,MACF,KAAKyZ,EAAAA,GAAAA,GACHjK,EAAQ9lC,EAAAA,SAAiBs2B,EAAU,GACnC,MACF,KAAKyZ,EAAAA,GAAAA,IACL,QACEjK,EAAQ,KAIZ,MAAO,CAAEA,MAAOA,IAASmS,EAAAA,EAAAA,IAAqBnS,GAAO,GAAQoF,KAAK+M,EAAAA,EAAAA,IAAqB3hB,GAAU,GAAQ,EAa9F53C,EAAsB30B,IAU7B,IAV8B,cAClC40B,EAAa,WACbra,EAAU,SACVtH,GAAWyhB,EAAAA,EAAAA,IAAsB,CAAEjE,WAAYlW,EAAWkW,WAAYpxB,YAAakb,EAAW0G,iBAAiB,SAC/G4T,GAMD70B,EACC,MAAM,cAAE4S,GAAkB2H,EAAW2pB,yBAC/B1wC,EAAQ+mB,EAAW/mB,MAAQof,EAAc8Y,KAAKl4B,MAAQof,EAAc+lB,MAAMnlC,MAC1E66F,EAAkB92F,KAAKuwC,MAAMt0C,EAAQyf,GAE3C,QAASiZ,EAAAA,GAAAA,IAAUjZ,EAAW,EAAGiZ,EAAAA,GAAAA,IAAU0I,EAAephC,GAD9CgS,EACyDqvB,EAAWw5D,EADlD7oF,EAAQyN,KAA1BzN,KACsF,EAG7F,SAAS8oF,EAAiBztF,GAU9B,IAV+B,eAChC0tF,EAAc,aACdC,EAAY,iBACZC,EAAgB,mBAChBC,GAMD7tF,EACC,MAEM8tF,EAA8E,IAAvD,KAFAH,EAAe1G,EAAAA,GAA8B,IAC3CyG,EAAiBzG,EAAAA,GAA8B,IAG9E,OAAO1N,EAAAA,GAAAA,EAAiBA,EAAAA,GAAAA,IAAoBuU,EAAsBF,EAAoBC,CACxF,CAEO,SAASE,EAAsBvtF,GAYnC,IAZoC,iBACrCotF,EAAgB,mBAChBC,EAAkB,aAClBF,EAAY,eACZD,EAAc,SACdjjD,GAODjqC,EACC,MAAMwtF,EAAiBP,EAAkB,CAAEE,eAAcD,iBAAgBG,qBAAoBD,qBAGvFK,EADuD,GAA9BhH,EAAAA,GACc2G,EAAoBC,EAE3DK,EACJR,GAAkBC,GAAgBljD,GAFPujD,EAAiBC,GAE0BxjD,EAAWujD,EAEnF,MAAO,CACLA,iBACAC,WAAYC,EAAkBD,EAAa,EAC3CE,qBAAsBD,EAAkBF,EAAiBC,EAAaD,EACtEI,iBAXuB,GAa3B,CAEO,MAAMntE,EAAgBpgB,IAQH,IARI,MAC5B+P,EAAK,WACL8I,EAAU,OACVxgB,EAAM,SACNkZ,GAAWyhB,EAAAA,EAAAA,IAAsB,CAAEjE,WAAYlW,EAAWkW,WAAYpxB,YAAakb,EAAW0G,iBAAiB,SAC/G4T,EAAW0P,EAAY9yB,GAAM,mBAC7B47E,EAAkB,6BAClB3oD,GAA+B,GACZhjC,EACnB,MAAM,cAAEkR,GAAkB2H,EAAW2pB,yBAC/B1wC,EAAQ+mB,EAAW/mB,MAAQof,EAAc8Y,KAAKl4B,MAAQof,EAAc+lB,MAAMnlC,MAC1EkX,EAA6B6P,EAAW0G,eAAevW,2BAC7D,GAAI3Q,SAAAA,EAAQqsC,QACV,OAAO,EAET,GAAIC,EAAqB37B,GACvB,OAAOuI,EAET,MAAMkxB,EAAM3+B,GAAkBA,EAAQyN,EACtC,IAAI4O,EAAaruB,EAAQ2wC,EAAGtP,GAAYt9B,KAAKyrC,MAAM/vB,EAAW,GAE9D,GADA4O,EAAatqB,KAAKyrC,MAAM9W,EAAAA,GAAAA,IAAUjZ,EAAW,EAAGiZ,EAAAA,GAAAA,IAAUrK,EAAYruB,EAAQ2wC,EAAGtP,EAAW,OAE1F6P,GACAwqD,EAAsB,CACpBz9E,QACA47E,qBACA3iF,6BACA6I,UAAWgH,EAAWhH,YAExB,CACA,IAAI47E,EAAqB,EACrB9B,EACF8B,EAAqB53F,KAAK07E,KAAKoa,EAAqB57E,EAAMuiE,gBAC9B,KAAnBviE,EAAMmhE,UAAmBr4D,EAAWhH,YAAcyyE,EAAAA,GAAAA,GAC3DmJ,EAAqB,EACO,KAAnB19E,EAAMmhE,SACfuc,EAAqB,EACO,KAAnB19E,EAAMmhE,SACfuc,EAAqB,GACO,KAAnB19E,EAAMmhE,SACfuc,EAAqB,GACO,MAAnB19E,EAAMmhE,SACfuc,EAAqB,GACO,MAAnB19E,EAAMmhE,SACfuc,EAAqB,GACZ19E,EAAMmhE,SAAW,MAC1Buc,EAAsB19E,EAAMmhE,SAAW,GAAM,IAE/C,MAAM,WAAEkc,EAAU,iBAAEG,GAAqBL,EAAuB,CAC9DJ,aAAc/8E,EAAMuR,UACpBurE,eAAgB98E,EAAMwR,YACtByrE,mBAAoBz7E,EACpBw7E,iBAAkBh9E,EAAMmhE,SACxBtnC,SAAU/wB,EAAW/mB,QAKvB,GAHsB27F,EAAqB19E,EAAMuiE,eAAkB/gE,EAAW67E,GAGzDt7F,EAAQ,EAAG,KAAA47F,EAC9B,MAAMC,EAAgB59E,EAAMjB,KAAK8sC,OAASrhC,EAAAA,GAAAA,sBAA4BxK,EAAMjB,KAAK8sC,QAAW,KAEtFgyC,GAAgBr3F,OAAOC,KAAKuZ,EAAM6hE,kBAAkBn7E,OAASg3F,GAAsB19E,EAAMuiE,eACzFub,GAA4C,QAA1BH,EAACC,aAAa,EAAbA,EAAe9lB,kBAAU,IAAA6lB,EAAAA,EAAI,IAAMH,EAAmBH,EAAa,EAC5FjtE,EAAatqB,KAAKyrC,OAAOmB,EAAGmrD,GAAgBr8E,EAAW,GAAKs8E,CAC9D,CACF,CAEA,OAAI7kF,IAA+BC,EAAAA,GAAAA,UAC1BkX,EAEF8S,EAAoB,CACzBC,cAAe/S,EACftH,aACAtH,WACA4hB,YACA,EAGS0P,EAAe9yB,IAAY,IAAA+9E,EAAA,OAAK/9E,aAAK,EAALA,EAAO8yB,YAAsB,QAAVirD,EAAA/9E,EAAMmD,YAAI,IAAA46E,GAAVA,EAAYr3F,OAASsZ,EAAMmD,KAAKzc,OAAS,EAAI,KAAM,CAAC,EAEvGkuC,EAAwB37B,GACnCA,IAA+BC,EAAAA,GAAAA,WAepBukF,EAAwBttF,IAKH,IALI,MACpC6P,EAAK,UACL8B,EAAS,mBACT85E,EAAkB,2BAClB3iF,GAC2B9I,EAC3B,MAAM6tF,EAAkBh+E,EAAM6yB,YAAc7yB,EAAMnE,aAAeM,EAAAA,GAAAA,MAE3D8hF,EAAqB,CAAC/kF,EAAAA,GAAAA,UAAsCA,EAAAA,GAAAA,WAAsCvR,SACtGsR,GAEI0+B,EAAc1+B,IAA+BC,EAAAA,GAAAA,UAC7CglF,EACJvmD,KAAiB71B,GAAa,CAACyyE,EAAAA,GAAAA,GAAkBA,EAAAA,GAAAA,IAAkB5sF,SAASma,GAE9E,OAAOk8E,IAAoBC,GAAsBC,GADhBvmD,GAAeikD,EACsD,EAU3FtiB,EAAO4G,IAAuD,IAAtD,UAAEv7C,EAAS,MAAE5iC,EAAK,OAAEyrB,EAAM,SAAEkZ,GAAqBw5C,EACpE,MAAMoE,EAAeviF,EAAQ2kC,EAASzM,KAAKl4B,MAAQ2kC,EAASQ,MAAMnlC,MAC5D26E,EAAgBlvD,EAASkZ,EAASnZ,IAAIC,OAASkZ,EAASuE,OAAOzd,OACrEmX,EAAUg0B,YACVh0B,EAAUkwC,KAAKnuC,EAASzM,KAAKl4B,MAAO2kC,EAASnZ,IAAIC,OAAQ82D,EAAc5H,GACvE/3C,EAAU20C,MAAM,EAGL3yC,EAAe14B,IAC1B,MAAM,cAAEkT,EAAa,kBAAEwR,GAAsB1kB,EAAU4U,QAAQ4vB,yBAC/D,IAAK,MAAMlqC,KAAW0F,EAAUiC,WAAW4a,MACzC,GAAIviB,EAAQiF,cACV,OAAOmlB,EAGX,OAAOxR,CAAa,EAUhBg9E,EAA8Bv6D,IAClC,MAAM5jB,EAAQ4jB,EAAa9sB,OAAO+L,QAAQ7C,QAE1C,OAAOA,EAAMmR,YAAYzqB,OAAS,IAAM,CAACq/C,EAAAA,GAAAA,EAAaA,EAAAA,GAAAA,GAAap+C,SAASqY,EAAMkB,UAAU,EAGjFqf,EAAeogD,IAAkD,IAAjD,WAAE73D,EAAU,UAAE7a,GAA8B0yE,EACvE,MAAM,cAAEx/D,EAAa,kBAAEwR,EAAiB,wBAAE67D,GAA4B1lE,EAAW2pB,yBAC3E7kC,EAAckb,EAAW0G,eACzBytE,GAAqBh6D,EAAAA,EAAAA,IAAsB,CAAEr1B,cAAaoxB,WAAYlW,EAAWkW,aACvF,IAAK,MAAM4E,IAAgB,IAAI31B,EAAUsB,oBAAqBtB,EAAU+iB,mBAAkB,IAAS,CACjG,MAAMgM,EAAK4G,EAAar2B,SAClBG,EAAUk2B,EAAal2B,UAC7B,GAAIA,GAAWk2B,EAAap2B,cAAe,CACzC,IAAIklC,EAAchM,EAAwF3kC,EAC1G,MAAMq8F,EAAY1wF,EAAUob,EAAW4Y,MAAQC,EAAAA,GAAAA,OAE7C+E,EADEh5B,EACSob,EAAWjN,aAAeM,EAAAA,GAAAA,gBAA6BqyE,EAA0BrtE,EAEjFwR,EAEb,MAAM+pD,EAAgBzuE,EAAUuf,OAASkZ,EAASnZ,IAAIC,OAASkZ,EAASuE,OAAOzd,OAE3E1E,EAAW6rB,SACb5yC,EAAQ+mB,EAAW/mB,MAAQ2kC,EAASzM,KAAKl4B,MAAQ2kC,EAASQ,MAAMnlC,MAChE2wC,EAAK4qC,EAAAA,cAEFjD,MAAM,CAAC,EAAGt4E,IACV0gC,OAAO,CAAC,EAAG38B,KAAKhE,IAAI,EAAGgnB,EAAW9I,QAAQ+yB,MAAMrsC,OAAS,OAE5DgsC,EAAO3+B,GAAkBA,EAAQkpF,EACjCvqD,EAAG9Q,OAAUjB,GAAcA,EAAIs8D,EAC/BvqD,EAAG3wC,MAAQ,SAAU0yF,GACnB,OAAO54D,KAAK+F,OAAO6yD,GAAK54D,KAAK+F,OAAO,EACtC,GAEF3zB,EAAU2J,gBAAgB,QAAS,CAAE+oB,EAAG+R,IAExC,MAAM,IAAE7wC,EAAG,IAAEC,GAAQmM,EAAUmzB,YAAcpE,EAAG8E,YAChD,IAAI05B,EAEJ,MAAM6iC,EAAqBA,CAACC,EAAwBC,KAClD,GAAI7wF,GAAWywF,EAA2Bv6D,GAAe,CACvD,MAAM46D,EAAoB9hB,EAAgB7lD,EAAAA,EACpC4nE,EAAQH,EAAaz8F,GACrB4gC,EAAS67D,EAAa77D,SAC5B,GAAIg8D,EAAQD,EAAmB,CAC7B,MACME,EADYH,IAAelkB,MAAM,CAAC,EAAGmkB,IAAoB/7D,OAAO,CAAC3gC,EAAKD,IAC9C+/B,OAAO86C,GACrC4hB,EAAa77D,OAAO,CAACA,EAAO,GAAIi8D,GAClC,CACF,GAGF,GAAQN,IACDz8D,EAAAA,GAAAA,YACH65B,EAAK8hB,EAAAA,cAAiBjD,MAAM,CAAC,EAAGqC,IAAgBj6C,OAAO,CAAC3gC,EAAKD,IAC7Dw8F,EAAmB7iC,EAAI8hB,EAAAA,kBAGvB9hB,EAAK8hB,EAAAA,cAAiBjD,MAAM,CAAC,EAAGqC,IAAgBj6C,OAAO,CAAC3gC,EAAKD,IACxDoM,EAAUmzB,aACbo6B,EAAKA,EAAG+hB,KAAK,IACb8gB,EAAmB7iC,EAAI8hB,EAAAA,cAI7B9hB,EAAGhuC,OAAS,SAAU2rC,GACpB,OAAOt9B,KAAK+F,OAAOu3B,GAAKt9B,KAAK+F,OAAO,EACtC,EACA3zB,EAAU2J,gBAAgB,QAAS,CACjC+oB,EAAG+R,EACH9R,EAAG46B,IAGD9tD,GACFsvB,EAAG4sD,UAAWl3C,GAEhB,KACF,CACF,GAIWk3B,EAA0BnR,GAAuBA,EAAY,GAAM,EAAI,EAAI,GAW3ED,EAAsBstB,IAAsD,IAArD,UAAErtB,EAAS,GAAEZ,EAAE,GAAEC,EAAE,GAAEC,EAAE,GAAEC,GAAuB8tB,EAElF,OAAIrtB,EAAY,GAAM,EACb,CAAE93B,EAAG,EAAGC,EAAG,GAEhBk3B,IAAOE,EACF,CAAEr3B,EAAG,EAAGC,EAAG,IACTi3B,IAAOE,EACT,CAAEp3B,EAAG,GAAKC,EAAG,GAEb,CAAED,EAAG,GAAKC,EAAG,GACtB,EAGW03B,EAA0C2O,IACrD,MAAM03B,EAAUn4F,OAAOm0C,QAAgBssB,GACvC,IAAK,IAAI/0D,EAAI,EAAGA,EAAIysF,EAAQj4F,OAAQwL,IAClCysF,EAAQzsF,GAAG,GAAKpM,KAAKyrC,MAAMotD,EAAQzsF,GAAG,IAExC,OAAO1L,OAAOo4F,YAAYD,EAAQ,EAcvB7hB,EAAe8J,IAAA,IAAC,QAAE72C,EAAO,QAAEu1B,EAAO,QAAEC,GAAqBqhB,EAAA,MAAqB,CACzF7J,GAAIA,IAAMhtC,EAAQ2oB,UAAU4M,EAASC,GACrCgZ,KAAMA,IAAMxuC,EAAQ2oB,WAAqB,EAAX4M,GAAyB,EAAXC,GAC7C,EAOYiX,EAAyBsL,IAAA,IAAC,OAAEjZ,EAAM,KAAE4N,GAA6BqL,EAAA,OAAOjZ,EAAS4N,GAAQA,EAAQ,GAAG,EAEpGiB,EAAyBoL,IAAA,IAAC,OAAEja,EAAM,KAAE4N,GAA6BqM,EAAA,OAAMja,EAAS,IAAO4N,EAAOA,CAAI,EAOxG,SAAS5nC,EAAkCgqD,GAAiE,IAAhE,WAAE/1E,EAAU,MAAE9I,GAAgD6+E,EAC/G,MAAM,cAAE19E,GAAkB2H,EAAW2pB,yBAC/B2B,EAAoBtrB,EAAW/mB,OAASof,EAAc8Y,KAAKl4B,MAAQof,EAAc+lB,MAAMnlC,QAEvF,MAAEuoF,EAAK,IAAEoF,EAAG,kBAAEiM,GDzef,SAAmCznF,GAA4D,IAAA4qF,EAAAC,EAAA,IAA3D,UAAEj9E,EAAS,MAAE9B,GAA4C9L,EAClG,MAAM8qF,EAAc9H,EAAsB,CAAEp1E,YAAW9B,WAChD+7E,GAAmBf,EAAmBl5E,GAE7C,IAAIm9E,EAA8B,KAC9BC,EAA4B,KAC5BC,EAAmC,KAEvC,GAAIH,EAAY1U,OAASyR,IAAoBjB,EAA0BwB,KAAM,KAAA8C,EAAAC,EAC3E,MACMC,EAAsB,IADRt/E,EAAM87E,kBACmBtb,UACvC+e,EAAqBD,EAAoB7mF,WAAWsG,GAASA,EAAKm8E,WAAa8D,EAAY1U,MAAO4Q,YAClGsE,EAAmBF,EAAoB7mF,WAAWsG,GAASA,EAAKm8E,WAAa8D,EAAYtP,IAAKwL,YACpG+D,EAAwD,QAA1CG,EAAGE,EAAoBC,UAAmB,IAAAH,EAAAA,EAAI,KAC5DF,EAAoD,QAAxCG,EAAGC,EAAoBE,UAAiB,IAAAH,EAAAA,EAAI,KACxDF,EAAoBn/E,EAAMmhE,UAAY,EAAIoe,EAAqBC,EAAmB,EAAI,IACxF,CAEA,MAAO,CACLlV,MAAO0U,EAAY1U,MACnBoF,IAAKsP,EAAYtP,IACjBuP,iBACAC,eACAC,oBACAxD,mBAAqC,QAAlBmD,EAACK,SAAiB,IAAAL,EAAAA,EAAI,IAA0B,QAAzBC,EAAK/+E,EAAMuiE,sBAAc,IAAAwc,EAAAA,EAAI,SAAMttF,EAC7EguF,gBAAiBT,EAAY1U,OAAS9lC,EAAAA,WAAmBw6C,EAAY1U,OACrEoV,cAAeV,EAAYtP,KAAOlrC,EAAAA,SAAiBw6C,EAAYtP,KAEnE,CC6c4CiQ,CAA2B,CACnE79E,UAAWgH,EAAWhH,UACtB9B,WAGI,WAAEgf,EAAU,WAAE5O,GAAesrE,EAA0B,CAC3DtnD,oBACAk2C,QACAoF,MACA1vE,QACA27E,oBACA7yE,WAAYA,IAGVA,EAAWkW,aAAeA,GAAclW,EAAWsH,aAAeA,GACpEtH,EAAW7S,iBAAiB,CAAE+oB,aAAY5O,cAE9C,CAEO,SAAS0V,EAAU85D,GAYvB,IAZwB,iBACzBvwF,EAAgB,WAChByZ,EAAU,UACV7a,EAAS,UACT02B,EAAS,kBACTk7D,GAAoB,GAOrBD,EACK3xF,EAAU4U,QAAQhH,aAAeM,EAAAA,GAAAA,gBACnCwoB,EAAUsB,UAAU,EAAG,EAAGnd,EAAW/mB,MAAOkM,EAAUuf,SAEtDmX,EAAUt6B,IAAI,YAAaye,EAAW2pB,yBAAyBtxB,cAAciuC,QAAQgJ,OAAO2uB,YAC5FpiD,EAAU8pC,SAAS,EAAG,EAAG3lD,EAAW/mB,MAAOkM,EAAUuf,SAEvD,MAAMtd,EAAWjC,EAAUsB,iBAC3B,IAAK,MAAQhC,SAAU84B,KAAqBn2B,EACA,mBAA/Bm2B,EAAgBszC,aACzBh1C,EAAU3uB,OACVqwB,EAAgBszC,WAAWh1C,GAC3BA,EAAU6B,WAId,MAAMrV,EAAcljB,EAAU+iB,oBACxB0V,EAAWC,EAAY14B,GAC7B,IAAK,MAAQV,SAAU84B,IAAqB,IAAIn2B,KAAaihB,GAAc,CACzE,MAAM3hB,EAAY62B,EAAgB38B,eAC5BunB,EAAeoV,EAAgB8C,oBAEjC35B,IAAcH,EAAiB84C,sBAAyB9hB,EAAgBmiC,oBAEhEh5D,IAAayhB,GAAkBoV,EAAgBkjC,iBAAiBzgD,MAI5E6b,EAAU3uB,OAC2B,MAAjCqwB,EAAgBmxB,eAClB7yB,EAAU3uB,OACVsjE,EAAK,CACH30C,YACA5iC,MAAO+mB,EAAW/mB,MAClByrB,OAAQvf,EAAUuf,OAClBkZ,aAEF/B,EAAU+zB,UAAUzqD,EAAU4U,QAAQuN,WAAasW,EAASzM,KAAKl4B,MAAO2kC,EAASnZ,IAAIC,QACrF6Y,EAAgBmxB,cAAc7yB,GAC9BA,EAAU6B,UACkC,mBAAjCH,EAAgBgnC,cACzBhnC,EAAgBgnC,aAAa1oC,IAG/B0B,EAAgB7J,OAAOmI,GAGvBk7D,IACCxwF,EAAiB4J,6BAA+BC,EAAAA,GAAAA,YAC/C02B,EAAAA,EAAAA,IAAiBvgC,KACY,MAA/Bg3B,EAAgBZ,aAEhBY,EAAgBZ,YAAYd,GAE9BA,EAAU6B,WACZ,CACF,C,sDC1nBO,MAAMoT,EAAiB,CAC5B/3C,IAAK,IACLC,IAAK,KAGA,IAAKm4C,EAAgB,SAAhBA,GAAgB,OAAhBA,EAAAA,EAAgB,uBAAhBA,EAAAA,EAAgB,2BAAhBA,CAAgB,K,qFCe5B,MAAM6lD,EAAsC,CAC1CtlD,aAAc,KACdnf,QAAQ,EACR0gB,gBAAgB,EAChBvC,UAAWS,EAAAA,EAAAA,WACXl4C,MAAO63C,EAAAA,EACP7G,MAAOA,OACP0G,SAAUA,OACVgB,aAAcA,QAGHuB,EAAiB97C,IAAAA,cAAwC4/F,GACzDpmD,EAAoBA,IAAMx5C,IAAAA,WAAiB87C,E,iEC9BjD,IAAKnU,EAAW,SAAXA,GAAW,OAAXA,EAAW,cAAXA,EAAW,cAAXA,EAAW,kBAAXA,EAAW,cAAXA,EAAW,4BAAXA,EAAW,kBAAXA,EAAW,+CAAXA,EAAW,iCAAXA,EAAW,kBAAXA,EAAW,cAAXA,EAAW,sBAAXA,EAAW,kBAAXA,EAAW,oBAAXA,EAAW,sBAAXA,EAAW,qCAAXA,EAAW,yBAAXA,EAAW,yBAAXA,EAAW,oBAAXA,EAAW,6BAAXA,EAAW,cAAXA,CAAW,MAuBXsU,EAAc,SAAdA,GAAc,OAAdA,EAAc,mBAAdA,EAAc,iCAAdA,EAAc,oDAAdA,CAAc,MAMdQ,EAAc,SAAdA,GAAc,OAAdA,EAAc,qCAAdA,EAAc,gDAAdA,EAAc,6BAAdA,EAAc,6BAAdA,CAAc,K,0FCZnB,SAASlN,EAAYxmB,GAC1B,MAAO,GAAP5oB,OAAU4oB,EAAW5kB,MAAQ4kB,EAAW/a,OAAM,OAAA7N,OAhBzC,SAA4Bwb,GACjC,OAAQA,GACN,KAAKM,EAAAA,GAAAA,MACH,MAAO,QACT,KAAKA,EAAAA,GAAAA,QACH,MAAO,UACT,KAAKA,EAAAA,GAAAA,MACH,MAAO,QACT,KAAKA,EAAAA,GAAAA,OACH,MAAO,SACT,KAAKA,EAAAA,GAAAA,gBACH,MAAO,mBAEb,CAGsD4jF,CAAmB92E,EAAWpN,YAAW,eAC/F,CAEO,MAAMmkF,EAAwBC,IACnC,OAAQA,GACN,KAAK/7C,EAAAA,GAAAA,WACH,MAAO,aACT,KAAKA,EAAAA,GAAAA,kBACH,MAAO,oBACT,KAAKA,EAAAA,GAAAA,UACH,MAAO,OACT,KAAKA,EAAAA,GAAAA,UACH,MAAO,OACT,KAAKA,EAAAA,GAAAA,YACL,QACE,MAAO,cACX,EAGWC,EAAuC+7C,GAC5B,OAAtBA,EACI,KACA15F,OAAOsD,OAAOo6C,EAAAA,IAAkB9gD,MAC7B68F,GAAgCC,IAAsBF,EAAqBC,I,qgBCZpF,QA7BA,MAME/jE,YAAYpgB,GAAgBqgB,EAAA,sBAAAA,EAAA,mBAAAA,EAAA,qBAAAA,EAAA,qBAC1BN,KAAK/f,OAASA,EACd+f,KAAKuV,IAAM,EACXvV,KAAKnrB,MAAQ,EACbmrB,KAAK77B,MAAQ,CACf,CAEA88B,IAAIo+C,EAAcC,EAAajrB,GAC7B,MAAMiwC,EAAK31E,EAAAA,GAAAA,IAAU,CAAC0wD,EAAOC,EAAKr1E,KAAK+xB,IAAIqjD,EAAOhrB,GAAYpqD,KAAK+xB,IAAIsjD,EAAMjrB,KAEzEr0B,KAAKnrB,MAAQmrB,KAAK/f,QACpB+f,KAAKuV,KAAO+uD,EACZtkE,KAAK77B,MAAQ67B,KAAKuV,KAAOvV,KAAKnrB,MAAQ,GAClCmrB,KAAKnrB,QAAUmrB,KAAK/f,OAAS,IAC/B+f,KAAKuV,KAAOvV,KAAK/f,SAGnB+f,KAAK77B,OAAS67B,KAAK77B,OAAS67B,KAAK/f,OAAS,GAAKqkF,GAAMtkE,KAAK/f,OAE5D+f,KAAKnrB,OACP,E,ufCFF,QA1BA,MAOEwrB,YAAYpgB,GAAgBqgB,EAAA,sBAAAA,EAAA,0BAAAA,EAAA,mBAAAA,EAAA,qBAAAA,EAAA,qBAC1BN,KAAK/f,OAASA,EACd+f,KAAKukE,WAAa,GAAKvkE,KAAK/f,OAAS,GACrC+f,KAAKuV,IAAM,EACXvV,KAAKnrB,MAAQ,EACbmrB,KAAK77B,MAAQ,CACf,CAEA88B,IAAImlC,GACEpmC,KAAKnrB,MAAQmrB,KAAK/f,QACpB+f,KAAKuV,KAAO6wB,EACZpmC,KAAKnrB,QACLmrB,KAAK77B,MAAQ67B,KAAKuV,IAAMvV,KAAKnrB,OAE7BmrB,KAAK77B,MAAQiiE,EAAIpmC,KAAKukE,WAAavkE,KAAK77B,OAAS,EAAI67B,KAAKukE,WAE9D,E,gkBCKF,MAAMC,UAAoE7kF,EAAAA,EAexE0gB,YAAYpyB,EAAwBoD,GAClCsyB,MAAM11B,EAAQoD,GAAMivB,EAAA,eANb,GAAKA,EAAA,YAEP,GAACA,EAAA,WACF,GAACA,EAAA,6BAOgB,KAAM,CAAGwE,EAAG,CAAC,KAAMC,EAAG,OAH3C/E,KAAK6F,MAAM7F,KAAKo8B,uBAClB,CAIIv0D,WACF,OAAQm4B,KAAKK,YAAkCx4B,IACjD,CAEI3D,YACF,OAAQ87B,KAAKK,YAAkCn8B,KACjD,CAEAy7B,wBACE,OAAQK,KAAKn4B,MACX,KAAK2vF,EAAAA,GAAAA,UACH,OAAO15D,EAAAA,GAAAA,UACT,KAAK05D,EAAAA,GAAAA,MACH,OAAO15D,EAAAA,GAAAA,MAGX,OAAOA,EAAAA,GAAAA,eACT,CAEA2mE,qBAAoD,IAAAj5B,EAClD,OAA+B,QAA/BA,EAAOxrC,KAAK3uB,MAAMikB,qBAAa,IAAAk2C,OAAA,EAAxBA,EAA0BI,gBAAgB,WAAY5rC,KAC/D,CAEA0kE,gBAAgB,IAAAC,EACd,MAAM,IAAEjzE,EAAG,OAAE0d,GAAWpP,KAAK4W,yBAAyBtxB,cAChDs/E,EAAkB5kE,KAAKykE,sBACvB,EAAE3/D,GAAM9E,KAAKsL,OACbkxB,GAAYC,EAAAA,EAAAA,IAAiB,CAAE33B,MAC/BC,EACH/E,KAAK3uB,MAAoBsgB,OAC1BD,EAAIC,OACJyd,EAAOzd,OACPqJ,EAAAA,GACwB,QAAxB2pE,EAACC,aAAe,EAAfA,EAAiBC,cAAM,IAAAF,EAAAA,EAAI,GAAK3pE,EAAAA,EAEnC,MAAO,CAAE8J,EAAG03B,EAAU13B,EAAI9J,EAAAA,EAAyB,EAAG+J,IACxD,CAEA4nC,eAAe,IAAAm4B,EACb,OAAQ,CAAC56C,EAAAA,GAAAA,EAAaA,EAAAA,GAAAA,GAAap+C,SAAmC,QAA3Bg5F,EAAC9kE,KAAK3uB,MAAM2V,QAAQ7C,eAAO,IAAA2gF,OAAA,EAA1BA,EAA4Bz/E,UAC1E,CAEAs2C,cAAcznB,GACZ,IAAKlU,KAAK2sC,eAAgB,OAE1B3sC,KAAK+7B,MAAMj3B,EAAI76B,KAAKyrC,MAAM1V,KAAK+7B,MAAMj3B,GACrC,MAAM9d,EAAQgZ,KAAK3uB,MAAM2V,QACnBjV,EAAciV,EAAM2M,gBACpB,EAAEmR,EAAC,EAAEC,GAAM/E,KAAK0kE,gBAChBvgB,EAAS,GAAKnpD,EAAAA,EACpB,GAAI8J,EAAI9d,EAAMuN,YAAc4vD,GAAUr/C,EAAI9d,EAAMuN,WAAavN,EAAM9gB,MAAQi+E,EACzE,OAEF,MAAM/4E,GAAO8xF,EAAAA,EAAAA,GAAwB,CACnC3sF,MAAOwB,EAAYxB,MACnB9B,OAvFsB0wB,EAuFIa,KAtF1Bb,EAAWK,OACNzE,EAAAA,GAAAA,SAELoE,EAAWC,UACNrE,EAAAA,GAAAA,MAEFA,EAAAA,GAAAA,SAiFHb,UAAW8F,KAAKL,0BAxFtB,IAA4BR,EA0FxB,MAAM,KAAEf,EAAI,IAAE1M,GAAQsO,KAAK4W,yBAAyBtxB,cACpD0a,KAAK5B,KAAO0G,EAAI9d,EAAMuN,WAAa6J,EAAKl4B,MAAQ80B,EAAAA,EAAyB,EACzEgF,KAAKtO,IAAMqT,EAAIrT,EAAIC,OACnBuiB,EAAQ4mC,UAAU1vE,EAAM05B,EAAGC,EAAG/J,EAAAA,EAAwBA,EAAAA,EACxD,CAEAmO,aAAa/J,GACNY,KAAK2sC,iBAEV3sC,KAAKZ,UAAYA,EACjBY,KAAK3uB,MAAMkkB,4BACXyK,KAAKjyB,QAAQ,UACf,CAGAmnB,aAAa6vE,GAA0B,IAAAlpF,EAAAC,EACrC,MAAM/J,EAAciuB,KAAK3uB,MAAM2V,QAAQ2M,eACjCixE,EAAkB5kE,KAAKykE,qBAEvBO,GAAmD,QAA5BnpF,EAAA9J,EAAYkjB,wBAAgB,IAAApZ,OAAA,EAA5BA,EAA8BtH,cAAcqwF,aAAe,EAAfA,EAAiBrwF,WACpFirB,EAASulE,QAAAA,GAAmBC,KAAwBJ,SAAAA,EAAiBlzF,SAAS8tB,QAER,IAAAliB,GAD5E0iB,KAAKR,OAASA,EACkB,QAA5B1jB,EAAA/J,EAAYkjB,wBAAgB,IAAAnZ,GAA5BA,EAA8BpK,SAAS8tB,SAAWwlE,KACxB,QAA5B1nF,EAAAvL,EAAYkjB,wBAAgB,IAAA3X,GAA5BA,EAA8B5L,SAASwjB,cAAa,KAElDsK,GAAUwlE,IACZjzF,EAAYgK,gBAAgB,oBAAqByjB,GAAUwlE,OAAuBpvF,EAAYgvF,GAGhG5kE,KAAK3uB,MAAMkkB,4BACXyK,KAAKjyB,QAAQ,SACf,CAEA++B,SAASnI,GACP,IAAK3E,KAAK2sC,eAAgB,OAAO,EAEjC,MAAMs4B,EAAatgE,EAAK2G,QAClB,EAAExG,EAAC,EAAEC,GAAM/E,KAAK0kE,gBAMtB,OAJE5/D,GAAKmgE,EAAWngE,GAChBA,EAAI9J,EAAAA,GAA0BiqE,EAAWngE,GACzCC,GAAKkgE,EAAWlgE,GAChBA,EAAI/J,EAAAA,GAA0BiqE,EAAWlgE,CAE7C,CAEA2oC,iBAAiB1mD,GACf,IAAKgZ,KAAK2sC,eAAgB,OAAO,EAEjC,MAAM,EAAE7nC,GAAM9E,KAAK0kE,gBAEnB,OADiB5/D,EAAI9J,EAAAA,IAA2BhU,EAAMuN,YAAcuQ,IAAM9d,EAAMuN,WAAavN,EAAM9gB,KAErG,EACDo6B,EArIKkkE,EAAU,OACAhN,EAAAA,GAAAA,YAAyBl3D,EADnCkkE,EAAU,QAEC,cAqIjB,U,wcChKA,MAAM/M,UAAkB+M,GAGvBlkE,EAHKm3D,EAAS,OACCD,EAAAA,GAAAA,WAAwBl3D,EADlCm3D,EAAS,QAEEx8D,EAAAA,GAAiBu8D,EAAAA,GAAAA,YAGlC,U,wcCJA,MAAM0N,UAAiBV,EAIrB7kE,wBAA6C,IAAAwlE,EAC3C,MAAMC,EAAqC,QAA5BD,EAAGnlE,KAAKykE,4BAAoB,IAAAU,OAAA,EAAzBA,EAA2BzlE,oBAE7C,IAAK0lE,EACH,OAAOtnE,EAAAA,GAAAA,gBAGT,QAA4BloB,IAAxBwvF,EAAU9oE,gBAAqD1mB,IAA1BwvF,EAAU7oE,YAA2B,CAC5E,MAAM9jB,EAAMD,KAAKC,MAAQ,IACzB,OAAO2sF,EAAUzqE,cAAgBliB,EAAMqlB,EAAAA,GAAAA,eAAqCA,EAAAA,GAAAA,eAC9E,CACA,OAAOsnE,EAAU9oE,UAAY8oE,EAAU7oE,YAAc,EACjDuB,EAAAA,GAAAA,iBACAA,EAAAA,GAAAA,gBACN,EACDwC,EAnBK4kE,EAAQ,OACE1N,EAAAA,GAAAA,UAAuBl3D,EADjC4kE,EAAQ,QAEGjqE,EAAAA,GAAiBu8D,EAAAA,GAAAA,WAmBlC,U,wcCtBA,MAAME,UAAc8M,GAGnBlkE,EAHKo3D,EAAK,OACKF,EAAAA,GAAAA,OAAoBl3D,EAD9Bo3D,EAAK,QAEMz8D,EAAAA,GAAiBu8D,EAAAA,GAAAA,QAGlC,UCFa6N,EAAoB16F,OAAO6xC,OAAO,CAC7C,CAACg7C,EAAAA,GAAAA,YAA4Br4D,EAC7B,CAACq4D,EAAAA,GAAAA,WAA2B8N,EAC5B,CAAC9N,EAAAA,GAAAA,OAAuBnxE,EACxB,CAACmxE,EAAAA,GAAAA,UAA0B+N,I,wBCH7B,MAAMC,EAAiB,I,QAClBhpB,KACAipB,EAAAA,KACAz7B,EAAAA,KACAksB,EAAAA,KACAmP,GAGE,SAAShqF,EAAuBqqF,GACrC,OAAOF,EAAeE,EACxB,C,wFCRO,IAAKxoE,EAAS,SAATA,GAAS,OAATA,EAAAA,EAAS,uBAATA,EAAAA,EAAS,qBAATA,EAAAA,EAAS,qBAATA,EAAAA,EAAS,uBAATA,CAAS,MAOd,MAAMuhE,EAAoB,CAC/B,CAACvhE,EAAUyoE,UAAW,IACtB,CAACzoE,EAAU0oE,SAAU,IACrB,CAAC1oE,EAAU2oE,SAAU,IACrB,CAAC3oE,EAAU4oE,UAAW,MAGlBC,EAAoB,CACxB,CAAC7oE,EAAUyoE,UAAW,EACtB,CAACzoE,EAAU0oE,SAAU,EACrB,CAAC1oE,EAAU2oE,SAAU,EACrB,CAAC3oE,EAAU4oE,UAAW,IAGlBE,EAAoB,CACxB,CAAC9oE,EAAUyoE,UAAW,IACtB,CAACzoE,EAAU0oE,SAAU,IACrB,CAAC1oE,EAAU2oE,SAAU,IACrB,CAAC3oE,EAAU4oE,UAAW,KAyVxB,EAtVa,CACXG,WAAUA,CAAC1vD,EAAWC,IACbD,EAAGzR,EAAI0R,EAAG1R,EAAIyR,EAAGxR,EAAIyR,EAAGzR,EAGjCmhE,aAAYA,CAAC3vD,EAAWC,IACfD,EAAGzR,EAAI0R,EAAGzR,EAAIwR,EAAGxR,EAAIyR,EAAG1R,EAGjCsgC,SAAQA,CAAC7uB,EAAWC,IACXvsC,KAAK0+D,KAAK1+D,KAAKk8F,IAAI5vD,EAAGzR,EAAI0R,EAAG1R,EAAG,GAAK76B,KAAKk8F,IAAI5vD,EAAGxR,EAAIyR,EAAGzR,EAAG,IAGpEqhE,aAAavtC,GAEX,GAAIA,EAAKmD,KAAOnD,EAAKqD,GACnB,MAAO,CACL7kD,EAAG,EACHC,EAAG,EACHyO,GAAI8yC,EAAKmD,IAGb,MAAMqqC,GAAKxtC,EAAKsD,GAAKtD,EAAKoD,KAAOpD,EAAKqD,GAAKrD,EAAKmD,IAChD,MAAO,CACL3kD,GAAIgvF,EACJ/uF,EAAG,EACHyO,EAAGsgF,EAAIxtC,EAAKmD,GAAKnD,EAAKoD,GACtBoqC,IAEJ,EAEAC,eAAevmC,EAAcyF,GAE3B,IAAI+gC,EAAI/gC,EAAQ36D,OAAS,EACrB27F,GAAW,EACf,IAAK,IAAInwF,EAAI,EAAGA,EAAImvD,EAAQ36D,OAAQwL,IAAK,CACvC,MAAM+J,EAAIolD,EAAQnvD,IAEd+J,EAAE2kB,EAAIg7B,EAAMh7B,GAAKygC,EAAQ+gC,GAAGxhE,GAAKg7B,EAAMh7B,GAAOygC,EAAQ+gC,GAAGxhE,EAAIg7B,EAAMh7B,GAAK3kB,EAAE2kB,GAAKg7B,EAAMh7B,KACtF3kB,EAAE0kB,GAAKi7B,EAAMj7B,GAAK0gC,EAAQ+gC,GAAGzhE,GAAKi7B,EAAMj7B,IAErC1kB,EAAE0kB,GAAMi7B,EAAMh7B,EAAI3kB,EAAE2kB,IAAMygC,EAAQ+gC,GAAGxhE,EAAI3kB,EAAE2kB,IAAOygC,EAAQ+gC,GAAGzhE,EAAI1kB,EAAE0kB,GAAKi7B,EAAMj7B,IAChF0hE,GAAYA,GAGhBD,EAAIlwF,CACN,CACA,OAAOmwF,CACT,EAEAC,eAAe1mC,EAAclH,GAC3B,MAAM,EAAExhD,EAAC,EAAEC,EAAC,EAAEyO,GAAMia,KAAKomE,aAAavtC,GAEtC,OADa5uD,KAAK+xB,IAAI3kB,EAAI0oD,EAAMj7B,EAAIxtB,EAAIyoD,EAAMh7B,EAAIhf,GAAK9b,KAAK0+D,KAAKtxD,EAAIA,EAAIC,EAAIA,EAE/E,EAEAovF,kBAAkB3mC,EAAclH,GAC9B,MAAM8tC,EAAK18F,KAAKk8F,IAAIttC,EAAKmD,GAAKnD,EAAKqD,GAAI,GAAKjyD,KAAKk8F,IAAIttC,EAAKoD,GAAKpD,EAAKsD,GAAI,GACxE,GAAW,IAAPwqC,EACF,OAAO18F,KAAK0+D,KAAK1+D,KAAKk8F,IAAIpmC,EAAMj7B,EAAI+zB,EAAKmD,GAAI,GAAK/xD,KAAKk8F,IAAIpmC,EAAMh7B,EAAI8zB,EAAKoD,GAAI,IAEhF,MAAM97C,IAAM4/C,EAAMj7B,EAAI+zB,EAAKmD,KAAOnD,EAAKqD,GAAKrD,EAAKmD,KAAO+D,EAAMh7B,EAAI8zB,EAAKoD,KAAOpD,EAAKsD,GAAKtD,EAAKoD,KAAO0qC,EACpG,GAAIxmF,EAAI,EACN,OAAOlW,KAAK0+D,KAAK1+D,KAAKk8F,IAAIpmC,EAAMj7B,EAAI+zB,EAAKmD,GAAI,GAAK/xD,KAAKk8F,IAAIpmC,EAAMh7B,EAAI8zB,EAAKoD,GAAI,IAEhF,GAAI97C,EAAI,EACN,OAAOlW,KAAK0+D,KAAK1+D,KAAKk8F,IAAIpmC,EAAMj7B,EAAI+zB,EAAKqD,GAAI,GAAKjyD,KAAKk8F,IAAIpmC,EAAMh7B,EAAI8zB,EAAKsD,GAAI,IAEhF,MAAMr3B,EAAI+zB,EAAKmD,GAAK77C,GAAK04C,EAAKqD,GAAKrD,EAAKmD,IAClCj3B,EAAI8zB,EAAKoD,GAAK97C,GAAK04C,EAAKsD,GAAKtD,EAAKoD,IACxC,OAAOhyD,KAAK0+D,KAAK1+D,KAAKk8F,IAAIpmC,EAAMj7B,EAAIA,EAAG,GAAK76B,KAAKk8F,IAAIpmC,EAAMh7B,EAAIA,EAAG,GACpE,EAEA6hE,2BAA0B3iG,GAAoE,IAAnE,MAAEE,EAAK,WAAE6b,GAAwD/b,EAC1F,OAAI+b,IAAeM,EAAAA,GAAAA,QAAqBnc,GAAS,KACxC,EAGJ6b,IAAeM,EAAAA,GAAAA,OAAoBnc,GAAS,GAAO6b,IAAeM,EAAAA,GAAAA,OAAoBnc,EAAQ,EAC1F,EAGF,CACT,EAEA0iG,gBAAgB7zB,EAAgBhC,EAAkB81B,GAChD,MAAMC,EAAS98F,KAAK+xB,IAAIg3C,GAClBg0B,EAAY3uF,IAA8E,IAA7E,IAAE26C,EAAG,OAAEsrC,EAAM,OAAE2I,GAAyD5uF,EACzF,MAAM6uF,EAAMl0C,EAAIlT,WAChB,GAAIonD,EAAIp7F,SAAS,KAAM,CACrB,MAAMq7F,EAAcD,EAAI7gF,MAAM,KACxB+gF,EAAYl9F,OAAOi9F,EAAY,IAAMF,EAC3C,OAAOh9F,KAAKyrC,MAAMxrC,OAAOi9F,EAAY,KAAKrnD,WAAWunD,OAAOp9F,KAAKhE,IAAI,EAAGmhG,GAAY,KAAO9I,CAC7F,CACA,MAAM1mD,EAAO3tC,KAAK2tC,KAAKob,GACjBs0C,EAAsBr9F,KAAKk8F,IAAI,GAAIc,GACnCt7F,EAAUo7F,EAASO,EAAuB1vD,EAChD,OAAQ1tC,OAAOq9F,UAAU57F,GAAUA,EAASA,EAAOqlE,aAAoBp7D,IAAZo7D,EAAwBA,EAAU,IAAMstB,CAAM,EAG3G,OAAIyI,GAAUtI,EAAkBvhE,EAAU4oE,WAAagB,IAAc5pE,EAAU4oE,SACtEkB,EAAU,CACfh0C,IAAKggB,EACLsrB,OAAQ0H,EAAkB9oE,EAAU4oE,UACpCmB,OAAQlB,EAAkB7oE,EAAU4oE,YAE7BiB,GAAUtI,EAAkBvhE,EAAU2oE,UAAYiB,IAAc5pE,EAAU2oE,QAC5EmB,EAAU,CACfh0C,IAAKggB,EACLsrB,OAAQ0H,EAAkB9oE,EAAU2oE,SACpCoB,OAAQlB,EAAkB7oE,EAAU2oE,WAE7BkB,GAAUtI,EAAkBvhE,EAAU0oE,UAAYkB,IAAc5pE,EAAU0oE,QAC5EoB,EAAU,CACfh0C,IAAKggB,EACLsrB,OAAQ0H,EAAkB9oE,EAAU0oE,SACpCqB,OAAQlB,EAAkB7oE,EAAU0oE,WAE7BmB,GAAUtI,EAAkBvhE,EAAUyoE,WAAamB,IAAc5pE,EAAUyoE,SAC7EqB,EAAU,CACfh0C,IAAKggB,EACLsrB,OAAQ0H,EAAkB9oE,EAAUyoE,UACpCsB,OAAQlB,EAAkB7oE,EAAUyoE,iBAGnB/vF,IAAZo7D,EAAwBgC,EAAOhC,QAAQA,GAAWgC,EAAOlzB,UAEpE,EAEApK,MAAK74B,GAUF,IAVG,MACJ1Y,EAAK,UACLqpB,EAAY,EAAC,WACbxN,EAAU,eACVu0C,GAMD13C,EACC,GAAI5S,KAAK+xB,IAAI73B,IAAUs6F,EAAkBvhE,EAAU0oE,SACjD,OAAO5lE,KAAK6mE,gBAAgB1iG,EAAOowD,GAGrC,MAAMoK,EACsB,iBAAnBpK,EACHA,EACAv0B,KAAK4mE,2BAA2B,CAAEziG,MAAOqpB,EAAWxN,eAE1D,OAAI2+C,GAAU,GAAKx6D,EAAQ,KAElBA,EAAM6sE,QAAQrS,GAEhBz0D,OAAO,GAAD1F,OAAIyF,KAAKyrC,MAAMxrC,OAAO,GAAD1F,OAAIL,EAAK,MAAAK,OAAKm6D,KAAU,MAAAn6D,OAAKm6D,IAAUqS,QAAQrS,EACnF,EAEA6oC,yBAAwB90F,GAA6D,IAK/E+0F,EACAC,GANmB,KAAE7uC,EAAI,SAAEuM,GAAkD1yD,EACjF,GAAiB,IAAb0yD,EACF,MAAO,CAAEtgC,EAAG+zB,EAAKqD,GAAIn3B,EAAG8zB,EAAKsD,IAM3BtD,EAAKmD,IAAMnD,EAAKqD,IAAMrD,EAAKoD,IAAMpD,EAAKsD,IACxCurC,GAAmB,EACnBD,GAAmB,GACV5uC,EAAKmD,IAAMnD,EAAKqD,IAAMrD,EAAKoD,IAAMpD,EAAKsD,IAC/CurC,EAAkB,EAClBD,GAAmB,GACV5uC,EAAKmD,IAAMnD,EAAKqD,IAAMrD,EAAKoD,IAAMpD,EAAKsD,IAC/CurC,GAAmB,EACnBD,EAAkB,IAGlBC,EAAkB,EAClBD,EAAkB,GAGpB,MAAME,EAAW19F,KAAKozD,MAAMpzD,KAAK+xB,IAAI68B,EAAKqD,GAAKrD,EAAKmD,IAAK/xD,KAAK+xB,IAAI68B,EAAKsD,GAAKtD,EAAKoD,KAGjF,MAAO,CAAEn3B,EAFC+zB,EAAKqD,GAAKwrC,GAAmBtiC,EAAWn7D,KAAKszD,IAAIoqC,IAE/C5iE,EADF8zB,EAAKsD,GAAKsrC,GAAmBriC,EAAWn7D,KAAK0zD,IAAIgqC,IAE7D,EAEAC,wBAAuBr0F,GAQpB,IARqB,kBACtB46D,EAAiB,MACjBpR,EAAK,cACLqR,GAKD76D,EAGC,MAAMoqD,EAAM1zD,KAAK0zD,IAAIZ,GACfQ,EAAMtzD,KAAKszD,IAAIR,GASrB,MAAO,CAAEj4B,EAPPy4B,GAAO6Q,EAActpC,EAAIqpC,EAAkBrpC,GAC3C64B,GAAOyQ,EAAcrpC,EAAIopC,EAAkBppC,GAC3CopC,EAAkBrpC,EAKEC,EAHpBw4B,GAAO6Q,EAAcrpC,EAAIopC,EAAkBppC,GAC3C44B,GAAOyQ,EAActpC,EAAIqpC,EAAkBrpC,GAC3CqpC,EAAkBppC,EAEtB,EACA8iE,sBAAqB9zF,GAQlB,IARmB,YACpBw6D,EAAW,aACXF,EAAY,aACZC,GAKDv6D,EAGC,MAOM23B,GANJ2iC,EAAatpC,GAAKwpC,EAAYzpC,EAAIwpC,EAAaxpC,GAC/CypC,EAAYxpC,GAAKupC,EAAaxpC,EAAIupC,EAAavpC,GAC/CwpC,EAAavpC,GAAKspC,EAAavpC,EAAIypC,EAAYzpC,MAE9CupC,EAAavpC,EAAIypC,EAAYzpC,IAAMypC,EAAYzpC,EAAIwpC,EAAaxpC,IAChEupC,EAAatpC,EAAIwpC,EAAYxpC,IAAMwpC,EAAYxpC,EAAIupC,EAAavpC,IAGnE,OAAO96B,KAAKy9D,KAAKh8B,EACnB,EAEAo8D,4BAA4BvxD,EAAWC,EAAWuxD,EAAWC,GAM3D,GAAKzxD,EAAGzR,IAAM0R,EAAG1R,GAAKyR,EAAGxR,IAAMyR,EAAGzR,GAAOgjE,EAAGjjE,IAAMkjE,EAAGljE,GAAKijE,EAAGhjE,IAAMijE,EAAGjjE,EACpE,OAAO,EAGT,MAAMkjE,GAAeD,EAAGjjE,EAAIgjE,EAAGhjE,IAAMyR,EAAG1R,EAAIyR,EAAGzR,IAAMkjE,EAAGljE,EAAIijE,EAAGjjE,IAAM0R,EAAGzR,EAAIwR,EAAGxR,GAG/E,GAAoB,IAAhBkjE,EACF,OAAO,EAGT,MAAMC,IAAOF,EAAGljE,EAAIijE,EAAGjjE,IAAMyR,EAAGxR,EAAIgjE,EAAGhjE,IAAMijE,EAAGjjE,EAAIgjE,EAAGhjE,IAAMwR,EAAGzR,EAAIijE,EAAGjjE,IAAMmjE,EACvEE,IAAO3xD,EAAG1R,EAAIyR,EAAGzR,IAAMyR,EAAGxR,EAAIgjE,EAAGhjE,IAAMyR,EAAGzR,EAAIwR,EAAGxR,IAAMwR,EAAGzR,EAAIijE,EAAGjjE,IAAMmjE,EAG7E,GAAIC,EAAK,GAAKA,EAAK,GAAKC,EAAK,GAAKA,EAAK,EACrC,OAAO,EAOT,MAAO,CAAErjE,EAHCyR,EAAGzR,EAAIojE,GAAM1xD,EAAG1R,EAAIyR,EAAGzR,GAGrBC,EAFFwR,EAAGxR,EAAImjE,GAAM1xD,EAAGzR,EAAIwR,EAAGxR,GAGnC,EAGAqjE,sBAAsBC,EAAiBC,EAAiBC,EAAiBC,GAEvE,IAAInxF,EAAGC,EACP,MAAM3L,EAAuE,CAC3Em5B,EAAG,EACHC,EAAG,EACH0jE,SAAS,EACTC,SAAS,GAELT,GACHO,EAASzjE,EAAIwjE,EAASxjE,IAAMujE,EAASxjE,EAAIujE,EAASvjE,IAAM0jE,EAAS1jE,EAAIyjE,EAASzjE,IAAMwjE,EAASvjE,EAAIsjE,EAAStjE,GAC7G,GAAoB,IAAhBkjE,EACF,OAAO,EAGT5wF,EAAIgxF,EAAStjE,EAAIwjE,EAASxjE,EAC1BztB,EAAI+wF,EAASvjE,EAAIyjE,EAASzjE,EAC1B,MAAM6jE,GAAcH,EAAS1jE,EAAIyjE,EAASzjE,GAAKztB,GAAKmxF,EAASzjE,EAAIwjE,EAASxjE,GAAKztB,EACzEsxF,GAAcN,EAASxjE,EAAIujE,EAASvjE,GAAKztB,GAAKixF,EAASvjE,EAAIsjE,EAAStjE,GAAKztB,EAiB/E,OAhBAD,EAAIsxF,EAAaV,EACjB3wF,EAAIsxF,EAAaX,EAGjBt8F,EAAOm5B,EAAIujE,EAASvjE,EAAIztB,GAAKixF,EAASxjE,EAAIujE,EAASvjE,GACnDn5B,EAAOo5B,EAAIsjE,EAAStjE,EAAI1tB,GAAKixF,EAASvjE,EAAIsjE,EAAStjE,GAG/C1tB,EAAI,GAAKA,EAAI,IACf1L,EAAO88F,SAAU,GAGfnxF,EAAI,GAAKA,EAAI,IACf3L,EAAO+8F,SAAU,GAGZ/8F,CACT,EAGAk9F,gCAAgCh1B,EAAkBi1B,EAAeC,EAAqBC,GACpF,MAAMC,EAAmBjpE,KAAKooE,sBAAsBv0B,EAAWi1B,EAAQC,EAAcC,GAErF,SACGC,GACDA,EAAiBR,SACjBzoE,KAAKimE,WACHjmE,KAAKkpE,eAAer1B,EAAWo1B,GAC/BjpE,KAAKkpE,eAAer1B,EAAWi1B,KAC5B,IAGA,IAAKG,EAAkBnkE,EAAG76B,KAAKyrC,MAAMuzD,EAAiBnkE,GAAIC,EAAG96B,KAAKyrC,MAAMuzD,EAAiBlkE,GAClG,EAEAokE,4BAA2BA,CAACr6B,EAAWJ,KAG9B,CAAE5pC,GAFEgqC,EAAGhqC,EAAI4pC,EAAG5pC,GAAK,EAAI4pC,EAAG5pC,EAErBC,GADD+pC,EAAG/pC,EAAI2pC,EAAG3pC,GAAK,EAAI2pC,EAAG3pC,IAInCqkE,gBAAgBC,GACd,MAAMx+F,EAASZ,KAAK0+D,KAAK0gC,EAAEvkE,EAAIukE,EAAEvkE,EAAIukE,EAAEtkE,EAAIskE,EAAEtkE,GAC7C,MAAO,CAAED,EAAGukE,EAAEvkE,EAAIj6B,EAAQk6B,EAAGskE,EAAEtkE,EAAIl6B,EACrC,EAEAy+F,uBAAsBA,CAACD,EAAUE,KACxB,CAAEzkE,EAAGukE,EAAEvkE,EAAIykE,EAAQxkE,EAAGskE,EAAEtkE,EAAIwkE,IAGrCC,UAASA,CAAC16B,EAAWJ,KACZ,CAAE5pC,EAAGgqC,EAAGhqC,EAAI4pC,EAAG5pC,EAAGC,EAAG+pC,EAAG/pC,EAAI2pC,EAAG3pC,IAGxCmkE,eAAcA,CAACp6B,EAAWJ,KACjB,CAAE5pC,EAAGgqC,EAAGhqC,EAAI4pC,EAAG5pC,EAAGC,EAAG+pC,EAAG/pC,EAAI2pC,EAAG3pC,I,oECrXnC,MAAMglC,EAAW,CACtB0/B,SAAS,EACTC,WAAW,EACXl8C,UAAU,EACVkf,WAAW,EACXi9B,WAAW,EACXC,gBAAgB,EAChBnwE,MAAO,MACPowE,OAAQC,QACRC,cAAeA,CAAC14F,EAAO0qD,KACrB,MAAMxzD,EAAQoC,OAAOC,KAAKmxD,GAC1B,MAC6B,UAA3B1qD,EAAMgvB,YAAY73B,MACS,UAA3B6I,EAAMgvB,YAAY73B,MACA,IAAjBD,EAAMsC,SAA8B,UAAbtC,EAAM,IAA+B,eAAbA,EAAM,GAAqB,EAG/EyhG,iBAAmBpzF,GAAUA,EAC7BqzF,eAAgBA,CAAAhmG,EAA0BoL,EAAO2hC,EAAMk5D,KAAS,IAA/C,UAAEx9B,EAAS,SAAElf,GAAUvpD,EACtC,MAAMkmG,EAAQ,CAAC,SAQf,OAPAA,EAAM33F,KAAK,KAADhO,OAAMke,OAAOrT,KACnBq9D,GACFy9B,EAAM33F,KAAK,OAADhO,OAAQwsC,IAEhBwc,GACF28C,EAAM33F,KAAK,SAADhO,OAAU0lG,EAAKl5B,QAAQ,GAAE,SAE9Bm5B,EAAMx0F,KAAK,IAAI,EAExBw5E,OAAQ,CACN9/E,MAAOA,IAAM,UACbc,UAAWA,IAAM,UACjBk6C,OAAQA,IAAM,UACd+/C,UAAWA,IAAM,UACjBxzF,MAAOA,IAAM,YAKXyzF,EAAM,SAACr3C,GAAkB,OADfk0C,EAC2B,IADtBoD,GACM3wF,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,GAA8Bq5C,EAAIlT,WAAWj1C,OAD5C,IAAIskB,MAAMm7E,EAAQ,GAAG30F,KAAKuxF,GAC4Bl0C,EADtEue,IAAC21B,EAAKoD,CACmE,EAI3EC,EAAgB,SAACC,GAA2B,IAAjB9rF,EAAO/E,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,CAAC,EACjD,MAAM,OAAEkwF,EAAM,UAAEF,EAAS,eAAEM,EAAc,UAAEP,EAAS,UAAEh9B,EAAS,SAAElf,EAAQ,eAAEo8C,EAAc,OAAEza,EAAM,MAAE11D,GAAU,IACxGswC,KACArrD,IAEC,YAAE+rF,EAAW,MAAEp7F,EAAK,UAAEc,EAAS,KAAEgX,EAAI,MAAEvQ,EAAK,UAAEwzF,EAAS,KAAEF,GAASM,EAElEE,EAVgB,GAAAlmG,OACnB6lG,GADer5D,EAUey5D,GATrBxuB,YAAW,KAAAz3E,OAAI6lG,EAAIr5D,EAAKmrC,cAAa,KAAA33E,OAAI6lG,EAAIr5D,EAAK25D,cAAa,KAAAnmG,OAAI6lG,EAAIr5D,EAAK45D,kBAAmB,IADzF55D,MAWlB,MAAM65D,EAAW1b,EAAO9/E,MAAQ,UAAH7K,OAAa2qF,EAAO9/E,MAAMA,GAAM,KAAM,GAC7Dy7F,EAAY,CAAC,sCACnBA,EAAUt4F,KAAKq4F,GACXn+B,GACFo+B,EAAUt4F,KAAK,sCAEbg7C,GACFs9C,EAAUt4F,KAAK,sCAEjB,MAAMu4F,EAAiBd,EAAelgC,EAAU16D,EAAOq7F,EAAeR,GAEtE,IACMR,EACEva,EAAO9/E,MACTw6F,EAAOmB,eAAe,MAADxmG,OAAOumG,MAAqBD,GAEjDjB,EAAOmB,eAAeD,GAEf5b,EAAO9/E,MAChBw6F,EAAOoB,MAAM,MAADzmG,OAAOumG,MAAqBD,GAExCjB,EAAOoB,MAAMF,EAEjB,CAAE,MAAO5iG,GACP0hG,EAAOlyD,IAAIozD,EACb,CAEA,GAAI5b,EAAOh/E,UAAW,CACpB,MAAM+6F,EAAS,UAAH1mG,OAAa2qF,EAAOh/E,UAAUA,GAAU,uBACpD05F,EAAOpwE,GAAO,gBAAiByxE,EAAQ/6F,EACzC,MACE05F,EAAOpwE,GAAO,aAActpB,GAG9B,GAAIg/E,EAAO9kC,OAAQ,CACjB,MAAM6gD,EAAS,UAAH1mG,OAAa2qF,EAAO9kC,OAAOljC,GAAK,uBAC5C0iF,EAAOpwE,GAAO,gBAAiByxE,EAAQ/jF,EACzC,MACE0iF,EAAOpwE,GAAO,aAActS,GAG9B,GAAIvQ,GAAS+yF,EACX,GAAIxa,EAAOv4E,MAAO,CAChB,MAAMs0F,EAAS,UAAH1mG,OAAa2qF,EAAOv4E,MAAMA,EAAOzG,GAAU,wBACvD05F,EAAc,MAAE,gBAAiBqB,EAAQt0F,EAC3C,MACEizF,EAAc,MAAE,aAAcjzF,GAIlC,GAAIu4E,EAAOib,UAAW,CACpB,MAAMc,EAAS,UAAH1mG,OAAa2qF,EAAOib,UAAUA,GAAU,uBACpDP,EAAOpwE,GAAO,gBAAiByxE,EAAQd,EACzC,MACEP,EAAOpwE,GAAO,aAAc2wE,GAG1BR,IACFC,EAAOmB,eAAe,SACtBnB,EAAOsB,QACPtB,EAAOuB,YAGT,IACEvB,EAAOuB,UACT,CAAE,MAAOjjG,GACP0hG,EAAOlyD,IAAI,gBACb,CACF,EAEa0zD,EAAaA,KACxBr4F,OAAe,OAAI+2D,EAEnB,MAAMuhC,EAAiBxrE,IAAAA,MAAAA,UAAAA,KACvBA,IAAAA,MAAAA,UAAAA,KAA6B,SAAUi8B,GACrC,GAAIgO,EAAS0/B,UAAY1/B,EAASggC,cAAc/pE,KAAM+7B,GAAQ,CAC5D,MAAMwvC,EAAU/yF,KAAKC,MACf+xF,EAAW,CACfn7F,MAAO,GAAF7K,OAAKw7B,KAAKK,YAAY73B,KAAI,MAAAhE,OAAKw7B,KAAK5mB,IAAM4mB,KAAK5a,IAAG,KACvDmmF,QAASA,EACTd,YAAa,IAAIjyF,KAAK+yF,GACtBp7F,UAAW6vB,KAAKwrE,aAChBrkF,KAAM40C,GAGR,IAAI0vC,EACJ,IACEA,EAAgBH,EAAeI,MAAM1rE,KAAMrmB,UAC7C,CAAE,MAAOxR,GACPqiG,EAAS5zF,MAAQzO,CACnB,CAMA,OAJAqiG,EAASJ,UAAYpqE,KAAKwrE,aAC1BhB,EAASN,KAAO1xF,KAAKC,MAAQ+xF,EAASe,QAEtChB,EAAcC,GACPiB,CACT,CACE,OAAOH,EAAeI,MAAM1rE,KAAMrmB,UAEtC,CAAC,E,geCrJH,MAAMgyF,UAA0B3jE,EAAAA,EAAa3H,cAAA,SAAA1mB,WAAA2mB,EAAA,cAOlC,EAAC,CANVP,iBAAiB3tB,GACf4tB,KAAKC,UAAU,oBAAqB,WAAY,aAAc,SAAU,SAAU,aAClFD,KAAK4rE,UAAU,OAAQx5F,EACzB,CAKAstB,oBAAoB,IAAAmsE,EAClB,OAEU,QAFVA,EAAO7rE,KAAKtuB,SAASL,MAClB2V,QACA7C,eAAO,IAAA0nF,GACK,QADLA,EAFHA,EAGHv2E,mBAAW,IAAAu2E,OAAA,EAHRA,EAGUtkG,MAAMukG,GAAeA,EAAWv3F,aAAcyrB,gBAAI,EAAJA,KAAMzrB,YACvE,CAEAkR,WACE,MAAO,IACFke,MAAMle,WACTo/E,OAAQ7kE,KAAK6kE,OAEjB,CAEA39E,WACE,MAAO,IACFyc,MAAMzc,WACT29E,OAAQ7kE,KAAK6kE,OAEjB,EAGF,U,wBC/BA,MAAMkH,UAAkBjsE,IAAAA,MACtBC,iBAAiB9S,GACf+S,KAAKC,UAAU,YAAa,YAC5BD,KAAK4rE,UAAU,QAAS3+E,EAC1B,EAOF,UCXA,MAAM++E,UAAgBlsE,IAAAA,MACpBC,iBAAiB9S,GACf+S,KAAKC,UAAU,UAAW,WAC1BD,KAAK4rE,UAAU,QAAS3+E,EAC1B,EAMF,U,wBCCAynB,EAAAA,EAAAA,UAAgBjR,EAAAA,EAAMvf,EAAAA,EAAOywC,EAAAA,GAC7BA,EAAAA,EAAAA,UAAsBjgB,EAAAA,EAAO+X,EAAAA,GAC7BA,EAAAA,EAAAA,YACA9sC,EAAAA,EAAAA,UAAkB8jB,EAAAA,GAClBkoE,EAAAA,UAA4BloE,EAAAA,GAC5BsoE,EAAAA,UAAoBr3D,EAAAA,GACpBs3D,EAAAA,UAAkBt3D,EAAAA,GAClBjR,EAAAA,EAAAA,UAAe9jB,EAAAA,EAASgsF,EAAmBj3D,EAAAA,GCjBR,cAA/BtnC,SAASqI,SAASw2F,UACpBZ,G,qsBCoEF,MAAMU,UAAyDjsE,IAAAA,OAI7DC,mBACEp1B,OAAO0hE,eAAersC,KAAKm+B,UAAW,SAAU,CAC9C3e,MACE,OAAOxf,KAAK3uB,MAAMsgB,MACpB,IAEFhnB,OAAO0hE,eAAersC,KAAKm+B,UAAW,gBAAiB,CACrD3e,MACE,MAAM,kBAAE1oB,GAAsBkJ,KAAK4W,yBACnC,OAAO5W,KAAKrO,OAASmF,EAAkBpF,IAAIC,OAASmF,EAAkBsY,OAAOzd,MAC/E,GAEJ,CAEAoO,kBAAkB9xB,EAAoBoD,GACpC,MAAM4mD,EAAY,IAAIj4B,KAAK/xB,EAAQoD,GAEnC,OADA4mD,EAAUzpD,IAAIP,GACPgqD,CACT,CAEAl4B,0BAAyB97B,GAAkE,IAAjE,OAAEgc,GAA6Dhc,EACvF,MAAOioG,EAAY,IAAKC,EAAAA,EAAAA,IAAkClsF,GAC1D,OAAOisF,CACT,CAoBA7rE,YAAY07B,EAAc1qD,GACxBsyB,MAAMo4B,EAAO1qD,GAAMivB,EAAA,qBAAAA,EAAA,qBAAAA,EAAA,kBAXR,GAACA,EAAA,kBACD,GAACA,EAAA,kBACD,GAACA,EAAA,aACN,GAACA,EAAA,oBACM,GAACA,EAAA,iBACW,MAAIA,EAAA,qBAChB,GAAIA,EAAA,eACM,MAAIA,EAAA,sBAAAA,EAAA,WAmavBwE,GAAc9E,KAAK3uB,MAAMw0B,MAAMf,EAAE9E,KAAK7Y,KAAKogB,SAASzC,MAAGxE,EAAA,WAEvDyE,GAAc/E,KAAK3uB,MAAMw0B,MAAMd,EAAEA,KAAEzE,EAAA,0BA0FpB7uB,GA/kBWwmD,KAChC,OAAQA,GACN,KAAKrmD,EAAAA,EAAAA,KACH,MAAO,CAAE5L,IAAK,EAAGC,IAAK,GACxB,KAAK2L,EAAAA,EAAAA,IACH,MAAO,CAAE5L,IAAK,EAAGC,IAAK,IACxB,KAAK2L,EAAAA,EAAAA,IACL,KAAKA,EAAAA,EAAAA,IACL,KAAKA,EAAAA,EAAAA,IACL,KAAKA,EAAAA,EAAAA,KACL,KAAKA,EAAAA,EAAAA,IACL,KAAKA,EAAAA,EAAAA,IACL,KAAKA,EAAAA,EAAAA,MACL,KAAKA,EAAAA,EAAAA,IACH,MAAO,CAAE5L,IAAK,EAAGC,IAAK,KACxB,KAAK2L,EAAAA,EAAAA,KACL,KAAKA,EAAAA,EAAAA,IACL,KAAKA,EAAAA,EAAAA,KACH,MAAO,CAAE5L,KAAM,EAAGC,IAAK,GACzB,KAAK2L,EAAAA,EAAAA,GACH,MAAO,CAAE5L,KAAM,IAAKC,IAAK,GAC3B,KAAK2L,EAAAA,EAAAA,OACL,KAAKA,EAAAA,EAAAA,IACH,MAAO,CAAE5L,KAAM,IAAKC,IAAK,KAC3B,KAAK2L,EAAAA,EAAAA,IACL,KAAKA,EAAAA,EAAAA,GACH,MAAO,CAAE5L,KAAM,IAAKC,IAAK,KAC3B,QACE,MAAO,CAAED,IAAK,EAAGC,IAAK,KAC1B,EAkjBsDmmG,CAAyB36F,KA1f7EuuB,KAAK+7B,MAAQA,EACb/7B,KAAK3uB,MAAQA,EACb2uB,KAAK7Y,KAAO6Y,KAAK3uB,MAAM2V,QAAQ7C,QAE/B6b,KAAK68C,YAAc78C,KAAK68C,YAAYv5C,KAAKtD,MACzCA,KAAKyK,gBAAkBzK,KAAKyK,gBAAgBnH,KAAKtD,MAEjDA,KAAK3uB,MAAM2V,QAAQsc,KAAK,SAAUtD,KAAKjyB,QAAQu1B,KAAKtD,KAAM,WAC1DA,KAAK3uB,MAAMiyB,KAAK,gBAAiBtD,KAAKjyB,QAAQu1B,KAAKtD,KAAM,WACzD,MAAMi9C,EAA0Bj9C,KAAKjyB,QAAQu1B,KAAKtD,KAAM,SAAU,SAClEA,KAAK3uB,MAAMiyB,KAAK,WAAW,KACzB45C,EAAAA,EAAAA,OAAkB,SAAUD,EAAwB,IAEtDC,EAAAA,EAAAA,KAAgB,SAAUD,GAE1Bj9C,KAAK3uB,MAAM2V,QAAQ2M,eAAe2P,KAAK,QAAStD,KAAK88C,WAAWx5C,KAAKtD,MACvE,CAEIn4B,WACF,OAAQm4B,KAAKK,YAAiCx4B,IAChD,CAEI3D,YACF,OAAQ87B,KAAKK,YAAiCn8B,KAChD,CAEAy8B,OAAOuT,GACL,MAAM,kBAAEpd,GAAsBkJ,KAAK4W,yBACnC5W,KAAK7Y,KAAO6Y,KAAK3uB,MAAM2V,QAAQ7C,QAC/B6b,KAAKzL,WAAayL,KAAK3uB,MAAM2V,QAAQuN,WACrCyL,KAAK95B,MAAQ85B,KAAK3uB,MAAM2V,QAAQ9gB,MAChC85B,KAAKyoD,aAAezoD,KAAK95B,MAAQ4wB,EAAkBsH,KAAKl4B,MAAQ4wB,EAAkBuU,MAAMnlC,MAExF85B,KAAKqsE,UAELrsE,KAAK88C,aAEL98C,KAAK68C,YAAY3oC,GAEjBA,EAAQ/5B,OACR6lB,KAAKy9C,KAAKvpC,GACVlU,KAAK+9C,YAAY7pC,GACjB,MAAM2oB,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,UACAu1B,QAASzpC,KAAKzL,WAAauC,EAAkBsH,KAAKl4B,MAClDwjE,QAAS5yC,EAAkBpF,IAAIC,SAEjCkrC,EAAUqkB,KACVlhD,KAAKssE,gBAAgBp4D,GACrB2oB,EAAU6lB,OACVxuC,EAAQvJ,UAEH3K,KAAKusE,uCACRvsE,KAAKwsE,YAAYt4D,EAErB,CAEAu4D,qBAKE,QAAIzsE,KAAK3b,YAAc2b,KAAK7Y,KAAK9C,YAAa2b,KAAK0sE,gBACjD1sE,KAAK3b,UAAY2b,KAAK7Y,KAAK9C,UAC3B2b,KAAK0sE,cAAe,GACb,EAGX,CAEA7vB,YAAY3oC,GACV,MAAM,kBAAEpd,EAAiB,cAAExR,GAAkB0a,KAAK4W,0BAC5C,OAAE2lB,GAAWj3C,EAAciuC,QACjC,IAAIxuB,EACJ,MAAM83B,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,UACAu1B,QAAS3yC,EAAkBsH,KAAKl4B,MAChCwjE,QAAS5yC,EAAkBpF,IAAIC,SAEjCkrC,EAAUqkB,KACV,MAAMS,EAAQ3hD,KAAK3uB,MAAMw0B,MAAMd,EAAE48C,MAAM,IACjCgrB,EAAe1iG,KAAK+xB,IAAI2lD,EAAM,GAAKA,EAAM,IACzC4R,EAAQ,IAAI9hB,EAAAA,EAChB,CACEzV,GAAI,EACJE,GAAIl8B,KAAKyoD,aACT/W,YAAanV,EAAOgrB,KACpB5V,WAAY,GAEd3xC,KAAK3uB,OAED6C,EAAO,IAAI8sD,EAAAA,EACf,CACEl8B,EAAG9E,KAAKyoD,aAAetK,EAAAA,GAAAA,EAAWrnD,EAAkBuU,MAAMg3C,KAAKpE,OAAO7/C,KACtE+iC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQlqC,EAAkBuU,MAAMg3C,KAAKlhB,MAC3EC,UAAW7E,EAAOroD,KAClBqtD,aAAcyM,EAAAA,GAAAA,QAEhBhuC,KAAK3uB,OAEP,IAAK,IAAI6G,EAAQ,EAAGA,EAAQypE,EAAM92E,OAAQqN,IAAS,CACjD,MAAM0pE,EAAOD,EAAMzpE,GACnB6sB,EAAI96B,KAAKyrC,MAAM1V,KAAK2/B,GAAGiiB,IACvB2R,EAAM/kF,IAAI,CAAEytD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKpE,OAAOuT,GAC/Bh8B,EAAQ,GAAM,GAChBhE,EAAK1F,IAAI,CAAE0F,KAAM8rB,KAAK4sE,WAAWhrB,EAAM+qB,GAAe5nE,MAAKpE,OAAOuT,EAEtE,CAEA,MACM24D,EAAO7sE,KAAK6gD,cACZisB,EAA4B,OAAnB9sE,KAAK+sE,UAAqB,EAAI9iG,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK+sE,YACL,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAA1C,MAAlBvtE,KAAK+sE,WAAqBD,GAHjB,GAGmCA,GAAUD,GACxD,IAAI7rC,EAAAA,EACF,CACE9sD,KAAMqZ,EAAAA,GAAAA,gBAAqByS,KAAK+sE,UAAW,GAC3CjoE,EAAG9E,KAAKyoD,aAAetK,EAAAA,GAAAA,EAAW3b,EAAAA,GAAAA,IAAc1rC,EAAkBuU,MAAMg3C,KAAKpE,OAAO7/C,KACpF2G,EAAG+nE,EACH3rC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQlqC,EAAkBuU,MAAMg3C,KAAKlhB,MAC3EE,WAAYvqC,EAAkBuU,MAAMg3C,KAAKlhB,KAAKE,WAC9CG,QAAS,CACP9vC,IAAoD,QAAjDs7E,EAAmC,QAAnCC,EAAEn2E,EAAkBuU,MAAMg3C,KAAKlhB,YAAI,IAAA8rC,GAAS,QAATA,EAAjCA,EAAmCzrC,eAAO,IAAAyrC,OAAA,EAA1CA,EAA4Cv7E,WAAG,IAAAs7E,EAAAA,EAAIxqC,EAAAA,GAAAA,IACxDn3B,MAAwD,QAAnD6hE,EAAmC,QAAnCC,EAAEr2E,EAAkBuU,MAAMg3C,KAAKlhB,YAAI,IAAAgsC,GAAS,QAATA,EAAjCA,EAAmC3rC,eAAO,IAAA2rC,OAAA,EAA1CA,EAA4C9hE,aAAK,IAAA6hE,EAAAA,EAAI1qC,EAAAA,GAAAA,IAC5DpzB,OAA0D,QAApDg+D,EAAmC,QAAnCC,EAAEv2E,EAAkBuU,MAAMg3C,KAAKlhB,YAAI,IAAAksC,GAAS,QAATA,EAAjCA,EAAmC7rC,eAAO,IAAA6rC,OAAA,EAA1CA,EAA4Cj+D,cAAM,IAAAg+D,EAAAA,EAAI5qC,EAAAA,GAAAA,IAC9DpkC,KAAsD,QAAlDkvE,EAAmC,QAAnCC,EAAEz2E,EAAkBuU,MAAMg3C,KAAKlhB,YAAI,IAAAosC,GAAS,QAATA,EAAjCA,EAAmC/rC,eAAO,IAAA+rC,OAAA,EAA1CA,EAA4CnvE,YAAI,IAAAkvE,EAAAA,EAAI9qC,EAAAA,GAAAA,KAE5DjB,aAAcyM,EAAAA,GAAAA,OACd5M,UAAW7E,EAAOixC,qBAClB/rC,WAAYlF,EAAOkxC,4BAErBztE,KAAK3uB,OACLsvB,OAAOuT,GAGX2oB,EAAU6lB,MACZ,CAEA3E,YAAY7pC,GACV,MAAM,kBAAEpd,EAAiB,cAAExR,GAAkB0a,KAAK4W,0BAC5C,OAAE2lB,GAAWj3C,EAAciuC,QAC3BsyB,EAAQ,IAAIpU,EAAAA,EAChB,CACEzV,GAAI,EACJE,GAAI,EACJD,GAAI,EACJE,GAAIn8B,KAAK6gD,cACTnP,YAAanV,EAAOgrB,KACpB5V,WAAY,GAEd3xC,KAAK3uB,OAEDwrD,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,UACAu1B,QAAS3yC,EAAkBsH,KAAKl4B,MAChCwjE,QAAS5yC,EAAkBpF,IAAIC,SAEjCkrC,EAAUqkB,KACV,IAAK,IAAIU,EAAO,EAAGiS,EAAM7zD,KAAK7Y,KAAKjE,KAAKrY,OAAQ+2E,EAAOiS,EAAKjS,GAAQ,GAAI,CACtE,MAAM98C,EAAI76B,KAAKyrC,MAAM1V,KAAK6W,GAAG+qC,GAAQ5hD,KAAKzL,YACtCuQ,GAAK,IAAMA,EAAI9E,KAAK95B,MAAQ,IAIhC2/E,EAAMr3E,IAAI,CAAEwtD,GAAIl3B,EAAGo3B,GAAIp3B,IAAKnE,OAAOuT,EACrC,CACA2oB,EAAU6lB,MACZ,CAEA8pB,YAAYt4D,GACNlU,KAAKusE,sCACPvsE,KAAK0tE,sBAAsBx5D,GAE3BlU,KAAK2tE,qBAAqBz5D,EAE9B,CAEAy5D,qBAAqBz5D,GACnB,MAAM,kBAAEpd,EAAiB,cAAExR,GAAkB0a,KAAK4W,0BAC5C,OAAE2lB,GAAWj3C,EAAciuC,QAC3BrvD,EAAQ,IAAI88D,EAAAA,EAChB,CACE9sD,KAAM8rB,KAAK8f,WACXhb,EAAGhO,EAAkBsH,KAAKwvE,eAAe3vB,OAAO7/C,KAChD2G,EAAGjO,EAAkBsH,KAAKwvE,eAAe3vB,OAAOvsD,IAChDyvC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQlqC,EAAkBsH,KAAKwvE,eAAezsC,MACpFC,UAAW7E,EAAOroD,KAClBotD,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,KAEhBhuC,KAAK3uB,OAGP,OADA2uB,KAAK6tE,WAAa3pG,EAAMumE,QAAQv2B,GACzBhwC,EAAMy8B,OAAOuT,EACtB,CAEAw5D,sBAAsBx5D,GACpB,MAAM,kBAAEpd,GAAsBkJ,KAAK4W,0BAC7B,MAAErmC,EAAK,2BAAE6M,GAA+B4iB,KAAK3uB,MAAM2V,QAAQ2M,eAC3DmjC,EAAavmD,IAAUu7C,EAAAA,GAAAA,KACvBhnB,EACJ1nB,IAA+BC,EAAAA,GAAAA,UAC3B8gE,EAAAA,GAAAA,EACArnD,EAAkBsH,KAAKwvE,eAAe3vB,OAAO7/C,KAC7C2G,EAAIjO,EAAkBsH,KAAKwvE,eAAe3vB,OAAOvsD,IACjDxtB,EAAQ,IAAI88D,EAAAA,EAChB,CACE9sD,KAAM8rB,KAAK8f,WACXhb,EAAO,EAAJA,EACHq8B,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQlqC,EAAkBsH,KAAKwvE,eAAezsC,MACpFC,UAAWkb,IAAAA,KAAoBxlB,EAAa,GAAK,KACjDwK,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,QAEhBhuC,KAAK3uB,OAeP,OAbA2uB,KAAK6tE,WAAa3pG,EAAMumE,QAAQv2B,GAAgE,EAArDpd,EAAkBsH,KAAKwvE,eAAe3vB,OAAO7/C,KACxFl6B,EAAMsK,IAAI,CAAEu2B,EAAGA,GAAKk1D,EAAAA,GAAyB/1F,EAAM63D,MAAMsF,WAAa,KCnVnE,SAAoBp9D,GAgBxB,IAhByB,IAC1B6pG,EAAG,EACHhpE,EAAC,EACDC,EAAC,MACD7+B,EAAK,OACLyrB,EAAM,OACNoxC,EAAM,MACNr+D,GASDT,EACC6pG,EAAIjxC,UAAU,GAAK,IACnBixC,EAAIt/F,IAAI,cAAe9J,GACvBopG,EAAIt/F,IAAI,YAAa9J,GACrBopG,EAAIhxC,YACJgxC,EAAI7wC,OAAOn4B,EAAGC,EAAIg+B,GAClB+qC,EAAI5wC,OAAOp4B,EAAGC,EAAIpT,EAASoxC,GAC3B+qC,EAAInpC,MAAM7/B,EAAGC,EAAIpT,EAAQmT,EAAIi+B,EAAQh+B,EAAIpT,EAAQoxC,GACjD+qC,EAAI5wC,OAAOp4B,EAAI5+B,EAAQ68D,EAAQh+B,EAAIpT,GACnCm8E,EAAInpC,MAAM7/B,EAAI5+B,EAAO6+B,EAAIpT,EAAQmT,EAAI5+B,EAAO6+B,EAAIpT,EAASoxC,EAAQA,GACjE+qC,EAAI5wC,OAAOp4B,EAAI5+B,EAAO6+B,EAAIg+B,GAC1B+qC,EAAInpC,MAAM7/B,EAAI5+B,EAAO6+B,EAAGD,EAAI5+B,EAAQ68D,EAAQh+B,EAAGg+B,GAC/C+qC,EAAI5wC,OAAOp4B,EAAIi+B,EAAQh+B,GACvB+oE,EAAInpC,MAAM7/B,EAAGC,EAAGD,EAAGC,EAAIg+B,EAAQA,GAC/B+qC,EAAI3wC,SACJ2wC,EAAI3uC,OACJ2uC,EAAIjxC,WAAW,IAAM,GACvB,CDmTIkxC,CAAY,CACVD,IAAK55D,EACLpP,IACAC,IACApT,OAAQsoE,EAAAA,GACR/zF,MAAO85B,KAAK6tE,WACZ9qC,OAAQ,EACRr+D,MAAO,GAAFF,OAAK83E,IAAAA,KAAoBxlB,EAAa,IAAM,IAAG,QAEtD5yD,EAAMy8B,OAAOuT,GAEN,CAAEpP,IAAGC,IAAG8oE,WAAY7tE,KAAK6tE,WAClC,CAEAjkE,YAAYsK,IACVtK,EAAAA,EAAAA,IAAY,CACVsK,UACAgpC,WAAU,IACV9qE,UAAW4tB,KAAK3uB,MAChB8S,MAAO6b,KAAK7Y,KACZshE,aAAczoD,KAAKyoD,aACnB5H,cAAe7gD,KAAK6gD,cACpBlvE,aAAa,EACbq8F,gBAAiBhuE,KAAKn4B,OAAS+J,EAAAA,EAAAA,KAC/Bi3E,kBAAoB7oD,KAAKusE,2CAA+D32F,EAAvBoqB,KAAKyK,kBAGpEzK,KAAKusE,uCACPvsE,KAAKyK,gBAAgByJ,EAASgpC,EAAAA,EAAAA,qBAAgCl9C,KAAK3uB,OAEvE,CAEAo5B,gBAAgByJ,EAAmC80C,GACjDhpD,KAAK7Y,KAAO6Y,KAAK3uB,MAAM2V,QAAQ7C,QAC/B,MAAMjM,EAAQhO,OAAO6xB,MAAMitD,GAAchpD,KAAK7Y,KAAK+vB,MAAMrsC,OAAS,EAAIm+E,EAClEhpD,KAAKusE,uCACPvsE,KAAK0tE,sBAAsBx5D,GAE3BlU,KAAKiuE,0BAA0B/5D,EAASh8B,IAExC8nB,KAAKkuE,yBAAyBh6D,EAASh8B,EAE3C,CAEA+1F,0BAA0BxvF,EAA6BotD,GAAa,CAEpEqiC,yBAAyBzvF,EAA6BotD,GAAa,CAEnEsiC,yBACEj6D,EACAttB,EACAtd,EACA0pF,EACAob,EACAnb,EACAob,GAEA,MAAM,kBAAEv3E,GAAsBkJ,KAAK4W,yBACnC,GAA+B,IAA3B5W,KAAK7Y,KAAK+vB,MAAMrsC,OAAc,OAEjB,MAAbwjG,IACFA,GAAY,GAGdn6D,EAAQ/5B,OAER,IAAIm0F,EAAarkG,KAAKyrC,MAAM1V,KAAK2/B,GAAGqzB,GAAYhzD,KAAK2/B,GAAG3/B,KAAK3uB,MAAMw0B,MAAMd,EAAE6B,SAAS,MAChF0nE,GAAc,IAAK3zB,EAAAA,EAAAA,SACrBzmC,EAAQ4oB,YACR5oB,EAAQ8kC,MACLh5C,KAAKzL,WACNyL,KAAK2/B,GAAG3/B,KAAK3uB,MAAMw0B,MAAMd,EAAE6B,SAAS,IAAM,EAC1C5G,KAAKyoD,aACL6lB,EAAa,EAAIA,EAAa,GAAK,IAGvCp6D,EAAQupC,OACRvpC,EAAQ1lC,IAAI,YAAa,WAEzB0lC,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOj9B,KAAK6W,GAAG,GAAI5sC,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK3uB,MAAMw0B,MAAMd,EAAE6B,SAAS,MAC1E,MAAM2nE,EAAyB,CAC7BpqF,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZsoG,gBAAiBllG,IAEnB8+E,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG/4C,EAAMvQ,KAAK,IAGpD69B,EAAQgpB,OAAOl9B,KAAK6W,GAAG7W,KAAK7Y,KAAK+vB,MAAMrsC,OAAS,GAAIZ,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK3uB,MAAMw0B,MAAMd,EAAE6B,SAAS,MACnGsN,EAAQirB,OACRjrB,EAAQvJ,UACJ0jE,GACF,IAAI58B,EAAAA,EACF,CACEzV,IAAKh8B,KAAKzL,WACV2nC,IAAKl8B,KAAKzL,WAAayL,KAAKyoD,aAC5BxsB,GAAIhyD,KAAKyrC,MAAM1V,KAAK2/B,GAAGqzB,IACvB72B,GAAIlyD,KAAKyrC,MAAM1V,KAAK2/B,GAAGqzB,IACvBthB,YAAa,WAEf1xC,KAAK3uB,OACLsvB,OAAOuT,GAGPm6D,GACFruE,KAAKyuE,eAAev6D,EAASk6D,GAG/Bl6D,EAAQ/5B,OACRm0F,EAAarkG,KAAKyrC,MAAM1V,KAAK2/B,GAAGszB,KAC5Bqb,GAAc,IAAK3zB,EAAAA,EAAAA,SACrBzmC,EAAQ4oB,YACR5oB,EAAQ8kC,MACLh5C,KAAKzL,WACNyL,KAAK2/B,GAAG3/B,KAAK3uB,MAAMw0B,MAAMd,EAAE6B,SAAS,IACpC5G,KAAKyoD,aACL6lB,EAAa,EAAIA,EAAa,IAIlCp6D,EAAQupC,OACRvpC,EAAQ1lC,IAAI,YAAa,WACzB0lC,EAAQ4oB,YACR5oB,EAAQ+oB,OAAOj9B,KAAK6W,GAAG,GAAI5sC,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK3uB,MAAMw0B,MAAMd,EAAE6B,SAAS,OAC1EwhD,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG/4C,EAAMvQ,KAAK,IAGpD69B,EAAQgpB,OAAOl9B,KAAK6W,GAAG7W,KAAK7Y,KAAK+vB,MAAMrsC,OAAS,GAAIZ,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK3uB,MAAMw0B,MAAMd,EAAE6B,SAAS,IAAM,IACzGsN,EAAQirB,OACRjrB,EAAQvJ,UACJ0jE,GACF,IAAI58B,EAAAA,EACF,CACEzV,IAAKh8B,KAAKzL,WACV2nC,IAAKl8B,KAAKzL,WAAayL,KAAKyoD,aAC5BxsB,GAAIhyD,KAAKyrC,MAAM1V,KAAK2/B,GAAGszB,IACvB92B,GAAIlyD,KAAKyrC,MAAM1V,KAAK2/B,GAAGszB,IACvBvhB,YAAa,WAEf1xC,KAAK3uB,OACLsvB,OAAOuT,GAGXA,EAAQ1lC,IAAI,cAAesoB,EAAkBy8B,QAAQgJ,OAAO1D,MAC5D3kB,EAAQ1lC,IAAI,YAAa,WAEzB0lC,EAAQ2oB,UAAU,GAAK,IACvB3oB,EAAQ4oB,aACRsrB,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQgpB,OAAOjzD,KAAKyrC,MAAM5Q,GAAI76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG/4C,EAAMvQ,KAAK,IAGhE69B,EAAQipB,SACRjpB,EAAQ2oB,WAAW,IAAM,GAC3B,CAEA4xC,eAAev6D,EAAmCk6D,GAChD,IAAI38B,EAAAA,EACF,CACEzV,IAAKh8B,KAAKzL,WACV2nC,IAAKl8B,KAAKzL,WAAayL,KAAKyoD,aAC5BxsB,GAAIhyD,KAAKyrC,MAAM1V,KAAK2/B,GAAGyuC,IACvBjyC,GAAIlyD,KAAKyrC,MAAM1V,KAAK2/B,GAAGyuC,IACvB18B,YAAa,UACbC,WAAY,GAEd3xC,KAAK3uB,OACLsvB,OAAOuT,EACX,CAEA4oC,aAAc,CAEdW,KAAKvpC,GACH,MAAM,kBAAEpd,GAAsBkJ,KAAK4W,yBAGnC,OAFA1C,EAAQ4oB,YACR5oB,EAAQ8kC,KAAKliD,EAAkBsH,KAAKl4B,MAAO4wB,EAAkBpF,IAAIC,OAAQqO,KAAKyoD,aAAczoD,KAAK6gD,cAAgB,GAC1G3sC,EAAQupC,MACjB,CAEAmvB,WAAWzoG,EAAeuqG,GACxB,YAAiB94F,IAAb84F,GAA0B,GAAKA,EAC1BvqG,EAAM6sE,QAAQ,GAEhB7sE,EAAM27C,UACf,CAMAtxC,IAAIP,GACF,MAAM,kBAAE6oB,GAAsBkJ,KAAK4W,yBACnC5W,KAAK0sE,cAAe,EACpB,IAAK,MAAMvlG,KAAO8G,EACJ,SAAR9G,IAEF64B,KAAK74B,GAAO8G,EAAO9G,IAGvB64B,KAAK95B,MAAQ85B,KAAK3uB,MAAM2V,QAAQ9gB,MAChC85B,KAAKyoD,aAAezoD,KAAK95B,MAAQ4wB,EAAkBsH,KAAKl4B,MAAQ4wB,EAAkBuU,MAAMnlC,MAExF,MAAMyoG,EAAW3uE,KAAKrzB,iBACnBK,OAAOtF,KAAI2Q,IAAA,IAAC,MAAElU,GAAOkU,EAAA,OAAKlU,EAAM27C,UAAU,IAC1CnqC,KAAK,KACJg5F,IAAU3uE,KAAK+7B,MAAQ,IAAK/7B,KAAK+7B,MAAO97C,OAAQ0uF,IAEpD3uE,KAAK3uB,MAAMtD,QAAQ2R,EAAAA,GAAAA,aACrB,CAEAkvF,eAAe3gG,GACgB,iBAAlBA,EAAOgS,SAChB+f,KAAK/f,OAAS/V,OAAOtB,SAASqF,EAAOgS,OAAQ,IAC7C+f,KAAK3uB,MAAMtD,QAAQ2R,EAAAA,GAAAA,cAEvB,CAEAmvF,SAASx9F,GACP,OAAQ2uB,KAAK3uB,MAAQA,CACvB,CAEAy7B,SAASnI,GACP,MAAM,kBAAE7N,GAAsBkJ,KAAK4W,yBAC7B9R,EAAIhO,EAAkBsH,KAAKwvE,eAAe3vB,OAAO7/C,KACjD2G,EAAIjO,EAAkBsH,KAAKwvE,eAAe3vB,OAAOvsD,IACvD,IAAIxrB,EAAmB,EAAXi4E,EAAAA,GAAAA,EAAen+C,KAAK6tE,WAC5Bl8E,EAAoB,EAAXwsD,EAAAA,GAAAA,EAAeD,EAAAA,GAAAA,EAO5B,OALIl+C,KAAKusE,wCACPrmG,EAAQ85B,KAAK6tE,WACbl8E,EAASsoE,EAAAA,IAGPn1D,EAAIH,EAAK4G,SAAW5G,EAAK4G,QAAUrlC,EAAQ4+B,GAAKC,EAAIJ,EAAK6G,SAAW7G,EAAK6G,QAAU7Z,EAASoT,CAIlG,CAEA4J,SAAU,CAEV7G,kBACE,OAAO,CACT,CAEAwrD,uBACE,IAAIttF,EAAMkE,OAAOqkF,UACbtoF,GAAOiE,OAAOqkF,UAElB,MAAM,WAAEh6D,GAAeyL,KAAK3uB,MAAM2V,QAAO,QAAAotE,EAAAz6E,UAAA9O,OAJnBwpF,EAAM,IAAAllE,MAAAilE,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAND,EAAMC,GAAA36E,UAAA26E,GAK5B,IAAK,MAAMz+B,KAAOw+B,EAChB,IAAK,IAAIh+E,EAAI,EAAGw9E,EAAMh+B,EAAIhrD,OAAQipF,EAAMD,GAAO,EAAGC,EAAMz9E,EAAIw9E,EAAMx9E,EAAIw9E,EAAKC,EAAMz9E,IAAMA,IAAK,CAC1F,MAAMuP,EAASoa,KAAK6W,GAAGxgC,GACnBuP,EAAS2O,EAAa,GAAK3O,EAAS2O,EAAayL,KAAK95B,QAKtDF,EAAM6vD,EAAIx/C,KACZrQ,EAAM6vD,EAAIx/C,IAERpQ,EAAM4vD,EAAIx/C,KACZpQ,EAAM4vD,EAAIx/C,IAEd,CAGF,OAAOrQ,IAAQC,EAAM,CAAED,MAAKC,OAAQ+5B,KAAK8uE,kBAAkB9uE,KAAKn4B,KAClE,CAEA8E,iBACE,MAAO,CACL0C,MAAO,GACPrC,OAAQ,GACR+hG,oBAAqB,CAAC,EAE1B,CAIA9oE,YAGE,OAFAjG,KAAK7Y,KAAO6Y,KAAK3uB,MAAM2V,QAAQ7C,QAC/B6b,KAAKqsE,UACE,CAAErmG,IAAKg6B,KAAKh6B,IAAKC,IAAK+5B,KAAK/5B,IACpC,CAEAwf,WACE,OAAOlb,IAAM,CAAC,EAAGy1B,KAAK+7B,MAAO,CAAEl0D,KAAMm4B,KAAKn4B,KAAMmK,QAASguB,KAAKhuB,SAChE,CAEAkV,WACE,MAAO,CACLrf,KAAMm4B,KAAKn4B,KACXoY,OAAQ+f,KAAKrzB,iBACVK,OAAOtF,KAAKqI,GAA6BA,EAAM5L,MAAM27C,aACrDnqC,KAAK,KAEZ,CAEAihC,yBACE,OAAOA,EAAAA,EAAAA,wBAAuB5W,KAAK3uB,MAAM2V,QAAQ2M,eACnD,CAEA24E,gBAAgB7tF,GACd,MAAM/H,MAAM,mCACd,CAEAs4F,WAAWvwF,GACT,MAAM/H,MAAM,YACd,CAEAu4F,sBAAqBpyF,GAA+E,IAA9E,IAAE1V,EAAG,YAAE+nG,GAAc,GAA8CryF,EACvF,MAAM9M,EAAQiwB,KAAKrzB,iBAAiBK,OAAOzF,MAAKmL,IAAA,IAAC,KAAElK,GAAwBkK,EAAA,OAAKvL,IAAQqB,CAAI,IAC5F,QAASuH,IAASxE,EAAAA,EAAAA,IAAUwE,MAAYm/F,IAAeC,EAAAA,EAAAA,IAAkBp/F,EAAM5L,OACjF,CAEAooG,sCACE,MAAM,2BAAEnvF,GAA+B4iB,KAAK3uB,MAAM2V,QAAQ2M,eACpDkgB,EAAWz2B,IAA+BC,EAAAA,GAAAA,UAC1Cy2B,GACJnqB,EAAAA,EAAAA,OACA,CACEtM,EAAAA,GAAAA,YACAA,EAAAA,GAAAA,UACAA,EAAAA,GAAAA,WACAA,EAAAA,GAAAA,WACAvR,SAASsR,GAEb,OAAOy2B,GAAYC,CACrB,CAEAjmC,eACE,OAAO,CACT,CAEAy/B,kBACE,OAAO,CACT,CAEA++D,UACE,MAAM31F,MAAM,2BACd,EACD4pB,EA3mBKyrE,EAAS,OACCn6F,EAAAA,EAAAA,WAAuB0uB,EADjCyrE,EAAS,QAEE,aA2mBjBA,EAAU7rE,YAEV,U,wcEhrBA,MAAMkvE,UAAYrD,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,EAAA,WAKjB,IAAEA,EAAA,WACF,IAAEA,EAAA,WACF,GAAE,CAElB9xB,IAAIP,GACF01B,MAAMn1B,IAAIP,GACV+xB,KAAK4uE,eAAe3gG,EACtB,CAEAo+F,UACE,GAAIrsE,KAAKysE,qBAAsB,KAAA4C,EAC7B,IAAIC,EAAKC,EAAMC,EAAMC,EAAKC,EAC1B1vE,KAAK0vE,IAAM,GACX1vE,KAAKyvE,IAAM,GACXzvE,KAAKsvE,IAAM,GACX,IAAIK,EAAOH,EAAOD,EAAOD,EAAM,EAC/B,IAAK,IAAIj5F,EAAI2pB,KAAK/f,OAAQ5J,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CACzD,MAAMu5F,EAAY5vE,KAAK7Y,KAAKk4D,KAAKhpE,GAAK2pB,KAAK7Y,KAAKk4D,KAAKhpE,EAAI,GACnDw5F,EAAW7vE,KAAK7Y,KAAKm4D,IAAIjpE,EAAI,GAAK2pB,KAAK7Y,KAAKm4D,IAAIjpE,GAEtD,IAAIy5F,EAAM,EACNF,EAAY,GAAKA,EAAYC,IAC/BC,EAAMF,GAGR,IAAIG,EAAM,EACNF,EAAW,GAAKA,EAAWD,IAC7BG,EAAMF,GAGR,MAAMvL,EAAK31E,EAAAA,GAAAA,IAAU,CACnBqR,KAAK7Y,KAAKk4D,KAAKhpE,GAAK2pB,KAAK7Y,KAAKm4D,IAAIjpE,GAClCpM,KAAK+xB,IAAIgE,KAAK7Y,KAAKk4D,KAAKhpE,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,IACjDpM,KAAK+xB,IAAIgE,KAAK7Y,KAAKm4D,IAAIjpE,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,MAGlDs5F,GAAOA,GAAO3vE,KAAK/f,OAAS,GAAKqkF,GAAMtkE,KAAK/f,OAC5CuvF,GAAQA,GAAQxvE,KAAK/f,OAAS,GAAK6vF,GAAO9vE,KAAK/f,OAC/CsvF,GAAQA,GAAQvvE,KAAK/f,OAAS,GAAK8vF,GAAO/vE,KAAK/f,OAE/CyvF,EAAMC,EAAM,EAAY,IAAPH,EAAcG,EAAM,EACrCF,EAAME,EAAM,EAAY,IAAPJ,EAAcI,EAAM,EACrC,MAAMK,EAAK/lG,KAAK+xB,IAAI0zE,EAAMD,GACpB/mC,EAAKgnC,EAAMD,EAAM,EAAU,IAALO,GAAaN,EAAMD,GAAO,EACtDH,GAAOA,GAAOtvE,KAAK/f,OAAS,GAAKyoD,GAAM1oC,KAAK/f,OAE5C+f,KAAK0vE,IAAIr5F,GAAKq5F,EACd1vE,KAAKyvE,IAAIp5F,GAAKo5F,EACdzvE,KAAKsvE,IAAIj5F,GAAKi5F,CAChB,CACAtvE,KAAK+sE,UAA2B,QAAlBsC,EAAGrvE,KAAKsvE,IAAIt/C,cAAM,IAAAq/C,EAAAA,EAAI,IACtC,CACA,MAAM,IAAErpG,EAAG,IAAEC,GACX+5B,KAAK0vE,IAAI7kG,OAAS,GAAKm1B,KAAKyvE,IAAI5kG,OAAS,GAAKm1B,KAAKsvE,IAAIzkG,OAAS,EAC5Dm1B,KAAKszD,qBAAqBtzD,KAAK0vE,IAAK1vE,KAAKyvE,IAAKzvE,KAAKsvE,KACnDtvE,KAAK8uE,kBAAkB9uE,KAAKn4B,MAClCm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACd,GAA+B,IAA3BlU,KAAK7Y,KAAK+vB,MAAMrsC,OAAc,OAElCqpC,EAAQ2oB,UAAU,GAAK,IACvB3oB,EAAQ1lC,IAAI,cAAe,WAC3B0lC,EAAQ4oB,YAER,MAAMyxC,EAAyB,CAC7BpqF,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZsoG,gBAAiBxuE,KAAK/f,SAExBmoE,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK0vE,IAAIr5F,KAAK,IAIvD69B,EAAQipB,SAERjpB,EAAQ1lC,IAAI,cAAe,WAC3B0lC,EAAQ4oB,aACRsrB,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKyvE,IAAIp5F,KAAK,IAGvD69B,EAAQipB,SACRjpB,EAAQ1lC,IAAI,cAAewxB,KAAK4W,yBAAyB9f,kBAAkBy8B,QAAQgJ,OAAO1D,MAC1F3kB,EAAQ4oB,aAERsrB,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKsvE,IAAIj5F,KAAK,IAGvD69B,EAAQipB,SACRjpB,EAAQ2oB,WAAW,IAAM,GAC3B,CAEAlwD,iBAAiB,IAAAsjG,EACf,MAAMhwF,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,GACT8uF,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,MAGzF,CAEA+oG,WAAW7nG,GACT,MACO,WADCA,GAEG64B,KAAKivE,sBAAsB,CAAE9nG,OAI1C,CAEA24C,WACE,MAAO,OAAPt7C,OAAcw7B,KAAK/f,OACrB,EACDqgB,EA9IK8uE,EAAG,OACOx9F,EAAAA,EAAAA,KAAiB0uB,EAD3B8uE,EAAG,QAEQ,OA8IjB,U,wcC9IA,MAAMc,EACK,UADLA,EAEO,UAGb,MAAMC,UAAcpE,EAQlB1rE,YAAY07B,EAAc1qD,GACxBsyB,MAAMo4B,EAAO1qD,GAAMivB,EAAA,eALD,IAAEA,EAAA,iBACA,IAKpBN,KAAK68C,YAAc78C,KAAK68C,YAAYv5C,KAAKtD,KAC3C,CAEAxxB,IAAIP,GACF01B,MAAMn1B,IAAIP,GACV+xB,KAAK4uE,eAAe3gG,EACtB,CAEAo+F,UACE,IAAKrsE,KAAKysE,qBAAsB,OAEhCzsE,KAAKowE,QAAU,GACfpwE,KAAKqwE,UAAY,GAEjB,MAAMC,EAAUtwE,KAAK/f,OAAS,EAC9B,IAAK,IAAI5J,EAAIi6F,EAASj6F,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CACrD,MAAMk6F,EAAavwE,KAAK7Y,KAAKk4D,KAAKv1E,MAAMuM,EAAIi6F,EAASj6F,EAAI,GACnDm6F,EAAkBvmG,KAAKhE,OAAOsqG,GAC9BE,EAAkBzwE,KAAK/f,QAAUswF,EAAWjjC,QAAQkjC,GAAmB,GAC7ExwE,KAAKowE,QAAQ/5F,IAAa2pB,KAAK/f,OAASwwF,GAAmBzwE,KAAK/f,OAA9C,IAElB,MAAMywF,EAAY1wE,KAAK7Y,KAAKm4D,IAAIx1E,MAAMuM,EAAIi6F,EAASj6F,EAAI,GACjDs6F,EAAiB1mG,KAAKjE,OAAO0qG,GAC7BE,EAAiB5wE,KAAK/f,QAAUywF,EAAUpjC,QAAQqjC,GAAkB,GAC1E3wE,KAAKqwE,UAAUh6F,IAAa2pB,KAAK/f,OAAS2wF,GAAkB5wE,KAAK/f,OAA7C,GACtB,CAEA,MAAM,IAAEja,EAAG,IAAEC,GAAQ+5B,KAAK8uE,kBAAkB9uE,KAAKn4B,MACjDm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACd,GAA+B,IAA3BlU,KAAK7Y,KAAK+vB,MAAMrsC,OAAc,OAElCqpC,EAAQ2oB,UAAU,GAAK,IACvB3oB,EAAQ1lC,IAAI,cAAe0hG,GAC3Bh8D,EAAQ4oB,YACR,MAAMyxC,EAAyB,CAC7BpqF,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZsoG,gBAAiBxuE,KAAK/f,SAExBmoE,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKqwE,UAAUh6F,KAAK,IAG7D69B,EAAQipB,SAERjpB,EAAQ1lC,IAAI,cAAe0hG,GAC3Bh8D,EAAQ4oB,aACRsrB,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKowE,QAAQ/5F,KAAK,IAG3D69B,EAAQipB,SACRjpB,EAAQ2oB,WAAW,IAAM,GAC3B,CAEAggB,YAAY3oC,GAAmC,IAAA84D,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAC7C5pE,MAAMk5C,YAAY3oC,GAClB,MAAM,kBAAEpd,EAAiB,cAAExR,GAAkB0a,KAAK4W,0BAC5C,OAAE2lB,GAAWj3C,EAAciuC,QAC3BsJ,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,UACAu1B,QAAS3yC,EAAkBsH,KAAKl4B,MAChCwjE,QAAS5yC,EAAkBpF,IAAIC,SAEjCkrC,EAAUqkB,KACV,MAAMhtE,EAAO,IAAI8sD,EAAAA,EACf,CACEl8B,EAAG9E,KAAKyoD,aAAetK,EAAAA,GAAAA,EAAW3b,EAAAA,GAAAA,IAAc1rC,EAAkBuU,MAAMg3C,KAAKpE,OAAO7/C,KACpF+iC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQlqC,EAAkBuU,MAAMg3C,KAAKlhB,MAC3EE,WAAYvqC,EAAkBuU,MAAMg3C,KAAKlhB,KAAKE,WAC9CG,QAAS,CACP9vC,IAAoD,QAAjDs7E,EAAmC,QAAnCC,EAAEn2E,EAAkBuU,MAAMg3C,KAAKlhB,YAAI,IAAA8rC,GAAS,QAATA,EAAjCA,EAAmCzrC,eAAO,IAAAyrC,OAAA,EAA1CA,EAA4Cv7E,WAAG,IAAAs7E,EAAAA,EAAIxqC,EAAAA,GAAAA,IACxDn3B,MAAwD,QAAnD6hE,EAAmC,QAAnCC,EAAEr2E,EAAkBuU,MAAMg3C,KAAKlhB,YAAI,IAAAgsC,GAAS,QAATA,EAAjCA,EAAmC3rC,eAAO,IAAA2rC,OAAA,EAA1CA,EAA4C9hE,aAAK,IAAA6hE,EAAAA,EAAI1qC,EAAAA,GAAAA,IAC5DpzB,OAA0D,QAApDg+D,EAAmC,QAAnCC,EAAEv2E,EAAkBuU,MAAMg3C,KAAKlhB,YAAI,IAAAksC,GAAS,QAATA,EAAjCA,EAAmC7rC,eAAO,IAAA6rC,OAAA,EAA1CA,EAA4Cj+D,cAAM,IAAAg+D,EAAAA,EAAI5qC,EAAAA,GAAAA,IAC9DpkC,KAAsD,QAAlDkvE,EAAmC,QAAnCC,EAAEz2E,EAAkBuU,MAAMg3C,KAAKlhB,YAAI,IAAAosC,GAAS,QAATA,EAAjCA,EAAmC/rC,eAAO,IAAA+rC,OAAA,EAA1CA,EAA4CnvE,YAAI,IAAAkvE,EAAAA,EAAI9qC,EAAAA,GAAAA,KAE5DjB,aAAcyM,EAAAA,GAAAA,OACd5M,UAAW7E,EAAOixC,sBAEpBxtE,KAAK3uB,OAEDw/F,EAAa,GACf7wE,KAAKqwE,UAAUxlG,OAAS,GAC1BgmG,EAAWr+F,KAAK,CACd0B,KAAM8rB,KAAKqwE,UAAUrgD,OAAQghB,QAAQ,GACrCjsC,EAAG96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKqwE,UAAUrgD,SACrCyR,WAAYyuC,IAGZlwE,KAAKowE,QAAQvlG,OAAS,GACxBgmG,EAAWr+F,KAAK,CACd0B,KAAM8rB,KAAKowE,QAAQpgD,OAAQghB,QAAQ,GACnCjsC,EAAG96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKowE,QAAQpgD,SACnCyR,WAAYyuC,IAIhB,MACMrD,EAAO7sE,KAAKrO,OAASmF,EAAkBsY,OAAOzd,OAASmF,EAAkBpF,IAAIC,OACnFk/E,EAAW1+F,SAAS2+F,IACdA,EAAa/rE,GAHN,GAGmB+rE,EAAa/rE,GAAK8nE,GAC9C34F,EAAK1F,IAAIsiG,GAAcnwE,OAAOuT,EAChC,IAGF2oB,EAAU6lB,MACZ,CAEA/1E,iBAAiB,IAAAsjG,EACf,MAAMhwF,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,GACT8uF,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,MAGzF,CAEA+oG,WAAW7nG,GACT,MACO,WADCA,GAEG64B,KAAKivE,sBAAsB,CAAE9nG,OAI1C,CAEA24C,WACE,MAAO,SAAPt7C,OAAgBw7B,KAAK/f,OACvB,EACDqgB,EAhKK6vE,EAAK,OACKv+F,EAAAA,EAAAA,KAAiB0uB,EAD3B6vE,EAAK,QAEM,SAgKjB,U,wcC3KA,MAAMY,UAAwBhF,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,EAAA,kBAItB,GAAE,CAGzB9xB,IAAIP,GACF01B,MAAMn1B,IAAIP,GACV+xB,KAAK4uE,eAAe3gG,EACtB,CAEAo+F,UACE,GAAIrsE,KAAKysE,qBAAsB,KAAAuE,EAC7BhxE,KAAKixE,WAAa,GAElB,MAAMX,EAAUtwE,KAAK/f,OAAS,EAC9B,IAAK,IAAI5J,EAAIi6F,EAASj6F,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CACrD,MAAMk6F,EAAavwE,KAAK7Y,KAAKk4D,KAAKv1E,MAAMuM,EAAIi6F,EAASj6F,EAAI,GACnDm6F,EAAkBvmG,KAAKhE,OAAOsqG,GAC9BE,EAAkBzwE,KAAK/f,OAASswF,EAAWjjC,QAAQkjC,GACnDJ,GAAkBpwE,KAAK/f,OAASwwF,GAAmBzwE,KAAK/f,OAA9C,IAEVywF,EAAY1wE,KAAK7Y,KAAKm4D,IAAIx1E,MAAMuM,EAAIi6F,EAASj6F,EAAI,GACjDs6F,EAAiB1mG,KAAKjE,OAAO0qG,GAC7BE,EAAiB5wE,KAAK/f,OAASywF,EAAUpjC,QAAQqjC,GACjDN,GAAoBrwE,KAAK/f,OAAS2wF,GAAkB5wE,KAAK/f,OAA7C,IAElB+f,KAAKixE,WAAW56F,GAAK+5F,EAAUC,CACjC,CAEArwE,KAAK+sE,UAAkC,QAAzBiE,EAAGhxE,KAAKixE,WAAWjhD,cAAM,IAAAghD,EAAAA,EAAI,IAC7C,CAEA,MAAM,IAAEhrG,EAAG,IAAEC,GAAQ+5B,KAAK8uE,kBAAkB9uE,KAAKn4B,MACjDm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACdlU,KAAKmuE,yBAAyBj6D,EAASlU,KAAKixE,WAAYjxE,KAAK/f,OAAQ,EAAG,EAAG,GAAG,EAChF,CAEAtT,iBAAiB,IAAAsjG,EACf,MAAMhwF,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,GACT8uF,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,MAGzF,CAEA+oG,WAAW7nG,GACT,MACO,WADCA,GAEG64B,KAAKivE,sBAAsB,CAAE9nG,OAI1C,CAEA24C,WACE,MAAO,oBAAPt7C,OAA2Bw7B,KAAK/f,OAClC,EACDqgB,EA3EKywE,EAAe,OACLn/F,EAAAA,EAAAA,QAAoB0uB,EAD9BywE,EAAe,QAEJ,oBA2EjB,U,sdC3EA,MAAMG,UAAYnF,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,EAAA,WAIjB,GAAE,CAGlB9xB,IAAIP,GACF01B,MAAMn1B,IAAIP,GACV+xB,KAAK4uE,eAAe3gG,EACtB,CAEAo+F,UACE,GAAIrsE,KAAKysE,qBAAsB,KAAA0E,EAC7BnxE,KAAK2vE,IAAM,GACX,MAAMA,EAAM,IAAIyB,EAAAA,EAAiBpxE,KAAK/f,QACtC,IAAK,IAAI5J,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAC1Cs5F,EAAI1uE,IAAIjB,KAAK7Y,KAAKk4D,KAAKhpE,GAAI2pB,KAAK7Y,KAAKm4D,IAAIjpE,GAAI2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,IACjE2pB,KAAK2vE,IAAIt5F,GAAKs5F,EAAIxrG,MAGpB67B,KAAK+sE,UAA2B,QAAlBoE,EAAGnxE,KAAK2vE,IAAI3/C,cAAM,IAAAmhD,EAAAA,EAAI,IACtC,CACA,MAAM,IAAEnrG,EAAG,IAAEC,GAAQ+5B,KAAK2vE,IAAI9kG,OAAS,EAAIm1B,KAAKszD,qBAAqBtzD,KAAK2vE,KAAO3vE,KAAK8uE,kBAAkB9uE,KAAKn4B,MAC7Gm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACdA,EAAQ1lC,IAAI,cAAewxB,KAAK4W,yBAAyB9f,kBAAkBy8B,QAAQgJ,OAAO1D,MAC1F3kB,EAAQ2oB,UAAU,GAAK,IACvB3oB,EAAQ4oB,aACRsrB,EAAAA,EAAAA,IAAkB,CAChBjkE,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZmiF,gBAAiBA,CAAChyE,EAAWyuB,KAC3BoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK2vE,IAAIt5F,KAAK,IAGvD69B,EAAQipB,SACRjpB,EAAQ2oB,WAAW,IAAM,GAC3B,CAEAlwD,iBAAiB,IAAAsjG,EACf,MAAMhwF,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,GACT8uF,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,MAGzF,CAEA+oG,WAAW7nG,GACT,MACO,WADCA,GAEG64B,KAAKivE,sBAAsB,CAAE9nG,OAI1C,CAEA24C,WACE,MAAO,OAAPt7C,OAAcw7B,KAAK/f,OACrB,EACDqgB,EA7EK4wE,EAAG,OACOt/F,EAAAA,EAAAA,KAAiB0uB,EAD3B4wE,EAAG,QAEQ,sBA6EjB,U,wcChFA,MAAMG,UAA8BtF,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,EAAA,WAInC,GAAE,CAGlB9xB,IAAIP,GACF01B,MAAMn1B,IAAIP,GACV+xB,KAAK4uE,eAAe3gG,EACtB,CAEAo+F,UACE,GAAIrsE,KAAKysE,qBAAsB,KAAA6E,EAC7B,IAAIC,EACJ,MAAMC,EAAK,GACXxxE,KAAKyxE,IAAM,GACX,IAAIC,EAAUH,EAAW,EACzB,IAAK,IAAIl7F,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CAC/C,IAAIs7F,EACJ,MAAMC,GAAgB5xE,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAKm4D,IAAIjpE,GAAK2pB,KAAK7Y,KAAKk4D,KAAKhpE,IAAM,EACnFm7F,EAAGn7F,GAAKu7F,EAERF,GAAUE,EACVL,IACIA,EAAWvxE,KAAK/f,SAClByxF,GAAUF,EAAGn7F,EAAI2pB,KAAK/f,QACtBsxF,KAEF,MAAMM,EAAMH,EAASH,EAErB,GAAIl7F,EAAI2pB,KAAK/f,OAAS,EACpB,SAGF,IAAI6xF,EAAUH,EAAW,EACzB,IAAK,IAAIpL,EAAIlwF,EAAI2pB,KAAK/f,OAAS,EAAGsmF,GAAKlwF,EAAGkwF,IACxCuL,GAAU7nG,KAAK+xB,IAAIw1E,EAAGjL,GAAKsL,GAC3BF,IAGF,MAAMI,EAAMD,EAASH,EACrB3xE,KAAKyxE,IAAIp7F,GAAK,EACV07F,EAAM,IACR/xE,KAAKyxE,IAAIp7F,IAAMu7F,EAAeC,IA7CvB,KA6C0CE,GAErD,CAEA/xE,KAAK+sE,UAA2B,QAAlBuE,EAAGtxE,KAAKyxE,IAAIzhD,cAAM,IAAAshD,EAAAA,EAAI,IACtC,CAEA,MAAM,IAAEtrG,EAAG,IAAEC,GAAQ+5B,KAAKyxE,IAAI5mG,OAAS,EAAIm1B,KAAKszD,qBAAqBtzD,KAAKyxE,KAAOzxE,KAAK8uE,kBAAkB9uE,KAAKn4B,MAC7Gm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACdlU,KAAKmuE,yBAAyBj6D,EAASlU,KAAKyxE,IAAKzxE,KAAK/f,QAAS,IAAK,EAAG,IACzE,CAEAtT,iBAAiB,IAAAsjG,EACf,MAAMhwF,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,GACT8uF,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,MAGzF,CAEA+oG,WAAW7nG,GACT,MACO,WADCA,GAEG64B,KAAKivE,sBAAsB,CAAE9nG,OAI1C,CAEA24C,WACE,MAAO,OAAPt7C,OAAcw7B,KAAK/f,OACrB,EACDqgB,EA5FK+wE,EAAqB,OACXz/F,EAAAA,EAAAA,KAAiB0uB,EAD3B+wE,EAAqB,QAEV,2BA4FjB,U,wdC5EA,MAAMW,UAAYjG,EAIhBhsE,4BACE,OAAO,CACT,CAIAssE,UACE,IAAKrsE,KAAKysE,uBAAyBzsE,KAAK7Y,KAAKixC,KAAM,OACnD,MAAM65C,EAAetnG,OAAOC,KAAKo1B,KAAK7Y,KAAKixC,MAAM,IAC5Cp4B,KAAK+7B,MAAM1D,MAAQ45C,IACtBjyE,KAAK+7B,MAAM1D,KAAO45C,GAEpB,MAAMC,EAAMlyE,KAAK7Y,KAAKixC,KAAKp4B,KAAK+7B,MAAM1D,OAC/BryD,EAAKC,GAAO0oB,EAAAA,GAAAA,OAAaujF,EAAIC,kBAAmBD,EAAIE,aAAcF,EAAIG,cAC7EryE,KAAK/5B,IAAMgE,KAAKhE,IAAIgE,KAAK+xB,IAAI/1B,GAAMgE,KAAK+xB,IAAIh2B,IAC5Cg6B,KAAKh6B,KAAOg6B,KAAK/5B,GACnB,CAEAqmG,gBAAgBp4D,GACd,GAAKlU,KAAK7Y,KAAKixC,KAAf,CACAlkB,EAAQ2oB,UAAU,GAAK,IACvB,IAAK,MAAM11D,KAAO64B,KAAKmvD,OAAQ,CAC7Bj7C,EAAQ1lC,IAAI,cAAewxB,KAAKmvD,OAAOhoF,IACvC+sC,EAAQ4oB,YACR,MAAM31C,EAAO6Y,KAAK7Y,KAAKixC,KAAKp4B,KAAK+7B,MAAM1D,MAAMlxD,IAC7CihF,EAAAA,EAAAA,IAAkB,CAChBjkE,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZmiF,gBAAiBA,CAAChyE,EAAWyuB,KAC3BoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAGx4C,EAAK9Q,KAAK,IAGnD69B,EAAQipB,QACV,CACAjpB,EAAQ2oB,WAAW,IAAM,GAjBE,CAkB7B,CAEA2vC,YAAYt4D,GACV,IAAKlU,KAAK7Y,KAAKixC,KAAM,OACrB,MAAM,cAAE9yC,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAC3B/qD,EAAO,IAAIw4D,EAAAA,EACf,CACE9sD,KAAM8rB,KAAK8f,WACXhb,EAAG,EACHC,EAAG,GACHo8B,KAAM,CAAEr7D,KAAM,GAAIgB,MAAO,QACzBs6D,UAAW7E,EAAOroD,KAClBotD,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,QAEhBhuC,KAAK3uB,OAEP7I,EAAKm4B,OAAOuT,GAEZ,IAAI8sB,EAAAA,EACF,CACE9sD,KAAM8rB,KAAK7Y,KAAKixC,KAAKp4B,KAAK+7B,MAAM1D,MAAMi6C,MACtCxtE,EAAG,GAAKt8B,EAAKiiE,UACb1lC,EAAG,GACHo8B,KAAM,CAAEr7D,KAAM,GACds7D,UAAW7E,EAAOroD,KAClBotD,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,QAEhBhuC,KAAK3uB,OACLsvB,OAAOuT,GAETlU,KAAKuyE,uBAAuBr+D,EAC9B,CAEAw5D,sBAAsBx5D,GACpB,MAAM,EAAEpP,EAAC,EAAEC,EAAC,WAAE8oE,GAAelqE,MAAM+pE,sBAAsBx5D,IAEnD,kBAAEpd,GAAsBkJ,KAAK4W,yBAC7BkgB,EAAa92B,KAAK3uB,MAAM2V,QAAQ2M,eAAepjB,QAAUu7C,EAAAA,GAAAA,KACzD0mD,EAAkB3E,EAAiB,EAAJ/oE,EAC/B2tE,EAAe37E,EAAkBsH,KAAKwvE,eAAezsC,KAGrDuxC,EAAiB,IAAI1xC,EAAAA,EACzB,CACE9sD,KAAM8rB,KAAK7Y,KAAKixC,KAAKp4B,KAAK+7B,MAAM1D,MAAMi6C,MACtCxtE,EAAG0tE,EAAkB1tE,EACrBq8B,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ,IACzCyxC,EACH3sG,KAAM2sG,EAAa3sG,KARA,GAQO2sG,EAAa3sG,UAA0B8P,EACjE9O,MAAO,WAETs6D,UAAWkb,IAAAA,KAAoBxlB,EAAa,GAAK,KACjDwK,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,QAEhBhuC,KAAK3uB,OAEPqhG,EAAelkG,IAAI,CACjBu2B,EAAGA,GAlBoB,GAkBfk1D,EAAAA,GAlBe,GAkB8ByY,EAAe32C,MAAMsF,WAAiC,KAE7GqxC,EAAe/xE,OAAOuT,GAEtBlU,KAAKuyE,uBAAuBr+D,EAC9B,CAEAq+D,uBAAuBr+D,GACrB,MAAM,cAAE5uB,EAAa,kBAAEwR,GAAsBkJ,KAAK4W,0BAC5C,OAAE2lB,GAAWj3C,EAAciuC,QAEjC,IAAIyN,EAAAA,EACF,CACE9sD,KAAM,MACN4wB,EAAG,GACHC,EAAGjO,EAAkBpF,IAAIC,QAAUmF,EAAkBsY,OAAOzd,OAASqO,KAAK6gD,eAAiB,EAC3F9jB,OAAQ,GACRoE,KAAM,CAAEr7D,KAAM,GAAIkB,OAAQ,MAAON,OAAQ,oBACzC06D,UAAW7E,EAAOmiB,cAClBpd,UAAW2M,EAAAA,GAAAA,OACX1M,aAAcyM,EAAAA,GAAAA,YAEhBhuC,KAAK3uB,OACLsvB,OAAOuT,GAET,MAAMhgC,EAAO,IAAI8sD,EAAAA,EACf,CACE9sD,KAAM,qBACN4wB,EAAGhO,EAAkBsH,KAAKl4B,MAC1B6+B,EAAGjO,EAAkBpF,IAAIC,OAASqO,KAAK6gD,cAAgB/pD,EAAkBsY,OAAOzd,OAAS,EACzFwvC,KAAM,CAAEr7D,KAAM,EAAGgB,MAAO,QACxBs6D,UAAWphC,KAAKmvD,OAAOgjB,kBACvB7wC,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,QAEhBhuC,KAAK3uB,OAEP6C,EAAKysB,OAAOuT,GAEZ,IAAIpP,EAAI5wB,EAAKsrC,IAAI,KAAQ,EAAItrC,EAAKu2D,UAClCv2D,EAAK1F,IAAI,CAAE0F,KAAM,gBAAiB4wB,IAAGs8B,UAAWphC,KAAKmvD,OAAOijB,eAC5Dl+F,EAAKysB,OAAOuT,GAEZpP,GAAK,EAAI5wB,EAAKu2D,UACdv2D,EAAK1F,IAAI,CAAE0F,KAAM,gBAAiB4wB,IAAGs8B,UAAWphC,KAAKmvD,OAAOkjB,eAC5Dn+F,EAAKysB,OAAOuT,EACd,CAEA04D,WAAWzoG,GAGT,OADe67B,KAAK3uB,MAAMw0B,MAAMd,EAClB6iD,WAAW,EAAG,IAArBve,CAA0BllE,GAAOmiB,QAAQ,IAAK,IACvD,CAEA3Z,iBACE,MAAO,CACL0C,MAAO,MACPrC,OAAQ,GACR+hG,oBAAqB,CAAC,EAE1B,CAEAjvD,WAAW,IAAAy0C,EACT,OAAgB,QAATA,EAAAv0D,KAAK7Y,YAAI,IAAAotE,GAATA,EAAWn8B,KAAQp4B,KAAK7Y,KAAKixC,KAAKp4B,KAAK+7B,MAAM1D,MAAM7vD,UAAkBoN,CAC9E,CAEAsR,WACE,MAAO,CACLrf,KAAMm4B,KAAKn4B,KACXwwD,KAAMr4B,KAAK+7B,MAAM1D,KAErB,EACD/3B,EA9KK0xE,EAAG,OACOpgG,EAAAA,EAAAA,KAAiB0uB,EAD3B0xE,EAAG,QAEQ,OA8KjBA,EAAI7zC,UAAUgxB,OAAS,CACrBgjB,kBAAmB,UACnBC,aAAc,UACdC,aAAc,WAGhB,U,sdCxMA,MAAMM,UAAmB5G,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,EAAA,UAIzB,GAAE,CAGjB9xB,IAAIP,GACF01B,MAAMn1B,IAAIP,GACV+xB,KAAK4uE,eAAe3gG,EACtB,CAEAo+F,UACE,GAAIrsE,KAAKysE,qBAAsB,KAAAmG,EAC7B5yE,KAAK6yE,GAAK,GACV,MAAMC,EAAM,IAAIC,EAAAA,EAAI/yE,KAAK/f,QACzB,IAAK,IAAI5J,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAC1Cy8F,EAAI7xE,KAAMjB,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,IAAM2pB,KAAK7Y,KAAK2qD,OAAOz7D,GAAM,KAChF2pB,KAAK6yE,GAAGx8F,GAAKy8F,EAAI3uG,MAEnB67B,KAAK+sE,UAA0B,QAAjB6F,EAAG5yE,KAAK6yE,GAAG7iD,cAAM,IAAA4iD,EAAAA,EAAI,IACrC,CACA,MAAM,IAAE5sG,EAAG,IAAEC,GAAQ+5B,KAAK6yE,GAAGhoG,OAAS,EAAIm1B,KAAKszD,qBAAqBtzD,KAAK6yE,IAAM7yE,KAAK8uE,kBAAkB9uE,KAAKn4B,MAC3Gm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACdlU,KAAKmuE,yBAAyBj6D,EAASlU,KAAK6yE,GAAI,EAAG,EAAG,EAAG,GAAG,EAC9D,CAEAlmG,iBAAiB,IAAAsjG,EACf,MAAMhwF,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,GACT8uF,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,MAGzF,CAEA+oG,WAAW7nG,GACT,MACO,WADCA,GAEG64B,KAAKivE,sBAAsB,CAAE9nG,OAI1C,CAEA24C,WACE,MAAO,SAAPt7C,OAAgBw7B,KAAK/f,OACvB,EACDqgB,EA/DKqyE,EAAU,OACA/gG,EAAAA,EAAAA,IAAgB0uB,EAD1BqyE,EAAU,QAEC,eA+DjB,U,wcC3DA,MAAMK,UAAajH,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,EAAA,YASjB,IAAEA,EAAA,cACA,IAAEA,EAAA,iBACC,GAAE,CAPxBP,0BAAyB97B,GAAkE,IAAjE,OAAEgc,GAA6Dhc,EACvF,MAAOgvG,EAAa,EAAGC,EAAa,EAAGC,EAAe,IAAKhH,EAAAA,EAAAA,IAAkClsF,GAC7F,OAAOhW,KAAKhE,IAAIgtG,EAAYC,EAAYC,EAC1C,CASA3kG,IAAIP,GACF,GAA6B,iBAAlBA,EAAOgS,OAAqB,CACrC,MAAOgzF,EAAa,EAAGC,EAAa,EAAGC,EAAe,IAAKhH,EAAAA,EAAAA,IAAkCnsE,KAAK+7B,MAAM97C,QACxG0jB,MAAMn1B,IAAI,IAAKP,EAAQglG,aAAYC,aAAYC,gBACjD,MACExvE,MAAMn1B,IAAIP,EAEd,CAEAo+F,UACE,GAAIrsE,KAAKysE,qBAAsB,KAAA2G,EAC7BpzE,KAAKqzE,KAAO,GACZrzE,KAAKszE,OAAS,GACdtzE,KAAKuzE,UAAY,GACjB,MAAMC,EAAO,IAAIT,EAAAA,EAAI/yE,KAAKizE,YACpBQ,EAAO,IAAIV,EAAAA,EAAI/yE,KAAKkzE,YACpBQ,EAAO,IAAIX,EAAAA,EAAI/yE,KAAKmzE,cAE1B,IAAK,IAAI98F,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CAC/Cm9F,EAAKvyE,IAAIjB,KAAK7Y,KAAK+vB,MAAM7gC,IACzBo9F,EAAKxyE,IAAIjB,KAAK7Y,KAAK+vB,MAAM7gC,IACzB,MAAMg9F,EAAOG,EAAKrvG,MAAQsvG,EAAKtvG,MAC/BuvG,EAAKzyE,IAAIoyE,GACT,MAAMC,EAASI,EAAKvvG,MAEpB67B,KAAKqzE,KAAKh9F,GAAKg9F,EACfrzE,KAAKszE,OAAOj9F,GAAKi9F,EACjBtzE,KAAKuzE,UAAUl9F,GAAKg9F,EAAOC,CAC7B,CAEAtzE,KAAK+sE,UAA4B,QAAnBqG,EAAGpzE,KAAKqzE,KAAKrjD,cAAM,IAAAojD,EAAAA,EAAI,IACvC,CACA,MAAM,IAAEptG,EAAG,IAAEC,GACX+5B,KAAKqzE,KAAKxoG,OAAS,GAAKm1B,KAAKszE,OAAOzoG,OAAS,GAAKm1B,KAAKuzE,UAAU1oG,OAAS,EACtEm1B,KAAKszD,qBAAqBtzD,KAAKqzE,KAAMrzE,KAAKszE,OAAQtzE,KAAKuzE,WACvDvzE,KAAK8uE,kBAAkB9uE,KAAKn4B,MAClCm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACd,MAAM,kBAAEpd,EAAiB,cAAExR,GAAkB0a,KAAK4W,yBAClD,GAA+B,IAA3B5W,KAAK7Y,KAAK+vB,MAAMrsC,OAAc,OAClC,MAAMk6B,EAAI96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG,IACvBi5B,EAAItzE,EAAcM,OAAOD,SAAyC,EAA9BL,EAAcM,OAAOmsC,OACzDw8C,EAAyB,CAC7BpqF,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,OAGdguC,EAAQ1lC,IAAI,YAAa,WACzB0lC,EAAQ4oB,aACRsrB,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQ8kC,KAAKl0C,KAAOxf,EAAcM,OAAOD,SAAW,GAAIof,EAAG6zD,EAAG3uF,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKuzE,UAAUl9F,IAAM0uB,GAAG,IAG7GmP,EAAQirB,OAERjrB,EAAQ2oB,UAAU,GAAK,IACvB3oB,EAAQ1lC,IAAI,cAAesoB,EAAkBy8B,QAAQgJ,OAAO1D,MAC5D3kB,EAAQ4oB,aAERsrB,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKqzE,KAAKh9F,KAAK,IAGxD69B,EAAQipB,SAERjpB,EAAQ1lC,IAAI,cAAesoB,EAAkBy8B,QAAQgJ,OAAOo3C,YAC5Dz/D,EAAQ4oB,aACRsrB,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKszE,OAAOj9F,KAAK,IAG1D69B,EAAQipB,SACRjpB,EAAQ2oB,WAAW,IAAM,GAC3B,CAEAlwD,iBAAiB,IAAAinG,EAAAC,EAAAC,EACf,MAAMb,EAAa,CACjBprG,KAAM,SACN3D,MAAO,SACPsE,KAAM,aACNrE,MAAsB,QAAjByvG,EAAE5zE,KAAKizE,kBAAU,IAAAW,EAAAA,EAAI,GAC1B5rG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAEDitG,EAAa,CACjBrrG,KAAM,SACN3D,MAAO,OACPsE,KAAM,aACNrE,MAAsB,QAAjB0vG,EAAE7zE,KAAKkzE,kBAAU,IAAAW,EAAAA,EAAI,GAC1B7rG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAEDktG,EAAe,CACnBtrG,KAAM,SACN3D,MAAO,SACPsE,KAAM,eACNrE,MAAwB,QAAnB2vG,EAAE9zE,KAAKmzE,oBAAY,IAAAW,EAAAA,EAAI,EAC5B9rG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACimG,EAAYC,EAAYC,GACjCpE,oBAAqB,CACnBkE,WAAY,GAAFzuG,OAAKyuG,EAAW/uG,MAAK,oCAAAM,OAAmCyuG,EAAWjtG,IAAG,SAAAxB,OAAQyuG,EAAWhtG,KACnGitG,WAAY,GAAF1uG,OAAK0uG,EAAWhvG,MAAK,oCAAAM,OAAmC0uG,EAAWltG,IAAG,SAAAxB,OAAQ0uG,EAAWjtG,KACnGktG,aAAc,GAAF3uG,OAAK2uG,EAAajvG,MAAK,oCAAAM,OAAmC2uG,EAAantG,IAAG,SAAAxB,OAAQ2uG,EAAaltG,MAGjH,CAEA+oG,WAAW7nG,GACT,OAAQA,GACN,IAAK,aACL,IAAK,aACL,IAAK,eACH,OAAO64B,KAAKivE,sBAAsB,CAAE9nG,QACtC,QACE,OAAO,EAEb,CAEA24C,WACE,MAAO,QAAPt7C,OAAew7B,KAAKizE,WAAU,KAAAzuG,OAAIw7B,KAAKkzE,WAAU,KAAA1uG,OAAIw7B,KAAKmzE,aAC5D,EACD7yE,EA5JK0yE,EAAI,OACMphG,EAAAA,EAAAA,MAAkB0uB,EAD5B0yE,EAAI,QAEO,QA4JjB,U,wcCrKA,MAAMe,UAAYhI,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,EAAA,WAIjB,GAAE,CAGlB9xB,IAAIP,GACF01B,MAAMn1B,IAAIP,GACV+xB,KAAK4uE,eAAe3gG,EACtB,CAEAo+F,UAAU,IAAA2H,EACR,IAAKh0E,KAAKysE,qBAAsB,OAEhC,IAAIwH,EACJ,MAAMC,EAAK,GACXl0E,KAAKm0E,IAAM,GACX,IAAIC,GAAoBp0E,KAAK7Y,KAAK+vB,MAAM,GAAKlX,KAAK7Y,KAAKm4D,IAAI,GAAKt/C,KAAK7Y,KAAKk4D,KAAK,IAAM,EACjFg1B,EAAqBJ,EAAoB,EAC7C,IAAK,IAAI59F,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CAC/C,MAAMu7F,GAAgB5xE,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAKm4D,IAAIjpE,GAAK2pB,KAAK7Y,KAAKk4D,KAAKhpE,IAAM,EAC7Ei+F,EAAY1C,EAAe5xE,KAAK7Y,KAAK2qD,OAAOz7D,GAUlD,GARIu7F,EAAewC,GACjBC,GAAqBC,EACrBJ,EAAG79F,GAAKi+F,GACC1C,EAAewC,IACxBH,GAAqBK,EACrBJ,EAAG79F,IAAMi+F,GAGPj+F,EAAI2pB,KAAK/f,OAAQ,CACnB,MAAMs0F,EAAQL,EAAG79F,EAAI2pB,KAAK/f,QACtBs0F,EAAQ,EACVF,GAAqBE,EACZA,EAAQ,IACjBN,GAAqBM,GAIrBv0E,KAAKm0E,IAAI99F,GADPg+F,EAAoBJ,EAAoB,EACP,IAApBI,GAA4BA,EAAoBJ,GAEjD,EAElB,CAEAG,EAAmBxC,CACrB,CAEA5xE,KAAK+sE,UAA2B,QAAlBiH,EAAGh0E,KAAKm0E,IAAInkD,cAAM,IAAAgkD,EAAAA,EAAI,KACpC,MAAM,IAAEhuG,EAAG,IAAEC,GAAQ+5B,KAAK8uE,kBAAkB9uE,KAAKn4B,MACjDm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACdlU,KAAKmuE,yBAAyBj6D,EAASlU,KAAKm0E,IAAKn0E,KAAK/f,OAAQ,GAAI,GAAI,GACxE,CAEAtT,iBAAiB,IAAAsjG,EACf,MAAMhwF,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,GACT8uF,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,MAGzF,CAEA+oG,WAAW7nG,GACT,MACO,WADCA,GAEG64B,KAAKivE,sBAAsB,CAAE9nG,OAI1C,CAEA24C,WACE,MAAO,OAAPt7C,OAAcw7B,KAAK/f,OACrB,EACDqgB,EA5FKyzE,EAAG,OACOniG,EAAAA,EAAAA,KAAiB0uB,EAD3ByzE,EAAG,QAEQ,oBA4FjB,W,ycClGA,MAAMS,WAAazI,EAIjBM,UAAW,CAEXC,kBAAmB,CAEnBxsD,WACE,MAAO,EACT,EACDxf,GAXKk0E,GAAI,OACM5iG,EAAAA,EAAAA,MAAkB0uB,GAD5Bk0E,GAAI,QAEO,QAWjB,Y,ycCXA,MAAMC,WAAY1I,EAAU1rE,cAAA,SAAA1mB,WAAA2mB,GAAA,WAIV,GAAE,CAElB+rE,UACE,GAAIrsE,KAAKysE,qBAAsB,KAAAiI,EAC7B10E,KAAK20E,IAAM,CAAC,GAEZ,IAAK,IAAIt+F,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK2qD,OAAOjnE,OAAQwL,IAAK,CAChD,IAAIu+F,EAAa50E,KAAK20E,IAAIt+F,EAAI,GAC1B2pB,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,GAC3Cu+F,GAAc50E,KAAK7Y,KAAK2qD,OAAOz7D,GACtB2pB,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,KAClDu+F,GAAc50E,KAAK7Y,KAAK2qD,OAAOz7D,IAGjC2pB,KAAK20E,IAAIt+F,GAAKu+F,CAChB,CAEA50E,KAAK+sE,UAA2B,QAAlB2H,EAAG10E,KAAK20E,IAAI3kD,cAAM,IAAA0kD,EAAAA,EAAI,IACtC,CACA,MAAM,IAAE1uG,EAAG,IAAEC,GAAQ+5B,KAAK20E,IAAI9pG,OAAS,EAAIm1B,KAAKszD,qBAAqBtzD,KAAK20E,KAAO30E,KAAK8uE,kBAAkB9uE,KAAKn4B,MAC7Gm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACdA,EAAQ1lC,IAAI,cAAewxB,KAAK4W,yBAAyB9f,kBAAkBy8B,QAAQgJ,OAAO1D,MAC1F3kB,EAAQ2oB,UAAU,GAAK,IACvB3oB,EAAQ4oB,aACRsrB,EAAAA,EAAAA,IAAkB,CAChBjkE,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZmiF,gBAAiBA,CAAChyE,EAAWyuB,KAC3BoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK20E,IAAIt+F,KAAK,IAGvD69B,EAAQipB,SACRjpB,EAAQ2oB,WAAW,IAAM,GAC3B,CAEA+vC,WAAWzoG,GACT,OAAOopB,EAAAA,GAAAA,gBAAqBppB,EAAO,EACrC,CAEAwI,iBACE,MAAO,CACL0C,MAAO2wB,KAAK97B,MACZ8I,OAAQ,GACR+hG,oBAAqB,CAAC,EAE1B,CAEAjvD,WACE,MAAO,KACT,EACDxf,GA5DKm0E,GAAG,OACO7iG,EAAAA,EAAAA,KAAiB0uB,GAD3Bm0E,GAAG,QAEQ,qBA4DjB,Y,qfCtCA,MAAMI,WAAyB9I,EAI7BhsE,4BACE,OAAO,CACT,CAWAM,YAAY07B,EAAc1qD,GACxBsyB,MAAMo4B,EAAO1qD,GAAMivB,GAAA,yBAAAA,GAAA,eATX,IAAEA,GAAA,cACJ,GAAKA,GAAA,yBACM,GAAKA,GAAA,aACJ,CAAC,GAACA,GAAA,YACH,CAAC,GAACA,GAAA,cACO,CAAC,GAACA,GAAA,2BACI,CAAC,GAIjCN,KAAK68C,YAAc78C,KAAK68C,YAAYv5C,KAAKtD,MAEzCA,KAAK3a,UAAY2a,KAAK3uB,MAAM2V,QAAQ3B,UACpC2a,KAAK2/B,GAAK8hB,GAAAA,cAAiBjD,MAAM,CAAC,EAAGx+C,KAAK6gD,gBACtC7gD,KAAK+7B,MAAM97C,SAAW+f,KAAKhuB,UAC7BguB,KAAKhuB,QAAUguB,KAAK+7B,MAAM97C,OAE9B,CAEA1K,gBACE,MAAMvD,EAAUguB,KAAK80E,aACfthG,EAAmBwsB,KAAK3uB,MAAM2V,QAAQ2M,eACtCohF,EAAYvhG,EAAiBuB,KAC7BigG,EAAgBh1E,KAAKi1E,yBAAyBlqG,OAClD9G,IAAA,IAAC,OAAEoO,EAAM,WAAE2N,EAAU,UAAEqF,GAAWphB,EAAA,OAChCigB,GAAAA,EAAAA,QACG4C,GACCA,EAAEzU,SAAWA,GACbyU,EAAE9G,aAAeA,GACjB8G,EAAEzB,YAAcA,GAChB7R,EAAiBkT,SAASI,EAAEH,SAC5BouF,IAAcjuF,EAAEiuF,YACfjuF,EAAE1C,aACLvZ,OAAS,CAAC,IAGhB,GAAIm1B,KAAK3a,YAAc2a,KAAK3uB,MAAM2V,QAAQ7C,QAAQkB,YAAe2a,KAAKkB,QAAUlB,KAAKk1E,iBAInF,GAHAl1E,KAAK3a,UAAY2a,KAAK3uB,MAAM2V,QAAQ7C,QAAQkB,UAC5C2a,KAAKk1E,kBAAmB,EAEnBF,EAOHh1E,KAAKkB,OAAQ,EACblB,KAAKqsE,cARa,CAClB,MAAMllF,QAAajD,GAAAA,EAAAA,OAAa8b,KAAKi1E,0BACjC9tF,IACF6Y,KAAKqzD,SAASrhF,EAASmV,GACvB6Y,KAAKjyB,QAAQ,UAEjB,MAIK,GAAIiyB,KAAKkB,MAAO,CACrB,MAAM/Z,EAA0B,CAAC,EACjC,IAAK,MAAM9U,KAAUL,EACnBmV,EAAK9U,GAAU6R,GAAAA,EAAAA,QACZ4C,GACCA,EAAEzU,SAAWA,GACbyU,EAAEzB,YAAc2a,KAAK3a,WACrB0vF,IAAcjuF,EAAEiuF,WAChBvhG,EAAiBkT,SAASI,EAAEH,UAC9B,GAEJqZ,KAAKqzD,SAASrhF,EAASmV,EACzB,CACF,CAEAksE,SAASrhF,EAAmBmV,GAAyB,IAAAguF,EAAAC,EAAAC,EAAAC,EACnD,MAAM,WAAE/gF,GAAeyL,KAAK3uB,MAAM2V,QAClC,IAAIuuF,EAAe,KACfC,EAAc,KAClB,IAAK,IAAIn/F,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CAC/C,MAAMuP,EAASoa,KAAK6W,GAAGxgC,GACnBuP,EAAS2O,EAAa,GAAK3O,EAAS2O,EAAayL,KAAKyoD,eAMrC,OAAjB8sB,IACFA,EAAev1E,KAAK7Y,KAAKjE,KAAK7M,IAGhCm/F,EAAcx1E,KAAK7Y,KAAKjE,KAAK7M,GAC/B,CAEA8Q,EAAK6Y,KAAK7Y,KAAK9U,QAAU2tB,KAAK7Y,KAC9B6Y,KAAKvZ,OAASU,EACd6Y,KAAKg1D,KAAO,CAAC,EACb,MAAMygB,EAAcz1E,KAAK7Y,KAAKuuF,iBAC9B,IAAK,MAAMrjG,IAAU,CAAC2tB,KAAK7Y,KAAK9U,UAAWL,GAAU,CACnDguB,KAAKg1D,KAAK3iF,GAAU,GACpB,MAAM+zD,EAAIj/C,EAAK9U,GACf,IAAK+zD,EACH,SAEF,IAAItvB,EAAQ,KACR5+B,GAAS,EACb,IAAK,IAAI7B,EAAI,EAAGA,EAAI+vD,EAAElvB,MAAMrsC,OAAQwL,IAAK,CACvC,MAAM6M,EAAOkjD,EAAEljD,KAAK7M,GAChB6M,EAAOqyF,GAAiBryF,EAAOsyF,IAInCt9F,EAAQu9F,EAAYvyF,GAChBhL,UAIU,OAAV4+B,IACFA,EAAQsvB,EAAElvB,MAAM7gC,GAChB2pB,KAAK8W,MAAMzkC,GAAUykC,EACjB5+B,EAAQ,IACV8nB,KAAKg1D,KAAK3iF,GAAQ6F,EAAQ,GAAmB,IAAbkuD,EAAElvB,MAAM7gC,GAAYygC,EAAQ,MAIhE9W,KAAKg1D,KAAK3iF,GAAQ6F,GAAuB,IAAbkuD,EAAElvB,MAAM7gC,GAAYygC,EAAQ,KAC1D,CAEI5+B,EAAQ8nB,KAAK7Y,KAAKjE,KAAKrY,OAAS,GAAe,OAAVisC,IACvC9W,KAAKg1D,KAAK3iF,GAAQ6F,EAAQ,GAAK8nB,KAAKg1D,KAAK3iF,GAAQ6F,GAErD,CAEA,MAAMy9F,EAAahrG,OAAOC,KAAKo1B,KAAKg1D,MAAMttF,KAAKo9B,GAAM9E,KAAKg1D,KAAKlwD,MACzD,IAAE9+B,EAAG,IAAEC,GAAQ0vG,EAAWxqG,MAAMyb,GAAUA,EAAM/b,OAAS,IAC3Dm1B,KAAKszD,wBAAwBqiB,GAC7B31E,KAAK8uE,kBAAkB9uE,KAAKn4B,MAEhCm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,EAEX,MAAM05D,EAAK8hB,GAAAA,cAERjD,MAAM,CAAC,EAAGx+C,KAAK6gD,gBACfj6C,OAAO,CAA2B,QAA3BuuE,EAAsB,QAAtBC,EAACp1E,KAAK3uB,MAAMk0B,kBAAU,IAAA6vE,OAAA,EAArBA,EAAuBnvG,WAAG,IAAAkvG,EAAAA,EAAIn1E,KAAK/5B,IAA+B,QAA5BovG,EAAuB,QAAvBC,EAAEt1E,KAAK3uB,MAAMk0B,kBAAU,IAAA+vE,OAAA,EAArBA,EAAuBtvG,WAAG,IAAAqvG,EAAAA,EAAIr1E,KAAKh6B,MACjFg6B,KAAK3uB,MAAMk0B,YACdo6B,EAAG+hB,KAAK,IAGV1hD,KAAK3uB,MAAMw0B,MAAMd,EAAI/E,KAAK2/B,GAAKA,EAC/B3/B,KAAKkB,OAAQ,CACf,CAEAorE,gBAAgBp4D,GACd,IAAKlU,KAAKkB,MACR,OAEF,MAAM,eAAEyyD,EAAc,kBAAE78D,GAAsBkJ,KAAK4W,yBACnD,IAAI66B,EAAAA,EACF,CACEzV,IAAKh8B,KAAKzL,WACV2nC,IAAKl8B,KAAKzL,WAAayL,KAAKyoD,aAC5BxsB,GAAIhyD,KAAKyrC,MAAM1V,KAAK2/B,GAAG,IACvBxD,GAAIlyD,KAAKyrC,MAAM1V,KAAK2/B,GAAG,IACvB+R,YAAa,UACbC,WAAY,GAEd3xC,KAAK3uB,OACLsvB,OAAOuT,GAETA,EAAQ2oB,UAAU,GAAK,IACvB,MAAM+4C,EAAW51E,KAAK80E,aACtB,IAAK,IAAI58F,EAAQ,EAAGA,EAAQ09F,EAAS/qG,OAAQqN,IAAS,CACpD,MAAM7F,EAASujG,EAAS19F,GACxB,GAAI8nB,KAAKg1D,KAAK3iF,GAAQxH,OAAS,EAAG,CAChCqpC,EAAQ1lC,IAAI,cAAemlF,EAAez7E,EAAQy7E,EAAe9oF,SACjEqpC,EAAQ4oB,YACR,IAAK,IAAIzmD,EAAI,EAAGA,EAAI2pB,KAAKg1D,KAAK3iF,GAAQxH,OAAQwL,IAAK,CACjD,MAAM0uB,EAAI96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKg1D,KAAK3iF,GAAQgE,KAC/C69B,EAAQgpB,OAAOl9B,KAAK6W,GAAGxgC,GAAI0uB,EAC7B,CACAmP,EAAQipB,QACV,CACF,CAEAjpB,EAAQ1lC,IAAI,cAAesoB,EAAkBy8B,QAAQgJ,OAAO1D,MAC5D3kB,EAAQ4oB,YACR,IAAK,IAAIzmD,EAAI,EAAGA,EAAI2pB,KAAKg1D,KAAKh1D,KAAK7Y,KAAK9U,QAAQxH,OAAQwL,IAAK,CAC3D,MAAM0uB,EAAI96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKg1D,KAAKh1D,KAAK7Y,KAAK9U,QAAQgE,KACpD0lB,MAAMgJ,IACTmP,EAAQgpB,OAAOl9B,KAAK6W,GAAGxgC,GAAI0uB,EAE/B,CACAmP,EAAQipB,SACRjpB,EAAQ2oB,WAAW,IAAM,GAC3B,CAEAqxC,yBAAyBh6D,EAAmC80C,GAC1D,IAAK90C,IAAY80C,EACf,OAEF,MAAM,eAAE2K,EAAc,cAAEruE,EAAa,kBAAEwR,GAAsBkJ,KAAK4W,0BAC5D,OAAE2lB,GAAWj3C,EAAciuC,QACjB,CAACvzB,KAAK7Y,KAAK9U,UAAW2tB,KAAK80E,cACnC3iG,SAAQ,CAAChL,EAAK+Q,KAAU,IAAA29F,EAAAC,EAAAC,EAC9B,MAAMC,EAAuC,QAAdH,EAAG71E,KAAKvZ,cAAM,IAAAovF,GAAoB,QAApBA,EAAXA,EAAc71E,KAAK7Y,KAAK9U,eAAO,IAAAwjG,OAAA,EAA/BA,EAAiC3sB,kBAAkB,OAAQF,GACvFitB,EAAoBD,EACX,QADoCF,EAC/C91E,KAAKvZ,cAAM,IAAAqvF,GAAO,QAAPA,EAAXA,EAAc3uG,UAAI,IAAA2uG,GAAkB,QAAlBA,EAAlBA,EAAoBJ,wBAAgB,IAAAI,OAAA,EAApCA,EAAuCE,GACvC,KACEE,EAAoBD,EAC4B,KAAtC,QAAXF,EAAA/1E,KAAKvZ,cAAM,IAAAsvF,GAAO,QAAPA,EAAXA,EAAc5uG,UAAI,IAAA4uG,GAAO,QAAPA,EAAlBA,EAAoB7+D,aAAK,IAAA6+D,OAAA,EAAzBA,EAA4BE,IAA4Bj2E,KAAK8W,MAAM3vC,GAAO,IAC3E,KACsB,OAAtB+uG,GAA+Bn6E,MAAMm6E,KACvChiE,EAAQktB,UAAY7E,EAAO2uB,WAC3Bh3C,EAAQ0+B,SACN97C,EAAkBsH,KAAKwvE,eAAe3vB,OAAO7/C,KAAQokC,EAAAA,GAAAA,MACpD1rC,EAAkBsH,KAAKwvE,eAAezsC,KAAKE,WAC1CvqC,EAAkBsH,KAAKwvE,eAAettB,eACrCpoE,EAAQ,GACT4e,EAAkBsH,KAAKwvE,eAAe3vB,OAAOvsD,IAC7C8wC,EAAAA,GAAAA,KACFA,EAAAA,GAAAA,KAAexiC,KAAKm2E,oBAAoBhvG,GAAOq7D,EAAAA,GAAAA,KAC/CA,EAAAA,GAAAA,KAAe1rC,EAAkBsH,KAAKwvE,eAAezsC,KAAKr7D,KAAQ08D,EAAAA,GAAAA,MAEpE,IAAIxB,EAAAA,EACF,CACE9sD,KAAM,GAAF1P,OAAK2C,EAAG,KAAA3C,OAAI0xG,EAAkBllC,QAAQ,GAAE,KAC5ClsC,EAAGhO,EAAkBsH,KAAKwvE,eAAe3vB,OAAO7/C,KAChD2G,GACGjO,EAAkBsH,KAAKwvE,eAAezsC,KAAKE,WAC1CvqC,EAAkBsH,KAAKwvE,eAAettB,eACrCpoE,EAAQ,GACX4e,EAAkBsH,KAAKwvE,eAAe3vB,OAAOvsD,IAC/CyvC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQlqC,EAAkBsH,KAAKwvE,eAAezsC,MACpFC,UACY,IAAVlpD,EAAcqkD,EAAO65C,0BAA4BziB,EAAez7E,EAAS,EAAIy7E,EAAe9oF,QAC9Fy2D,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,KAEhBhuC,KAAK3uB,OACLsvB,OAAOuT,GACX,GAEJ,CAEA+5D,0BAA0B/5D,EAAmC80C,GAAoB,IAAAqtB,EAAAC,EAC/E,IAAKpiE,IAAY80C,EACf,OAGF,MAAM,eAAE2K,EAAc,cAAEruE,EAAa,kBAAEwR,GAAsBkJ,KAAK4W,0BAC5D,OAAE2lB,GAAWj3C,EAAciuC,QACjC,IAAIgjD,GAAa,EACjB,MAAMC,EAAc1/E,EAAkBsH,KAAKwvE,eAAe3vB,OAAOvsD,IAAOuoE,EAAAA,GAClEjoF,EAAU,CAACguB,KAAK7Y,KAAK9U,UAAW2tB,KAAK80E,cACrC92B,EAAa,IAAIhd,EAAAA,EACrB,CACEG,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ,IACzClqC,EAAkBsH,KAAKwvE,eAAezsC,KACzCr6D,MAAO,WAETw6D,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,OACdvM,YAAYqV,EAAAA,GAAAA,IAAwBva,EAAO2uB,WAAY,IACvD1pB,QAAS,CAAE9vC,IAAK,EAAG0d,OAAQ,EAAGhR,KAAM,EAAGiN,MAAO,IAEhDrL,KAAK3uB,OAEP,IAAIyzB,EAAIhO,EAAkBsH,KAAKwvE,eAAe3vB,OAAO7/C,KACjD2G,EACFjO,EAAkBsH,KAAKwvE,eAAe3vB,OAAOvsD,KAAQ,EAAIuoE,EAAAA,GAAyBjc,EAAWjiB,MAAMsF,YAAc,EAEnH,MAEMo1C,EAFYz4B,EAAWjiB,MAAMsF,WAAarvD,EAAQnH,OAEd2rG,GAAex2E,KAAKrO,OAC1DqO,KAAK95B,OAASskD,EAAAA,KAAiCisD,GACjDF,GAAa,EACbzxE,GAAKA,EAAI9E,KAAK6tE,YAEd9oE,GAAKjO,EAAkBsH,KAAKwvE,eAAe3vB,OAAOvsD,IAAOuoE,EAAAA,GAG3D,MAAMyc,EAAyB,QAAdL,EAAGr2E,KAAKvZ,cAAM,IAAA4vF,OAAA,EAAXA,EAAcr2E,KAAK7Y,KAAK9U,QACtCskG,EAAgB1sG,KAAKjE,IAAIgjF,GAAsC,QAA1BstB,EAACI,aAAW,EAAXA,EAAax/D,MAAMrsC,cAAM,IAAAyrG,EAAAA,EAAIr/C,KAAY,GACrFjlD,EAAQG,SAAQ,CAAChL,EAAK+Q,KAAU,IAAA0+F,EAAAC,EAC9B,MAAMb,EAA4BU,aAAW,EAAXA,EAAaxtB,kBAAkB,OAAQytB,GACnEV,EAAoBD,EACX,QADoCY,EAC/C52E,KAAKvZ,cAAM,IAAAmwF,GAAO,QAAPA,EAAXA,EAAczvG,UAAI,IAAAyvG,GAAkB,QAAlBA,EAAlBA,EAAoBlB,wBAAgB,IAAAkB,OAAA,EAApCA,EAAuCZ,GACvC,KACEE,EAAoBD,EAC4B,KAAtC,QAAXY,EAAA72E,KAAKvZ,cAAM,IAAAowF,GAAO,QAAPA,EAAXA,EAAc1vG,UAAI,IAAA0vG,GAAO,QAAPA,EAAlBA,EAAoB3/D,aAAK,IAAA2/D,OAAA,EAAzBA,EAA4BZ,IAA4Bj2E,KAAK8W,MAAM3vC,GAAO,IAC3E,KACJ,GAA0B,OAAtB+uG,IAA+Bn6E,MAAMm6E,GAAoB,CAC3Dl4B,EAAWxvE,IAAI,CACbs2B,IACAC,IACAq8B,UACY,IAAVlpD,EAAcqkD,EAAO65C,0BAA4BziB,EAAez7E,EAAS,EAAIy7E,EAAe9oF,QAC9FqJ,KAAM,GAAF1P,OAAK2C,EAAG,KAAA3C,OAAI0xG,EAAkBllC,QAAQ,GAAE,OAE9C,MAAM8lC,EACJ94B,EAAWvT,QAAQv2B,GAAW8pC,EAAWjiB,MAAMyF,QAAQpjC,KAAO4/C,EAAWjiB,MAAMyF,QAAQn2B,OAEtFkrE,GACDv2E,KAAK95B,MAAQ4wB,EAAkBsH,KAAKwvE,eAAe3vB,OAAO7/C,KAAQtH,EAAkBuU,MAAMnlC,OACxF4+B,EAAIgyE,IAENhyE,EAAI,EAAIhO,EAAkBsH,KAAKwvE,eAAe3vB,OAAO7/C,KAAQ4B,KAAK6tE,WAClE9oE,GAAKi5C,EAAWjiB,MAAMsF,WACtB2c,EAAWxvE,IAAI,CAAEs2B,IAAGC,OAEtBi5C,EAAWr9C,OAAOuT,GAEdqiE,EACFxxE,GAAKi5C,EAAWjiB,MAAMsF,WAEtBv8B,GAAKgyE,CAET,IAEJ,CAEA/4B,YAAY7pC,GACV,GAAKlU,KAAKkB,MAGV,OAAOyC,MAAMo6C,YAAY7pC,EAC3B,CAEA2oC,YAAY3oC,GACV,IAAI7hC,EACJsxB,MAAMk5C,YAAY3oC,GAClB,MAAM,kBAAEpd,EAAiB,cAAExR,EAAa,eAAEquE,GAAmB3zD,KAAK4W,0BAC5D,OAAE2lB,GAAWj3C,EAAciuC,QACjC,IAAKvzB,KAAKkB,MACR,OAEF,GAA2C,IAAvClB,KAAKg1D,KAAKh1D,KAAK7Y,KAAK9U,QAAQxH,OAC9B,OAEF,MAAMgyD,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,UACAu1B,QAAS3yC,EAAkBsH,KAAKl4B,MAChCwjE,QAAS5yC,EAAkBpF,IAAIC,SAEjCkrC,EAAUqkB,KACV,MAAM,WAAE7f,EAAU,QAAEG,EAAO,KAAE17D,GAASgxB,EAAkBuU,MAAMg3C,KAAKlhB,KAC7DjtD,EAAO,IAAI8sD,EAAAA,EACf,CACEl8B,EAAG9E,KAAKyoD,aAAetK,EAAAA,GAAAA,EAAW3c,EAASpjC,KAAQtH,EAAkBuU,MAAMg3C,KAAKpE,OAAO7/C,KACvF+iC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQ,CAAEl7D,SAChDu7D,aACAG,QAAS,CACPpjC,KAAMojC,EAASpjC,KACfiN,MAAOm2B,EAASn2B,MAChB3Z,IAAK8vC,EAAS9vC,IACd0d,OAAQoyB,EAASpyB,QAEnBmyB,aAAcyM,EAAAA,GAAAA,OACd5M,UAAW7E,EAAOw6C,WAEpB/2E,KAAK3uB,OAEDukG,EAAW51E,KAAK80E,aAChBjE,EAAa,GACnB,IAAK,IAAI34F,EAAQ,EAAGA,EAAQ09F,EAAS/qG,OAAQqN,IAC3C7F,EAASujG,EAAS19F,GACd8nB,KAAKg1D,KAAK3iF,GAAQxH,OAAS,GAC7BgmG,EAAWr+F,KAAK,CACd0B,KAAM8rB,KAAKg1D,KAAK3iF,GAAQ29C,OAAOghB,QAAQ,GAAK,IAC5CjsC,EAAG96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKg1D,KAAK3iF,GAAQ29C,SACxCyR,WAAYkyB,EAAez7E,EAAQy7E,EAAe9oF,UAIxDgmG,EAAWr+F,KAAK,CACd0B,KAAM8rB,KAAKg1D,KAAKh1D,KAAK7Y,KAAK9U,QAAQ29C,OAAOghB,QAAQ,GAAK,IACtDjsC,EAAG96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKg1D,KAAKh1D,KAAK7Y,KAAK9U,QAAQ29C,SAClDyR,WAAYlF,EAAO65C,4BAGrB,MACMvJ,EAAO7sE,KAAK6gD,cAClBgwB,EAAW1+F,SAAS2+F,IACdA,EAAa/rE,GAHN,GAGmB+rE,EAAa/rE,GAAK8nE,GAC9C34F,EAAK1F,IAAIsiG,GAAcnwE,OAAOuT,EAChC,IAGF2oB,EAAU6lB,MACZ,CAEAirB,qBAAqBz5D,GACnBvQ,MAAMgqE,qBAAqBz5D,GAC3B,MAAM,eAAEy/C,EAAc,cAAEruE,EAAa,kBAAEwR,GAAsBkJ,KAAK4W,0BAC5D,OAAE2lB,GAAWj3C,EAAciuC,QACjC,GAAIvzB,KAAKkB,MAAO,CACd,MAAMlvB,EAAUguB,KAAK80E,aACfoB,EAAoB,CACxB,CAAE,CAACl2E,KAAK7Y,KAAK9U,QAAS2tB,KAAKg1D,KAAKh1D,KAAK7Y,KAAK9U,QAAQ2tB,KAAKg1D,KAAKh1D,KAAK7Y,KAAK9U,QAAQxH,OAAS,OACpFmH,EAAQtK,KAAK2K,IAAM,CAAQ,CAACA,GAAS2tB,KAAKg1D,KAAK3iF,GAAQ2tB,KAAKg1D,KAAK3iF,GAAQxH,OAAS,QACrFsB,QAAO,CAACmuF,EAAMzuF,KAAY,IAAMyuF,KAASzuF,KAAY,CAAC,GACxDlB,OAAOC,KAAKsrG,GAAmB/jG,SAAQ,CAAChL,EAAK+Q,KAC3C,GAAIg+F,EAAkB/uG,GAAM,CAC1B,MAAM+M,EAAO,IAAI8sD,EAAAA,EACf,CACE9sD,KAAM,GAAF1P,OAAK2C,EAAG,KAAA3C,OAAI0xG,EAAkB/uG,GAAK6pE,QAAQ,GAAE,KACjDlsC,EAAGhO,EAAkBsH,KAAKwvE,eAAe3vB,OAAO7/C,KAChD2G,GACGjO,EAAkBsH,KAAKwvE,eAAezsC,KAAKE,WAC1CvqC,EAAkBsH,KAAKwvE,eAAettB,eACrCpoE,EAAQ,GACX4e,EAAkBsH,KAAKwvE,eAAe3vB,OAAOvsD,IAC/CyvC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQlqC,EAAkBsH,KAAKwvE,eAAezsC,MACpFC,UACY,IAAVlpD,EAAcqkD,EAAO65C,0BAA4BziB,EAAez7E,EAAS,EAAIy7E,EAAe9oF,QAC9Fy2D,UAAW2M,EAAAA,GAAAA,KACX1M,aAAcyM,EAAAA,GAAAA,KAEhBhuC,KAAK3uB,OAEP2uB,KAAKm2E,oBAAsB,IAAKn2E,KAAKm2E,oBAAqB,CAAChvG,GAAM+M,EAAKu2D,QAAQv2B,IAC9EhgC,EAAKysB,OAAOuT,EACd,IAEJ,CACF,CAEA4gE,aACE,OAAO90E,KAAKhuB,QACTqU,MAAM,KACN3e,KAAK2K,GAAWA,IAChByH,QAAQgrB,GAAMA,GACnB,CAEAmwE,yBACE,MAAM,UAAE5vF,GAAc2a,KAAK3uB,MAAM2V,QAAQ7C,QACzC,OAAO6b,KAAK80E,aAAaptG,KAAK2K,IAAM,CAClCA,SACA2N,YAAY+B,EAAAA,EAAAA,IAAc1P,GAC1BgT,eAEJ,CAEA7W,IAAIP,GACF+xB,KAAKkB,OAAQ,EACblB,KAAKk1E,kBAAmB,EACxBvxE,MAAMn1B,IAAI,IAAKP,EAAQ+D,QAAS/D,EAAOgS,SAAWhS,EAAO+D,SAAUglG,EAAAA,EAAAA,IAAmB/oG,EAAO+D,SAAS,GAAQ,MAC9GguB,KAAKhuB,SAAWguB,KAAKhuB,SAAW,IAAInI,aACtC,CAEA8C,iBACE,MAAO,CACL0C,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CACN,CACEnF,KAAM,OACN3D,MAAO,UACPsE,KAAM,UACNrE,MAAS67B,KAAKhuB,QAAUguB,KAAKhuB,QA5cf,UA6cdhK,UAAU,IAGd+mG,oBAAqB,CACnB/8F,QAAS,0CAGf,CAEAg9F,WAAW7nG,GACT,MACO,YADCA,GAEG64B,KAAK74B,GAAK0D,OAAS,CAIhC,CAEAi1C,WACE,OAAO9f,KAAKusE,sCAAwC,SAAW,SAAH/nG,OAAYw7B,KAAKhuB,QAC/E,EACDsuB,GAheKu0E,GAAgB,OACNjjG,EAAAA,EAAAA,MAAkB0uB,GAD5Bu0E,GAAgB,QAEL,uBAgejB,Y,ycCtfA,MAAMoC,WAAYlL,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,GAAA,WAIjB,GAAE,CAIlB9xB,IAAIP,GACF,GAA6B,iBAAlBA,EAAOgS,OAAqB,CACrC,MAAOA,EAAS,EAAGi3F,EAAW,IAAK/K,EAAAA,EAAAA,IAAkCl+F,EAAOgS,QAC5E0jB,MAAMn1B,IAAI,IAAKP,EAAQgS,SAAQi3F,YACjC,MACEvzE,MAAMn1B,IAAIP,EAEd,CAEAo+F,UAAU,IAAA8K,EACR,IAAKn3E,KAAKysE,qBAAsB,OAEhCzsE,KAAKo3E,IAAM,GACX,IAGIC,EAAWjxC,EAAWkxC,EAAYC,EAHlC1iG,EAAQ,EACR2iG,EAAO,EACPC,EAAO,EAEX,IAAK,IAAIphG,EAAI2pB,KAAKk3E,SAAU7gG,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CAC3DghG,EAAIjxC,EAAI,EACJpmC,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI2pB,KAAKk3E,YAChDG,EAAIr3E,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI2pB,KAAKk3E,WAEhDl3E,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI2pB,KAAKk3E,YAChD9wC,EAAIpmC,KAAK7Y,KAAK+vB,MAAM7gC,EAAI2pB,KAAKk3E,UAAYl3E,KAAK7Y,KAAK+vB,MAAM7gC,IAGvDxB,EAAQmrB,KAAK/f,QACfu3F,GAAQH,EACRI,GAAQrxC,EACRvxD,IACA0iG,EAAKC,EAAO3iG,EACZyiG,EAAKG,EAAO5iG,IAEZ0iG,GAAMA,GAAOv3E,KAAK/f,OAAS,GAAKo3F,GAAKr3E,KAAK/f,OAC1Cq3F,GAAMA,GAAOt3E,KAAK/f,OAAS,GAAKmmD,GAAKpmC,KAAK/f,QAG5C,MAAMy3F,EAAKJ,EAAK,EAAIC,EAAKD,EAAK,EAC9Bt3E,KAAKo3E,IAAI/gG,GAAK,IAAa,GAAK,EAAIqhG,GAAhB,GACtB,CAEA13E,KAAK+sE,UAA2B,QAAlBoK,EAAGn3E,KAAKo3E,IAAIpnD,cAAM,IAAAmnD,EAAAA,EAAI,KACpC,MAAM,IAAEnxG,EAAG,IAAEC,GAAQ+5B,KAAK8uE,kBAAkB9uE,KAAKn4B,MACjDm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACdlU,KAAKmuE,yBAAyBj6D,EAASlU,KAAKo3E,IAAKp3E,KAAKk3E,SAAU,GAAI,GAAI,GAC1E,CAEAvqG,iBAAiB,IAAAsjG,EAAA0H,EACf,MAAM13F,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAEDixG,EAAW,CACfrvG,KAAM,SACN3D,MAAO,WACPsE,KAAM,WACNrE,MAAoB,QAAfwzG,EAAE33E,KAAKk3E,gBAAQ,IAAAS,EAAAA,EAAI,EACxB3vG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,EAAQi3F,GACjBnI,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,KACnFixG,SAAU,GAAF1yG,OAAK0yG,EAAShzG,MAAK,oCAAAM,OAAmC0yG,EAASlxG,IAAG,SAAAxB,OAAQ0yG,EAASjxG,MAGjG,CAEA+oG,WAAW7nG,GACT,OAAQA,GACN,IAAK,SACL,IAAK,WACH,OAAO64B,KAAKivE,sBAAsB,CAAE9nG,QACtC,QACE,OAAO,EAEb,CAEA24C,WACE,MAAO,OAAPt7C,OAAcw7B,KAAK/f,OAAM,KAAAzb,OAAIw7B,KAAKk3E,SACpC,EACD52E,GAtGK22E,GAAG,OACOrlG,EAAAA,EAAAA,KAAiB0uB,GAD3B22E,GAAG,QAEQ,2BAsGjB,Y,ycCxGA,MAAMW,WAAY7L,EAAU1rE,cAAA,SAAA1mB,WAAA2mB,GAAA,WAIV,GAAE,CAGlB9xB,IAAIP,GACF01B,MAAMn1B,IAAIP,GACV+xB,KAAK4uE,eAAe3gG,EACtB,CAEAo+F,UACE,GAAIrsE,KAAKysE,qBAAsB,KAAAoL,EAC7B73E,KAAK83E,IAAM,GACX,IAAK,IAAIzhG,EAAI2pB,KAAK/f,OAAQ5J,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IACpD2pB,KAAK83E,IAAIzhG,IAAO2pB,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI2pB,KAAK/f,SAAW+f,KAAK7Y,KAAK+vB,MAAM7gC,EAAI2pB,KAAK/f,QAAW,IAG/G+f,KAAK+sE,UAA2B,QAAlB8K,EAAG73E,KAAK83E,IAAI9nD,cAAM,IAAA6nD,EAAAA,EAAI,IACtC,CACA,MAAM,IAAE7xG,EAAG,IAAEC,GAAQ+5B,KAAK83E,IAAIjtG,OAAS,EAAIm1B,KAAKszD,qBAAqBtzD,KAAK83E,KAAO93E,KAAK8uE,kBAAkB9uE,KAAKn4B,MAC7Gm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACd,IAAIu9B,EAAAA,EACF,CACEzV,IAAKh8B,KAAKzL,WACV2nC,IAAKl8B,KAAKzL,WAAayL,KAAKyoD,aAC5BxsB,GAAIhyD,KAAKyrC,MAAM1V,KAAK2/B,GAAG,IACvBxD,GAAIlyD,KAAKyrC,MAAM1V,KAAK2/B,GAAG,IACvB+R,YAAa,UACbC,WAAY,GAEd3xC,KAAK3uB,OACLsvB,OAAOuT,GACTA,EAAQ1lC,IAAI,cAAewxB,KAAK4W,yBAAyB9f,kBAAkBy8B,QAAQgJ,OAAO1D,MAC1F3kB,EAAQ2oB,UAAU,GAAK,IACvB3oB,EAAQ4oB,aACRsrB,EAAAA,EAAAA,IAAkB,CAChBjkE,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZmiF,gBAAiBA,CAAChyE,EAAWyuB,KAC3BoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK83E,IAAIzhG,KAAK,IAGvD69B,EAAQipB,SACRjpB,EAAQ2oB,WAAW,IAAM,GAC3B,CAEAlwD,iBAAiB,IAAAsjG,EACf,MAAMhwF,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,GACT8uF,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,MAGzF,CAEA+oG,WAAW7nG,GACT,MACO,WADCA,GAEG64B,KAAKivE,sBAAsB,CAAE9nG,OAI1C,CAEA24C,WACE,MAAO,OAAPt7C,OAAcw7B,KAAK/f,OACrB,EACDqgB,GAtFKs3E,GAAG,OACOhmG,EAAAA,EAAAA,KAAiB0uB,GAD3Bs3E,GAAG,QAEQ,oBAsFjB,Y,ycC1FA,MAAMG,WAAYhM,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,GAAA,WAIjB,GAAE,CAGlB9xB,IAAIP,GACF01B,MAAMn1B,IAAIP,GACV+xB,KAAK4uE,eAAe3gG,EACtB,CAEAo+F,UAAU,IAAA2L,EACR,IAAKh4E,KAAKysE,qBAAsB,OAEhCzsE,KAAKi4E,IAAM,GACX,IAGIZ,EAAWjxC,EAAWkxC,EAAYC,EAHlC1iG,EAAQ,EACR2iG,EAAO,EACPC,EAAO,EAEX,IAAK,IAAIphG,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CAC/CghG,EAAIjxC,EAAI,EACJpmC,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,KAC3CghG,EAAIr3E,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,IAE3C2pB,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,KAC3C+vD,EAAIpmC,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,IAG3CxB,EAAQmrB,KAAK/f,QACfu3F,GAAQH,EACRI,GAAQrxC,EACRvxD,IACA0iG,EAAKC,EAAO3iG,EACZyiG,EAAKG,EAAO5iG,IAEZ0iG,GAAMA,GAAOv3E,KAAK/f,OAAS,GAAKo3F,GAAKr3E,KAAK/f,OAC1Cq3F,GAAMA,GAAOt3E,KAAK/f,OAAS,GAAKmmD,GAAKpmC,KAAK/f,QAG5C,MAAMy3F,EAAKJ,EAAK,EAAIC,EAAKD,EAAK,EAC9Bt3E,KAAKi4E,IAAI5hG,GAAK,IAAa,GAAK,EAAIqhG,GAAhB,GACtB,CAEA13E,KAAK+sE,UAA2B,QAAlBiL,EAAGh4E,KAAKi4E,IAAIjoD,cAAM,IAAAgoD,EAAAA,EAAI,KACpC,MAAM,IAAEhyG,EAAG,IAAEC,GAAQ+5B,KAAK8uE,kBAAkB9uE,KAAKn4B,MACjDm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACdlU,KAAKmuE,yBAAyBj6D,EAASlU,KAAKi4E,IAAK,EAAG,GAAI,GAAI,GAC9D,CAEAtrG,iBAAiB,IAAAsjG,EACf,MAAMhwF,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,GACT8uF,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,MAGzF,CAEA+oG,WAAW7nG,GACT,MACO,WADCA,GAEG64B,KAAKivE,sBAAsB,CAAE9nG,OAI1C,CAEA24C,WACE,MAAO,OAAPt7C,OAAcw7B,KAAK/f,OACrB,EACDqgB,GAtFKy3E,GAAG,OACOnmG,EAAAA,EAAAA,KAAiB0uB,GAD3By3E,GAAG,QAEQ,2BAsFjB,Y,ycCnFA,MAAMG,GACI,GADJA,GAEM,EAWZ,MAAMC,WAAuBpM,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,GAAA,YAI3B,GAAE,CAInB9xB,IAAIP,GACF,GAA6B,iBAAlBA,EAAOgS,OAAqB,CACrC,MAAOA,EAAS,EAAGm4F,EAAW,GAlBpC,SAAqBC,GACnB,MAAMpqG,EAASoqG,EAAUhyF,MAAM,KAI/B,MAAO,CAHQzd,SAASqF,EAAO,KAAOiqG,GACrBvvG,WAAWsF,EAAO,KAAOiqG,GAG5C,CAYyCI,CAAYrqG,EAAOgS,QACtD0jB,MAAMn1B,IAAI,IAAKP,EAAQgS,SAAQm4F,YACjC,MACEz0E,MAAMn1B,IAAIP,EAEd,CAEAo+F,UACE,GAAIrsE,KAAKysE,qBAAsB,KAAA8L,EAC7Bv4E,KAAKw4E,KAAO,GAEZ,IAAIjjE,EAAM,EACV,IAAK,IAAIl/B,EAAI,EAAGA,EAAI2pB,KAAK/f,OAAQ5J,IAC/Bk/B,GAAOvV,KAAK7Y,KAAK2qD,OAAOz7D,GAE1B,IAAK,IAAIA,EAAI2pB,KAAK/f,OAAQ5J,EAAI2pB,KAAK7Y,KAAK2qD,OAAOjnE,OAAQwL,IACrDk/B,EAAMA,EAAMvV,KAAK7Y,KAAK2qD,OAAOz7D,EAAI2pB,KAAK/f,QAAU+f,KAAK7Y,KAAK2qD,OAAOz7D,GACjE2pB,KAAKw4E,KAAKniG,GAAK2pB,KAAK7Y,KAAK2qD,OAAOz7D,IAAMk/B,EAAMvV,KAAK/f,QAGnD+f,KAAK+sE,UAA4B,QAAnBwL,EAAGv4E,KAAKw4E,KAAKxoD,cAAM,IAAAuoD,EAAAA,EAAI,IACvC,CAEA,MAAM,IAAEvyG,EAAG,IAAEC,GACX+5B,KAAKw4E,KAAK3tG,OAAS,EACfm1B,KAAKszD,qBAAqB,IAAItzD,KAAKw4E,KAAMx4E,KAAKo4E,WAC9Cp4E,KAAK8uE,kBAAkB9uE,KAAKn4B,MAClCm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACd,MAAM,cAAE5uB,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAC3BtmC,EAAa+S,KAAK3uB,MAAM2V,SACxB,WAAEmc,GAAelW,GACjB,aAAE4hE,EAAY,eAAEC,IAAmBC,EAAAA,EAAAA,IAA6B,CACpE5rD,aACApxB,YAAakb,EAAW0G,iBAEpBu0D,EAAwB2G,EAAgC,EAAjBC,EACvC9G,IAAiB/9E,KAAKhE,IAAI,EAAGiiF,EAAwB,IAE3DE,EAAAA,EAAAA,IAAkB,CAChBjkE,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZsoG,gBAAiBxuE,KAAK/f,OAAS,EAC/BooE,gBAAiBA,CAAChyE,EAAGyuB,KACnB,QAAqBlvB,IAAjBoqB,KAAKw4E,KAAKniG,GAAkB,OAEhC,MAAM+hG,EAAWnuG,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKo4E,WACnCrzE,EAAI96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKw4E,KAAKniG,KAEvC69B,EAAQktB,UAAYphC,KAAKw4E,KAAKniG,GAAK2pB,KAAKo4E,SAAW77C,EAAO+rB,gBAAkB/rB,EAAOgsB,cACnFr0C,EAAQ0+B,SAAS9tC,EAAIkjD,EAAcowB,EAAUlwB,EAAuBnjD,EAAIqzE,EAAS,IAIrF,MAAMK,EAAYz4E,KAAK2/B,GAAG3/B,KAAKo4E,UAC/B,IAAI3mC,EAAAA,EACF,CACEzV,IAAKh8B,KAAKzL,WACV2nC,IAAKl8B,KAAKzL,WAAayL,KAAKyoD,aAC5BxsB,GAAIhyD,KAAKyrC,MAAM+iE,GACft8C,GAAIlyD,KAAKyrC,MAAM+iE,GACf/mC,aAAaoF,EAAAA,GAAAA,IAAwBva,EAAOs1B,WAAY,KAE1D7xD,KAAK3uB,OACLsvB,OAAOuT,EACX,CAEAvnC,iBAAiB,IAAAsjG,EAAAyI,EACf,MAAMz4F,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAIiI,GACtBlwG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGDmyG,EAAW,CACfvwG,KAAM,SACN3D,MAAO,WACPsE,KAAM,WACNrE,MAAoB,QAAfu0G,EAAE14E,KAAKo4E,gBAAQ,IAAAM,EAAAA,EAAIR,GACxBlwG,UAAU,EACV7B,KAAM,GACNsC,cAAc,EACdzC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,EAAQm4F,GACjBrJ,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,KACnFmyG,SAAU,GAAF5zG,OAAK4zG,EAASl0G,MAAK,8BAAAM,OAA6B4zG,EAASpyG,IAAG,SAAAxB,OAAQ4zG,EAASnyG,MAG3F,CAEA+oG,WAAW7nG,GACT,OAAQA,GACN,IAAK,SACH,OAAO64B,KAAKivE,sBAAsB,CAAE9nG,QACtC,IAAK,WACH,OAAO64B,KAAKivE,sBAAsB,CAAE9nG,MAAK+nG,aAAa,IACxD,QACE,OAAO,EAEb,CAEApvD,WACE,MAAO,QAAPt7C,OAAew7B,KAAK/f,OAAM,MAAAzb,OAAKw7B,KAAKo4E,SAAQ,QAC9C,EACD93E,GAlIK63E,GAAc,OACJvmG,EAAAA,EAAAA,MAAkB0uB,GAD5B63E,GAAc,QAEH,mBAkIjB,Y,ycCjJA,MAAMQ,WAAY5M,EAUhB1rE,YAAY07B,EAAc1qD,GACxBsyB,MAAMo4B,EAAO1qD,GAAMivB,GAAA,UAPN,IAAEA,GAAA,WACD,IAAEA,GAAA,aACA,IAAEA,GAAA,aACF,IAKhBN,KAAK68C,YAAc78C,KAAK68C,YAAYv5C,KAAKtD,KAC3C,CAEAxxB,IAAIP,GACF01B,MAAMn1B,IAAIP,GACV+xB,KAAK4uE,eAAe3gG,EACtB,CAEAo+F,UACE,GAAIrsE,KAAKysE,qBAAsB,CAC7BzsE,KAAKskE,GAAK,GACVtkE,KAAK2vE,IAAM,GACX3vE,KAAK44E,MAAQ,GACb54E,KAAK64E,MAAQ,GACb,IAAIlJ,EAAM,EAEV,IAAK,IAAIt5F,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CAC/C,MAAMiuF,EAAK31E,EAAAA,GAAAA,IAAU,CACnBqR,KAAK7Y,KAAKk4D,KAAKhpE,GAAK2pB,KAAK7Y,KAAKm4D,IAAIjpE,GAClCpM,KAAK+xB,IAAIgE,KAAK7Y,KAAKk4D,KAAKhpE,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,IACjDpM,KAAK+xB,IAAIgE,KAAK7Y,KAAKm4D,IAAIjpE,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,MAElD2pB,KAAKskE,GAAGjuF,GAAKiuF,EAETjuF,EAAI2pB,KAAK/f,QACX0vF,GAAOrL,EACPtkE,KAAK2vE,IAAIt5F,GAAKs5F,GAAOt5F,EAAI,GACrBA,IAAM2pB,KAAK/f,OAAS,IACtB0vF,GAAO3vE,KAAK/f,SAGd+f,KAAK2vE,IAAIt5F,IAAM2pB,KAAK2vE,IAAIt5F,EAAI,IAAM2pB,KAAK/f,OAAS,GAAKqkF,GAAMtkE,KAAK/f,MAEpE,CAEA,IAAK,IAAI5J,EAAI2pB,KAAK/f,OAAS,EAAG5J,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CAC7D,MAAMinD,EAAIt9B,KAAK7Y,KAAKk4D,KAAKhpE,GACnBC,EAAI0pB,KAAK7Y,KAAKm4D,IAAIjpE,GACxB,IAAIyiG,EAAQ94E,KAAKskE,GAAGjuF,EAAI,GAAK2pB,KAAKskE,GAAGjuF,EAAI,GACrCxB,EAAQ,EACRkkG,EAAaD,EAAQjkG,EAAS5K,KAAK0+D,KAAK9zD,GACxCmkG,EAAQD,EAAY,GAAKz7C,EAAIt9B,KAAK7Y,KAAKm4D,IAAIjpE,EAAI,IAAM0iG,GAAa,EAClEE,EAAQF,EAAY,GAAK/4E,KAAK7Y,KAAKk4D,KAAKhpE,EAAI,GAAKC,GAAKyiG,GAAa,EACvE,IAAK,IAAIxS,EAAIlwF,EAAI,EAAGkwF,EAAIlwF,EAAI2pB,KAAK/f,OAAS,EAAGsmF,IAAK,CAIhD,GAHAuS,GAAS94E,KAAKskE,GAAGiC,EAAI,GACrB1xF,IACAkkG,EAAaD,EAAQjkG,EAAS5K,KAAK0+D,KAAK9zD,GACtB,IAAdkkG,EACF,SAGF,MAAMxiG,GAAM+mD,EAAIt9B,KAAK7Y,KAAKm4D,IAAIinB,EAAI,IAAMwS,EACpCxiG,EAAKyiG,IACPA,EAAQziG,GAGV,MAAME,GAAMupB,KAAK7Y,KAAKk4D,KAAKknB,EAAI,GAAKjwF,GAAKyiG,EACrCtiG,EAAKwiG,IACPA,EAAQxiG,EAEZ,CACAupB,KAAK44E,MAAMviG,GAAK2iG,EAChBh5E,KAAK64E,MAAMxiG,GAAK4iG,CAClB,CACF,CACA,MAAM,IAAEjzG,EAAG,IAAEC,GACX+5B,KAAK44E,MAAM/tG,OAAS,GAAKm1B,KAAK64E,MAAMhuG,OAAS,EACzCm1B,KAAKszD,qBAAqBtzD,KAAK44E,MAAO54E,KAAK64E,OAC3C74E,KAAK8uE,kBAAkB9uE,KAAKn4B,MAClCm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACd,GAA+B,IAA3BlU,KAAK7Y,KAAK+vB,MAAMrsC,OAAc,OAElC,MAAM0jG,EAAyB,CAC7BpqF,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZsoG,gBAAiBxuE,KAAK/f,QAGxBi0B,EAAQ2oB,UAAU,GAAK,IACvB3oB,EAAQ1lC,IAAI,cAAe,WAC3B0lC,EAAQ4oB,aACRsrB,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAWyuB,KAC3BoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK64E,MAAMxiG,KAAK,IAGzD69B,EAAQipB,SAERjpB,EAAQ1lC,IAAI,cAAe,WAC3B0lC,EAAQ4oB,aACRsrB,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAWyuB,KAC3BoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK44E,MAAMviG,KAAK,IAGzD69B,EAAQipB,SACRjpB,EAAQ2oB,WAAW,IAAM,GAC3B,CAEAggB,YAAY3oC,GAAmC,IAAA84D,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAC7C5pE,MAAMk5C,YAAY3oC,GAClB,MAAM,kBAAEpd,EAAiB,cAAExR,GAAkB0a,KAAK4W,0BAC5C,OAAE2lB,GAAWj3C,EAAciuC,QAC3BsJ,GAAYokB,EAAAA,EAAAA,IAAa,CAC7B/sC,UACAu1B,QAAS3yC,EAAkBsH,KAAKl4B,MAChCwjE,QAAS5yC,EAAkBpF,IAAIC,SAEjCkrC,EAAUqkB,KACV,MAAMhtE,EAAO,IAAI8sD,EAAAA,EACf,CACEl8B,EAAG9E,KAAKyoD,aAAetK,EAAAA,GAAAA,EAAW3b,EAAAA,GAAAA,IAAc1rC,EAAkBuU,MAAMg3C,KAAKpE,OAAO7/C,KACpF+iC,KAAMH,EAAAA,EAAAA,2BAAgC,OAAQlqC,EAAkBuU,MAAMg3C,KAAKlhB,MAC3EE,WAAYvqC,EAAkBuU,MAAMg3C,KAAKlhB,KAAKE,WAC9CG,QAAS,CACP9vC,IAAoD,QAAjDs7E,EAAmC,QAAnCC,EAAEn2E,EAAkBuU,MAAMg3C,KAAKlhB,YAAI,IAAA8rC,GAAS,QAATA,EAAjCA,EAAmCzrC,eAAO,IAAAyrC,OAAA,EAA1CA,EAA4Cv7E,WAAG,IAAAs7E,EAAAA,EAAIxqC,EAAAA,GAAAA,IACxDn3B,MAAwD,QAAnD6hE,EAAmC,QAAnCC,EAAEr2E,EAAkBuU,MAAMg3C,KAAKlhB,YAAI,IAAAgsC,GAAS,QAATA,EAAjCA,EAAmC3rC,eAAO,IAAA2rC,OAAA,EAA1CA,EAA4C9hE,aAAK,IAAA6hE,EAAAA,EAAI1qC,EAAAA,GAAAA,IAC5DpzB,OAA0D,QAApDg+D,EAAmC,QAAnCC,EAAEv2E,EAAkBuU,MAAMg3C,KAAKlhB,YAAI,IAAAksC,GAAS,QAATA,EAAjCA,EAAmC7rC,eAAO,IAAA6rC,OAAA,EAA1CA,EAA4Cj+D,cAAM,IAAAg+D,EAAAA,EAAI5qC,EAAAA,GAAAA,IAC9DpkC,KAAsD,QAAlDkvE,EAAmC,QAAnCC,EAAEz2E,EAAkBuU,MAAMg3C,KAAKlhB,YAAI,IAAAosC,GAAS,QAATA,EAAjCA,EAAmC/rC,eAAO,IAAA+rC,OAAA,EAA1CA,EAA4CnvE,YAAI,IAAAkvE,EAAAA,EAAI9qC,EAAAA,GAAAA,KAE5DjB,aAAcyM,EAAAA,GAAAA,OACd5M,UAAW7E,EAAOixC,sBAEpBxtE,KAAK3uB,OAEDw/F,EAAa,GACf7wE,KAAK64E,MAAMhuG,OAAS,GACtBgmG,EAAWr+F,KAAK,CACd0B,KAAM8rB,KAAK64E,MAAM7oD,OAAQghB,QAAQ,GACjCjsC,EAAG96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK64E,MAAM7oD,SACjCyR,WAAY,YAGZzhC,KAAK44E,MAAM/tG,OAAS,GACtBgmG,EAAWr+F,KAAK,CACd0B,KAAM8rB,KAAK44E,MAAM5oD,OAAQghB,QAAQ,GACjCjsC,EAAG96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK44E,MAAM5oD,SACjCyR,WAAY,YAIhB,MACMorC,EAAO7sE,KAAKrO,OAASmF,EAAkBsY,OAAOzd,OAASmF,EAAkBpF,IAAIC,OACnFk/E,EAAW1+F,SAAS2+F,IACdA,EAAa/rE,GAHN,GAGmB+rE,EAAa/rE,GAAK8nE,GAC9C34F,EAAK1F,IAAIsiG,GAAcnwE,OAAOuT,EAChC,IAGF2oB,EAAU6lB,MACZ,CAEA/1E,iBAAiB,IAAAsjG,EACf,MAAMhwF,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,EACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,GACT8uF,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,MAGzF,CAEA+oG,WAAW7nG,GACT,MACO,WADCA,GAEG64B,KAAKivE,sBAAsB,CAAE9nG,OAI1C,CAEA24C,WACE,MAAO,OAAPt7C,OAAcw7B,KAAK/f,OACrB,EACDqgB,GA5MKq4E,GAAG,OACO/mG,EAAAA,EAAAA,KAAiB0uB,GAD3Bq4E,GAAG,QAEQ,qBA4MjB,Y,ycC9MA,MAAMO,WAA6CnN,EAAa1rE,cAAA,SAAA1mB,WAAA2mB,GAAA,SAIhD,IAAEA,GAAA,UACD,IAAEA,GAAA,SACH,GAAE,CAKhB9xB,IAAIP,GACF,GAA6B,iBAAlBA,EAAOgS,OAAqB,CACrC,MAAOA,EAAS,EAAGk5F,EAAU,EAAGC,EAAU,IAAKjN,EAAAA,EAAAA,IAAkCl+F,EAAOgS,QACxF0jB,MAAMn1B,IAAI,IAAKP,EAAQgS,SAAQm5F,UAASD,WAC1C,MACEx1E,MAAMn1B,IAAIP,EAEd,CAEAo+F,UAAU,IAAAgN,EACR,IAAKr5E,KAAKysE,qBAAsB,OAEhC,MAAMxsF,EAAShW,KAAKjE,IAAIg6B,KAAK/f,OAAQ+f,KAAK7Y,KAAK+vB,MAAMrsC,OAAS,GAC9D,IAAIyuG,EAAQC,EAAMlT,EAClBrmE,KAAKw5E,GAAK,GACVx5E,KAAKqmE,EAAI,GACTrmE,KAAKomC,EAAI,GACT,IAAIqzC,EAAQF,EAAO,EACfG,EAAUJ,EAAS,EACvB,IAAK,IAAIjjG,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CAC/C,IAAIsjG,EAAc35E,KAAK7Y,KAAKk4D,KAAKhpE,GAC7BujG,EAAY55E,KAAK7Y,KAAKm4D,IAAIjpE,GAE9B,IAAK,IAAIkwF,EAAIlwF,EAAI4J,EAAS,EAAGsmF,GAAKlwF,EAAGkwF,IAC/BvmE,KAAK7Y,KAAKk4D,KAAKknB,GAAKoT,IACtBA,EAAc35E,KAAK7Y,KAAKk4D,KAAKknB,IAE3BvmE,KAAK7Y,KAAKm4D,IAAIinB,GAAKqT,IACrBA,EAAY55E,KAAK7Y,KAAKm4D,IAAIinB,IAI9BF,GAAMrmE,KAAK7Y,KAAK+vB,MAAM7gC,GAAKujG,IAAcD,EAAcC,GAAc,IACjED,IAAgBC,IAClBvT,EAAI,KAENrmE,KAAKw5E,GAAGnjG,GAAKgwF,EACTrmE,KAAKm5E,QAAU,IACjBM,GAAQpT,EACRqT,IACIA,EAAS15E,KAAKm5E,UAChBM,GAAQz5E,KAAKw5E,GAAGnjG,EAAI2pB,KAAKm5E,SACzBO,KAEFrT,EAAIoT,EAAOC,GAGbH,GAAQlT,EACRiT,IACIA,EAASt5E,KAAKo5E,UAChBG,GAAQv5E,KAAKqmE,EAAEhwF,EAAI2pB,KAAKo5E,SACxBE,KAGF,MAAMlzC,EAAImzC,EAAOD,EACjBt5E,KAAKqmE,EAAEhwF,GAAKgwF,EACZrmE,KAAKomC,EAAE/vD,GAAK+vD,CACd,CAEApmC,KAAK+sE,UAAyB,QAAhBsM,EAAGr5E,KAAKqmE,EAAEr2C,cAAM,IAAAqpD,EAAAA,EAAI,KAClC,MAAM,IAAErzG,EAAG,IAAEC,GAAQ+5B,KAAK8uE,kBAAkB9uE,KAAKn4B,MACjDm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACd,GAA+B,IAA3BlU,KAAK7Y,KAAK+vB,MAAMrsC,OAAc,OAElC,IAAI4mE,EAAAA,EACF,CACEzV,IAAKh8B,KAAKzL,WACV2nC,IAAKl8B,KAAKzL,WAAayL,KAAKyoD,aAC5BxsB,GAAIhyD,KAAKyrC,MAAM1V,KAAK2/B,GAAG,KACvBxD,GAAIlyD,KAAKyrC,MAAM1V,KAAK2/B,GAAG,KACvB+R,YAAa,UACbC,WAAY,GAEd3xC,KAAK3uB,OACLsvB,OAAOuT,GACT,IAAIu9B,EAAAA,EACF,CACEzV,IAAKh8B,KAAKzL,WACV2nC,IAAKl8B,KAAKzL,WAAayL,KAAKyoD,aAC5BxsB,GAAIhyD,KAAKyrC,MAAM1V,KAAK2/B,GAAG,KACvBxD,GAAIlyD,KAAKyrC,MAAM1V,KAAK2/B,GAAG,KACvB+R,YAAa,WAEf1xC,KAAK3uB,OACLsvB,OAAOuT,GACT,IAAIu9B,EAAAA,EACF,CACEzV,IAAKh8B,KAAKzL,WACV2nC,IAAKl8B,KAAKzL,WAAayL,KAAKyoD,aAC5BxsB,GAAIhyD,KAAKyrC,MAAM1V,KAAK2/B,GAAG,KACvBxD,GAAIlyD,KAAKyrC,MAAM1V,KAAK2/B,GAAG,KACvB+R,YAAa,WAEf1xC,KAAK3uB,OACLsvB,OAAOuT,GAETA,EAAQ1lC,IAAI,cAAewxB,KAAK4W,yBAAyB9f,kBAAkBy8B,QAAQgJ,OAAO1D,MAC1F3kB,EAAQ2oB,UAAU,GAAK,IACvB3oB,EAAQ4oB,YACR,MAAMyxC,EAAyB,CAC7BpqF,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZsoG,gBAAiBxuE,KAAK/f,SAExBmoE,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKqmE,EAAEhwF,KAAK,IAGrD69B,EAAQipB,SAERjpB,EAAQ1lC,IAAI,cAAe,WAC3B0lC,EAAQ4oB,aACRsrB,EAAAA,EAAAA,IAAkB,IACbmmB,EACHlmB,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQgpB,OAAOp4B,EAAG76B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAKomC,EAAE/vD,KAAK,IAGrD69B,EAAQipB,SACRjpB,EAAQ2oB,WAAW,IAAM,GAC3B,CAEAlwD,iBAAiB,IAAAsjG,EAAA4J,EAAAC,EACf,MAAM75F,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAEDkzG,EAAU,CACdtxG,KAAM,SACN3D,MAAO,WACPsE,KAAM,UACNrE,MAAmB,QAAd01G,EAAE75E,KAAKm5E,eAAO,IAAAU,EAAAA,EAAI,EACvB7xG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAEDmzG,EAAU,CACdvxG,KAAM,SACN3D,MAAO,WACPsE,KAAM,UACNrE,MAAmB,QAAd21G,EAAE95E,KAAKo5E,eAAO,IAAAU,EAAAA,EAAI,EACvB9xG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,EAAQk5F,EAASC,GAC1BrK,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,KACnFmzG,QAAS,GAAF50G,OAAK40G,EAAQl1G,MAAK,oCAAAM,OAAmC40G,EAAQpzG,IAAG,SAAAxB,OAAQ40G,EAAQnzG,KACvFkzG,QAAS,GAAF30G,OAAK20G,EAAQj1G,MAAK,oCAAAM,OAAmC20G,EAAQnzG,IAAG,SAAAxB,OAAQ20G,EAAQlzG,MAO7F,CAEA+oG,WAAW7nG,GACT,OAAQA,GACN,IAAK,SACL,IAAK,UACL,IAAK,UACH,OAAO64B,KAAKivE,sBAAsB,CAAE9nG,QACtC,QACE,OAAO,EAEb,CAEA24C,WACE,MAAO,oBAAPt7C,OAA2Bw7B,KAAK/f,OAAM,KAAAzb,OAAIw7B,KAAKm5E,QAAO,KAAA30G,OAAIw7B,KAAKo5E,QACjE,EACD94E,GAvMK44E,GAAW,OACDtnG,EAAAA,EAAAA,OAAmB0uB,GAD7B44E,GAAW,QAEA,oBAuMjB,Y,ycC1MA,MAAMa,WAAwBb,GAQ5B74E,YAAY07B,EAAc1qD,GACxBsyB,MAAMo4B,EAAO1qD,GACb2uB,KAAKm5E,QAAU,CACjB,CAEA3qG,IAAIP,GACF,GAA6B,iBAAlBA,EAAOgS,OAAqB,CACrC,MAAOA,EAAS,EAAGm5F,EAAU,IAAKjN,EAAAA,EAAAA,IAAkCl+F,EAAOgS,QAC3E0jB,MAAMn1B,IAAI,IAAKP,EAAQgS,SAAQm5F,UAASD,QAAS,GACnD,MACEx1E,MAAMn1B,IAAIP,EAEd,CAEAtB,iBAAiB,IAAAsjG,EAAA6J,EACf,MAAM75F,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAEDmzG,EAAU,CACdvxG,KAAM,SACN3D,MAAO,WACPsE,KAAM,UACNrE,MAAmB,QAAd21G,EAAE95E,KAAKo5E,eAAO,IAAAU,EAAAA,EAAI,EACvB9xG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,EAAQm5F,GACjBrK,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,KACnFmzG,QAAS,GAAF50G,OAAK40G,EAAQl1G,MAAK,oCAAAM,OAAmC40G,EAAQpzG,IAAG,SAAAxB,OAAQ40G,EAAQnzG,MAG7F,CAEA+oG,WAAW7nG,GACT,OAAQA,GACN,IAAK,SACL,IAAK,UACH,OAAO64B,KAAKivE,sBAAsB,CAAE9nG,QACtC,QACE,OAAO,EAEb,CAEA24C,WACE,MAAO,oBAAPt7C,OAA2Bw7B,KAAK/f,OAAM,KAAAzb,OAAIw7B,KAAKo5E,QACjD,EACD94E,GAjEKy5E,GAAe,OACLnoG,EAAAA,EAAAA,OAAmB0uB,GAD7By5E,GAAe,QAEJ,oBAiEjB,Y,ycCpEA,MAAMC,WAAwBd,GAAmB74E,cAAA,SAAA1mB,WAAA2mB,GAAA,eAIrC,EAAC,CAEX9xB,IAAIP,GACF,GAA6B,iBAAlBA,EAAOgS,OAAqB,CACrC,MAAOA,EAAS,EAAGm5F,EAAU,IAAKjN,EAAAA,EAAAA,IAAkCl+F,EAAOgS,QAC3E0jB,MAAMn1B,IAAI,IAAKP,EAAQgS,SAAQm5F,UAASD,QAAS,GACnD,MACEx1E,MAAMn1B,IAAIP,EAEd,CAEAtB,iBAAiB,IAAAsjG,EAAA6J,EACf,MAAM75F,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAEDmzG,EAAU,CACdvxG,KAAM,SACN3D,MAAO,WACPsE,KAAM,UACNrE,MAAmB,QAAd21G,EAAE95E,KAAKo5E,eAAO,IAAAU,EAAAA,EAAI,EACvB9xG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,EAAQm5F,GACjBrK,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,KACnFmzG,QAAS,GAAF50G,OAAK40G,EAAQl1G,MAAK,oCAAAM,OAAmC40G,EAAQpzG,IAAG,SAAAxB,OAAQ40G,EAAQnzG,MAG7F,CAEA+oG,WAAW7nG,GACT,OAAQA,GACN,IAAK,SACL,IAAK,UACH,OAAO64B,KAAKivE,sBAAsB,CAAE9nG,QACtC,QACE,OAAO,EAEb,CAEA24C,WACE,MAAO,oBAAPt7C,OAA2Bw7B,KAAK/f,OAAM,KAAAzb,OAAIw7B,KAAKo5E,QACjD,EACD94E,GA1DK05E,GAAe,OACLpoG,EAAAA,EAAAA,OAAmB0uB,GAD7B05E,GAAe,QAEJ,oBA0DjB,Y,ycC5DA,MAAMC,WAAalO,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,GAAA,YAIjB,GAAE,CAGnB9xB,IAAIP,GACF01B,MAAMn1B,IAAIP,GACV+xB,KAAK4uE,eAAe3gG,EACtB,CAEAo+F,UACE,GAAIrsE,KAAKysE,qBAAsB,KAAAyN,EAC7Bl6E,KAAKm6E,KAAO,GACZ,MAAM3G,EAAO,IAAIT,EAAAA,EAAI/yE,KAAK/f,QACpBwzF,EAAO,IAAIV,EAAAA,EAAI/yE,KAAK/f,QACpByzF,EAAO,IAAIX,EAAAA,EAAI/yE,KAAK/f,QAC1B,IAAIq6E,EAAO,EAEX,IAAK,IAAIjkF,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAC1Cm9F,EAAKvyE,IAAIjB,KAAK7Y,KAAK+vB,MAAM7gC,IACzBo9F,EAAKxyE,IAAIuyE,EAAKrvG,OACduvG,EAAKzyE,IAAIwyE,EAAKtvG,OACVm2F,EAAO,IACTt6D,KAAKm6E,KAAK9jG,GAAmB,IAAbq9F,EAAKvvG,MAAem2F,EAAO,KAE7CA,EAAOoZ,EAAKvvG,MAEd67B,KAAK+sE,UAA4B,QAAnBmN,EAAGl6E,KAAKm6E,KAAKnqD,cAAM,IAAAkqD,EAAAA,EAAI,IACvC,CACA,MAAM,IAAEl0G,EAAG,IAAEC,GAAQ+5B,KAAKm6E,KAAKtvG,OAAS,EAAIm1B,KAAKszD,qBAAqBtzD,KAAKm6E,MAAQn6E,KAAK8uE,kBAAkB9uE,KAAKn4B,MAC/Gm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACd,IAAIu9B,EAAAA,EACF,CACEzV,IAAKh8B,KAAKzL,WACV2nC,IAAKl8B,KAAKzL,WAAayL,KAAKyoD,aAC5BxsB,GAAIhyD,KAAKyrC,MAAM1V,KAAK2/B,GAAG,IACvBxD,GAAIlyD,KAAKyrC,MAAM1V,KAAK2/B,GAAG,IACvB+R,YAAa,UACbC,WAAY,GAEd3xC,KAAK3uB,OACLsvB,OAAOuT,GACTA,EAAQ1lC,IAAI,cAAewxB,KAAK4W,yBAAyB9f,kBAAkBy8B,QAAQgJ,OAAO1D,MAC1F3kB,EAAQ2oB,UAAU,GAAK,IACvB3oB,EAAQ4oB,aACRsrB,EAAAA,EAAAA,IAAkB,CAChBjkE,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZmiF,gBAAiBA,CAAChyE,EAAWyuB,KACvB9E,KAAKm6E,KAAK9jG,IAAI69B,EAAQgpB,OAAOp4B,IAAK9E,KAAK2/B,GAAG3/B,KAAKm6E,KAAK9jG,IAAI,IAGhE69B,EAAQipB,SACRjpB,EAAQ2oB,WAAW,IAAM,GAC3B,CAEAlwD,iBAAiB,IAAAsjG,EACf,MAAMhwF,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,EACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,GACT8uF,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,MAGzF,CAEA+oG,WAAW7nG,GACT,MACO,WADCA,GAEG64B,KAAKivE,sBAAsB,CAAE9nG,OAI1C,CAEA24C,WACE,MAAO,QAAPt7C,OAAew7B,KAAK/f,OACtB,EACDqgB,GAhGK25E,GAAI,OACMroG,EAAAA,EAAAA,MAAkB0uB,GAD5B25E,GAAI,QAEO,QAgGjB,Y,ycChGA,MAAMG,WAA2BrO,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,GAAA,WAYhC,IAAEA,GAAA,UACH,IAAEA,GAAA,UACF,GAAE,CAVjBP,0BAAyB97B,GAAkE,IAAjE,OAAEgc,GAA6Dhc,EACvF,MAAOo2G,EAAU,EAAGC,EAAU,EAAGC,EAAU,IAAKpO,EAAAA,EAAAA,IAAkClsF,GAClF,OAAOhW,KAAKhE,IAAIo0G,EAASC,EAASC,EACpC,CASA/rG,IAAIP,GACF,GAA6B,iBAAlBA,EAAOgS,OAAqB,CACrC,MAAOo6F,EAAU,EAAGC,EAAU,EAAGC,EAAU,IAAKpO,EAAAA,EAAAA,IAAkCl+F,EAAOgS,QACzF0jB,MAAMn1B,IAAI,IAAKP,EAAQosG,UAASC,UAASC,WAC3C,MACE52E,MAAMn1B,IAAIP,EAEd,CAEAo+F,UAAU,IAAAmO,EACR,IAAKx6E,KAAKysE,qBAAsB,OAGhC,IAAIgO,EAAQC,EAAQC,EAAQC,EAAQC,EAAQC,EAD5C96E,KAAK+6E,IAAM,GAEX,MAAMzW,EAAK,GACL0W,EAAK,GACX,IAGIC,EAAMC,EAHNC,EAAUV,EAASC,EAAS,EAC5BU,EAAUP,EAASC,EAAS,EAC5BO,EAAUV,EAASC,EAAS,EAEhC,IAAK,IAAIvkG,EAAI,EAAGA,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CAC/C2kG,EAAG3kG,GAAK2pB,KAAK7Y,KAAK+vB,MAAM7gC,GAAKpM,KAAKjE,IAAIg6B,KAAK7Y,KAAKm4D,IAAIjpE,GAAI2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,IAC5EiuF,EAAGjuF,GAAKpM,KAAKhE,IAAI+5B,KAAK7Y,KAAKk4D,KAAKhpE,GAAI2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,IAAMpM,KAAKjE,IAAIg6B,KAAK7Y,KAAKm4D,IAAIjpE,GAAI2pB,KAAK7Y,KAAK+vB,MAAM7gC,EAAI,IAE7G8kG,GAAUH,EAAG3kG,GACb+kG,GAAU9W,EAAGjuF,GACbglG,IACIA,EAASr7E,KAAKq6E,UAChBc,GAAUH,EAAG3kG,EAAI2pB,KAAKq6E,SACtBe,GAAU9W,EAAGjuF,EAAI2pB,KAAKq6E,UAGxBI,GAAUO,EAAG3kG,GACbwkG,GAAUvW,EAAGjuF,GACbskG,IACIA,EAAS36E,KAAKs6E,UAChBG,GAAUO,EAAG3kG,EAAI2pB,KAAKs6E,SACtBO,GAAUvW,EAAGjuF,EAAI2pB,KAAKs6E,UAGxBI,GAAUM,EAAG3kG,GACbykG,GAAUxW,EAAGjuF,GACbukG,IACIA,EAAS56E,KAAKu6E,UAChBG,GAAUM,EAAG3kG,EAAI2pB,KAAKu6E,SACtBO,GAAUxW,EAAGjuF,EAAI2pB,KAAKu6E,UAGxB,IAAIe,EAAQL,EAAOC,EAAO,EACtBE,EAAS,IACXE,EAAOH,EAASC,GAEdP,EAAS,IACXI,EAAOR,EAASI,GAEdC,EAAS,IACXI,EAAOR,EAASI,GAGlB96E,KAAK+6E,IAAI1kG,GAAM,KAAO,EAAIilG,EAAO,EAAIL,EAAOC,GAAS,CACvD,CAEAl7E,KAAK+sE,UAA2B,QAAlByN,EAAGx6E,KAAK+6E,IAAI/qD,cAAM,IAAAwqD,EAAAA,EAAI,KACpC,MAAM,IAAEx0G,EAAG,IAAEC,GAAQ+5B,KAAK8uE,kBAAkB9uE,KAAKn4B,MACjDm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACdlU,KAAKmuE,yBAAyBj6D,EAASlU,KAAK+6E,IAAK,EAAG,GAAI,GAAI,GAC9D,CAEApuG,iBAAiB,IAAAsjG,EAAAsL,EAAAC,EACf,MAAMnB,EAAU,CACdxyG,KAAM,SACN3D,MAAO,WACPsE,KAAM,UACNrE,MAAmB,QAAd8rG,EAAEjwE,KAAKq6E,eAAO,IAAApK,EAAAA,EAAI,EACvBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAEDq0G,EAAU,CACdzyG,KAAM,SACN3D,MAAO,WACPsE,KAAM,UACNrE,MAAmB,QAAdo3G,EAAEv7E,KAAKs6E,eAAO,IAAAiB,EAAAA,EAAI,GACvBvzG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAEDs0G,EAAU,CACd1yG,KAAM,SACN3D,MAAO,WACPsE,KAAM,UACNrE,MAAmB,QAAdq3G,EAAEx7E,KAAKu6E,eAAO,IAAAiB,EAAAA,EAAI,GACvBxzG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACqtG,EAASC,EAASC,GAC3BxL,oBAAqB,CACnBsL,QAAS,GAAF71G,OAAK61G,EAAQn2G,MAAK,oCAAAM,OAAmC61G,EAAQr0G,IAAG,SAAAxB,OAAQ61G,EAAQp0G,KACvFq0G,QAAS,GAAF91G,OAAK81G,EAAQp2G,MAAK,oCAAAM,OAAmC81G,EAAQt0G,IAAG,SAAAxB,OAAQ81G,EAAQr0G,KACvFs0G,QAAS,GAAF/1G,OAAK+1G,EAAQr2G,MAAK,oCAAAM,OAAmC+1G,EAAQv0G,IAAG,SAAAxB,OAAQ+1G,EAAQt0G,MAG7F,CAEA+oG,WAAW7nG,GACT,OAAQA,GACN,IAAK,UACL,IAAK,UACL,IAAK,UACH,OAAO64B,KAAKivE,sBAAsB,CAAE9nG,QACtC,QACE,OAAO,EAEb,CAEA24C,WACE,MAAO,OAAPt7C,OAAcw7B,KAAKq6E,QAAO,KAAA71G,OAAIw7B,KAAKs6E,QAAO,KAAA91G,OAAIw7B,KAAKu6E,QACrD,EACDj6E,GA9IK85E,GAAkB,OACRxoG,EAAAA,EAAAA,KAAiB0uB,GAD3B85E,GAAkB,QAEP,uBA8IjB,Y,ycCtJA,MAAMqB,WAAe1P,EAInBM,UAAU,IAAAqP,EACR,MAAM,IAAE11G,EAAG,IAAEC,GACX+5B,KAAK7Y,KAAK2qD,OAAOjnE,OAAS,EAAIm1B,KAAKszD,qBAAqBtzD,KAAK7Y,KAAK2qD,QAAU9xC,KAAK8uE,kBAAkB9uE,KAAKn4B,MAC1Gm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,EACX+5B,KAAK+sE,UAAmC,QAA1B2O,EAAG17E,KAAK7Y,KAAK2qD,OAAO9hB,cAAM,IAAA0rD,EAAAA,EAAI,IAC9C,CAEApP,gBAAgBp4D,GACd,MAAM,cAAE5uB,GAAkB0a,KAAK4W,0BACzB,OAAE2lB,GAAWj3C,EAAciuC,QAC3BtmC,EAAa+S,KAAK3uB,MAAM2V,SACxB,WAAEmc,GAAelW,GACjB,aAAE4hE,EAAY,eAAEC,IAAmBC,EAAAA,EAAAA,IAA6B,CACpE5rD,aACApxB,YAAakb,EAAW0G,iBAEpBu0D,EAAwB2G,EAAgC,EAAjBC,EACvC9G,IAAiB/9E,KAAKhE,IAAI,EAAGiiF,EAAwB,IAE3DE,EAAAA,EAAAA,IAAkB,CAChBjkE,MAAO6b,KAAK7Y,KACZ0e,MAAO7F,KAAK3uB,MAAMw0B,MAClBtR,WAAYyL,KAAKzL,WACjBruB,MAAO85B,KAAK95B,MACZmiF,gBAAiBA,CAAChyE,EAAGyuB,KACnBoP,EAAQktB,UAAYphC,KAAK7Y,KAAK+vB,MAAM7gC,GAAK2pB,KAAK7Y,KAAKG,KAAKjR,GAAKkmD,EAAO+rB,gBAAkB/rB,EAAOgsB,cAC7F,MAAMxjD,EAAI96B,KAAKyrC,MAAM1V,KAAK2/B,GAAG3/B,KAAK7Y,KAAK2qD,OAAOz7D,KAC9C69B,EAAQ0+B,SAAS9tC,EAAIkjD,EAAcjjD,EAAGmjD,EAAuBh0C,EAAQlJ,OAAOrZ,OAASoT,EAAE,GAG7F,CAEA6nE,WAAWzoG,GACT,OAAOopB,EAAAA,GAAAA,gBAAqBppB,EAAO,EACrC,CAEAwI,iBACE,MAAO,CACL0C,MAAO2wB,KAAK97B,MACZ8I,OAAQ,GACR+hG,oBAAqB,CAAC,EAE1B,CAEAjvD,WACE,MAAO,QACT,EACDxf,GApDKm7E,GAAM,OACI7pG,EAAAA,EAAAA,KAAiB0uB,GAD3Bm7E,GAAM,QAEK,UAoDjB,Y,ycCrDA,MAAME,WAAkB5P,EAAiB1rE,cAAA,SAAA1mB,WAAA2mB,GAAA,SAKzB,GAAE,CAEhB9xB,IAAIP,GACF01B,MAAMn1B,IAAIP,GACV+xB,KAAK4uE,eAAe3gG,EACtB,CAEAo+F,UACE,GAAIrsE,KAAKysE,qBAAsB,KAAAmP,EAC7B57E,KAAKroB,EAAI,GACT,IAAK,IAAItB,EAAI2pB,KAAK/f,OAAQ5J,EAAI2pB,KAAK7Y,KAAK+vB,MAAMrsC,OAAQwL,IAAK,CACzD,IAAIsjG,EAAc35E,KAAK7Y,KAAKk4D,KAAKhpE,GAC7BujG,EAAY55E,KAAK7Y,KAAKm4D,IAAIjpE,GAC9B,IAAK,IAAIkwF,EAAIlwF,EAAI2pB,KAAK/f,OAAS,EAAGsmF,GAAKlwF,EAAGkwF,IACpCvmE,KAAK7Y,KAAKk4D,KAAKknB,GAAKoT,IACtBA,EAAc35E,KAAK7Y,KAAKk4D,KAAKknB,IAE3BvmE,KAAK7Y,KAAKm4D,IAAIinB,GAAKqT,IACrBA,EAAY55E,KAAK7Y,KAAKm4D,IAAIinB,IAI9BvmE,KAAKroB,EAAEtB,GAAK,EACRsjG,EAAcC,EAAY,IAC5B55E,KAAKroB,EAAEtB,IAAOsjG,EAAc35E,KAAK7Y,KAAK+vB,MAAM7gC,KAAOsjG,EAAcC,IAAe,IAEpF,CAEA55E,KAAK+sE,UAAyB,QAAhB6O,EAAG57E,KAAKroB,EAAEq4C,cAAM,IAAA4rD,EAAAA,EAAI,IACpC,CACA,MAAM,IAAE51G,EAAG,IAAEC,GAAQ+5B,KAAKroB,EAAE9M,OAAS,EAAIm1B,KAAKszD,qBAAqBtzD,KAAKroB,GAAKqoB,KAAK8uE,kBAAkB9uE,KAAKn4B,MACzGm4B,KAAKh6B,IAAMA,EACXg6B,KAAK/5B,IAAMA,CACb,CAEAqmG,gBAAgBp4D,GACdlU,KAAKmuE,yBAAyBj6D,EAASlU,KAAKroB,EAAGqoB,KAAK/f,QAAS,IAAK,IAAK,GACzE,CAEAtT,iBAAiB,IAAAsjG,EACf,MAAMhwF,EAAS,CACbpY,KAAM,SACN3D,MAAO,SACPsE,KAAM,SACNrE,MAAkB,QAAb8rG,EAAEjwE,KAAK/f,cAAM,IAAAgwF,EAAAA,EAAI,GACtBjoG,UAAU,EACVhC,IAAK,EACLC,IAAK,QAGP,MAAO,CACLoJ,MAAO2wB,KAAK97B,MACZ8I,OAAQ,CAACiT,GACT8uF,oBAAqB,CACnB9uF,OAAQ,GAAFzb,OAAKyb,EAAO/b,MAAK,oCAAAM,OAAmCyb,EAAOja,IAAG,SAAAxB,OAAQyb,EAAOha,MAGzF,CAEA+oG,WAAW7nG,GACT,MACO,WADCA,GAEG64B,KAAKivE,sBAAsB,CAAE9nG,OAI1C,CAEA24C,WACE,MAAO,OAAPt7C,OAAcw7B,KAAK/f,OACrB,EACDqgB,GA5EKq7E,GAAS,OACC/pG,EAAAA,EAAAA,IAAgB0uB,GAD1Bq7E,GAAS,QAEE,eA4EjB,YCzDalW,GAAmB96F,OAAO6xC,OAAO,CAC5C,CAAC5qC,EAAAA,EAAAA,WAA0BqmD,EAC3B,CAACrmD,EAAAA,EAAAA,MAAqBiqG,GACtB,CAACjqG,EAAAA,EAAAA,KAAoB09F,EACrB,CAAC19F,EAAAA,EAAAA,KAAoBkqG,EACrB,CAAClqG,EAAAA,EAAAA,QAAuBmqG,EACxB,CAACnqG,EAAAA,EAAAA,KAAoB+9F,EACrB,CAAC/9F,EAAAA,EAAAA,KAAoB6/F,EACrB,CAAC7/F,EAAAA,EAAAA,KAAoBsgG,EACrB,CAACtgG,EAAAA,EAAAA,IAAmBihG,EACpB,CAACjhG,EAAAA,EAAAA,MAAqByhG,EACtB,CAACzhG,EAAAA,EAAAA,KAAoBuiG,GACrB,CAACviG,EAAAA,EAAAA,KAAoB+iG,GACrB,CAAC/iG,EAAAA,EAAAA,MAAqBojF,GACtB,CAACpjF,EAAAA,EAAAA,KAAoBwlG,GACrB,CAACxlG,EAAAA,EAAAA,KAAoBkmG,GACrB,CAAClmG,EAAAA,EAAAA,KAAoBqmG,GACrB,CAACrmG,EAAAA,EAAAA,MAAqB4mG,GACtB,CAAC5mG,EAAAA,EAAAA,KAAoBoqG,GACrB,CAACpqG,EAAAA,EAAAA,OAAsBqqG,GACvB,CAACrqG,EAAAA,EAAAA,OAAsBsqG,GACvB,CAACtqG,EAAAA,EAAAA,OAAsBuqG,GACvB,CAACvqG,EAAAA,EAAAA,MAAqBuoG,GACtB,CAACvoG,EAAAA,EAAAA,KAAoBmpG,GACrB,CAACnpG,EAAAA,EAAAA,KAAoBwqG,GACrB,CAACxqG,EAAAA,EAAAA,IAAmByqG,KAGiB1xG,OAAO6xC,OAAO,CAAC5qC,EAAAA,EAAAA,IAAmBA,EAAAA,EAAAA,K,8ECrDzEud,MAAMgvC,UAAUnO,KAAO,WACrB,OAAOhwB,KAAKA,KAAKn1B,OAAS,EAC5B,EAGA6X,OAAOy7C,UAAU+d,QAAU,SAAUogC,GACnC,OAAO55F,OAAO45F,EAAet8E,MAAMl2B,OAAOwyG,EAAazxG,OACzD,EAGA6X,OAAOy7C,UAAU95B,WAAa,SAAU6iE,GACtC,OAA6B,IAAtBlnE,KAAKstC,QAAQ45B,EACtB,EAOA,MAAMqV,EAAsC,GAmCrC,SAAS7rE,EAAoB1F,GAClC,IAAKA,EACH,OAAO,KAGT,MAAMkJ,EAAUlJ,EAAOwxE,WAAW,MACpB,IAAA3lG,EAAd,IAAKq9B,EAEH,OADa,QAAbr9B,EAAA7D,OAAO8D,cAAM,IAAAD,GAAbA,EAAeg2D,eAAe,uBACvB,KAGT34B,EAAQuoE,OAAS,CAAC,EAElB,MAAMC,EAAWC,yBAAyBx+C,UAAUxzB,QAapD,OAZAuJ,EAAQvJ,QAAU,WAEhB,OADA3K,KAAKy8E,OAAS,CAAC,EACRC,EAAShR,MAAM1rE,KACxB,EAEAkU,EAAQ1lC,IAAM,SAAUrH,EAAKhD,GACvB67B,KAAKy8E,OAAOt1G,KAAShD,IACvB67B,KAAK74B,GAAOhD,EACZ67B,KAAKy8E,OAAOt1G,GAAOhD,EAEvB,EAEO+vC,CACT,CA7DApU,IAAAA,WAAAA,UAAAA,KAAkC,SAAUz6B,EAAIm5B,GAE9C,MAAMo+E,EAAO58E,KACP68E,EAAK,SAACC,GACV,GAAIA,EAAOF,EAAKG,QAA+BH,EAAKE,OAAO1jG,GAAI,SAAAg7E,EAAAz6E,UAAA9O,OAD7B+jB,EAAI,IAAAO,MAAAilE,EAAA,EAAAA,EAAA,KAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAJ1lE,EAAI0lE,EAAA,GAAA36E,UAAA26E,GAEpC,OAAO91D,EAASs+E,KAAWluF,EAC7B,CACF,EAGA,OAFA2tF,EAAe/pG,KAAK,CAAEwqG,MAAOH,EAAII,OAAQz+E,IACzCwB,KAAK3uB,MAAMiyB,KAAKj+B,EAAIw3G,GACb78E,IACT,EAEAF,IAAAA,WAAAA,UAAAA,OAAoC,SAAUz6B,EAAIm5B,GAChD,IAAIq+E,EACJ,IAAK,MAAMzxG,KAAQmxG,EACjB,GAAInxG,EAAK6xG,SAAWz+E,EAAU,CAC5Bq+E,EAAKzxG,EAAK4xG,MACV,KACF,CAEF,OAAOh9E,KAAK3uB,MAAMkyB,OAAOl+B,EAAIw3G,EAC/B,EAEA/8E,IAAAA,MAAAA,UAAwB,SAAUpzB,GAChC,MAAMkpG,EAAW51E,KAAK/Q,MACtB,IAAK,IAAI/W,EAAQ,EAAGA,EAAQ09F,EAAS/qG,OAAQqN,IAAS,CACpD,MAAMipB,EAAKy0E,EAAS19F,GACpB,GAAIxL,EAAQkoB,IAAIuM,GACd,OAAOjpB,CAEX,CACF,C,qHCzCA,MAGMglG,EAAsBA,CAC1BC,EACA9rG,KAEA,GAA2B,mBAAhB8rG,EAA4B,CACrC,MAAMh5G,EAAQg5G,EAAYt7F,KAAKxQ,GAE/B,GAAIlN,IAVkBA,IACxB,CAAC27B,IAAAA,MAAaA,IAAAA,OAAcA,IAAAA,YAAkB30B,MAAMiyG,GAAgBj5G,aAAiBi5G,IASrEC,CAAiBl5G,GAC7B,MAAMuS,MAAM,gEAGd,MAA0B,mBAAfvS,aAAK,EAALA,EAAO8qB,KACT9qB,EAAM8qB,MAGR9qB,CACT,CAEA,GAA2B,iBAAhBg5G,EAA0B,CACnC,MAAMG,IAAgBH,GAAe,aAAcA,EACnD,OAAOtwG,KAAKE,UAAUuwG,EAAcH,EAAY13F,WAAa03F,GAAaI,EAAAA,EAAAA,KAC5E,CAEA,OAAOJ,CAAW,EAGdK,EAAkBA,CAA4BnsG,EAAqB9I,IACvEA,aAAK,EAALA,EAAO4D,QACL,CAACC,EAAK6sE,KAAY,IACb7sE,EACH,CAAC6sE,GAAUikC,EAAoB7rG,aAAK,EAALA,EAAQ4nE,GAAU5nE,MAEnD,CAAC,GAGCosG,EAA0BA,CAC9BC,EACAC,IAEID,aAAwB59E,IAAAA,MACnB49E,EAAa9oF,IAAI+oF,GAGnBD,IAAiBC,EAGpBC,EAAuBjzG,OAAOsD,OAAO4vG,EAAAA,IAEpC,SAAS/kG,EACdzH,GAEA,IADAqN,EAAoC/E,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,CAAC,EAExC,MAAM,gBAAEZ,EAAkB,GAAE,eAAEoU,EAAiBywF,GAAyBl/F,EAClEo/F,EAAqBjxG,KAAKE,UAAU2R,IACpC,YAAE6hB,IAAgBw9E,EAAAA,EAAAA,KAClBC,EAAuB35G,EAAAA,OAAam5G,EAAgBnsG,EAAO0H,IAqCjE,OAnCA1U,EAAAA,WAAgB,KACd,MAAM45G,EAAoBA,KACNllG,EAAgB5N,MAAM8tE,IAAY,IAAAilC,EAClD,MAAMR,EAAeR,EAAoB7rG,aAAK,EAALA,EAAQ4nE,GAAU5nE,GACrDssG,EAA4C,QAA/BO,EAAGF,EAAqBnyG,eAAO,IAAAqyG,OAAA,EAA5BA,EAA+BjlC,GAErD,OAAI9pD,MAAMgvF,QAAQT,IAEbvuF,MAAMgvF,QAAQR,IACfD,EAAa7yG,SAAW8yG,EAAc9yG,QACtC6yG,EAAavyG,MAAK,CAAC2xG,EAAQ5kG,KAAWulG,EAAwBX,EAAQa,EAAczlG,OAIhFulG,EAAwBC,EAAcC,EAAc,MAI5DK,EAAqBnyG,QAAU2xG,EAAgBnsG,EAAO0H,GACtDwnB,IACF,EAGI69E,EAAcjxF,EAAexX,KAAK,KAMxC,OAJAtE,SAAAA,EAAOiyB,KAAK86E,EAAaH,GAEzB19E,IAEO,KACLlvB,SAAAA,EAAOkyB,OAAO66E,EAAaH,EAAkB,CAC9C,GAEA,CAAC5sG,aAAK,EAALA,EAAO+T,IAAK04F,EAAoBv9E,IAE7BlvB,CACT,C,oLC9EA,MAAMqjC,UAAc5U,IAAAA,MAClBC,iBAAiB3tB,EAAwBgb,EAA0B5Z,GACjEwsB,KAAKC,UACH,QACA,QACA,SACA,YACA,YACA,QACA,aACA,SACA,aACA,KACA,KACA,aACA,cACA,UACA,uBACA,aACA,gBACA,YACA,cACA,kBAEFD,KAAKq+E,QAAQ,QAASjsG,GACtB4tB,KAAK4rE,UAAU,QAASx+E,GACxB4S,KAAK4rE,UAAU,eAAgBp4F,EACjC,CA2BAwhB,eACE,OAAOgL,KAAKxZ,QACTyI,MACA1nB,MAAM0T,GACLA,EACG5G,WACA4a,MACA9jB,MAAMg2B,GAAOA,EAAGtvB,aAEzB,CAEAysG,kBACE,IAAK,MAAMrjG,KAAQ+kB,KAAKxZ,QAAQyI,MAC9B,IAAK,MAAMkS,KAAMlmB,EAAK5G,WAAW4a,MAC/B,GAAIkS,EAAGtvB,UACL,OAAOsvB,CAIf,CAEAo9E,eAAe,IAAAC,EACb,OAA6B,QAA7BA,EAAOx+E,KAAKs+E,yBAAiB,IAAAE,OAAA,EAAtBA,EAAwB9sG,SAAS7J,IAC1C,CAEAm6B,qBACE,IAAIy8E,EAAwC,KACZ,iBAArBz+E,KAAK9Z,YACdu4F,EAAyBz+E,KAAK9Z,aACA,IAArB8Z,KAAK9Z,cACdu4F,EAAyB7kB,EAAAA,GAAAA,SAG3B,MAAMv5E,EAAU2f,KAAKhgB,aAAeM,EAAAA,GAAAA,MAC9B2I,EAAYjW,OAAOC,eAAesR,eACxC,IAAIm6F,EAAwB9kB,EAAAA,GAAAA,MAO5B,OANK3wE,EAEM5I,IAAYue,EAAAA,GAAAA,gCACrB8/E,EAAwB9kB,EAAAA,GAAAA,oBAFxB8kB,EAAwB9kB,EAAAA,GAAAA,KAKnB6kB,GAA0Bx0G,KAAKhE,IAAIw4G,EAAwBC,EACpE,CAEAj5F,WACE,MAAMe,EAAQwZ,KAAKxZ,QAChByI,MACAvnB,KAAKuT,GAASA,EAAKwK,aACtB,MAAO,CACLvf,MAAO85B,KAAK95B,MACZ+f,UAAW+Z,KAAK/Z,UAChB0L,OAAQqO,KAAKrO,OACbtM,UAAW2a,KAAK3a,UAChBwgB,MAAO7F,KAAK6F,MACZtR,WAAYyL,KAAKzL,WACjBliB,OAAQ2tB,KAAK3tB,OACb2N,WAAYggB,KAAKhgB,WACjBmjB,WAAYnD,KAAKmD,WACjBjd,YAAa8Z,KAAK9Z,YAClB4yB,QAAS9Y,KAAK8Y,QACd9yB,QAASga,KAAK5a,IACdoB,QACA8lC,qBAAsBtsB,KAAKssB,qBAC3B73B,WAAYuL,KAAKvL,WACjBiB,UAAWsK,KAAKtK,UAChBC,YAAaqK,KAAKrK,YAClBF,eAAgBuK,KAAKvK,eAEzB,CAEAvO,WAAoC,IAA3By3F,EAAQhlG,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,GAClB,MAAM6M,EAAQwZ,KAAKxZ,QAChByI,MACAvnB,KAAKuT,GAASA,EAAKiM,SAASy3F,KAC/B,OAAO53F,IACL,CACE7gB,MAAO85B,KAAK95B,MACZyrB,OAAQqO,KAAKrO,OACbtM,UAAW2a,KAAK3a,UAChBwgB,MAAO7F,KAAK6F,MACZtR,WAAYyL,KAAKzL,WACjBliB,OAAQ2tB,KAAK3tB,OACb2N,WAAYggB,KAAKhgB,WACjBmjB,WAAYnD,KAAKmD,WACjBjd,YAAa8Z,KAAK9Z,YAClB4yB,QAAS9Y,KAAK8Y,QACd9yB,QAASga,KAAK5a,IACdoB,QACA8lC,qBAAsBtsB,KAAKssB,qBAC3B73B,WAAYuL,KAAKvL,WACjBiB,UAAWsK,KAAKtK,UAChBC,YAAaqK,KAAKrK,YAClBF,eAAgBuK,KAAKvK,gBAEvBkpF,EAEJ,CAEA7jG,eAAe4D,GAMb,OALAshB,KAAKxZ,QACFyI,MACA9c,SAAS8I,IACRA,EAAKH,gBAAgB,IAElBklB,KAAKzJ,QAAQ7X,EACtB,CAEAk4B,yBACE,OAAOA,EAAAA,EAAAA,wBAAuB5W,KAAKrM,eACrC,CAEA4W,gBAAgB,IAAAq0E,EACd,OAAsC,KAAnB,QAAZA,EAAA5+E,KAAK7b,eAAO,IAAAy6F,OAAA,EAAZA,EAAc1nE,MAAMrsC,OAC7B,CAEAg0G,kBACE,OAAO7+E,KAAKrM,eAAeqQ,UAC7B,CAEA9xB,cACE,OAAO8tB,KAAKxZ,QAAQyI,KACtB,CAEA6qB,mBAAmB,IAAAglE,EACjB,MAAM3mD,EAAUxtD,OAAOC,KAAsB,QAAlBk0G,EAAC9+E,KAAK7b,QAAQi0C,YAAI,IAAA0mD,EAAAA,EAAI,CAAC,GAClD,OAAO9+E,KAAK9tB,cAAc4H,QAAQmB,IAChC,MAAMzJ,EAAcyJ,EAAKzJ,cACzB,OAAIA,aAAW,EAAXA,EAAaE,SAAS7J,QAAS+J,EAAAA,EAAAA,KAE1BumD,EAAQrsD,SAAU0F,EAAYE,SAA4BqqD,MAAM1D,KAE9D,GAEf,CAEA3kD,iBACE,OAAOssB,KAAK9tB,cAAcy7C,SAAS1yC,GAASA,EAAKvH,kBACnD,CAEAghB,eACE,MAAMqqF,EAAa/+E,KAAKtsB,iBACrBoG,QAAO7V,IAAA,IAAC,SAAEyN,GAAUzN,EAAA,OAAKyN,EAAS7J,OAAS+J,EAAAA,EAAAA,IAAkB,IAC7D+7C,SAAQt1C,IAAA,IAAC,SAAE3G,GAAU2G,EAAA,OAAK1N,OAAOsD,OAAQyD,EAAyC+U,OAAO,IAE5F,IAAIu4F,EAA4B,GAChC,GAAIh/E,KAAKrM,eAAevW,6BAA+BC,EAAAA,GAAAA,UAAsC,KAAA4hG,EAC3F,MAAMvoB,EAAkC,QAAzBuoB,EAAGj/E,KAAKs+E,yBAAiB,IAAAW,OAAA,EAAtBA,EAAwBvtG,SACtCglF,IACFsoB,EAAmB96F,EAAAA,EAAAA,QAChB4C,GAAa4vE,EAAU36B,MAAM/pD,QAAQlG,SAASgb,EAAEzU,SAAW,CAAC63C,EAAAA,GAAAA,EAAaA,EAAAA,GAAAA,GAAap+C,SAASgb,EAAEzB,aAGxG,CAEA,MAAO,IAAI05F,KAAeC,EAAkBh/E,KAAK7b,SAASrK,QACxD,CAACqK,EAAOjM,EAAOuO,IAAWtC,GAASsC,EAAO7J,WAAWkK,IAAMA,aAAC,EAADA,EAAG1N,MAAO+K,EAAM/K,OAAQlB,GAEvF,CAEAujC,kBAAkBD,GAAsC,IAAA0jE,EAAAC,EACtD,MAAM/sG,EAAY4tB,KAAKxZ,QAAQjL,OAAaigC,GAErB,QAAvB0jE,EAAA1jE,EAAennC,gBAAQ,IAAA6qG,GAAvBA,EAAyB/sG,SAAQ0K,IAAuC,IAAtC,OAAErI,EAAM,UAAED,KAAc7H,GAASmQ,EACjE,MAAMnL,GAAW2J,EAAAA,EAAAA,GAAuB3O,EAAQ7E,MAAMyT,WAAW5O,EAAS0F,GAC1EA,EAAUiC,WAAWkH,OAAO,CAAE7J,WAAU8C,SAAQD,cAChDnC,EAAU4U,QAAQjZ,QAAQ2R,EAAAA,GAAAA,iBAAmC,IAG/D,MAAM0/F,EAAmBhtG,EAAUkiB,6BAKnC,OAJ2B,QAAvB6qF,EAAA/sG,EAAUZ,qBAAa,IAAA2tG,OAAA,EAAvBA,EAAyB5qG,cAAc6qG,aAAgB,EAAhBA,EAAkB7qG,YAC3DnC,EAAUgI,iBAAiB,CAAE5I,YAAa4tG,IAGrChtG,CACT,CAEAw3C,wBAA2DzlD,GACzD,MAAMk7G,EAAc10G,OAAOm0C,QAAQwgE,EAAAA,IAChCxlG,QAAOpH,IAAA,IAAEvL,GAAIuL,EAAA,OAAKstB,KAAK22B,qBAAqBxvD,EAAoC,IAChFwmD,SAAQp6C,IAAA,IAAEkL,EAAG8gG,GAAUhsG,EAAA,OAAKgsG,CAAS,IACxCv/E,KAAK5lB,iBAAiBjW,GAElBk7G,EAAYx0G,OAAS,GACvBm1B,KAAKrM,eACFzG,eACA/a,SAAS8a,IACR,GAAI+S,KAAKpL,IAAI3H,GACX,OAEF,MAAM0hF,EAAuB,CAAC,EAC9B0Q,EAAYltG,SAASotG,IACfp7G,EAAMq7G,eAAeD,KACvB5Q,EAAS4Q,GAAap7G,EAAMo7G,GAC9B,IAEFtyF,EAAW7S,iBAAiBu0F,EAAS,GAG7C,CAEA/3C,kBAAkB6oD,EAAqDC,GACrE1/E,KAAKrM,eAAeijC,kBAAkB6oD,EAAYC,EACpD,CAEA/oD,qBAAqBgpD,GACnB,OAAO3/E,KAAKrM,eAAegjC,qBAAqBgpD,EAClD,CAEA9pF,iBACE,OAAOmK,KAAKtsB,iBAAiBvI,MAAMuB,IACK,IAAAkzG,EAAA7rG,EAAtC,MAAI,eAAgBrH,EAAQgF,WACuB,QAAjDkuG,GAAO7rG,EAACrH,EAAQgF,UAAuBu9E,kBAAU,IAAA2wB,OAAA,EAA1CA,EAAA/9F,KAAA9N,EAA6C,YAG1C,GAEhB,CAEAzB,oBAAmC,IAAAutG,EAAAC,EACjC,OAAmC,QAAnCD,EAAmB,QAAnBC,EAAO9/E,KAAK7b,eAAO,IAAA27F,OAAA,EAAZA,EAAc5wF,sBAAc,IAAA2wF,EAAAA,EAAI,IACzC,CAEAxqF,eAAeC,GAA2E,IAArByqF,EAAWpmG,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,IAAAA,UAAA,GAC9E,MAAMob,EAAYiL,KAAKhL,eACvB,IAAKD,EACH,OAEF,MAAMirF,EAAiBjrF,EAAUO,cAAcrG,MAC3C8wF,GACFC,EAAe7tG,SAASgtB,GAAeA,EAAWrkB,mBAGpD,MAAMob,EAAS6pF,EACXzqF,EACAA,aAAW,EAAXA,EAAaxb,QAAQqlB,IAAgB6gF,EAAe70G,MAAKiJ,IAAA,IAAC,UAAEG,GAAWH,EAAA,OAAK+qB,EAAW5qB,YAAcA,CAAS,MAElH2hB,SAAAA,EAAQ/jB,SAAQmC,IAA6C,IAA5C,UAAEC,EAAS,UAAEuK,EAAS,cAAE6b,GAAermB,EAChCygB,EAAUO,cAAc/Z,OAA0B,CACtE7J,UAAU2J,EAAAA,EAAAA,GAAuByD,GAAWxD,WAAW,CAAEgwD,mBAAoB,CAAExmC,EAAGnK,IAAmB5F,GACrGxgB,cAEY7C,SAAS0J,cAAc,IAGvC2Z,EAAUQ,2BACZ,EAGF,S,kEC3UO,IAAKkmE,EAAiB,SAAjBA,GAAiB,OAAjBA,EAAiB,sBAAjBA,EAAiB,gBAAjBA,EAAiB,sBAAjBA,CAAiB,MAMtB,MAAM6jB,EAA0B,CACrC,CAAC7jB,EAAkBwkB,QAAS,CAAC,UAC7B,CAACxkB,EAAkBykB,WAAY,CAAC,YAAa,cAGlCzpD,EAAqB,CAChC,CAAEtyD,MAAOs3F,EAAkBwkB,OAAQ/7G,MAAO,UAC1C,CAAEC,MAAOs3F,EAAkBykB,UAAWh8G,MAAO,aAC7C,CAAEC,MAAOs3F,EAAkB0kB,UAAWj8G,MAAO,a,iICJ/C,MAAMywD,UAAoB70B,IAAAA,MACxBC,iBAAiB9S,EAA0BmzF,GACzCpgF,KAAKC,UACH,cACA,SACA,cACA,aACA,mBACA,QACA,SACA,WACA,kBACA,aACA,oBACA,QACA,UACA,QACA,WACA,qBACA,6BACA,eACA,uBACA,2BACA,uBACA,gCACA,OACA,qBACA,oBACA,iBACA,SACA,QAEFD,KAAKq+E,QAAQ,SAAUpxF,GACvB+S,KAAK4rE,UAAU,wBAAyBwU,EAC1C,CAgCA9vD,uBACE,IAAK,MAAMr1C,KAAQ+kB,KAAK9tB,cACtB,GAAI+I,EAAKC,UACP,OAAOD,CAGb,CAEAwK,WACE,MAAMK,EAASka,KAAK9S,eAAexlB,KAAKsf,GAAUA,EAAMvB,aACxD,MAAO,CACLD,OAAQwa,KAAKxa,OACbtf,MAAO85B,KAAK95B,MACZyrB,OAAQqO,KAAKrO,OACb7L,SACAwmC,qBAAsBtsB,KAAKssB,qBAC3BpzC,yBAA0B8mB,KAAK9mB,yBAEnC,CAEAgO,WAAyG,IAA9By3F,EAAQhlG,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,GACpF,MAAMmM,EAASka,KAAK9S,eAAexlB,KAAKsf,GAAUA,EAAME,SAASy3F,KACjE,OAAO9xG,KAAKC,MACVD,KAAKE,UACHga,IACE,IACKiZ,KAAKza,SAASD,cAAcM,OAC/BJ,OAAQwa,KAAKxa,OACbtf,MAAO85B,KAAK95B,MACZyrB,OAAQqO,KAAKrO,OACb7L,SACAwmC,qBAAsBtsB,KAAKssB,qBAC3BpzC,yBAA0B8mB,KAAK9mB,yBAC/Bi2E,OAAQnvD,KAAKza,SAASD,cAAciuC,QAAQgJ,OAC5Cn/C,2BAA4B4iB,KAAK5iB,2BACjCkc,QAAS0G,KAAK1G,QACdI,SAAUsG,KAAKtG,SACfsK,WAAYhE,KAAKgE,WACjBzzB,MAAOyvB,KAAKzvB,MACZ8gD,UAAW,aAAa7wC,KAAKxN,OAAOyC,SAASgL,WAE/Ck+F,IAIR,CAEA7jG,eAAe4D,GAIb,OAHAshB,KAAK9S,eAAe/a,SAAS6U,IAC3BA,EAAMlM,gBAAgB,IAEjBklB,KAAKzJ,QAAQ7X,EACtB,CAEAwO,eACE,OAAO8S,KAAKla,SAASmJ,KACvB,CAEA/c,cACE,OAAO8tB,KAAK9S,eAAeygC,SAAS3mC,GAAUA,EAAM9U,eACtD,CAEAwB,iBACE,OAAOssB,KAAK9S,eAAeygC,SAAS3mC,GAAUA,EAAMtT,kBACtD,CAEAkjD,kBAAkB6oD,EAAqDC,GAAmB,IAAAW,EAAAC,EACxF,MAAMC,EAAmBpxF,MAAMgvF,QAAQsB,GAAcA,EAAa,CAACA,GAE7De,EAAuG,QAApFH,EAAsB,QAAtBC,EAAGtgF,KAAK07D,sBAAc,IAAA4kB,OAAA,EAAnBA,EAAqBxmG,QAAQ6lG,IAAeY,EAAiBz0G,SAAS6zG,YAAW,IAAAU,EAAAA,EAAI,GAE7GX,GACFc,EAAoBhuG,QAAQ+tG,GAG9BvgF,KAAK5lB,iBAAiB,CAAEshF,eAAgB8kB,GAC1C,CAEA7pD,qBAAqBgpD,GAA8B,IAAAc,EACjD,QAA4B,QAApBA,EAACzgF,KAAK07D,sBAAc,IAAA+kB,IAAnBA,EAAqB30G,SAAS6zG,GACzC,CAEAz4B,sBAAsBr/E,GAAqB,IAAA64G,EACzC,QACU,QADFA,EAAC1gF,KAAKla,SACXgxB,eAAO,IAAA4pE,IADDA,EAELhtG,iBACDvI,MAAMuB,GAAYA,EAAQiF,eAAkBjF,EAAQgF,SAAkC7J,OAASA,IACpG,CAEAsmC,mBACE,MAAO,gBAAP3pC,OAAuBw7B,KAAK5mB,GAC9B,CAEA2wC,WACE/pB,KAAKjkB,gBAAgB,YAAQnG,GAC7BoqB,KAAK9S,eAAe/a,SAAS6U,IAE3BA,EAAM0N,eAAeviB,SAASgS,IACxBA,EAAMwC,SACRxC,EAAM/J,iBAAiB,CAAEuM,YAAQ/Q,IACjCuO,EAAM0Q,UAAU,CAAEC,UAAW1I,EAAAA,EAAAA,UAC/B,IAGFpF,EAAM5M,iBAAiB,CAAE8L,aAAa,GAAO,GAEjD,CAEAQ,WAAmC,IAAAi6F,EAAAC,EAAA,IAA1BxnG,EAAiBO,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,KAC3B,OAAqB,QAAdgnG,EAAU,QAAVC,EAAC5gF,KAAKhnB,YAAI,IAAA4nG,OAAA,EAATA,EAAWxnG,UAAE,IAAAunG,EAAAA,EAAI,QAAUvnG,CACrC,EAGF,S,+CCjMO,MAAMynG,EAAqB,CAChChqB,EAAG,EACHC,EAAG,GACHE,IAAK,GACLC,KAAM,G,oICoBR,MAAMrxE,EAAS,CACbD,SAAU,EACVE,UAAW,EACXksC,OAAQ,GCHJnsC,EAAS,CACbD,SAAU,EACVE,UAAW,EACXksC,OAAQ,GCJJnsC,EAAS,CACbD,SAAU,EACVE,UAAW,EACXksC,OAAQ,GAGJ+uD,EACD,EADCA,EAED,EAFCA,EAGE,GCTFl7F,EAAS,CACbD,SAAU,EACVE,UAAW,EACXksC,OAAQ,GAGJ+uD,EACD,EADCA,EAED,EAFCA,EAGE,GCvBD,IAAKC,EAAY,SAAZA,GAAY,OAAZA,EAAY,0BAAZA,EAAY,kEAAZA,EAAY,4DAAZA,EAAY,kEAAZA,EAAY,4DAAZA,CAAY,MAQjB,MAAMC,EAAmB/8G,IAAqF,IAApF,YAAEg9G,EAAW,MAAE1wG,GAAqDtM,EACnG,OAAQg9G,GACN,KAAKF,EAAaG,gCAChB,MDeyD3wG,KAAY,CACzE+U,cAAe,CACbiuC,QAAS,CACPgJ,OAAQ,IACH4kD,EAAAA,GACH,CAACr1D,EAAAA,GAAAA,OAAcq1D,EAAAA,GACf,CAACr1D,EAAAA,GAAAA,MAAas1D,EAAAA,IAEhB5tD,eAAgB4jC,EAAAA,GAChBiqB,4BAA6BhqB,EAAAA,IAE/BzxE,OAAM,EACN8L,IAAK,CACHC,OAAQ,GACRysD,SAAUpQ,EAAAA,GAAAA,IACV37D,OAAQ,CACN4rE,OAAQ,CAAE7/C,MAAO,GAAI1M,IAAK,GAC1ByvC,KAAM,CACJr7D,KAAMg7G,EACNh6G,MAAO,SAGXgyD,KAAM,CACJmlB,OAAQ,CACNvsD,IAAK,EACL0M,KAAM,GACNiN,MAAO,IAET81B,KAAM,CACJr7D,KAAMg7G,EACNx/C,UAAW2M,EAAAA,GAAAA,KACXmQ,SAAUpQ,EAAAA,GAAAA,KAEZnmE,KAAMqkF,EAAAA,EAAAA,UAERhC,OAAQ,CACNjM,OAAQ,CACNvsD,IAAK,EACL2Z,MAAO,IAET81B,KAAM,CACJr7D,KAAMg7G,EACNh6G,MAAO,UAIbukC,MAAO,CACLnlC,MAAO,GACPm8E,KAAM,CACJpE,OAAQ,CACN7/C,MAAO,GAET+iC,KAAM,CACJr7D,KAAMg7G,EACNz/C,WAAYy/C,EACZt/C,QAAS,CACP9vC,IAAK8wC,EAAAA,GAAAA,KACLpzB,OAAQozB,EAAAA,GAAAA,GACRpkC,KAAMokC,EAAAA,GAAAA,IACNn3B,MAAOm3B,EAAAA,GAAAA,QAKfpzB,OAAQ,CACNzd,OAAQ,GACRysD,SAAUpQ,EAAAA,GAAAA,IACVqU,KAAM,CACJpE,OAAQ,CACNvsD,IAAK,GAEPyvC,KAAM,CACJr7D,KAAMg7G,KAIZ1iF,KAAM,CACJl4B,MAAO,GACPk6E,aAAc,CACZE,aAAc,GACdrC,OAAQ,CACNvsD,KAAM,EACN0M,KAAM,GAER+iC,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,EACNl3E,OAAQ,SAGZqe,UAAW,CACT44D,OAAQ,CACNvsD,IAAK,EACL0M,KAAM,IAER+iC,KAAM,CACJr7D,KAAMg7G,EACN95G,OAAQ,MACRN,OAAQ,qBAGZghF,WAAY,CACVzJ,OAAQ,CACN7/C,KAAM,IAER+iC,KAAM,CACJr7D,KAAMg7G,MAKdhqF,kBAAmB,CACjBy8B,QAAS,CACP5hC,OAAQ,IACR4qC,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAcw1D,EAAAA,EAAsBC,EAAAA,IAExD37F,OAAM,EACN8L,IAAK,CACHC,OAAQ,GAEV0Z,MAAO,CACLnlC,MAAO,GACPm8E,KAAM,CACJpE,OAAQ,CACN7/C,MAAO,GAET+iC,KAAM,CACJr7D,KAAMg7G,EACNz/C,WAAYy/C,EACZt/C,QAAS,CACP9vC,IAAK8wC,EAAAA,GAAAA,KACLpzB,OAAQozB,EAAAA,GAAAA,GACRpkC,KAAMokC,EAAAA,GAAAA,IACNn3B,MAAOm3B,EAAAA,GAAAA,QAKfpzB,OAAQ,CACNzd,OAAQ,GAEVyM,KAAM,CACJl4B,MAAO,GACP0nG,eAAgB,CACdttB,aAAc,EACdrC,OAAQ,CACNvsD,IAAKysD,EAAAA,GAAAA,IACL//C,KAAM+/C,EAAAA,GAAAA,GAERhd,KAAM,CACJr7D,KAAMg7G,EACNh6G,MAAO,OACPu6D,WAAYy/C,MAKpBnuB,wBAAyB,CACvBp/B,QAAS,CACPgJ,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAcq1D,EAAAA,GAAkBC,EAAAA,IAEpDx7F,OAAQ,CACND,SAAU,EACVE,UAAW,EACXksC,OAAQ,GAEVrgC,IAAK,CACHC,OAAQ,GAEVyd,OAAQ,CACNzd,OAAQ,IAEVyM,KAAM,CACJl4B,MAAO,GAETmlC,MAAO,CACLnlC,MAAO,KAGXytF,eAAgB6tB,EAAAA,GAChBhxD,cAAe,CACb1qD,KAAM,EACN2qD,UAAW,GACX/rD,MAAO,OACP80E,YAAa,EACbC,YAAa,QAEfnd,gBAAiB,CACfC,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAc21D,EAAAA,GAAoBC,EAAAA,GACpDhgD,YAAa,YACbtC,uBAAwB,eC5MfuiD,CAA+CpxG,GACxD,KAAKwwG,EAAaa,6BAChB,MFasDrxG,KAAY,CACtE+U,cAAe,CACbiuC,QAAS,CACPgJ,OAAQ,IACH4kD,EAAAA,GACH,CAACr1D,EAAAA,GAAAA,OAAcq1D,EAAAA,GACf,CAACr1D,EAAAA,GAAAA,MAAas1D,EAAAA,IAEhB5tD,eAAgB4jC,EAAAA,GAChBiqB,4BAA6BhqB,EAAAA,IAE/BzxE,OAAM,EACN8L,IAAK,CACHC,OAAQ,GACRysD,SAAUpQ,EAAAA,GAAAA,IACV37D,OAAQ,CACN4rE,OAAQ,CAAE7/C,MAAO,GAAI1M,IAAK,GAC1ByvC,KAAM,CACJr7D,KAAMg7G,EACNh6G,MAAO,SAGXgyD,KAAM,CACJmlB,OAAQ,CACNvsD,IAAK,EACL0M,KAAM,GACNiN,MAAO,IAET81B,KAAM,CACJr7D,KAAMg7G,EACNx/C,UAAW2M,EAAAA,GAAAA,KACXmQ,SAAUpQ,EAAAA,GAAAA,KAEZnmE,KAAMqkF,EAAAA,EAAAA,UAERhC,OAAQ,CACNjM,OAAQ,CACNvsD,IAAK,EACL2Z,MAAO,IAET81B,KAAM,CACJr7D,KAAMg7G,EACNh6G,MAAO,UAIbukC,MAAO,CACLnlC,MAAO,GACPm8E,KAAM,CACJpE,OAAQ,CACN7/C,MAAO,GAET+iC,KAAM,CACJr7D,KAAMg7G,EACNz/C,WAAYy/C,EACZt/C,QAAS,CACP9vC,IAAK8wC,EAAAA,GAAAA,KACLpzB,OAAQozB,EAAAA,GAAAA,GACRpkC,KAAMokC,EAAAA,GAAAA,IACNn3B,MAAOm3B,EAAAA,GAAAA,QAKfpzB,OAAQ,CACNzd,OAAQ,GACRysD,SAAUpQ,EAAAA,GAAAA,IACVqU,KAAM,CACJpE,OAAQ,CACNvsD,IAAK,GAEPyvC,KAAM,CACJr7D,KAAMg7G,KAIZ1iF,KAAM,CACJl4B,MAAO,GACPk6E,aAAc,CACZE,aAAc,GACdrC,OAAQ,CACNvsD,KAAM,EACN0M,KAAM,GAER+iC,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,EACNl3E,OAAQ,SAGZqe,UAAW,CACT44D,OAAQ,CACNvsD,IAAK,EACL0M,KAAM,IAER+iC,KAAM,CACJr7D,KAAMg7G,EACN95G,OAAQ,MACRN,OAAQ,qBAGZghF,WAAY,CACVzJ,OAAQ,CACN7/C,KAAM,IAER+iC,KAAM,CACJr7D,KAAMg7G,MAKdhqF,kBAAmB,CACjBy8B,QAAS,CACP5hC,OAAQ,IACR4qC,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAcw1D,EAAAA,EAAsBC,EAAAA,IAExD37F,OAAM,EACN8L,IAAK,CACHC,OAAQ,GAEV0Z,MAAO,CACLnlC,MAAO,GACPm8E,KAAM,CACJpE,OAAQ,CACN7/C,MAAO,GAET+iC,KAAM,CACJr7D,KAAMg7G,EACNz/C,WAAYy/C,EACZt/C,QAAS,CACP9vC,IAAK8wC,EAAAA,GAAAA,KACLpzB,OAAQozB,EAAAA,GAAAA,GACRpkC,KAAMokC,EAAAA,GAAAA,IACNn3B,MAAOm3B,EAAAA,GAAAA,QAKfpzB,OAAQ,CACNzd,OAAQ,GAEVyM,KAAM,CACJl4B,MAAO,GACP0nG,eAAgB,CACdttB,aAAc,EACdrC,OAAQ,CACNvsD,IAAKysD,EAAAA,GAAAA,IACL//C,KAAM+/C,EAAAA,GAAAA,GAERhd,KAAM,CACJr7D,KAAMg7G,EACNh6G,MAAO,OACPu6D,WAAYy/C,MAKpBnuB,wBAAyB,CACvBp/B,QAAS,CACPgJ,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAcq1D,EAAAA,GAAkBC,EAAAA,IAEpDx7F,OAAQ,CACND,SAAU,EACVE,UAAW,EACXksC,OAAQ,GAEVrgC,IAAK,CACHC,OAAQ,GAEVyd,OAAQ,CACNzd,OAAQ,IAEVyM,KAAM,CACJl4B,MAAO,GAETmlC,MAAO,CACLnlC,MAAO,KAGXytF,eAAgB6tB,EAAAA,GAChBhxD,cAAe,CACb1qD,KAAM,EACN2qD,UAAW,GACX/rD,MAAO,OACP80E,YAAa,EACbC,YAAa,QAEfnd,gBAAiB,CACfC,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAc21D,EAAAA,GAAoBC,EAAAA,GACpDhgD,YAAa,YACbtC,uBAAwB,eE1MfyiD,CAA4CtxG,GACrD,KAAKwwG,EAAae,gCAChB,MHMyDvxG,KAAY,CACzE+U,cAAe,CACbiuC,QAAS,CACPgJ,OAAQ,IACH4kD,EAAAA,GACH,CAACr1D,EAAAA,GAAAA,OAAcq1D,EAAAA,GACf,CAACr1D,EAAAA,GAAAA,MAAas1D,EAAAA,IAEhB5tD,eAAgB4jC,EAAAA,GAChBiqB,4BAA6BhqB,EAAAA,IAE/BzxE,OAAM,EACN8L,IAAK,CACHC,OAAQ,GACRysD,SAAUpQ,EAAAA,GAAAA,IACV37D,OAAQ,CACN4rE,OAAQ,CAAE7/C,MAAO,GAAI1M,KAAM,GAC3ByvC,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,KACN/5G,MAAO,SAGXgyD,KAAM,CACJmlB,OAAQ,CACNvsD,IAAK,EACL0M,KAAM,GACNiN,MAAO,IAET81B,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,EACNv/C,UAAW2M,EAAAA,GAAAA,KACXmQ,SAAUpQ,EAAAA,GAAAA,KAEZnmE,KAAMqkF,EAAAA,EAAAA,YAERhC,OAAQ,CACNjM,OAAQ,CACNvsD,IAAK,EACL2Z,MAAO,IAET81B,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,EACN/5G,MAAO,UAIbukC,MAAO,CACLnlC,MAAO,GACPm8E,KAAM,CACJpE,OAAQ,CACN7/C,KAAM,GAER+iC,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,EACNx/C,WAAYw/C,EAAAA,EAAAA,EACZr/C,QAAS,CACP9vC,IAAK8wC,EAAAA,GAAAA,KACLpzB,OAAQozB,EAAAA,GAAAA,GACRpkC,KAAMokC,EAAAA,GAAAA,IACNn3B,MAAOm3B,EAAAA,GAAAA,QAKfpzB,OAAQ,CACNzd,OAAQ,GACRysD,SAAUpQ,EAAAA,GAAAA,IACVqU,KAAM,CACJpE,OAAQ,CACNvsD,IAAK,GAEPyvC,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,KAIZziF,KAAM,CACJl4B,MAAO,GACPk6E,aAAc,CACZE,aAAc,GACdrC,OAAQ,CACNvsD,IAAK,EACL0M,KAAM,GAER+iC,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,EACNl3E,OAAQ,SAGZqe,UAAW,CACT44D,OAAQ,CACNvsD,IAAK,EACL0M,KAAM,IAER+iC,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,EACN75G,OAAQ,MACRN,OAAQ,qBAGZghF,WAAY,CACVzJ,OAAQ,CACN7/C,KAAM,IAER+iC,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,MAKd/pF,kBAAmB,CACjBy8B,QAAS,CACP5hC,OAAQ,IACR4qC,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAcw1D,EAAAA,EAAsBC,EAAAA,IAExD37F,OAAM,EACN8L,IAAK,CACHC,OAAQ,IAEV0Z,MAAO,CACLnlC,MAAO,GACPm8E,KAAM,CACJpE,OAAQ,CACN7/C,MAAO,GAET+iC,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,EACNx/C,WAAYw/C,EAAAA,EAAAA,EACZr/C,QAAS,CACP9vC,IAAK8wC,EAAAA,GAAAA,KACLpzB,OAAQozB,EAAAA,GAAAA,GACRpkC,KAAMokC,EAAAA,GAAAA,IACNn3B,MAAOm3B,EAAAA,GAAAA,QAKfpzB,OAAQ,CACNzd,OAAQ,IAEVyM,KAAM,CACJl4B,MAAO,GACP0nG,eAAgB,CACdttB,aAAc,EACdrC,OAAQ,CACNvsD,IAAKysD,EAAAA,GAAAA,EACL//C,KAAM+/C,EAAAA,GAAAA,GAERhd,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,EACN/5G,MAAO,OACPu6D,WAAYw/C,EAAAA,EAAAA,MAKpBluB,wBAAyB,CACvBp/B,QAAS,CACPgJ,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAcq1D,EAAAA,GAAkBC,EAAAA,IAEpDx7F,OAAQ,CACND,SAAU,EACVE,UAAW,EACXksC,OAAQ,GAEVrgC,IAAK,CACHC,OAAQ,GAEVyd,OAAQ,CACNzd,OAAQ,IAEVyM,KAAM,CACJl4B,MAAO,GAETmlC,MAAO,CACLnlC,MAAO,KAGXytF,eAAgB6tB,EAAAA,GAChBhxD,cAAe,CACb1qD,KAAM,EACN2qD,UAAW,GACX/rD,MAAO,OACP80E,YAAa,EACbC,YAAa,QAEfnd,gBAAiB,CACfC,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAc21D,EAAAA,GAAoBC,EAAAA,GACpDhgD,YAAa,YACbtC,uBAAwB,eGnMf2iD,CAA+CxxG,GACxD,KAAKwwG,EAAaiB,6BAChB,MJIsDzxG,KAAY,CACtE+U,cAAe,CACbiuC,QAAS,CACPgJ,OAAQ,IACH4kD,EAAAA,GACH,CAACr1D,EAAAA,GAAAA,OAAcq1D,EAAAA,GACf,CAACr1D,EAAAA,GAAAA,MAAas1D,EAAAA,IAEhB5tD,eAAgB4jC,EAAAA,GAChBiqB,4BAA6BhqB,EAAAA,IAE/BzxE,SACA8L,IAAK,CACHC,OAAQ,GACRysD,SAAUpQ,EAAAA,GAAAA,IACV37D,OAAQ,CACN4rE,OAAQ,CAAE7/C,MAAO,GAAI1M,KAAM,GAC3ByvC,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,KACN/5G,MAAO,SAGXgyD,KAAM,CACJmlB,OAAQ,CACNvsD,IAAK,EACL0M,KAAM,GACNiN,MAAO,IAET81B,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,EACNv/C,UAAW2M,EAAAA,GAAAA,KACXmQ,SAAUpQ,EAAAA,GAAAA,KAEZnmE,KAAMqkF,EAAAA,EAAAA,YAERhC,OAAQ,CACNjM,OAAQ,CACNvsD,IAAK,EACL2Z,MAAO,IAET81B,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,EACN/5G,MAAO,UAIbukC,MAAO,CACLnlC,MAAO,GACPm8E,KAAM,CACJpE,OAAQ,CACN7/C,KAAM,GAER+iC,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,EACNx/C,WAAYw/C,EAAAA,EAAAA,EACZr/C,QAAS,CACP9vC,IAAK8wC,EAAAA,GAAAA,KACLpzB,OAAQozB,EAAAA,GAAAA,GACRpkC,KAAMokC,EAAAA,GAAAA,IACNn3B,MAAOm3B,EAAAA,GAAAA,QAKfpzB,OAAQ,CACNzd,OAAQ,GACRysD,SAAUpQ,EAAAA,GAAAA,IACVqU,KAAM,CACJpE,OAAQ,CACNvsD,IAAK,GAEPyvC,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,KAIZziF,KAAM,CACJl4B,MAAO,GACPk6E,aAAc,CACZE,aAAc,GACdrC,OAAQ,CACNvsD,IAAK,EACL0M,KAAM,GAER+iC,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,EACNl3E,OAAQ,SAGZqe,UAAW,CACT44D,OAAQ,CACNvsD,IAAK,EACL0M,KAAM,IAER+iC,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,EACN75G,OAAQ,MACRN,OAAQ,qBAGZghF,WAAY,CACVzJ,OAAQ,CACN7/C,KAAM,IAER+iC,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,MAKd/pF,kBAAmB,CACjBy8B,QAAS,CACP5hC,OAAQ,IACR4qC,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAcw1D,EAAAA,EAAsBC,EAAAA,IAExD37F,SACA8L,IAAK,CACHC,OAAQ,IAEV0Z,MAAO,CACLnlC,MAAO,GACPm8E,KAAM,CACJpE,OAAQ,CACN7/C,MAAO,GAET+iC,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,EACNx/C,WAAYw/C,EAAAA,EAAAA,EACZr/C,QAAS,CACP9vC,IAAK8wC,EAAAA,GAAAA,KACLpzB,OAAQozB,EAAAA,GAAAA,GACRpkC,KAAMokC,EAAAA,GAAAA,IACNn3B,MAAOm3B,EAAAA,GAAAA,QAKfpzB,OAAQ,CACNzd,OAAQ,IAEVyM,KAAM,CACJl4B,MAAO,GACP0nG,eAAgB,CACdttB,aAAc,EACdrC,OAAQ,CACNvsD,IAAKysD,EAAAA,GAAAA,EACL//C,KAAM+/C,EAAAA,GAAAA,GAERhd,KAAM,CACJr7D,KAAM+6G,EAAAA,EAAAA,EACN/5G,MAAO,OACPu6D,WAAYw/C,EAAAA,EAAAA,MAKpBluB,wBAAyB,CACvBp/B,QAAS,CACPgJ,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAcq1D,EAAAA,GAAkBC,EAAAA,IAEpDx7F,OAAQ,CACND,SAAU,EACVE,UAAW,EACXksC,OAAQ,GAEVrgC,IAAK,CACHC,OAAQ,GAEVyd,OAAQ,CACNzd,OAAQ,IAEVyM,KAAM,CACJl4B,MAAO,GAETmlC,MAAO,CACLnlC,MAAO,KAGXytF,eAAgB6tB,EAAAA,GAChBhxD,cAAe,CACb1qD,KAAM,EACN2qD,UAAW,GACX/rD,MAAO,OACP80E,YAAa,EACbC,YAAa,QAEfnd,gBAAiB,CACfC,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAc21D,EAAAA,GAAoBC,EAAAA,GACpDhgD,YAAa,YACbtC,uBAAwB,eIjMf6iD,CAA4C1xG,GACrD,KAAKwwG,EAAamB,YAClB,QACE,MCPqC3xG,KAAY,CACrD+U,cAAe,CACbiuC,QAAS,CACPgJ,OAAQ,IACFhsD,IAAUu7C,EAAAA,GAAAA,MAAcq1D,EAAAA,GAAkBC,EAAAA,GAC9C,CAACt1D,EAAAA,GAAAA,OAAcq1D,EAAAA,GACf,CAACr1D,EAAAA,GAAAA,MAAas1D,EAAAA,IAEhB5tD,eAAgB4jC,EAAAA,GAChBiqB,4BAA6BhqB,EAAAA,IAE/BzxE,OAAQ,CACND,SAAU,EACVE,UAAW,EACXksC,OAAQ,GAEVrgC,IAAK,CACHC,OAAQm7D,EAAAA,GAAAA,GACR1O,SAAUpQ,EAAAA,GAAAA,WACV37D,OAAQ,CACN4rE,OAAQ,CACNvsD,IAAK,GACL0M,KAAM,GAER+iC,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,KACNp3E,MAAO,SAGXgyD,KAAM,CACJmlB,OAAQ,CACNvsD,IAAK,GACL0M,KAAM,GACNiN,MAAO,IAET81B,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,IAGVgM,OAAQ,CACNjM,OAAQ,CACNvsD,IAAK,GACL2Z,MAAO,GAET81B,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,EACNp3E,MAAO,UAIbukC,MAAO,CACLnlC,MAAO4mF,EAAAA,GAAAA,IACPzK,KAAM,CACJpE,OAAQ,CACN7/C,KAAM,GAER+iC,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,EACN7c,WAAYiiB,EAAAA,GAAAA,EACZ9hB,QAAS,CACP9vC,IAAK8wC,EAAAA,GAAAA,IACLpzB,OAAQozB,EAAAA,GAAAA,IACRpkC,KAAMokC,EAAAA,GAAAA,IACNn3B,MAAOm3B,EAAAA,GAAAA,QAKfpzB,OAAQ,CACNzd,OAAQm7D,EAAAA,GAAAA,EACR1O,SAAUpQ,EAAAA,GAAAA,IACVqU,KAAM,CACJpE,OAAQ,CACNvsD,IAAK,GAEPyvC,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,KAIZ9/C,KAAM,CACJl4B,MAAO4mF,EAAAA,GAAAA,EACP1M,aAAc,CACZE,aAAc,GACdrC,OAAQ,CACNvsD,KAAM,EACN0M,KAAM,GAER+iC,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,EACNl3E,OAAQ,SAGZqe,UAAW,CACT44D,OAAQ,CACNvsD,IAAK,EACL0M,KAAM,IAER+iC,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,EACNl3E,OAAQ,MACRN,OAAQ,qBAGZghF,WAAY,CACVzJ,OAAQ,CACN7/C,KAAM,IAER+iC,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,MAKdpnD,kBAAmB,CACjBy8B,QAAS,CACP5hC,OAAQ,IACR4qC,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAcw1D,EAAAA,EAAsBC,EAAAA,IAExD37F,OAAQ,CACND,SAAU,EACVE,UAAW,EACXksC,OAAQ,GAEVrgC,IAAK,CACHC,OAAQm7D,EAAAA,GAAAA,GAEVzhD,MAAO,CACLnlC,MAAO4mF,EAAAA,GAAAA,IACPzK,KAAM,CACJpE,OAAQ,CACN7/C,KAAM,GAER+iC,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,EACN7c,WAAYiiB,EAAAA,GAAAA,EACZ9hB,QAAS,CACP9vC,IAAK8wC,EAAAA,GAAAA,IACLpzB,OAAQozB,EAAAA,GAAAA,IACRpkC,KAAMokC,EAAAA,GAAAA,IACNn3B,MAAOm3B,EAAAA,GAAAA,QAKfpzB,OAAQ,CACNzd,OAAQm7D,EAAAA,GAAAA,GAEV1uD,KAAM,CACJl4B,MAAO4mF,EAAAA,GAAAA,EACP8gB,eAAgB,CACdttB,aAAc,EACdrC,OAAQ,CACNvsD,IAAKysD,EAAAA,GAAAA,EACL//C,KAAM+/C,EAAAA,GAAAA,GAERhd,KAAM,CACJr7D,KAAMo4E,EAAAA,GAAAA,EACNp3E,MAAO,OACPu6D,WAAYiiB,EAAAA,GAAAA,MAKpBqP,wBAAyB,CACvBp/B,QAAS,CACPgJ,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAcq1D,EAAAA,GAAkBC,EAAAA,IAEpDx7F,OAAQ,CACND,SAAU,EACVE,UAAW,EACXksC,OAAQ,GAEVrgC,IAAK,CACHC,OAAQ,GAEVyd,OAAQ,CACNzd,OAAQ,IAEVyM,KAAM,CACJl4B,MAAO,GAETmlC,MAAO,CACLnlC,MAAO,KAGXytF,eAAgB6tB,EAAAA,GAChBhxD,cAAe,CACb1qD,KAAM,EACN2qD,UAAW,GACX/rD,MAAO,OACP80E,YAAa,EACbC,YAAa,QAEfnd,gBAAiB,CACfC,OAAQhsD,IAAUu7C,EAAAA,GAAAA,MAAc21D,EAAAA,GAAoBC,EAAAA,GACpDhgD,YAAa,YACbtC,uBAAwB,eD9Lf+iD,CAA2B5xG,GACtC,EAGF,SAAS6xG,IAAkC,IAAhBC,EAAS1oG,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,GAErC,OAAwB,IADP0oG,EAAU/7F,QAAQ,IAAK,IAC3Bzb,OACJ,GAAPrG,OAAU69G,EAAS,MAEdA,CACT,CAEO,MAAMhzB,EAAqBh3E,IAM5B,IAN6B,MACjC9H,EAAK,OACL4+E,GAID92E,EACC,MAAMiqG,EAAenzB,EAAO5+E,GACtBgyG,EAAkB53G,OAAOC,KAAK03G,GAC9BE,EAAgBjyG,IAAUu7C,EAAAA,GAAAA,MAAcq1D,EAAAA,GAAkBC,EAAAA,GAEhE,OAAOmB,EAAgBp2G,QAAO,CAACC,EAAKojF,IAEhC4yB,EAAkBE,EAAa9yB,IAAWj0D,gBAC1C6mF,EAAkBI,EAAchzB,IAAWj0D,cAGzC,IACKnvB,EACH,CAACojF,GAAW8yB,EAAa9yB,IAE3BpjF,GACH,CAAC,EAAE,C,+CE3DD,IAAK8/E,EAAQ,SAARA,GAAQ,OAARA,EAAQ,wBAARA,EAAQ,oBAARA,EAAQ,oBAARA,CAAQ,K,gKCuDb,MAAMi1B,EAAqC,CAChD3zB,gBAAiB,YACjB/rB,WAAY,YACZ0uB,WAAY,YACZC,SAAU,YACVlF,WAAY,YACZzhD,MAAO,YACPstE,UAAW,OACX0L,oBAAqB,OACrBz/B,kBAAmB1G,IAAAA,aAAAA,KACnBoH,YAAapH,IAAAA,KAAAA,KACbiL,KAAM,YACNX,cAAe,UACf6mB,2BAA4BnxB,IAAAA,KAAAA,KAC5BkxB,qBAAsB,OACtB30C,KAAM,YACNs6B,WAAY7W,IAAAA,IAAAA,KACZ8W,SAAU9W,IAAAA,MAAAA,KACVomC,eAAgB,YAChB9wB,cAAe,YACfD,YAAa,YACbgxB,8BAA8B7rC,EAAAA,EAAAA,IAAwB,UAAW,KACjE2L,uBAAwB,OACxB2zB,0BAA2B,UAC3BwM,eAAgB,YAChBr1B,cAAe,YACfl5B,UAAW,YACXngD,KAAM,UACNwqE,cAAe,UACfuR,UAAW,YACXC,QAAS,YACT5H,gBAAiB,UACjBC,cAAe,UACf8H,SAAU,YACVC,OAAQ,YACRuB,WAAY,QAGDuvB,EAAoC,CAC/C5zB,gBAAiB,YACjB/rB,WAAY,YACZ0uB,WAAY,YACZC,SAAU,YACVlF,WAAY5O,IAAAA,KAAAA,KACZ7yC,MAAO,UACPstE,UAAW,OACX0L,oBAAqB,OACrBz/B,kBAAmB1G,IAAAA,OAAAA,KACnBoH,YAAapH,IAAAA,KAAAA,KACbiL,KAAM,YACNX,cAAe,UACf6mB,2BAA4BnxB,IAAAA,KAAAA,KAC5BkxB,qBAAsB,OACtB30C,KAAM,YACNs6B,WAAY7W,IAAAA,IAAAA,KACZ8W,SAAU9W,IAAAA,MAAAA,KACVomC,eAAgBpmC,IAAAA,IAAAA,KAChBsV,cAAe,YACfD,YAAa,YACbgxB,8BAA8B7rC,EAAAA,EAAAA,IAAwB,UAAW,KACjE2L,uBAAwB,OACxB2zB,0BAA2B,UAC3BwM,eAAgBtmC,IAAAA,MAAAA,KAChBiR,cAAe,YACfl5B,UAAW,YACXngD,KAAM,UACNwqE,cAAe,YACfuR,UAAW,YACXC,QAAS,YACT5H,gBAAiB,YACjBC,cAAe,YACf8H,SAAU,YACVC,OAAQ,YACRuB,WAAY,WAGDlC,EAAsC,CACjDS,SAAU,YACVE,OAAQ,UACRH,WAAY,YACZE,SAAU,aAGCixB,EAA6C,CACxDzoD,KAAM,UACN86C,WAAYr3B,IAAAA,IAAAA,MAGDilC,EAA4C,CACvD1oD,KAAM,UACN86C,WAAYr3B,IAAAA,IAAAA,MAGDmlC,EAAyC,CACpD5oD,KAAM,UACN9G,OAAQ,UACRmP,sBAAuB,WAGZwgD,EAAwC,CACnD7oD,KAAM,UACN9G,OAAQ,UACRmP,sBAAuB,WAEZsgD,EAA+B,CAC1C,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAIW5xB,EAAwB,CACnCM,QAAS,UACTD,UAAW,WAGN,IAAK/1E,EAAa,SAAbA,GAAa,OAAbA,EAAAA,EAAa,aAAbA,EAAAA,EAAa,iBAAbA,EAAAA,EAAa,qBAAbA,EAAAA,EAAa,mBAAbA,CAAa,K,2iBCvKzB,MAAMuyC,UAA8B3sB,IAAAA,MAClCC,mBACEC,KAAKC,UACH,wBACA,WACA,8BACA,6BACA,gBACA,eAEJ,CAQAI,cAA6D,IAAAwiF,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,IAAjDlnD,EAA0CpiD,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,CAAC,EACxDgqB,MAAMo4B,GAAMz7B,EAAA,wBAAAA,EAAA,2CAAAA,EAAA,0CAAAA,EAAA,4BAAAA,EAAA,6BAAAA,EAAA,yBASM4iF,IACdljF,KAAK0iB,gBAAkBwgE,GACzBljF,KAAK5lB,iBAAiB,CAAEsoC,cAAewgE,GACzC,IAVAljF,KAAK3rB,SAAyB,QAAjBwuG,EAAG9mD,EAAM1nD,gBAAQ,IAAAwuG,EAAAA,EAAI,GAClC7iF,KAAKhmB,aAAiC,QAArB8oG,EAAG/mD,EAAM/hD,oBAAY,IAAA8oG,EAAAA,GAAIpqG,EAAAA,EAAAA,MAC1CsnB,KAAKjmB,2BAA6D,QAAnCgpG,EAAGhnD,EAAMhiD,kCAA0B,IAAAgpG,EAAAA,GAAI3mG,EAAAA,EAAAA,IAAQ4jB,KAAKhmB,aAAc,GACjGgmB,KAAK7jB,4BAA+D,QAApC6mG,EAAGjnD,EAAM5/C,mCAA2B,IAAA6mG,EAAAA,GAAI5mG,EAAAA,EAAAA,IAAQ4jB,KAAKhmB,aAAc,GACnGgmB,KAAK0iB,cAAmC,QAAtBugE,EAAGlnD,EAAMrZ,qBAAa,IAAAugE,EAAAA,EAAI/oG,EAAAA,GAAAA,GAC9C,EASF,S,ukBCvCA,MAAMyF,UAAgBmgB,IAAAA,MACpBC,iBAAiB3tB,GACf4tB,KAAKC,UAAU,UAAW,WAAY,aAAc,SAAU,aAC9DD,KAAK4rE,UAAU,OAAQx5F,EACzB,CAYAiuB,cAA4B,IAAA8iF,EAAAC,EAC1Bz/E,SAAMhqB,WAAQ2mB,EAAA,kBAPY,MAAIA,EAAA,iBACL,MAAIA,EAAA,eACrB,GAACA,EAAA,qBAEIq6C,EAAAA,EAAAA,WAAa/kE,EAAY8C,EAAAA,IAItC,MAAMzE,EAAY0F,UAAA9O,QAAA,OAAA+K,EAAA+D,UAAA,GAClBqmB,KAAKzrB,UAAmC,QAA1B4uG,EAAGlvG,aAAY,EAAZA,EAAcM,iBAAS,IAAA4uG,EAAAA,EAAqB,QAArBC,EAAIpjF,KAAKqjF,oBAAY,IAAAD,OAAA,EAAjBA,EAAAvhG,KAAAme,MAC5CA,KAAKqjB,IAAI,UAAU,KAAM,IAAAigE,EACvBtjF,KAAK5lB,iBAAiB,CACpB5F,OAA4B,QAAtB8uG,EAAErvG,aAAY,EAAZA,EAAcO,cAAM,IAAA8uG,EAAAA,EAAItjF,KAAK/kB,OAAOsoG,wBAAwBt9G,IAAM,GAC1E,GAEN,CAEAqgB,QAAQ5U,GACN,MAAM8xG,EAAcxjF,KAAKtuB,SACzBsuB,KAAKjkB,gBAAgB,WAAYrK,GACjCsuB,KAAKjyB,QAAQ,UAAWiyB,KAAMwjF,EAChC,CAEAr7E,YACE,MAAM,SAAEz2B,EAAQ,QAAE+xG,GAAYzjF,MACxB,MAAE+7B,GAAUrqD,GACZ,MAAEm0B,GAAUn0B,EAASL,MACrBqyG,EAAYn5G,IAAM,CAAEk5G,WAAW1nD,GAC/B4nD,EAAS35C,EAAAA,EAAmBt4D,EAAS7J,MAA2ByT,WAAWooG,EAAWhyG,EAASL,QAC/F,cAAEm/C,GAAkBxwB,KAAK/kB,OAAO27B,yBAChCU,EAASkZ,EAAc1qD,KAAmC,EAA5B0qD,EAAcgpB,YAClDmqC,EAAOh1E,OAAO9I,EAAMf,EAAEiB,OAAOuR,GAASzR,EAAMd,EAAEgB,OAAOuR,GAAUzR,EAAMd,EAAEgB,OAAO,IAC9E49E,EAAOnzE,8BACP7wB,EAAQpE,OAAO,CAAE7J,SAAUiyG,EAAQF,YACnCzjF,KAAKjyB,QAAQ,YAAaiyB,KAAM2jF,EAClC,CAEAC,aAAapvG,GACX,MAAMqvG,EAAgB7jF,KAAKxrB,OACrBsvG,EAAgBtvG,EAASqvG,EAAgB,GAAK,EAEpD,GAAI7jF,KAAKnuB,WAAamuB,KAAKruB,cAYzB,OAXoB,IAAhBquB,KAAKxrB,QACPwrB,KAAK5lB,iBAAiB,CAAE5F,OAAQ,SAElCwrB,KAAK/kB,OACFvH,iBACAoG,QAAQpN,IAC8B,IAAlBo3G,EAAsBp3G,EAAQ8H,QAAUA,EAAS9H,EAAQ8H,QAAUA,IACjE9H,EAAQiH,cAE9BxB,SAASzF,GAAYA,EAAQk3G,cAA8B,EAAjBE,KAK/C,MAAMC,EAAuB,IAAXvvG,EAAesvG,EAAgBtvG,GAC3C,IAAExO,EAAG,IAAEC,GAAQ+5B,KAAK/kB,OAAOsoG,wBACjC,GACEM,IAAkBE,GACjBF,IAAkB79G,IAA0B,IAAnB89G,GACzBD,IAAkB59G,GAAyB,IAAlB69G,EAE1B,OAEF,MAAM,kBAAEE,EAAiB,kBAAEC,GAAsBjkF,KAAK/kB,OAAOipG,6BAE7DC,EAAAA,EAAAA,IAAsB,CACpBC,cAAeJ,EACfK,WAAYN,EAAY,EAAI/jF,UAAOpqB,EACnC0uG,UAAWT,EACXE,YACAQ,aAAa,KAGfJ,EAAAA,EAAAA,IAAsB,CACpBC,cAAeH,EACfI,WAAYN,EAAY,EAAI/jF,UAAOpqB,EACnC0uG,UAAWT,EACXE,aAEJ,CAEAz7E,eACEtI,KAAK4jF,aAAa5jF,KAAK/kB,OAAOsoG,wBAAwBt9G,IAAM,EAC9D,CAEAsiC,aACEvI,KAAK4jF,aAAa5jF,KAAK/kB,OAAOsoG,wBAAwBv9G,IAAM,EAC9D,CAEAwiC,eACExI,KAAK4jF,aAAa5jF,KAAKxrB,OAAS,EAClC,CAEAi0B,eACEzI,KAAK4jF,aAAa5jF,KAAKxrB,OAAS,EAClC,CAEA3C,UAAU,IAAA2yG,EACR,QAAsB,QAAdA,EAACxkF,KAAKtuB,gBAAQ,IAAA8yG,IAAbA,EAAe38G,KAAKw8B,WAAW,WAC1C,CAEA1yB,cAAc,IAAA8yG,EACZ,QAAsB,QAAdA,EAACzkF,KAAKtuB,gBAAQ,IAAA+yG,IAAbA,EAAe58G,KAAKw8B,WAAW,eAC1C,CAEAqgF,YAAY,IAAAC,EACV,QAAsB,QAAdA,EAAC3kF,KAAKtuB,gBAAQ,IAAAizG,IAAbA,EAAe98G,KAAKw8B,WAAW,aAC1C,CAEA1wB,YAAY,IAAAixG,EACV,QAAsB,QAAdA,EAAC5kF,KAAKtuB,gBAAQ,IAAAkzG,IAAbA,EAAe/8G,KAAKw8B,WAAW,WAC1C,CAEAjP,eAAe,IAAAyvF,EACb,QAAsB,QAAdA,EAAC7kF,KAAKtuB,gBAAQ,IAAAmzG,IAAbA,EAAeh9G,KAAKw8B,WAAW,eAC1C,CAEA8U,cAAc,IAAA2rE,EACZ,QAAsB,QAAdA,EAAC9kF,KAAKtuB,gBAAQ,IAAAozG,IAAbA,EAAe3rE,YAC1B,CAEAh+B,wBACE,OAAO6kB,KAAKmZ,eAAiBnZ,KAAKtuB,SAAS5D,gBAC7C,CAEA2X,WACE,MAAO,IACFua,KAAKtuB,SAAS+T,WACjBlR,UAAWyrB,KAAKzrB,UAChBC,OAAQwrB,KAAKxrB,OAEjB,CAEA0S,WACE,MAAO,IACF8Y,KAAKtuB,SAASwV,WACjB3S,UAAWyrB,KAAKzrB,UAChBC,OAAQwrB,KAAKxrB,OAEjB,CAEAsG,eAAe4D,GACb,OAAOshB,KAAKzJ,QAAQ7X,EACtB,CAEAqmG,mBAAmB,IAAAC,EACjBhlF,KAAKjkB,gBAAgB,YAA8B,QAAnBipG,EAAEhlF,KAAKqjF,oBAAY,IAAA2B,OAAA,EAAjBA,EAAAnjG,KAAAme,MACpC,EAGF,S,wKCpKA,MAAMilF,EAAe,CAAEz+B,MAAO,EAAG2T,QAAS,IACpC+qB,EAAa,CAAE1+B,MAAO,GAAI2T,QAAS,IAQlC,SAASgrB,EAAsBlhH,GAQnC,IARoC,YACrCmhH,EAAW,YACXC,EAAW,UACX34C,GAKDzoE,EACKqhH,GAAe1qB,EAAAA,EAAAA,IAAsBluB,GACzC,MAAM64C,EACJH,EAAYjhG,QAAQuR,WAAai4D,EAAAA,GAAAA,SAAoCy3B,EAAY//F,WAC7EmgG,EACJH,EAAYlhG,QAAQuR,WAAai4D,EAAAA,GAAAA,SAAoC03B,EAAYhgG,WAkBnF,MAhBI,CAAC6kC,EAAAA,GAAAA,EAAaA,EAAAA,GAAAA,EAAaA,EAAAA,GAAAA,GAAap+C,SAASs5G,EAAY//F,aAC/DigG,GAAeG,EAAAA,EAAAA,GAAQH,EAAcL,IAGnCI,EAAYhgG,YAAc6kC,EAAAA,GAAAA,EAC5Bo7D,GAAeG,EAAAA,EAAAA,IAAQC,EAAAA,EAAAA,GAAeJ,GAAeJ,GAC5CG,EAAYhgG,YAAc6kC,EAAAA,GAAAA,EACnCo7D,GAAeG,EAAAA,EAAAA,IAAQE,EAAAA,EAAAA,GAAcL,EAAc,CAAEM,aAAc,IAAMV,GAChEG,EAAYhgG,YAAc6kC,EAAAA,GAAAA,GAAkD,UAAnCm7D,EAAYlhG,QAAQnE,aACtEslG,GAAeO,EAAAA,EAAAA,GAASP,IAGtBC,IAA4BC,GAA8D,UAAnCH,EAAYlhG,QAAQnE,aAC7EslG,EAlCJ,SAAoCpiG,GAClC,MAAMsjE,EAAQtjE,EAAK+4D,WACbke,EAAUj3E,EAAKi5D,aACrB,OAAOqK,EAAQy+B,EAAaz+B,OAAUA,IAAUy+B,EAAaz+B,OAAS2T,EAAU8qB,EAAa9qB,OAC/F,CA8BmB2rB,CAA2BR,IAAgBG,EAAAA,EAAAA,GAAQH,EAAcL,GAAgBK,OAGxF1kB,EAAAA,EAAAA,IAAqB0kB,GAAc,GAAOjmB,UAAY,IAClE,C,wcC5CO,MAAM0mB,UAAcjmF,IAAAA,MAAYO,cAAA,SAAA1mB,WAAA2mB,EAAA,yBASlB,SAAA0lF,EAAA,QAAmB,QAAZA,EAAChmF,KAAK/kB,cAAM,IAAA+qG,IAAXA,EAAah/F,QAAQ2vC,qBAAqB8kC,EAAAA,GAAAA,WAA4B,IAAAn7D,EAAA,gCAEtErlB,IAAU,IAAAgrG,EAAA,QAAkB,QAAZA,EAACjmF,KAAK/kB,cAAM,IAAAgrG,IAAXA,EAAaj/F,QAAQ4N,IAAI3Z,EAAK+L,SAAQ,IAAAsZ,EAAA,mCAEpDrlB,GAAe+kB,KAAKkmF,oBAAsBlmF,KAAKmmF,wBAAwBlrG,KAAKqlB,EAAA,6BAElFrlB,IACtB,GAAI+kB,KAAKlO,SAAU,CACjB,GAAIkO,KAAKmmF,wBAAwBlrG,GAC/B,OAAOhR,KAAKyrC,MAAM1V,KAAKlO,SAASgT,GAElC,MAAMshF,EAAcpmF,KAAK/kB,OACzB,GAAI+kB,KAAKkmF,oBAAsBE,EAAa,CAC1C,MAAMC,EAAeD,EAAYp/F,QAC3Bs/F,EAAmBrrG,EAAK+L,QACxBu/F,EAAyBF,EAAaliG,QAAQu6C,yBAAyBz0D,KAAKyrC,MAAM1V,KAAKlO,SAASgT,IAChG0hF,EAAuBF,EAAiBniG,QAAQs8C,0BACpD0kD,EAAuB,CACrBC,YAAaiB,EACbhB,YAAaiB,EACb55C,UAAW65C,KAGf,OAAOt8G,KAAKuwC,MAAMgsE,EACpB,CACF,CAEA,OAAOt8G,OAAOwgC,GAAG,IAClBpK,EAAA,wBAEkBrlB,IAAe,IAAAwrG,EAAAC,EAAAC,EAChC,MAAMC,EAA4B,QAAnBH,EAAgB,QAAhBC,EAAG1mF,KAAKlO,gBAAQ,IAAA40F,OAAA,EAAbA,EAAe3hF,SAAC,IAAA0hF,EAAAA,EAAI,KAEtC,GAAe,QAAfE,EAAI3mF,KAAK/kB,cAAM,IAAA0rG,GAAXA,EAAa/xF,IAAI3Z,GACnB,OAAO2rG,EAGT,GAAI5mF,KAAKkmF,oBAAsBlmF,KAAK/kB,OAAQ,KAAA4rG,EAG1C,OAFkC,QAAdA,EAAG7mF,KAAK/kB,cAAM,IAAA4rG,OAAA,EAAXA,EAAaC,qBACX7rG,EAAK6rG,kBACeF,EAAY,IAC3D,CAEA,OAAO,IAAI,GACZ,CApDD7mF,mBACEC,KAAKC,UAAU,QAAS,YACxBD,KAAK4rE,UAAU,OAAQnoE,EAAAA,EACzB,EAwDFsiF,EAAM7lF,YAEN,MAAM6mF,EAAQhB,EAAMxqG,SACpBwrG,EAAM5sG,OAEN,S,imBClDA,MAAM6sG,EAA+B,CACnClpF,EAAAA,GAAAA,MACAA,EAAAA,GAAAA,UACAA,EAAAA,GAAAA,iBACAA,EAAAA,GAAAA,iBACAA,EAAAA,GAAAA,gBACAA,EAAAA,GAAAA,gBAGF,MAAM2F,UAAa3D,IAAAA,MAAYO,cAAA,SAAA1mB,WAAA2mB,EAAA,iBA0BK,MAAIA,EAAA,kBACY,KAAI,CA1BtDP,iBACEgI,EACAk/E,EACAh6F,GAEA+S,KAAKC,UAAU,OAAQ,SAAU,QAAS,aAAc,WAAY,aACpED,KAAKq+E,QAAQ,WAAYt2E,GACzB/H,KAAKq+E,QAAQ,cAAe4I,GAC5BjnF,KAAK4rE,UAAU,cAAe7jE,GAC9B/H,KAAK4rE,UAAU,QAAS3+E,EAC1B,CAkBAnS,eAAe4D,GAMb,OALAshB,KAAK3rB,WACF4a,MACA9c,SAASzF,IACRA,EAAQoO,gBAAgB,IAErBklB,KAAKzJ,QAAQ7X,EACtB,CAEA+G,WACE,MAAMpR,EAAW2rB,KAAK3rB,WACnB4a,MACAvnB,KAAKy5B,GAAOA,EAAG1b,aAClB,MAAO,CACLkM,OAAQqO,KAAKrO,OACbkU,MAAO7F,KAAK6F,MACZN,WAAYvF,KAAKuF,WACjBlxB,WAEJ,CAEA6S,WAAoC,IAA3By3F,EAAQhlG,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,GAAAA,UAAA,GAAG,GAClB,MAAMtF,EAAW2rB,KAAK3rB,WACnB4a,MACAvnB,KAAKy5B,GAAOA,EAAGja,aAClB,OAAOH,IACL,CACE4K,OAAQqO,KAAKrO,OACb4T,WAAYvF,KAAKuF,WACjBlxB,YAEFsqG,EAEJ,CAEAuI,KAAKvpE,GACH,MAAMwpE,EAAannF,KAAKhZ,QAAQ9U,cAC1B6iB,EAAYoyF,EAAW5/G,MAAM0T,IAAUA,EAAKk1B,uBAC5Ci3E,EAAaD,EAAW5/G,MAAM0T,GAAS+kB,KAAKpL,IAAI3Z,KAEtD,IAAK8Z,IAAcqyF,EAAY,OAE/B,MAAMC,EAA0B5jF,EAAK6jF,QAAQxtG,QAAQmB,GAASA,EAAKssG,WAAaH,EAAWG,WACrFC,EAAwB/jF,EAAK6jF,QAAQxtG,QAAQmB,GAASA,EAAKssG,WAAaH,EAAWG,WAEnFE,EAAoBJ,EAAwBzqG,WAAWkgG,GAAWA,EAAO1jG,KAAOguG,EAAWhuG,KAC3FsuG,EAA2BL,EAAwBvtG,QAAO,CAAC2E,EAAGvG,IAAUA,IAAUuvG,IAClFE,EAAmBD,EAAyB9qG,WAAWkgG,GAAWA,EAAO1jG,KAAO2b,EAAU3b,KAE1FwuG,EAAaF,EAAyB59G,MAAM,EAAG69G,GAC/CE,EAAaH,EAAyB59G,MAAM69G,EAAmB,GACjEhqE,IAAc2b,EAAAA,GAAAA,QAChBsuD,EAAWp1G,KAAK60G,EAAwBI,IACxCG,EAAWxwG,MAAK,CAACC,EAAGC,IAAMD,EAAEywG,eAAiBxwG,EAAEwwG,kBAE7CnqE,IAAc2b,EAAAA,GAAAA,QAChBuuD,EAAWr1G,KAAK60G,EAAwBI,IACxCI,EAAWzwG,MAAK,CAACC,EAAGC,IAAMD,EAAEywG,eAAiBxwG,EAAEwwG,kBAGjDrkF,EAAK6jF,QAAUE,EAAsBhjH,OAAO,IACvCojH,EACHF,EAAyBC,MACtBE,IAEL7nF,KAAKhZ,QAAQjZ,QAAQ,SAAUiyB,KAAKhZ,QACtC,CAEA4vB,yBACE,OAAOA,EAAAA,EAAAA,wBAAuB5W,KAAKhZ,QAAQ2M,eAC7C,CAEAjgB,iBACE,OAAOssB,KAAK3rB,WACT4a,MACA7X,MAAK,CAACC,EAAGC,IAAMD,EAAE7C,OAAS8C,EAAE9C,QACjC,CAEA2gB,oBAAmC,IAAjB4yF,IAAQpuG,UAAA9O,OAAA,QAAA+K,IAAA+D,UAAA,KAAAA,UAAA,GACxB,MAAM2b,EAAc,IAAI0K,KAAK1K,cAAcrG,OAC3C,OAAO84F,EAAWzyF,EAAYle,MAAK,CAACC,EAAGC,IAAMD,EAAE7C,OAAS8C,EAAE9C,SAAU8gB,CACtE,CAEAhB,6BAA6B,IAAA0zF,EAC3B,OAA2E,QAA3EA,EAAOhoF,KAAKtsB,iBAAiBnM,MAAM45B,GAAOA,EAAGtvB,WAAasvB,EAAGxvB,uBAAc,IAAAq2G,EAAAA,EAAI,IACjF,CAEA73E,qBAAqB,IAAA83E,EACnB,QAA2B,QAAnBA,EAACjoF,KAAKxuB,qBAAa,IAAAy2G,IAAlBA,EAAoBt2G,cAC/B,CAEA+gC,iBAAiB,IAAAw1E,EACf,QAA2B,QAAnBA,EAACloF,KAAKxuB,qBAAa,IAAA02G,IAAlBA,EAAoBr2G,UAC/B,CAEAs2G,cACMnoF,KAAKmQ,sBACPnQ,KAAKjkB,gBAAgB,SAAUw8C,EAAAA,GAAAA,WAE7Bv4B,KAAK0S,kBACP1S,KAAKjkB,gBAAgB,SAAUw8C,EAAAA,GAAAA,MAEnC,CAEAuuD,kBACE,OAAO9mF,KAAKhZ,QACT9U,cACA0K,WAAWmY,GAAcA,EAAUH,IAAIoL,OAC5C,CAEAujF,wBACE,IAAIt9G,GAAO,EACPD,EAAM,EASV,OARAg6B,KAAKtsB,iBAAiBvB,SAASgvB,IACzBA,EAAG3sB,OAASvO,IACdA,EAAMk7B,EAAG3sB,QAEP2sB,EAAG3sB,OAASxO,IACdA,EAAMm7B,EAAG3sB,OACX,IAEK,CAAExO,MAAKC,MAChB,CAEAi+G,4BACE,MAAMkE,EAAkBpoF,KAAKtsB,iBACvBswG,EAA+B,GAC/BC,EAA+B,GAUrC,OATAmE,EAAgBj2G,SAASgvB,IACnBA,EAAG3sB,OAAS,GACdwvG,EAAkBxxG,KAAK2uB,GAErBA,EAAG3sB,OAAS,GACdyvG,EAAkBzxG,KAAK2uB,EACzB,IAGK,CAAE6iF,oBAAmBC,oBAC9B,CAEA9mG,oBACE,MAAM,kBAAE6mG,EAAiB,kBAAEC,GAAsBjkF,KAAKkkF,6BACtDmE,EAAAA,EAAAA,IAAuB,CAAEjE,cAAeJ,EAAmBO,aAAa,KACxE8D,EAAAA,EAAAA,IAAuB,CAAEjE,cAAeH,EAAmBM,aAAa,GAC1E,CAEAjyG,oBACE,OAAO0tB,KAAKhZ,QAAQ1U,mBACtB,CAEAw1G,eACE,OAAO59G,OAAO81B,KAAK5mB,GAAGkN,QAAQ,KAAM,IACtC,CAEAiP,4BACE,IAAKyK,KAAK6F,QAAU7F,KAAK6F,MAAM25E,eAAe,KAC5C,OAGF,MAAMlqF,EAAc0K,KAAK7K,mBAAkB,GAAO/d,MAChD,CAACC,EAAGC,IAAMD,EAAE3F,SAASqqD,MAAMuP,mBAAoBxmC,EAAIxtB,EAAE5F,SAASqqD,MAAMuP,mBAAoBxmC,IAEpFwjF,EAAoBhzF,EAAY/tB,MAAM43B,GAAeA,EAAWztB,SAAS0tB,YACzEmpF,EAAmBjzF,EAAY/tB,MAAM43B,GAAeA,EAAWztB,SAAS8tB,SAExEgpF,EAAqD,GACrDC,EAAoD,GACpDC,EAAmD,GAEzDpzF,EAAYnjB,SAAQ,CAACgtB,EAAYjnB,KAC/B,MAAMywG,EAA0BrzF,EAAYxb,QAC1C,CAAC8uG,EAAcvyG,IACbA,EAAI6B,GAASjO,KAAKyrC,MAAMvW,EAAWztB,SAASqqD,MAAMj3B,KAAO76B,KAAKyrC,MAAMkzE,EAAcl3G,SAASqqD,MAAMj3B,KAErG3F,EAAW/kB,iBAAiB,CAAEyqF,OAAQ8jB,EAAwB99G,SAC9D,MAAMu0B,EAAYD,EAAWztB,YAAa42G,aAAiB,EAAjBA,EAAmB52G,UACvDm3G,EAAW1pF,EAAWztB,YAAa62G,aAAgB,EAAhBA,EAAkB72G,UACrDo3G,EAAgB3pF,EAAWztB,SAAS7J,QAASygH,aAAiB,EAAjBA,EAAmB52G,SAAS7J,MACzEkhH,EAAa5pF,EAAWztB,SAAS7J,QAAS0gH,aAAgB,EAAhBA,EAAkB72G,SAAS7J,MACtEu3B,GAAcypF,IACbC,EACFN,EAA8Bh2G,KAAK2sB,GAC1B4pF,EACTN,EAA6Bj2G,KAAK2sB,GAElCupF,EAA4Bl2G,KAAK2sB,GAErC,IAGFupF,EAA4BtxG,MAC1B,CAACC,EAAGC,IACF0vG,EAA6B15C,QAAQj2D,EAAE3F,SAASiuB,yBAChDqnF,EAA6B15C,QAAQh2D,EAAE5F,SAASiuB,2BAGzB,IACtB+oF,KACAD,EACHF,KACGC,EACHF,GACAxuG,OAAO8P,SACUzX,SAAQ,CAACgtB,EAAYjnB,KACtCinB,EAAY/kB,iBAAiB,CAAE5F,OAAQ0D,GAAQ,GAEnD,EAGF,S,wNCtPA,MAAM8wG,EAAa,CAAC,EAEb,SAASC,EAAchlH,GAI+D,IAJ9D,IAC7BmhB,EAAG,IACHje,EAAG,UACHkd,GACyFpgB,EACzF,MAAMkgB,EAAQ6kG,EAAW5jG,GACzB,OAAIjB,aAAK,EAALA,EAAO+kG,YAAa7kG,GAAald,EAC5Bgd,EAAMhd,GACHA,EAGL,KAFEgd,CAGX,CAEO,SAASglG,EAAc9wG,GAK2C,IAAA+wG,EAAA,IAL1C,IAC7BhkG,EAAG,IACHje,EAAG,MACHhD,EAAK,UACLkgB,GACqEhM,EACrE2wG,EAAW5jG,GAAO,KACG,QAAfgkG,EAAAJ,EAAW5jG,UAAI,IAAAgkG,OAAA,EAAfA,EAAiBF,YAAa7kG,EAAY2kG,EAAW5jG,GAAO,CAAC,EACjE,CAACje,GAAMhD,EACP+kH,SAAU7kG,EAEd,C,cChCA,MA4EMglG,EAAa,CACjB/hG,KAAM,GACN+3D,KAAM,GACNC,IAAK,GACLpoC,MAAO,GACP46B,OAAQ,GACR5uD,KAAM,GACNmB,WAAY,EACZilG,sBAAuB,EACvBllG,YAAY,EACZmlG,OAAO,EACPnxD,UAAMxiD,EACNpN,UAAMoN,EACNuwE,uBAAmBvwE,EACnB6vE,wBAAoB7vE,EACpBywE,4BAAwBzwE,EACxBgwE,8BAA0BhwE,EAC1BggB,SAAU,GACV4zF,sBAAkB5zG,EAClB6zG,sBAAkB7zG,EAClB0xE,oBAAgB1xE,EAChBmqE,cAAUnqE,EACVoqE,cAAUpqE,EACVqqE,aAASrqE,EACT4X,eAAW5X,EACX8pE,gBAAY9pE,EACZ8zG,YAAQ9zG,EACRqpE,cAAUrpE,EACVy+C,eAAWz+C,EACXw+C,gBAAYx+C,EACZg1E,iBAAah1E,EACb0f,YAAa,IAsEf,MAAMpR,UAAc4b,IAAAA,MAClBC,mBACEC,KAAKC,UACH,QACA,SACA,OACA,aACA,YACA,OACA,OACA,MACA,QACA,OACA,SACA,WACA,WACA,UACA,YACA,WACA,aACA,WACA,SACA,YACA,OACA,cACA,aACA,cACA,YACA,oBACA,qBACA,yBACA,2BACA,cACA,YACA,SACA,cACA,WACA,mBACA,mBACA,iBACA,YACA,aACA,WACA,WACA,WACA,iBACA,kBACA,aACA,kBACA,YACA,wBACA,UACA,SACA,QAEJ,CAEAF,iBAAgBhsB,GASmB,IARjC1B,OAAQs3G,EAAS,WACjB3pG,EAAU,UACVqF,EAAS,QACT3G,EAAO,gBACPqX,EAAe,UACf6zF,EAAS,eACTC,GAAiB,EAAI,UACrB9U,GACehhG,EACf,MAAM1B,EAASs3G,EAAUrjG,QAAQ,IAAK,K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","sources":["webpack://charts/./app/modals/background.tsx","webpack://charts/./app/modals/color_range_row.tsx","webpack://charts/./app/modals/border.tsx","webpack://charts/./app/modals/checkbox.tsx","webpack://charts/./app/modals/font.tsx","webpack://charts/./app/modals/line.tsx","webpack://charts/./app/modals/multiline_string.tsx","webpack://charts/./app/modals/number.tsx","webpack://charts/./app/modals/string.tsx","webpack://charts/./app/modals/trend.tsx","webpack://charts/./app/modals/visibility/visibility-input.tsx","webpack://charts/./app/modals/visibility/index.tsx","webpack://charts/./app/modals/element_style.tsx","webpack://charts/./app/controllers/autosave/utils.ts","webpack://charts/./app/controllers/autosave/constants.ts","webpack://charts/./app/controllers/autosave/use-drawing-autosave-api.ts","webpack://charts/./app/utils/string-byte-length.ts","webpack://charts/./app/controllers/autosave/use-drawing-auto-save-controls.ts","webpack://charts/./app/controllers/autosave/use-is-auto-save-active.ts","webpack://charts/./app/controllers/autosave/with-auto-save.tsx","webpack://charts/./app/utils/use-prev-state.ts","webpack://charts/./app/modals/ideas.tsx","webpack://charts/./app/controllers/header/ideas_dropdown.tsx","webpack://charts/./app/modals/publish/async-modules.ts","webpack://charts/./app/controllers/header/publish.tsx","webpack://charts/./app/controllers/header/tour_button.tsx","webpack://charts/./app/controllers/chart-controls/chart-type-select.tsx","webpack://charts/./app/controllers/chart-controls/use-chart-types.ts","webpack://charts/./app/controllers/chart-controls/daily-change-display.tsx","webpack://charts/./app/controllers/chart-controls/draw-button.tsx","webpack://charts/./app/controllers/chart-controls/fullscreen-button.tsx","webpack://charts/./app/controllers/chart-controls/search.tsx","webpack://charts/./app/controllers/chart-controls/settings-button.tsx","webpack://charts/./app/controllers/chart-controls/use-chart-controls.ts","webpack://charts/./app/model-hooks/useModelRef.ts","webpack://charts/./app/controllers/chart-controls/chart-controls.tsx","webpack://charts/external var \"FLibs.Hammerjs\"","webpack://charts/./app/controllers/chart-events/badges/get-chart-event-badge-element.tsx","webpack://charts/./app/controllers/chart-events/chart-event-popover/chart-event-popover-table-row.tsx","webpack://charts/./app/controllers/chart-events/chart-event-popover/dividends-popover-content.tsx","webpack://charts/./app/controllers/chart-events/chart-event-popover/earnings-popover-content.tsx","webpack://charts/./app/controllers/chart-events/chart-event-popover/split-popover-content.tsx","webpack://charts/./app/controllers/chart-events/chart-event-popover/chart-event-popover.tsx","webpack://charts/./app/controllers/chart-events/chart-event-popover/chart-event-popover-with-state.tsx","webpack://charts/./app/utils/use-click-away.ts","webpack://charts/./app/controllers/chart_layout/constants.ts","webpack://charts/./app/models/context_menu.ts","webpack://charts/./app/controllers/context_menu.tsx","webpack://charts/./app/controllers/pane/load-latest-data-button.tsx","webpack://charts/./app/controllers/pane/zoom_controls.tsx","webpack://charts/./app/controllers/pane/pane.tsx","webpack://charts/./app/controllers/pane/with-pane-model.tsx","webpack://charts/./app/controllers/chart/chart-spinner-overlay.tsx","webpack://charts/./app/controllers/chart/constants.ts","webpack://charts/./app/controllers/chart/chart.tsx","webpack://charts/./app/controllers/chart/with-chart-init.tsx","webpack://charts/./app/controllers/chart/with-watched-panes-on-chart-model.tsx","webpack://charts/./app/controllers/sidebar/modules/portfolio-watchlist/async-modules.ts","webpack://charts/./app/controllers/sidebar/modules/module-load-failed.tsx","webpack://charts/./app/controllers/sidebar/modules/modules.ts","webpack://charts/./app/controllers/sidebar/modules/with-module-async-load.tsx","webpack://charts/./app/controllers/sidebar/sidebar-content.tsx","webpack://charts/./app/controllers/sidebar/sidebar-tabs.tsx","webpack://charts/./app/controllers/sidebar/sidebar.tsx","webpack://charts/./app/creators/async-modules.ts","webpack://charts/./app/controllers/toolbar/drawingActions.tsx","webpack://charts/./app/controllers/toolbar/drawingSettings.tsx","webpack://charts/./app/controllers/toolbar/drawingTools.ts","webpack://charts/./app/controllers/toolbar/toolbar.tsx","webpack://charts/./app/controllers/toolbar/index.ts","webpack://charts/./app/controllers/toolbar/auto-save-notes/auto-save-notes.tsx","webpack://charts/./app/controllers/toolbar/auto-save-notes/auto-save-notes-dialog.tsx","webpack://charts/./app/controllers/toolbar/confirmation_dialog.tsx","webpack://charts/./app/controllers/toolbar/mobile/tool-button.tsx","webpack://charts/./app/controllers/toolbar/mobile/toolbar-mobile.tsx","webpack://charts/./app/controllers/chart_layout/auto-save-state-indicator.tsx","webpack://charts/./app/controllers/chart_layout/chart-layout-auto-save-note.tsx","webpack://charts/./app/controllers/chart_layout/publish_old_button_click_listener.tsx","webpack://charts/./app/controllers/autosave/idea-leave-dialog.tsx","webpack://charts/./app/controllers/chart_layout/with-chart-route-change.tsx","webpack://charts/./app/controllers/chart_layout/with-complete-layout-model-init.tsx","webpack://charts/./app/controllers/chart_layout/with-quote-cache-management.tsx","webpack://charts/./app/controllers/chart_layout/with-quote-polling.tsx","webpack://charts/./app/controllers/chart_layout/chart_layout_component.tsx","webpack://charts/./app/controllers/with_dialog_state_hook.tsx","webpack://charts/./app/controllers/chart_layout/with-chart-page-title.tsx","webpack://charts/./app/controllers/chart_layout/with-idea-model-state.tsx","webpack://charts/./app/controllers/chart_layout/chart_layout.tsx","webpack://charts/./app/controllers/header/fullscreen_button.tsx","webpack://charts/./app/controllers/header/layout_dropdown.tsx","webpack://charts/./app/helpers/sorter.ts","webpack://charts/./app/controllers/header/theme_toggle_button.tsx","webpack://charts/./app/controllers/header/index.tsx","webpack://charts/./app/controllers/chart-controls/stock-detail-timeframe-bar.tsx","webpack://charts/./app/utils/convert_ta.ts","webpack://charts/./node_modules/@finviz/spine/lib/ sync $^","webpack://charts/./app/components.js","webpack://charts/./app/constants/colors.js","webpack://charts/./app/website-shared.js","webpack://charts/./app/lib-export.js","webpack://charts/./app/canvas/arrow.ts","webpack://charts/./app/canvas/brush/brush_v1.ts","webpack://charts/./app/canvas/callout/callout_utils.ts","webpack://charts/./app/canvas/callout/callout_v1.ts","webpack://charts/./app/canvas/curve.ts","webpack://charts/./app/canvas/ellipse.ts","webpack://charts/./app/canvas/rotated_rectangle.ts","webpack://charts/./app/canvas/symbol.ts","webpack://charts/./app/canvas/drawingTools.ts","webpack://charts/./app/canvas/element.ts","webpack://charts/./app/canvas/elliott_waves/elliott_waves.ts","webpack://charts/./app/canvas/ellipse/ellipse_v1.ts","webpack://charts/./app/canvas/fibonacci_retracements.ts","webpack://charts/./app/canvas/horizontal_line.ts","webpack://charts/./app/canvas/line.ts","webpack://charts/./app/canvas/measure.ts","webpack://charts/./app/canvas/pitchfork/pitchfork_utils.ts","webpack://charts/./app/canvas/pitchfork/pitchfork_v1.ts","webpack://charts/./app/canvas/polygon.ts","webpack://charts/./app/canvas/position.ts","webpack://charts/./app/canvas/rectangle.ts","webpack://charts/./app/canvas/rotated_rectangle/rotated_rectangle_v1.ts","webpack://charts/./app/canvas/scaled_line.ts","webpack://charts/./app/canvas/scaled_text.ts","webpack://charts/./app/canvas/text.ts","webpack://charts/./app/canvas/thumb.ts","webpack://charts/./app/canvas/triangle.ts","webpack://charts/./app/canvas/vertical_line.ts","webpack://charts/./app/canvas/xabcd.ts","webpack://charts/./app/canvas/cache.js","webpack://charts/./app/charts/utils.ts","webpack://charts/./app/charts/base_chart.ts","webpack://charts/./app/charts/candle_stick.ts","webpack://charts/./app/charts/candle_stick_hollow.ts","webpack://charts/./app/charts/heikin_ashi.ts","webpack://charts/./app/charts/line_chart.ts","webpack://charts/./app/charts/market_sentiment.ts","webpack://charts/./app/charts/multi_line_chart.ts","webpack://charts/./app/charts/ohlc_chart.ts","webpack://charts/./app/charts/perf_chart.ts","webpack://charts/./app/charts/charts.ts","webpack://charts/./app/constants/common.ts","webpack://charts/./app/controllers/chart-controls/use-chart-model-custom-date-range-values.tsx","webpack://charts/./app/controllers/chart-controls/use-charts-path-location.ts","webpack://charts/./app/controllers/chart-controls/utils.ts","webpack://charts/./app/controllers/chart-events/badges/chart-badge-svg-by-type.ts","webpack://charts/./app/controllers/chart-events/badges/earnings.ts","webpack://charts/./app/controllers/chart-events/badges/chart-badges-svg-by-type.ts","webpack://charts/./app/controllers/chart-events/badges/split.ts","webpack://charts/./app/controllers/chart-events/badges/dividends.ts","webpack://charts/./app/controllers/chart-events/badges/earnings-positive.ts","webpack://charts/./app/controllers/chart-events/badges/earnings-negative.ts","webpack://charts/./app/controllers/chart-events/badges/earnings-neutral.ts","webpack://charts/./app/controllers/chart-events/badges/earnings-future.ts","webpack://charts/./app/controllers/chart-events/utils.ts","webpack://charts/./app/controllers/chart-settings/async-modules.ts","webpack://charts/./app/utils/chart-date-range-utils.ts","webpack://charts/./app/controllers/renderUtils.ts","webpack://charts/./app/controllers/sidebar/constants.ts","webpack://charts/./app/controllers/sidebar/hooks/sidebar-context.tsx","webpack://charts/./app/controllers/toolbar/interfaces.ts","webpack://charts/./app/controllers/utils.ts","webpack://charts/./app/helpers/atr.ts","webpack://charts/./app/helpers/ema.ts","webpack://charts/./app/chart-events/chart-event.ts","webpack://charts/./app/chart-events/dividends.ts","webpack://charts/./app/chart-events/earnings.ts","webpack://charts/./app/chart-events/split.ts","webpack://charts/./app/chart-events/index.ts","webpack://charts/./app/helpers/get-canvas-element-by-type.ts","webpack://charts/./app/helpers/math.ts","webpack://charts/./app/logger.js","webpack://charts/./app/models/chart-event-element.ts","webpack://charts/./app/models/indicator.ts","webpack://charts/./app/models/overlay.ts","webpack://charts/./app/models/relationships.ts","webpack://charts/./app/index.ts","webpack://charts/./app/indicators/indicator.ts","webpack://charts/./app/utils/canvas-render.ts","webpack://charts/./app/indicators/adx.ts","webpack://charts/./app/indicators/aro.ts","webpack://charts/./app/indicators/aroosc.ts","webpack://charts/./app/indicators/atr.ts","webpack://charts/./app/indicators/cci.ts","webpack://charts/./app/indicators/cot.ts","webpack://charts/./app/indicators/fi.ts","webpack://charts/./app/indicators/macd.ts","webpack://charts/./app/indicators/mfi.ts","webpack://charts/./app/indicators/none.ts","webpack://charts/./app/indicators/obv.ts","webpack://charts/./app/indicators/perf.ts","webpack://charts/./app/indicators/rmi.ts","webpack://charts/./app/indicators/roc.ts","webpack://charts/./app/indicators/rsi.ts","webpack://charts/./app/indicators/rvol.ts","webpack://charts/./app/indicators/rwi.ts","webpack://charts/./app/indicators/stofu.ts","webpack://charts/./app/indicators/stofa.ts","webpack://charts/./app/indicators/stosl.ts","webpack://charts/./app/indicators/trix.ts","webpack://charts/./app/indicators/ult.ts","webpack://charts/./app/indicators/vol.ts","webpack://charts/./app/indicators/wr.ts","webpack://charts/./app/indicators/indicators.ts","webpack://charts/./app/lib/shims.ts","webpack://charts/./app/model-hooks/use-model-state.ts","webpack://charts/./app/models/chart.ts","webpack://charts/./app/models/chart/contstants.ts","webpack://charts/./app/models/chart_layout.ts","webpack://charts/./app/models/chart_settings/constants.ts","webpack://charts/./app/models/chart_settings/be_large_chart_with_overlays.ts","webpack://charts/./app/models/chart_settings/be_large_chart_without_overlays.ts","webpack://charts/./app/models/chart_settings/be_small_chart_with_overlays.ts","webpack://charts/./app/models/chart_settings/be_small_chart_without_overlays.ts","webpack://charts/./app/models/chart_settings/index.ts","webpack://charts/./app/models/chart_settings/interactive_chart_settings.ts","webpack://charts/./app/models/chart_settings/interfaces.ts","webpack://charts/./app/models/constants.ts","webpack://charts/./app/models/drawings-internal-store.ts","webpack://charts/./app/models/element.ts","webpack://charts/./app/models/mouse/mouse-utils.ts","webpack://charts/./app/models/mouse/mouse.ts","webpack://charts/./app/models/pane.ts","webpack://charts/./app/models/quoteCache.ts","webpack://charts/./app/models/quote.ts","webpack://charts/./app/models/quote/constants.ts","webpack://charts/./app/models/settings.ts","webpack://charts/./app/models/utils.ts","webpack://charts/./app/overlays/overlay.ts","webpack://charts/./app/overlays/bb.ts","webpack://charts/./app/overlays/dch.ts","webpack://charts/./app/overlays/ema.ts","webpack://charts/./app/overlays/ema2.ts","webpack://charts/./app/overlays/hilo.ts","webpack://charts/./app/overlays/hline.ts","webpack://charts/./app/overlays/ic.ts","webpack://charts/./app/overlays/icf.ts","webpack://charts/./app/overlays/kch.ts","webpack://charts/./app/overlays/none.ts","webpack://charts/./app/overlays/patterns.ts","webpack://charts/./app/overlays/sar.ts","webpack://charts/./app/overlays/sma.ts","webpack://charts/./app/overlays/sma2.ts","webpack://charts/./app/overlays/str.ts","webpack://charts/./app/overlays/vp.ts","webpack://charts/./app/overlays/vwap.ts","webpack://charts/./app/overlays/overlays.ts","webpack://charts/./app/utils.ts","webpack://charts/./app/utils/abort_controller.ts","webpack://charts/./app/utils/async-modules-utils.tsx","webpack://charts/./app/utils/chart.ts","webpack://charts/./app/utils/colors.ts","webpack://charts/./app/utils/cursor.ts","webpack://charts/./app/utils/draw_in_visible_area.ts","webpack://charts/./app/utils/fetch_api.ts","webpack://charts/./app/utils/force-update.ts","webpack://charts/./app/utils/helpers.ts","webpack://charts/./app/utils/hlc.ts","webpack://charts/./app/utils/query_string.ts","webpack://charts/./app/utils/use-is-mounted.ts","webpack://charts/./types/shared.ts","webpack://charts/external var \"FLibs.DateFns\"","webpack://charts/external var \"FLibs.React\"","webpack://charts/external var \"FLibs.ReactDOM\"","webpack://charts/external var \"FLibs.ReactRouterDOM\"","webpack://charts/external var \"FLibs.classnames\"","webpack://charts/external var \"FLibs.d3\""],"sourcesContent":["import * as React from 'react'\n\nimport { InputColorPicker, convertColorToHEX } from '../components'\n\ninterface BackgroundInputProps {\n label: string\n value: string\n onChange: (color: string) => void\n}\n\nexport function BackgroundInput({ label = 'Background', value, onChange }: BackgroundInputProps) {\n return (\n \n )\n}\n","import React, { useCallback } from 'react'\n\nimport { ObjectHash } from '../../types/shared'\nimport { InputColorPicker, Paragraph, RangeSlider } from '../components'\n\ninterface ColorRangeRowInputProps {\n label: string\n colorValue: string\n colorTestId: string\n rangeValue: string\n rangeTestId: string\n rangeLabel: string\n rangeProps: ObjectHash\n onChange: (colorValue: string, value: string) => void\n}\n\nexport function ColorRangeRowInput({\n label,\n colorValue,\n colorTestId,\n rangeValue,\n rangeTestId,\n rangeLabel,\n rangeProps,\n onChange,\n}: ColorRangeRowInputProps) {\n const handleRangeChange = useCallback(\n (ev) => {\n const value = ev.currentTarget.value\n onChange(colorValue, value)\n },\n [onChange, colorValue]\n )\n const handleColorChange = useCallback(\n (color) => {\n onChange(color, rangeValue)\n },\n [onChange, rangeValue]\n )\n return (\n
\n
\n \n
\n
\n \n {rangeValue}\n \n }\n onChange={handleRangeChange}\n value={rangeValue}\n data-testid={rangeTestId}\n />\n
\n
\n )\n}\n","import * as React from 'react'\n\nimport { convertColorToHEX } from '../components'\nimport { ColorRangeRowInput } from './color_range_row'\n\ninterface Value {\n color: string\n width: string\n}\n\ninterface BorderInputProps {\n label: string\n value: Value\n min: number\n max: number\n onChange: (value: Value) => void\n}\n\nexport function BorderInput({ label = 'Border', value, onChange, min, max }: BorderInputProps) {\n return (\n onChange({ color, width })}\n />\n )\n}\n","import React from 'react'\n\nimport { Checkbox } from '../components'\n\ninterface CheckBoxProps {\n label: string\n value: boolean\n onChange: (isChecked: boolean) => void\n}\n\nexport function CheckBox({ label, value, onChange }: CheckBoxProps) {\n return (\n ) => onChange(ev.currentTarget.checked)}\n data-testid=\"chart-modal-checkbox\"\n >\n {label}\n \n )\n}\n","import React, { useCallback, useState } from 'react'\n\nimport { Checkbox, Input, Select, SelectOption } from '../components'\n\nconst FONT_VALUES = [\n { value: 'Arial', label: 'Arial' },\n { value: 'Verdana', label: 'Verdana' },\n]\n\ninterface InputProps {\n family: string\n size: string\n style: string\n weight: string\n}\n\ninterface FontInputProps {\n value: InputProps\n onChange: (values: InputProps) => void\n}\n\nexport function FontInput({ value, onChange }: FontInputProps) {\n const [family, setFamily] = useState(value.family)\n const [size, setSize] = useState(value.size)\n const [style, setStyle] = useState(value.style)\n const [weight, setWeight] = useState(value.weight)\n\n const setValue = useCallback(\n (key, valueSetter, value) => {\n valueSetter(value)\n onChange({ family, size, style, weight, [key]: value })\n },\n [family, size, style, weight, onChange]\n )\n\n return (\n
\n
\n
\n option.value === value.family)?.value}\n onChange={(selected: { value: string }) => setValue('family', setFamily, selected.value)}\n data-testid=\"chart-modal-font-select\"\n >\n {FONT_VALUES.map((option) => (\n {option.label}\n ))}\n \n
\n ) => setValue('size', setSize, ev.currentTarget.value)}\n value={size}\n data-testid=\"chart-modal-font-size\"\n />\n\n ) =>\n setValue('weight', setWeight, ev.currentTarget.checked ? 'bold' : 'normal')\n }\n data-testid=\"chart-modal-font-weight\"\n >\n Bold\n \n ) =>\n setValue('style', setStyle, ev.currentTarget.checked ? 'italic' : 'normal')\n }\n data-testid=\"chart-modal-font-style\"\n >\n Italic\n \n
\n
\n )\n}\n","import * as React from 'react'\n\nimport { convertColorToHEX } from '../components'\nimport { ColorRangeRowInput } from './color_range_row'\n\ninterface LineInputValue {\n color: string\n width: string\n}\n\ninterface LineInputProps {\n label: string\n value: LineInputValue\n onChange: (value: LineInputValue) => void\n}\n\nexport function LineInput({ label = 'Line', value, onChange }: LineInputProps) {\n return (\n onChange({ color, width })}\n />\n )\n}\n","import React from 'react'\n\nimport { Textarea } from '../components'\n\ninterface MultilineStringInputProps {\n label: string\n value: string\n required: boolean\n onChange: (value: string) => void\n}\n\nexport function MultilineStringInput({ label, value, required, onChange }: MultilineStringInputProps) {\n return (\n ) => onChange(e.target.value)}\n value={value}\n autoFocus\n data-testid=\"chart-modal-multiline-string-textarea\"\n />\n )\n}\n","import React from 'react'\n\nimport { Input } from '../components'\n\ninterface NumberInputProps {\n label: string\n name: string\n value: number\n required: boolean\n min?: number\n max?: number\n allowDecimal?: boolean\n step?: number\n onChange: (value: number) => void\n}\n\nexport function NumberInput(props: NumberInputProps) {\n const { label, name, value, required, min, max, step, allowDecimal = false } = props\n\n return (\n ) =>\n props.onChange(allowDecimal ? parseFloat(e.target.value) : parseInt(e.target.value, 10))\n }\n data-testid=\"chart-modal-number-input\"\n />\n )\n}\n","import React from 'react'\n\nimport { Input } from '../components'\n\ninterface StringInputProps {\n label: string\n name: string\n value: string\n required: boolean\n onChange: (value: string) => void\n}\n\nexport function StringInput(props: StringInputProps) {\n const { label, name, value, required } = props\n\n return (\n ) => props.onChange(e.target.value)}\n data-testid=\"chart-modal-string-textinput\"\n />\n )\n}\n","import React from 'react'\n\nimport { Checkbox, Input, InputColorPicker, convertColorToHEX } from '../components'\n\ninterface InputProps {\n active: boolean\n trend: number\n color: string\n}\n\ninterface trendInputProps {\n value: InputProps\n onChange: (values: InputProps) => void\n}\n\nexport function Trend({ value, onChange }: trendInputProps) {\n return (\n
\n ) => onChange({ ...value, active: ev.currentTarget.checked })}\n data-testid=\"chart-modal-trend-active\"\n />\n ) =>\n onChange({ ...value, trend: ev.currentTarget.valueAsNumber })\n }\n value={value.trend}\n data-testid=\"chart-modal-trend-value\"\n />\n onChange({ ...value, color: color })}\n inputDataTestId=\"chart-modal-trend-color\"\n />\n
\n )\n}\n","import React from 'react'\n\nimport { Checkbox, Input, Paragraph } from '../../components'\nimport { MacroTimeframe } from '../../constants/common'\nimport { DEFAULTS } from './index'\n\nexport interface InputProps {\n macroKey: MacroTimeframe\n isOff: boolean\n from: number\n to: number\n}\n\ninterface VisibilityInputProps {\n value: InputProps\n onChange: (value: InputProps) => void\n isCheckboxOnly: boolean\n}\n\nexport function VisibilityInput({ value, onChange, isCheckboxOnly }: VisibilityInputProps) {\n const [isOff, setIsOff] = React.useState(value.isOff)\n const [from, setFrom] = React.useState(value.from)\n const [to, setTo] = React.useState(value.to)\n const { macroKey } = value\n const macroLabel = macroKey.charAt(0).toUpperCase() + macroKey.slice(1)\n\n const setValue = React.useCallback(\n (key, valueSetter, value) => {\n valueSetter(value)\n onChange({ macroKey, isOff, from, to, [key]: value })\n },\n [macroKey, isOff, from, to, onChange]\n )\n return (\n
\n
\n ) => setValue('isOff', setIsOff, !e.target.checked)}\n >\n {isCheckboxOnly && macroLabel}\n \n {!isCheckboxOnly && (\n <>\n ) =>\n setValue('from', setFrom, Number(ev.currentTarget.value))\n }\n data-testid={`visibility-input-${macroKey}-from`}\n />\n -\n ) =>\n setValue('to', setTo, Number(ev.currentTarget.value))\n }\n data-testid={`visibility-input-${macroKey}-to`}\n />\n {macroLabel}\n \n )}\n
\n
\n )\n}\n","import merge from 'lodash.merge'\nimport React from 'react'\n\nimport { IVisibility, MacroTimeframe, MicroTimeframeRange } from '../../constants/common'\nimport { isInRange } from '../../utils/helpers'\nimport { InputProps, VisibilityInput } from './visibility-input'\n\ninterface VisibilityProps {\n label: string\n name: string\n value: IVisibility\n onChange: (value: IVisibility) => void\n handleDisableSubmit: (value: string | false) => void\n}\n\ntype Micro = { isOff: boolean; from: number; to: number }\nexport type DEFAULTS_TYPE = { [key in MacroTimeframe]: Micro }\n\nexport const DEFAULTS: DEFAULTS_TYPE = {\n // [MacroTimeframe.seconds]: { isOff: false, from: 1, to: 59 },\n [MacroTimeframe.minutes]: { isOff: false, from: 1, to: 59 },\n [MacroTimeframe.hours]: { isOff: false, from: 1, to: 24 },\n [MacroTimeframe.days]: { isOff: false, from: 1, to: 366 },\n [MacroTimeframe.weeks]: { isOff: false, from: 1, to: 52 },\n [MacroTimeframe.months]: { isOff: false, from: 1, to: 12 },\n}\n\nconst INPUTS_AVAILABLE = [MacroTimeframe.minutes, MacroTimeframe.hours]\n\nconst getInitialState = (value: IVisibility) => {\n const visibilities = merge({}, DEFAULTS)\n for (const visibility in visibilities) {\n const macroTimeframe = visibility as MacroTimeframe\n const valueMacroTimeframe = value?.[macroTimeframe]\n if (!valueMacroTimeframe) continue\n if (Object.keys(valueMacroTimeframe).length === 0) {\n visibilities[macroTimeframe] = { ...visibilities[macroTimeframe], isOff: true }\n } else {\n visibilities[macroTimeframe] = { ...visibilities[macroTimeframe], ...valueMacroTimeframe }\n }\n }\n return visibilities\n}\n\nconst getIsVisibilityOutsideAvailableTimeframes = (value: IVisibility) => {\n const result = Object.keys(MacroTimeframe).every((macrotimeframe) => {\n const macroRange = value[macrotimeframe as MacroTimeframe]\n\n return (\n macroRange &&\n (Object.keys(macroRange).length === 0 ||\n !MicroTimeframeRange[macrotimeframe as MacroTimeframe].some((item) =>\n isInRange({\n value: item,\n min: macroRange?.from ?? DEFAULTS[macrotimeframe as MacroTimeframe].from,\n max: macroRange?.to ?? DEFAULTS[macrotimeframe as MacroTimeframe].to,\n })\n ))\n )\n })\n return result\n}\n\nexport function Visibility(props: VisibilityProps) {\n const initialVisibilityRef = React.useRef(getInitialState(props.value))\n\n const handleChange = (value: InputProps) => {\n const result: IVisibility = props.value ? merge({}, props.value) : {}\n result[value.macroKey] = {}\n\n if (value.isOff) {\n props.onChange(result)\n } else if (value.from === DEFAULTS[value.macroKey].from && value.to === DEFAULTS[value.macroKey].to) {\n delete result[value.macroKey]\n props.onChange(result)\n } else {\n if (value.from !== DEFAULTS[value.macroKey].from) {\n result[value.macroKey]!.from = value.from\n }\n if (value.to !== DEFAULTS[value.macroKey].to) {\n result[value.macroKey]!.to = value.to\n }\n props.onChange(result)\n }\n\n props.handleDisableSubmit(\n getIsVisibilityOutsideAvailableTimeframes(result)\n ? 'The chosen timeframes would make the drawing invisible on all supported timeframes.'\n : false\n )\n }\n\n return Object.keys(initialVisibilityRef.current).map((macroKey) => (\n \n ))\n}\n","import debounce from 'lodash.debounce'\nimport * as React from 'react'\n\nimport { ObjectHash } from '../../types/shared'\nimport CanvasElement from '../canvas/element'\nimport { Button, ButtonGroup, Dialog, DialogBody, DialogFooter, DialogHeader, useDialogState } from '../components'\nimport { BackgroundInput } from './background'\nimport { BorderInput } from './border'\nimport { CheckBox } from './checkbox'\nimport { FontInput } from './font'\nimport { LineInput } from './line'\nimport { MultilineStringInput } from './multiline_string'\nimport { NumberInput } from './number'\nimport { StringInput } from './string'\nimport { Trend } from './trend'\nimport { Visibility } from './visibility'\n\n/**\n * Dialogs require element to restore focus when closing. Restore focus to the\n * currently selected chart or body\n */\nfunction getElementToFocus() {\n return document.querySelector('.chart.active') ?? document.body\n}\n\nfunction getInputForType(type: string) {\n switch (type) {\n case 'number':\n return NumberInput\n case 'string':\n return StringInput\n case 'text':\n return StringInput\n case 'background':\n return BackgroundInput\n case 'border':\n return BorderInput\n case 'line':\n return LineInput\n case 'multiline_string':\n return MultilineStringInput\n case 'font':\n return FontInput\n case 'checkbox':\n return CheckBox\n case 'trend':\n return Trend\n case 'visibility':\n return Visibility\n default:\n return () =>
ERROR: Unknown input type
\n }\n}\n\nconst TAB_BUTTON_COMMON_PROPS = { type: 'button', className: 'flex-1', contentClass: 'text-center' }\n\ntype OnSubmitType = ((value: ObjectHash) => void) | null\ntype OnDismissType = (() => void) | null\n\nexport interface ElementStyleDialogProps {\n state: any\n element: ElementType\n onSubmit: ((values: ElementType['attrs']) => void) | null\n onDismiss: (() => void) | null\n onHide: () => void\n}\n\nexport type StyleDialogOpener = (\n element: ElementType,\n onSubmit: ElementStyleDialogProps['onSubmit'],\n onDismiss: ElementStyleDialogProps['onDismiss']\n) => void\n\nfunction getValuesFromFormState(formState: ObjectHash) {\n return formState.reduce((acc: ObjectHash, cur: ObjectHash) => {\n acc[cur.name] = cur.value\n return acc\n }, {} as ObjectHash)\n}\n\nenum DialogTabs {\n Style,\n Visibility,\n}\n\nexport function ElementStyleDialog(props: ElementStyleDialogProps) {\n const config = props.element.getModalConfig()\n const initialFormStateRef = React.useRef[]>(JSON.parse(JSON.stringify(config.inputs)))\n const [formState, setFormState] = React.useState[]>(config.inputs)\n const finalFocusRef = React.useRef(getElementToFocus())\n const [selectedTab, setSelectedTab] = React.useState(DialogTabs.Style)\n const [isSubmitDisabled, setIsSubmitDisabled] = React.useState(false) // If string, the value is used as title for disabled button.\n\n const isDrawingElement = props.element.getIsDrawing()\n\n React.useEffect(() => {\n props.element.isEditInProgress = true\n return () => {\n props.element.isEditInProgress = false\n props.element.trigger('change', props.element)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const handleValuesChange = React.useCallback(\n ({\n values,\n shouldSubmit = false,\n shouldDismiss = false,\n }: {\n values: ObjectHash\n shouldSubmit?: boolean\n shouldDismiss?: boolean\n }) => {\n const hasOnSubmit = typeof props.onSubmit === 'function'\n const hasOnDismiss = typeof props.onDismiss === 'function'\n\n props.element.set(values)\n if (shouldSubmit && hasOnSubmit) {\n props.onSubmit!(values)\n } else if (shouldDismiss && hasOnDismiss) {\n props.onDismiss!()\n }\n\n if (shouldSubmit || shouldDismiss) {\n props.state.hide()\n }\n },\n [props]\n )\n\n const handleValuesChangeDebounceRef = React.useRef(\n debounce(\n (newFormState) => {\n const values = getValuesFromFormState(newFormState)\n handleValuesChange({ values })\n },\n 50,\n { maxWait: 100 }\n )\n )\n\n React.useEffect(\n () => () => {\n handleValuesChangeDebounceRef.current.cancel()\n },\n []\n )\n\n const onSubmit: React.FormEventHandler = React.useCallback(\n (ev: React.FormEvent) => {\n ev.preventDefault()\n if (ev.currentTarget.checkValidity()) {\n const values = getValuesFromFormState(formState)\n handleValuesChange({ values, shouldSubmit: true })\n }\n },\n [formState, handleValuesChange]\n )\n\n const handleCloseDialog = React.useCallback(() => {\n const values = getValuesFromFormState(initialFormStateRef.current)\n handleValuesChange({ values, shouldDismiss: true })\n }, [handleValuesChange])\n\n const getShouldRenderInputForTab = (inputType: string) => {\n if (selectedTab === DialogTabs.Visibility && inputType === 'visibility') return true\n if (selectedTab !== DialogTabs.Visibility && inputType !== 'visibility') return true\n return false\n }\n\n return (\n \n {config.title}\n
\n \n {isDrawingElement && (\n \n setSelectedTab(DialogTabs.Style)}\n data-testid=\"dialog-tab-button-style\"\n >\n Style\n \n setSelectedTab(DialogTabs.Visibility)}\n data-testid=\"dialog-tab-button-visibility\"\n >\n Visibility\n \n \n )}\n\n {formState.map((input) => {\n const InputComponent = getInputForType(input.type) as React.FC<{\n onChange: (value: string) => void\n handleDisableSubmit?: typeof setIsSubmitDisabled\n }>\n return (\n getShouldRenderInputForTab(input.type) && (\n {\n setFormState((prevState) => {\n const newFormState = prevState.map((stateInput) => {\n if (stateInput.name === input.name) {\n return { ...stateInput, value }\n }\n return stateInput\n })\n handleValuesChangeDebounceRef.current(newFormState)\n return newFormState\n })\n }}\n handleDisableSubmit={setIsSubmitDisabled}\n />\n )\n )\n })}\n \n \n \n Close\n \n \n Save\n \n \n
\n \n )\n}\n\nexport const ElementStyleDialogContext = React.createContext>(() => {})\n\nexport function withElementStyleDialogState

(Component: React.ComponentType

) {\n return function WrappedComponent(props: P) {\n const context = React.useContext(ElementStyleDialogContext)\n\n return \n }\n}\n\nexport function ElementStyleDialogWrapper(props: { children: React.ReactNode }) {\n const [element, setElement] = React.useState(null)\n const [onSubmit, setOnSubmit] = React.useState(null)\n const [onDismiss, setOnDismiss] = React.useState(null)\n const dialog = useDialogState({ modal: false })\n\n const openDialog = (element: CanvasElement, onSubmit?: OnSubmitType, onDismiss?: OnDismissType) => {\n if (onSubmit) {\n setOnSubmit(() => onSubmit)\n }\n if (onDismiss) {\n setOnDismiss(() => onDismiss)\n }\n\n setElement(element)\n dialog.show()\n }\n\n const onHide = () => {\n setElement(null)\n setOnSubmit(null)\n setOnDismiss(null)\n }\n\n return (\n \n {props.children}\n {element && (\n \n )}\n \n )\n}\n","import { ChartConfigChartPane } from '../../../types/shared'\nimport { IndicatorType } from '../../constants/common'\nimport ChartLayout from '../../models/chart_layout'\nimport Element from '../../models/element'\nimport PaneModel from '../../models/pane'\nimport { HLC, compareHlc, incrementHlc, receiveHlc } from '../../utils/hlc'\nimport {\n AutoSaveChangeType,\n AutoSaveElement,\n AutoSaveElementDBRecord,\n DrawingChangeTimestamp,\n DrawingContainerType,\n} from './constants'\n\nexport function getContainerTypeFromPaneConfig(pane: ChartConfigChartPane) {\n const indicatorElement = pane.elements.find((el) => el.type.startsWith('indicators/'))\n if (indicatorElement) {\n return indicatorElement.type as DrawingContainerType\n }\n const chartElement = pane.elements.find((el) => el.type.startsWith('charts/'))\n if (chartElement) {\n return 'chart'\n }\n return null\n}\n\nexport function getContainerType(model: PaneModel) {\n const mainElement = model.mainElement()\n const indicatorType = mainElement?.instance?.type ?? null\n if (mainElement?.isIndicator() && indicatorType !== IndicatorType.None) {\n return indicatorType as DrawingContainerType\n }\n if (mainElement?.isChart()) {\n return 'chart'\n }\n return null\n}\n\nexport function updateInternalStoreWithChangedElement({\n element,\n changeType,\n currentInternalStore,\n lastUpdateTimestamp,\n}: {\n element: Element\n changeType: AutoSaveChangeType\n currentInternalStore: AutoSaveElement[]\n lastUpdateTimestamp: HLC\n}) {\n const paneModel = element.pane()\n const ticker = paneModel.getQuoteRawTicker()\n const containerType = getContainerType(paneModel)\n if (ticker && paneModel && containerType && (!element.destroyed || changeType === 'destroy')) {\n const instanceJson = element.instance.toAutosaveConfig()\n const newDrawing: AutoSaveElement = {\n elementId: element.elementId!,\n zIndex: element.zIndex,\n ticker,\n lastChange: lastUpdateTimestamp,\n changeType,\n containerType,\n elementAttrs: JSON.stringify(instanceJson),\n }\n\n const newInternalStore = [...currentInternalStore]\n const updateDrawingIndex = newInternalStore.findIndex(\n (drawingElement) => drawingElement.elementId === newDrawing.elementId\n )\n\n let shouldSyncAndSave = false\n if (updateDrawingIndex > -1) {\n const updatedRecord = newInternalStore[updateDrawingIndex]\n const hasChangedZIndex = updatedRecord.zIndex !== newDrawing.zIndex\n const hasChangedType = updatedRecord.changeType !== newDrawing.changeType\n const hasChangedAttrs = updatedRecord.elementAttrs !== newDrawing.elementAttrs\n const hasChange = hasChangedType || hasChangedAttrs || hasChangedZIndex\n if (\n !element.instance.isEditInProgress &&\n updatedRecord.ticker === ticker &&\n hasChange &&\n updatedRecord.changeType !== 'destroy'\n ) {\n newInternalStore[updateDrawingIndex] = newDrawing\n shouldSyncAndSave = true\n }\n } else {\n newInternalStore.push(newDrawing)\n shouldSyncAndSave = true\n }\n\n return {\n newInternalStore,\n shouldSyncAndSave,\n newDrawing,\n }\n }\n}\n\nexport function getTickersAndContainerTypesInLayoutModel(chartLayout: ChartLayout) {\n const tickers: string[] = []\n const containerTypes: Array = ['note']\n\n chartLayout.getAllPanes().forEach((paneModel) => {\n const ticker = paneModel.getQuoteRawTicker()\n const containerType = getContainerType(paneModel)\n if (ticker && !tickers.includes(ticker)) {\n tickers.push(ticker)\n }\n if (containerType && !containerTypes.includes(containerType)) {\n containerTypes.push(containerType)\n }\n })\n return { tickers, containerTypes }\n}\n\nexport function mergeUpdatedDrawingsToInternalStore({\n updatedDrawings,\n currentInternalStore,\n lastUpdateTimestamp,\n isRefetchAll,\n}: {\n updatedDrawings: AutoSaveElement[]\n currentInternalStore: AutoSaveElement[]\n lastUpdateTimestamp: DrawingChangeTimestamp\n isRefetchAll: boolean\n}) {\n let newLastUpdateTimestamp = lastUpdateTimestamp\n const newInternalStore = [...currentInternalStore]\n const updatedElementIds: string[] = []\n\n updatedDrawings.forEach((drawing) => {\n newLastUpdateTimestamp = receiveHlc(newLastUpdateTimestamp, drawing.lastChange)\n const drawingIndex = newInternalStore.findIndex(({ elementId }) => drawing.elementId === elementId)\n const currentDrawing = drawingIndex > -1 ? newInternalStore[drawingIndex] : null\n if (currentDrawing === null) {\n newInternalStore.push(drawing)\n updatedElementIds.push(drawing.elementId)\n } else if (currentDrawing.containerType === 'note' && isRefetchAll) {\n const currentNote = getElementNoteText(currentDrawing)\n const autoSavedNote = getElementNoteText(drawing)\n if (currentNote !== autoSavedNote) {\n newInternalStore[drawingIndex] = {\n ...drawing,\n lastChange: incrementHlc(receiveHlc(currentDrawing.lastChange, drawing.lastChange), Date.now()),\n elementAttrs: JSON.stringify({\n ...JSON.parse(drawing.elementAttrs),\n text: `${currentNote}\\r\\n${autoSavedNote}`,\n }),\n }\n }\n updatedElementIds.push(drawing.elementId)\n } else if (compareHlc(newInternalStore[drawingIndex].lastChange, drawing.lastChange) < 0) {\n newInternalStore[drawingIndex] = drawing\n updatedElementIds.push(drawing.elementId)\n }\n })\n return { newLastUpdateTimestamp, newInternalStore, updatedElementIds }\n}\n\nexport function getInitialStoreDrawings(): null | AutoSaveElement[] {\n const initialDrawings = (\n window.FinvizSettings?.initialDrawingsStore ?? window.FinvizChartsSettings?.initialDrawingsStore\n )?.drawings as null | AutoSaveElementDBRecord[]\n\n return initialDrawings?.map((item) => getAutosaveElementFromDBRecord(item)) ?? null\n}\n\nexport function handleCallMethodOnAllDrawings({\n chartLayoutModel,\n elementMethod,\n}: {\n chartLayoutModel: ChartLayout\n elementMethod: keyof Pick\n}) {\n chartLayoutModel.getAllElements().forEach((element) => {\n if (element.isDrawing()) {\n element[elementMethod]()\n }\n })\n}\n\nexport function getNoteElementId(ticker: string) {\n return `note-${ticker}`\n}\n\nexport function getElementNoteText(noteElement?: AutoSaveElement) {\n return (noteElement ? JSON.parse(noteElement.elementAttrs)?.text : '') ?? ''\n}\n\nexport function getTickerNoteText({ ticker, elements }: { ticker: string; elements: AutoSaveElement[] }) {\n const noteElement = elements.find(({ elementId }) => elementId === getNoteElementId(ticker))\n return getElementNoteText(noteElement)\n}\n\nexport function getAutosaveElementFromDBRecord(item: AutoSaveElementDBRecord): AutoSaveElement {\n return {\n elementId: item.elementId,\n ticker: item.ticker,\n zIndex: item.zIndex,\n changeType: item.changeType,\n containerType: item.containerType,\n elementAttrs: item.elementAttrs,\n lastChange: {\n ts: item.lastChangeTimestamp,\n count: item.lastChangeCounter,\n uuid: item.lastChangeNodeUUID,\n },\n }\n}\n\nexport function getDBRecordFromAutosaveElement(item: AutoSaveElement): Omit {\n return {\n elementId: item.elementId,\n ticker: item.ticker,\n zIndex: item.zIndex,\n changeType: item.changeType,\n containerType: item.containerType,\n elementAttrs: JSON.stringify(item.elementAttrs),\n lastChangeTimestamp: item.lastChange.ts,\n lastChangeCounter: item.lastChange.count,\n lastChangeNodeUUID: item.lastChange.uuid,\n }\n}\n","import { IndicatorType } from '../../constants/common'\nimport { HLC } from '../../utils/hlc'\n\nexport type DrawingChangeTimestamp = HLC\nexport type DrawingContainerType = IndicatorType | 'chart' | 'note' | null\nexport type AutoSaveChangeType = 'update' | 'destroy'\n\nexport interface AutoSaveElement {\n elementId: string\n ticker: string\n zIndex: number\n lastChange: DrawingChangeTimestamp\n changeType: AutoSaveChangeType\n containerType: DrawingContainerType\n elementAttrs: string\n}\n\nexport type AutoSaveElementDBRecord = Omit & { lastChange: string } & {\n lastChangeTimestamp: number\n lastChangeCounter: number\n lastChangeNodeUUID: string\n}\n\nexport const DRAWINGS_UPDATE_INTERVAL_MS = process.env.IS_E2E_TESTING ? 3000 : 15000\nexport const DRAWINGS_SAVE_INTERVAL_MS = 250\n","import React from 'react'\n\nimport fetchApi, {\n ContentType,\n ForbiddenError,\n GenericStatusCodeError,\n InternalServerError,\n} from '../../utils/fetch_api'\nimport { getUuid } from '../../utils/helpers'\nimport { HLC, compareHlc, incrementHlc } from '../../utils/hlc'\nimport { getByteLengthOfString } from '../../utils/string-byte-length'\nimport { AutoSaveElement, AutoSaveElementDBRecord, DrawingContainerType } from './constants'\nimport { getAutosaveElementFromDBRecord, getDBRecordFromAutosaveElement } from './utils'\n\nconst RETRY_LIMIT = 5\n\nexport function useDrawingAutoSaveApi() {\n const postRetryCountRef = React.useRef(0)\n const deleteRetryCountRef = React.useRef(0)\n\n const fetchDrawings = React.useCallback(\n async ({\n tickers,\n containerTypes,\n lastChange,\n }: {\n tickers: string[]\n containerTypes: DrawingContainerType[]\n lastChange: HLC\n }) => {\n try {\n const data = await fetchApi<{\n drawings: AutoSaveElementDBRecord[]\n }>({\n location: '/api/auto_save.ashx',\n queryParameters: {\n ticker: tickers.join(','),\n containerTypes: containerTypes.join(',') || undefined,\n lastChangeTimestamp: lastChange.ts,\n lastChangeCounter: lastChange.count,\n lastChangeNodeUUID: lastChange.uuid,\n },\n throwOnStatusCodes: [403, 404],\n })\n return data.drawings.map((drawing) => getAutosaveElementFromDBRecord(drawing))\n } catch {\n // ignore error\n }\n\n return []\n },\n []\n )\n\n const saveDrawings = React.useCallback(async (drawings: AutoSaveElement[]): Promise => {\n if (drawings.length === 0) {\n return undefined\n }\n\n try {\n const bodyJsonString = JSON.stringify(drawings.map((item) => getDBRecordFromAutosaveElement(item)))\n let keepalive = false\n try {\n keepalive = getByteLengthOfString(bodyJsonString) < 64000\n } catch (error: any) {\n window.Sentry?.captureException(error)\n }\n await fetchApi({\n location: '/api/auto_save.ashx',\n method: 'POST',\n throwOnStatusCodes: [400, 403, 404, 500],\n contentType: ContentType.ApplicationJson,\n body: bodyJsonString,\n keepalive,\n })\n const [latestChangeHlc] = [...drawings].sort((a, b) => compareHlc(b.lastChange, a.lastChange))\n postRetryCountRef.current = 0\n return latestChangeHlc.lastChange\n } catch (error) {\n if (error instanceof InternalServerError) {\n // try again\n if (postRetryCountRef.current < RETRY_LIMIT) {\n postRetryCountRef.current = postRetryCountRef.current + 1\n await new Promise((r) => setTimeout(r, 1000))\n return saveDrawings(drawings)\n } else {\n // continue to report to Sentry\n postRetryCountRef.current = 0\n }\n } else if (error instanceof ForbiddenError) {\n // ignore error\n return undefined\n }\n\n // report error to Sentry\n window.Sentry?.captureException(error, {\n extra: (error instanceof GenericStatusCodeError\n ? (error.response as ObjectHash).invalidItems\n : drawings\n ).reduce(\n (acc: ObjectHash, cur: ObjectHash, index: number) => ({ ...acc, [`item-${index}`]: JSON.stringify(cur) }),\n {} as ObjectHash\n ),\n })\n\n return undefined\n }\n }, [])\n\n const deleteAllDrawings = React.useCallback(\n async ({ tickers, lastLocalChange }: { tickers: string[]; lastLocalChange: HLC }): Promise => {\n try {\n const newHlc = {\n ...incrementHlc(lastLocalChange, Date.now()),\n uuid: getUuid(), // we provide new UUID for HLC so we can fetch 'destroy' changes in next GET request\n }\n await fetchApi({\n location: `/api/auto_save.ashx?ticker=${tickers.join(',')}&lastChangeTimestamp=${\n newHlc.ts\n }&lastChangeCounter=${newHlc.count}&lastChangeNodeUUID=${newHlc.uuid}`,\n method: 'DELETE',\n throwOnStatusCodes: [403, 404, 500],\n keepalive: true,\n })\n deleteRetryCountRef.current = 0\n } catch (error) {\n if (error instanceof InternalServerError) {\n // try again\n if (deleteRetryCountRef.current < RETRY_LIMIT) {\n deleteRetryCountRef.current = deleteRetryCountRef.current + 1\n await new Promise((r) => setTimeout(r, 1000))\n return deleteAllDrawings({ tickers, lastLocalChange })\n } else {\n // continue to report to Sentry\n deleteRetryCountRef.current = 0\n }\n } else if (error instanceof ForbiddenError) {\n // ignore error\n return\n }\n\n // report error to Sentry\n window.Sentry?.captureException(error)\n }\n },\n []\n )\n\n return { fetchDrawings, saveDrawings, deleteAllDrawings }\n}\n","// byteLengthCharCode2 from https://stackoverflow.com/a/63893237\n\nexport function getByteLengthOfString(s: string) {\n //assuming the String is UCS-2(aka UTF-16) encoded\n let n = 0\n for (let i = 0, l = s.length; i < l; i++) {\n const hi = s.charCodeAt(i)\n if (hi < 0x0080) {\n n += 1\n } else if (hi < 0x0800) {\n n += 2\n } else if (hi < 0xd800) {\n n += 3\n } else if (hi < 0xdc00) {\n const lo = s.charCodeAt(++i)\n if (i < l && lo >= 0xdc00 && lo <= 0xdfff) {\n n += 4\n } else {\n throw new Error('UCS-2 String malformed')\n }\n } else if (hi < 0xe000) {\n throw new Error('UCS-2 String malformed')\n } else {\n n += 3\n }\n }\n return n\n}\n","import React from 'react'\n\nimport { DrawingSpineOptions, DrawingSpineOptionsEvent } from '../../../types/shared'\nimport ElementCanvas from '../../canvas/element'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { getCanvasElementByType } from '../../helpers/get-canvas-element-by-type'\nimport ChartLayout from '../../models/chart_layout'\nimport { AutoSaveState } from '../../models/constants'\nimport Element from '../../models/element'\nimport { compareHlc, incrementHlc, initHlc, receiveHlc } from '../../utils/hlc'\nimport { AutoSaveChangeType, AutoSaveElement, DRAWINGS_SAVE_INTERVAL_MS } from './constants'\nimport { useDrawingAutoSaveApi } from './use-drawing-autosave-api'\nimport { useIsAutoSaveActive } from './use-is-auto-save-active'\nimport {\n getContainerType,\n getNoteElementId,\n getTickerNoteText,\n getTickersAndContainerTypesInLayoutModel,\n mergeUpdatedDrawingsToInternalStore,\n updateInternalStoreWithChangedElement,\n} from './utils'\n\nexport function useDrawingAutoSaveControls(chartLayout: ChartLayout) {\n const { fetchDrawings, saveDrawings, deleteAllDrawings } = useDrawingAutoSaveApi()\n const isAutoSaveActive = useIsAutoSaveActive(chartLayout)\n const drawingsInternalStore = React.useMemo(() => chartLayout.drawingsInternalStore(), [chartLayout])\n const saveTimeoutRef = React.useRef()\n\n React.useEffect(\n () => () => {\n if (saveTimeoutRef.current) {\n clearTimeout(saveTimeoutRef.current)\n }\n },\n []\n )\n\n const saveLatestChanges = React.useCallback(\n (\n withDelayInMs = DRAWINGS_SAVE_INTERVAL_MS,\n saveQueueExtraFilterCallback: ((item: AutoSaveElement) => boolean) | null = null\n ) => {\n if (saveTimeoutRef.current) {\n clearTimeout(saveTimeoutRef.current)\n }\n const saveQueue = drawingsInternalStore.elements.filter(\n (item) =>\n compareHlc(item.lastChange, drawingsInternalStore.latestLocalUpdateTimestamp) > 0 &&\n item.lastChange.uuid === drawingsInternalStore.instanceUUID &&\n (saveQueueExtraFilterCallback === null || saveQueueExtraFilterCallback(item))\n )\n if (saveQueue.length === 0) {\n return\n }\n\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Unsaved)\n\n const save = async () => {\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Saving)\n const result = await saveDrawings(saveQueue)\n if (result) {\n drawingsInternalStore.updateAttributes({\n latestLocalUpdateTimestamp: receiveHlc(drawingsInternalStore.latestLocalUpdateTimestamp, result),\n })\n }\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Saved)\n\n return result\n }\n\n if (withDelayInMs === 0) {\n return save()\n }\n\n saveTimeoutRef.current = setTimeout(save, withDelayInMs)\n },\n [saveDrawings, drawingsInternalStore]\n )\n\n const syncChartLayoutDrawings = React.useCallback(\n (drawing: AutoSaveElement) => {\n if (drawing.containerType === 'note') {\n return\n }\n const isRemove = drawing.changeType === 'destroy'\n\n chartLayout.getAllPanes().forEach((paneModel) => {\n const ticker = paneModel.getQuoteRawTicker()\n const paneContainerType = getContainerType(paneModel)\n if (!paneContainerType || drawing.ticker !== ticker) {\n return\n }\n const paneInternalStoreElements = drawingsInternalStore.elements.filter(\n (autoSaveElement) => autoSaveElement.ticker === ticker && autoSaveElement.containerType === paneContainerType\n )\n const paneElements = paneModel.getAllElements()\n let element: Element | undefined\n paneElements.forEach((paneElement) => {\n if (paneElement.isDrawing() && !paneElement.instance.isCreator) {\n const paneDrawing = paneInternalStoreElements.find(({ elementId }) => elementId === paneElement.elementId)\n if (!paneDrawing || paneDrawing.changeType === 'destroy') {\n paneElement.destroyCascade()\n } else if (paneElement.elementId && paneElement.elementId === drawing.elementId) {\n element = paneElement\n }\n }\n })\n\n const parsedElementAttrs = JSON.parse(drawing.elementAttrs)\n if (element) {\n if (drawing.elementAttrs !== JSON.stringify(element.instance.toAutosaveConfig())) {\n if (element.pane().selection !== element.instance && !element.hasOngoingInteraction()) {\n element.instance.set(parsedElementAttrs)\n element.instance.updateScales()\n }\n }\n if (drawing.zIndex !== element.zIndex) {\n element.updateAttributes({ zIndex: drawing.zIndex })\n }\n if (isRemove || paneContainerType !== drawing.containerType) {\n element.destroyCascade()\n }\n } else if (!isRemove && paneContainerType === drawing.containerType) {\n const instance = getCanvasElementByType(parsedElementAttrs.type).fromObject(\n parsedElementAttrs,\n paneModel\n ) as ElementCanvas\n paneModel.elements().create({ elementId: drawing.elementId, instance, zIndex: drawing.zIndex })\n instance.updateScales()\n }\n })\n },\n [chartLayout, drawingsInternalStore]\n )\n\n const handleAutoSaveNoteChange = React.useCallback(\n (note: string, ticker?: string) => {\n if (ticker) {\n const newNoteElement: AutoSaveElement = {\n elementId: getNoteElementId(ticker),\n zIndex: 0,\n ticker: ticker,\n lastChange: incrementHlc(drawingsInternalStore.latestLocalUpdateTimestamp, Date.now()),\n changeType: 'update',\n containerType: 'note',\n elementAttrs: JSON.stringify({ text: note }),\n }\n\n drawingsInternalStore.updateAttributes({\n elements: [\n ...drawingsInternalStore.elements.filter(({ elementId }) => elementId !== newNoteElement.elementId),\n newNoteElement,\n ],\n })\n }\n },\n [drawingsInternalStore]\n )\n\n const handleIdeaNoteChange = React.useCallback(\n (note: string) => {\n if (chartLayout.idea?.note !== note && (chartLayout.idea || note)) {\n chartLayout.updateAttribute('idea', { ...chartLayout.idea, note })\n handleAutoSaveNoteChange(note, chartLayout.activeChart?.getQuoteRawTicker() ?? undefined)\n }\n },\n [chartLayout, handleAutoSaveNoteChange]\n )\n\n const checkDrawingUpdate = React.useCallback(\n async (isRefetchAll = false) => {\n const { tickers, containerTypes } = getTickersAndContainerTypesInLayoutModel(chartLayout)\n if (isRefetchAll) {\n drawingsInternalStore.updateAttributes({\n latestRemoteUpdateTimestamp: initHlc(drawingsInternalStore.instanceUUID, 0),\n })\n }\n\n const updatedDrawings = await fetchDrawings({\n tickers,\n containerTypes,\n lastChange: drawingsInternalStore.latestRemoteUpdateTimestamp,\n })\n const { newLastUpdateTimestamp, updatedElementIds, newInternalStore } = mergeUpdatedDrawingsToInternalStore({\n updatedDrawings,\n currentInternalStore: drawingsInternalStore.elements,\n lastUpdateTimestamp: drawingsInternalStore.latestRemoteUpdateTimestamp,\n isRefetchAll,\n })\n\n drawingsInternalStore.updateAttributes({\n // Even if there are no changes in elements, newInternalStore is new array with the same content which may cause unnecessary rerenders\n ...(updatedElementIds.length > 0 ? { elements: newInternalStore } : {}),\n latestRemoteUpdateTimestamp: newLastUpdateTimestamp,\n latestLocalUpdateTimestamp:\n isRefetchAll && newInternalStore.length > 0\n ? receiveHlc(drawingsInternalStore.latestLocalUpdateTimestamp, newLastUpdateTimestamp)\n : drawingsInternalStore.latestLocalUpdateTimestamp,\n })\n\n if (updatedElementIds.length > 0 || isRefetchAll) {\n saveLatestChanges(0)\n const allElements = chartLayout.getAllElements()\n updatedElementIds.forEach((elementId) => {\n const element = allElements.find((element) => element.elementId === elementId)\n\n if (element && element.isDrawing() && !element.hasOngoingInteraction()) {\n element.destroyCascade()\n }\n })\n\n drawingsInternalStore.elements.forEach(syncChartLayoutDrawings)\n chartLayout.getAllPanes().forEach((paneModel) => {\n paneModel.normalizeZIndexes()\n })\n\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage) {\n const activeTicker = chartLayout.activeChart?.getQuoteRawTicker() ?? ''\n handleIdeaNoteChange(getTickerNoteText({ ticker: activeTicker, elements: newInternalStore }))\n }\n }\n },\n [\n chartLayout,\n drawingsInternalStore,\n syncChartLayoutDrawings,\n fetchDrawings,\n handleIdeaNoteChange,\n saveLatestChanges,\n ]\n )\n\n const updateInternalStoreWithElement = React.useCallback(\n (element: Element, changeType: AutoSaveChangeType) => {\n const updateResult = updateInternalStoreWithChangedElement({\n element,\n changeType,\n currentInternalStore: drawingsInternalStore.elements,\n lastUpdateTimestamp: incrementHlc(\n receiveHlc(\n drawingsInternalStore.latestLocalUpdateTimestamp,\n drawingsInternalStore.latestRemoteUpdateTimestamp\n ),\n Date.now()\n ),\n })\n\n if (updateResult) {\n const { shouldSyncAndSave, newInternalStore, newDrawing } = updateResult\n if (shouldSyncAndSave) {\n drawingsInternalStore.updateAttributes({ elements: newInternalStore })\n syncChartLayoutDrawings(newDrawing)\n }\n }\n },\n [syncChartLayoutDrawings, drawingsInternalStore]\n )\n\n const deleteAllAutoSavedElements = React.useCallback(async () => {\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayout)\n\n await deleteAllDrawings({ tickers, lastLocalChange: drawingsInternalStore.latestLocalUpdateTimestamp })\n await checkDrawingUpdate()\n }, [chartLayout, deleteAllDrawings, drawingsInternalStore, checkDrawingUpdate])\n\n const onElementChange = React.useCallback(\n (element: Element, _?: any, options?: DrawingSpineOptions) => {\n const elementPane = element.pane()\n // This may happen if pane had been removed already, in most cases \"element.destroyed\" should be true,\n // but we would need to check if it was destroyed by delete drawing action or not, and checking if pane exists covers all cases\n if (!element.isDrawing() || element.instance.isCreator || !elementPane) {\n return\n }\n const elementContainerType = getContainerType(elementPane)\n const elementPaneTicker = elementPane.getQuoteRawTicker()\n const isElementInCurrentChartLayout = chartLayout\n .getAllPanes()\n .some(\n (model) => getContainerType(model) === elementContainerType && model.getQuoteRawTicker() === elementPaneTicker\n )\n if (isElementInCurrentChartLayout) {\n const isRemove = options?.eventType === DrawingSpineOptionsEvent.Remove\n updateInternalStoreWithElement(element, isRemove ? 'destroy' : 'update')\n }\n },\n [updateInternalStoreWithElement, chartLayout]\n )\n\n return {\n drawingsInternalStore,\n onElementChange,\n handleIdeaNoteChange,\n deleteAllAutoSavedElements,\n isAutoSaveActive,\n handleAutoSaveNoteChange,\n syncChartLayoutDrawings,\n saveLatestChanges,\n checkDrawingUpdate,\n }\n}\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { getIsPreserveDrawingsAndAutosaveAvailable } from '../../utils/chart'\n\nexport function useIsAutoSaveActive(chartLayout: ChartLayout) {\n const chartLayoutModel = useModelState(chartLayout, {\n watchProperties: ['isInit', 'isPreserveDrawingsActive', 'idea'],\n })\n const { idea, isInit, isPreserveDrawingsActive } = chartLayoutModel\n return React.useMemo(\n () =>\n getIsPreserveDrawingsAndAutosaveAvailable(chartLayoutModel) && isPreserveDrawingsActive && !!isInit && !idea?.id,\n [isPreserveDrawingsActive, isInit, idea?.id, chartLayoutModel]\n )\n}\n","import React from 'react'\n\nimport { CustomSpineEvents } from '../../../types/shared'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartModel from '../../models/chart'\nimport ChartLayout from '../../models/chart_layout'\nimport { AutoSaveState } from '../../models/constants'\nimport Element from '../../models/element'\nimport { usePrevious } from '../../utils/use-prev-state'\nimport { DRAWINGS_UPDATE_INTERVAL_MS } from './constants'\nimport { useDrawingAutoSaveControls } from './use-drawing-auto-save-controls'\nimport { getTickersAndContainerTypesInLayoutModel } from './utils'\n\nfunction useDrawingAutoSave(chartLayout: ChartLayout) {\n const {\n onElementChange,\n deleteAllAutoSavedElements,\n checkDrawingUpdate,\n syncChartLayoutDrawings,\n saveLatestChanges,\n isAutoSaveActive,\n } = useDrawingAutoSaveControls(chartLayout)\n\n const drawingsInternalStoreUnwatched = React.useMemo(() => chartLayout.drawingsInternalStore(), [chartLayout])\n const drawingsInternalStore = useModelState(drawingsInternalStoreUnwatched, { watchProperties: ['elements'] })\n const prevIsAutoSaveActive = usePrevious(isAutoSaveActive)\n\n const runInitialSaveAndRefetchUpdate = React.useCallback(async () => {\n chartLayout.getAllElements().forEach((element) => {\n // Adds drawings to internal store if isAutoSaveActive and they are not in the store yet\n if (!drawingsInternalStore.elements.some((drawing) => drawing.elementId === element.elementId)) {\n onElementChange(element)\n }\n })\n\n // We want to save everything except notes because saving notes can overwrite those already saved in db. Each drawing has different id but there is only one note per ticker\n // Notes are merged in checkDrawingUpdate fn\n await saveLatestChanges(0, (item) => item.containerType !== 'note')\n\n checkDrawingUpdate(true)\n }, [checkDrawingUpdate, chartLayout, onElementChange, drawingsInternalStore.elements, saveLatestChanges])\n\n React.useEffect(() => {\n if (isAutoSaveActive) {\n saveLatestChanges()\n }\n }, [saveLatestChanges, drawingsInternalStore.elements, isAutoSaveActive])\n\n React.useEffect(() => {\n if (!isAutoSaveActive) {\n chartLayout.drawingsInternalStore().setAutoSaveState(AutoSaveState.Off)\n return\n }\n chartLayout.drawingsInternalStore().setAutoSaveState(AutoSaveState.Saved)\n if (!prevIsAutoSaveActive && isAutoSaveActive) {\n runInitialSaveAndRefetchUpdate()\n }\n\n let { tickers, containerTypes } = getTickersAndContainerTypesInLayoutModel(chartLayout)\n\n const onChartOrIndicatorChange = () => {\n const { tickers: newTickers, containerTypes: newContainerTypes } =\n getTickersAndContainerTypesInLayoutModel(chartLayout)\n if (\n JSON.stringify(tickers) !== JSON.stringify(newTickers) ||\n JSON.stringify(containerTypes) !== JSON.stringify(newContainerTypes)\n ) {\n tickers = newTickers\n containerTypes = newContainerTypes\n checkDrawingUpdate(true)\n }\n }\n\n ChartModel.bind(`${CustomSpineEvents.IndicatorsChange} change`, onChartOrIndicatorChange)\n Element.bind('change', onElementChange)\n\n drawingsInternalStore.elements.forEach(syncChartLayoutDrawings)\n const checkDrawingUpdateInterval = setInterval(checkDrawingUpdate, DRAWINGS_UPDATE_INTERVAL_MS)\n\n return () => {\n clearInterval(checkDrawingUpdateInterval)\n ChartModel.unbind(`${CustomSpineEvents.IndicatorsChange} change`, onChartOrIndicatorChange)\n Element.unbind('change', onElementChange)\n }\n }, [\n chartLayout,\n drawingsInternalStore,\n checkDrawingUpdate,\n onElementChange,\n syncChartLayoutDrawings,\n isAutoSaveActive,\n prevIsAutoSaveActive,\n runInitialSaveAndRefetchUpdate,\n ])\n\n return { deleteAllAutoSavedElements, isAutoSaveActive }\n}\n\ninterface Props {\n chartLayoutModel: ChartLayout\n}\n\nexport const withDrawingsAutoSave = (Component: any) => (props: Props) => {\n const { deleteAllAutoSavedElements, isAutoSaveActive } = useDrawingAutoSave(props.chartLayoutModel)\n\n return (\n \n )\n}\n","import React from 'react'\n\nexport function usePrevious(value: any) {\n const ref = React.useRef()\n React.useEffect(() => {\n ref.current = value\n }, [value])\n return ref.current\n}\n","import omit from 'lodash.omit'\nimport queryString from 'query-string'\nimport React, { useEffect, useRef, useState } from 'react'\n\nimport { Instrument, ObjectHash } from '../../types/shared'\nimport { Button, Dialog, DialogBody, DialogFooter, DialogHeader } from '../components'\nimport { ChartsOrQuotePageQueryParams, LayoutType } from '../constants/common'\nimport { getTickerNoteText } from '../controllers/autosave/utils'\nimport ChartLayout from '../models/chart_layout'\nimport Quote from '../models/quote'\nimport { getInstrument } from '../utils/chart'\nimport fetchApi, { getFormDataFromObject } from '../utils/fetch_api'\nimport { captureException } from '../utils/helpers'\nimport { decodeQueryString } from '../utils/query_string'\n\ninterface IIdea {\n ticker: string\n instrument: string\n period: string\n company?: string\n date: string\n note: string\n id: string\n}\n\nfunction getIdeaUrl({ ticker, instrument, period, id }: Pick) {\n const searchObject = { t: ticker, p: period, i: id }\n const isStock = instrument === Instrument.Stock\n const isQuotePage = /\\/quote\\b/.test(window.location.pathname)\n const isStockOnQute = isQuotePage && isStock\n const path = !isQuotePage || isStock ? window.location.pathname : '/charts.ashx'\n\n return `${path}?${queryString.stringify({ ...searchObject, ...(isStockOnQute ? { ta: '2' } : { l: '1h1v' }) })}`\n}\n\nfunction IdeasList() {\n const [hasError, setHasError] = useState(false)\n const [hasFetched, setHasFetched] = useState(false)\n const [isDeleting, setIsDeleting] = useState(false)\n const [ideas, setIdeas] = useState([])\n const { i: currentIdea } = decodeQueryString()\n\n useEffect(() => {\n async function fetchIdeas() {\n window.gtag?.('event', 'load', { event_category: 'ideas' })\n try {\n const data = await fetchApi({ location: '/api/ideas_load.ashx', throwOnStatusCodes: [404] })\n const ideas = data.ideas.map((idea: IIdea) => ({\n ...idea,\n instrument: getInstrument(idea.ticker),\n }))\n\n setIdeas(ideas)\n setHasFetched(true)\n } catch {\n setHasError(true)\n }\n }\n\n fetchIdeas()\n }, [])\n\n const onDeleteIdeaClick = useRef(async (idea: IIdea) => {\n if (!window.confirm('Do you really want to delete this idea?')) return\n\n const body = [\n ['id', idea.id],\n ['ticker', idea.ticker],\n ['queryString', document.location.search],\n ['locationPathname', document.location.pathname],\n ['currentIdea', currentIdea],\n ]\n .map((row) => row.join('='))\n .join('&')\n\n setIsDeleting(true)\n\n const response = await fetch('/api/idea_delete.ashx', {\n body,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n method: 'post',\n })\n\n if (currentIdea === String(idea.id)) {\n window.location.href = response.url\n return\n }\n\n // Check if the page was loaded with the idea which is going to be deleted here\n // If that's the case, refresh the page to remove idea data from the page so when user navigates back to idea page it shows idea 404\n const configIdeaId = window.FinvizChartsSettings?.ideaChart?.idea?.id ?? window.globalChartConfig?.idea?.id\n if (configIdeaId === idea.id) {\n window.location.reload()\n return\n }\n\n setIdeas((ideas) => ideas.filter((stateIdea) => stateIdea.id !== idea.id))\n setIsDeleting(false)\n })\n\n if (!hasFetched || hasError) {\n return (\n

\n {hasError ? 'Unexpected error occured, please refresh the page.' : 'Loading…'}\n
\n )\n }\n\n if (ideas.length === 0) {\n return (\n \n No saved ideas.\n \n )\n }\n\n return (\n <>\n {ideas.map((idea) => (\n (document.location = getIdeaUrl(idea))}\n >\n
\n

\n {idea.ticker}\n {idea.company && ' - ' + idea.company}\n

\n \n {idea.date}\n \n {idea.note !== '' ? (\n

{idea.note}

\n ) : null}\n
\n
\n \n ) => {\n ev.stopPropagation()\n onDeleteIdeaClick.current(idea)\n }}\n >\n Delete\n \n
\n \n ))}\n \n )\n}\n\nexport function IdeasDialog(props: any) {\n return (\n \n props.state.hide()}>Your ideas\n \n \n \n \n \n \n \n )\n}\n\nexport async function saveIdea(layoutModel: ChartLayout) {\n const activeChart = layoutModel.activeChart\n const activeChartQuote = activeChart.quote().toJSON()\n const { ticker, instrument, cid } = activeChart\n const period = activeChartQuote.timeframe\n const { ChartSettings } = layoutModel.settings\n const layout: ObjectHash = layoutModel.toObject()\n layout.layout = LayoutType['1h1v']\n layout.barWidth = ChartSettings.center.barWidth\n layout.barMargin = ChartSettings.center.barMargin\n layout.charts = layout.charts\n .filter((c: ObjectHash) => c.chartId === cid)\n .map((c: ObjectHash) => ({ ...c, dateRange: null, refreshData: false }))\n\n delete layout.charts[0].chartId\n\n // TODO: replace with better solution after indicators overhaul\n const getChartTickers = (layoutModelObjectPanes: { elements: { type: string; tickers: string }[] }[]) => {\n let tickers = []\n let tickersString = ''\n for (const pane of layoutModelObjectPanes) {\n for (const element of pane.elements) {\n if (element.type === 'indicators/perf') {\n tickersString = element.tickers\n }\n }\n }\n tickers = tickersString.split(',').filter((item) => item)\n if (!tickers.includes(ticker)) {\n tickers.push(ticker.replace('@', ''))\n }\n return tickers\n }\n const tickers = getChartTickers(layout.charts[0].panes)\n const quotes = Quote.select(\n (quote: Quote) =>\n tickers.includes(quote.ticker) && quote.timeframe === activeChart.timeframe && layoutModel.isIdeaId(quote.ideaID)\n ).filter((element, index, array) => array.findIndex((t) => t.ticker === element.ticker) === index)\n const quotesJsonString = JSON.stringify(quotes.map((q) => omit(q.toJSON(), ['ideaID', 'chartUuid'])))\n\n const chart = JSON.stringify(layout)\n const note =\n layoutModel.idea?.note ||\n getTickerNoteText({ ticker, elements: layoutModel.drawingsInternalStore().elements }) ||\n ''\n window.gtag?.('event', 'save', { event_category: 'ideas' })\n\n if (tickers.length !== quotes.length) {\n captureException(new Error('Idea saved with inconsistent quotes data'), {\n extra: {\n tickers,\n quoteTickersTimeframes: quotes.map((quote) => ({ ticker: quote.ticker, timeframe: quote.timeframe })),\n chartLayout: layoutModel.toConfig(['colors', 'panes']),\n },\n })\n }\n\n const data = await fetchApi<{ id: string }>({\n location: '/api/idea_save.ashx',\n method: 'POST',\n body: getFormDataFromObject({ ticker, period, chart, quotes: quotesJsonString, note }),\n })\n\n const ideaUrl = getIdeaUrl({\n ticker,\n period,\n instrument,\n id: data.id,\n })\n\n if (process.env.IS_E2E_TESTING) {\n window.location.href = ideaUrl\n } else {\n // need to be in setTimeout because Safari block any call to window.open made in async,\n // this is hack to force run window.open in main thread\n setTimeout(() => {\n window.open(ideaUrl, 'FinvizSavedIdea')\n })\n }\n}\n","import classnames from 'classnames'\nimport * as React from 'react'\n\nimport {\n Button,\n DialogTrigger,\n Dropdown,\n DropdownItem,\n Spinner,\n Tooltip,\n TooltipTrigger,\n useDialogState,\n useDropdownState,\n useTooltipState,\n} from '../../components'\nimport { IdeasDialog, saveIdea } from '../../modals/ideas'\nimport ChartLayout from '../../models/chart_layout'\nimport Quote from '../../models/quote'\nimport { getIsMobileScreenSize } from '../../utils'\nimport { encodeQueryString } from '../../utils/query_string'\n\ninterface IdeaDropdownProps {\n model: ChartLayout\n rounding?: 'none' | 'regular'\n theme?: string\n size?: string\n dropdownButtonClassName?: string\n}\n\nexport function IdeasDropdown({\n model,\n rounding,\n dropdownButtonClassName,\n ...props\n}: React.PropsWithChildren) {\n const tooltipState = useTooltipState({ placement: 'right-start' })\n const [isAnyQuoteLoading, setIsAnyQuoteLoading] = React.useState(false)\n const ref = React.useRef(null)\n const dialog = useDialogState()\n const dropdown = useDropdownState()\n const hideTooltip = tooltipState.hide\n\n React.useEffect(() => {\n const checkIfAnyQuoteIsLoading = () => {\n const fetchingQuotes = Quote.select((quote) => quote.isFetching && quote.fetchedAt === -1)\n setIsAnyQuoteLoading(fetchingQuotes.length > 0)\n }\n\n Quote.bind('change', checkIfAnyQuoteIsLoading)\n return () => {\n Quote.unbind('change', checkIfAnyQuoteIsLoading)\n }\n }, [])\n\n React.useEffect(() => {\n if (!isAnyQuoteLoading || !dropdown.visible) {\n hideTooltip()\n }\n }, [isAnyQuoteLoading, dropdown.visible, hideTooltip])\n\n if (!window.FinvizSettings.hasUserPremium) {\n return (\n \n )\n }\n\n return (\n <>\n \n }\n >\n {\n if (isAnyQuoteLoading) {\n tooltipState.show()\n return\n }\n saveIdea(model)\n }}\n >\n Save idea\n \n \n Load idea\n \n \n \n \n
\n \n
\n \n Some data is still loading. Please wait.\n \n
\n \n )\n}\n","export const publishModalAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"modals-publish\" */ './module-entry'),\n cacheKey: 'modals-publish',\n}\n","import classnames from 'classnames'\nimport * as React from 'react'\n\nimport { Button, Delayed, DialogTrigger, Icon, Spinner, useDialogState } from '../../components'\nimport { publishModalAsyncModule } from '../../modals/publish/async-modules'\nimport ChartLayout from '../../models/chart_layout'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\n\ninterface PublishProps {\n model: ChartLayout\n theme?: string\n size?: string\n rounding?: string\n}\n\nexport function Publish({ model, ...props }: React.PropsWithChildren) {\n const dialog = useDialogState()\n const [publishModalModule, { isLoading }] = useAsyncModule({\n ...publishModalAsyncModule,\n shouldLoadModule: dialog.visible,\n errorSeverity: 'medium',\n onError: () => dialog.hide(),\n })\n const PublishDialog = publishModalModule?.default\n const buttonProps = isLoading\n ? {\n leftContent: (\n \n }\n >\n \n \n ),\n }\n : {\n as: DialogTrigger,\n state: dialog,\n leftContent: 'share',\n }\n return (\n <>\n \n {PublishDialog && }\n \n )\n}\n","import classnames from 'classnames'\nimport * as React from 'react'\n\nimport { Button, Delayed, Icon, Spinner, useTour } from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { getRequestFullscreen, isRedesignEnabled } from '../../utils'\nimport { encodeQueryString } from '../../utils/query_string'\n\ninterface TourDefinition {\n id: string\n steps: Array<{\n title?: React.ReactNode\n body: React.ReactNode\n target?: string\n placement?: string\n overlayRadius?: number\n overlayPadding?: number\n }>\n skip?: boolean\n}\n\nconst isPremium = window.FinvizSettings.hasUserPremium\n\n// If we need to update / discontinue some tour we can use skip flag on legacy version to ensure that it won't reset users tour but won't include it in new tours\nfunction getTour(page: SpecificChartFunctionality): TourDefinition[] {\n return [\n {\n id: 'chart-tour',\n steps: [\n {\n title: 'Chart Tour',\n body: 'Discover powerful Chart features in the 2-min tour to master your analysis of trading opportunities.',\n },\n ...(isPremium\n ? [\n {\n title: 'Scale the Timeline',\n body: 'Grab the timeline to zoom it in and out. Double-click the timeline to reset the scaling.',\n target: '[data-testid=\"chart-0-pane-0-zoomer\"]',\n },\n {\n title: 'Scale the Price Axis',\n body: 'Grab the Price Axis to zoom it in and out. Move the chart around freely in any direction when Price Axis has custom scale. Double-click the Price Axis to reset the scaling.',\n target: '[data-testid=\"chart-0-pane-0-scaler\"]',\n },\n {\n title: 'Drawing tools & settings',\n body: 'Pick any Drawing Tool to analyze the market. Tailor your drawing experience with additional settings.',\n target: '#toolbar',\n },\n {\n title: 'Fine-tune Drawings',\n body: 'Double-click on a chart drawing to tweak its color and style. Right-click on a drawing to access other options, such as changing its visibility, order, and more.',\n target: '[data-testid=\"chart-0-pane-0\"]',\n },\n ]\n : [\n {\n title: 'Enable Drawing mode',\n body: (\n <>\n \n Finviz*Elite\n {' '}\n subscribers get access a whole suite of drawing tools which allow them to draw on and annotate the\n chart.
\n While in drawing mode, you can also pan the chart, scale the timeline and price axis and much more.\n \n ),\n target: '[data-testid=\"quote-toggle-draw-btn\"]',\n placement: 'bottom-start',\n },\n ]),\n {\n title: 'Save your best Ideas',\n body: isPremium\n ? 'Besides your drawings being autosaved, you can manually save ideas that you wish to revisit later.'\n : 'Your drawings will be saved automatically, but you can also manually save ideas that you wish to revisit later.',\n target: '[data-testid=\"chart-toolbar-ideas\"]',\n placement: 'bottom-start',\n },\n ...(page === SpecificChartFunctionality.quotePage\n ? []\n : [\n {\n title: 'Chart Layouts & Charts Sync',\n body: 'Switch between Chart Layouts to view multiple charts on your screen. Synchronize Ticker, Timeframe or Crosshair position across your charts.',\n target: '[data-testid=\"chart-layout-layout\"]',\n },\n ]),\n ...(!getRequestFullscreen(document.documentElement) && page === SpecificChartFunctionality.chartPage\n ? []\n : [\n {\n title: 'Fullscreen mode',\n body:\n page === SpecificChartFunctionality.quotePage\n ? 'Open the chart in an expanded view for full-page display and split-screen charts.'\n : 'Toggle the window to fill your entire screen.',\n target: '[data-testid=\"chart-layout-fullscreen\"]',\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\n },\n ]),\n {\n title: 'Share chart',\n body: 'Share a chart together with your analysis and ideas.',\n target: '[data-testid=\"chart-toolbar-publish\"]',\n overlayPadding: page === SpecificChartFunctionality.quotePage ? 3 : undefined,\n placement: 'bottom',\n },\n ...(isRedesignEnabled() || page === SpecificChartFunctionality.chartPage\n ? [\n {\n title: 'Theme',\n body: 'Switch between the Light and Dark theme.',\n target: '[data-testid=\"chart-layout-theme\"]',\n },\n ]\n : []),\n {\n title: 'Study Settings',\n body: 'Customize the Chart Type and appearance. Add Overlays, Indicators and toggle Extended Hours.',\n target: '[data-testid=\"chart-settings-open-btn\"]',\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\n },\n ],\n },\n page === SpecificChartFunctionality.chartPage && {\n id: 'sidebar-watchlist',\n steps: [\n {\n title: 'Explore Your Portfolios',\n body: 'Effortlessly navigate through your portfolio holdings. With just a click, visualize individual stock charts, gain insights, and stay updated on your investments.',\n target: '[data-testid=\"sidebar-portfolio-btn\"]',\n placement: 'left-start',\n },\n ],\n },\n ].filter(Boolean) as TourDefinition[]\n}\n\ninterface TourButtonProps {\n page: SpecificChartFunctionality\n rounding?: 'none' | 'regular'\n size?: string\n theme?: string\n className?: string\n}\n\nexport function TourButton({ page, className, theme, ...props }: React.PropsWithChildren) {\n const tour = useTour()\n const pageTours = getTour(page)\n const [userTour, setCurrentTour] = React.useState(tour.getStepsForUser(pageTours))\n const buttonTheme = userTour.hasNewTours ? 'blue' : theme ?? 'headerItem'\n\n return (\n \n }\n >\n \n \n ) : (\n \n )\n }\n className={className}\n contentClass={page !== SpecificChartFunctionality.quotePage ? 'hidden lg:flex' : ''}\n title=\"Explore new features\"\n onClick={async () => {\n if (userTour) {\n const activeTour = await tour.startTour(userTour.tour)\n activeTour?.once('inactive', () => {\n setCurrentTour(tour.getStepsForUser(pageTours))\n })\n }\n }}\n />\n )\n}\n","import * as React from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { Icon, Select, SelectOption } from '../../components'\nimport ChartLayout from '../../models/chart_layout'\nimport { useChartTypes } from './use-chart-types'\nimport { TypeBaseOption } from './utils'\n\nconst isNativeMobileSelect = true // explicitly enable native select for mobile devices\n\nexport function ChartTypesSelect({\n isPremium,\n model,\n ...props\n}: {\n isPremium: boolean\n model: ChartLayout\n theme?: string\n size?: string\n rounding?: string\n}) {\n const { chartTypes, getCurrentType } = useChartTypes({ isPremium, model })\n const currentType = getCurrentType()\n const [selectedType, setSelectedType] = React.useState(currentType)\n const icon = chartTypes.find((item) => item.value === selectedType)?.iconName\n\n React.useEffect(() => {\n setSelectedType(currentType)\n }, [currentType])\n\n return (\n item.value === selectedType)?.iconName} className=\"text-gray-300\" />\n )\n }\n rightContent={props.theme === 'chip' ? 'caretDown' : undefined}\n hasPopoverButtonWidthLimit={false}\n isNativeMobileSelect={isNativeMobileSelect}\n onChange={(item: TypeBaseOption) => setSelectedType(item.value)}\n >\n {chartTypes.map((item) => (\n \n {item.label}\n \n ))}\n \n )\n}\n","import * as React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport ChartLayout from '../../models/chart_layout'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\nimport {\n DEFAULT_TYPES,\n FREE_TYPES_QUOTE,\n FREE_TYPES_QUOTE_VALUES,\n QuoteLongToShortType,\n QuoteNodeChartTypes,\n QuoteShortToLongType,\n QuoteUrlChartTypes,\n TypeBaseOption,\n} from './utils'\n\nexport function useChartTypes({ isPremium, model }: { isPremium: boolean; model: ChartLayout }) {\n const location = useLocation()\n const { b, t, ta, ty, p = 'd', r } = decodeQueryString(location.search)\n const taInt = ta ? Number.parseInt(ta) : 1\n const isQuotePage = model.specificChartFunctionality === SpecificChartFunctionality.quotePage\n\n const getCurrentType = React.useCallback(() => {\n const defaultType =\n ((ty as QuoteUrlChartTypes | undefined) && QuoteShortToLongType[ty as QuoteUrlChartTypes]) ??\n (window.FinvizQuoteTypeCurrent as QuoteNodeChartTypes)\n\n return !isPremium && defaultType === QuoteNodeChartTypes.candlestick && taInt === 0\n ? QuoteNodeChartTypes.candlesticksimple\n : defaultType\n }, [isPremium, taInt, ty])\n\n const generateRouterPath = React.useCallback(\n (type: QuoteNodeChartTypes) => {\n if (isPremium || FREE_TYPES_QUOTE_VALUES.includes(type)) {\n return `${location.pathname}?${encodeQueryString({\n b,\n t,\n r,\n ty:\n type === QuoteNodeChartTypes.candlesticksimple\n ? QuoteLongToShortType.candlestick\n : QuoteLongToShortType[type],\n ta: type === QuoteNodeChartTypes.candlestick ? '1' : '0',\n p,\n })}`\n }\n return `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: 'quote-chart-type-select',\n })}`\n },\n [isPremium, location.pathname, b, t, r, p]\n )\n\n const chartTypes = React.useMemo(() => {\n const options = isPremium || !isQuotePage ? DEFAULT_TYPES : FREE_TYPES_QUOTE\n\n return options.map((item) => ({\n ...item,\n href: generateRouterPath(item.value as QuoteNodeChartTypes),\n reloadDocument: !isPremium,\n })) as TypeBaseOption[]\n }, [generateRouterPath, isPremium, isQuotePage])\n\n return { getCurrentType, chartTypes }\n}\n","import classnames from 'classnames'\nimport * as React from 'react'\n\nimport { Paragraph } from '../../components'\nimport math from '../../helpers/math'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { QuoteFetchType } from '../../models/quote/constants'\nimport { useAsyncModule, withSuspense } from '../../utils/async-modules-utils'\nimport { getTickerChange } from '../../utils/chart'\nimport { chartSettingsAsyncModule } from '../chart-settings/async-modules'\n\ninterface Props {\n chartIndex: number\n}\n\ninterface ChangeLabelProps {\n children: React.ReactNode\n changePoints: number\n isTiny: boolean\n}\n\nconst CHANGE_UPATE_EVENTS = ['change', 'update']\nconst QUOTE_MODEL_CHANGE_EVENTS = [...CHANGE_UPATE_EVENTS, ...Object.values(QuoteFetchType)]\n\nfunction ChangeLabel({ children, changePoints, isTiny }: ChangeLabelProps) {\n return (\n 0,\n 'text-red-400': changePoints < 0,\n })}\n >\n {children}\n \n )\n}\n\nexport function DailyChangeDisplayComponent({ chartIndex }: Props) {\n const [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { chartLayoutModel } = chartsModule.useChartLayoutGlobalModel()\n const chartModel = useModelState(chartLayoutModel?.getAllCharts()[chartIndex] ?? null, {\n watchProperties: ['quote'],\n listenOnEvents: CHANGE_UPATE_EVENTS,\n })\n const quoteModel = useModelState(chartModel?.quote() ?? null, {\n watchProperties: ['lastClose', 'prevClose', 'afterClose'],\n listenOnEvents: QUOTE_MODEL_CHANGE_EVENTS,\n })\n\n const tickerChange = quoteModel && getTickerChange({ data: quoteModel })\n const isTiny =\n !!tickerChange?.tickerChange &&\n math.getInstrumentDecimalPlaces({\n instrument: quoteModel!.instrument,\n value: quoteModel!.lastClose,\n }) >= 6\n\n return (\n
\n {tickerChange?.tickerChange && (\n <>\n {tickerChange.tickerAfterChange && (\n \n {tickerChange.tickerAfterChange.string}\n \n )}\n \n {tickerChange.tickerChange.string}\n \n \n )}\n
\n )\n}\n\nexport const DailyChangeDisplay = React.memo(\n withSuspense(DailyChangeDisplayComponent),\n (prevProps, nextProps) => prevProps.chartIndex === nextProps.chartIndex\n)\n","import * as React from 'react'\n\nimport { Button } from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport utils from '../../utils'\nimport { DRAWING_COOKIE_NAME, getIsDrawingEnabled } from '../../utils/chart'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\n\nconst utmCampaign: Partial> = {\n [SpecificChartFunctionality.quotePage]: 'quote-draw-button',\n [SpecificChartFunctionality.futuresPage]: 'futures-interactive-chart',\n [SpecificChartFunctionality.forexPage]: 'forex-interactive-chart',\n [SpecificChartFunctionality.cryptoPage]: 'crypto-interactive-chart',\n}\n\nconst testId: Partial> = {\n [SpecificChartFunctionality.quotePage]: 'quote-toggle-draw-btn',\n [SpecificChartFunctionality.futuresPage]: 'futures-interactive',\n [SpecificChartFunctionality.forexPage]: 'forex-interactive',\n [SpecificChartFunctionality.cryptoPage]: 'crypto-interactive',\n}\n\ninterface DrawButtonProps {\n isPremium: boolean\n specificChartFunctionality: SpecificChartFunctionality\n active?: boolean\n theme?: string\n size?: string\n rounding?: string\n}\n\nexport function DrawButton({\n isPremium,\n specificChartFunctionality,\n ...props\n}: React.PropsWithChildren) {\n const buttonProps = React.useMemo(() => {\n if (!isPremium) {\n return {\n as: 'a',\n href: `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: utmCampaign[specificChartFunctionality],\n })}`,\n }\n }\n\n return {\n onClick: (ev: React.MouseEvent) => {\n ev.preventDefault()\n const newValue = getIsDrawingEnabled() ? 'off' : 'on'\n\n fetch('/api/set_cookie.ashx?cookie=' + DRAWING_COOKIE_NAME + '&value=' + newValue)\n .catch(() => {})\n .then((res) => {\n if (!res?.ok) {\n // fallback to JS otherwise draw toggle won't work if API don't work\n const expires = new Date()\n expires.setMonth(expires.getMonth() + 1)\n utils.setCookie(DRAWING_COOKIE_NAME, newValue, expires)\n }\n\n const { i: idea, ...rest } = decodeQueryString()\n if (idea) {\n document.location = `quote.ashx?${encodeQueryString(rest)}`\n } else {\n document.location.reload()\n }\n })\n },\n }\n }, [isPremium, specificChartFunctionality])\n\n return (\n \n )\n}\n","import * as React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { Button } from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport ChartLayout from '../../models/chart_layout'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\n\nfunction getTickersString(tickers: string[], tickersCount: number) {\n return Array.from({ length: Math.min(tickersCount, 6) })\n .map((_, index) => tickers[index] ?? tickers[tickers.length - 1])\n .join(',')\n}\n\nfunction getLayoutType(tickersCount: number) {\n switch (tickersCount) {\n case 0: // shouldn't happen\n case 1:\n return '1h1v'\n case 2:\n return '2h1v'\n case 3:\n return '3h1v'\n case 4:\n return '2h2v'\n case 5:\n default:\n // 6 and more\n return '3h2v'\n }\n}\n\nconst utmCampaign: Partial> = {\n [SpecificChartFunctionality.quotePage]: 'quote-fullscreen-button',\n [SpecificChartFunctionality.futuresPage]: 'futures-fullscreen-button',\n [SpecificChartFunctionality.forexPage]: 'forex-fullscreen-button',\n [SpecificChartFunctionality.cryptoPage]: 'crypto-fullscreen-button',\n}\n\ninterface FullscreenButtonProps {\n model: ChartLayout\n isPremium: boolean\n title?: string\n theme?: string\n size?: string\n rounding?: string\n}\n\nexport function FullscreenButton({ model, isPremium, ...props }: React.PropsWithChildren) {\n const location = useLocation()\n const { i, p = 'd', r } = decodeQueryString(location.search)\n const urlTickers = model\n .charts()\n .all()\n .map((chart) => chart.quote().getRawTicker())\n\n return (\n p).join(','),\n l: getLayoutType(urlTickers.length),\n r,\n })}`\n : `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: utmCampaign[model.specificChartFunctionality],\n })}`\n }\n />\n )\n}\n","import React from 'react'\n\nimport { Instrument } from '../../../types/shared'\nimport {\n Button,\n CreateAlert,\n Dialog,\n DialogTrigger,\n Dropdown,\n DropdownItem,\n Icon,\n SaveToPortfolio,\n Search as WebsiteSearchComponent,\n useDialogState,\n useDropdownState,\n} from '../../components'\n\ninterface SearchProps {\n ticker: string\n instrument: Instrument\n onTickerSelected: (ticker: string) => void\n chartIndex: number\n}\n\nexport default function Search({ ticker, instrument, onTickerSelected, chartIndex }: SearchProps) {\n const dropdownState = useDropdownState({ placement: 'bottom-end' })\n const saveToPortfolioDialog = useDialogState()\n const createAlertDialog = useDialogState()\n\n const detailLink = React.useMemo(() => {\n const formattedTicker = ticker.replace('@', '')\n\n switch (instrument) {\n case Instrument.Stock:\n return `/quote.ashx?t=${formattedTicker}`\n case Instrument.Futures:\n return `/futures_charts.ashx?t=${formattedTicker}`\n case Instrument.Forex:\n return `/forex_charts.ashx?t=${formattedTicker}`\n case Instrument.Crypto:\n return `/crypto_charts.ashx?t=${formattedTicker}`\n }\n }, [ticker, instrument])\n\n return (\n
\n }\n />\n }\n >\n {\n window.gtag?.('event', 'click', { event_category: 'open-stock-detail' })\n }}\n >\n {instrument === Instrument.Stock ? 'Open Stock Detail' : 'Open Detail'}\n \n {instrument === Instrument.Stock && (\n {\n window.gtag?.('event', 'click', { event_category: 'save-to-portfolio' })\n }}\n >\n Save to Portfolio\n \n )}\n {instrument === Instrument.Stock && (\n {\n window.gtag?.('event', 'click', { event_category: 'create-alert' })\n }}\n >\n Create Alert\n \n )}\n \n }\n />\n \n \n \n \n \n \n
\n )\n}\n","import React from 'react'\n\nimport {\n Button,\n Popover,\n PopoverTrigger,\n getExtendedDialogState,\n useElementMeasure,\n usePopoverState,\n} from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { chartSettingsAsyncModule } from '../../controllers/chart-settings/async-modules'\nimport ChartLayout from '../../models/chart_layout'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\nimport { encodeQueryString } from '../../utils/query_string'\n\nconst SETTINGS_WIDTH = 580 // w-145\nconst BUTTON_POPOVER_GUTTER = 16\nconst SETTINGS_POPOVER_ID = 'settings-popover'\n\nconst utmCampaign: Partial> = {\n [SpecificChartFunctionality.quotePage]: 'quote-settings-button',\n [SpecificChartFunctionality.futuresPage]: 'futures-settings-button',\n [SpecificChartFunctionality.forexPage]: 'forex-settings-button',\n [SpecificChartFunctionality.cryptoPage]: 'crypto-settings-button',\n}\n\ntype PopoverStylesType = { body?: React.CSSProperties; wrapper?: React.CSSProperties }\n\nexport function ScrollableChartSettingsPopover({ state, model }: { state: any; model: ChartLayout }) {\n const { elementWidth: bodyWidth } = useElementMeasure(document.body)\n const [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { PreventClosingUnsavedChanges, ChartSettings } = chartsModule\n const { isFullyClosed } = getExtendedDialogState(state)\n const chartElement = document.getElementById('chart')\n const popoverContentElement = document.getElementById(SETTINGS_POPOVER_ID)\n const settingsButton: HTMLButtonElement = state.unstable_referenceRef.current\n\n const popoverStyles = React.useMemo(() => {\n const newPopoverStyles: PopoverStylesType = {}\n if (!settingsButton || !chartElement) {\n return newPopoverStyles\n }\n const buttonRect = settingsButton.getBoundingClientRect()\n const topOffset = buttonRect.top + buttonRect.height\n newPopoverStyles.body = {\n maxHeight: window.innerHeight - topOffset - BUTTON_POPOVER_GUTTER * 2,\n position: 'sticky',\n top: -topOffset + BUTTON_POPOVER_GUTTER - window.scrollY,\n }\n if (!popoverContentElement) {\n return newPopoverStyles\n }\n const chartHeight = chartElement.clientHeight\n const popoverContentHeight = popoverContentElement.offsetHeight\n const emptySpaceDiff = bodyWidth - model.width\n const maxOffset = SETTINGS_WIDTH - buttonRect.width\n\n let rightOffset = emptySpaceDiff > 150 ? (emptySpaceDiff / 2) * -1 : 0\n if (emptySpaceDiff / 2 > maxOffset) rightOffset = maxOffset * -1\n\n newPopoverStyles.wrapper = {\n height: popoverContentHeight < chartHeight ? chartHeight : undefined,\n marginRight: rightOffset,\n }\n\n return newPopoverStyles\n }, [settingsButton, chartElement, popoverContentElement, model.width, bodyWidth])\n\n return (\n \n {({ checkForUnsavedChangesAndClose }) => (\n \n {!isFullyClosed && {}} onClose={checkForUnsavedChangesAndClose} />}\n \n )}\n \n )\n}\n\ninterface ChartSettingsButtonProps {\n isPremium: boolean\n placement?: string\n model: ChartLayout\n theme?: string\n size?: string\n rounding?: string\n}\n\nexport function ChartSettingsButton({\n isPremium,\n model,\n placement,\n ...props\n}: React.PropsWithChildren) {\n const settingsPopoverState = usePopoverState({ placement: placement ?? 'bottom-end' })\n\n const buttonProps = React.useMemo(() => {\n if (model.specificChartFunctionality !== SpecificChartFunctionality.quotePage && !isPremium) {\n return {\n as: 'a',\n href: `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: utmCampaign[model.specificChartFunctionality],\n })}`,\n }\n }\n\n return {\n as: PopoverTrigger,\n state: settingsPopoverState,\n active: settingsPopoverState.visible,\n }\n }, [model, isPremium, settingsPopoverState])\n\n return (\n <>\n \n \n \n )\n}\n","import * as React from 'react'\nimport { useLocation, useNavigate } from 'react-router-dom'\n\nimport { ChartsOrQuotePageQueryParams, SpecificChartFunctionality } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { useModelRef } from '../../model-hooks/useModelRef'\nimport Chart from '../../models/chart'\nimport Quote from '../../models/quote'\nimport { QuoteFetchType } from '../../models/quote/constants'\nimport { createRequestAbortController, removeFromAbortCache } from '../../utils/abort_controller'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\nimport { getLeftOffset } from '../renderUtils'\n\nconst getQuoteRequestKey = (chartModel: Chart) =>\n `quoteReq-${chartModel.ticker}-${chartModel.instrument}-${chartModel.id}`\n\nexport function useChartControls({\n chartModel: unwatchedChartModel,\n isInteractive,\n}: {\n chartModel: Chart | null\n isInteractive: boolean\n}) {\n const location = useLocation()\n const navigate = useNavigate()\n const chartModel = useModelState(unwatchedChartModel, {\n watchProperties: ['ticker', 'timeframe', 'dateRange'],\n })\n const chartLayoutModel = useModelState(chartModel?.chart_layout() ?? null, {\n watchProperties: ['idea', 'settings'],\n })\n const chartModelRef = useModelRef(chartModel)\n const [isLoading, setIsLoading] = React.useState(false)\n const abortControllerKeyRef = React.useRef('')\n const isIdeaChart = !!chartLayoutModel?.idea?.id\n\n const updateChartModelWithNewQuote = React.useCallback((quote: Quote) => {\n const chart = chartModelRef.current\n if (!chart) {\n return\n }\n\n const chartLayoutModel = chart.chart_layout()\n const isSameTicker = chart.getQuoteRawTicker() === quote.getRawTicker()\n\n chart.getAllPanes().forEach((pane) => {\n if (!!pane.getChartOrIndicatorElement()) {\n pane.updateAttribute('scaleRange', null)\n }\n })\n\n chart.updateAttributes({ leftOffset: getLeftOffset({ quote, chartModel: chart }), quote, isScrolled: true })\n\n // Refetch all other chart quotes as the main one is already refetched so we can filter it out but other quotes (from perf for example) should be refetched as well\n chart\n .getAllQuotes()\n .filter((chartQuote) => !chartQuote.eql(quote))\n .forEach((quote) => {\n quote.fetchData({ fetchType: QuoteFetchType.NewerData })\n })\n\n const chartPane = chart.getChartPane()\n chartLayoutModel.activeChartEvent?.instance.toggleIsOpen(false)\n\n const elements = [...chart.getAllElements(), ...(chartPane?.getAllChartEvents(false) ?? [])]\n for (const element of elements) {\n const isDrawing = element.isDrawing()\n const isChartEvent = element.isChartEvent()\n if (isDrawing || isChartEvent) {\n // We want to remove all drawings on ticker change but if autosave is enabled we let the autosave hook take care of that\n if (isSameTicker && (isChartEvent || chartLayoutModel.isPreserveDrawingsActive)) {\n element.instance.updateScales()\n } else {\n element.destroyCascade()\n }\n }\n }\n\n chart.setChartEvents(quote.chartEvents, true)\n\n chartPane?.updateChartEventsZIndexes()\n\n // The only dependency here is a ref , so no need to add it to dependencies\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const fetchQuote = React.useCallback(async () => {\n if (!isInteractive || !chartModel || isIdeaChart) {\n return\n }\n setIsLoading(true)\n\n const { ticker, instrument, timeframe, hasChartEvents } = chartModel\n const { premarket, aftermarket } = Quote.first()\n const patterns = chartModel.getHasPatterns()\n const currentQuote = chartModel.quote()\n if (currentQuote.getRawTicker() !== ticker || currentQuote.timeframe !== timeframe) {\n abortControllerKeyRef.current = getQuoteRequestKey(chartModel)\n const abortController = createRequestAbortController({\n key: abortControllerKeyRef.current,\n shouldAbortRunningRequest: !Quote.select(\n (quote) =>\n quote.ticker === ticker &&\n quote.timeframe === timeframe &&\n quote.isFetching &&\n chartModel.chart_layout().isIdeaId(quote.ideaID)\n ),\n })\n\n const quote = await Quote.get({\n ticker,\n instrument,\n timeframe,\n options: {\n premarket,\n aftermarket,\n events: hasChartEvents,\n patterns,\n cachePredicate: (quote) => quote.ideaID === undefined,\n fetchNewDataOnCachedQuote: true,\n },\n abortController,\n })\n\n if (quote.wasFetchAborted) {\n // Check if the quote is also used in other chars, as the quote may be reused if we already have a quote with the same options\n const isQuoteUsedInOtherCharts = chartModel\n .chart_layout()\n .getAllCharts()\n .filter((chart) => !chartModel.eql(chart))\n .some((chart) => quote.eql(chart.quote()))\n\n // If the quote hasn't been fetched yet and is not anywhere else we can destroy the model\n if (quote.fetchedAt === -1 && !isQuoteUsedInOtherCharts) {\n quote.destroy()\n }\n\n return\n }\n\n removeFromAbortCache(abortControllerKeyRef.current)\n\n updateChartModelWithNewQuote(quote)\n }\n\n setIsLoading(false)\n\n // We don't want to create new function on any chartModel change as it may be the same chart with different object instance\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n chartModel?.id,\n chartModel?.ticker,\n chartModel?.timeframe,\n chartModel?.instrument,\n isIdeaChart,\n updateChartModelWithNewQuote,\n isInteractive,\n ])\n\n React.useEffect(() => {\n fetchQuote()\n }, [fetchQuote])\n\n // There are several ways how to turn off dateRange, e.g. moving the charts\n // This effect listens to dateRange changes on chartmodel and updates the url if there's a change\n // Consider refactoring this part so we only update chart models on route changes not the other way around\n React.useEffect(() => {\n if (chartModel) {\n const decodedQueryString = decodeQueryString(location.search)\n const rangesArray = chartModel\n .chart_layout()\n .getAllCharts()\n .map((chart) => chart.dateRange)\n const ranges = rangesArray.every((i) => !i) ? undefined : rangesArray.join(',')\n\n if (decodedQueryString.r !== ranges) {\n navigate({\n search: `?${encodeQueryString({\n ...decodedQueryString,\n r: ranges,\n })}`,\n })\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chartModel?.dateRange])\n\n // https://github.com/finvizhq/charts/pull/1253/files#r1052266805\n // React.useEffect(\n // () => () => {\n // if (isInteractive && abortControllerKeyRef.current !== '') {\n // abortRequest(abortControllerKeyRef.current)\n // }\n // },\n // [isInteractive]\n // )\n\n React.useEffect(() => {\n const chart = chartModelRef.current\n const quote = chart?.quote()\n\n let shouldRecalculateOnCharts = false\n if (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.chartPage && !isIdeaChart) {\n const settings = chartLayoutModel?.settings\n const barWidth = 3\n const barMargin = 1\n if (settings) {\n const hasSameBarWidth = [\n settings.ChartSettings.center.barWidth,\n settings.IndicatorSettings.center.barWidth,\n ].every((value) => value === barWidth)\n const hasSameBarMargin = [\n settings.ChartSettings.center.barMargin,\n settings.IndicatorSettings.center.barMargin,\n ].every((value) => value === barMargin)\n\n shouldRecalculateOnCharts = !hasSameBarWidth || !hasSameBarMargin\n if (shouldRecalculateOnCharts) {\n settings.ChartSettings.center.barWidth = barWidth\n settings.IndicatorSettings.center.barWidth = barWidth\n settings.ChartSettings.center.barMargin = barMargin\n settings.IndicatorSettings.center.barMargin = barMargin\n\n chartLayoutModel.updateAttributes({ settings })\n }\n }\n }\n\n if (\n chart &&\n quote &&\n (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.quotePage ||\n shouldRecalculateOnCharts) &&\n !isIdeaChart\n ) {\n const leftOffset = getLeftOffset({ quote, chartModel: chart })\n chart.updateAttributes({ leftOffset })\n }\n // This effect should run only on timeframe change & idea change\n // The reason we need to recalculate the left offset is that quote timeframe change changes chart and chart bars sizes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chartModel?.quote()?.timeframe, chartLayoutModel?.settings, isIdeaChart])\n\n return { isLoading }\n}\n","import Spine from '@finviz/spine'\nimport * as React from 'react'\n\nexport function useModelRef(model: Model | null) {\n const modelRef = React.useRef(model)\n\n React.useEffect(() => {\n modelRef.current = model\n }, [model])\n\n return modelRef\n}\n","import classnames from 'classnames'\nimport React from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport {\n CustomDateRange,\n Heading,\n TimeframeBar,\n useCustomDateRangeDialog,\n useFavoriteTimeframes,\n} from '../../components'\nimport { ChartEditorEnum, SpecificChartFunctionality, TIMEFRAME } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport Chart from '../../models/chart'\nimport { IdeasDropdown } from '../header/ideas_dropdown'\nimport { Publish } from '../header/publish'\nimport { TourButton } from '../header/tour_button'\nimport { ChartTypesSelect } from './chart-type-select'\nimport { DailyChangeDisplay } from './daily-change-display'\nimport { DrawButton } from './draw-button'\nimport { FullscreenButton } from './fullscreen-button'\nimport Search from './search'\nimport { ChartSettingsButton } from './settings-button'\nimport { useChartControls } from './use-chart-controls'\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\n\ninterface SettingsComponentProps {\n chartModel: Chart\n chartIndex: number\n}\n\nconst isPremium = window.FinvizSettings.hasUserPremium\nconst hasRedesignEnabled = window.FinvizSettings.hasRedesignEnabled\n\nexport function ChartControls({ chartIndex, chartModel: unwatchedChartModel }: SettingsComponentProps) {\n const rounding = hasRedesignEnabled ? undefined : 'none'\n // This memo is required for publish, otherwise it ends up in a loop\n const chartLayout = React.useMemo(() => unwatchedChartModel.chart_layout(), [unwatchedChartModel])\n const chartModel = useModelState(unwatchedChartModel, {\n watchProperties: ['ticker', 'quote', 'dateRange'],\n })\n const { instrument } = chartModel?.quote() || {}\n const isQuotePage = chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage\n\n const navigate = useNavigate()\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes()\n const { isLoading } = useChartControls({\n chartModel,\n isInteractive: true,\n })\n const {\n anchorDate,\n generateChartLayoutRouterPath,\n timeframeGroupsWithHref,\n dateRangeGroupsWithHref,\n isFetching,\n handleCustomDateRangeValidation,\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\n useCustomDateRangeDialog({\n instrument,\n anchorDate,\n pathGenerator: generateChartLayoutRouterPath,\n })\n\n const handleTickerSelect = React.useCallback(\n (ticker: string) => {\n const upperCaseTicker = ticker.toUpperCase()\n\n navigate(\n generateChartLayoutRouterPath({\n ticker: upperCaseTicker,\n timeframe: chartModel.timeframe,\n dateRange: chartModel.dateRange,\n })\n )\n },\n [chartModel, generateChartLayoutRouterPath, navigate]\n )\n\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\n if (!dateRangeTimeframe) return\n\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\n if (isValid) onDialogSubmit(dateRangeTimeframe)\n }\n\n const timeframeBarProps = React.useMemo(\n () => ({\n size: 'medium',\n chartIndex: chartIndex,\n timeFrameGroups: timeframeGroupsWithHref(isPremium),\n dateRangeGroups: dateRangeGroupsWithHref({ isPremium, customRange: chartModel.dateRange, instrument }),\n selectedTimeframe: chartModel.timeframe,\n onTimeframeSelect: () => {},\n selectedDateRange: chartModel.dateRange,\n favoriteTimeframes: favoriteTimeframes,\n loadingTimeframe: isLoading ? chartModel.timeframe : undefined,\n onDateRangeSelect: handleDateRangeSelect,\n isFavoritesEnabled: isPremium,\n onFavoriteTimeframeToggle: ({ value }: { value: TIMEFRAME }) => {\n toggleFavoriteTimeframe(value)\n },\n }),\n [\n chartIndex,\n chartModel.dateRange,\n chartModel.timeframe,\n dateRangeGroupsWithHref,\n favoriteTimeframes,\n handleDateRangeSelect,\n instrument,\n isLoading,\n timeframeGroupsWithHref,\n toggleFavoriteTimeframe,\n ]\n )\n\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n return (\n
\n {chartModel.chart_layout().canChangeTicker && (\n \n )}\n\n \n\n \n\n \n
\n )\n }\n\n const hasTimeframe = chartLayout.editors.includes(ChartEditorEnum.timeframe)\n\n return (\n \n
\n {!isQuotePage && (\n \n {chartModel.quote().name ?? chartModel.ticker}\n \n )}\n {chartLayout.editors.includes(ChartEditorEnum.tools) && (\n \n Draw\n \n )}\n {chartLayout.editors.includes(ChartEditorEnum.ideas) && (\n \n Ideas\n \n )}\n {!hasTimeframe && (\n
\n \n
\n )}\n
\n\n {hasTimeframe && (\n
\n
\n
\n \n
\n
\n \n \n
\n
\n
\n )}\n\n
\n {chartLayout.editors.includes(ChartEditorEnum.publish) && (\n \n Share\n \n )}\n {isQuotePage && (\n \n )}\n \n {!isQuotePage && 'Fullscreen'}\n \n {chartLayout.editors.includes(ChartEditorEnum.settings) && (\n \n {!isQuotePage && 'Settings'}\n \n )}\n {!isQuotePage && (\n
\n \n
\n )}\n
\n \n )\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = FLibs.Hammerjs;","import React from 'react'\n\nimport { ChartEventBadgeType } from '../../../constants/common'\nimport { IChartEventBadgeProps } from '../utils'\nimport { chartBadgeSvgByType } from './chart-badges-svg-by-type'\n\nexport const getChartEventBadgeElement = (props: IChartEventBadgeProps & { badgeType: ChartEventBadgeType }) => {\n const svgHtmlString = chartBadgeSvgByType[props.badgeType](props)\n\n return \n}\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport { Paragraph } from '../../../components'\n\nexport type PopoverTableRowData = Array<{ value: string | number; className?: string; colSpan?: number; href?: string }>\n\nexport function ChartEventPopoverTableRow({ data }: { data: PopoverTableRowData }) {\n return (\n \n {data.map(({ value, className, colSpan, href }, index) => (\n \n \n {value}\n \n \n ))}\n \n )\n}\n","import React from 'react'\n\nimport { Theme } from '../../../../types/shared'\nimport { Heading } from '../../../components'\nimport { ChartEventBadgeType, ChartEventLabels } from '../../../constants/common'\nimport { CHART_EVENT_BADGE_SIZE } from '../badges/chart-badge-svg-by-type'\nimport { getChartEventBadgeElement } from '../badges/get-chart-event-badge-element'\nimport { ChartEventBadgeState, IDividends, getFormattedEventDate, getFormattedValue } from '../utils'\nimport { ChartEventPopoverTableRow, PopoverTableRowData } from './chart-event-popover-table-row'\n\nexport function ChartEventDividendsPopoverContent({\n badgeType,\n rawData,\n theme,\n}: {\n badgeType: ChartEventBadgeType\n rawData: IDividends\n theme: Theme\n}) {\n const data = React.useMemo(() => {\n const dataArray: PopoverTableRowData[] = [\n [{ value: 'Ex-date' }, { value: getFormattedEventDate(rawData.dateTimestamp) }],\n ]\n if (rawData.ordinary > 0) {\n dataArray.push([{ value: 'Amount' }, { value: getFormattedValue({ value: rawData.ordinary }) }])\n }\n if (rawData.special > 0) {\n dataArray.push([{ value: 'Special' }, { value: getFormattedValue({ value: rawData.special }) }])\n }\n return dataArray\n }, [rawData])\n\n return (\n <>\n
\n {getChartEventBadgeElement({\n theme: theme,\n state: ChartEventBadgeState.default,\n width: CHART_EVENT_BADGE_SIZE,\n badgeType,\n })}{' '}\n {ChartEventLabels[badgeType]}\n
\n \n \n {data.map((item, index) => (\n \n ))}\n \n
\n \n )\n}\n","import React from 'react'\n\nimport { Theme } from '../../../../types/shared'\nimport { Heading } from '../../../components'\nimport { ChartEventBadgeType, ChartEventLabels } from '../../../constants/common'\nimport { BigNumber } from '../../../helpers/math'\nimport { encodeQueryString } from '../../../utils/query_string'\nimport { CHART_EVENT_BADGE_SIZE } from '../badges/chart-badge-svg-by-type'\nimport { getChartEventBadgeElement } from '../badges/get-chart-event-badge-element'\nimport { ChartEventBadgeState, IEarnings, getFormattedEventDate, getFormattedValue } from '../utils'\nimport { ChartEventPopoverTableRow, PopoverTableRowData } from './chart-event-popover-table-row'\n\nconst SURPRISE_POSITIVE_COLOR = 'text-green-500 dark:text-green-400'\nconst SURPRISE_NEGATIVE_COLOR = 'text-red-500 dark:text-red-400'\n\nfunction getFormattedFiscalPeriod(fiscalPeriodRaw: string) {\n const fiscalPeriod = fiscalPeriodRaw.toLowerCase()\n if (fiscalPeriod.includes('q')) {\n const [year, quarter] = fiscalPeriod.split('q')\n return `${year} Q${quarter}`\n }\n if (fiscalPeriod.includes('s')) {\n const [year, semester] = fiscalPeriod.split('s')\n return `${year} S${semester}`\n }\n return fiscalPeriodRaw\n}\n\nfunction getPercentValueString(value: number, totalValue: number) {\n if (totalValue === 0) {\n return ''\n }\n const percent = (value / totalValue) * 100\n const percentValue = isNaN(percent) ? 0 : Math.abs(percent)\n\n return `(${getFormattedValue({\n value: percentValue,\n maxDecimalPlaces: 2,\n })}%)`\n}\n\nexport function ChartEventEarningsPopoverContent({\n badgeType,\n rawData,\n theme,\n}: {\n badgeType: ChartEventBadgeType\n rawData: IEarnings\n theme: Theme\n}) {\n const isPremium = window.FinvizSettings.hasUserPremium\n const data = React.useMemo(() => {\n const dataArray: PopoverTableRowData[] = [\n [\n { value: 'Earnings Date' },\n {\n value: getFormattedEventDate(rawData.dateTimestamp, true),\n },\n ],\n [\n { value: 'Fiscal Period' },\n {\n value: getFormattedFiscalPeriod(rawData.fiscalPeriod),\n },\n ],\n [\n { value: 'Period Ending' },\n {\n value: getFormattedEventDate(rawData.fiscalEndDate, false, {\n month: 'short',\n day: undefined,\n }),\n },\n ],\n ]\n\n if (rawData.epsActual !== undefined || rawData.epsEstimate !== undefined) {\n dataArray.push([{ value: 'EPS', className: 'font-medium pt-4' }])\n }\n if (rawData.epsActual !== undefined) {\n dataArray.push([{ value: 'Reported' }, { value: getFormattedValue({ value: rawData.epsActual }) }])\n }\n if (rawData.epsEstimate !== undefined) {\n dataArray.push([{ value: 'Estimate' }, { value: getFormattedValue({ value: rawData.epsEstimate }) }])\n }\n if (rawData.epsActual !== undefined && rawData.epsEstimate !== undefined) {\n const epsSurprise = rawData.epsActual - rawData.epsEstimate\n const epsSurpriseColor = epsSurprise < 0 ? SURPRISE_NEGATIVE_COLOR : SURPRISE_POSITIVE_COLOR\n const percentageValue = getPercentValueString(epsSurprise, rawData.epsEstimate)\n\n dataArray.push([\n { value: 'Surprise', className: epsSurpriseColor },\n {\n value: `${getFormattedValue({ value: epsSurprise })} ${percentageValue}`,\n className: epsSurpriseColor,\n },\n ])\n }\n\n if (rawData.epsReportedActual !== undefined && rawData.epsActual !== rawData.epsReportedActual) {\n dataArray.push([{ value: 'EPS (GAAP)', className: 'font-medium pt-4' }])\n\n if (isPremium) {\n dataArray.push([{ value: 'Reported' }, { value: getFormattedValue({ value: rawData.epsReportedActual }) }])\n\n if (rawData.epsReportedEstimate !== undefined) {\n const epsReportedSurprise = rawData.epsReportedActual - rawData.epsReportedEstimate\n const epsReportedSurpriseColor = epsReportedSurprise < 0 ? SURPRISE_NEGATIVE_COLOR : SURPRISE_POSITIVE_COLOR\n const percentageValue = getPercentValueString(epsReportedSurprise, rawData.epsReportedEstimate)\n\n dataArray.push(\n [{ value: 'Estimate' }, { value: getFormattedValue({ value: rawData.epsReportedEstimate }) }],\n [\n { value: 'Surprise', className: epsReportedSurpriseColor },\n {\n value: `${getFormattedValue({ value: epsReportedSurprise })} ${percentageValue}`,\n className: epsReportedSurpriseColor,\n },\n ]\n )\n }\n } else {\n dataArray.push([\n {\n value: 'Finviz*Elite only',\n className: 'text-gray-500 dark:text-gray-300 hover:underline hover:text-gray-600 dark:hover:text-gray-200',\n colSpan: 2,\n href: `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: 'chart-event-earnings-gaap',\n })}`,\n },\n ])\n }\n }\n\n if (rawData.salesActual !== undefined || rawData.salesEstimate !== undefined) {\n dataArray.push([{ value: 'Revenue', className: 'font-medium pt-4' }])\n }\n if (rawData.salesActual !== undefined) {\n dataArray.push([\n { value: 'Reported' },\n { value: getFormattedValue({ value: rawData.salesActual, bigNumberUnit: BigNumber.Million }) },\n ])\n }\n if (rawData.salesEstimate !== undefined) {\n dataArray.push([\n { value: 'Estimate' },\n { value: getFormattedValue({ value: rawData.salesEstimate, bigNumberUnit: BigNumber.Million }) },\n ])\n }\n if (rawData.salesActual !== undefined && rawData.salesEstimate !== undefined) {\n const revenueSurprise = rawData.salesActual - rawData.salesEstimate\n const revenueSurpriseColor = revenueSurprise < 0 ? SURPRISE_NEGATIVE_COLOR : SURPRISE_POSITIVE_COLOR\n const percentageValue = getPercentValueString(revenueSurprise, rawData.salesEstimate)\n\n dataArray.push([\n { value: 'Surprise', className: revenueSurpriseColor },\n {\n value: `${getFormattedValue({\n value: revenueSurprise,\n bigNumberUnit: BigNumber.Million,\n })} ${percentageValue}`,\n className: revenueSurpriseColor,\n },\n ])\n }\n\n return dataArray\n }, [rawData, isPremium])\n\n return (\n <>\n
\n {getChartEventBadgeElement({\n theme: theme,\n state: ChartEventBadgeState.default,\n width: CHART_EVENT_BADGE_SIZE,\n badgeType,\n })}{' '}\n {ChartEventLabels[badgeType]}\n
\n \n \n {data.map((item, index) => (\n \n ))}\n \n
\n \n )\n}\n","import React from 'react'\n\nimport { Theme } from '../../../../types/shared'\nimport { Heading, Paragraph } from '../../../components'\nimport { ChartEventBadgeType, ChartEventLabels } from '../../../constants/common'\nimport { CHART_EVENT_BADGE_SIZE } from '../badges/chart-badge-svg-by-type'\nimport { getChartEventBadgeElement } from '../badges/get-chart-event-badge-element'\nimport { ChartEventBadgeState, ISplit, getFormattedEventDate } from '../utils'\n\nexport function ChartEventSplitPopoverContent({\n badgeType,\n rawData,\n theme,\n}: {\n badgeType: ChartEventBadgeType\n rawData: ISplit\n theme: Theme\n}) {\n return (\n <>\n
\n {getChartEventBadgeElement({\n theme: theme,\n state: ChartEventBadgeState.default,\n width: CHART_EVENT_BADGE_SIZE,\n badgeType,\n })}{' '}\n {`${ChartEventLabels[badgeType]}: ${rawData.factorFrom}/${rawData.factorTo}`}\n
\n \n \n \n \n \n \n
\n {getFormattedEventDate(rawData.dateTimestamp)}\n
\n \n )\n}\n","import classNames from 'classnames'\nimport React from 'react'\n\nimport { Theme } from '../../../../types/shared'\nimport { DialogBody, Popover, ZIndexContext } from '../../../components'\nimport { ChartEventBadgeType } from '../../../constants/common'\nimport { IDividends, IEarnings, ISplit } from '../utils'\nimport { ChartEventDividendsPopoverContent } from './dividends-popover-content'\nimport { ChartEventEarningsPopoverContent } from './earnings-popover-content'\nimport { ChartEventSplitPopoverContent } from './split-popover-content'\n\ninterface INoteDialog {\n id?: string\n popoverState: any\n badgeType: ChartEventBadgeType\n data: ISplit | IDividends | IEarnings\n theme: Theme\n}\n\nfunction getChartEventContentComponent(\n badgeType: ChartEventBadgeType,\n data: ISplit | IDividends | IEarnings,\n theme: Theme\n) {\n switch (badgeType) {\n case ChartEventBadgeType.Split:\n return \n case ChartEventBadgeType.Dividends:\n return \n case ChartEventBadgeType.EarningsPositive:\n case ChartEventBadgeType.EarningsNegative:\n case ChartEventBadgeType.EarningsFuture:\n case ChartEventBadgeType.EarningsNeutral:\n return \n default:\n return null\n }\n}\n\nexport function ChartEventPopover({ id, popoverState, badgeType, data, theme }: INoteDialog) {\n return (\n \n \n {getChartEventContentComponent(badgeType, data, theme)}\n \n \n )\n}\n","import React from 'react'\n\nimport { PopoverTrigger, getExtendedDialogState, usePopoverState } from '../../../components'\nimport { useModelState } from '../../../model-hooks/use-model-state'\nimport ChartModel from '../../../models/chart'\nimport { useClickAway } from '../../../utils/use-click-away'\nimport { ChartEventPopover } from './chart-event-popover'\n\ninterface ChartEventPopoverWithStateProps {\n chartModel: ChartModel\n}\n\nconst POPOVER_ID = 'badge-popover'\n\nexport function ChartEventPopoverWithState({ chartModel }: ChartEventPopoverWithStateProps) {\n const unwatchedChartLayout = React.useMemo(() => chartModel.chart_layout() ?? null, [chartModel])\n const { activeChartEvent, theme } = useModelState(unwatchedChartLayout, { watchProperties: ['activeChartEvent'] })\n const popoverState = usePopoverState({ placement: 'top' })\n const { isFullyClosed } = getExtendedDialogState(popoverState)\n const [style, setStyle] = React.useState({\n top: 0,\n left: 0,\n })\n const elementId = activeChartEvent?.elementId\n const isChartEventOfThisChart = activeChartEvent?.pane().chart().eql(chartModel)\n const [data, setData] = React.useState(null)\n const clickAwayRef = useClickAway(() => {\n const isAnyBadgeHovered = !!chartModel\n .getChartPane()\n ?.getAllChartEvents()\n .some((chartEvent) => chartEvent.instance.isHovered)\n\n if (!isAnyBadgeHovered && activeChartEvent && isChartEventOfThisChart) {\n activeChartEvent.instance.toggleIsOpen(false)\n }\n }, !!activeChartEvent && isChartEventOfThisChart)\n // This is intentional, it doesn't need to be in useEffect, it would just call effect function which is redundant\n clickAwayRef.current = popoverState.unstable_popoverRef.current\n const popoverShow = popoverState.show\n const popoverHide = popoverState.hide\n\n React.useEffect(() => {\n if (!activeChartEvent?.instance.isOpen || !isChartEventOfThisChart) {\n if (isFullyClosed) {\n return setData(null)\n }\n return popoverHide()\n }\n if (!isChartEventOfThisChart) return\n const { top, left } = activeChartEvent.instance\n const newData = activeChartEvent.getChartEventData()\n if (newData?.elementId !== data?.elementId) {\n setData({\n ...newData,\n badgeType: activeChartEvent.instance.getChartEvenBadgeType(),\n })\n }\n\n if (style.top !== top || style.left !== left) {\n popoverHide()\n setStyle({\n top,\n left,\n })\n }\n if (!popoverState.visible) {\n popoverShow()\n }\n }, [\n elementId,\n isFullyClosed,\n data,\n style,\n popoverShow,\n popoverHide,\n popoverState.visible,\n activeChartEvent,\n chartModel,\n isChartEventOfThisChart,\n ])\n\n return (\n <>\n \n {data && (\n \n )}\n \n )\n}\n","import React from 'react'\n\nimport Utils from '../utils'\n\nexport function useClickAway(callback: (event: MouseEvent | TouchEvent) => void, isListening = true) {\n const ref = React.useRef(null)\n const refCallback = React.useRef(callback)\n\n React.useLayoutEffect(() => {\n refCallback.current = callback\n })\n\n React.useEffect(() => {\n if (!isListening) {\n return\n }\n const isMobile = Utils.isMobile()\n const handler = (e: MouseEvent | TouchEvent) => {\n const element = ref.current\n if (element && e.target && !element.contains(e.target as HTMLElement)) {\n refCallback.current(e)\n }\n }\n\n document.addEventListener(isMobile ? 'touchstart' : 'mousedown', handler)\n\n return () => {\n document.removeEventListener(isMobile ? 'touchstart' : 'mousedown', handler)\n }\n }, [callback, isListening])\n\n return ref\n}\n","export const CHART_LAYOUT_CHILD_CHANGE_EVENT = 'chartLayoutChildChange'\n","import Spine from '@finviz/spine'\n\nimport { TodoObjectHashAnyType } from '../../types/shared'\n\ntype TodoContextConfig = TodoObjectHashAnyType\n\nclass ContextMenu extends Spine.Model {\n static initClass() {\n this.configure('ContextMenu', 'shown', 'config', 'top', 'left')\n }\n\n declare shown: boolean\n declare config: TodoContextConfig\n declare top: number\n declare left: number\n}\n\nContextMenu.initClass()\n\nconst contextMenu = ContextMenu.create() as ContextMenu\ncontextMenu.save()\n\nexport default contextMenu\n","import React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport { ObjectHash } from '../../types/shared'\nimport { ContextMenu as ContextMenuComponent } from '../components'\nimport model from '../models/context_menu'\nimport { ready } from '../utils'\n\nconst selector = '.context-menu'\n\nclass ContextMenu extends React.Component {\n componentDidMount() {\n model.bind('update', this.update)\n }\n\n componentWillUnmount() {\n model.unbind('update', this.update)\n }\n\n update = () => {\n this.forceUpdate()\n }\n\n render() {\n if (model.shown) {\n document.querySelector(selector)?.classList.remove('hidden')\n } else {\n document.querySelector(selector)?.classList.add('hidden')\n return null\n }\n\n return (\n <>\n this.hide()}\n onContextMenu={(e) => e.preventDefault()}\n data-testid=\"charts-context-menu-overlay\"\n >\n \n \n )\n }\n\n hide() {\n model.updateAttribute('shown', false)\n }\n}\nready(() => {\n const el = document.querySelector(selector)\n if (el) {\n ReactDOM.render(, el)\n }\n})\n\nconst contextMenuControl = {\n show: (event: MouseEvent | React.MouseEvent, config: ObjectHash) => {\n model.updateAttributes({\n shown: true,\n config: config,\n top: event.clientY + window.pageYOffset,\n left: event.clientX,\n })\n },\n}\n\nexport default contextMenuControl\n","import React from 'react'\n\nimport { Button, ButtonGroup, Delayed, Icon, Spinner } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport Chart from '../../models/chart'\nimport { QuoteFetchType } from '../../models/quote/constants'\nimport { useIsMounted } from '../../utils/use-is-mounted'\n\ninterface LoadLatestDataButtonProps {\n chartModel: Chart\n}\n\nexport function LoadLatestDataButton({ chartModel: chartModelUnwatched }: LoadLatestDataButtonProps) {\n const getIsMounted = useIsMounted()\n const chartModel = useModelState(chartModelUnwatched, { watchProperties: ['quote'] })\n const quoteModel = useModelState(chartModel.quote(), { watchProperties: ['isFetching'] })\n const [hasNewDataAvailable, setHasNewDataAvailable] = React.useState(false)\n\n React.useEffect(() => {\n if (!chartModel.getRefreshInterval()) {\n // We will do a check here if we have correct new data\n chartModel\n .quote()\n .isPossibleToFetchSequentialData()\n .then((hasNewData) => {\n if (getIsMounted()) {\n setHasNewDataAvailable(hasNewData)\n }\n })\n }\n // We need to run it only on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const handleLoadLatestData = async () => {\n const promises = chartModel\n .getAllQuotes()\n .map(async (quote) => quote.fetchData({ fetchType: QuoteFetchType.NewerData }))\n chartModel.updateAttributes({ refreshData: true })\n await Promise.all(promises)\n if (getIsMounted()) {\n setHasNewDataAvailable(false)\n window.gtag?.('event', 'load-latest-data', { event_category: 'ideas' })\n }\n }\n\n if (!hasNewDataAvailable) {\n return null\n }\n\n return (\n \n }>\n \n \n ) : (\n 'refresh'\n )\n }\n disabled={quoteModel?.isFetching}\n title=\"Load latest data\"\n onClick={handleLoadLatestData}\n data-testid=\"load-latest-data-button\"\n >\n Load latest data\n \n \n )\n}\n","import classnames from 'classnames'\nimport debounce from 'lodash.debounce'\nimport React from 'react'\n\nimport { Button, ButtonGroup, Icon } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport Chart from '../../models/chart'\nimport Utils from '../../utils'\nimport { getLeftOffset } from '../renderUtils'\nimport { LoadLatestDataButton } from './load-latest-data-button'\n\nexport const ZOOM_CONTROLS_ACTIVE_CLASS = 'is-active'\nexport const ZOOM_CONTROLS_IS_IN_AREA_CLASS = 'is-in-area'\n\nconst buttonCommonProps = {\n size: 'none',\n className: 'w-7 h-6',\n contentClass: 'flex justify-center',\n}\n\nconst isMobile = Utils.isMobile()\n\ninterface ZoomControlsProps {\n zoomControlsRef: React.RefObject\n isVisible: boolean\n chartModel: Chart\n onZoomIn: () => void\n onZoomOut: () => void\n onZoomReset: () => void\n}\n\nconst getDefaultLeftOffset = (chartModel: Chart) =>\n getLeftOffset({\n quote: chartModel.quote(),\n chartModel,\n config: {},\n })\n\nexport function ZoomControls({\n zoomControlsRef,\n chartModel,\n isVisible,\n onZoomIn,\n onZoomOut,\n onZoomReset,\n}: ZoomControlsProps) {\n const chartLayoutModel = useModelState(chartModel.chart_layout(), { watchProperties: ['idea'] })\n const [isGoToRecentVisible, setIsGoToRecentVisible] = React.useState(false)\n const { defaultZoomFactor } = chartLayoutModel\n const [isZoomResetVisible, setIsZoomResetVisible] = React.useState(chartModel.zoomFactor !== defaultZoomFactor)\n const handleGoToMostRecent = React.useCallback(() => {\n chartModel.updateAttributes({ leftOffset: getDefaultLeftOffset(chartModel), dateRange: null })\n }, [chartModel])\n\n React.useEffect(() => {\n const handleChartModelChangeDebounced = debounce(\n () => {\n setIsZoomResetVisible(chartModel.zoomFactor !== defaultZoomFactor)\n setIsGoToRecentVisible(chartModel.leftOffset !== getDefaultLeftOffset(chartModel))\n },\n 100,\n { maxWait: 333 }\n )\n chartModel.bind('change', handleChartModelChangeDebounced)\n return () => {\n handleChartModelChangeDebounced.cancel()\n chartModel.unbind('change', handleChartModelChangeDebounced)\n }\n }, [defaultZoomFactor, chartModel])\n\n return (\n \n {!isMobile && (\n
\n {isZoomResetVisible && (\n
\n \n \n \n \n \n
\n )}\n \n \n \n \n\n \n \n
\n )}\n\n
\n {!!chartLayoutModel.idea?.id && }\n\n {isGoToRecentVisible && (\n \n \n \n \n \n )}\n
\n \n )\n}\n","import Spine from '@finviz/spine'\nimport classnames from 'classnames'\nimport Hammer from 'hammerjs'\nimport debounce from 'lodash.debounce'\nimport React from 'react'\n\nimport { CustomSpineEvents, DrawingSpineOptionsEvent, EmptyObject, ObjectHash, PaneArea } from '../../../types/shared'\nimport CanvasElement from '../../canvas/element'\nimport ChartEvent from '../../chart-events/chart-event'\nimport { Button, Notification, Paragraph, withNotificationContext } from '../../components'\nimport { IndicatorType, ScaleType, SetVisibilityTo, SpecificChartFunctionality } from '../../constants/common'\nimport IndicatorElement from '../../indicators/indicator'\nimport { getContextWithCache } from '../../lib/shims'\nimport { withElementStyleDialogState } from '../../modals/element_style'\nimport ChartModel from '../../models/chart'\nimport ChartEventElement from '../../models/chart-event-element'\nimport ElementModel from '../../models/element'\nimport MouseModel from '../../models/mouse'\nimport PaneModel from '../../models/pane'\nimport Quote from '../../models/quote'\nimport { handleRemoveIndicatorPane } from '../../models/utils'\nimport Utils, { isRedesignedPage } from '../../utils'\nimport { getBarWidthWithMargin, unmountCanvas } from '../../utils/chart'\nimport { setElementCursor } from '../../utils/cursor'\nimport { getValueInRange, isPrimaryClick } from '../../utils/helpers'\nimport { getInitialStoreDrawings } from '../autosave/utils'\nimport { ChartEventPopoverWithState } from '../chart-events/chart-event-popover/chart-event-popover-with-state'\nimport { CHART_LAYOUT_CHILD_CHANGE_EVENT } from '../chart_layout/constants'\nimport ContextMenu from '../context_menu'\nimport { getMinMaxLeftOffset, getSettings, recountScale, renderPane } from '../renderUtils'\nimport { DrawingTool } from '../toolbar/interfaces'\nimport { getChartAlt } from '../utils'\nimport { withPaneModel } from './with-pane-model'\nimport { ZOOM_CONTROLS_ACTIVE_CLASS, ZOOM_CONTROLS_IS_IN_AREA_CLASS, ZoomControls } from './zoom_controls'\n\n// Indicates how many time lower/higher can new scale be compared to original one\nconst ALLOWED_MIN_MAX_ZOOM = 10000\n\ninterface PaneProps {\n model: PaneModel\n chartModel: ChartModel\n activeTool: DrawingTool\n activeChartInteraction: string | null\n chartIndex: number\n paneIndex: number\n touchEventsDisabled: boolean\n onPaneClick: (model: PaneModel) => void\n onZoomerReset: () => void\n onZoomerMouseDown: React.MouseEventHandler\n onZoomerTouchStart: React.TouchEventHandler\n onAddToZoomFactor: (data: { diff: number; shouldCalculateRightAlign: boolean }) => void\n onResizerMouseDown: (e: React.MouseEvent, model: PaneModel) => void\n onPaneDestroy: (paneId: string) => void\n setActiveChartInteraction: (value: string | null) => void\n openElementStyleDialog?: (element: CanvasElement | IndicatorElement) => void\n notificationContext: { show: (element: JSX.Element, options: { inline?: boolean }) => void; hide: () => void }\n}\n\ninterface PaneState {\n hasSeenCrossNotification: boolean\n}\n\nclass Pane extends React.Component {\n rafId?: number | null = null\n crossRafId?: number | null = null\n quoteModel: Quote\n paneRef = React.createRef()\n scalerRef = React.createRef()\n zoomerRef = React.createRef()\n zoomControlsRef = React.createRef()\n canvasWrapperRef = React.createRef()\n canvasRef = React.createRef()\n crossCanvasRef = React.createRef()\n chartLayoutModel = this.props.chartModel.chart_layout()\n paneHammer!: HammerManager\n scalerHammer!: HammerManager\n zoomerHammer!: HammerManager\n canvasWrapperHammer!: HammerManager\n mouseDown = false\n lastClientX?: number\n lastClientY?: number\n currentViewRange: { min: number; max: number } | null = null\n lastX!: number\n lastY!: number\n lastActiveTool: DrawingTool\n scalerLastY: number | null = null\n isElementHovered = false\n hoveredElement: CanvasElement | null = null\n isMobile: boolean\n isDisableTouchCrossAvailable = true\n\n canvas: HTMLCanvasElement | null = null\n canvasCtx: CanvasRenderingContext2D | null = null\n crossCanvas: HTMLCanvasElement | null = null\n crossCanvasCtx: CanvasRenderingContext2D | null = null\n isIndicatorPane = false\n\n state: PaneState = {\n hasSeenCrossNotification: !!window.localStorage.getItem('hasSeenCrossNotification'),\n }\n\n // expects chartModel, model, onResizerMouseDown, onPaneDestroy\n constructor(props: PaneProps) {\n super(props)\n\n this.quoteModel = this.props.chartModel.quote()\n props.model.updateAttribute('instance', this)\n props.model.bind('update', this.onModelUpdate)\n props.model\n .elements()\n .bind('create', this.onElementCreate)\n .bind('destroy', this.onElementDestroy)\n .bind('replace', this.onElementReplace)\n .bind('select', this.onElementSelect)\n .bind('makeClone', this.onElementClone)\n .bind('change', this.immediateRecountScaleOnChartIndicatorChange)\n .bind('change', debounce(this.recountScale, 50))\n props.model.bind(CustomSpineEvents.ManualChange, this.recountScale)\n\n props.model.chartEvents().bind('create', this.onElementCreate).bind('change', debounce(this.recountScale, 50))\n\n this.props.chartModel.bind('update', this.onChartUpdate)\n this.props.chartModel.bind(`change ${CustomSpineEvents.IndicatorsChange}`, this.recountScale)\n this.quoteModel.bind('change', this.recountScale)\n this.isMobile = !!Utils.isMobile()\n this.lastActiveTool = props.activeTool\n if (!MouseModel.pane()) {\n MouseModel.updateAttribute('pane', props.model)\n }\n this.isIndicatorPane = props.model.getIsIndicatorPane()\n this.recountScale()\n }\n\n componentDidMount() {\n const { model } = this.props\n this.chartLayoutModel.bind('theme', this.renderAll)\n this.chartLayoutModel.bind('theme', this.renderCross)\n\n const initialStoreDrawings = getInitialStoreDrawings() ?? []\n const elements = [...model.getAllElements(), ...model.getAllChartEvents(false)]\n elements.forEach((element) => {\n this.onElementCreate(element)\n if (element.isDrawing()) {\n const hasDrawingInInitialCache = initialStoreDrawings.some(({ elementId }) => element.elementId === elementId)\n if (hasDrawingInInitialCache) {\n element.instance?.updateScales()\n }\n element.instance.cachePointPositionTimestamp()\n } else if (element.isChartEvent()) {\n element.instance?.updateScales()\n }\n })\n\n model?.updateChartEventsZIndexes()\n\n this.canvas = this.canvasRef.current\n this.canvasCtx = getContextWithCache(this.canvasRef.current)\n this.crossCanvas = this.crossCanvasRef.current\n this.crossCanvasCtx = getContextWithCache(this.crossCanvasRef.current)\n\n this.paneHammer = new Hammer.Manager(this.paneRef.current!, { touchAction: 'none' })\n this.paneHammer.add(new Hammer.Press({ threshold: 5, time: 500 })) // chrome simulator \"long touch\" -> \"oncontextmenu\" is 680ms +- 2ms\n this.paneHammer.on('press', this.onPress)\n this.canvasWrapperHammer = new Hammer(this.canvasWrapperRef.current!, { touchAction: 'none' })\n this.canvasWrapperHammer.on('tap', this.onClick)\n this.canvasWrapperRef.current?.addEventListener('touchmove', this.onTouchMove, { passive: false })\n\n if (this.chartLayoutModel.scrollable || !this.isMobile) {\n if (this.scalerRef.current) {\n this.scalerHammer = new Hammer(this.scalerRef.current, { touchAction: 'none' })\n this.scalerHammer.on('doubletap', this.onScalerReset)\n }\n if (this.zoomerRef.current) {\n this.zoomerHammer = new Hammer(this.zoomerRef.current, { touchAction: 'none' })\n this.zoomerHammer.on('doubletap', this.props.onZoomerReset)\n }\n this.canvasWrapperHammer.on('doubletap', this.onDoubleClick)\n }\n\n this.onChartUpdate({ width: this.props.chartModel.width })\n this.onModelUpdate({ height: model.height })\n this.forceUpdate()\n this.chartLayoutModel.trigger(CHART_LAYOUT_CHILD_CHANGE_EVENT)\n }\n\n componentWillUnmount() {\n this.canvasWrapperRef.current?.removeEventListener('touchmove', this.onTouchMove)\n unmountCanvas(this.canvas)\n unmountCanvas(this.crossCanvas)\n this.props.chartModel.unbind('update', this.onChartUpdate)\n this.props.chartModel.unbind('change', this.recountScale)\n this.quoteModel.unbind('change', this.recountScale)\n }\n\n render() {\n const { activeTool, touchEventsDisabled, onPaneClick, paneIndex, chartIndex, model, chartModel } = this.props\n if (touchEventsDisabled) {\n this.paneHammer?.set({ touchAction: 'auto' })\n this.scalerHammer?.set({ touchAction: 'auto' })\n this.zoomerHammer?.set({ touchAction: 'auto' })\n this.canvasWrapperHammer?.set({ touchAction: 'auto' })\n } else {\n const touchAction = this.getIsHammerAllowScrollActive() ? 'auto' : 'none'\n this.scalerHammer?.set({ touchAction: 'none' })\n this.zoomerHammer?.set({ touchAction: 'none' })\n this.paneHammer?.set({ touchAction })\n this.canvasWrapperHammer?.set({ touchAction })\n }\n\n const isChartPane = model.getIsChartPane()\n\n return (\n onPaneClick(model)}\n onTouchStart={() => onPaneClick(model)}\n onContextMenu={this.onContextMenu}\n data-testid={`chart-${chartIndex}-pane-${paneIndex}`}\n >\n {isChartPane && }\n {paneIndex !== 0 && (\n this.props.onResizerMouseDown(e, model)}\n data-testid={`chart-${chartIndex}-pane-${paneIndex}-resizer`}\n />\n )}\n {this.chartLayoutModel.initialScrollable && (\n \n )}\n\n {this.chartLayoutModel.initialScrollable && isChartPane && (\n <>\n \n {\n this.props.onAddToZoomFactor({ diff: 0.1, shouldCalculateRightAlign: true })\n }}\n onZoomOut={() => {\n this.props.onAddToZoomFactor({ diff: -0.1, shouldCalculateRightAlign: true })\n }}\n onZoomReset={this.props.onZoomerReset}\n />\n \n )}\n \n {getChartAlt(this.quoteModel)}\n {this.chartLayoutModel.cross && }\n \n \n )\n }\n\n getIsHammerAllowScrollActive = () =>\n this.chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.chartPage &&\n !this.chartLayoutModel.isTouchCrossActive &&\n !this.chartLayoutModel.scrollable\n\n onElementCreate = (el: ElementModel | ChartEventElement) => {\n el.instance.bind('change', this.renderAll)\n this.renderAll()\n }\n\n onElementReplace = (el: ElementModel, oldElementInstance: CanvasElement) => {\n oldElementInstance.unbind('change', this.renderAll)\n el.instance.bind('change', this.renderAll)\n if (oldElementInstance === this.props.model.selection && !this.chartLayoutModel.isDrawingModeContinuousActive) {\n this.setSelection(el.instance)\n } else {\n this.setSelection(null)\n }\n this.renderAll()\n }\n\n onElementDestroy = (el: ElementModel) => {\n const { type } = el.instance\n el.instance.unbind('change', this.renderAll)\n if (el.instance === this.props.model.selection) {\n this.setSelection(null)\n }\n if (type.startsWith('charts/') || type.startsWith('indicators/')) {\n this.props.onPaneDestroy(el['pane_id'])\n }\n this.renderAll()\n }\n\n onElementSelect = (el: ElementModel) => {\n this.setSelectedElement(el.instance)\n }\n\n onElementClone = (_: unknown, clonedElementInstance: CanvasElement) => {\n this.setSelectedElement(clonedElementInstance)\n }\n\n onModelUpdate = ({ height }: { height: number }) => {\n this.setCanvasSize({\n width: this.props.chartModel.width,\n height,\n })\n }\n\n onChartUpdate = ({ width }: { width: number }) => {\n const { model, chartModel } = this.props\n this.setCanvasSize({\n width,\n height: model.height,\n })\n const quote = chartModel.quote()\n if (!this.quoteModel.eql(quote)) {\n this.quoteModel.unbind('change', this.recountScale)\n if (quote) {\n this.quoteModel = quote\n this.quoteModel.bind('change', this.recountScale)\n }\n }\n }\n\n onZoomerMouseMove: React.MouseEventHandler = (e) => {\n if (!this.chartLayoutModel.scrollable || (this.isMobile && !this.chartLayoutModel.isTouchCrossActive)) return\n const area = this.getArea(e)\n MouseModel.updateAttributes({\n position: { x: area.x, y: null },\n pane: this.props.model,\n })\n }\n\n onMouseMoveOnScrolling = (event: TouchEvent | MouseEvent) => {\n if (this.props.activeChartInteraction) {\n return\n }\n\n let { clientX, clientY } = event as MouseEvent\n const { model } = this.props\n\n const isTouch = typeof TouchEvent !== 'undefined' && event instanceof TouchEvent\n if (isTouch && event.targetTouches?.length > 0) {\n clientX = event.targetTouches[0].clientX\n clientY = event.targetTouches[0].clientY\n }\n if (!model.selection && !this.chartLayoutModel.activeChartEvent) {\n if (this.lastClientX != null) {\n const dif = this.lastClientX - clientX\n this.addToLeftOffset(-dif)\n }\n if (model.scaleRange && this.lastClientY != null) {\n let { min, max } = model.scaleRange\n let difY\n switch (this.props.chartModel.scale) {\n case ScaleType.Logarithmic: {\n difY = this.lastClientY - clientY\n min = model.scale.y.invert(model.scale.y(min) + difY)\n max = model.scale.y.invert(model.scale.y(max) + difY)\n break\n }\n default: {\n difY = (this.lastClientY - clientY) * (model.scale.y.invert(0) - model.scale.y.invert(1))\n min -= difY\n max -= difY\n break\n }\n }\n\n model.updateAttribute('scaleRange', { min, max })\n this.recountScale()\n this.currentViewRange = this.props.model.getChartOrIndicatorElement()?.instance?.getMinMax?.() ?? null\n }\n }\n this.lastClientX = clientX\n this.lastClientY = clientY\n }\n\n onScalerTouchStart: React.TouchEventHandler = (e) => {\n if (!this.chartLayoutModel.scrollable || this.props.touchEventsDisabled) return\n if (this.chartLayoutModel.scrollable && e.targetTouches.length === 1) {\n this.onScalerMouseDown(e.targetTouches[0])\n }\n }\n\n onScalerTouchMove = (e: TouchEvent) => {\n if (this.chartLayoutModel.scrollable && e.targetTouches.length === 1) {\n this.onScalerMouseMove(e.targetTouches[0])\n }\n }\n\n onScalerTouchEnd = () => {\n if (this.chartLayoutModel.scrollable) {\n this.onScalerMouseUp()\n }\n }\n\n onScalerMouseEnter = () => {\n MouseModel.updateAttributes({\n position: null,\n pane: null,\n })\n }\n\n onScalerMouseDown = (event: React.MouseEvent | React.Touch) => {\n const { activeChartInteraction, setActiveChartInteraction, model } = this.props\n if ((event instanceof MouseEvent && event.button) || activeChartInteraction || !this.chartLayoutModel.scrollable) {\n return\n }\n setActiveChartInteraction('scaler')\n\n this.scalerLastY = event.clientY\n // here we need current domain scale or former \"nice\" value\n const [currentDomainMax, currentDomainMin] = model.scale.y.domain()\n this.currentViewRange = { min: currentDomainMin, max: currentDomainMax }\n document.addEventListener<'mousemove'>('mousemove', this.onScalerMouseMove)\n document.addEventListener('mouseup', this.onScalerMouseUp)\n document.addEventListener('touchmove', this.onScalerTouchMove)\n document.addEventListener('touchend', this.onScalerTouchEnd)\n }\n\n onScalerMouseMove = (event: MouseEvent | Touch) => {\n const { model, chartModel } = this.props\n if (model.scaleRange === null && this.currentViewRange === null) {\n return\n }\n let { min, max } = model.scaleRange || this.currentViewRange!\n let difY\n switch (this.props.chartModel.scale) {\n case ScaleType.Logarithmic: {\n difY = this.scalerLastY! - event.clientY\n min = model.scale.y.invert(model.scale.y(min) - difY)\n max = model.scale.y.invert(model.scale.y(max) + difY)\n break\n }\n default: {\n difY = -(this.scalerLastY! - event.clientY) * (model.scale.y.invert(0) - model.scale.y.invert(1))\n min -= difY\n max += difY\n break\n }\n }\n this.scalerLastY = event.clientY\n\n const originalMinMax = model.getChartOrIndicatorElement()?.instance?.getMinMax?.()\n if (originalMinMax) {\n const currentDiff = Math.abs(max - min)\n const originalDiff = Math.abs(originalMinMax.max - originalMinMax.min)\n\n if (currentDiff > originalDiff * ALLOWED_MIN_MAX_ZOOM || currentDiff < originalDiff / ALLOWED_MIN_MAX_ZOOM) {\n return\n }\n }\n\n model.updateAttribute('scaleRange', { min, max })\n chartModel.updateAttribute('dateRange', null)\n this.recountScale()\n }\n\n onScalerMouseUp = () => {\n this.scalerLastY = null\n\n document.removeEventListener('mousemove', this.onScalerMouseMove)\n document.removeEventListener('mouseup', this.onScalerMouseUp)\n document.removeEventListener('touchmove', this.onScalerTouchMove)\n document.removeEventListener('touchend', this.onScalerTouchEnd)\n this.props.setActiveChartInteraction(null)\n }\n\n onScalerReset = () => {\n const { model, chartModel } = this.props\n if (!this.chartLayoutModel.scrollable) return\n chartModel.updateAttribute('dateRange', null)\n model.updateAttribute('scaleRange', null)\n this.recountScale()\n }\n\n addToLeftOffset = (n: number) => {\n const quote = this.props.chartModel.quote()\n const barWidth = getBarWidthWithMargin({\n chartLayout: this.chartLayoutModel,\n zoomFactor: this.props.chartModel.zoomFactor,\n })\n const leftOffset = getMinMaxLeftOffset({\n newLeftOffset: this.props.chartModel.leftOffset + n,\n chartModel: this.props.chartModel,\n barWidth,\n barIndex: quote.barIndex[quote.open.length - 1],\n })\n\n if (leftOffset > barWidth) {\n quote.fetchOlderData()\n }\n this.props.chartModel.updateAttributes({\n leftOffset,\n dateRange: null,\n })\n }\n\n onDoubleClick = (event: HammerInput) => {\n event.preventDefault()\n const area = this.getArea(event)\n const element = this.props.model.selection || this.getElement(area)\n if (element && element.type !== IndicatorType.Cot) {\n setTimeout(() => {\n this.props.openElementStyleDialog!(element)\n }, 0)\n element.trigger('dblclick', event)\n }\n }\n\n onPress = (e: ObjectHash) => {\n if (e.pointerType !== 'touch') return\n\n e.clientX = e.center.x\n e.clientY = e.center.y\n\n const el = this.props.model.selection || this.getElement(this.getArea(e))\n if (!this.chartLayoutModel.isTouchCrossActive) {\n if (!el) {\n this.onCanvasPress(e as React.MouseEvent)\n } else {\n this.onContextMenu(e as React.MouseEvent, el)\n }\n }\n }\n\n onContextMenu = (e: React.MouseEvent, element?: IndicatorElement | CanvasElement) => {\n e.preventDefault()\n const area = this.getArea(e)\n const elementInArea = this.getElement(area)\n const el = element ?? elementInArea\n if (!el || el.thumbsAreInArea(area)) {\n return\n }\n const elementModel = ElementModel.findByAttribute('instance', el)\n if (!elementModel) return\n this.setSelectedElement(el)\n const hasProperties =\n ['indicator', 'canvas'].some((type) => el.type.startsWith(type)) && el.type !== IndicatorType.Cot\n const isElementDrawing = elementModel.isDrawing()\n\n return ContextMenu.show(\n e,\n [\n hasProperties && {\n id: 'edit',\n label: 'Edit style',\n onClick: () => this.props.openElementStyleDialog!(el),\n },\n\n !(elementModel.isChart() || elementModel?.isIndicator()) && {\n id: 'clone',\n label: 'Clone',\n onClick: () => elementModel.makeClone(),\n },\n\n ...(isElementDrawing\n ? [\n { type: 'divider', label: 'Visibility' },\n\n {\n id: 'visibility-current-and-above',\n label: 'Current interval and above',\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentAndAbove),\n },\n\n {\n id: 'visibility-current-and-below',\n label: 'Current interval and below',\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentAndBelow),\n },\n\n {\n id: 'visibility-current-only',\n label: 'Current interval only',\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentOnly),\n },\n\n {\n id: 'visibility-all-intervals',\n label: 'All intervals',\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.all),\n },\n ]\n : []),\n\n (isElementDrawing || hasProperties) && { type: 'divider' },\n\n {\n id: 'bring-to-front',\n label: 'Bring to Front',\n onClick: () => elementModel.bringToFront(),\n },\n {\n id: 'send-to-back',\n label: 'Send to Back',\n onClick: () => elementModel.sendToBack(),\n },\n {\n id: 'bring-forward',\n label: 'Bring Forward',\n onClick: () => elementModel.bringForward(),\n },\n {\n id: 'send-backward',\n label: 'Send Backward',\n onClick: () => elementModel.sendBackward(),\n },\n\n { type: 'divider' },\n\n {\n id: 'remove',\n label: 'Remove',\n onClick: () => {\n if (elementModel.isIndicator()) {\n handleRemoveIndicatorPane({ paneIndex: this.props.paneIndex, chartLayoutModel: this.chartLayoutModel })\n } else {\n elementModel.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\n this.props.model.normalizeZIndexes()\n }\n },\n },\n ]\n .filter(Boolean)\n .map((item) => ({ ...item, gtag: { element_type: el.type } }))\n )\n }\n\n immediateRecountScaleOnChartIndicatorChange = (element?: ElementModel) => {\n if (element?.isChart() || element?.isIndicator()) {\n this.recountScale()\n }\n }\n\n recountScale = (_?: unknown, updateType?: Spine.Event) => {\n const { model } = this.props\n const chartModel = model.chart()\n if (updateType === 'destroy' || !chartModel || !chartModel.quote()) {\n return\n }\n\n recountScale({ chartModel, paneModel: model })\n\n if (this.canvasCtx) {\n this.renderAll()\n }\n }\n\n onBlur = () => {\n if (this.props.model.selection?.getIsCreator?.()) {\n this.setSelection(null)\n } else {\n this.setSelectedElement(null)\n }\n if (this.hoveredElement) {\n this.hoveredElement.setIsHovered(false)\n this.hoveredElement = null\n }\n this.props.model.getAllElements().forEach((element) => {\n if (element.instance.getIsCreator?.() && !element.instance.getIsCreatorDialogOpen?.()) {\n element.destroyCascade()\n }\n })\n }\n\n renderAll = (type?: string) => {\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = true\n if (type === 'cross' && this.chartLayoutModel.cross) {\n if (this.crossRafId === null) {\n this.crossRafId = window.requestAnimationFrame(() => {\n this.renderCross()\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = Date.now()\n })\n }\n } else if (this.rafId == null && this.canvasCtx) {\n this.rafId = window.requestAnimationFrame(() => {\n this._renderAll()\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = Date.now()\n })\n }\n }\n\n _renderAll = () => {\n const { model } = this.props\n // _renderAll may be called after Chart was deleted because of requestAnimationFrame\n if (model.chart() === null || this.canvasRef.current === null || !this.canvasCtx) {\n return\n }\n if (this.getIsUpdatedDesign()) {\n if (this.crossRafId === null) {\n this.crossRafId = window.requestAnimationFrame(this.renderCross)\n }\n }\n this.rafId = undefined\n\n renderPane({\n chartLayoutModel: this.chartLayoutModel,\n chartModel: this.props.chartModel,\n paneModel: model,\n canvasCtx: this.canvasCtx,\n })\n }\n\n getIsUpdatedDesign() {\n const { specificChartFunctionality } = this.chartLayoutModel\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isRedesignedFuturesForexCrypto = isRedesignedPage({ specificChartFunctionality })\n\n return isCharts || isRedesignedFuturesForexCrypto\n }\n\n renderCross = () => {\n const { model } = this.props\n const isMouseInPane = MouseModel.getShouldRenderCrossInPane(model)\n this.crossRafId = null\n if (!this.crossCanvasCtx) {\n return\n }\n this.crossCanvasCtx.clearRect(0, 0, this.props.chartModel.width, model.height)\n const isCrossDisabled =\n PaneModel.select((p) => !!p.selection && !p.selection.type.startsWith('indicators/')).length !== 0 ||\n this.props.chartModel.getIsDisabled() ||\n !isMouseInPane\n\n for (const { instance: elementInstance } of model.getAllElements()) {\n if (\n (!isCrossDisabled && elementInstance.renderCross != null) ||\n (isCrossDisabled && elementInstance.renderCrossText != null)\n ) {\n this.crossCanvasCtx.save()\n if (isCrossDisabled) {\n elementInstance.renderCrossText!(this.crossCanvasCtx, Number.NaN)\n } else {\n elementInstance.renderCross!(this.crossCanvasCtx)\n }\n this.crossCanvasCtx.restore()\n }\n }\n }\n\n getArea = (e: ObjectHash, additionalData?: T): PaneArea => {\n const { model } = this.props\n const clientX = e.clientX || additionalData?.clientX\n const clientY = e.clientY || additionalData?.clientY\n const Settings = getSettings(model)\n const areaRectangle = this.canvas!.getBoundingClientRect()\n const areaRectangleCursorX = clientX - areaRectangle.left\n const areaRectangleCursorY = clientY - areaRectangle.top\n const x = areaRectangleCursorX - model.chart().leftOffset - Settings.left.width\n const y = areaRectangleCursorY - Settings.top.height\n const scale = model.scale\n const chartLeftX = areaRectangle.left + Settings.left.width\n const chartRightX = areaRectangle.right - Settings.right.width\n return {\n ...(additionalData as T),\n // TODO: rewrite if canvas uses padding/border\n x: scale.x.invert(x),\n y: scale.y.invert(y),\n scaled: {\n x,\n y,\n },\n width: 1,\n height: 1,\n cursorX: areaRectangleCursorX,\n cursorY: areaRectangleCursorY,\n isCursorInChartWidthBoundaries: clientX > chartLeftX && clientX < chartRightX,\n }\n }\n\n setCanvasSize = ({ width, height }: { width: number; height: number }) => {\n const ratio = Utils.getScaleRatio()\n const canvasElement = this.canvasRef.current\n\n /**\n * It seems that value passed into element attr (e.g. height) is ceiled down,\n * so if you provide canvas element with height 100.5 we'll get integer 100 from canvasElement.height\n * If the difference in values between \"new height\" and canvasElement.height is less than 1, I treat it as the same value\n */\n if (\n this.canvasCtx &&\n canvasElement &&\n (Math.abs(height * ratio - canvasElement.height) >= 1 || Math.abs(width * ratio - canvasElement.width) >= 1)\n ) {\n Utils.setSizeOnCanvasElement({ canvasElement, width, height })\n this.canvasCtx.scale(ratio, ratio)\n if (this.chartLayoutModel.cross && this.crossCanvasCtx) {\n Utils.setSizeOnCanvasElement({\n canvasElement: this.crossCanvasRef.current,\n width,\n height,\n })\n this.crossCanvasCtx.scale(ratio, ratio)\n }\n setTimeout(() => {\n this.recountScale()\n })\n }\n }\n\n onClick = (event: HammerInput) => {\n const area = this.getArea(event, {\n clientX: event.center.x,\n clientY: event.center.y,\n })\n const element = this.props.model.selection || this.getElement(area)\n element?.trigger('click', area)\n\n if (!this.isDisableTouchCrossAvailable) {\n this.isDisableTouchCrossAvailable = true\n return\n }\n\n if (this.chartLayoutModel.isTouchCrossActive) {\n MouseModel.updateAttributes({\n position: null,\n pane: null,\n })\n this.chartLayoutModel.updateAttributes({\n scrollable: this.chartLayoutModel.initialScrollable,\n isTouchCrossActive: false,\n })\n } else if (\n this.isMobile &&\n !this.state.hasSeenCrossNotification &&\n this.lastActiveTool === DrawingTool.Mouse &&\n this.chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.smallIndex\n ) {\n const isChartsPage = this.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\n\n this.setState({ hasSeenCrossNotification: true })\n this.props.notificationContext.show(\n {\n this.props.notificationContext.hide()\n window.localStorage.setItem('hasSeenCrossNotification', 'true')\n }}\n >\n Got it\n \n }\n >\n Long press the chart to show the crosshair.\n ,\n { inline: !isChartsPage }\n )\n }\n\n this.lastActiveTool = this.props.activeTool\n }\n\n onPaneMouseLeave = () => {\n // timout in onPaneMouseMove may cause racecondition where active class is added right after it's been removed\n setTimeout(() => {\n this.zoomControlsRef.current?.classList.remove(ZOOM_CONTROLS_ACTIVE_CLASS, ZOOM_CONTROLS_IS_IN_AREA_CLASS)\n })\n if (this.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n this.renderCross()\n }\n }\n\n onPaneMouseMove = (e: React.MouseEvent | React.Touch, isMouseDownIgnored = false) => {\n const { model, chartModel } = this.props\n const zoomControls = this.zoomControlsRef.current\n const paneHeight = model.height\n if (zoomControls) {\n const area = this.getArea<{ mouseDown: boolean; clientX: number; clientY: number }>(e, {\n mouseDown: !isMouseDownIgnored && this.mouseDown,\n clientX: e.clientX,\n clientY: e.clientY,\n })\n\n // timeout is needed here as adding a classname on parent element of a button where we are listening on a click is not working properly if done synchrnousely\n setTimeout(() => {\n // 103 is the destance between pane bottom and zoom-controls top\n // zoomer bottom (8 px) + zoomer height (20px) - 13px + zoom controls height (75px) = 90px\n const isInArea = model.height - 90 <= area.cursorY && paneHeight > 210\n\n if (\n isInArea &&\n !zoomControls.classList.contains(ZOOM_CONTROLS_IS_IN_AREA_CLASS) &&\n !chartModel.getIsDisabled()\n ) {\n zoomControls.classList.add(ZOOM_CONTROLS_IS_IN_AREA_CLASS)\n } else if (!isInArea && zoomControls.classList.contains(ZOOM_CONTROLS_IS_IN_AREA_CLASS)) {\n zoomControls.classList.remove(ZOOM_CONTROLS_IS_IN_AREA_CLASS)\n }\n\n if (!area.mouseDown && !model.selection && isInArea && !chartModel.getIsDisabled()) {\n if (!zoomControls.classList.contains(ZOOM_CONTROLS_ACTIVE_CLASS)) {\n zoomControls.classList.add(ZOOM_CONTROLS_ACTIVE_CLASS)\n }\n } else if (zoomControls.classList.contains(ZOOM_CONTROLS_ACTIVE_CLASS)) {\n zoomControls.classList.remove(ZOOM_CONTROLS_ACTIVE_CLASS)\n }\n })\n }\n }\n\n onMouseLeave = () => {\n this.mouseDown = false\n }\n\n onTouchStart = (e: React.TouchEvent) => {\n if (!this.props.touchEventsDisabled && e.targetTouches.length === 1) {\n const touchEvent = e.targetTouches[0]\n if (this.chartLayoutModel.scrollable) {\n this.onCanvasInteractionStart(touchEvent)\n } else if (this.chartLayoutModel.isTouchCrossActive) {\n this.lastClientX = touchEvent.clientX\n this.lastClientY = touchEvent.clientY\n if (!MouseModel.pane()?.eql(this.props.model)) {\n const area = this.getArea(touchEvent, {\n mouseDown: this.mouseDown,\n clientX: touchEvent.clientX,\n clientY: touchEvent.clientY,\n })\n this.setMousePosition(this.getMousePositionInBoundaries(area))\n this.isDisableTouchCrossAvailable = false\n }\n } else {\n const area = this.getArea(touchEvent, { isTouch: true }) // passing isTouch is pretty confusing, it's used in Tools.jsx -> onMouseDown method\n const element = this.getElement(area)\n if (element?.getIsChartEvent?.()) {\n const chartEventElement = element as ChartEvent\n chartEventElement.toggleIsOpen()\n }\n }\n this.onPaneMouseMove(touchEvent, true)\n }\n }\n\n onTouchMove = (e: TouchEvent) => {\n if (!this.props.touchEventsDisabled) {\n if (!this.getIsHammerAllowScrollActive()) {\n e.preventDefault()\n }\n if (!this.props.touchEventsDisabled && e.targetTouches.length === 1) {\n this.onCanvasInteractionMove(e.targetTouches[0])\n }\n }\n }\n\n onTouchEnd = (e: React.TouchEvent) => {\n if (!this.props.touchEventsDisabled && this.chartLayoutModel.scrollable) {\n this.onCanvasInteractionEnd(e)\n }\n }\n\n onCanvasPress = (e: React.MouseEvent) => {\n if (this.chartLayoutModel.scrollable) {\n this.chartLayoutModel.updateAttribute('scrollable', false)\n document.removeEventListener('touchmove', this.onMouseMoveOnScrolling)\n }\n if (!this.chartLayoutModel.isTouchCrossActive) {\n this.chartLayoutModel.updateAttribute('isTouchCrossActive', true)\n this.onCanvasInteractionMove(e)\n }\n }\n\n onCanvasInteractionStart = (e: React.Touch | React.MouseEvent) => {\n const { activeTool, activeChartInteraction, chartModel, model } = this.props\n const isTouch = typeof Touch !== 'undefined' && e instanceof Touch\n this.lastActiveTool = activeTool\n\n if (isPrimaryClick(e) && !activeChartInteraction && !chartModel.getIsDisabled()) {\n const area = this.getArea(e, { isTouch }) // passing isTouch is pretty confusing, it's used in Tools.jsx -> onMouseDown method\n const element = this.getElement(area)\n if (this.chartLayoutModel.scrollable) {\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'grabbing' })\n if (model.scaleRange) {\n this.currentViewRange = model.getChartOrIndicatorElement()?.instance?.getMinMax?.() ?? null\n }\n document.addEventListener(isTouch ? 'touchmove' : 'mousemove', this.onMouseMoveOnScrolling)\n document.addEventListener(isTouch ? 'touchend' : 'mouseup', this.onCanvasInteractionEnd)\n }\n if (element?.getIsChartEvent?.()) {\n this.setSelectedElement(null)\n const chartEventElement = element as ChartEvent\n chartEventElement.toggleIsOpen()\n } else if (\n activeTool === DrawingTool.Mouse ||\n model.getAllElements().some(({ instance }) => instance.isCreator)\n ) {\n element?.trigger('mousedown', area)\n this.setSelectedElement(element)\n }\n model.trigger('mousedown', model, area, element)\n this.mouseDown = true\n this.lastX = area.x\n this.lastY = area.y\n }\n\n this.lastClientX = e.clientX\n this.lastClientY = e.clientY\n }\n\n onCanvasInteractionMove = (e: React.MouseEvent | React.Touch) => {\n const area = this.getArea(e, {\n mouseDown: this.mouseDown,\n clientX: e.clientX,\n clientY: e.clientY,\n })\n if (!area.isCursorInChartWidthBoundaries) {\n MouseModel.updateAttributes({\n position: null,\n pane: null,\n })\n return\n }\n\n const { model } = this.props\n const hoveredElement = this.getElement(area)\n const element = model.selection || hoveredElement\n\n if (!(this.isMobile && !this.chartLayoutModel.isTouchCrossActive)) {\n this.isDisableTouchCrossAvailable = true\n this.setMousePosition(\n this.lastClientX && this.lastClientY && this.chartLayoutModel.isTouchCrossActive && MouseModel.position\n ? this.getMousePositionInBoundaries({\n x: MouseModel.position.x + (model.scale.x.invert(area.clientX) - model.scale.x.invert(this.lastClientX)),\n y: MouseModel.position.y + (model.scale.y.invert(area.clientY) - model.scale.y.invert(this.lastClientY)),\n })\n : { x: area.x, y: area.y }\n )\n }\n\n if (!this.chartLayoutModel.scrollable) {\n this.lastClientX = area.clientX\n this.lastClientY = area.clientY\n }\n\n element?.trigger('mousemove', area)\n if (\n this.mouseDown &&\n model.selection instanceof CanvasElement &&\n !model.selection.activeThumb &&\n !this.chartLayoutModel.activeChartEvent\n ) {\n if (!model.selection.getIsCreator?.()) {\n model.selection.moveBy(area.x - this.lastX, area.y - this.lastY)\n }\n this.lastX = area.x\n this.lastY = area.y\n this.renderAll()\n }\n const isElementHovered =\n this.props.activeTool === DrawingTool.Mouse &&\n ((element && element === hoveredElement) || hoveredElement instanceof CanvasElement)\n\n if (hoveredElement !== this.hoveredElement && this.hoveredElement instanceof CanvasElement) {\n this.hoveredElement.setIsHovered(false)\n this.hoveredElement = null\n }\n\n if (isElementHovered && hoveredElement instanceof CanvasElement) {\n if (!hoveredElement.isHovered && !hoveredElement.isSelected) {\n hoveredElement.setIsHovered(true)\n this.hoveredElement = hoveredElement\n }\n }\n\n if (isElementHovered !== this.isElementHovered && this.canvas && hoveredElement?.type !== IndicatorType.Cot) {\n this.canvas.className = isElementHovered ? 'hover' : ''\n if (this.chartLayoutModel.cross && this.crossCanvas) {\n this.crossCanvas.className = `second${isElementHovered ? ' hover' : ''}`\n }\n this.isElementHovered = isElementHovered\n }\n }\n\n onCanvasInteractionEnd = (event: TouchEvent | MouseEvent | React.TouchEvent) => {\n if (MouseModel.position) {\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'crosshair' })\n } else {\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'default' })\n }\n const isTouch = typeof TouchEvent !== 'undefined' && event instanceof TouchEvent\n this.mouseDown = false\n const area = this.getArea(event)\n const element = this.props.model.selection || this.getElement(area)\n element?.trigger('mouseup', area)\n document.removeEventListener(isTouch ? 'touchmove' : 'mousemove', this.onMouseMoveOnScrolling)\n document.removeEventListener(isTouch ? 'touchend' : 'mouseup', this.onCanvasInteractionEnd)\n }\n\n getMousePositionInBoundaries = ({ x, y }: { x: number; y: number }) => {\n const { model } = this.props\n const Settings = getSettings(model)\n const canvasAreaRectangle = this.canvas!.getBoundingClientRect()\n const chartLeft = model.scale.x.invert(-model.chart().leftOffset + 1)\n const chartRight = model.scale.x.invert(\n canvasAreaRectangle.width - Settings.right.width - Settings.left.width - model.chart().leftOffset - 1\n )\n const chartTop = model.scale.y.invert(0)\n const chartBottom = model.scale.y.invert(canvasAreaRectangle.height - Settings.bottom.height - Settings.top.height)\n\n return {\n x: getValueInRange({\n value: x,\n min: chartLeft,\n max: chartRight,\n }),\n y: getValueInRange({\n value: y,\n min: chartBottom,\n max: chartTop,\n }),\n }\n }\n\n setMousePosition = ({ x, y }: { x: number; y: number }) => {\n const isSameMouseModel = !!MouseModel.pane()?.eql(this.props.model)\n MouseModel.updateAttributes({\n position: { x, y },\n ...(isSameMouseModel ? {} : { pane: this.props.model }),\n })\n }\n\n setSelection = (selection: IndicatorElement | CanvasElement | null) => {\n if (selection instanceof CanvasElement) {\n selection?.setIsSelected(true)\n }\n\n this.props.model.updateAttribute('selection', selection)\n }\n\n setSelectedElement = (element: IndicatorElement | CanvasElement | null) => {\n const { selection } = this.props.model\n const isSelectionCanvas = selection instanceof CanvasElement\n if (element !== selection || (isSelectionCanvas && element && !selection?.isSelected)) {\n if (isSelectionCanvas) {\n selection?.setIsSelected(false)\n }\n if (isSelectionCanvas && selection?.isCreator) {\n this.setSelection(null)\n } else {\n this.setSelection(element)\n }\n }\n }\n\n getElement = (area: PaneArea) => {\n const elements = this.props.model.getAllElements()\n const chartEvents = this.props.model.getAllChartEvents()\n\n for (let i = chartEvents.length - 1; i >= 0; i--) {\n const el = chartEvents[i].instance\n if (el.isInArea(area)) {\n return el\n }\n }\n\n for (let i = elements.length - 1; i >= 0; i--) {\n const el = elements[i].instance\n if (el.isInArea(area)) {\n return el\n }\n }\n return null\n }\n\n getCanvasDOMNode = () =>\n // This is used in app/modals/publish/publish.jsx\n this.canvasRef.current\n}\n\nexport default withNotificationContext(withElementStyleDialogState(withPaneModel(Pane)))\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport PaneModel from '../../models/pane'\n\nexport function withPaneModel

(Component: React.ComponentType

) {\n return function WrappedComponent(props: P) {\n const model = useModelState(props.model, { watchProperties: ['selection'] })\n\n return \n }\n}\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport { Spinner } from '../../components'\n\nexport function ChartSpinnerOverlay({ shouldDisplay, className }: { shouldDisplay: boolean; className: string }) {\n const [isVisible, setIsVisible] = React.useState(shouldDisplay)\n React.useEffect(() => {\n let timeout: number\n if (!shouldDisplay) {\n timeout = window.setTimeout(() => {\n setIsVisible(false)\n }, 400)\n }\n return () => {\n clearTimeout(timeout)\n }\n }, [shouldDisplay])\n\n return (\n <>\n {isVisible && (\n \n \n \n )}\n \n )\n}\n","import React from 'react'\n\nimport { ChartConfigObject } from '../../../types/shared'\nimport ChartModel from '../../models/chart'\nimport ChartLayout from '../../models/chart_layout'\nimport { DrawingTool } from '../toolbar/interfaces'\n\nexport const CHART_CLASS_NAMES = 'chart flex-1 relative'\nexport const DEFAULT_WRAPPER_COMPONENT = 'div'\n\nexport interface ChartProps {\n chartIndex: number\n gridArea?: string\n WrapperComp?: React.RefForwardingComponent\n config: ChartConfigObject\n chartModel: ChartModel\n layoutModel: ChartLayout\n setActiveChartInteraction: (interaction: string | null) => void\n activeChartInteraction: string | null\n activeTool: DrawingTool\n touchEventsDisabled: boolean\n hasOutline?: boolean\n shouldResize?: boolean\n renderChartToolbar?: () => React.ReactNode\n}\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport { Instrument } from '../../../types/shared'\nimport { ChartEditorEnum, SpecificChartFunctionality } from '../../constants/common'\nimport math from '../../helpers/math'\nimport ChartModel from '../../models/chart'\nimport ChartLayout from '../../models/chart_layout'\nimport MouseModel from '../../models/mouse'\nimport PaneModel from '../../models/pane'\nimport Quote from '../../models/quote'\nimport { QuoteFetchType } from '../../models/quote/constants'\nimport utils, { isRedesignEnabled } from '../../utils'\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../../utils/chart'\nimport { ChartControls } from '../chart-controls'\nimport Pane from '../pane'\nimport {\n getBarIndex,\n getIsSmallIndexChart,\n getLeftOffset,\n getMinMaxLeftOffset,\n updateZoomAndLeftOffsetByDateRange,\n} from '../renderUtils'\nimport { ChartProps } from './constants'\nimport { withChartInit } from './with-chart-init'\nimport { withWatchedPanesOnChartModel } from './with-watched-panes-on-chart-model'\n\nfunction preventDefaultFunc(event: Event) {\n event.preventDefault()\n}\n\nfunction getZoomFactor({\n chartLayout,\n currentZoomFactor,\n diff,\n minBarWidthInPx = 1,\n maxBarWidthInPx = 66,\n}: {\n chartLayout: ChartLayout\n currentZoomFactor: number\n diff: number\n minBarWidthInPx?: number\n maxBarWidthInPx?: number\n}) {\n const minZoomFactor = getZoomFactorForBarsToDisplay({\n chartLayout,\n chartVisibleWidth: minBarWidthInPx,\n numOfVisibleBars: 1,\n })\n const maxZoomFactor = getZoomFactorForBarsToDisplay({\n chartLayout,\n chartVisibleWidth: maxBarWidthInPx,\n numOfVisibleBars: 1,\n })\n const isNegativeDirection = diff < 0\n const newZoomFactor = currentZoomFactor + diff\n const newZoomFactorInRange = Math.min(Math.max(minZoomFactor, newZoomFactor), maxZoomFactor)\n\n if (newZoomFactor > newZoomFactorInRange && currentZoomFactor > newZoomFactorInRange) {\n return isNegativeDirection ? newZoomFactor : currentZoomFactor\n }\n\n if (newZoomFactor < newZoomFactorInRange && currentZoomFactor < newZoomFactorInRange) {\n return !isNegativeDirection ? newZoomFactor : currentZoomFactor\n }\n\n return newZoomFactorInRange\n}\n\ninterface ChartState {\n panesWrapperElement: HTMLDivElement | null\n}\n\nclass Chart extends React.Component {\n lastWidth: number\n mouseWheelTimeout?: number\n setStateWithPanesTimeout?: number\n lastHeight = 0\n lastY: number | null = null\n lastX: number | null = null\n resizerPaneIndex = -1\n minimalPaneHeight = 0\n zoomerRightAlign: {\n barIndex?: number\n index: number\n offsetDiff: number\n } | null = null\n\n // expects model, config, layoutModel\n constructor(props: ChartProps) {\n super(props)\n\n this.lastWidth = props.chartModel.width\n this.props.layoutModel.bind('change', this.onLayoutModelChange)\n this.state = { panesWrapperElement: null }\n }\n\n componentDidMount() {\n const { chartModel } = this.props\n this.lastWidth = this.props.layoutModel.width\n\n chartModel.trigger('change', chartModel)\n chartModel.bind('createPane', this.onPaneCreate)\n\n this.calculateMinimalPaneHeight()\n this.handleQuoteChange(chartModel.quote()!)\n this.onModelChange()\n\n chartModel.bind('update', this.onModelChange)\n chartModel.bind('destroy', () => {\n Quote.unbind('olderData', this.onOlderDataLoaded)\n Quote.unbind(`${QuoteFetchType.Refetch} ${QuoteFetchType.NewerData}`, this.onDataLoaded)\n })\n\n Quote.bind('olderData', this.onOlderDataLoaded)\n Quote.bind(`${QuoteFetchType.Refetch} ${QuoteFetchType.NewerData}`, this.onDataLoaded)\n }\n\n componentDidUpdate(prevProps: Readonly, prevState: Readonly) {\n if (\n prevState.panesWrapperElement !== this.state.panesWrapperElement ||\n prevProps.layoutModel.isWheelZoomEnabled !== this.props.layoutModel.isWheelZoomEnabled\n ) {\n prevState.panesWrapperElement?.removeEventListener('wheel', preventDefaultFunc)\n\n if (this.props.layoutModel.isWheelZoomEnabled) {\n // can't use onWheel as it has passive: true\n this.state.panesWrapperElement?.addEventListener('wheel', preventDefaultFunc, { passive: false })\n }\n }\n }\n\n componentWillUnmount() {\n const { chartModel, layoutModel } = this.props\n if (this.setStateWithPanesTimeout) {\n clearTimeout(this.setStateWithPanesTimeout)\n }\n layoutModel.unbind('change', this.onLayoutModelChange)\n chartModel.unbind('update', this.onModelChange)\n\n this.state.panesWrapperElement?.removeEventListener('wheel', preventDefaultFunc)\n }\n\n handleSetPanesWrapperRef = (panesWrapperElement: HTMLDivElement | null) => {\n this.setState({ panesWrapperElement })\n }\n\n render() {\n const { activeTool, chartIndex, layoutModel, chartModel, renderChartToolbar } = this.props\n const panes =\n layoutModel.specificChartFunctionality === SpecificChartFunctionality.futuresPage\n ? chartModel.getAllValidPanes()\n : chartModel.getAllPanes()\n const showSettings = layoutModel.editors.includes(ChartEditorEnum.settings)\n\n return (\n <>\n this.onClick(undefined)}\n data-testid={`chart-${chartIndex}-settings`}\n onMouseEnter={this.resetMouseModel}\n >\n {showSettings && }\n \n {layoutModel.editable && showSettings && renderChartToolbar && (\n \n {renderChartToolbar()}\n \n )}\n \n {panes.map((pane, index) => (\n \n ))}\n \n \n )\n }\n\n onMouseWheel = (e: React.WheelEvent) => {\n const { chartModel, layoutModel } = this.props\n const isLoading = chartModel.panes().count() < 1\n if (!layoutModel.isWheelZoomEnabled || isLoading) {\n return\n }\n if (!this.zoomerRightAlign) {\n this.calcZoomerRightAlign()\n }\n clearTimeout(this.mouseWheelTimeout)\n this.mouseWheelTimeout = window.setTimeout(() => {\n this.zoomerRightAlign = null\n }, 250)\n this.onZoomerMouseMove(e, undefined, true)\n }\n\n onClick = (activePane: PaneModel | undefined) => {\n if (\n !this.props.layoutModel.activeChart.eql(this.props.chartModel) ||\n !(this.props.layoutModel.activePane?.eql(activePane) || this.props.layoutModel.activePane === activePane)\n ) {\n this.props.layoutModel.updateAttributes({ activeChart: this.props.chartModel, activePane })\n }\n }\n\n onPaneCreate = () => {\n const { chartModel } = this.props\n this.onModelChange()\n this.calculateMinimalPaneHeight()\n chartModel.trigger('change', chartModel)\n }\n\n onPaneDestroy = (paneId: string) => {\n const { chartModel } = this.props\n const pane = chartModel.panes().find(paneId)\n\n if (pane) {\n pane.destroyCascade()\n this.onModelChange()\n chartModel.trigger('change', chartModel)\n }\n }\n\n onModelChange = (chartModelParam?: ChartModel) => {\n const { chartModel, config } = this.props\n const panes = chartModel.getAllPanes()\n const quote = chartModel.quote()\n\n if (panes.length === 0 || !quote || chartModel.leftOffset === undefined) {\n return\n }\n\n const { width, height } = chartModel\n let panesHeight = panes.reduce((sum, pane) => sum + (pane.height ?? 0), 0)\n if (panesHeight !== height) {\n panesHeight = panes.reduce((sum, pane) => {\n const newPaneHeight = Math.round((pane.height / panesHeight) * height)\n if (!Number.isNaN(newPaneHeight)) {\n pane.updateAttribute('height', newPaneHeight)\n }\n return sum + newPaneHeight\n }, 0)\n const chartPane = chartModel.getChartPane()\n if (chartPane && panesHeight !== height) {\n const newChartPaneHeight = chartPane.height + height - panesHeight\n if (!Number.isNaN(newChartPaneHeight)) {\n chartPane.updateAttribute('height', newChartPaneHeight)\n }\n }\n }\n\n const newLeftOffset = getLeftOffset({\n quote,\n chartModel,\n config: config,\n })\n const newIsScrolled = chartModel.leftOffset !== newLeftOffset\n const isScrolled = chartModel.isScrolled\n if (!isScrolled && this.lastWidth !== width) {\n this.lastWidth = width\n chartModel.updateAttribute('leftOffset', newLeftOffset)\n } else if (isScrolled !== newIsScrolled) {\n chartModel.updateAttributes({ isScrolled: newIsScrolled })\n }\n\n if (this.lastHeight !== height) {\n this.lastHeight = height\n this.calculateMinimalPaneHeight()\n }\n\n if (chartModelParam) {\n this.handleQuoteChange(chartModelParam.quote())\n }\n }\n\n onLayoutModelChange = ({ activeChart, activePane }: { activeChart: ChartModel; activePane: PaneModel }) => {\n const { chartModel } = this.props\n if (!activeChart) {\n return\n }\n for (const pane of chartModel.getAllPanes()) {\n if (activePane?.id !== pane.id && pane.selection?.isSelected === true) {\n pane.selection.setIsSelected(false)\n pane.updateAttribute('selection', undefined)\n }\n }\n }\n\n onResizerMouseDown = (e: React.MouseEvent | MouseEvent, model: PaneModel) => {\n if (e.button !== 0) {\n return\n }\n this.lastY = e.clientY\n this.resizerPaneIndex = this.props.chartModel\n .panes()\n .all()\n .findIndex((pane) => pane.eql(model))\n document.addEventListener('mousemove', this.onResizerMouseMove)\n document.addEventListener('mouseup', this.onResizerMouseUp)\n }\n\n onResizerMouseMove = (e: MouseEvent) => {\n if (this.resizerPaneIndex > 0 && this.lastY !== null && this.resizePanesAccordingly(this.lastY! - e.clientY)) {\n this.lastY = e.clientY\n }\n }\n\n onResizerMouseUp = (e: MouseEvent) => {\n const { chartModel } = this.props\n if (this.resizerPaneIndex > 0 && this.lastY !== null) {\n this.resizePanesAccordingly(this.lastY - e.clientY)\n this.lastY = null\n\n chartModel.trigger('change', chartModel)\n }\n\n document.removeEventListener('mousemove', this.onResizerMouseMove)\n document.removeEventListener('mouseup', this.onResizerMouseUp)\n }\n\n calculateMinimalPaneHeight() {\n const { chartModel } = this.props\n const { minHeight, total } = chartModel\n .panes()\n .all()\n .reduce(\n ({ minHeight, total }, pane) => {\n if (minHeight > pane.height) {\n minHeight = pane.height\n }\n total += pane.getIsChartPane() ? 3 : 1\n return { minHeight, total }\n },\n { minHeight: chartModel.height, total: 0 }\n )\n const optiMinHeight = Math.floor(chartModel.height / total)\n this.minimalPaneHeight = Math.min(minHeight, optiMinHeight)\n }\n\n resizePanesAccordingly(difY: number) {\n const { chartModel } = this.props\n const panes = chartModel.panes().all()\n let basePane = this.resizerPaneIndex\n if (!difY) {\n return true\n } else if (difY > 0) {\n let i = basePane\n let pane = panes[i]\n if (pane.height + difY >= this.minimalPaneHeight) {\n pane.updateAttribute('height', pane.height + difY)\n } else {\n pane.updateAttribute('height', this.minimalPaneHeight)\n }\n for (--i; i >= 0; i--) {\n pane = panes[i]\n if (pane.height - difY >= this.minimalPaneHeight) {\n pane.updateAttribute('height', pane.height - difY)\n break\n } else {\n pane.updateAttribute('height', this.minimalPaneHeight)\n }\n }\n } else if (difY < 0) {\n basePane = Math.max(0, basePane - 1)\n let i = basePane\n let pane = panes[i]\n if (pane.height - difY >= this.minimalPaneHeight) {\n pane.updateAttribute('height', pane.height - difY)\n } else {\n pane.updateAttribute('height', this.minimalPaneHeight)\n }\n for (++i; i < panes.length; i++) {\n pane = panes[i]\n if (pane.height + difY >= this.minimalPaneHeight) {\n pane.updateAttribute('height', pane.height + difY)\n break\n } else {\n pane.updateAttribute('height', this.minimalPaneHeight)\n }\n }\n }\n\n const panesHeight = panes.reduce((sum, pane) => sum + pane.height, 0)\n if (panesHeight !== chartModel.height) {\n difY = chartModel.height - panesHeight\n\n const pane = panes[basePane]\n pane.updateAttribute('height', pane.height + difY)\n\n // if we exceeded total height we need to stop updating lastY - return false\n return false\n }\n\n return true\n }\n\n onZoomerTouchStart = (e: React.TouchEvent | TouchEvent) => {\n if (!this.props.layoutModel.scrollable || e.touches.length !== 1 || this.props.touchEventsDisabled) {\n return\n }\n this.onZoomerMouseDown(e.targetTouches[0])\n }\n\n onZoomerTouchMove = (e: TouchEvent) => {\n if (!this.props.layoutModel.scrollable || e.touches.length !== 1) {\n return\n }\n this.onZoomerMouseMove(e.targetTouches[0])\n }\n\n onZoomerTouchEnd = () => {\n if (!this.props.layoutModel.scrollable) {\n return\n }\n this.onZoomerMouseUp()\n }\n\n getRawDistance = (e: Pick) => {\n const p1 = { x: e.touches[0].clientX, y: e.touches[0].clientY }\n const p2 = { x: e.touches[1].clientX, y: e.touches[1].clientY }\n return math.distance(p1, p2)\n }\n\n onPinchStart = (e: React.TouchEvent) => {\n const { chartModel } = this.props\n const { activeChartInteraction, setActiveChartInteraction, touchEventsDisabled } = this.props\n const isLoading = chartModel.panes().count() < 1\n\n if (\n this.props.layoutModel.scrollable &&\n e.touches.length === 2 &&\n !activeChartInteraction &&\n !isLoading &&\n !touchEventsDisabled\n ) {\n setActiveChartInteraction('pinch')\n this.onZoomerMouseDown({ clientX: this.getRawDistance(e as unknown as TouchEvent) })\n\n document.addEventListener('touchmove', this.onPinchMove)\n document.addEventListener('touchend', this.onPinchEnd)\n }\n }\n\n onPinchMove = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n this.onZoomerMouseMove({ clientX: this.getRawDistance(e) })\n }\n }\n\n onPinchEnd = (e: TouchEvent) => {\n if (e.touches.length === 1) {\n this.onZoomerMouseUp()\n document.removeEventListener('touchmove', this.onPinchMove)\n document.removeEventListener('touchend', this.onPinchEnd)\n }\n }\n\n calcZoomerRightAlign = () => {\n const { chartModel } = this.props\n const { ChartSettings } = chartModel.getChartLayoutSettings()\n const quote = chartModel.quote()\n const fx = chartModel.panes().first().scale.x\n const barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: this.props.layoutModel })\n const currentLeftOffset = getLeftOffset({ quote, chartModel, config: this.props.config, barWidth })\n this.zoomerRightAlign = null\n\n if (quote.isIntraday && quote.instrument === Instrument.Stock) {\n const barIndex = quote.getBarIndex(quote.close.length - 1)\n let offsetDiff =\n chartModel.leftOffset -\n getLeftOffset({\n quote,\n chartModel: chartModel,\n config: this.props.config,\n barWidth,\n barIndex,\n shouldAlignDaysToLeftApplied: false,\n })\n const offsetBars = ~~(offsetDiff / barWidth)\n offsetDiff -= offsetBars * barWidth\n this.zoomerRightAlign = {\n barIndex,\n index: barIndex - offsetBars,\n offsetDiff,\n }\n } else if (chartModel.leftOffset <= currentLeftOffset) {\n this.zoomerRightAlign = {\n index: quote.getBarIndex(quote.open.length - 1),\n offsetDiff: chartModel.leftOffset - currentLeftOffset,\n }\n } else {\n const offset = chartModel.leftOffset\n for (let i = 0; i < quote.open.length; i += 1) {\n const x = fx(i)\n if (x + offset < 0) {\n continue\n }\n if (x + offset > chartModel.width - ChartSettings.left.width - ChartSettings.right.width) {\n const barIndex = quote.getBarIndex(i - 1)\n let offsetDiff =\n offset -\n getLeftOffset({\n quote,\n chartModel,\n config: this.props.config,\n barWidth,\n barIndex,\n })\n const offsetBars = ~~(offsetDiff / barWidth)\n offsetDiff -= offsetBars * barWidth\n this.zoomerRightAlign = {\n barIndex,\n index: barIndex - offsetBars,\n offsetDiff,\n }\n break\n }\n }\n }\n }\n\n onZoomerMouseDown = (e: Partial) => {\n if ((e.button !== 0 && 'button' in e) || !this.props.layoutModel.scrollable) {\n return\n }\n switch (this.props.activeChartInteraction) {\n case 'pinch':\n break\n case null:\n this.props.setActiveChartInteraction('zoomer')\n break\n default:\n return\n }\n\n this.lastX = e.clientX ?? null\n this.calcZoomerRightAlign()\n\n document.addEventListener('mousemove', this.onZoomerMouseMove)\n document.addEventListener('mouseup', this.onZoomerMouseUp)\n document.addEventListener('touchmove', this.onZoomerTouchMove)\n document.addEventListener('touchend', this.onZoomerTouchEnd)\n }\n\n normalizeWheelDeltaY = (e: WheelEvent) => {\n // because wheel deltaY on mouse and touchpad is quite different we need to normalize it\n const abs = Math.abs(e.deltaY)\n if (abs === 0) return 0\n return Math.log(abs) * Math.sign(e.deltaY) * 10\n }\n\n onZoomerMouseMove = (\n e: React.WheelEvent | MouseEvent | Touch | { clientX: number },\n _?: unknown,\n isMouseWheel = false\n ) => {\n const { chartModel, layoutModel } = this.props\n let difX\n if (!layoutModel.scrollable) return\n if (!isMouseWheel && this.lastX !== null) {\n difX = (this.lastX - e.clientX) / chartModel.width\n this.lastX = e.clientX\n } else {\n // standard difX calculation result is around 0.00x, wheel deltaY is whole px\n // because of that we divide px with 1000\n difX = this.normalizeWheelDeltaY(e as WheelEvent) / 1000\n }\n\n this.addToZoomFactor({ diff: -difX })\n }\n\n addToZoomFactor = ({\n diff,\n shouldCalculateRightAlign = false,\n }: {\n diff: number\n shouldCalculateRightAlign?: boolean\n }) => {\n const { chartModel, layoutModel } = this.props\n if (shouldCalculateRightAlign) {\n this.calcZoomerRightAlign()\n }\n // 6 is default bar width with margin on charts page, so to get the similar feeling when zooming we're multiplying the zoom factor by the coefficient\n const diffCoefficient = chartModel.zoomFactor * (6 / getBarWidthWithMargin({ chartLayout: this.props.layoutModel }))\n const zoomFactor = getZoomFactor({\n chartLayout: layoutModel,\n currentZoomFactor: chartModel.zoomFactor,\n diff: diff * diffCoefficient,\n })\n const barWidth = getBarWidthWithMargin({\n zoomFactor,\n chartLayout: this.props.layoutModel,\n })\n\n let leftOffset\n if (this.props.config.stretch) {\n leftOffset = 0\n } else if (getIsSmallIndexChart(this.props.layoutModel.specificChartFunctionality)) {\n leftOffset = barWidth\n } else if (this.zoomerRightAlign) {\n leftOffset = getMinMaxLeftOffset({\n newLeftOffset:\n getLeftOffset({\n quote: chartModel.quote(),\n chartModel: chartModel,\n config: this.props.config,\n barWidth,\n barIndex: this.zoomerRightAlign.index,\n shouldAlignDaysToLeftApplied: false,\n }) + this.zoomerRightAlign.offsetDiff,\n chartModel: chartModel,\n barWidth,\n barIndex: getBarIndex(chartModel.quote()),\n })\n } else {\n return\n }\n chartModel.updateAttributes({\n zoomFactor,\n leftOffset,\n dateRange: null,\n })\n if (shouldCalculateRightAlign) {\n this.zoomerRightAlign = null\n }\n }\n\n onZoomerMouseUp = () => {\n this.zoomerRightAlign = null\n document.removeEventListener('mousemove', this.onZoomerMouseMove)\n document.removeEventListener('mouseup', this.onZoomerMouseUp)\n document.removeEventListener('touchmove', this.onZoomerTouchMove)\n document.removeEventListener('touchend', this.onZoomerTouchEnd)\n this.props.setActiveChartInteraction(null)\n }\n\n onZoomerReset = () => {\n const { chartModel, layoutModel } = this.props\n const zoomFactor = chartModel.chart_layout().defaultZoomFactor\n const barWidth = getBarWidthWithMargin({ zoomFactor, chartLayout: layoutModel })\n const leftOffset = getLeftOffset({\n quote: chartModel.quote(),\n chartModel,\n config: this.props.config,\n barWidth,\n })\n\n chartModel.updateAttributes({\n zoomFactor,\n leftOffset,\n dateRange: null,\n })\n }\n\n onOlderDataLoaded = () => {\n throw new Error('onOlderDataLoaded not implemented')\n // TODO implement similarly to onDataLoaded\n }\n\n resetMouseModel = () => {\n const isLoading = this.props.chartModel.panes().count() < 1\n if (!isLoading) {\n MouseModel.updateAttributes({\n position: null,\n pane: null,\n })\n }\n }\n\n handleQuoteChange = (quote: Quote) => {\n const { chartModel } = this.props\n\n // Update only date range chart\n if (chartModel.dateRange) {\n if (!quote.eql(chartModel.quote()) || chartModel.timeframe !== quote.timeframe || quote.date.length === 0) {\n return\n }\n updateZoomAndLeftOffsetByDateRange({ chartModel, quote })\n }\n }\n\n onDataLoaded = (newQuote: Quote, fetchType: QuoteFetchType) => {\n const { chartModel } = this.props\n const quote = chartModel.quote()\n if (!quote?.eql(newQuote)) {\n return\n }\n\n const shouldForceLeftOffsetUpdate = fetchType === QuoteFetchType.Refetch\n let newLeftOffset = chartModel.leftOffset // TODO find proper fix. If this line is removed (if we don't trigger leftOffset update), the chart stops being updated for the user until they move chart around.\n if (\n (this.props.layoutModel.scrollable === false && !this.props.layoutModel.isTouchCrossActive) ||\n !chartModel.isScrolled ||\n shouldForceLeftOffsetUpdate\n ) {\n newLeftOffset = getLeftOffset({\n quote,\n chartModel: chartModel,\n config: this.props.config,\n })\n }\n\n chartModel.setChartEvents(quote.chartEvents, !quote.events)\n\n if (newLeftOffset !== chartModel.leftOffset) {\n chartModel.getAllElements().forEach((element) => {\n if (element.isDrawing() && !element.isMouseDown()) {\n element.instance.updateScales()\n }\n })\n }\n\n chartModel.updateAttribute('leftOffset', newLeftOffset)\n\n this.handleQuoteChange(quote)\n }\n}\n\nexport default withChartInit(withWatchedPanesOnChartModel(Chart))\n","import classNames from 'classnames'\nimport merge from 'lodash.merge'\nimport React from 'react'\n\nimport { ObjectHash } from '../../../types/shared'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport Quote from '../../models/quote'\nimport { getChartsDimensions, isRedesignEnabled } from '../../utils'\nimport { prefetchPerfIndicatorAllQuotes } from '../../utils/chart'\nimport { getLeftOffset } from '../renderUtils'\nimport { ChartSpinnerOverlay } from './chart-spinner-overlay'\nimport { CHART_CLASS_NAMES, ChartProps, DEFAULT_WRAPPER_COMPONENT } from './constants'\n\nexport function withChartInit(Component: React.ComponentType) {\n return function WrappedComponent(props: ChartProps) {\n const { WrapperComp = DEFAULT_WRAPPER_COMPONENT, gridArea } = props\n const isModelDestroyedRef = React.useRef(false)\n const model = useModelState(props.chartModel, { watchProperties: ['panes', 'quote'] })\n const layoutModel = useModelState(props.layoutModel, { watchProperties: ['activeChart'] })\n const quote = model.quote()\n\n const initChartRef = React.useRef(async () => {\n const { chartModel, config } = props\n const { premarket, hasChartEvents, aftermarket, ticker, instrument, timeframe, panes: panesConfig } = config\n\n const options = {\n premarket,\n aftermarket,\n events: hasChartEvents,\n patterns: panesConfig.some(\n (pane) =>\n pane.elements?.some(\n (element) => element.overlays?.some((overlay: ObjectHash) => overlay.type === 'overlays/patterns')\n )\n ),\n }\n\n const quote = await Quote.get({\n ticker,\n instrument,\n timeframe,\n options,\n })\n const panesWithPerfIndicator = panesConfig.filter(({ elements }) =>\n elements.some(({ type }) => type === 'indicators/perf')\n )\n\n if (panesWithPerfIndicator) {\n await Promise.allSettled(\n panesWithPerfIndicator.map((paneWithPerfIndicator) =>\n prefetchPerfIndicatorAllQuotes({ paneWithPerfIndicator, timeframe, options })\n )\n )\n }\n\n if (isModelDestroyedRef.current) {\n return\n }\n\n config.panes.forEach((pane) => {\n const paneProperties = merge({}, pane)\n paneProperties.chart = chartModel\n chartModel.createPaneCascade(paneProperties)\n })\n\n chartModel.updateAttributes({\n quote,\n premarket: options.premarket,\n aftermarket: options.aftermarket,\n })\n\n chartModel.setChartEvents(quote.chartEvents, true)\n\n if (props.shouldResize) {\n const chartsDimensions = getChartsDimensions(props.layoutModel.getHTMLElementId())\n props.layoutModel.updateAttributes(chartsDimensions)\n }\n\n if (chartModel.leftOffset == null) {\n const leftOffset = getLeftOffset({ quote, chartModel: chartModel, config: props.config })\n chartModel.updateAttribute('leftOffset', leftOffset)\n }\n })\n\n React.useEffect(() => {\n const handleModelBeforeDestroy = () => {\n isModelDestroyedRef.current = true\n }\n\n model.bind('beforeDestroy', handleModelBeforeDestroy)\n initChartRef.current()\n return () => {\n model.unbind('beforeDestroy', handleModelBeforeDestroy)\n }\n // We want to run it only on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const isQuotePage = props.layoutModel.specificChartFunctionality === SpecificChartFunctionality.quotePage\n const isChartPage = props.layoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isFuturesForexCryptoPage = [\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n ].includes(props.layoutModel.specificChartFunctionality)\n const isModelReady =\n quote && ((quote.fetchedAt === undefined && quote.close.length > 0) || quote.fetchedAt > 0 || quote)\n const loadingStyle =\n !isModelReady && isQuotePage\n ? // 2px is border\n { width: model.width ? model.width + 2 : '100%', height: model.height + 2 }\n : undefined\n\n return (\n \n {isChartPage && (\n \n )}\n {isModelReady && }\n \n )\n }\n}\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartModel from '../../models/chart'\n\nexport function withWatchedPanesOnChartModel

(Component: React.ComponentType

) {\n return function WrappedComponent(props: P) {\n const model = useModelState(props.chartModel, { watchProperties: ['panes'] })\n\n return \n }\n}\n","export const portfolioWatchlistAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist\" */ './portfolio-watchlist'),\n cacheKey: 'portfolio-watchlist',\n}\n","import React from 'react'\n\nimport { Button, Paragraph } from '../../../components'\n\nexport function ModuleLoadFailed() {\n return (\n

\n
\n \n The Sidebar Widget didn't load successfully. Please refresh the page.\n \n \n
\n
\n )\n}\n","import React from 'react'\n\nimport { portfolioWatchlistAsyncModule } from './portfolio-watchlist/async-modules'\nimport { withModuleAsyncLoad } from './with-module-async-load'\n\nexport enum SidebarModule {\n portfolio = 'portfolio',\n}\n\nexport type SidebarModuleType = {\n key: SidebarModule\n icon: string\n description: string\n content: React.ComponentType\n width?: {\n min?: number | string\n max?: number | string\n default?: { desktop?: number; mobile?: number }\n }\n}\n\nexport const sidebarModules: Record = Object.freeze({\n [SidebarModule.portfolio]: {\n key: SidebarModule.portfolio,\n icon: 'briefcase',\n description: 'Portfolio watchlist',\n content: withModuleAsyncLoad(portfolioWatchlistAsyncModule, true),\n width: { min: 200, default: { mobile: 275 } },\n },\n})\n","import React from 'react'\n\nimport { Delayed, Spinner } from '../../../components'\nimport { useAsyncModule } from '../../../utils/async-modules-utils'\nimport { ModuleLoadFailed } from './module-load-failed'\n\nexport function withModuleAsyncLoad<\n T extends { default: React.ComponentType<{ setIsComponentReady: React.Dispatch> }> },\n>(asyncModule: { importFn: () => Promise; cacheKey: string }, withInitialLoading = false) {\n return function InnerFunction() {\n const [isComponentReady, setIsComponentReady] = React.useState(false)\n const [sidebarModule, { isLoading, isError }] = useAsyncModule({\n ...asyncModule,\n shouldLoadModule: true,\n })\n\n const SidebarModule = sidebarModule?.default\n\n if (isError) {\n return \n }\n\n return (\n <>\n {(isLoading || (!isComponentReady && withInitialLoading)) && (\n \n
\n \n
\n
\n )}\n {!!SidebarModule && }\n \n )\n }\n}\n","import { Resizable } from 're-resizable'\nimport React from 'react'\n\nimport Utils from '../../utils'\nimport { DEFAULT_WIDTHS, SidebarDirection } from './constants'\nimport { useSidebarContext } from './hooks/sidebar-context'\n\ntype SidebarContentProps = {\n children: React.ReactNode\n}\n\nexport default function SidebarContent({ children }: SidebarContentProps) {\n const { direction, onResize, close, width } = useSidebarContext()\n const minWidth = width?.min ?? DEFAULT_WIDTHS.min\n const maxWidth = width?.max ?? DEFAULT_WIDTHS.max\n const defaultMobile = width?.default?.mobile ?? minWidth\n const defaultDesktop = width?.default?.desktop ?? maxWidth\n\n return (\n <>\n {direction === SidebarDirection.vertical && (\n \n {children}\n \n )}\n {direction === SidebarDirection.horizontal && (\n <>\n
\n
\n {children}\n
\n \n )}\n \n )\n}\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport { Button, Icon, Paragraph, Tooltip, TooltipTrigger, useTooltipState } from '../../components'\nimport { SidebarDirection } from './constants'\nimport { useSidebarContext } from './hooks/sidebar-context'\nimport { sidebarModules } from './modules/modules'\n\nexport const MOBILE_TOOLBAR_DIV_ID = 'toolbar-mobile'\n\ntype SidebarTabsProps = {\n className?: string\n}\n\nexport default function SidebarTabs({ className }: SidebarTabsProps) {\n const { isOpen, direction, activeModule, selectModule } = useSidebarContext()\n const tooltipState = useTooltipState({ placement: 'left', unstable_timeout: 300 })\n\n return (\n \n {/* reserved space for drawing button on mobile devices */}\n {direction === SidebarDirection.horizontal && (\n \n )}\n\n {Object.entries(sidebarModules).map(([key, value]) => {\n const isActive = activeModule?.key === key\n return (\n \n \n {\n selectModule(isActive ? undefined : value.key)\n }}\n className={classnames({ 'ml-2': direction === SidebarDirection.horizontal })}\n data-testid={`sidebar-${key}-btn`}\n >\n \n \n \n \n {value.description}\n \n \n )\n })}\n
\n )\n}\n","import React from 'react'\nimport { useNavigate, useSearchParams } from 'react-router-dom'\n\nimport { getIsMobilePortrait } from '../../utils'\nimport { localStorage } from '../../website-shared'\nimport { SidebarDirection } from './constants'\nimport { SidebarContext, SidebarContextType } from './hooks/sidebar-context'\nimport { SidebarModule, SidebarModuleType, sidebarModules } from './modules/modules'\nimport SidebarContent from './sidebar-content'\nimport SidebarTabs from './sidebar-tabs'\n\nexport const SIDEBAR_QUERY_PARAM = 'sidebar'\n\n// This is a temp function, to remove unused property from localstorage\nfunction removeSidebarFromLocalstorage() {\n const SIDEBAR_LOCAL_STORAGE_KEY = 'sidebarModule'\n localStorage.removeValue(SIDEBAR_LOCAL_STORAGE_KEY)\n}\nremoveSidebarFromLocalstorage()\n\ntype SidebarProps = {\n onShouldResize: () => void\n direction: SidebarDirection\n tabsClassName?: string\n}\n\n// Todo - this is not correct approach but this component can unmount/mount on mobile orientation change so we can't keep it inside the component\nlet isInit = false\n\nexport function Sidebar({ onShouldResize, direction, tabsClassName }: SidebarProps) {\n const navigate = useNavigate()\n const [urlSearchParams] = useSearchParams()\n const sidebarModuleKey = (urlSearchParams.get(SIDEBAR_QUERY_PARAM) as keyof typeof sidebarModules | null) || null\n const [activeModule, setActiveModule] = React.useState(null)\n\n const isOpen = !!activeModule\n const handleSelectModule = React.useCallback(\n (key?: SidebarModule) => {\n const newUrlSearchParams = new URLSearchParams(urlSearchParams)\n if (key) {\n newUrlSearchParams.set(SIDEBAR_QUERY_PARAM, key)\n } else {\n newUrlSearchParams.delete(SIDEBAR_QUERY_PARAM)\n }\n navigate({ search: newUrlSearchParams.toString() }, { replace: true })\n },\n [urlSearchParams, navigate]\n )\n\n const handleCloseSidebar = React.useCallback(() => {\n handleSelectModule(undefined)\n }, [handleSelectModule])\n\n // Resize charts every time the sidebar is opened/closed or active module is changed\n React.useEffect(() => {\n onShouldResize()\n }, [activeModule, onShouldResize])\n\n // Set active module based on sidebarModuleKey\n React.useEffect(() => {\n let sidebarModule = sidebarModuleKey && sidebarModules[sidebarModuleKey]\n\n if (!isInit && getIsMobilePortrait()) {\n sidebarModule = null\n handleCloseSidebar()\n }\n\n setActiveModule(sidebarModule)\n isInit = true\n }, [sidebarModuleKey, handleCloseSidebar])\n\n const contextValue: SidebarContextType = React.useMemo(\n () => ({\n direction,\n isOpen,\n isCloseVisible: direction === SidebarDirection.horizontal,\n width: activeModule?.width,\n activeModule,\n onResize: onShouldResize,\n close: handleCloseSidebar,\n selectModule: handleSelectModule,\n }),\n [direction, isOpen, onShouldResize, activeModule, handleCloseSidebar, handleSelectModule]\n )\n\n return (\n \n {activeModule && (\n \n \n \n )}\n \n \n )\n}\n","export const drawingCreatorsAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"drawing-creators\" */ './module-entry'),\n cacheKey: 'drawing-creators',\n}\n","import { DrawingActions, IToolbarDrawingAction, IToolbarDrawingActionItem } from './interfaces'\n\nexport const drawingActions: Record = {\n [DrawingActions.AddNote]: {\n id: DrawingActions.AddNote,\n title: 'Add note',\n icon: 'note',\n },\n [DrawingActions.DeleteDrawings]: {\n id: DrawingActions.DeleteDrawings,\n title: 'Remove all drawings',\n icon: 'drawingActionDelete',\n },\n [DrawingActions.DeleteAutoSavedDrawings]: {\n id: DrawingActions.DeleteAutoSavedDrawings,\n title: 'Remove all autosaved drawings',\n icon: 'drawingActionDelete',\n },\n}\n\nexport const getToolbarDrawingActions = ({\n isAutoSaveActive,\n isAddNoteAvailable = false,\n isIdea,\n}: {\n isAutoSaveActive: boolean\n isAddNoteAvailable?: boolean\n isIdea?: boolean\n}): Array => [\n ...(isAddNoteAvailable\n ? [\n {\n defaultItem: drawingActions[DrawingActions.AddNote],\n isDisabled: isIdea,\n disabledTooltip: 'Add note is not available in ideas',\n },\n ]\n : []),\n {\n defaultItem:\n drawingActions[isAutoSaveActive ? DrawingActions.DeleteAutoSavedDrawings : DrawingActions.DeleteDrawings],\n },\n]\n","import { DrawingSetting, IToolbarDrawingSetting, IToolbarDrawingsSettingItem } from './interfaces'\n\nconst drawingSettings: Record = {\n [DrawingSetting.PreserveDrawings]: {\n id: DrawingSetting.PreserveDrawings,\n icon: 'drawingSettingPreserveDrawings',\n iconActive: 'drawingSettingPreserveDrawingsActive',\n title: 'Preserve drawings: Off',\n titleActive: 'Preserve drawings: On',\n },\n [DrawingSetting.DrawingModeContinuous]: {\n id: DrawingSetting.DrawingModeContinuous,\n icon: 'drawingSettingDrawingMode',\n iconActive: 'drawingSettingDrawingModeActive',\n title: 'Drawing mode: Single',\n titleActive: 'Drawing mode: Continuous',\n },\n [DrawingSetting.HideDrawings]: {\n id: DrawingSetting.HideDrawings,\n icon: 'drawingSettingHide',\n iconActive: 'drawingSettingShow',\n title: 'Hide drawings',\n titleActive: 'Show drawings',\n },\n [DrawingSetting.LockDrawings]: {\n id: DrawingSetting.LockDrawings,\n icon: 'drawingSettingLock',\n iconActive: 'drawingSettingUnlock',\n title: 'Lock drawings',\n titleActive: 'Unlock drawings',\n },\n}\n\nconst preserveDrawingsAutosaveOverride = {\n id: DrawingSetting.PreserveDrawings, // DrawingSetting.PreserveDrawings so it works with current settings sync to DB\n icon: 'drawingSettingAutosaveOff',\n iconActive: 'drawingSettingAutosaveOn',\n iconAction: 'drawingSettingAutosaveSaving',\n title: 'Drawings autosave: Off',\n titleActive: 'Drawings Autosave: On',\n titleAction: 'Drawings Autosave: Saving',\n}\n\nexport const getToolbarDrawingSettings = ({\n isPreserveDrawingsAndAutosaveAvailable,\n isIdea,\n isAutoSaveInProgress,\n}: {\n isPreserveDrawingsAndAutosaveAvailable?: boolean\n isIdea?: boolean\n isAutoSaveInProgress?: boolean\n}): Array => {\n const toolbarSettings = [\n {\n defaultItem: drawingSettings[DrawingSetting.DrawingModeContinuous],\n },\n ...(isPreserveDrawingsAndAutosaveAvailable\n ? [\n {\n defaultItem: preserveDrawingsAutosaveOverride,\n isDisabled: isIdea,\n isInAction: isAutoSaveInProgress,\n disabledTooltip: 'Autosave is not available in ideas',\n },\n ]\n : []),\n {\n defaultItem: drawingSettings[DrawingSetting.HideDrawings],\n },\n {\n defaultItem: drawingSettings[DrawingSetting.LockDrawings],\n },\n ]\n\n return toolbarSettings\n}\n","import { DrawingTool, IToolbarDrawingTool, IToolbarDrawingToolItem } from './interfaces'\n\nexport const drawingTools: Record = {\n [DrawingTool.Mouse]: {\n id: DrawingTool.Mouse,\n title: 'Mouse',\n icon: 'toolMouse',\n },\n [DrawingTool.Measure]: {\n id: DrawingTool.Measure,\n title: 'Measure',\n icon: 'toolMeasure',\n },\n [DrawingTool.ScaledLine]: {\n id: DrawingTool.ScaledLine,\n title: 'Line',\n icon: 'toolLine',\n },\n [DrawingTool.Arrow]: {\n id: DrawingTool.Arrow,\n title: 'Arrow',\n icon: 'toolArrow',\n },\n [DrawingTool.VerticalLine]: {\n id: DrawingTool.VerticalLine,\n title: 'Vertical line',\n icon: 'toolMidLineV',\n },\n [DrawingTool.HorizontalLine]: {\n id: DrawingTool.HorizontalLine,\n title: 'Horizontal line',\n icon: 'toolMidLineH',\n },\n [DrawingTool.Rectangle]: {\n id: DrawingTool.Rectangle,\n title: 'Rectangle',\n icon: 'toolRect',\n },\n [DrawingTool.RotatedRectangle]: {\n id: DrawingTool.RotatedRectangle,\n title: 'Rotated rectangle',\n icon: 'toolRectRotated',\n },\n [DrawingTool.Triangle]: {\n id: DrawingTool.Triangle,\n title: 'Triangle',\n icon: 'toolTriangle',\n },\n [DrawingTool.Ellipse]: {\n id: DrawingTool.Ellipse,\n title: 'Ellipse',\n icon: 'toolEllipse',\n },\n [DrawingTool.Curve]: {\n id: DrawingTool.Curve,\n title: 'Curve',\n icon: 'toolCurve',\n },\n [DrawingTool.Pitchfork]: {\n id: DrawingTool.Pitchfork,\n title: 'Pitchfork',\n icon: 'toolPitchfork',\n },\n [DrawingTool.Polygon]: {\n id: DrawingTool.Polygon,\n title: 'Polygon',\n icon: 'toolPolygon',\n },\n [DrawingTool.Xabcd]: {\n id: DrawingTool.Xabcd,\n title: 'XABCD',\n icon: 'toolXABCD',\n },\n [DrawingTool.ScaledText]: {\n id: DrawingTool.ScaledText,\n title: 'Text',\n icon: 'toolText',\n },\n [DrawingTool.Brush]: {\n id: DrawingTool.Brush,\n title: 'Brush',\n icon: 'toolBrush',\n },\n [DrawingTool.ElliottWaves]: {\n id: DrawingTool.ElliottWaves,\n title: 'Elliott waves',\n icon: 'toolElliottWave',\n },\n [DrawingTool.FibonacciRetracements]: {\n id: DrawingTool.FibonacciRetracements,\n title: 'Fibonacci retracements',\n icon: 'toolFibonacci',\n },\n [DrawingTool.Position]: {\n id: DrawingTool.Position,\n title: 'Position',\n icon: 'toolPosition',\n },\n [DrawingTool.Callout]: {\n id: DrawingTool.Callout,\n title: 'Callout',\n icon: 'toolCallout',\n },\n}\n\nexport const toolbarDrawingTools: Array = [\n {\n defaultItem: drawingTools[DrawingTool.Mouse],\n },\n {\n defaultItem: drawingTools[DrawingTool.Measure],\n },\n {\n defaultItem: drawingTools[DrawingTool.ScaledLine],\n toolGroup: [\n drawingTools[DrawingTool.ScaledLine],\n drawingTools[DrawingTool.VerticalLine],\n drawingTools[DrawingTool.HorizontalLine],\n drawingTools[DrawingTool.Curve],\n ],\n toolGroupTitle: 'Line tools',\n },\n {\n defaultItem: drawingTools[DrawingTool.Arrow],\n },\n {\n defaultItem: drawingTools[DrawingTool.Rectangle],\n },\n {\n defaultItem: drawingTools[DrawingTool.RotatedRectangle],\n },\n {\n defaultItem: drawingTools[DrawingTool.Triangle],\n },\n {\n defaultItem: drawingTools[DrawingTool.Ellipse],\n },\n {\n defaultItem: drawingTools[DrawingTool.Polygon],\n },\n {\n defaultItem: drawingTools[DrawingTool.Xabcd],\n toolGroup: [drawingTools[DrawingTool.Xabcd], drawingTools[DrawingTool.Pitchfork]],\n toolGroupTitle: 'XABCD tools',\n },\n {\n defaultItem: drawingTools[DrawingTool.ScaledText],\n toolGroup: [drawingTools[DrawingTool.ScaledText], drawingTools[DrawingTool.Callout]],\n toolGroupTitle: 'Text tools',\n },\n {\n defaultItem: drawingTools[DrawingTool.Brush],\n },\n {\n defaultItem: drawingTools[DrawingTool.ElliottWaves],\n },\n {\n defaultItem: drawingTools[DrawingTool.FibonacciRetracements],\n },\n {\n defaultItem: drawingTools[DrawingTool.Position],\n },\n]\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport { PaneArea } from '../../../types/shared'\nimport { Toolbar as ToolbarComponent, ToolbarDivider, ToolbarItem } from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { drawingCreatorsAsyncModule } from '../../creators/async-modules'\nimport { ElementStyleDialogContext } from '../../modals/element_style'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { AutoSaveState } from '../../models/constants'\nimport PaneModel from '../../models/pane'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\nimport { getIsPreserveDrawingsAndAutosaveAvailable } from '../../utils/chart'\nimport { getToolbarDrawingActions } from './drawingActions'\nimport { getToolbarDrawingSettings } from './drawingSettings'\nimport { drawingTools, toolbarDrawingTools } from './drawingTools'\nimport { DrawingSetting, DrawingTool, IToolBarProps } from './interfaces'\n\nexport const DISABLED_ITEM_TOOLTIP_LABEL = \"Disabled due 'lock/hide' drawings active\"\n\nexport default function Toolbar({\n isSidebar,\n isHorizontal,\n isMobileOverlay,\n activeTool,\n chartLayoutModel,\n onActiveToolChange,\n onDrawingActionClick,\n onDrawingSettingClick,\n onDrawingEnd,\n drawingSettings,\n isAlternativeTheme,\n areToolsDisabled,\n}: IToolBarProps) {\n const [drawingCreatorsModule, { isLoading: isDrawingCreatorsModuleLoading }] = useAsyncModule({\n ...drawingCreatorsAsyncModule,\n shouldLoadModule: true,\n })\n const { autoSaveState } = useModelState(\n React.useMemo(() => chartLayoutModel.drawingsInternalStore(), [chartLayoutModel]),\n { watchProperties: ['autoSaveState'] }\n )\n const [isDrawing, setIsDrawing] = React.useState(false)\n const openElementStyleDialog = React.useContext(ElementStyleDialogContext)\n\n const availableDrawingSettings = getToolbarDrawingSettings({\n isPreserveDrawingsAndAutosaveAvailable: getIsPreserveDrawingsAndAutosaveAvailable(chartLayoutModel),\n isAutoSaveInProgress: autoSaveState === AutoSaveState.Saving,\n isIdea: !!chartLayoutModel.idea?.id,\n })\n\n const availableDrawingActions = getToolbarDrawingActions({\n isAutoSaveActive: autoSaveState !== AutoSaveState.Off,\n isAddNoteAvailable: chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage,\n isIdea: !!chartLayoutModel.idea?.id,\n })\n\n React.useEffect(() => {\n if (!drawingCreatorsModule) {\n return\n }\n\n const onMouseDown = (model: PaneModel, area: PaneArea & { isTouch: boolean }) => {\n const isDrawingModeContinuous = drawingSettings[DrawingSetting.DrawingModeContinuous]\n const hasData = model.chart().quote().close.length > 0\n const hasHiddenDrawings = drawingSettings[DrawingSetting.HideDrawings]\n const tool = drawingTools[activeTool].id\n\n if (tool === DrawingTool.Mouse || isDrawing || hasHiddenDrawings || !hasData) {\n return\n }\n\n setIsDrawing(true)\n const { drawingToolsTouchCreatorsByType, drawingToolsCreatorsByType } = drawingCreatorsModule\n const ToolClass = area.isTouch ? drawingToolsTouchCreatorsByType[tool] : drawingToolsCreatorsByType[tool]\n const element = model.elements().create({\n instance: new ToolClass(area, {}, model, openElementStyleDialog, () => {\n if (!isDrawingModeContinuous) {\n onActiveToolChange(DrawingTool.Mouse)\n }\n setIsDrawing(false)\n onDrawingEnd?.()\n }),\n })\n element.one('destroy', ({ instance }) => {\n if (instance.getIsCreator()) {\n setIsDrawing(false)\n onDrawingEnd?.()\n }\n })\n\n element.trigger('select', element)\n }\n PaneModel.bind('mousedown', onMouseDown)\n return () => {\n PaneModel.unbind('mousedown', onMouseDown)\n }\n }, [\n activeTool,\n onActiveToolChange,\n openElementStyleDialog,\n onDrawingEnd,\n drawingCreatorsModule,\n drawingSettings,\n isDrawing,\n ])\n\n return (\n \n {toolbarDrawingTools.map((item) => {\n const isActive = activeTool === item.defaultItem.id || item.toolGroup?.some((tool) => tool.id === activeTool)\n const isToolLoading = isDrawingCreatorsModuleLoading && isActive\n\n return (\n \n )\n })}\n \n {availableDrawingSettings.map((item) => (\n \n ))}\n {availableDrawingActions.map((item) => (\n \n ))}\n \n )\n}\n","import Toolbar from './toolbar'\n\nexport default Toolbar\n","import React from 'react'\n\nimport { ObjectHash } from '../../../../types/shared'\nimport { Textarea } from '../../../components'\nimport { useModelState } from '../../../model-hooks/use-model-state'\nimport Chart from '../../../models/chart'\nimport ChartLayout from '../../../models/chart_layout'\nimport { useDrawingAutoSaveControls } from '../../autosave/use-drawing-auto-save-controls'\nimport { getElementNoteText, getTickersAndContainerTypesInLayoutModel } from '../../autosave/utils'\n\ninterface ChartAutoSaveNoteProps {\n ticker: string\n note: string\n onNoteChange: (note: string, ticker: string) => void\n}\n\nfunction ChartAutoSaveNote({ ticker, note, onNoteChange }: ChartAutoSaveNoteProps) {\n return (\n ) => {\n onNoteChange(e.target.value, ticker)\n }}\n />\n )\n}\n\ninterface Props {\n chartLayoutModel: ChartLayout\n}\n\nexport function ChartAutoSaveNotes({ chartLayoutModel }: Props) {\n const { handleAutoSaveNoteChange } = useDrawingAutoSaveControls(chartLayoutModel)\n const [tickers, setTickers] = React.useState([])\n const unwatchedInternalStore = React.useMemo(() => chartLayoutModel.drawingsInternalStore(), [chartLayoutModel])\n const drawingsInternalStore = useModelState(unwatchedInternalStore, { watchProperties: ['elements'] })\n\n React.useEffect(() => {\n // There was no better way how to listen on ticker changes which is necessary for displaying correct text areas\n const handleChartChange = () => {\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayoutModel)\n setTickers(tickers)\n }\n\n Chart.bind('change', handleChartChange)\n handleChartChange()\n return () => {\n Chart.unbind('change', handleChartChange)\n }\n }, [chartLayoutModel])\n\n const tickerNoteMap = React.useMemo(() => {\n const map: ObjectHash = {}\n drawingsInternalStore.elements.forEach((element) => {\n if (element.containerType === 'note' && tickers.includes(element.ticker)) {\n map[element.ticker] = getElementNoteText(element)\n }\n })\n\n return map\n }, [drawingsInternalStore.elements, tickers])\n\n return (\n
\n {tickers.map((ticker) => (\n \n ))}\n
\n )\n}\n","import React from 'react'\n\nimport { Dialog, DialogBody, DialogHeader } from '../../../components'\nimport ChartLayout from '../../../models/chart_layout'\nimport { ChartAutoSaveNotes } from './auto-save-notes'\n\ninterface INoteDialog {\n dialogState: any\n chartLayoutModel: ChartLayout\n}\n\nexport function AutoSaveNotesDialog({ dialogState, chartLayoutModel }: INoteDialog) {\n return (\n \n dialogState.hide()}>Notes\n \n {(dialogState.visible || dialogState.animating) && }\n \n \n )\n}\n","import React from 'react'\n\nimport { Button, ConfirmationDialog as ConfirmationDialogComponent } from '../../components'\n\nconst getDialogContent = ({\n isAutosaveDialogContent,\n tickers,\n}: {\n isAutosaveDialogContent: boolean\n tickers: string[]\n}) => {\n if (isAutosaveDialogContent) {\n return {\n title: 'Remove all autosaved drawings?',\n message: (\n <>\n Do you really want to remove all autosaved drawings? This action is irreversible and will remove all\n non-idea drawings for {tickers.join(', ')}.\n \n ),\n }\n }\n return {\n title: 'Remove all drawings?',\n message: `Do you really want to remove all drawings? This action only affects the current page and visible tickers. This action doesn't remove autosaved drawings or ideas.`,\n }\n}\n\nexport interface IConfirmationDialog {\n state: any\n onCancel: () => void\n onAction: () => void\n isAutosaveDialogContent: boolean\n tickers: string[]\n}\n\nexport function ConfirmationDialog({\n onCancel,\n onAction,\n state,\n isAutosaveDialogContent = false,\n tickers,\n}: IConfirmationDialog) {\n const dialogContent = getDialogContent({ isAutosaveDialogContent, tickers })\n\n return (\n \n \n \n \n }\n >\n {dialogContent.message}\n \n )\n}\n","import React from 'react'\n\nimport { Button, Icon } from '../../../components'\nimport { drawingTools } from '../drawingTools'\nimport { DrawingTool } from '../interfaces'\n\ntype ToolButtonProps = {\n onClick: () => void\n activeTool: DrawingTool\n}\n\nexport default function ToolButton({ activeTool, onClick }: ToolButtonProps) {\n return (\n \n )\n}\n","import classNames from 'classnames'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { useSearchParams } from 'react-router-dom'\n\nimport { Button } from '../../../components'\nimport { SIDEBAR_QUERY_PARAM } from '../../sidebar/sidebar'\nimport { MOBILE_TOOLBAR_DIV_ID } from '../../sidebar/sidebar-tabs'\nimport { DrawingActions, DrawingTool, IToolBarProps } from '../interfaces'\nimport Toolbar from '../toolbar'\nimport ToolButton from './tool-button'\n\ntype ToolbarMobileProps = Omit\n\nexport default function ToolbarMobile({\n activeTool,\n onActiveToolChange,\n onDrawingActionClick,\n ...rest\n}: ToolbarMobileProps) {\n const [isToolbarVisible, setIsToolbarVisible] = React.useState(false)\n const [urlSearchParams, setUrlSearchParams] = useSearchParams()\n const [toolbarMobileElement, setToolbarMobileElement] = React.useState(null)\n\n // get toolbar mobile element on first render\n React.useEffect(() => {\n setToolbarMobileElement(document.getElementById(MOBILE_TOOLBAR_DIV_ID))\n }, [])\n\n const handleActiveToolChange = React.useCallback(\n (drawingTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => {\n onActiveToolChange(drawingTool, trigger)\n\n if (trigger !== 'group') return setIsToolbarVisible(false)\n },\n [onActiveToolChange]\n )\n\n // Hide toolbar on click outside\n const wrapperRef = React.useRef(null)\n React.useEffect(() => {\n if (!isToolbarVisible) return\n\n function handleClickOutside(event: TouchEvent | MouseEvent) {\n // Get the currently open select\n const openSelect = document.querySelector('.finviz-popover[data-enter]')\n if (wrapperRef.current?.contains(event.target as Node) || openSelect?.contains(event.target as Node)) return\n setIsToolbarVisible(false)\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('touchstart', handleClickOutside)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('touchstart', handleClickOutside)\n }\n }, [isToolbarVisible])\n\n const handleDrawingActionClick = (actionId: DrawingActions) => {\n onDrawingActionClick?.(actionId)\n setIsToolbarVisible(false)\n }\n\n if (!toolbarMobileElement) return null\n\n return ReactDOM.createPortal(\n <>\n \n \n \n {urlSearchParams.has(SIDEBAR_QUERY_PARAM) || activeTool === DrawingTool.Mouse ? (\n {\n setIsToolbarVisible(true)\n setUrlSearchParams((params) => {\n params.delete(SIDEBAR_QUERY_PARAM)\n return params\n })\n }}\n >\n Draw\n \n ) : (\n {\n setIsToolbarVisible(true)\n }}\n />\n )}\n ,\n toolbarMobileElement\n )\n}\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { AutoSaveState } from '../../models/constants'\n\ninterface LoadLatestDataButtonProps {\n chartLayoutModel: ChartLayout\n}\n\nexport function AutoSaveStateIndicator({ chartLayoutModel }: LoadLatestDataButtonProps) {\n const drawingsInternalStoreUnwatched = React.useMemo(\n () => chartLayoutModel.drawingsInternalStore(),\n [chartLayoutModel]\n )\n const { autoSaveState } = useModelState(drawingsInternalStoreUnwatched, { watchProperties: ['autoSaveState'] })!\n const [isVisible, setIsVisible] = React.useState(false)\n\n React.useEffect(() => {\n if (autoSaveState === AutoSaveState.Off) {\n return\n }\n\n let setVisibilityTimeout: NodeJS.Timeout | null = null\n const newIsVisible = autoSaveState !== AutoSaveState.Saved\n\n setVisibilityTimeout = setTimeout(\n () => {\n setIsVisible(newIsVisible)\n },\n newIsVisible ? 0 : 3000\n )\n\n const checkIfNeededPreventLeaving = (event: BeforeUnloadEvent) => {\n if (autoSaveState === AutoSaveState.Saved) {\n return undefined\n }\n\n const message = `Your latest changes haven't been saved yet. If you leave now, your changes might be lost.`\n event.returnValue = message\n return message\n }\n\n window.addEventListener('beforeunload', checkIfNeededPreventLeaving)\n\n return () => {\n window.removeEventListener('beforeunload', checkIfNeededPreventLeaving)\n if (setVisibilityTimeout) {\n clearTimeout(setVisibilityTimeout)\n }\n }\n }, [autoSaveState])\n\n if (!isVisible) {\n return null\n }\n\n // @todo - add proper indicator component here\n return null\n}\n","import React from 'react'\n\nimport { Textarea } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { isRedesignEnabled } from '../../utils'\nimport { useDrawingAutoSaveControls } from '../autosave/use-drawing-auto-save-controls'\n\ninterface Props {\n chartLayoutModel: ChartLayout\n ideaNoteRef?: React.RefObject\n}\n\nconst hasRedesign = isRedesignEnabled()\n\nexport function ChartLayoutAutoSaveNote({ chartLayoutModel: chartLayoutModelUnwatched, ideaNoteRef }: Props) {\n const chartLayoutModel = useModelState(chartLayoutModelUnwatched, {\n watchProperties: ['idea'],\n })!\n const { handleIdeaNoteChange } = useDrawingAutoSaveControls(chartLayoutModel)\n\n if (!chartLayoutModel.editable) {\n return null\n }\n\n return (\n
\n {!hasRedesign &&
Note:
}\n
\n ) => {\n handleIdeaNoteChange(e.target.value)\n }}\n />\n
\n
\n )\n}\n","import React from 'react'\n\nimport { getExtendedDialogState, useDialogState } from '../../components'\nimport { publishModalAsyncModule } from '../../modals/publish/async-modules'\nimport ChartLayout from '../../models/chart_layout'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\n\ninterface PublishOldButtonClickListenerProps {\n isListening: boolean\n layoutModel: ChartLayout\n}\n\nexport function getPublishChartHtmlElements() {\n const publishChartElements = document.getElementsByClassName('js-publish-chart')\n const publishChartHtmlElements = Array.from(publishChartElements) as HTMLElement[]\n\n return publishChartHtmlElements\n}\n\nfunction getChartImgUrl(index: number) {\n const imgElement = document.getElementById(`chart${index}`) as HTMLImageElement | null\n return imgElement?.src ?? null\n}\n\nexport function PublishOldButtonClickListener({ isListening, layoutModel }: PublishOldButtonClickListenerProps) {\n const dialog = useDialogState()\n const { isFullyClosed } = getExtendedDialogState(dialog)\n const [dialogConfig, setDialogConfig] = React.useState({\n isCanvas: true,\n chartImgUrl: null as null | string,\n timeframe: '',\n ticker: '',\n })\n const [publishModalModule] = useAsyncModule({\n ...publishModalAsyncModule,\n shouldLoadModule: !isFullyClosed,\n })\n const PublishDialog = publishModalModule?.default\n\n React.useEffect(() => {\n const publishChartHtmlElements = getPublishChartHtmlElements()\n const clickHandler = (event: MouseEvent) => {\n const { index, ticker, timeframe } = (event.currentTarget as HTMLElement).dataset\n if (index && ticker && timeframe) {\n const indexInt = Number.parseInt(index)\n setDialogConfig({\n ticker,\n timeframe,\n isCanvas: indexInt === 0,\n chartImgUrl: indexInt > 0 ? getChartImgUrl(indexInt) : null,\n })\n dialog.show()\n }\n }\n\n if (isListening) {\n publishChartHtmlElements.forEach((el) => {\n el.addEventListener('click', clickHandler)\n })\n }\n\n return () => {\n publishChartHtmlElements.forEach((el) => {\n el.removeEventListener('click', clickHandler)\n })\n }\n }, [dialog, isListening])\n\n return PublishDialog ? : null\n}\n","import React from 'react'\n\nimport { Button, Dialog, DialogBody, DialogFooter, DialogHeader, Paragraph } from '../../components'\n\nexport enum IdeaDrawingsConfirmationOptions {\n Merge,\n Override,\n Nothing,\n Cancel,\n}\n\ninterface IIdeaLeaveDialog {\n state: any\n actionCallback: (action: IdeaDrawingsConfirmationOptions) => void\n}\n\nexport function IdeaLeaveDialog({ actionCallback, state }: IIdeaLeaveDialog) {\n return (\n actionCallback(IdeaDrawingsConfirmationOptions.Cancel)}\n finalFocusRef={{ current: document.body }}\n >\n actionCallback(IdeaDrawingsConfirmationOptions.Cancel)}>\n You’re About to Leave your Idea\n \n \n
\n What would you like to do with the drawings from your current Idea?\n \n Replace Drawings\n
\n Your Autosaved Drawings for this ticker will be deleted, and the Idea Drawings will be copied to the live\n chart.\n
\n \n Combine Drawings\n
\n The Idea Drawings will be copied to the live chart without changing the positions or settings of any\n Autosaved Drawings. This may cause duplicates if some drawings were also autosaved.\n
\n \n Do Nothing\n
\n Close the idea without changing any Autosaved Drawings.\n
\n
\n
\n \n actionCallback(IdeaDrawingsConfirmationOptions.Override)}\n >\n Replace\n \n actionCallback(IdeaDrawingsConfirmationOptions.Merge)}\n >\n Combine\n \n actionCallback(IdeaDrawingsConfirmationOptions.Nothing)}\n >\n Do Nothing\n \n \n \n )\n}\n","import * as dateFns from 'date-fns'\nimport React from 'react'\nimport { useLocation, useNavigate } from 'react-router-dom'\n\nimport { useDialogState } from '../../components'\nimport {\n ChartElementType,\n ChartsOrQuotePageQueryParams,\n ChartsPageQueryParams,\n QuotePageQueryChartTypes,\n QuotePageQueryParams,\n SpecificChartFunctionality,\n TIMEFRAME,\n} from '../../constants/common'\nimport Chart from '../../models/chart'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport { getRawTickerForInstrument } from '../../models/utils'\nimport utils from '../../utils'\nimport { getInstrument, handleTypeChange } from '../../utils/chart'\nimport { getUuid } from '../../utils/helpers'\nimport { initHlc } from '../../utils/hlc'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\nimport { useTrackPageView } from '../../website-shared'\nimport { IdeaLeaveDialog } from '../autosave/idea-leave-dialog'\nimport { IdeaDrawingsConfirmationOptions } from '../autosave/idea-leave-dialog'\nimport { useDrawingAutoSaveApi } from '../autosave/use-drawing-autosave-api'\nimport { getTickersAndContainerTypesInLayoutModel, handleCallMethodOnAllDrawings } from '../autosave/utils'\nimport { getChartElementTypeFromResponseType } from '../utils'\n\nconst getChartElementTypeFromQueryType = (queryType: QuotePageQueryChartTypes | null) => {\n switch (queryType) {\n case QuotePageQueryChartTypes.l:\n return ChartElementType.LineChart\n case QuotePageQueryChartTypes.hc:\n return ChartElementType.HollowCandleStick\n case QuotePageQueryChartTypes.ha:\n return ChartElementType.HeikinAshi\n case QuotePageQueryChartTypes.o:\n return ChartElementType.OhlcChart\n case QuotePageQueryChartTypes.p:\n return ChartElementType.PerfChart\n case QuotePageQueryChartTypes.c:\n case QuotePageQueryChartTypes.cs:\n return ChartElementType.CandleStick\n default:\n return (\n getChartElementTypeFromResponseType(window.FinvizSettings?.TA?.style ?? null) ?? ChartElementType.CandleStick\n )\n }\n}\n\nconst useChartRouteChange = (chartLayoutModel: ChartLayoutModel | null) => {\n useTrackPageView({ trackInitial: false })\n const location = useLocation()\n const navigate = useNavigate()\n const { deleteAllDrawings } = useDrawingAutoSaveApi()\n const dialog = useDialogState()\n\n const isQuotePage = chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.quotePage\n const isChartPage = chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isFuturesForexCryptoPage = [\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n ].includes(chartLayoutModel?.specificChartFunctionality as SpecificChartFunctionality)\n\n React.useEffect(() => {\n if (isChartPage) {\n utils.setCookie(\n 'chartsUrl',\n `?${encodeQueryString({ ...decodeQueryString(location.search), i: undefined, settings: undefined })}`,\n dateFns.add(new Date(), { months: 1 })\n )\n }\n }, [isChartPage, location.search])\n\n React.useEffect(() => {\n const decodedQueryString = decodeQueryString(location.search)\n // We can navigate to idea chart without a refresh e.g. using browser back button\n // It breaks charts because we don't have idea data & idea quote anymore\n // So if we end up on a page with idea in the url and we don't have any idea data in chartLayout model we'll refresh the page\n if (chartLayoutModel && decodedQueryString.i && !chartLayoutModel.idea?.id) {\n window.location.reload()\n }\n // No need to have chartLayoutModel as dependecny here , I'm only interested in idea on the model\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [location.search, chartLayoutModel?.idea?.id])\n\n const updateChartConfig = React.useCallback(() => {\n if (!chartLayoutModel) return\n\n const decodedSearch = decodeQueryString(location.search)\n\n const urlType = (decodedSearch as QuotePageQueryParams).ty ?? null\n handleTypeChange({\n type: getChartElementTypeFromQueryType(urlType),\n chartLayoutModel,\n })\n\n if (isChartPage && chartLayoutModel.layout !== (decodedSearch as ChartsPageQueryParams).l) {\n chartLayoutModel.updateAttributes({ layout: (decodedSearch as ChartsPageQueryParams).l })\n }\n\n chartLayoutModel.getAllCharts().forEach((chartModel, chartIndex) => {\n const urlTicker = decodedSearch.t.split(',')[chartIndex] ?? null\n const urlTimeframe = decodedSearch.p?.split(',')[chartIndex] ?? null\n const urlDateRange = decodedSearch.r?.split(',')[chartIndex] ?? null\n const upperCaseTicker = urlTicker?.toUpperCase()\n\n /**\n * Only Charts page charts can change instruments. Other pages need forced\n * instrument because we might not be able to guess it from urlTicker\n */\n let instrument = getInstrument(upperCaseTicker)\n if (chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.chartPage) {\n instrument = chartModel.instrument\n }\n\n const newChartConfig = {\n instrument,\n ticker: getRawTickerForInstrument(instrument, upperCaseTicker),\n timeframe: urlTimeframe,\n dateRange: urlDateRange,\n }\n\n if (Object.entries(newChartConfig).some(([key, value]) => chartModel[key as keyof Chart] !== value)) {\n chartModel.updateAttributesAndSync(newChartConfig)\n }\n })\n }, [chartLayoutModel, location.search, isChartPage])\n\n React.useEffect(() => {\n const decodedSearch = decodeQueryString(location.search)\n\n if (\n !chartLayoutModel ||\n !decodedSearch.p ||\n !decodedSearch.t ||\n !(isQuotePage || isChartPage || isFuturesForexCryptoPage)\n ) {\n if (!decodedSearch.p && isQuotePage) {\n navigate(\n {\n search: `?${encodeQueryString({\n ...decodedSearch,\n p: window.FinvizSettings.defaultPeriod ?? TIMEFRAME.d,\n r: window.FinvizSettings.defaultDateRange,\n })}`,\n },\n {\n replace: true,\n }\n )\n }\n return\n }\n if (chartLayoutModel.idea?.id && dialog.visible) {\n dialog.hide()\n }\n\n if (!decodedSearch.i && chartLayoutModel.idea?.id) {\n const urlTicker = decodedSearch.t.split(',')\n const isSameTicker = chartLayoutModel\n .getAllCharts()\n .every((chart, i) => chart.getQuoteRawTicker() === urlTicker[i])\n\n if (isSameTicker && window.FinvizSettings.hasUserPremium && chartLayoutModel.isPreserveDrawingsActive) {\n dialog.show()\n return\n }\n if (!chartLayoutModel.isPreserveDrawingsActive || !isSameTicker) {\n handleCallMethodOnAllDrawings({ chartLayoutModel, elementMethod: 'destroyCascade' })\n }\n chartLayoutModel.exitIdea()\n }\n updateChartConfig()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n location.search,\n dialog.show,\n navigate,\n chartLayoutModel,\n isQuotePage,\n isChartPage,\n isFuturesForexCryptoPage,\n updateChartConfig,\n ])\n\n const handleIdeaLeave = React.useCallback(\n async (action: IdeaDrawingsConfirmationOptions) => {\n if (!chartLayoutModel) return\n if (action === IdeaDrawingsConfirmationOptions.Cancel) {\n navigate(-1)\n return\n }\n switch (action) {\n case IdeaDrawingsConfirmationOptions.Merge: {\n handleCallMethodOnAllDrawings({\n chartLayoutModel,\n elementMethod: 'refreshElementId',\n })\n break\n }\n case IdeaDrawingsConfirmationOptions.Override: {\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayoutModel)\n await deleteAllDrawings({ tickers, lastLocalChange: initHlc(getUuid(), Date.now()) })\n break\n }\n case IdeaDrawingsConfirmationOptions.Nothing: {\n handleCallMethodOnAllDrawings({\n chartLayoutModel,\n elementMethod: 'destroyCascade',\n })\n break\n }\n default:\n break\n }\n chartLayoutModel.exitIdea()\n updateChartConfig()\n dialog.hide()\n },\n [dialog, chartLayoutModel, updateChartConfig, deleteAllDrawings, navigate]\n )\n\n return {\n dialog,\n handleIdeaLeave,\n }\n}\n\nfunction getChartLayoutWithChartRouteChange

(\n Component: React.ComponentType

\n) {\n return function WrappedComponent(props: P) {\n const { dialog, handleIdeaLeave } = useChartRouteChange(props.chartLayoutModel)\n return (\n <>\n \n \n \n )\n }\n}\n\nexport function withChartRouteChange

(\n Component: React.ComponentType

\n) {\n // Chart layout is used in ReactRouter context and also outside of RR context\n // if we use RR hooks outside the context it will crash so this function will return different component for quote & chart pages than for other usecases\n const ChartLayoutComponent = getChartLayoutWithChartRouteChange(Component)\n return function WrappedComponent(props: P) {\n const { ty } = decodeQueryString()\n const isChartPage = props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isQuotePage = props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.quotePage\n const isFuturesForexCryptoPage = [\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n ].includes(props.chartLayoutModel.specificChartFunctionality)\n if (isChartPage || (isQuotePage && ty !== 'p') || isFuturesForexCryptoPage) {\n return \n }\n\n return \n }\n}\n","import merge from 'lodash.merge'\nimport React from 'react'\n\nimport { RootChartConfigObject, Theme } from '../../../types/shared'\nimport {\n ChartEditorEnum,\n MOBILE_BARS_TO_VIEW,\n MOBILE_VIEW_BREAKPOINT_WIDTH,\n SpecificChartFunctionality,\n} from '../../constants/common'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport DrawingsInternalStore from '../../models/drawings-internal-store'\nimport { getSettings } from '../../models/settings'\nimport utils, { isRedesignedPage } from '../../utils'\nimport { getIsPreserveDrawingsAndAutosaveAvailable, getZoomFactorForBarsToDisplay } from '../../utils/chart'\nimport { getContainerTypeFromPaneConfig, getInitialStoreDrawings } from '../autosave/utils'\nimport { DrawingSetting } from '../toolbar/interfaces'\nimport { CHART_LAYOUT_CHILD_CHANGE_EVENT } from './constants'\n\ninterface Props {\n config: RootChartConfigObject\n onRegisterChartLayoutModel?: (chartLayoutModel: ChartLayoutModel) => void\n parentElement?: HTMLElement\n}\n\nfunction getDefaultZoomFactor(chartLayout: ChartLayoutModel) {\n const innerWidth = window.innerWidth\n if (\n innerWidth >= MOBILE_VIEW_BREAKPOINT_WIDTH ||\n chartLayout.specificChartFunctionality !== SpecificChartFunctionality.chartPage\n ) {\n return 1\n }\n\n return getZoomFactorForBarsToDisplay({\n chartLayout,\n numOfVisibleBars: MOBILE_BARS_TO_VIEW,\n chartVisibleWidth: innerWidth,\n })\n}\n\nfunction OnInitListener({\n chartLayoutModel,\n config,\n onRegisterChartLayoutModel,\n parentElement,\n}: Props & { chartLayoutModel: ChartLayoutModel; parentElement?: HTMLElement }) {\n const [isInit, setIsInit] = React.useState(false)\n\n /*\n * This entire effect is used to check for updates in entire chart layout obj tree.\n * Once config object matches object generated from chart layout, the layout model is completely initialised.\n *\n * We couldn't just add a callback to `componentDidMount` (or equivalent) because its children are rendered asynchronously.\n *\n * */\n React.useEffect(() => {\n if (onRegisterChartLayoutModel && chartLayoutModel && !isInit) {\n const checkIfInitIsComplete = () => {\n const { charts } = chartLayoutModel.toConfig()\n const isReady =\n charts.length === config.charts.length &&\n charts.every(\n (chart, chartIndex) =>\n chart.panes.length === config.charts[chartIndex].panes.length &&\n chart.panes.every(\n (pane, paneIndex) =>\n pane.elements.length === config.charts[chartIndex].panes[paneIndex].elements.length &&\n pane.elements.every(\n (element, elementIndex) =>\n element.overlays?.length ===\n config.charts[chartIndex].panes[paneIndex].elements[elementIndex].overlays?.length\n )\n )\n )\n\n if (isReady) {\n setIsInit(true)\n chartLayoutModel.updateAttributes({ isInit: true })\n onRegisterChartLayoutModel(chartLayoutModel)\n if (parentElement) {\n parentElement.style.opacity = 'unset'\n parentElement.style.minHeight = 'unset'\n }\n }\n }\n\n chartLayoutModel.bind(CHART_LAYOUT_CHILD_CHANGE_EVENT, checkIfInitIsComplete)\n\n checkIfInitIsComplete()\n\n return () => {\n chartLayoutModel.unbind(CHART_LAYOUT_CHILD_CHANGE_EVENT, checkIfInitIsComplete)\n }\n }\n }, [chartLayoutModel, config, isInit, onRegisterChartLayoutModel, parentElement])\n\n return null\n}\n\nexport const withCompleteLayoutModelInit = (Component: any) => (props: Props) => {\n const config = React.useMemo(() => {\n const newConfig = merge({}, props.config, {\n editable: props.config.editable ?? true,\n canChangeTicker: props.config.canChangeTicker ?? true,\n scrollable: props.config.scrollable ?? true,\n cross: props.config.cross ?? true,\n theme:\n props.config.theme && [Theme.light, Theme.dark].includes(props.config.theme) ? props.config.theme : Theme.light,\n editors: props.config.editors ?? [ChartEditorEnum.publish, ChartEditorEnum.tools, ChartEditorEnum.ideas],\n ideas: props.config.ideas ?? true,\n specificChartFunctionality: props.config.specificChartFunctionality ?? SpecificChartFunctionality.default,\n initialStoreDrawings: [],\n })\n\n if (!newConfig.ideas) {\n newConfig.editors = newConfig.editors.filter((x) => x !== 'ideas')\n }\n\n // We need to add these because ideas might not have them and chart controls wouldn’t render properly\n if (isRedesignedPage(newConfig, [SpecificChartFunctionality.quotePage])) {\n newConfig.editors = newConfig.editors.concat([ChartEditorEnum.settings, ChartEditorEnum.timeframe])\n }\n\n const initialStoreDrawings = getInitialStoreDrawings()?.filter(({ changeType }) => changeType !== 'destroy') ?? []\n const isQuotePage = newConfig.specificChartFunctionality === SpecificChartFunctionality.quotePage\n const isQuotePageWithDrawingsOff = isQuotePage && utils.getCookie('charts-draw') !== 'on'\n\n if (initialStoreDrawings.length === 0 || isQuotePageWithDrawingsOff) {\n return newConfig\n }\n\n const noteDrawing = initialStoreDrawings.find(\n ({ containerType, ticker }) =>\n containerType === 'note' && props.config.charts.some((chart) => chart.ticker === ticker)\n )\n\n const note = noteDrawing && JSON.parse(noteDrawing.elementAttrs)?.text\n const ideaObject = isQuotePage && note ? { note } : undefined\n\n return {\n ...newConfig,\n initialStoreDrawings,\n idea: newConfig.idea ?? ideaObject,\n charts: newConfig.charts.map((chart) => {\n const { ticker, panes } = chart\n return {\n ...chart,\n panes: panes.map((pane) => {\n const containerType = getContainerTypeFromPaneConfig(pane)\n const newElements = initialStoreDrawings\n .filter(\n (drawing) =>\n drawing.containerType === containerType &&\n drawing.ticker === ticker &&\n !pane.elements.some((paneElement) => paneElement.elementId === drawing.elementId)\n )\n .map(({ elementId, zIndex, elementAttrs }) => ({\n elementId,\n zIndex,\n ...JSON.parse(elementAttrs),\n }))\n return {\n ...pane,\n elements: [...pane.elements, ...newElements],\n }\n }),\n }\n }),\n }\n // We need to disable the eslint check because the hook is supposed to run only once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const chartLayoutModel = React.useMemo(() => {\n const settings = getSettings({ ...config, theme: config.theme! })\n const chartLayout = ChartLayoutModel.create({\n layout: config.layout,\n width: config.width,\n height: config.height,\n editable: config.editable,\n canChangeTicker: config.canChangeTicker,\n scrollable: config.scrollable,\n initialScrollable: config.scrollable,\n cross: config.cross,\n editors: config.editors,\n theme: config.theme,\n idea: config.idea,\n settings,\n isWheelZoomEnabled: config.specificChartFunctionality === SpecificChartFunctionality.chartPage,\n specificChartFunctionality: config.specificChartFunctionality,\n isHideDrawingsActive: false,\n isPreserveDrawingsActive: !!(\n getIsPreserveDrawingsAndAutosaveAvailable(config) &&\n window.FinvizSettings.toolsState?.[DrawingSetting.PreserveDrawings]\n ),\n isLockDrawingsActive: false,\n uuid: config.uuid,\n drawingsInternalStore: DrawingsInternalStore.create({\n elements: config.initialStoreDrawings,\n }),\n })\n\n chartLayout.updateAttributes({ defaultZoomFactor: getDefaultZoomFactor(chartLayout) })\n\n return chartLayout\n\n // We need to disable the eslint check because the hook is supposed to run only once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return chartLayoutModel ? (\n <>\n \n \n \n ) : null\n}\n","import debounce from 'lodash.debounce'\nimport React from 'react'\n\nimport Chart from '../../models/chart'\nimport Quote from '../../models/quote'\n\nconst MAX_QUOTE_CACHE_TIME_IN_MS = 300000 // 5 min\n\nexport const withQuoteCacheManagement = (Component: any) => (props: any) => {\n React.useEffect(() => {\n const cleanupQuoteCache = () => {\n const allQuotes = Quote.all()\n const allCharts = Chart.all()\n const allChartQuotes = allCharts.flatMap((chart) => chart.getAllQuotes())\n\n allQuotes.forEach((quote) => {\n if (\n !allChartQuotes.some((usedQuote) => usedQuote.eql(quote)) &&\n !quote.isFetching &&\n quote.fetchedAt > -1 &&\n quote.fetchedAt < Date.now() - MAX_QUOTE_CACHE_TIME_IN_MS\n ) {\n quote.destroy()\n }\n })\n }\n\n const checkQuoteCacheDebounce = debounce(cleanupQuoteCache, 500)\n\n Quote.bind('change', checkQuoteCacheDebounce)\n return () => {\n checkQuoteCacheDebounce.cancel()\n Quote.unbind('change', checkQuoteCacheDebounce)\n }\n }, [])\n\n return \n}\n","import debounce from 'lodash.debounce'\nimport React from 'react'\n\nimport { ObjectHash } from '../../../types/shared'\nimport { EXTRA_MARKET_BUFFER_MINUTES, QUOTE_FETCH_EVENT } from '../../constants/common'\nimport Chart from '../../models/chart'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport Pane from '../../models/pane'\nimport { QuoteFetchType } from '../../models/quote/constants'\n\ninterface Props {\n chartLayoutModel: ChartLayoutModel\n}\n\ntype PollingIntervalToChartsType = ObjectHash\n\n/*\n * This HOC loops through all charts and checks if they are supposed to be refetch in some interval\n * It creates groups of charts to be refreshed grouped by the refresh interval\n * */\nexport const withQuotePolling = (Component: any) => (props: Props) => {\n const [pollingIntervalToCharts, setPollingIntervalToCharts] = React.useState({})\n const checkForChartsWithPolling = React.useCallback(() => {\n // check for charts which have some refresh interval and group chart ids by the interval value e.g. { interval_in_ms: [id1, id2] }\n const newPollingIntervalToCharts: PollingIntervalToChartsType = {} // example { 60000: ['c-0', 'c-1'], 9000: ['c-4'] }\n props.chartLayoutModel.getAllCharts().forEach((chart) => {\n const chartRefreshInterval = chart.getRefreshInterval()\n\n if (chartRefreshInterval) {\n newPollingIntervalToCharts[chartRefreshInterval] = newPollingIntervalToCharts[chartRefreshInterval] ?? []\n newPollingIntervalToCharts[chartRefreshInterval].push(chart.id)\n }\n })\n\n if (JSON.stringify(newPollingIntervalToCharts) !== JSON.stringify(pollingIntervalToCharts)) {\n setPollingIntervalToCharts(newPollingIntervalToCharts)\n }\n }, [props.chartLayoutModel, pollingIntervalToCharts])\n const intervalIdsRef = React.useRef([])\n\n React.useEffect(() => {\n const checkForChartsWithPollingDebounced = debounce(checkForChartsWithPolling)\n const chartsCheckerIntervalId = window.setInterval(\n checkForChartsWithPollingDebounced,\n EXTRA_MARKET_BUFFER_MINUTES * 1000\n )\n\n // listen on any changes in all charts & panes and call debounced check for charts/indicators with quotes that needs to be refetched periodically\n Chart.bind('change', checkForChartsWithPollingDebounced)\n Pane.bind('change', checkForChartsWithPollingDebounced)\n\n return () => {\n checkForChartsWithPollingDebounced.cancel()\n Chart.unbind('change', checkForChartsWithPollingDebounced)\n Pane.unbind('change', checkForChartsWithPollingDebounced)\n window.clearInterval(chartsCheckerIntervalId)\n }\n }, [checkForChartsWithPolling])\n\n React.useEffect(() => {\n const timeoutDurations = Object.keys(pollingIntervalToCharts).map(Number)\n const allCharts = props.chartLayoutModel.getAllCharts()\n const timeoutDurationsMin = Math.min(...timeoutDurations)\n\n timeoutDurations.forEach((duration) => {\n const timeoutId = window.setInterval(() => {\n const chartIds = pollingIntervalToCharts[duration]\n // get all UNIQUE quotes used in charts and refetch them\n allCharts\n .filter((chart) => chartIds.includes(chart.id))\n .flatMap((chart) => chart.getAllQuotes())\n .filter(\n (quote, index, quotesToUpdate) =>\n !quote.isFetching && index === quotesToUpdate.findIndex((quoteToUpdate) => quote.eql(quoteToUpdate))\n )\n .forEach((quote) => {\n quote.fetchData({ fetchType: QuoteFetchType.NewerData })\n })\n if (duration === timeoutDurationsMin) {\n document.dispatchEvent(new Event(QUOTE_FETCH_EVENT))\n }\n }, duration)\n intervalIdsRef.current.push(timeoutId)\n })\n\n return () => {\n if (intervalIdsRef.current.length > 0) {\n intervalIdsRef.current.forEach((timeoutId) => {\n window.clearInterval(timeoutId)\n })\n intervalIdsRef.current = []\n }\n }\n }, [props.chartLayoutModel, pollingIntervalToCharts])\n\n return \n}\n","import Spine from '@finviz/spine'\nimport classnames from 'classnames'\nimport flowRight from 'lodash.flowright'\nimport merge from 'lodash.merge'\nimport throttle from 'lodash.throttle'\nimport React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport { ChartConfigObject, DrawingSpineOptionsEvent, IIdea, RootChartConfigObject } from '../../../types/shared'\nimport { ChartGrid, ChartGridCell } from '../../components'\nimport { ChartEditorEnum, LAYOUTS, LayoutType, SpecificChartFunctionality } from '../../constants/common'\nimport ChartModel from '../../models/chart'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport ChartLayout from '../../models/chart_layout'\nimport { AutoSaveState } from '../../models/constants'\nimport ElementModel from '../../models/element'\nimport utils, {\n getChartsDimensions,\n getFullscreenStatus,\n getIsMobilePortrait,\n isRedesignEnabled,\n isRedesignedPage,\n} from '../../utils'\nimport { getIsPreserveDrawingsAndAutosaveAvailable, getIsSidebarEnabled } from '../../utils/chart'\nimport fetchApi from '../../utils/fetch_api'\nimport { getTickersAndContainerTypesInLayoutModel } from '../autosave/utils'\nimport { withDrawingsAutoSave } from '../autosave/with-auto-save'\nimport Chart from '../chart'\nimport { SidebarDirection } from '../sidebar/constants'\nimport { Sidebar } from '../sidebar/sidebar'\nimport Toolbar from '../toolbar'\nimport { AutoSaveNotesDialog } from '../toolbar/auto-save-notes'\nimport { ConfirmationDialog } from '../toolbar/confirmation_dialog'\nimport { DrawingActions, DrawingSetting, DrawingTool } from '../toolbar/interfaces'\nimport ToolbarMobile from '../toolbar/mobile/toolbar-mobile'\nimport { withDialogState } from '../with_dialog_state_hook'\nimport { AutoSaveStateIndicator } from './auto-save-state-indicator'\nimport { ChartLayoutAutoSaveNote } from './chart-layout-auto-save-note'\nimport { PublishOldButtonClickListener, getPublishChartHtmlElements } from './publish_old_button_click_listener'\nimport { withChartPageTitle } from './with-chart-page-title'\nimport { withChartRouteChange } from './with-chart-route-change'\nimport { withCompleteLayoutModelInit } from './with-complete-layout-model-init'\nimport { withIdeaModelState } from './with-idea-model-state'\nimport { withQuoteCacheManagement } from './with-quote-cache-management'\nimport { withQuotePolling } from './with-quote-polling'\n\ninterface ChartLayoutComponentProps {\n config: RootChartConfigObject\n confirmationDialogState: any\n noteDialogState: any\n shouldResize?: boolean\n chartLayoutModel: ChartLayoutModel\n idea?: IIdea\n deleteAllAutoSavedElements: () => void\n isAutoSaveActive: boolean\n}\n\ninterface ChartLayoutComponentState {\n editable: boolean\n editors: ChartEditorEnum[]\n layout: LayoutType\n activeChartInteraction: string | null\n touchEventsDisabled: boolean\n isToolbarHorizontal: boolean\n activeTool: DrawingTool\n drawingSettings: Record\n}\n\nclass ChartLayoutComponentBase extends React.Component {\n // expects config, bindPublic\n model: ChartLayoutModel\n isMobile = Boolean(utils.isMobile(true))\n charts: Array<{ model: ChartModel; config: ChartConfigObject }>\n orientationChangeTimeout: number | undefined\n preserveDrawingAbortController = new AbortController()\n\n constructor(props: ChartLayoutComponentProps) {\n super(props)\n\n this.model = props.chartLayoutModel\n const config = props.config\n\n this.charts = []\n for (const chartConfig of config.charts) {\n const modelProperties: Partial = merge({}, chartConfig)\n\n modelProperties.chart_layout = this.model\n delete modelProperties.panes\n if (modelProperties.zoomFactor == null) {\n modelProperties.zoomFactor = this.model.defaultZoomFactor\n }\n if (modelProperties.refreshData == null) {\n modelProperties.refreshData = true\n }\n if (!modelProperties.dateRange) {\n modelProperties.dateRange = null\n }\n modelProperties.isHideDrawingsActive = this.model.isHideDrawingsActive\n modelProperties.isScrolled = false\n const model = this.model.charts().create(modelProperties)\n this.charts.push({ model, config: chartConfig })\n }\n this.model.updateAttribute('activeChart', this.model.charts().first())\n\n this.state = {\n editable: this.model.editable,\n editors: this.model.editors,\n layout: this.model.layout,\n activeChartInteraction: null,\n activeTool: DrawingTool.Mouse,\n touchEventsDisabled: false,\n isToolbarHorizontal: true,\n drawingSettings: {\n [DrawingSetting.DrawingModeContinuous]: false,\n [DrawingSetting.PreserveDrawings]: this.handleInitialPreserveDrawingsState(),\n [DrawingSetting.HideDrawings]: false,\n [DrawingSetting.LockDrawings]: false,\n },\n }\n }\n\n componentDidMount() {\n if (this.state.editable) {\n const DELETE = 46\n window.addEventListener('keyup', (e) => {\n const selected = this.model.getPaneWithSelection()\n if (e.keyCode === DELETE && selected) {\n const element = ElementModel.findByAttribute('instance', selected.selection)\n if (element) {\n const elementPane = element.pane()\n element.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\n elementPane.normalizeZIndexes()\n }\n }\n })\n }\n\n if (this.isMobile) {\n this.model.settings.ThumbSettings.size = this.model.settings.ThumbSettings.touchSize\n }\n\n this.onModelChange()\n\n this.model.bind('change', this.onModelChange)\n this.model.charts().bind('destroy', this.onChartDestroy)\n\n this.setToolbarPosition()\n window.addEventListener('resize', this.onWindowResize)\n window.addEventListener('orientationchange', this.handleOrientationChange)\n\n if (this.isMobile) {\n this.checkTouchEventsDisabled()\n window.addEventListener('touchend', this.checkTouchEventsDisabled)\n }\n }\n\n componentDidUpdate(prevProps: Readonly): void {\n if (prevProps.idea && !this.props.idea) {\n if (this.model.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n this.onWindowResize()\n }\n document.querySelector('#idea-title-container')?.remove()\n }\n\n this.setToolbarPosition()\n }\n\n componentWillUnmount() {\n this.preserveDrawingAbortController.abort()\n this.model.unbind('change', this.onModelChange)\n\n window.removeEventListener('resize', this.onWindowResize)\n window.removeEventListener('orientationchange', this.handleOrientationChange)\n\n if (this.isMobile) {\n window.removeEventListener('touchend', this.checkTouchEventsDisabled)\n }\n\n clearTimeout(this.orientationChangeTimeout)\n this.throttledResize.cancel()\n this.model.destroyCascade()\n }\n\n handleInitialPreserveDrawingsState = () => {\n let preserveDrawings = false\n if (getIsPreserveDrawingsAndAutosaveAvailable(this.model)) {\n if (window.FinvizSettings.toolsState?.[DrawingSetting.PreserveDrawings] !== undefined) {\n preserveDrawings = window.FinvizSettings.toolsState[DrawingSetting.PreserveDrawings]\n } else {\n this.handlePreserveDrawingsSettings()\n }\n }\n this.model.updateAttribute('isPreserveDrawingsActive', preserveDrawings)\n return preserveDrawings\n }\n\n handlePreserveDrawingsSettings = async (value?: boolean) => {\n const setPreserveDrawings = (val: boolean) => {\n this.model.updateAttribute('isPreserveDrawingsActive', val)\n this.setState((prevState) => ({\n drawingSettings: {\n ...prevState.drawingSettings,\n [DrawingSetting.PreserveDrawings]: val,\n },\n }))\n }\n\n try {\n this.preserveDrawingAbortController.abort()\n this.preserveDrawingAbortController = new AbortController()\n const response = await fetchApi({\n location: '/api/tools_state.ashx',\n method: value !== undefined ? 'POST' : 'GET',\n body:\n value !== undefined\n ? new URLSearchParams({ tools_state: JSON.stringify({ [DrawingSetting.PreserveDrawings]: value }) })\n : undefined,\n throwOnStatusCodes: [404],\n abortController: this.preserveDrawingAbortController,\n })\n\n if (value === undefined && response?.[DrawingSetting.PreserveDrawings] !== undefined) {\n setPreserveDrawings(response[DrawingSetting.PreserveDrawings])\n }\n } catch {\n if (value !== undefined) {\n setPreserveDrawings(!value)\n }\n }\n }\n\n handleOrientationChange = () => {\n this.orientationChangeTimeout = window.setTimeout(() => {\n this.setToolbarPosition()\n if (this.props.shouldResize) {\n this.handleResize()\n }\n })\n }\n\n onWindowResize = () => {\n this.setToolbarPosition()\n\n if (this.props.shouldResize) {\n this.throttledResize()\n }\n }\n\n handleResize = () => {\n const modelAttrs: Partial = getChartsDimensions(this.model.getHTMLElementId())\n this.model.updateAttributes(modelAttrs)\n }\n\n throttledResize = throttle(this.handleResize, 200)\n\n setToolbarPosition() {\n // quote page toolbar\n // 210px represents: (20px (toolbar left margin) + 80px (toolbar width) + 5px (toolbar rigth margin)) * 2 (both sides of chart)\n const newIsToolbarHorizontal = this.model.width + 210 > window.innerWidth || window.innerWidth < 1000\n if (newIsToolbarHorizontal !== this.state.isToolbarHorizontal) {\n this.setState({\n isToolbarHorizontal: newIsToolbarHorizontal,\n })\n }\n }\n\n checkTouchEventsDisabled = () => {\n if (!/\\bcharts\\b/.test(window.location.pathname) || getFullscreenStatus() || this.getVisualViewportScale() === 1) {\n this.state?.touchEventsDisabled && this.setState({ touchEventsDisabled: false })\n } else {\n !this.state?.touchEventsDisabled && this.setState({ touchEventsDisabled: true })\n }\n }\n\n getVisualViewportScale = () => {\n if (process.env.IS_E2E_TESTING) {\n return 1\n }\n if (window.visualViewport && this.isMobile) {\n return window.visualViewport.scale\n } else {\n return 1\n }\n }\n\n handleActiveToolChange = (activeTool: DrawingTool) => {\n if (!this.model.isLockDrawingsActive) {\n this.setState({ activeTool })\n }\n }\n\n handleDrawingAction = (actionId: DrawingActions) => {\n switch (actionId) {\n case DrawingActions.AddNote:\n this.props.noteDialogState.toggle()\n break\n case DrawingActions.DeleteDrawings:\n case DrawingActions.DeleteAutoSavedDrawings:\n this.props.confirmationDialogState.show()\n break\n default:\n return\n }\n }\n\n handleConfirmationDialogCloseBtn = () => {\n this.props.confirmationDialogState.hide()\n }\n\n handleConfirmationDialogDeleteBtn = () => {\n if (this.model.drawingsInternalStore().autoSaveState !== AutoSaveState.Off) {\n this.props.deleteAllAutoSavedElements()\n }\n this.model.getAllElements().forEach((element) => element.isDrawing() && element.destroyCascade())\n this.handleConfirmationDialogCloseBtn()\n }\n\n handleDrawingsSetting = (settingId: DrawingSetting) => {\n const newObj = { ...this.state.drawingSettings, [settingId]: !this.state.drawingSettings[settingId] }\n\n switch (settingId) {\n case DrawingSetting.HideDrawings:\n this.handleActiveToolChange(DrawingTool.Mouse)\n this.toggleHideDrawings(newObj[DrawingSetting.HideDrawings])\n this.handleLockDrawings(newObj)\n break\n case DrawingSetting.PreserveDrawings:\n this.handlePreserveDrawingsSettings(newObj[DrawingSetting.PreserveDrawings])\n this.model.updateAttribute('isPreserveDrawingsActive', newObj[DrawingSetting.PreserveDrawings])\n break\n case DrawingSetting.LockDrawings:\n this.handleActiveToolChange(DrawingTool.Mouse)\n this.handleLockDrawings(newObj)\n break\n case DrawingSetting.DrawingModeContinuous:\n this.model.updateAttribute('isDrawingModeContinuousActive', newObj[DrawingSetting.DrawingModeContinuous])\n newObj[DrawingSetting.DrawingModeContinuous] === false && this.handleActiveToolChange(DrawingTool.Mouse)\n break\n default:\n break\n }\n\n this.setState({ drawingSettings: newObj })\n window.gtag?.('event', 'drawings_settings_toggle', {\n event_category: newObj[settingId] ? 'enable' : 'disable',\n event_label: settingId,\n })\n }\n\n handleLockDrawings = (drawingSettings: Record) => {\n this.model.updateAttribute(\n 'isLockDrawingsActive',\n !(!drawingSettings[DrawingSetting.HideDrawings] && !drawingSettings[DrawingSetting.LockDrawings])\n )\n }\n\n toggleHideDrawings(value: boolean) {\n this.model.updateAttribute('isHideDrawingsActive', value)\n this.model.getAllCharts().forEach((chart) => chart.updateAttribute('isHideDrawingsActive', value))\n }\n\n renderToolbar(args: any) {\n const { activeTool, drawingSettings } = this.state\n return args.isOverlayToolbar ? (\n \n ) : (\n \n )\n }\n\n render() {\n const { newCharts, useGrid } = this.props.config\n const { activeTool, editable, editors, isToolbarHorizontal } = this.state\n const publish = editors.includes(ChartEditorEnum.publish) && getPublishChartHtmlElements().length > 0\n const chartLayout = LAYOUTS[this.model.layout]\n const isMobilePortrait = getIsMobilePortrait(this.isMobile)\n const { tickers } = getTickersAndContainerTypesInLayoutModel(this.model)\n\n if (newCharts) {\n const isSidebarEnabled = getIsSidebarEnabled(SpecificChartFunctionality.chartPage)\n return (\n <>\n

\n {!isMobilePortrait &&\n // Due safari iOS flex-column bug not resizing height properly we need to render toolbar\n // outside of flex for portrait and inside for landscape\n // https://github.com/finvizhq/charts/pull/784\n this.renderToolbar({\n isSidebar: true,\n isHorizontal: false,\n })}\n \n \n \n {this.charts.map(({ model, config }, index) => (\n }\n gridArea={chartLayout.gridAreas?.[index]}\n setActiveChartInteraction={this.setActiveChartInteraction}\n activeTool={activeTool}\n activeChartInteraction={this.state.activeChartInteraction}\n touchEventsDisabled={this.state.touchEventsDisabled}\n shouldResize={this.props.shouldResize}\n />\n ))}\n \n \n
\n {isMobilePortrait && isSidebarEnabled && (\n \n )}\n {isMobilePortrait &&\n this.renderToolbar({\n isSidebar: false,\n isHorizontal: true,\n isOverlayToolbar: isSidebarEnabled,\n })}\n {this.props.idea?.note && (\n
\n
\n {this.props.idea.note}\n
\n
\n )}\n \n )\n }\n\n const hasRedesign = isRedesignEnabled()\n const hasChartTools = editable && editors.includes(ChartEditorEnum.tools)\n const renderTools = isRedesignedPage(this.model) ? hasChartTools && !isToolbarHorizontal : hasChartTools\n\n const ideaTitleContainer = document.querySelector('#idea-title-container')\n const ideaTitle = this.props.idea?.date &&\n this.model.specificChartFunctionality === SpecificChartFunctionality.quotePage && (\n

{`Your idea from ${this.props.idea.date}`}

\n )\n\n return (\n <>\n {ideaTitleContainer ? ReactDOM.createPortal(ideaTitle, ideaTitleContainer) : ideaTitle}\n \n {renderTools && (\n \n {this.renderToolbar({\n isHorizontal: isToolbarHorizontal,\n isAlternativeTheme: true,\n })}\n \n )}\n \n \n {this.charts.map(({ model, config }, index) => (\n \n this.renderToolbar({\n isHorizontal: true,\n isAlternativeTheme: true,\n })\n : undefined\n }\n />\n ))}\n \n
\n
\n
\n {this.model.specificChartFunctionality === SpecificChartFunctionality.quotePage && (\n \n )}\n \n \n )\n }\n\n setActiveChartInteraction = (value: string | null) => {\n this.setState({ activeChartInteraction: value })\n }\n\n updateLayout() {\n const layout = LAYOUTS[this.model.layout]\n const charts = this.model.charts().all()\n if (charts.length === 0) {\n return\n }\n\n if (charts.length > layout.count) {\n this.removeCharts(layout.count)\n } else if (charts.length < layout.count) {\n this.addCharts(layout.count - charts.length)\n }\n\n this.model\n .charts()\n .all()\n .forEach((chart, index) => {\n const [rowStart, columnStart, rowEnd, columnEnd] =\n layout.gridAreas?.[index]\n .replace(/ /g, '')\n .split('/')\n .map((num) => Number.parseInt(num)) || []\n const numOfRowsCovered = [rowEnd, rowStart].every((value) => value !== undefined) ? rowEnd - rowStart : 1\n const numOfColumnsCovered = [columnStart, columnEnd].every((value) => value !== undefined)\n ? columnEnd - columnStart\n : 1\n const percentageOfRowsCovered = numOfRowsCovered / layout.rows\n const percentageOfColumnsCovered = numOfColumnsCovered / layout.columns\n const newWidth = ~~(this.model.width * percentageOfColumnsCovered)\n const isChartPage = this.model.specificChartFunctionality === SpecificChartFunctionality.chartPage\n const chartLayoutHeight = isChartPage\n ? this.model.height\n : this.model.charts().first().height || this.model.height\n let newHeight = ~~(chartLayoutHeight * percentageOfRowsCovered)\n\n if (this.model.editors.includes(ChartEditorEnum.settings) && isChartPage) {\n newHeight -= this.model.settings.ChartSettings.general.settingsHeight\n }\n if ((chart.width !== newWidth || chart.height !== newHeight) && newWidth > 0 && newHeight > 0) {\n chart.updateAttributes({ width: newWidth, height: newHeight })\n }\n })\n }\n\n addCharts(count: number) {\n const quote = this.model.charts().last().quote()\n if (!quote) return\n const config = {\n ...this.model.charts().last().toObject(),\n leftOffset: null,\n chart_layout: this.model,\n aftermarket: quote.aftermarket,\n premarket: quote.premarket,\n }\n for (let i = 0; i < count; i++) {\n const model = this.model.charts().create(config)\n this.charts.push({ model, config })\n }\n }\n\n removeCharts(wantedCount: number) {\n while (this.model.charts().count() > wantedCount) {\n const chart = this.model.charts().last()\n chart.destroyCascade()\n this.charts.pop()\n }\n }\n\n onChartDestroy = (chartModel: ChartModel) => {\n this.updateLayout()\n if (this.model.activeChart?.eql(chartModel)) {\n this.model.updateAttribute('activeChart', this.model.charts().last())\n }\n }\n\n onModelChange = (layoutModel?: ChartLayout, event?: Spine.Event) => {\n if (event === 'refresh') {\n return\n }\n this.updateLayout()\n\n if (layoutModel && event === 'update') {\n this.setState({\n editable: layoutModel.editable,\n editors: layoutModel.editors,\n layout: layoutModel.layout,\n })\n }\n }\n}\n\nexport const ChartLayoutComponent = flowRight(\n withQuoteCacheManagement,\n withDialogState,\n withCompleteLayoutModelInit,\n withChartPageTitle,\n withChartRouteChange,\n withIdeaModelState,\n withQuotePolling,\n withDrawingsAutoSave\n)(ChartLayoutComponentBase)\n","import React from 'react'\n\nimport { useDialogState } from '../components'\n\nexport const withDialogState = (Component: any) => (props: any) => {\n const confirmationDialogState = useDialogState()\n const noteDialogState = useDialogState({ modal: false })\n\n return \n}\n","import * as React from 'react'\n\nimport { SpecificChartFunctionality, TIMEFRAME } from '../../constants/common'\nimport math from '../../helpers/math'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport Quote from '../../models/quote'\n\nfunction useChartPageTitle() {\n const defaultDocumentTitleRef = React.useRef(document.title)\n\n const { current: updateChartsTitle } = React.useRef((chartLayoutModel: ChartLayoutModel) => {\n const charts = chartLayoutModel\n .getAllCharts()\n .reduce(\n (acc, current) => {\n if (acc.some(({ ticker }) => ticker === current.ticker)) {\n return acc\n }\n return [...acc, { ticker: current.ticker, timeframe: current.timeframe, instrument: current.instrument }]\n },\n [] as Array<{ ticker: string; timeframe: TIMEFRAME; instrument: string }>\n )\n .map((chart) => {\n const { ticker, timeframe, instrument } = chart\n const quotes = Quote.select(\n (quote: Quote) =>\n quote.ticker === ticker.replace('@', '') &&\n quote.timeframe === timeframe &&\n quote.instrument === instrument &&\n chartLayoutModel.isIdeaId(quote.ideaID)\n )\n if (quotes.length > 0) {\n const { lastClose, instrument, afterClose, prevClose, name } = quotes[0]\n let percentageChange: number\n if (!lastClose) {\n return null\n }\n if (prevClose !== null) {\n percentageChange = (lastClose / prevClose - 1) * 100\n }\n if (afterClose !== null && afterClose !== lastClose) {\n percentageChange = (afterClose / lastClose - 1) * 100\n }\n return `${name || ticker} ${math.round({\n value: lastClose,\n lastClose,\n instrument,\n overridePlaces: undefined,\n })} ${percentageChange! > 0 ? '+' : '-'}${math.round({\n value: Math.abs(percentageChange!),\n overridePlaces: 2,\n })}%`\n }\n return null\n })\n .filter((chart) => chart !== null)\n\n if (charts && charts.length > 0) {\n const title = charts.join(' | ')\n if (document.title !== title) {\n document.title = title\n }\n } else if (document.title !== defaultDocumentTitleRef.current) {\n document.title = defaultDocumentTitleRef.current\n }\n })\n\n return { updateChartsTitle }\n}\n\nexport function withChartPageTitle

(\n Component: React.ComponentType

\n) {\n return function WrappedComponent(props: P) {\n const { updateChartsTitle } = useChartPageTitle()\n\n const handleChartsUpdate = React.useCallback(() => {\n updateChartsTitle(props.chartLayoutModel)\n }, [props.chartLayoutModel, updateChartsTitle])\n\n React.useEffect(() => {\n if (props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n props.chartLayoutModel.charts().bind('change', handleChartsUpdate)\n\n handleChartsUpdate()\n\n return () => {\n props.chartLayoutModel.charts().unbind('change', handleChartsUpdate)\n }\n }\n }, [props.chartLayoutModel, handleChartsUpdate])\n\n return \n }\n}\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayoutModel from '../../models/chart_layout'\n\nexport function withIdeaModelState

(\n Component: React.ComponentType

\n) {\n return function WrappedComponent(props: P) {\n const chartLayoutModel = useModelState(props.chartLayoutModel, { watchProperties: ['idea'] })\n return \n }\n}\n","import React from 'react'\n\nimport { RootChartConfigObject } from '../../../types/shared'\nimport { NotificationWrapper } from '../../components'\nimport { ElementStyleDialogWrapper } from '../../modals/element_style'\nimport { useAsyncModule, withSuspense } from '../../utils/async-modules-utils'\nimport { chartSettingsAsyncModule } from '../chart-settings/async-modules'\nimport { ChartLayoutComponent } from './chart_layout_component'\n\ninterface ChartLayoutProps {\n config: RootChartConfigObject\n shouldResize?: boolean\n parentElement?: HTMLElement\n isWithNotifications?: boolean\n}\n\nexport function ChartLayout({ config, shouldResize, isWithNotifications = true }: ChartLayoutProps) {\n const Wrapper = isWithNotifications ? NotificationWrapper : React.Fragment\n return (\n \n \n \n \n \n )\n}\n\nexport function ChartLayoutWithGlobalStateRaw({\n config,\n shouldResize,\n parentElement,\n}: Omit) {\n const [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { setChartLayoutModel, getChartLayoutModelConfig, lastGlobalRerender } =\n chartsModule.useChartLayoutGlobalModel()\n\n return (\n \n {config && (\n \n )}\n \n )\n}\n\nexport const ChartLayoutWithGlobalState = withSuspense(ChartLayoutWithGlobalStateRaw)\n","import * as React from 'react'\n\nimport { Button } from '../../components'\nimport Utils, { getExitFullscreen, getFullscreenStatus, getRequestFullscreen } from '../../utils'\n\nconst isIPad = Utils.isIPad()\nconst IPAD_FULLSCREEN_CLASS = 'is-ipad-fullscreen'\n\nexport function FullscreenButton() {\n const [isFullscreen, setIsFullscreen] = React.useState(getFullscreenStatus())\n const requestFullscreen = getRequestFullscreen(document.documentElement)\n const exitFullscreen = getExitFullscreen()\n\n const onClick = React.useRef(() => {\n if (getFullscreenStatus()) {\n exitFullscreen.call(document)\n } else {\n requestFullscreen.call(document.documentElement)\n }\n })\n\n React.useEffect(() => {\n const checkFullscreen = () => {\n if (isIPad) {\n if (getFullscreenStatus()) {\n document.body.classList.add(IPAD_FULLSCREEN_CLASS)\n } else {\n document.body.classList.remove(IPAD_FULLSCREEN_CLASS)\n }\n }\n setIsFullscreen(getFullscreenStatus())\n }\n\n document.addEventListener('webkitfullscreenchange', checkFullscreen)\n document.addEventListener('fullscreenchange', checkFullscreen)\n return () => {\n document.removeEventListener('webkitfullscreenchange', checkFullscreen)\n document.removeEventListener('fullscreenchange', checkFullscreen)\n }\n }, [])\n\n if (!requestFullscreen) return null\n\n return (\n \n {isFullscreen ? 'Exit Full screen' : 'Full screen'}\n \n )\n}\n","import * as React from 'react'\nimport { useLocation, useNavigate } from 'react-router-dom'\n\nimport { Button, Dropdown, DropdownItem, DropdownSeparator, Icon, Paragraph, useDropdownState } from '../../components'\nimport { LAYOUTS } from '../../constants/common'\nimport { sortObjects } from '../../helpers/sorter'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { ChartSyncableParts } from '../../models/chart/contstants'\nimport ChartLayout from '../../models/chart_layout'\nimport { decodeQueryString } from '../../utils/query_string'\nimport { useChartsPathLocation } from '../chart-controls/use-charts-path-location'\n\nconst SORTED_LAYOUT_KEYS = sortObjects(\n Object.entries(LAYOUTS).map(([key, value]) => ({ ...value, key })),\n [{ sortBy: 'columns' }, { sortBy: 'count' }]\n).map(({ key }) => key)\n\nexport function ChartLayoutDropdown({ model }: { model: ChartLayout }) {\n const location = useLocation()\n const navigate = useNavigate()\n const parsedQuery = decodeQueryString(location.search)\n const chartLayoutModel = useModelState(model, { watchProperties: ['layout', 'syncChartParts'] })\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel })\n const state = useDropdownState({ placement: 'bottom', orientation: 'horizontal' })\n\n return (\n \n Layout\n \n }\n >\n

\n
\n {SORTED_LAYOUT_KEYS.map((layout) => (\n {\n navigate(getChartsToPath({ layout }))\n }}\n >\n \n \n ))}\n
\n \n
\n
\n Sync:\n
\n {ChartSyncableParts.map(({ value, label }) => {\n const isChartPartInSync = chartLayoutModel.getIsChartPartInSync(value)\n return (\n {\n chartLayoutModel.setSyncChartParts(value, !isChartPartInSync)\n if (!isChartPartInSync) window.gtag?.('event', 'sync', { event_label: value })\n }}\n >\n {label}\n \n )\n })}\n
\n
\n \n )\n}\n","import { ObjectHash } from '../../types/shared'\nimport { SORT_DIRECTION } from '../constants/common'\n\nexport function sortObjects(\n arr: ObjectHash[],\n options: Array<{ sortBy: string; sortDirection?: keyof typeof SORT_DIRECTION }> = []\n) {\n return arr.sort((a, b) =>\n options.reduce((acc, option) => {\n const { sortBy, sortDirection = SORT_DIRECTION.ASC } = option\n const directionMultiplier = sortDirection === SORT_DIRECTION.ASC ? 1 : -1\n return acc === 0 ? (a[sortBy] - b[sortBy]) * directionMultiplier : acc\n }, 0)\n )\n}\n","import * as React from 'react'\n\nimport { Button } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { updateSettings } from '../../models/settings'\n\nexport function ThemeToggleButton({ model }: { model: ChartLayout }) {\n const chartLayoutModel = useModelState(model, { watchProperties: ['theme'] })\n const isDarkMode = model.theme === 'dark'\n\n const onClick = () => {\n const theme = isDarkMode ? 'light' : 'dark'\n chartLayoutModel.updateAttributes({ theme, settings: updateSettings(chartLayoutModel, theme) })\n chartLayoutModel.trigger('theme', chartLayoutModel)\n fetch(`/api/set_cookie.ashx?cookie=chartsTheme&value=${theme}`).catch(() => {})\n\n if (isDarkMode) {\n document.documentElement.classList.remove('dark')\n } else {\n document.documentElement.classList.add('dark')\n }\n }\n\n if (!chartLayoutModel) {\n return null\n }\n\n return (\n \n )\n}\n","import * as React from 'react'\n\nimport { Button, Time } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { FullscreenButton } from './fullscreen_button'\nimport { IdeasDropdown } from './ideas_dropdown'\nimport { ChartLayoutDropdown } from './layout_dropdown'\nimport { Publish } from './publish'\nimport { ThemeToggleButton } from './theme_toggle_button'\nimport { TourButton } from './tour_button'\n\nconst BREAKPOINTS = [\n { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\n { minWidth: 550, marketBadgeText: false, timeFormat: 'short' },\n { minWidth: 700, marketBadgeText: false, timeFormat: 'long' },\n { minWidth: 768, marketBadgeText: true, timeFormat: 'long' },\n]\n\ninterface ChartLayoutHeaderProps {\n model: ChartLayout\n onSettingsOpen: () => void\n refreshHeader: () => void\n hasPublish: boolean\n}\n\nexport function ChartLayoutHeaderComponent({ model, onSettingsOpen = () => {}, hasPublish }: ChartLayoutHeaderProps) {\n const chartLayout = useModelState(model, { watchProperties: ['idea'] })!\n\n return (\n <>\n
\n \n Ideas\n \n
\n
\n \n Chart tour\n \n \n \n {hasPublish && (\n \n Share\n \n )}\n \n \n \n
\n \n )\n}\n\nexport const ChartLayoutHeader = React.memo(\n ChartLayoutHeaderComponent,\n (prevProps, nextProps) =>\n prevProps.model === nextProps.model &&\n prevProps.onSettingsOpen === nextProps.onSettingsOpen &&\n prevProps.hasPublish === nextProps.hasPublish\n)\n","import React from 'react'\n\nimport { Instrument } from '../../../types/shared'\nimport { CustomDateRange, TimeframeBar, useCustomDateRangeDialog, useFavoriteTimeframes } from '../../components'\nimport { TIMEFRAME } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { isRedesignEnabled } from '../../utils'\nimport { useAsyncModule, withSuspense } from '../../utils/async-modules-utils'\nimport { chartSettingsAsyncModule } from '../chart-settings/async-modules'\nimport { useChartControls } from './use-chart-controls'\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\n\nfunction StockDetailTimeframeBarRaw({\n size = 'regular',\n className = '!m-0 space-x-2',\n isDateRangeAvailable,\n isPremium,\n isLoadingOverride,\n isScrollIntoViewEnabled = false,\n onTimeframeSelect = () => {},\n onDateRangeSelect = () => {},\n}: {\n size?: string\n className?: string\n isDateRangeAvailable: boolean\n isPremium: boolean\n isLoadingOverride?: boolean\n isScrollIntoViewEnabled?: boolean\n onTimeframeSelect?: (timeframe: any) => void\n onDateRangeSelect?: (timeframe: any) => void\n}) {\n const [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { chartLayoutModel } = chartsModule.useChartLayoutGlobalModel()\n const chartModelUnwatched = React.useMemo(() => chartLayoutModel?.getAllCharts()[0] ?? null, [chartLayoutModel])\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes(isPremium)\n const chartModel = useModelState(chartModelUnwatched, {\n watchProperties: ['timeframe', 'dateRange'],\n })\n const { instrument = Instrument.Stock } = chartModel?.quote() || {}\n const { isLoading } = useChartControls({\n chartModel,\n isInteractive: isDateRangeAvailable,\n })\n\n const {\n anchorDate,\n generateChartLayoutRouterPath,\n timeframeGroupsWithHref,\n dateRangeGroupsWithHref,\n isFetching,\n handleCustomDateRangeValidation,\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\n useCustomDateRangeDialog({\n instrument,\n anchorDate,\n pathGenerator: generateChartLayoutRouterPath,\n })\n\n const dateRangeGroups = dateRangeGroupsWithHref({ isPremium, customRange: chartModel?.dateRange, instrument })\n const timeFrameGroups = timeframeGroupsWithHref(isPremium)\n\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\n if (!dateRangeTimeframe) return\n\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\n if (isValid) onDialogSubmit(dateRangeTimeframe)\n }\n\n return (\n <>\n {\n handleDateRangeSelect(value)\n onDateRangeSelect?.(value)\n }}\n onTimeframeSelect={onTimeframeSelect}\n onFavoriteTimeframeToggle={({ value }: { value: TIMEFRAME }) => {\n toggleFavoriteTimeframe(value)\n }}\n isDateRangeAvailable={isDateRangeAvailable}\n containerElement={document.body}\n className={className}\n isFavoritesEnabled={isPremium}\n isScrollIntoViewEnabled={isScrollIntoViewEnabled}\n />\n\n {chartModel && (\n \n )}\n \n )\n}\n\nexport const StockDetailTimeframeBar = withSuspense(StockDetailTimeframeBarRaw)\n","import { ChartConfigChartPane, Position, RootChartConfigObject, TaConfigObject } from '../../types/shared'\nimport { ChartElementType, IndicatorType, OverlayType, PANE_HEIGHT_DEFAULT, ScaleType } from '../constants/common'\n\nfunction hasPaneWithCOTCode(panes: ChartConfigChartPane[], code: string) {\n return panes.some(({ elements }) =>\n elements.some((element) => element.type === IndicatorType.Cot && element.code === code)\n )\n}\nfunction pushIndicators(\n panes: ChartConfigChartPane[],\n indicator: { name: string; parameters: string },\n options?: { COTs?: string[] }\n) {\n if (indicator.name === 'cot') {\n const cotKeys = options?.COTs ?? []\n if (cotKeys.length === 0) {\n cotKeys.push('')\n }\n cotKeys.forEach(function (code: string) {\n if (!hasPaneWithCOTCode(panes, code)) {\n panes.push({\n height: PANE_HEIGHT_DEFAULT.indicator,\n elements: [\n {\n type: IndicatorType.Cot,\n code,\n },\n ],\n })\n }\n })\n } else {\n panes.push({\n height: PANE_HEIGHT_DEFAULT.indicator,\n elements: [\n {\n type: ('indicators/' + indicator.name) as IndicatorType,\n period: indicator.parameters,\n },\n ],\n })\n }\n}\n\nfunction getChartTypeByTaConfigStyle(style: string) {\n const chartTypeMap = {\n candlestick: ChartElementType.CandleStick,\n heikinashi: ChartElementType.HeikinAshi,\n hollowcandlestick: ChartElementType.HollowCandleStick,\n line: ChartElementType.LineChart,\n ohlc: ChartElementType.OhlcChart,\n }\n return chartTypeMap[style as keyof typeof chartTypeMap]\n}\n\nfunction getChartScaleByTaConfigScale(scale: string | undefined) {\n const chartScaleMap = {\n linear: ScaleType.Linear,\n percentage: ScaleType.Percentage,\n logarithmic: ScaleType.Logarithmic,\n }\n return chartScaleMap[scale as keyof typeof chartScaleMap] ?? ScaleType.Linear\n}\n\n/*\n * Merges chartConfig (in \"chart\" format) with taConfig (in format that TA is preserved in DB)\n */\nexport const mergeChartAndTAConfig = function convertTA(\n chartConfig: RootChartConfigObject,\n taConfig: TaConfigObject,\n options?: { COTs: string[] }\n) {\n const panes = chartConfig.charts[0].panes\n const chart = chartConfig.charts[0]\n\n chart.scale = getChartScaleByTaConfigScale(taConfig.scale)\n\n taConfig.indicators\n .filter((indicator) => indicator.position === Position.Above)\n .forEach((indicator) => {\n pushIndicators(panes, indicator, options)\n })\n\n const overlays = taConfig.overlays.map(function (overlay) {\n return {\n type: ('overlays/' + overlay.name) as OverlayType,\n period: overlay.parameters ?? '',\n color: overlay.color ?? '',\n }\n })\n panes.push({\n height: PANE_HEIGHT_DEFAULT.chart,\n elements: [\n {\n type: getChartTypeByTaConfigStyle(taConfig.style),\n overlays: overlays,\n },\n ],\n })\n\n taConfig.indicators\n .filter((indicator) => indicator.position === Position.Below)\n .forEach((indicator) => {\n pushIndicators(panes, indicator, options)\n })\n\n chartConfig.height = chart.height = PANE_HEIGHT_DEFAULT.chart + (panes.length - 1) * PANE_HEIGHT_DEFAULT.indicator\n}\n\nexport const getPanes = function getPanes(taConfig: TaConfigObject) {\n const options = {}\n const panes: ChartConfigChartPane[] = []\n\n taConfig.indicators\n .filter((indicator) => indicator.position === Position.Above)\n .forEach((indicator) => {\n pushIndicators(panes, indicator, options)\n })\n\n const overlays = taConfig.overlays.map(function (overlay) {\n return {\n type: ('overlays/' + overlay.name) as OverlayType,\n period: overlay.parameters ?? '',\n color: overlay.color ?? '',\n }\n })\n panes.push({\n height: PANE_HEIGHT_DEFAULT.chart,\n elements: [\n {\n type: getChartTypeByTaConfigStyle(taConfig.style),\n overlays: overlays,\n },\n ],\n })\n\n taConfig.indicators\n .filter((indicator) => indicator.position === Position.Below)\n .forEach((indicator) => {\n pushIndicators(panes, indicator, options)\n })\n\n return panes\n}\n","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = () => ([]);\nwebpackEmptyContext.resolve = webpackEmptyContext;\nwebpackEmptyContext.id = 7176;\nmodule.exports = webpackEmptyContext;","/**\n * User type definition\n * @typedef {Object} ComponentsExport\n * @property {import('react').FC} Button\n * @property {import('react').FC} ButtonGroup\n * @property {import('react').FC} Checkbox\n * @property {import('react').FC} ContextMenu\n * @property {import('react').FC} Heading\n * @property {import('react').FC} Paragraph\n * @property {import('react').FC} Label\n * @property {Function} useDialogState\n * @property {Function} getExtendedDialogState\n * @property {Function} useListState\n * @property {import('react').FC} Dialog\n * @property {import('react').FC} DialogBody\n * @property {import('react').FC} DialogFooter\n * @property {import('react').FC} DialogHeader\n * @property {import('react').FC} DialogTrigger\n * @property {import('react').FC} SaveToPortfolio\n * @property {import('react').FC} ConfirmationDialog\n * @property {import('react').FC} CreateAlert\n * @property {import('react').VF} CopyToClipboard\n * @property {import('react').FC} DatePicker\n * @property {import('react').VF} ColorPicker\n * @property {import('react').VF} ColorPreview\n * @property {import('react').VF} InputColorPicker\n * @property {Function} useDropdownState\n * @property {import('react').FC} Dropdown\n * @property {import('react').FC} DropdownBar\n * @property {import('react').FC} DropdownItem\n * @property {import('react').FC} DropdownSeparator\n * @property {import('react').FC} MoreButtonDropdown\n * @property {import('react').Context} DropdownContext\n * @property {import('react').FC} GridLayout\n * @property {import('react').FC} ChartGrid\n * @property {import('react').FC} ChartGridCell\n * @property {any} IconName\n * @property {import('react').FC} Icon\n * @property {import('react').FC} Logo\n * @property {import('react').FC} CircleLogo\n * @property {any} InputTheme\n * @property {import('react').FC} Input\n * @property {import('react').FC} InnerState\n * @property {import('react').FC} TooltipInput\n * @property {import('react').FC} Textarea\n * @property {import('react').FC} HighlightedResult\n * @property {import('react').FC} ListItem\n * @property {import('react').FC} List\n * @property {import('react').FC} CategoryList\n * @property {Function} searchByValue\n * @property {Function} sortByLabel\n * @property {Function} useListSearch\n * @property {Function} usePopoverState\n * @property {import('react').FC} PopoverTrigger\n * @property {import('react').FC} Popover\n * @property {import('react').VF} RangeSlider\n * @property {import('react').FC} TickerSearch\n * @property {import('react').FC} Search\n * @property {import('react').FC} Select\n * @property {import('react').FC} StatelessSelect\n * @property {import('react').FC} SelectOption\n * @property {import('react').FC} Spinner\n * @property {import('react').FC} Delayed\n * @property {import('react').FC} ColorSelect\n * @property {import('react').FC} Toolbar\n * @property {import('react').FC} ToolbarItem\n * @property {import('react').FC} PortfolioWatchlistTable\n * @property {import('react').FC} ToolbarDivider\n * @property {import('react').FC} ToolbarButton\n * @property {any} DrawingTool\n * @property {Function} useTooltipState\n * @property {import('react').FC} Tooltip\n * @property {import('react').FC} TooltipTrigger\n * @property {Function} useTour\n * @property {import('react').FC} Paragraph\n * @property {import('react').FC} ButtonColorPicker\n * @property {import('react').FC} InnerState\n * @property {import('react').FC} TimeframeBar\n * @property {(elementOverride?: TElement | null) => { setElementRef: React.Dispatch>; elementWidth: number; elementHeight: number }} useElementMeasure\n * @property {Function} convertColorToHEX\n * @property {Function} hexStringToRGBA\n * @property {Function} rgbaToRGBAString\n * @property {Function} withNotificationContext\n * @property {Function} useNotification\n * @property {import('react').FC} Notification\n * @property {import('react').FC} NotificationWrapper\n * @property {import('react').FC} Time\n * @property {import('react').FC} CustomDateRange\n * @property {import('react').Context} ZIndexContext\n * @property {Function} useCustomDateRangeDialog\n * @property {Function} useFavoriteTimeframes\n * @property {Function} getTimeframeGroups\n * @property {Function} getDateRangeGroups\n * @property {Function} getDateRangeGroupsWithHref\n * @property {Function} generatePathForTimeframeDateRange\n * @property {Record} timeframeUtm\n */\n\n/**\n * Add type so that the properties are suggested\n * @type {ComponentsExport}\n */\nconst componentsLib = window.FLibs.components\n\nmodule.exports = componentsLib\n","// Keep in sync with Website repository colors.js file in: config/colors.js\n\nmodule.exports = {\n white: '#fff',\n black: '#000',\n inherit: 'inherit',\n transparent: 'transparent',\n current: 'currentColor',\n finviz: {\n 'blue-gray': '#262931',\n blue: '#4fa4f4',\n },\n gray: {\n 50: '#f3f3f5',\n 100: '#dedfe5',\n 200: '#c3c6d0',\n 300: '#a3a8b9',\n 400: '#868ea5',\n 500: '#676f85',\n 600: '#4c5263',\n 700: '#353945',\n 750: '#2c303b',\n 800: '#22262f',\n 900: '#14161d',\n },\n red: {\n 50: '#fef0f0',\n 100: '#fcd6d6',\n 200: '#fbb4b4',\n 300: '#fd8487',\n 400: '#fb5057',\n 500: '#d91e2b',\n 600: '#9f1f2a',\n 700: '#691f24',\n 800: '#45171a',\n 900: '#280e0f',\n },\n orange: {\n 50: '#fef2eb',\n 100: '#fdd9c5',\n 200: '#fab889',\n 300: '#ef9323',\n 400: '#ca7b14',\n 500: '#a0600e',\n 600: '#79460a',\n 700: '#583006',\n 800: '#3d1e03',\n 900: '#261101',\n },\n amber: {\n 50: '#fef2e7',\n 100: '#fedab5',\n 200: '#fbba56',\n 300: '#de9c1a',\n 400: '#bb830f',\n 500: '#956600',\n 600: '#704b00',\n 700: '#4f3400',\n 800: '#372200',\n 900: '#211300',\n },\n yellow: {\n 50: '#fdf2df',\n 100: '#fcdc86',\n 200: '#f3c736',\n 300: '#cda30b',\n 400: '#b08900',\n 500: '#8b6a00',\n 600: '#664e21',\n 700: '#46371e',\n 800: '#2f2516',\n 900: '#1b150d',\n },\n brightYellow: {\n 50: '#fff699',\n 100: '#fff200',\n },\n lime: {\n 50: '#ebfad6',\n 100: '#caec90',\n 200: '#aad547',\n 300: '#8db61e',\n 400: '#769913',\n 500: '#5b7800',\n 600: '#435900',\n 700: '#2e3e00',\n 800: '#1e2a00',\n 900: '#111900',\n },\n green: {\n 50: '#e7f7e8',\n 100: '#beeac1',\n 200: '#86d895',\n 300: '#34c062',\n 400: '#00a449',\n 500: '#19803d',\n 600: '#265d35',\n 700: '#1e4027',\n 800: '#162b1b',\n 900: '#0d1810',\n },\n emerald: {\n 50: '#ddfaee',\n 100: '#a2f0d2',\n 200: '#4dddaf',\n 300: '#25be93',\n 400: '#1d9f7b',\n 500: '#157e60',\n 600: '#035d47',\n 700: '#004139',\n 800: '#002c22',\n 900: '#001a13',\n },\n teal: {\n 50: '#e0f8fc',\n 100: '#9beef7',\n 200: '#4fd8e5',\n 300: '#27b9c4',\n 400: '#109ba5',\n 500: '#007c83',\n 600: '#005b62',\n 700: '#004045',\n 800: '#002b2e',\n 900: '#00191b',\n },\n blue: {\n 50: '#ebf4fe',\n 100: '#cae2fc',\n 200: '#9bcbfa',\n 300: '#57aefb',\n 400: '#2f91ef',\n 500: '#306dca',\n 600: '#2f5091',\n 700: '#263766',\n 800: '#1b2542',\n 900: '#101527',\n },\n violet: {\n 50: '#f4f2fe',\n 100: '#e1dbfd',\n 200: '#c9befc',\n 300: '#ad9bfb',\n 400: '#9978f9',\n 500: '#7c51e7',\n 600: '#5e36b8',\n 700: '#402979',\n 800: '#2a1e4e',\n 900: '#18122c',\n },\n purple: {\n 50: '#f9f1fe',\n 100: '#eed8fd',\n 200: '#e1b6fc',\n 300: '#d38bfb',\n 400: '#c85bf9',\n 500: '#ae27e0',\n 600: '#8514ac',\n 700: '#60077e',\n 800: '#44005a',\n 900: '#2a003a',\n },\n pink: {\n 50: '#fef1f4',\n 100: '#fdd6e1',\n 200: '#fcb2c7',\n 300: '#f984aa',\n 400: '#f25090',\n 500: '#cd2a74',\n 600: '#9d1658',\n 700: '#700c42',\n 800: '#4e052b',\n 900: '#32011a',\n },\n}\n","/**\n * Type definitions for assets exported in website FLibs\n * @typedef {Object} AssetsExport\n * @property {string} logo\n * @property {string} logo_light\n */\n\n/**\n * @typedef {Object} LocalStorageService\n * @property {(key: string, defaultValue: ValueType) => ValueType} getValue\n * @property {(key: string, valueGetter: React.SetStateAction, defaultValue: ValueType, emit?: boolean) => void} setValue\n * @property {(key: string, emit?: boolean) => void} removeValue\n * @property {(key: string, transformValue: NewValue | ((oldValue: PrevValue | NewValue) => NewValue), defaultValue: NewValue) => void} migrateValue\n */\n\n/**\n * Type definitions for functions exported in website FLibs\n * @typedef {Object} FLibsExport\n * @property {AssetsExport} assets\n * @property {(date?: Date, format?: TimeFormatType) => string} getFormattedDateString\n * @property {(date: Date) => string} formatDateToStringUS\n * @property {(key: string, defaultValue: ValueType) => ({ state: ValueType, setState: (value: React.SetStateAction) => void })} useSyncLocalStorage\n * @property {(props: { trackInitial?: boolean; trackAutomatically?: boolean; }) => () => void} useTrackPageView\n * @property {LocalStorageService} localStorage\n */\n\n/**\n * Add type so that the properties are suggested\n * @type {FLibsExport}\n */\nconst FLibsExports = window.FLibs\n\nmodule.exports = FLibsExports\n","export { getFullChartWidth, getIntradayChartConfig } from './controllers/renderUtils'\n\nexport { useAsyncModule, withSuspense } from './utils/async-modules-utils'\n\nexport { ChartLayout, ChartLayoutWithGlobalState } from './controllers/chart_layout'\nexport { ChartLayoutHeader } from './controllers/header'\nexport { Sidebar } from './controllers/sidebar/sidebar'\nexport { StockDetailTimeframeBar } from './controllers/chart-controls/stock-detail-timeframe-bar'\nexport { getTimeframeGroupsWithHref } from './controllers/chart-controls/utils'\nexport { useModelState } from './model-hooks/use-model-state'\nexport { default as Quote } from './models/quote'\nexport * as Settings from './models/settings'\nexport { default as Utils } from './utils'\nexport * as convertTa from './utils/convert_ta'\nexport { FREE_DATE_RANGES } from './constants/common'\n\nexport { chartSettingsAsyncModule } from './controllers/chart-settings/async-modules'\n\nexport { withCompleteLayoutModelInit } from './controllers/chart_layout/with-complete-layout-model-init'\nexport { withQuotePolling } from './controllers/chart_layout/with-quote-polling'\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface IArrowAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n border: DrawingBorder\n}\n\nclass Arrow extends Element {\n static type = CanvasElementType.arrow\n\n declare scaled: Pick\n name = 'Arrow'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.renderContent = this.renderContent.bind(this)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'l',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'r',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n border: {\n width: 3,\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\n\n context.translate(translateXY.x, translateXY.y)\n context.beginPath()\n context.set('lineCap', 'round')\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n const angle = Math.PI / 8\n const d = 20\n\n context.beginPath()\n context.moveTo(roundedXY.x1, roundedXY.y1)\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.stroke()\n\n const lineAngle = Math.atan2(roundedXY.y2 - roundedXY.y1, roundedXY.x2 - roundedXY.x1)\n const h = Math.abs(d / Math.cos(angle))\n\n const angle1 = lineAngle + angle\n const topx = roundedXY.x1 + Math.cos(angle1) * h\n const topy = roundedXY.y1 + Math.sin(angle1) * h\n const angle2 = lineAngle - angle\n const botx = roundedXY.x1 + Math.cos(angle2) * h\n const boty = roundedXY.y1 + Math.sin(angle2) * h\n\n context.beginPath()\n context.moveTo(topx, topy)\n context.lineTo(roundedXY.x1, roundedXY.y1)\n context.lineTo(botx, boty)\n context.stroke()\n context.translate(translateXY.x * -1, translateXY.y * -1)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.y1 += y\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'l') {\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n } else {\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nArrow.prototype.modalConfig = {\n inputs: [{ type: 'line', name: 'border' }],\n}\n\nexport default Arrow\n","import { DrawingBorder, PaneArea, RequireByKey, ResizeByThumbFuncProps } from '../../../types/shared'\nimport { CanvasElementType } from '../../constants/common'\nimport math from '../../helpers/math'\nimport { getContextWithCache } from '../../lib/shims'\nimport PaneModel from '../../models/pane'\nimport Element from '../element'\nimport Thumb from '../thumb'\n\nexport type BrushPoints = Array<[x: number, y: number]>\n\nexport interface IBrushAttrs {\n points: BrushPoints\n fill: string\n border: DrawingBorder\n isPolyLineClosed: boolean\n positionPointsTimestamps: BrushPoints\n}\n\nclass Brush extends Element {\n static type = CanvasElementType.brushV1\n\n untranslatedContext: CanvasRenderingContext2D | null = null\n\n name = 'Brush'\n\n brushPath: Path2D | null = null\n\n cachedFill = {\n previousFill: '',\n shouldRenderFill: false,\n }\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\n this.setFillCache()\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultTransparentFill,\n border: {\n width: 3,\n color: ElementSettings.Colors.border,\n },\n isPolyLineClosed: false,\n } as Partial\n }\n\n setFillCache() {\n this.cachedFill.previousFill = this.attrs.fill\n if (this.attrs.fill.length === 9) {\n this.cachedFill.shouldRenderFill = this.attrs.fill.slice(7) !== '00'\n } else {\n this.cachedFill.shouldRenderFill = true\n }\n }\n\n getShouldRenderFill() {\n if (this.attrs.fill !== this.cachedFill.previousFill) {\n this.setFillCache()\n }\n return this.cachedFill.shouldRenderFill\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n if (this.attrs.border != null) {\n context.set('strokeStyle', this.attrs.border.color)\n }\n context.set('lineCap', 'round')\n context.set('lineJoin', 'round')\n\n const brushPath = new Path2D()\n const { points } = this.attrs\n context.beginPath()\n brushPath.moveTo(this.fx(points[0][0]), this.fy(points[0][1]))\n let i\n if (points.length > 3) {\n for (i = 0; i < points.length - 2; i++) {\n const xc = (this.fx(points[i][0]) + this.fx(points[i + 1][0])) / 2\n const yc = (this.fy(points[i][1]) + this.fy(points[i + 1][1])) / 2\n brushPath.quadraticCurveTo(this.fx(points[i][0]), this.fy(points[i][1]), xc, yc)\n }\n brushPath.quadraticCurveTo(\n this.fx(points[i][0]),\n this.fy(points[i][1]),\n this.fx(points[i + 1][0]),\n this.fy(points[i + 1][1])\n )\n } else {\n for (const point of points) {\n brushPath.lineTo(this.fx(point[0]), this.fy(point[1]))\n }\n }\n\n if (this.attrs.isPolyLineClosed) {\n brushPath.closePath()\n }\n this.brushPath = brushPath\n if (this.attrs.fill && this.getShouldRenderFill()) {\n context.set('fillStyle', this.attrs.fill)\n context.fill(brushPath)\n }\n if (this.attrs?.border?.width) {\n context.set('lineWidth', this.attrs.border.width)\n context.stroke(brushPath)\n }\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getThumbs() {\n const [firstX, firstY] = this.attrs.points[0]\n const [lastX, lastY] = this.attrs.points[this.attrs.points.length - 1]\n\n return [\n new Thumb(\n 'first',\n () => firstX,\n () => firstY,\n this.moveByThumb,\n this.model\n ),\n new Thumb(\n 'last',\n () => lastX,\n () => lastY,\n this.moveByThumb,\n this.model\n ),\n ]\n }\n\n moveByThumb = ({ difX, difY }: RequireByKey) => {\n this.moveBy(difX, difY)\n }\n\n moveBy(x: number, y: number) {\n if (this.getIsCreator()) return\n for (const point of this.attrs.points) {\n point[0] += x\n point[1] += y\n }\n }\n\n onMouseUp() {\n const [currentDomainMax, currentDomainMin] = this.model.scale.y.domain()\n for (const point of this.attrs.points) {\n point[0] = this.roundToFixed(point[0], 2)\n point[1] = this.roundY(point[1], currentDomainMax - currentDomainMin)\n }\n super.onMouseUp()\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const { points } = this.attrs\n if (\n (this.getShouldRenderFill() || this.attrs.isPolyLineClosed) &&\n this.brushPath &&\n this.untranslatedContext?.isPointInPath(this.brushPath, area.scaled.x, area.scaled.y)\n ) {\n return true\n } else if (points.length > 1) {\n for (let i = 0; i < points.length - 1; i++) {\n if (\n math.distanceToSegment(area.scaled, {\n x1: this.fx(points[i][0]),\n y1: this.fy(points[i][1]),\n x2: this.fx(points[i + 1][0]),\n y2: this.fy(points[i + 1][1]),\n }) <= 10\n ) {\n return true\n }\n }\n }\n return super.isInArea(area)\n }\n\n cachePointPositionTimestamp = () => {\n const quote = this.model?.chart()?.quote()\n if (quote) {\n const positionPointsTimestamps = this.attrs.points.map(([x, y]) => [quote.getTimestampFomPositionX(x), y])\n this.set({ positionPointsTimestamps } as Partial)\n }\n }\n\n updateScales() {\n const quote = this.model.chart().quote()\n const { positionPointsTimestamps } = this.attrs\n if (!quote || !positionPointsTimestamps) {\n // positionPointsTimestamps check is temporary to prevent app from crashing\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\n return\n }\n const points = positionPointsTimestamps.map(([x, y]) => [quote.getPositionXFromTimestamp(x), y])\n this.set({ points } as Partial)\n }\n\n roundToFixed = (value: number, places: number) => Number.parseFloat(math.round({ value, overridePlaces: places }))\n\n roundY = (y: number, domainDiff: number) => {\n if (domainDiff < 1) {\n const numberOfLeadingZeros = Math.abs(Math.floor(Math.log10(Math.abs(domainDiff)) + 1))\n if (numberOfLeadingZeros > 0) {\n return this.roundToFixed(y, numberOfLeadingZeros + 4)\n } else {\n return this.roundToFixed(y, numberOfLeadingZeros + 3)\n }\n } else if (domainDiff < 10) {\n return this.roundToFixed(y, 3)\n }\n return this.roundToFixed(y, 2)\n }\n\n getAutosaveOmittedProperties() {\n return ['points']\n }\n}\n\nBrush.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, max: 20, default: {} },\n { type: 'checkbox', name: 'isPolyLineClosed', label: 'Close line' },\n ],\n}\n\nexport default Brush\n","import math from '../../helpers/math'\n\ninterface ICoordinates {\n x: number\n y: number\n}\nexport interface IRectangleSidesCoordinates {\n topLeft: ICoordinates\n topRight: ICoordinates\n rightTop: ICoordinates\n rightBottom: ICoordinates\n bottomRight: ICoordinates\n bottomLeft: ICoordinates\n leftBottom: ICoordinates\n leftTop: ICoordinates\n}\n\nexport interface ITailCoordinates {\n tailRoot: ICoordinates\n tailTip: ICoordinates\n}\n\nexport enum TailDirection {\n noTail,\n topLeftCorner,\n topRightCorner,\n bottomLeftCorner,\n bottomRightCorner,\n topSide,\n rightSide,\n bottomSide,\n leftSide,\n}\n\nexport const getRectangleSidesCoordinates = ({\n padding,\n radius,\n x2,\n y2,\n textWidth,\n measuredHeight,\n}: {\n padding: number\n radius: number\n x2: number\n y2: number\n textWidth: number\n measuredHeight: number\n}): IRectangleSidesCoordinates => ({\n topLeft: {\n x: x2 - padding + radius,\n y: y2 - padding,\n },\n topRight: {\n x: x2 + textWidth + padding - radius,\n y: y2 - padding,\n },\n rightTop: {\n x: x2 + textWidth + padding,\n y: y2 - padding + radius,\n },\n rightBottom: {\n x: x2 + textWidth + padding,\n y: y2 + padding + measuredHeight - radius,\n },\n bottomRight: {\n x: x2 + textWidth + padding - radius,\n y: y2 + padding + measuredHeight,\n },\n bottomLeft: {\n x: x2 - padding + radius,\n y: y2 + padding + measuredHeight,\n },\n leftBottom: {\n x: x2 - padding,\n y: y2 + padding + measuredHeight - radius,\n },\n leftTop: {\n x: x2 - padding,\n y: y2 - padding + radius,\n },\n})\n\nexport const getTailCoordinates = ({\n rectangleSides,\n x1,\n y1,\n}: {\n rectangleSides: IRectangleSidesCoordinates\n x1: number\n y1: number\n}): ITailCoordinates => ({\n tailRoot: {\n x: rectangleSides.topLeft.x + (rectangleSides.topRight.x - rectangleSides.topLeft.x) / 2,\n y: rectangleSides.leftTop.y + (rectangleSides.leftBottom.y - rectangleSides.leftTop.y) / 2,\n },\n tailTip: {\n x: x1,\n y: y1,\n },\n})\n\nconst getTailHalfWidth = (halfWidth: number, p1: ICoordinates, p2: ICoordinates): number => {\n const dist = math.distance(p1, p2)\n if (dist < halfWidth * 2) {\n return dist / 2\n } else {\n return halfWidth\n }\n}\n\nexport const getTailToSideIntersection = ({\n tail,\n rectangleSides,\n}: {\n tail: ITailCoordinates\n rectangleSides: IRectangleSidesCoordinates\n}): TailDirection => {\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\n const { tailTip, tailRoot } = tail\n if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, leftTop)) {\n return TailDirection.topLeftCorner\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topRight, rightTop)) {\n return TailDirection.topRightCorner\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, leftBottom)) {\n return TailDirection.bottomLeftCorner\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomRight, rightBottom)) {\n return TailDirection.bottomRightCorner\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)) {\n return TailDirection.topSide\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)) {\n return TailDirection.rightSide\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, bottomRight)) {\n return TailDirection.bottomSide\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)) {\n return TailDirection.leftSide\n } else {\n return TailDirection.noTail\n }\n}\n\ninterface IRenderCallout {\n context: any\n radius: number\n requiredTailHalfWidth: number\n tail: ITailCoordinates\n rectangleSides: IRectangleSidesCoordinates\n tailDirection: TailDirection\n}\n\nexport const renderCallout = ({\n context,\n radius,\n requiredTailHalfWidth,\n tail,\n rectangleSides,\n tailDirection,\n}: IRenderCallout): void => {\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\n const { tailTip, tailRoot } = tail\n\n // draw rounded rectangle from top left corner clockwise\n // !!! ORDER OF RENDER MATTERS !!!\n\n // renderTopLeftCorner\n if (tailDirection === TailDirection.topLeftCorner) {\n context.moveTo(leftTop.x, leftTop.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(topLeft.x, topLeft.y)\n } else {\n context.moveTo(leftTop.x, leftTop.y)\n context.arcTo(leftTop.x, topLeft.y, topLeft.x, topLeft.y, radius)\n }\n\n // renderTopLine\n if (tailDirection === TailDirection.topSide) {\n const tailLineToTopLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)\n if (!tailLineToTopLineIntersection) {\n context.lineTo(topRight.x, topRight.y)\n return\n }\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, topLeft, topRight)\n if (tailLineToTopLineIntersection.x - tailHalfWidth < topLeft.x) {\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(topLeft.x + tailHalfWidth * 2, tailLineToTopLineIntersection.y)\n } else if (tailLineToTopLineIntersection.x + tailHalfWidth > topRight.x) {\n context.lineTo(topRight.x - tailHalfWidth * 2, tailLineToTopLineIntersection.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(topRight.x, tailLineToTopLineIntersection.y)\n } else {\n context.lineTo(tailLineToTopLineIntersection.x - tailHalfWidth, tailLineToTopLineIntersection.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(tailLineToTopLineIntersection.x + tailHalfWidth, tailLineToTopLineIntersection.y)\n context.lineTo(topRight.x, topRight.y)\n }\n } else {\n context.lineTo(topRight.x, topRight.y)\n }\n\n // renderTopRightCorner\n if (tailDirection === TailDirection.topRightCorner) {\n context.lineTo(topRight.x, topRight.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(rightTop.x, rightTop.y)\n } else {\n context.arcTo(rightTop.x, topRight.y, rightTop.x, rightTop.y, radius)\n }\n\n // renderRightLine\n if (tailDirection === TailDirection.rightSide) {\n const tailLineToRightLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)\n if (!tailLineToRightLineIntersection) {\n context.lineTo(rightBottom.x, rightBottom.y)\n return\n }\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, rightTop, rightBottom)\n if (tailLineToRightLineIntersection.y - tailHalfWidth < rightTop.y) {\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(rightTop.x, rightTop.y + tailHalfWidth * 2)\n } else if (tailLineToRightLineIntersection.y + tailHalfWidth > rightBottom.y) {\n context.lineTo(rightBottom.x, rightBottom.y - tailHalfWidth * 2)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(rightBottom.x, rightBottom.y)\n } else {\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y - tailHalfWidth)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y + tailHalfWidth)\n context.lineTo(rightBottom.x, rightBottom.y)\n }\n } else {\n context.lineTo(rightBottom.x, rightBottom.y)\n }\n\n // renderBottomRightCorner\n if (tailDirection === TailDirection.bottomRightCorner) {\n context.lineTo(rightBottom.x, rightBottom.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(bottomRight.x, bottomRight.y)\n } else {\n context.arcTo(rightBottom.x, bottomRight.y, bottomRight.x, bottomRight.y, radius)\n }\n\n // renderBottomLine\n if (tailDirection === TailDirection.bottomSide) {\n const tailLineToBottomLineIntersection = math.twoSegmentLinesIntersection(\n tailTip,\n tailRoot,\n bottomLeft,\n bottomRight\n )\n if (!tailLineToBottomLineIntersection) {\n context.lineTo(bottomLeft.x, bottomLeft.y)\n return\n }\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, bottomLeft, bottomRight)\n if (tailLineToBottomLineIntersection.x + tailHalfWidth > bottomRight.x) {\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(bottomRight.x - tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\n } else if (tailLineToBottomLineIntersection.x - tailHalfWidth < bottomLeft.x) {\n context.lineTo(bottomLeft.x + tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(bottomLeft.x, tailLineToBottomLineIntersection.y)\n } else {\n context.lineTo(tailLineToBottomLineIntersection.x + tailHalfWidth, tailLineToBottomLineIntersection.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(tailLineToBottomLineIntersection.x - tailHalfWidth, tailLineToBottomLineIntersection.y)\n context.lineTo(bottomLeft.x, bottomLeft.y)\n }\n } else {\n context.lineTo(bottomLeft.x, bottomLeft.y)\n }\n\n // renderBottomLeftCorner\n if (tailDirection === TailDirection.bottomLeftCorner) {\n context.lineTo(bottomLeft.x, bottomLeft.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(leftBottom.x, leftBottom.y)\n } else {\n context.arcTo(leftBottom.x, bottomLeft.y, leftBottom.x, leftBottom.y, radius)\n }\n\n // renderLeftLine\n if (tailDirection === TailDirection.leftSide) {\n const tailLineToLeftLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)\n if (!tailLineToLeftLineIntersection) {\n context.lineTo(leftTop.x, leftTop.y)\n return\n }\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, leftTop, leftBottom)\n if (tailLineToLeftLineIntersection.y + tailHalfWidth > leftBottom.y) {\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(leftBottom.x, leftBottom.y - tailHalfWidth * 2)\n } else if (tailLineToLeftLineIntersection.y - tailHalfWidth < leftTop.y) {\n context.lineTo(leftTop.x, leftTop.y + tailHalfWidth * 2)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(leftTop.x, leftTop.y)\n } else {\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y + tailHalfWidth)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y - tailHalfWidth)\n context.lineTo(leftTop.x, leftTop.y)\n }\n } else {\n context.lineTo(leftTop.x, leftTop.y)\n }\n}\n","import merge from 'lodash.merge'\n\nimport { PaneArea, RequireByKey, ResizeByThumbWithTypeAndDifs, TextAttrs } from '../../../types/shared'\nimport { PADDING } from '../../constants/common'\nimport { CanvasElementType } from '../../constants/common'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport Text from '../text'\nimport Thumb from '../thumb'\nimport {\n TailDirection,\n getRectangleSidesCoordinates,\n getTailCoordinates,\n getTailToSideIntersection,\n renderCallout,\n} from './callout_utils'\nimport { IRectangleSidesCoordinates, ITailCoordinates } from './callout_utils'\n\nexport interface ICalloutAttrs {\n x1: number\n y1: number\n x2: number\n y2: number\n}\n\ninterface FontFamilyHeightCoefficient {\n Arial: {\n firstLine: number\n otherLines: number\n }\n Verdana: {\n firstLine: number\n otherLines: number\n }\n}\n\ntype CalloutTextAttrs = ICalloutAttrs & RequireByKey\n\nclass Callout extends Text {\n static type = CanvasElementType.calloutV1\n\n name = 'Callout'\n\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\n declare isActualBoundingBoxAvailable: boolean\n declare lastAttrs: Attrs\n declare scaled: Pick\n declare measuredHeight: number\n declare requiredTailHalfWidth: number\n declare rectangleSides: IRectangleSidesCoordinates\n declare tail: ITailCoordinates\n declare tailDirection: TailDirection\n declare font: string\n declare context: CanvasRenderingContext2D\n declare lines: {\n text: string\n metrics: TextMetrics\n }[]\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'tail',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n getModalConfigBase() {\n return {\n inputs: [\n { type: 'multiline_string', name: 'text', required: true },\n { type: 'font', name: 'font' },\n {\n type: 'background',\n name: 'fillStyle',\n label: 'Color',\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n },\n {\n type: 'background',\n name: 'background',\n label: 'Background',\n default: 'rgba(0,0,0,0)',\n },\n {\n type: 'border',\n name: 'border',\n min: 0,\n },\n ],\n }\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n text: '',\n font: {\n size: 15,\n family: 'Arial',\n style: 'normal',\n weight: 'normal',\n },\n fillStyle: ElementSettings.Colors.textWithoutBackground,\n lineHeight: 15,\n // left | right | center | start | end\n textAlign: 'left',\n // top | middle | alphabetic | bottom\n textBaseline: 'alphabetic',\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n },\n background: ElementSettings.defaultFill,\n border: { color: ElementSettings.Colors.line, width: 1 },\n } as Partial\n }\n\n setupContext(context: CanvasRenderingContext2D) {\n this.context = context\n context.set('font', this.font)\n context.set('fillStyle', this.attrs.fillStyle)\n context.set('textAlign', this.attrs.textAlign)\n context.set('textBaseline', this.attrs.textBaseline)\n this.setupTextMetricsCache()\n }\n\n setupTextMetricsCache() {\n if (\n this.attrs.text !== this.lastAttrs?.text ||\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)\n ) {\n this.lastAttrs = merge({}, this.attrs)\n this.lines = this.getLines().map((line) => ({\n text: line,\n metrics: this.context.measureText(line),\n }))\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\n const lineHeight =\n current.metrics.actualBoundingBoxAscent +\n current.metrics.actualBoundingBoxDescent +\n (currentIndex !== this.lines.length - 1 ? PADDING.S : 0)\n return acc + lineHeight\n }, 0)\n }\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n this.render(context)\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n renderText() {\n let y = this.scaled.y2 + this.attrs.padding.top\n let previousDescent = 0\n this.lines.forEach((line, index) => {\n y += index === 0 ? 0 : line.metrics.actualBoundingBoxAscent + previousDescent + PADDING.S\n this.context.fillText(line.text, this.scaled.x2 + this.attrs.padding.left, y)\n previousDescent = line.metrics.actualBoundingBoxDescent\n })\n }\n\n renderBackground() {\n if (!this.attrs.background) {\n return\n }\n const textWidth = this.attrs.text === '' ? this.attrs.font.size * 2 : this.width\n const minRadius = this.attrs.font.size * 0.5\n const padding = this.attrs.border.width / 2 + this.attrs.font.size * 0.5\n const radius = textWidth < minRadius ? textWidth / 2 : minRadius\n this.requiredTailHalfWidth = minRadius\n if (this.measuredHeight < minRadius) {\n this.measuredHeight = radius * 2\n }\n const y2 =\n this.scaled.y2 -\n (this.lines[0].metrics.actualBoundingBoxAscent\n ? this.lines[0].metrics.actualBoundingBoxAscent\n : this.measuredHeight)\n\n // Points diagram\n //.......X-----------------X.......\n //.................................\n //...X.........................X...\n //...|.........................|...\n //...|.........................|...\n //...X.........................X...\n //.................................\n //.......X-----------------X.......\n\n this.rectangleSides = getRectangleSidesCoordinates({\n padding,\n radius,\n x2: this.scaled.x2,\n y2,\n textWidth,\n measuredHeight: this.measuredHeight,\n })\n this.tail = getTailCoordinates({ rectangleSides: this.rectangleSides, x1: this.scaled.x1, y1: this.scaled.y1 })\n this.tailDirection = getTailToSideIntersection({ tail: this.tail, rectangleSides: this.rectangleSides })\n this.context.beginPath()\n this.context.set('fillStyle', this.attrs.background)\n this.context.lineJoin = 'round'\n renderCallout({\n context: this.context,\n radius,\n requiredTailHalfWidth: this.requiredTailHalfWidth,\n tail: this.tail,\n rectangleSides: this.rectangleSides,\n tailDirection: this.tailDirection,\n })\n this.context.closePath()\n this.context.fill()\n this.context.set('fillStyle', this.attrs.fillStyle)\n this.renderBorder()\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n // is in rectangle\n if (\n this.lines &&\n this.rectangleSides &&\n this.rectangleSides.leftTop.x < area.scaled.x &&\n this.rectangleSides.topLeft.y < area.scaled.y &&\n this.rectangleSides.rightBottom.x > area.scaled.x &&\n this.rectangleSides.bottomRight.y > area.scaled.y\n ) {\n return true\n }\n // is in tail\n if (this.tail) {\n const tailP1 = math.perpendicularPointToLine({\n distance: this.requiredTailHalfWidth,\n line: { x1: this.tail.tailTip.x, y1: this.tail.tailTip.y, x2: this.tail.tailRoot.x, y2: this.tail.tailRoot.y },\n })\n const pointOffsetX = tailP1.x - this.tail.tailRoot.x\n const pointOffsetY = tailP1.y - this.tail.tailRoot.y\n const tailP2 = { x: this.tail.tailRoot.x + -1 * pointOffsetX, y: this.tail.tailRoot.y + -1 * pointOffsetY }\n const polygon = [this.tail.tailTip, tailP1, tailP2]\n if (math.pointInPolygon(area.scaled, polygon)) {\n return true\n }\n }\n return super.isInArea(area)\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x2 += x\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'tail') {\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n }\n }\n}\n\nexport default Callout\n","import { Bezier } from 'bezier-js'\n\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface ICurveAttrs {\n x1: number\n x2: number\n x3: number\n cp1x: number\n cp2x: number\n y1: number\n y2: number\n y3: number\n cp1y: number\n cp2y: number\n border: DrawingBorder\n}\n\nclass Curve extends Element {\n static type = CanvasElementType.curve\n\n name = 'Curve'\n declare scaled: Pick\n declare curve: Bezier\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.render = this.render.bind(this)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'a',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'b',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c',\n () => this.attrs.x3 || this.attrs.x2,\n () => this.attrs.y3 || this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n border: {\n width: 1,\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\n\n drawQuadraticCurve(context: CanvasRenderingContext2D, curve: Bezier) {\n const { points } = curve\n context.beginPath()\n context.moveTo(points[0].x, points[0].y)\n context.quadraticCurveTo(points[1].x, points[1].y, points[2].x, points[2].y)\n context.stroke()\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n context.translate(0.5, 0.5)\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n if (!x3 || !y3) {\n context.beginPath()\n context.moveTo(x1, y1)\n context.lineTo(x2, y2)\n context.lineTo(x3, y3)\n context.stroke()\n } else {\n this.curve = Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5)\n this.drawQuadraticCurve(context, this.curve)\n }\n\n context.translate(-0.5, -0.5)\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.x3 += x\n this.attrs.cp1x += x\n this.attrs.cp2x += x\n\n this.attrs.y1 += y\n this.attrs.y2 += y\n this.attrs.y3 += y\n this.attrs.cp1y += y\n this.attrs.cp2y += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'a':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'b':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'c':\n this.attrs.x3 += difX\n this.attrs.y3 += difY\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (this.curve && this.curve.project(area.scaled).d! <= 10) {\n return true\n }\n return this.thumbsAreInArea(area)\n }\n}\n\nCurve.prototype.modalConfig = {\n inputs: [{ type: 'line', name: 'border' }],\n}\n\nexport default Curve\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface IEllipseAttrs {\n x1: number\n x2: number\n x3: number\n cp1x: number\n cp2x: number\n y1: number\n y2: number\n y3: number\n cp1y: number\n cp2y: number\n width: number\n fill: string\n border: DrawingBorder\n}\n\ninterface ICoordinates {\n topCenterX: number\n topCenterY: number\n topRightX: number\n topRightY: number\n topLeftX: number\n topLeftY: number\n centerLeftX: number\n centerLeftY: number\n centerRightX: number\n centerRightY: number\n bottomCenterX: number\n bottomCenterY: number\n bottomLeftX: number\n bottomLeftY: number\n bottomRightX: number\n bottomRightY: number\n}\n\n// OLD Ellipse \"v0\" kept for backward-compatibiluty for old saved ideas\n// current Ellipse tool located in ellipse folder\nclass Ellipse extends Element {\n static type = CanvasElementType.ellipse\n\n name = 'Ellipse'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'x1',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'x2',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'lw',\n () => this.model.scale.x.invert(this.getCoordinates().centerLeftX),\n () => this.model.scale.y.invert(this.getCoordinates().centerLeftY),\n this.resize,\n this.model\n ),\n new Thumb(\n 'rw',\n () => this.model.scale.x.invert(this.getCoordinates().centerRightX),\n () => this.model.scale.y.invert(this.getCoordinates().centerRightY),\n this.resize,\n this.model\n ),\n ]\n const boundingPointKeys = this.getBoundingPointKeys()\n this.scale({ x: [...boundingPointKeys.x, 'width'], y: boundingPointKeys.y })\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.line,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const c = this.getCoordinates()\n\n context.set('fillStyle', this.attrs.fill)\n\n context.beginPath()\n context.moveTo(c.bottomCenterX, c.bottomCenterY)\n context.bezierCurveTo(c.bottomRightX, c.bottomRightY, c.topRightX, c.topRightY, c.topCenterX, c.topCenterY)\n context.bezierCurveTo(c.topLeftX, c.topLeftY, c.bottomLeftX, c.bottomLeftY, c.bottomCenterX, c.bottomCenterY)\n context.closePath()\n context.fill()\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'x1':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'x2':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'lw':\n this.attrs.width += difX\n break\n case 'rw':\n this.attrs.width -= difX\n break\n default:\n break\n }\n }\n\n getCoordinates(): ICoordinates {\n // TODO cache?\n // http://stackoverflow.com/questions/14169234/the-relation-of-the-bezier-curve-and-ellipse\n const rotationAngle =\n Math.PI + Math.atan(-1 / ((this.scaled.y2 - this.scaled.y1) / (this.scaled.x2 - this.scaled.x1)))\n\n const sign = this.scaled.y1 > this.scaled.y2 ? 1 : -1\n const radiusX = this.scaled.width / 2\n let radiusY = (sign * Math.abs(this.scaled.y1 - this.scaled.y2)) / Math.cos(rotationAngle) / 2\n if (this.scaled.y1 === this.scaled.y2) {\n radiusY = Math.abs(this.scaled.x1 - this.scaled.x2) / 2\n }\n\n const width_two_thirds = (radiusX * 4) / 3\n\n const dx1 = Math.sin(rotationAngle) * radiusY\n const dy1 = Math.cos(rotationAngle) * radiusY\n const dx2 = Math.cos(rotationAngle) * width_two_thirds\n const dy2 = Math.sin(rotationAngle) * width_two_thirds\n\n const x = this.scaled.x1 + dx1\n const y = this.scaled.y1 - dy1\n\n const topCenterX = x - dx1\n const topCenterY = y + dy1\n const topRightX = topCenterX + dx2\n const topRightY = topCenterY + dy2\n const topLeftX = topCenterX - dx2\n const topLeftY = topCenterY - dy2\n\n const bottomCenterX = x + dx1\n const bottomCenterY = y - dy1\n const bottomRightX = bottomCenterX + dx2\n const bottomRightY = bottomCenterY + dy2\n const bottomLeftX = bottomCenterX - dx2\n const bottomLeftY = bottomCenterY - dy2\n\n const centerRightX = x + dx2\n const centerRightY = y + dy2\n const centerLeftX = x - dx2\n const centerLeftY = y - dy2\n\n return {\n topCenterX,\n topCenterY,\n topRightX,\n topRightY,\n topLeftX,\n topLeftY,\n centerLeftX,\n centerLeftY,\n centerRightX,\n centerRightY,\n bottomCenterX,\n bottomCenterY,\n bottomLeftX,\n bottomLeftY,\n bottomRightX,\n bottomRightY,\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const c = this.getCoordinates()\n const left = Math.min(this.scaled.x1, this.scaled.x2, c.centerRightX)\n const right = Math.max(this.scaled.x1, this.scaled.x2, c.centerLeftX)\n const top = Math.min(this.scaled.y1, this.scaled.y2, c.centerRightY)\n const bottom = Math.max(this.scaled.y1, this.scaled.y2, c.centerLeftY)\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nEllipse.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default Ellipse\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\ntype RotatedRectangleCoordiantes = [[number, number], [number, number], [number, number], [number, number]]\n\nexport interface IRotatedRectangleAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n height: number\n fill: string\n border: DrawingBorder\n}\n\n// OLD RotatedRectangle \"v0\" kept for backward-compatibiluty for old saved ideas\n// current RotatedRectangle tool located in rotated_rectangle folder\nclass RotatedRectangle extends Element {\n static type = CanvasElementType.rotatedRectangle\n\n name = 'Rotated rectangle'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n const x = this.model.scale.x.invert\n const y = this.model.scale.y.invert\n this._thumbs = [\n new Thumb(\n 'ml',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'mr',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'tl',\n () => x(this.getRectCoordinates()[0][0]),\n () => y(this.getRectCoordinates()[0][1]),\n this.resize,\n this.model\n ),\n new Thumb(\n 'tr',\n () => x(this.getRectCoordinates()[1][0]),\n () => y(this.getRectCoordinates()[1][1]),\n this.resize,\n this.model\n ),\n new Thumb(\n 'bl',\n () => x(this.getRectCoordinates()[2][0]),\n () => y(this.getRectCoordinates()[2][1]),\n this.resize,\n this.model\n ),\n new Thumb(\n 'br',\n () => x(this.getRectCoordinates()[3][0]),\n () => y(this.getRectCoordinates()[3][1]),\n this.resize,\n this.model\n ),\n ]\n const boundingPointKeys = this.getBoundingPointKeys()\n this.scale({ x: [...boundingPointKeys.x, 'height'], y: boundingPointKeys.y })\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n context.set('fillStyle', this.attrs.fill)\n\n context.beginPath()\n const coords = this.getRectCoordinates()\n for (const point of coords) {\n context.lineTo(point[0], point[1])\n }\n context.lineTo(coords[0][0], coords[0][1])\n context.fill()\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getRectCoordinates(): RotatedRectangleCoordiantes {\n const mx1 = this.scaled.x1\n const mx2 = this.scaled.x2\n const my1 = this.scaled.y1\n const my2 = this.scaled.y2\n const { height } = this.scaled\n\n const k = (my2 - my1) / (mx2 - mx1)\n const nk = -1 / k\n\n const sign = my1 > my2 ? 1 : -1\n const dx = (sign * Math.sqrt((height * height) / (1 + nk * nk))) / 2\n const dy = nk * dx\n\n let x1 = mx1 - dx\n let y1 = my1 - dy\n let x2 = mx2 - dx\n let y2 = my2 - dy\n\n let x3 = mx2 + dx\n let y3 = my2 + dy\n let x4 = mx1 + dx\n let y4 = my1 + dy\n\n if (my1 === my2) {\n x1 = mx1\n y1 = my1 - height / 2\n x2 = mx2\n y2 = my2 - height / 2\n\n x3 = mx2\n y3 = my2 + height / 2\n x4 = mx1\n y4 = my1 + height / 2\n }\n\n return [\n [x1, y1],\n [x2, y2],\n [x3, y3],\n [x4, y4],\n ]\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'ml':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'mr':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'tl':\n case 'tr':\n this.attrs.height += difY\n break\n case 'bl':\n case 'br':\n this.attrs.height -= difY\n break\n default:\n return\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const coords = this.getRectCoordinates()\n const polygon = coords.map((c) => ({ x: c[0], y: c[1] }))\n if (math.pointInPolygon(area.scaled, polygon)) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nRotatedRectangle.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default RotatedRectangle\n","// TODO FontAwesome font or similar needs to be loaded before using Symbol\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface ISymbolAttrs {\n x1: number\n scaleX: number\n y1: number\n scaleY: number\n angle: number\n fill: string\n symbol: string\n border: DrawingBorder\n}\n\nclass SymbolElement extends Element {\n static type = CanvasElementType.symbol\n\n name = 'Symbol'\n\n declare textWidth: number\n declare textHeight: number\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.resize = this.resize.bind(this)\n\n const sx = (sign: number) =>\n this.getRotatedCoordinates(this.scaled.x1 + sign * (this.textWidth / 2) * this.attrs.scaleX, this.scaled.y1)\n const sy = (sign: number) =>\n this.getRotatedCoordinates(this.scaled.x1, this.scaled.y1 + sign * (this.textHeight / 2) * this.attrs.scaleY)\n this._thumbs = [\n new Thumb(\n 'xr',\n () => this.model.scale.x.invert(sx(+1).x),\n () => this.model.scale.y.invert(sx(+1).y),\n this.resize,\n this.model\n ),\n new Thumb(\n 'xl',\n () => this.model.scale.x.invert(sx(-1).x),\n () => this.model.scale.y.invert(sx(-1).y),\n this.resize,\n this.model\n ),\n new Thumb(\n 'yt',\n () => this.model.scale.x.invert(sy(+1).x),\n () => this.model.scale.y.invert(sy(+1).y),\n this.resize,\n this.model\n ),\n new Thumb(\n 'yb',\n () => this.model.scale.x.invert(sy(-1).x),\n () => this.model.scale.y.invert(sy(-1).y),\n this.resize,\n this.model\n ),\n new Thumb(\n 'c',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n this.attrs.angle = this.attrs.angle || 0\n }\n\n getBoundingPointKeys = () => ({ x: ['x1'], y: ['y1'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n context.set('font', '36px FontAwesome')\n context.set('fillStyle', this.attrs.fill)\n context.set('textAlign', 'left')\n context.set('textBaseline', 'top')\n\n this.textWidth = context.measureText(this.attrs.symbol).width\n this.textHeight = 36\n const xScale = this.attrs.scaleX\n const yScale = this.attrs.scaleY\n\n const xOffset = this.textWidth / -2\n const yOffset = this.textHeight / -2\n\n context.save()\n context.translate(this.scaled.x1, this.scaled.y1)\n context.rotate(this.attrs.angle)\n context.scale(xScale, yScale)\n context.fillText(this.attrs.symbol, xOffset, yOffset)\n context.restore()\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getRotatedCoordinates(x: number, y: number) {\n const cx = this.scaled.x1\n const cy = this.scaled.y1\n const dx = x - cx\n const dy = y - cy\n const rx = dx * Math.cos(this.attrs.angle) - dy * Math.sin(this.attrs.angle)\n const ry = dy * Math.cos(this.attrs.angle) + dx * Math.sin(this.attrs.angle)\n return { x: cx + rx, y: cy + ry }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n return (this.attrs.y1 += y)\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'xl':\n this.attrs.scaleX -= difX\n break\n case 'xr':\n this.attrs.scaleX += difX\n break\n case 'yt':\n this.attrs.scaleY -= difY\n break\n case 'yb':\n this.attrs.scaleY += difY\n break\n case 'c':\n this.attrs.angle += difX / 5\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const halfWidth = (this.textWidth / 2) * this.attrs.scaleX\n const halfHeight = (this.textHeight / 2) * this.attrs.scaleY\n const left = Math.min(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\n const right = Math.max(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\n const top = Math.min(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\n const bottom = Math.max(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nSymbolElement.prototype.defaults = { fill: 'rgba(0,0,0,1)' }\n\nSymbolElement.prototype.modalConfig = {\n inputs: [{ type: 'background', name: 'fill', label: 'Fill' }],\n}\n\nexport default SymbolElement\n","import { CanvasElementType } from '../constants/common'\nimport arrow from './arrow'\nimport brush_v1 from './brush/brush_v1'\nimport callout_v1 from './callout/callout_v1'\nimport curve from './curve'\nimport element from './element'\nimport elliottWaves from './elliott_waves/elliott_waves'\nimport ellipse from './ellipse'\nimport ellipse_v1 from './ellipse/ellipse_v1'\nimport fibonacci from './fibonacci_retracements'\nimport horizontalLine from './horizontal_line'\nimport line from './line'\nimport measure from './measure'\nimport pitchfork_v1 from './pitchfork/pitchfork_v1'\nimport polygon from './polygon'\nimport position from './position'\nimport rectangle from './rectangle'\nimport rotatedRectangle from './rotated_rectangle'\nimport rotatedRectangle_v1 from './rotated_rectangle/rotated_rectangle_v1'\nimport scaledLine from './scaled_line'\nimport scaledText from './scaled_text'\nimport symbolElement from './symbol'\nimport text from './text'\nimport triangle from './triangle'\nimport verticalLine from './vertical_line'\nimport xabcd from './xabcd'\n\nexport const drawingToolsByType = Object.freeze({\n [CanvasElementType.element]: element,\n [CanvasElementType.arrow]: arrow,\n [CanvasElementType.brushV1]: brush_v1,\n [CanvasElementType.calloutV1]: callout_v1,\n [CanvasElementType.curve]: curve,\n [CanvasElementType.elliottWaves]: elliottWaves,\n [CanvasElementType.ellipse]: ellipse,\n [CanvasElementType.ellipseV1]: ellipse_v1,\n [CanvasElementType.fibonacciRetracements]: fibonacci,\n [CanvasElementType.horizontalLine]: horizontalLine,\n [CanvasElementType.line]: line,\n [CanvasElementType.measure]: measure,\n [CanvasElementType.pitchforkV1]: pitchfork_v1,\n [CanvasElementType.polygon]: polygon,\n [CanvasElementType.position]: position,\n [CanvasElementType.rectangle]: rectangle,\n [CanvasElementType.rotatedRectangle]: rotatedRectangle,\n [CanvasElementType.rotatedRectangleV1]: rotatedRectangle_v1,\n [CanvasElementType.scaledLine]: scaledLine,\n [CanvasElementType.scaledText]: scaledText,\n [CanvasElementType.symbol]: symbolElement,\n [CanvasElementType.text]: text,\n [CanvasElementType.triangle]: triangle,\n [CanvasElementType.verticalLine]: verticalLine,\n [CanvasElementType.xabcd]: xabcd,\n})\n","import Spine from '@finviz/spine'\nimport merge from 'lodash.merge'\nimport mergewith from 'lodash.mergewith'\nimport omit from 'lodash.omit'\n\nimport {\n ChartConfigChartPaneElement,\n ObjectHash,\n PaneArea,\n RequireByKey,\n TodoObjectHashAnyType,\n} from '../../types/shared'\nimport Thumb from '../canvas/thumb'\nimport {\n CanvasElementType,\n ChartElementType,\n ChartEventType,\n IVisibility,\n IndicatorType,\n MacroTimeframe,\n MicroMacroTimeframe,\n OverlayType,\n SetVisibilityTo,\n TIMEFRAME,\n} from '../constants/common'\nimport Chart from '../models/chart'\nimport PaneModel, { ScaleAxis } from '../models/pane'\nimport Quote from '../models/quote'\nimport { getChartLayoutSettings } from '../models/settings'\nimport { isInRange } from '../utils/helpers'\n\nexport type TodoModalConfig = TodoObjectHashAnyType\ntype TodoPositionTimestamps = TodoObjectHashAnyType\n\nexport interface DefaultAttrs extends ObjectHash {\n positionTimestamps?: TodoPositionTimestamps\n visibility?: IVisibility\n}\n\nclass Element extends Spine.Module {\n static type: CanvasElementType | OverlayType | ChartElementType | IndicatorType | ChartEventType =\n CanvasElementType.element\n\n static fromObject(obj: T['attrs'], model: T['model']) {\n return new this(obj, model) as T\n }\n\n static getNumOfBarsBuffer(\n _?: RequireByKey | RequireByKey\n ) {\n return 0\n }\n\n isCreator = false\n isCreatorDialogOpen = false\n attrs: Attrs = {} as Attrs\n\n model: any\n _thumbs: Thumb[]\n\n getDefaults?(): Partial\n renderCross?(ctx: RenderingContext2DType): void\n renderCrossText?(\n ctx: RenderingContext2DType,\n crossIndex: number,\n getDataByCrossIndex?: (key: keyof Quote, shouldReturnRoundedString?: boolean) => string | undefined\n ): void\n\n renderContent?(ctx: RenderingContext2DType): void\n renderGrid?(ctx: RenderingContext2DType): void\n renderLabels?(ctx: RenderingContext2DType): void\n declare defaults?: Partial\n getModalConfigBase?(): TodoModalConfig\n declare modalConfig?: TodoModalConfig\n getMinMax?(): { min: number; max: number }\n setupAxis?(fx: ScaleAxis): void | { min: number; max: number }\n\n activeThumb: Thumb | null = null\n isMouseDown = false\n isSelected = false\n isHovered = false\n isEditInProgress = false\n declare scaled?: ObjectHash | Partial\n\n declare toolsCallback: () => void\n\n constructor(values: Partial, model: Model) {\n super(values, model)\n this.model = model\n if (this.getDefaults) {\n this.set(this.getDefaults() || {})\n } else {\n this.set(this.defaults || {})\n }\n this.set(values)\n this._thumbs = []\n\n this.onMouseDown = this.onMouseDown.bind(this)\n this.onMouseMove = this.onMouseMove.bind(this)\n this.onMouseUp = this.onMouseUp.bind(this)\n this.bind('mousedown', this.onMouseDown)\n this.bind('mousemove', this.onMouseMove)\n this.bind('mouseup', this.onMouseUp)\n this.bind('change', () => {\n // elements is optional because this.model is not Pane in all usecases, e.g. base_chart extends this element and sets Chart as model\n const element = this.getIsChartEvent()\n ? this.model.chartEvents?.()?.findByAttribute('instance', this)\n : this.model.elements?.()?.findByAttribute('instance', this)\n\n element?.trigger('change', element)\n })\n }\n\n get type() {\n return (this.constructor as typeof Element).type\n }\n\n getThumbs() {\n return this._thumbs\n }\n\n moveBy(_: number, __: number) {}\n\n setIsSelected(isSelected: boolean) {\n this.isSelected = isSelected\n this.trigger('change')\n }\n\n setIsHovered(isHovered: boolean) {\n this.isHovered = isHovered\n this.trigger('change')\n }\n\n getShouldRenderThumbs() {\n return this.isSelected || this.isHovered\n }\n\n getIsPaneSelection(): boolean {\n const paneModel = this.model.elements().findByAttribute('instance', this)?.pane() as PaneModel | undefined\n return paneModel?.selection === this\n }\n\n set(obj: Partial) {\n const attrsSubset = Object.keys(obj).reduce(\n (acc, key) => ({ ...acc, [key]: this.attrs[key] }),\n {} as Partial\n )\n if (JSON.stringify(obj) !== JSON.stringify(attrsSubset)) {\n const customizer = (objValue: Partial, srcValue: Partial, key: keyof Attrs) => {\n if (this.getIsDrawing() && key === 'visibility') {\n return srcValue ?? {}\n }\n }\n mergewith(this.attrs, obj, customizer)\n if (this.getIsPaneSelection() && !this.getIsCreator()) {\n this.cachePointPositionTimestamp()\n }\n this.trigger('change', this)\n }\n return this\n }\n\n get(key: T) {\n return this.attrs[key]\n }\n\n getBoundingPointKeys = (): { x: string[]; y: string[] } | void => {}\n\n fx = (x: number) => this.model.scale.x(x)\n\n fy = (y: number) => this.model.scale.y(y)\n\n scale({ x, y }: { x: string[]; y: string[] }) {\n this.scaled = {}\n x.forEach((el) => {\n Object.defineProperty(this.scaled, el, {\n get: () => this.fx(this.attrs[el]),\n })\n })\n\n y.forEach((el) => {\n Object.defineProperty(this.scaled, el, {\n get: () => this.fy(this.attrs[el]),\n })\n })\n }\n\n render(_: RenderingContext2DType) {}\n\n renderThumbs(context: CanvasRenderingContext2D) {\n const isHoveredThumbStyle = this.isHovered && !this.isSelected\n if (isHoveredThumbStyle) {\n context.globalAlpha = 0.5\n }\n this.getThumbs().map((thumb) => thumb.render(context))\n context.globalAlpha = 1\n }\n\n onMouseDown(area: PaneArea) {\n this.isMouseDown = true\n this.isEditInProgress = true\n for (const thumb of this.getThumbs()) {\n if (thumb.isInArea(area)) {\n this.activeThumb = thumb\n this.activeThumb.startEditing(area)\n return\n }\n }\n }\n\n onMouseMove(area: PaneArea) {\n if (!area.mouseDown) {\n return\n }\n if (this.activeThumb != null) {\n this.activeThumb.moveTo(area)\n this.trigger('change')\n }\n }\n\n onMouseUp(_?: PaneArea) {\n this.isMouseDown = false\n this.isEditInProgress = false\n this.activeThumb = null\n if (!this.getIsCreator() && !this.getIsChartEvent()) {\n this.cachePointPositionTimestamp()\n }\n this.trigger('change', this)\n }\n\n cachePointPositionTimestamp = () => {\n const quote = this.model?.chart().quote()\n if (quote) {\n const { x: xPointKeys } = this.getBoundingPointKeys()!\n const positionTimestamps = xPointKeys.reduce((acc, key) => {\n const positionX = this.attrs[key]\n const timeStamp = positionX && quote.getTimestampFomPositionX(positionX)\n return {\n ...acc,\n [key]: timeStamp,\n }\n }, {}) as TodoPositionTimestamps\n this.set({ positionTimestamps } as Partial)\n }\n }\n\n updateScales() {\n const quote = this.model.chart().quote()\n const { positionTimestamps } = this.attrs\n if (!quote || !positionTimestamps) {\n // positionTimestamps check is temporary to prevent app from crashing\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\n return\n }\n const pointPoitionsFromTimestamp = Object.entries(positionTimestamps).reduce(\n (acc, [key, timestamp]) => ({\n ...acc,\n [key]: timestamp && quote.getPositionXFromTimestamp(timestamp),\n }),\n {}\n )\n this.set(pointPoitionsFromTimestamp)\n }\n\n thumbsAreInArea(area: PaneArea) {\n for (const thumb of this.getThumbs()) {\n if (thumb.isInArea(area)) {\n return true\n }\n }\n return false\n }\n\n isInArea(area: PaneArea) {\n return this.thumbsAreInArea(area)\n }\n\n isDrawingElementLockedOrInvisible() {\n return this.model.chart().chart_layout().isLockDrawingsActive || !this.getIsVisible()\n }\n\n getModalConfig() {\n let config\n if (this.getModalConfigBase) {\n config = merge({}, this.getModalConfigBase())\n } else {\n config = merge({}, this.modalConfig)\n }\n if (this.getIsDrawing()) {\n config.inputs.push({ type: 'visibility', name: 'visibility', label: 'Visibility' })\n }\n if (config.title == null) {\n config.title = this.name\n }\n for (const input of config.inputs) {\n if (input.default != null) {\n input.value = input.default\n }\n if (this.attrs[input.name] != null) {\n input.value = this.attrs[input.name]\n }\n }\n return config\n }\n\n toObject() {\n return merge({}, this.attrs, { type: this.type })\n }\n\n toConfig(): T['attrs'] & { type: T['type'] } {\n return this.toObject()\n }\n\n getAutosaveOmittedProperties() {\n return this.attrs.positionTimestamps ? Object.keys(this.attrs.positionTimestamps) : []\n }\n\n toAutosaveConfig() {\n // We don't want to save attrs which are stored in \"position timestamps\" because they are relative to timeframe for example\n // so in order to keep drawings in sync across different timeframes we can't rely on its position but we have to rely on \"position timestamps\" and then call updateScales to calculate correct positions for given timeframe\n return omit(this.toConfig(), this.getAutosaveOmittedProperties()) as Partial\n }\n\n replaceMyself(element: Element) {\n setTimeout(() => {\n element.cachePointPositionTimestamp()\n const el = this.model.elements().findByAttribute('instance', this)\n if (!el) {\n // Temporary code below\n // additional info gaining for https://finvizcom.sentry.io/issues/3990343438/events/e87ce8b4108341cf81f15ec78707c65e/?project=33153&query=is%3Aunresolved+Cannot+read+properties+of+undefined&referrer=previous-event&statsPeriod=14d&stream_index=0\n window.Sentry?.captureMessage('element.ts replaceMyself', {\n extra: {\n oldElement: {\n type: this?.type,\n isCreator: this?.isCreator,\n isMouseDown: this?.isMouseDown,\n isSelected: this?.isSelected,\n isHovered: this?.isHovered,\n isEditInProgress: this?.isEditInProgress,\n },\n newElement: {\n type: element?.type,\n isCreator: element?.isCreator,\n isMouseDown: element?.isMouseDown,\n isSelected: element?.isSelected,\n isHovered: element?.isHovered,\n isEditInProgress: element?.isEditInProgress,\n },\n },\n })\n } else {\n el.replace(element)\n }\n })\n }\n\n toString() {\n return this.name\n }\n\n getIsCreator() {\n return this.isCreator\n }\n\n getIsCreatorDialogOpen() {\n return this.isCreatorDialogOpen\n }\n\n release() {\n this.cachePointPositionTimestamp()\n this.unbind()\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.model.chart().chart_layout())\n }\n\n getIsDrawing() {\n return !!this.type.startsWith('canvas/')\n }\n\n getIsChartEvent() {\n return !!this?.type.startsWith('chartEvent/')\n }\n\n getIsVisible() {\n const { micro, macro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\n const visibility = this.attrs.visibility?.[macro]\n\n // this.attrs.visibility.minutes === undefined: drawing visible on any minutes timeframe\n if (visibility === undefined) return true\n // this.attrs.visibility.minutes === {}: drawing invisible on any minutes timeframe\n if (Object.keys(visibility).length === 0) return false\n // this.attrs.visibility.minutes === {from: 5, to: 15}: drawing visible on minutes TF between 5 & 15 interval\n return isInRange({ value: micro, min: visibility.from, max: visibility.to })\n }\n\n setVisibilityTo(setTo: SetVisibilityTo) {\n const { macro, micro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\n const currentIndex = Object.keys(MacroTimeframe).indexOf(macro)\n\n let timeframesToSet: string[] = []\n let attrsToSet: { from?: number; to?: number } = {}\n\n switch (setTo) {\n case SetVisibilityTo.currentAndAbove: {\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index < currentIndex)\n attrsToSet = { from: micro }\n break\n }\n case SetVisibilityTo.currentAndBelow: {\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index > currentIndex)\n attrsToSet = { to: micro }\n break\n }\n case SetVisibilityTo.currentOnly: {\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index !== currentIndex)\n attrsToSet = { from: micro, to: micro }\n break\n }\n case SetVisibilityTo.all:\n default: {\n this.set({ visibility: {} } as Partial)\n return\n }\n }\n\n this.set({\n visibility: Object.assign({}, ...timeframesToSet.map((item) => ({ [item]: {} })), { [macro]: attrsToSet }),\n } as Partial)\n }\n\n getIsInChartView(_: Chart) {\n return true\n }\n}\n\nexport default Element\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\nimport { CanvasElementType, TextAlign, TextBaseline } from '../../constants/common'\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport Element from '../element'\nimport Text from '../text'\nimport Thumb from '../thumb'\n\nexport interface IElliottWavesAttrs {\n waves: Array<{ x: number; y: number }>\n positionWavesTimestamps?: Array<{ x: number; y: number }>\n border: DrawingBorder\n}\n\nclass ElliottWaves extends Element {\n static type = CanvasElementType.elliottWaves\n\n name = 'Elliott Wave'\n waves = ['', 'I', 'II', 'III', 'IV', 'V']\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n }\n\n getDefaults() {\n return {\n border: {\n width: 2,\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\n },\n } as Partial\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n context.translate(offset, offset)\n context.beginPath()\n context.moveTo(Math.round(this.fx(this.attrs.waves[0].x)), Math.round(this.fy(this.attrs.waves[0].y)))\n for (const p of this.attrs.waves.slice(1)) {\n context.lineTo(Math.round(this.fx(p.x)), Math.round(this.fy(p.y)))\n }\n context.stroke()\n context.translate(offset * -1, offset * -1)\n\n const text = new Text(\n {\n font: { size: 8, style: 'bold' },\n textBaseline: TextBaseline.middle,\n textAlign: TextAlign.center,\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n },\n this.model\n )\n for (let i = 0; i < this.attrs.waves.length; i++) {\n let y\n const p = this.attrs.waves[i]\n if (i > 0 && this.attrs.waves[i - 1].y > p.y) {\n y = this.fy(p.y) + 8\n } else {\n y = this.fy(p.y) - 8\n }\n text.set({ text: this.waves[i], x: this.fx(p.x), y })\n text.render(context)\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getThumbs() {\n return this.attrs.waves.map(\n (wave, index) =>\n new Thumb(\n `${index}`,\n () => wave.x,\n () => wave.y,\n this.resize,\n this.model\n )\n )\n }\n\n cachePointPositionTimestamp = () => {\n const quote = this.model?.chart().quote()\n if (quote) {\n const positionWavesTimestamps = this.attrs.waves.map((wave) => ({\n ...wave,\n x: quote.getTimestampFomPositionX(wave.x),\n }))\n\n this.set({ positionWavesTimestamps } as Partial)\n }\n }\n\n updateScales() {\n const quote = this.model.chart().quote()\n const { positionWavesTimestamps } = this.attrs\n if (!quote || !positionWavesTimestamps) {\n // positionWavesTimestamps check is temporary to prevent app from crashing\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\n return\n }\n const waves = positionWavesTimestamps.map((wave) => ({\n ...wave,\n x: quote.getPositionXFromTimestamp(wave.x),\n }))\n this.set({ waves } as Partial)\n }\n\n moveBy(x: number, y: number) {\n for (const point of this.attrs.waves) {\n point.x += x\n point.y += y\n }\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n this.attrs.waves[+type].x += difX\n this.attrs.waves[+type].y += difY\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const waves = this.attrs.waves\n for (let i = 0; i < waves.length - 1; i++) {\n if (\n math.distanceToSegment(area.scaled, {\n x1: this.fx(waves[i].x),\n y1: this.fy(waves[i].y),\n x2: this.fx(waves[i + 1].x),\n y2: this.fy(waves[i + 1].y),\n }) <= 10\n ) {\n return true\n }\n }\n return super.isInArea(area)\n }\n\n getAutosaveOmittedProperties() {\n return ['waves']\n }\n}\n\nElliottWaves.prototype.modalConfig = {\n inputs: [{ type: 'line', name: 'border' }],\n}\n\nexport default ElliottWaves\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\nimport { CanvasElementType } from '../../constants/common'\nimport math from '../../helpers/math'\nimport { getContextWithCache } from '../../lib/shims'\nimport PaneModel from '../../models/pane'\nimport Element from '../element'\nimport Thumb from '../thumb'\n\nexport interface IEllipseAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n cursorTargetX: number\n cursorTargetY: number\n\n fill: string\n border: DrawingBorder\n}\n\ninterface Coordinates {\n P1: Point\n P2: Point\n P3: Point\n P4: Point\n CP1: Point\n CP2: Point\n CP3: Point\n CP4: Point\n}\n\nclass EllipseV1 extends Element {\n static type = CanvasElementType.ellipseV1\n\n name = 'Ellipse'\n\n untranslatedContext: CanvasRenderingContext2D | null = null\n declare ellipsePath: Path2D\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\n this._thumbs = [\n new Thumb(\n 'left',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'right',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'top',\n () => this.getEllipsePoints(true).P2.x || this.attrs.x1,\n () => this.getEllipsePoints(true).P2.y || this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'bottom',\n () => this.getEllipsePoints(true).P4.x || this.attrs.x2,\n () => this.getEllipsePoints(true).P4.y || this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const coordinates = this.getEllipsePoints() as Coordinates\n const ellipse = new Path2D()\n context.set('fillStyle', this.attrs.fill)\n context.beginPath()\n if (coordinates.P2.x === coordinates.P3.x || coordinates.P2.y === coordinates.P3.y) {\n ellipse.lineTo(coordinates.P1.x, coordinates.P1.y)\n ellipse.lineTo(coordinates.P2.x, coordinates.P2.y)\n } else {\n ellipse.moveTo(coordinates.P4.x, coordinates.P4.y)\n ellipse.bezierCurveTo(\n coordinates.CP4.x,\n coordinates.CP4.y,\n coordinates.CP1.x,\n coordinates.CP1.y,\n coordinates.P2.x,\n coordinates.P2.y\n )\n ellipse.bezierCurveTo(\n coordinates.CP2.x,\n coordinates.CP2.y,\n coordinates.CP3.x,\n coordinates.CP3.y,\n coordinates.P4.x,\n coordinates.P4.y\n )\n ellipse.closePath()\n this.ellipsePath = ellipse\n context.fill(ellipse)\n }\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n context.stroke(ellipse)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getEllipsePoints(inverted = false) {\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\n\n const P1 = { x: x2, y: y2 }\n const P3 = { x: x1, y: y1 }\n\n let perpendicularPoint\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\n const cursor = { x: cursorTargetX, y: cursorTargetY }\n const line = { x1, y1, x2, y2 }\n const distance = math.distanceToLine(cursor, line)\n perpendicularPoint = math.perpendicularPointToLine({\n distance,\n line,\n })\n } else {\n return {\n P1: P3,\n P2: P1,\n P3: P1,\n P4: P3,\n }\n }\n\n const lineCenterX = (P1.x + P3.x) / 2\n const lineCenterY = (P1.y + P3.y) / 2\n const pointOffsetX = perpendicularPoint.x - P1.x\n const pointOffsetY = perpendicularPoint.y - P1.y\n\n const P2 = { x: lineCenterX + pointOffsetX, y: lineCenterY + pointOffsetY }\n const P4 = { x: lineCenterX + -1 * pointOffsetX, y: lineCenterY + -1 * pointOffsetY }\n const invertX = this.model.scale.x.invert\n const invertY = this.model.scale.y.invert\n if (inverted) {\n return {\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\n }\n }\n\n const perpendicularPointEllipseOffsetX = (perpendicularPoint.x - P2.x) / 0.75 - (perpendicularPoint.x - P2.x)\n const perpendicularPointEllipseOffsetY = (perpendicularPoint.y - P2.y) / 0.75 - (perpendicularPoint.y - P2.y)\n\n const P1WithOffsetX = P1.x + perpendicularPointEllipseOffsetX\n const P1WithOffsetY = P1.y + perpendicularPointEllipseOffsetY\n\n const P3WithOffsetX = P3.x - perpendicularPointEllipseOffsetX\n const P3WithOffsetY = P3.y - perpendicularPointEllipseOffsetY\n\n const CP1 = {\n x: perpendicularPoint.x + perpendicularPointEllipseOffsetX,\n y: perpendicularPoint.y + perpendicularPointEllipseOffsetY,\n }\n const controlPointOffsetX = CP1.x - P1WithOffsetX\n const controlPointOffsetY = CP1.y - P1WithOffsetY\n\n const CP2 = { x: P3WithOffsetX + controlPointOffsetX, y: P3WithOffsetY + controlPointOffsetY }\n const CP3 = { x: P3WithOffsetX + -1 * controlPointOffsetX, y: P3WithOffsetY + -1 * controlPointOffsetY }\n const CP4 = { x: P1WithOffsetX + -1 * controlPointOffsetX, y: P1WithOffsetY + -1 * controlPointOffsetY }\n\n return {\n P1,\n P2,\n P3,\n P4,\n CP1,\n CP2,\n CP3,\n CP4,\n }\n }\n\n getRotatedPointCoordinates = ({\n rotationAxisPoint,\n pointToRotate,\n oldLinePoint,\n newLinePoint,\n }: {\n rotationAxisPoint: { x: number; y: number }\n pointToRotate: { x: number; y: number }\n oldLinePoint: { x: number; y: number }\n newLinePoint: { x: number; y: number }\n }) => {\n const angle = math.sharedPointLinesAngle({\n sharedPoint: rotationAxisPoint,\n oldLinePoint,\n newLinePoint,\n })\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\n rotationAxisPoint,\n angle,\n pointToRotate,\n })\n return {\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n this.attrs.cursorTargetX += x\n this.attrs.cursorTargetY += y\n }\n\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'left':\n const newLeftPoint = {\n x: this.attrs.x1 + difX,\n y: this.attrs.y1 + difY,\n }\n const leftRotatedCursorPoint = this.getRotatedPointCoordinates({\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\n pointToRotate: {\n x: this.scaled.cursorTargetX,\n y: this.scaled.cursorTargetY,\n },\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\n newLinePoint: { x: this.model.scale.x(newLeftPoint.x), y: this.model.scale.y(newLeftPoint.y) },\n })\n this.attrs = {\n ...this.attrs,\n x1: newLeftPoint.x,\n y1: newLeftPoint.y,\n cursorTargetX: leftRotatedCursorPoint.x,\n cursorTargetY: leftRotatedCursorPoint.y,\n }\n break\n case 'right':\n const newRightPoint = {\n x: this.attrs.x2 + difX,\n y: this.attrs.y2 + difY,\n }\n const rightRotatedCursorPoint = this.getRotatedPointCoordinates({\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\n pointToRotate: {\n x: this.scaled.cursorTargetX,\n y: this.scaled.cursorTargetY,\n },\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\n newLinePoint: { x: this.model.scale.x(newRightPoint.x), y: this.model.scale.y(newRightPoint.y) },\n })\n this.attrs = {\n ...this.attrs,\n x2: newRightPoint.x,\n y2: newRightPoint.y,\n cursorTargetX: rightRotatedCursorPoint.x,\n cursorTargetY: rightRotatedCursorPoint.y,\n }\n break\n case 'top':\n case 'bottom':\n this.attrs = {\n ...this.attrs,\n cursorTargetX: area.x,\n cursorTargetY: area.y,\n }\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (this.ellipsePath && this.untranslatedContext?.isPointInPath(this.ellipsePath, area.scaled.x, area.scaled.y)) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nEllipseV1.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default EllipseV1\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Text, { ITextAttrs } from './text'\nimport Thumb from './thumb'\n\ntype Coefficients = string\n\nexport interface IFibonacciRetracementsAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n coefficients: Coefficients\n border: DrawingBorder\n}\n\nclass FibonacciRetracements<\n Attrs extends IFibonacciRetracementsAttrs = IFibonacciRetracementsAttrs,\n> extends Element {\n static type = CanvasElementType.fibonacciRetracements\n\n name = 'Fibonacci Retracements'\n declare coefficients: { default: string; parsed: number[]; max: number }\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'oneCoefficient_1',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'oneCoefficient_2',\n () => this.attrs.x2,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'zeroCoefficient_1',\n () => this.attrs.x1,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'zeroCoefficient_2',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.parseCoefficients(this.attrs.coefficients)\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n border: {\n width: 1,\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\n },\n coefficients: [0, 0.236, 0.382, 0.5, 0.618, 1].toString(),\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n parseCoefficients(coefficients: Coefficients) {\n if (!this.coefficients || coefficients !== this.coefficients.default) {\n const parsed = coefficients.split(',').map((x) => parseFloat(x.trim()))\n this.coefficients = { default: coefficients, parsed, max: Math.max(...parsed) }\n }\n }\n\n getMaxCoefficientUnscaledY() {\n return this.model.scale.y.invert(this.scaled.y2 - this.coefficients.max * (this.scaled.y2 - this.scaled.y1))\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY, y2: roundedXY.y1 })\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n this.parseCoefficients(this.attrs.coefficients)\n\n const height = this.attrs.y2 - this.attrs.y1\n const heightScaled = roundedXY.y2 - roundedXY.y1\n\n context.translate(translateXY.x, translateXY.y)\n context.beginPath()\n for (const p of this.coefficients.parsed) {\n context.moveTo(roundedXY.x1, Math.round(y2 - p * heightScaled))\n context.lineTo(roundedXY.x2, Math.round(y2 - p * heightScaled))\n }\n context.stroke()\n context.translate(translateXY.x * -1, translateXY.y * -1)\n\n const text = new Text(\n {\n x: roundedXY.x1,\n font: { size: 8, style: 'bold' },\n textBaseline: TextBaseline.bottom,\n fillStyle: this.attrs.border.color,\n textAlign: TextAlign.left,\n },\n this.model\n )\n if (roundedXY.x1 > roundedXY.x2) {\n text.set({ textAlign: TextAlign.right })\n }\n\n for (const p of this.coefficients.parsed) {\n const y = this.attrs.y2 - p * height\n text.set({\n text: (p * 100).toFixed(1) + '%: ' + y.toFixed(2),\n y: Math.round(this.fy(y) - this.attrs.border.width / 2),\n } as Partial)\n text.render(context)\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getThumbs() {\n if (this.coefficients.max > 1 && this._thumbs.length < 6) {\n this._thumbs = [\n ...this._thumbs,\n new Thumb(\n 'maxCoefficient_1',\n () => this.attrs.x1,\n () => this.getMaxCoefficientUnscaledY(),\n this.resize,\n this.model\n ),\n new Thumb(\n 'maxCoefficient_2',\n () => this.attrs.x2,\n () => this.getMaxCoefficientUnscaledY(),\n this.resize,\n this.model\n ),\n ]\n }\n if (this.coefficients.max <= 1 && this._thumbs.length > 4) {\n this._thumbs.splice(4)\n }\n\n return this._thumbs\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.y1 += y\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'oneCoefficient_1':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'oneCoefficient_2':\n this.attrs.x2 += difX\n this.attrs.y1 += difY\n break\n case 'zeroCoefficient_1':\n this.attrs.x1 += difX\n this.attrs.y2 += difY\n break\n case 'zeroCoefficient_2':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'maxCoefficient_1':\n this.attrs.x1 += difX\n this.attrs.y1 += difY / this.coefficients.max\n break\n case 'maxCoefficient_2':\n this.attrs.x2 += difX\n this.attrs.y1 += difY / this.coefficients.max\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const maxCoefficientY = this.coefficients.max > 1 && this.getMaxCoefficientUnscaledY()\n const left = Math.min(this.attrs.x1, this.attrs.x2)\n const right = Math.max(this.attrs.x1, this.attrs.x2)\n const top = maxCoefficientY\n ? Math.min(this.attrs.y1, this.attrs.y2, maxCoefficientY)\n : Math.min(this.attrs.y1, this.attrs.y2)\n const bottom = maxCoefficientY\n ? Math.max(this.attrs.y1, this.attrs.y2, maxCoefficientY)\n : Math.max(this.attrs.y1, this.attrs.y2)\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nFibonacciRetracements.prototype.modalConfig = {\n inputs: [\n { type: 'line', name: 'border' },\n { type: 'string', name: 'coefficients', label: 'Coefficients' },\n ],\n}\n\nexport default FibonacciRetracements\n","import { Maybe, RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\nimport { CanvasElementType, TextBaseline } from '../constants/common'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\nimport Text from './text'\n\nconst DEFAULT_DECIMAL_PLACES = 2\n\nclass HorizontalLine extends ScaledLine {\n static type = CanvasElementType.horizontalLine\n\n name = 'Horizontal line'\n decimalPlaces = DEFAULT_DECIMAL_PLACES\n declare scaled: Pick\n declare model: PaneModel\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.updateDecimalPlaces()\n\n if (this.attrs.y1) {\n this.attrs.y1 = Number(math.round({ value: this.attrs.y1, overridePlaces: this.decimalPlaces }))\n }\n if (this.modalConfig) {\n const step = `0.${'0'.repeat(this.decimalPlaces - 1)}1`\n this.modalConfig.inputs[1] = {\n ...this.modalConfig.inputs[1],\n step,\n min: Number(step),\n }\n }\n this.renderContent = this.renderContent.bind(this)\n this._thumbs = []\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n updateDecimalPlaces() {\n const quote = this.model.chart().quote()\n this.decimalPlaces = quote\n ? math.getInstrumentDecimalPlaces({\n instrument: quote.instrument,\n value: quote.lastClose,\n })\n : DEFAULT_DECIMAL_PLACES\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n this.attrs.y2 = this.attrs.y1\n // mixing scaled and unscaled values, do not copy paste as solution\n this.attrs.x1 = ChartSettings.left.width * -1\n this.attrs.x2 =\n this.model\n .chart()\n .quote()\n .getBarIndex(this.model.chart().quote().close.length - 1) + this.model.chart().width\n super.renderContent(context)\n }\n\n renderLabels(context: CanvasRenderingContext2D) {\n if (this.attrs.y1) {\n this.updateDecimalPlaces()\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const isIndicatorPane = this.model\n .elements()\n .all()\n .some((element) => element.isIndicator())\n const settings = isIndicatorPane ? IndicatorSettings : ChartSettings\n context.translate(this.model.chart().width - settings.right.width, settings.top.height)\n new Text(\n {\n x: 6,\n y: this.scaled.y1,\n font: { size: 8, style: 'bold' },\n lineHeight: 8,\n padding: {\n top: 2,\n right: 2,\n bottom: 2,\n left: 2,\n },\n fillStyle: '#fff',\n background: '#000',\n textBaseline: TextBaseline.middle,\n text: this.attrs.y1.toFixed(this.decimalPlaces).toString(),\n },\n this.model\n ).render(context)\n }\n }\n\n moveBy(x: Maybe, y: number) {\n this.attrs.y1 += y\n }\n\n resize({ difY }: RequireByKey) {\n this.moveBy(0, difY)\n }\n}\n\nHorizontalLine.prototype.modalConfig = {\n inputs: [\n { type: 'line', name: 'border' },\n { type: 'number', name: 'y1', label: 'Price', allowDecimal: true },\n ],\n}\n\nexport default HorizontalLine\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\ninterface ILineAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n dashLength: number\n lineWidth: number\n strokeStyle: string\n}\n\nclass Line extends Element {\n static type = CanvasElementType.line\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.render = this.render.bind(this)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'l',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'r',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n }\n\n getDefaults() {\n return {\n lineWidth: 1,\n strokeStyle: this.getChartLayoutSettings().ElementSettings.Colors.line,\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n render(context: CanvasRenderingContext2D) {\n const { x1, y1, x2, y2, lineWidth } = this.attrs\n const roundedXY = getRoundedObject({ x1, y1, x2, y2 })\n const translateXY = getXYOffsetFromLine({ lineWidth, ...roundedXY })\n\n context.translate(translateXY.x, translateXY.y)\n context.beginPath()\n context.set('lineWidth', this.attrs.lineWidth)\n context.set('strokeStyle', this.attrs.strokeStyle)\n\n context.moveTo(roundedXY.x1, roundedXY.y1)\n if (this.attrs.dashLength) {\n context.setLineDash([this.attrs.dashLength])\n }\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.stroke()\n if (this.attrs.dashLength) {\n context.setLineDash([])\n }\n context.translate(translateXY.x * -1, translateXY.y * -1)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.y1 += y\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'l') {\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n } else {\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (math.distanceToSegment(area, this.attrs) <= 10) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nexport default Line\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType, TextBaseline } from '../constants/common'\nimport { getRoundedObject } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\nimport { numberToStringWithUnitsSuffix } from '../utils'\nimport { getRoundedString } from '../utils/helpers'\nimport Element from './element'\nimport Text, { ITextAttrs } from './text'\nimport Thumb from './thumb'\n\ninterface Coordinates {\n x1: number\n x2: number\n y1: number\n y2: number\n}\n\nexport interface IMeasureAttrs extends Coordinates {\n fill: string\n}\n\nclass Measure extends Element {\n static type = CanvasElementType.measure\n\n name = 'Measure'\n declare scaled: Pick\n\n x1Dif: number\n x2Dif: number\n startingX1: number\n startingX2: number\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'tl',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'br',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n this.x1Dif = this.x2Dif = 0\n\n this.startingX1 = this.attrs.x1\n this.startingX2 = this.attrs.x2\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n getVolumeSumString = () => {\n const { volume, barIndex }: { volume: number[]; barIndex: number[] } = this.model.chart().quote()\n const roundedX1 = Math.round(this.attrs.x1)\n const roundedX2 = Math.round(this.attrs.x2)\n // min/max values are offset by 1 so there's no value on such index\n // and at the same time it won't iterate over unlimited number of nonexisting indexes\n const minIndexLimit = barIndex[0] - 1\n const maxIndexLimit = barIndex[barIndex.length - 1] + 1\n const volMinIndex = Math.min(Math.max(Math.min(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\n const volMaxIndex = Math.min(Math.max(Math.max(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\n\n let volumeSum = 0\n for (let i = volMinIndex; i <= volMaxIndex; i++) {\n const volumeIndex = barIndex.indexOf(i)\n if (volumeIndex >= 0) {\n volumeSum += volume[volumeIndex]\n }\n }\n\n return `Vol ${numberToStringWithUnitsSuffix(volumeSum)}`\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n context.set('fillStyle', this.attrs.fill)\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n\n const width = roundedXY.x2 - roundedXY.x1\n const height = roundedXY.y2 - roundedXY.y1\n context.fillRect(x1, roundedXY.y1, width, height)\n\n const priceDif = this.attrs.y2 - this.attrs.y1\n const percentage = (100 / this.attrs.y1) * priceDif\n const heightStr = `${priceDif.toFixed(2)} (${percentage.toFixed(2)}%)`\n\n const text = new Text(\n {\n text: `${getRoundedString({ number: Math.abs(this.attrs.x2 - this.attrs.x1), numOfDecimalPlaces: 2 })} bars`,\n fillStyle: '#333',\n font: { size: 10, family: 'Arial', weight: 'bold' },\n textBaseline: TextBaseline.middle,\n },\n this.model\n )\n const baseX = x1 + width / 2\n const baseY = roundedXY.y1 + height / 2\n let textWidth = text.measure(context)\n text.set({\n x: baseX - textWidth / 2,\n y: baseY - text.getHeight(),\n } as Partial)\n text.render(context)\n\n text.set({ text: heightStr })\n textWidth = text.measure(context)\n text.set({\n x: baseX - textWidth / 2,\n y: baseY,\n } as Partial)\n text.render(context)\n\n text.set({ text: this.getVolumeSumString() })\n textWidth = text.measure(context)\n text.set({\n x: baseX - textWidth / 2,\n y: baseY + text.getHeight(),\n } as Partial)\n text.render(context)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n addToCoordinates(difs: Partial) {\n this.attrs.y1 += difs.y1 || 0\n this.attrs.y2 += difs.y2 || 0\n\n this.x1Dif += difs.x1 || 0\n this.x2Dif += difs.x2 || 0\n\n // The reason for adding +1 is to \"ceil\" the number when moving to the left (decreasing bar index)\n const newX1 = ~~(this.startingX1 + this.x1Dif) + (this.x1Dif < 0 ? 1 : 0)\n if (~~this.attrs.x1 - newX1 !== 0) {\n this.attrs.x1 = newX1\n }\n const newX2 = ~~(this.startingX2 + this.x2Dif) + (this.x2Dif < 0 ? 1 : 0)\n if (~~this.attrs.x2 - newX2 !== 0) {\n this.attrs.x2 = newX2\n }\n }\n\n moveBy(x: number, y: number) {\n return this.addToCoordinates({\n x1: x,\n y1: y,\n x2: x,\n y2: y,\n })\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'tl') {\n this.addToCoordinates({ x1: difX, y1: difY })\n } else {\n this.addToCoordinates({ x2: difX, y2: difY })\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const x1 = Math.round(this.attrs.x1)\n const x2 = Math.round(this.attrs.x2)\n\n const left = Math.min(x1, x2)\n const right = Math.max(x1, x2)\n const top = Math.min(this.attrs.y1, this.attrs.y2)\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n\n onMouseDown(paneArea: PaneArea) {\n super.onMouseDown(paneArea)\n this.startingX1 = this.attrs.x1\n this.startingX2 = this.attrs.x2\n }\n\n onMouseUp(paneArea?: PaneArea) {\n super.onMouseUp(paneArea)\n this.x1Dif = this.x2Dif = 0\n }\n}\n\nMeasure.prototype.defaults = { fill: 'rgba(180,220,255,0.8)' }\n\nMeasure.prototype.modalConfig = {\n inputs: [{ type: 'background', name: 'fill' }],\n}\n\nexport default Measure\n","import { Point } from '../../../types/shared'\nimport { getRoundedObject } from '../../controllers/renderUtils'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport { isInRange } from '../../utils/helpers'\nimport { ITrendAttrs } from './pitchfork_v1'\n\ninterface IGetEdgeIntersectionPointArguments {\n sides: { x: number; y: number }[][]\n rayOrigin: Point\n rayDirection: Point\n}\n\nexport const getEdgeIntersectionPoint = ({ sides, rayOrigin, rayDirection }: IGetEdgeIntersectionPointArguments) => {\n if (rayOrigin.x === rayDirection.x && rayOrigin.y === rayDirection.y) return rayDirection\n\n let intersection = rayDirection\n let intersectionDistance = 0\n for (let index = 0; index < sides.length; index++) {\n const rayToLineIntersection = math.getRayToLineSegmentIntersection(\n rayOrigin,\n rayDirection,\n sides[index][0],\n sides[index][1]\n )\n if (rayToLineIntersection) {\n const distance = math.distance(rayToLineIntersection, rayOrigin)\n if (distance > intersectionDistance && isInRange({ value: distance })) {\n intersectionDistance = distance\n intersection = { x: rayToLineIntersection.x, y: rayToLineIntersection.y }\n }\n }\n }\n\n return intersection\n}\n\nexport const getChartVisibleAreaBoundaries = (paneModel: PaneModel) => {\n const { left, right, top, bottom } = paneModel.getChartLayoutSettings().ChartSettings\n const { leftOffset, width } = paneModel.chart()\n\n const chartVisibleAreaLeftX = Math.abs(leftOffset)\n const chartVisibleAreaRightX = chartVisibleAreaLeftX + width - left.width - right.width\n const chartVisibleAreaTopY = 0\n const chartVisibleAreaBottomY = paneModel.height - top.height - bottom.height\n\n const chartVisibleAreaTopLeftPoint = {\n x: chartVisibleAreaLeftX,\n y: chartVisibleAreaTopY,\n }\n const chartVisibleAreaTopRightPoint = {\n x: chartVisibleAreaRightX,\n y: chartVisibleAreaTopY,\n }\n const chartVisibleAreaBottomLeftPoint = {\n x: chartVisibleAreaLeftX,\n y: chartVisibleAreaBottomY,\n }\n const chartVisibleAreaBottomRightPoint = {\n x: chartVisibleAreaRightX,\n y: chartVisibleAreaBottomY,\n }\n const topSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaTopRightPoint]\n const rightSide = [chartVisibleAreaTopRightPoint, chartVisibleAreaBottomRightPoint]\n const bottomSide = [chartVisibleAreaBottomLeftPoint, chartVisibleAreaBottomRightPoint]\n const leftSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaBottomLeftPoint]\n\n const sides = [topSide, rightSide, bottomSide, leftSide]\n\n return sides\n}\n\ninterface IGetPitchforkCoordinates {\n paneModel: PaneModel\n rayOrigin: Point\n rayDirectionControlPoint1: Point\n rayDirectionControlPoint2?: Point\n trend1: ITrendAttrs\n trend2: ITrendAttrs\n}\n\ninterface ILineSegment {\n P1: Point\n P2: Point\n}\n\ninterface ICoordinates {\n medianRay: ILineSegment\n trend1Ray1: ILineSegment | undefined\n trend1Ray2: ILineSegment | undefined\n trend2Ray1: ILineSegment | undefined\n trend2Ray2: ILineSegment | undefined\n}\n\nexport const getPitchforkCoordinates = ({\n paneModel,\n rayOrigin,\n rayDirectionControlPoint1,\n rayDirectionControlPoint2,\n trend1,\n trend2,\n}: IGetPitchforkCoordinates) => {\n const sides = getChartVisibleAreaBoundaries(paneModel)\n\n const coordinates: ICoordinates = {\n medianRay: { P1: rayOrigin, P2: rayDirectionControlPoint1 },\n trend1Ray1: undefined,\n trend2Ray1: undefined,\n trend1Ray2: undefined,\n trend2Ray2: undefined,\n }\n\n // If rayDirectionControlPoint2 doesn't exist return only medianRay with rayDirectionControlPoint1 as rayDirection\n if (!rayDirectionControlPoint2) {\n coordinates.medianRay = {\n P1: getRoundedObject(rayOrigin),\n P2: getRoundedObject(\n getEdgeIntersectionPoint({\n sides,\n rayOrigin,\n rayDirection: rayDirectionControlPoint1,\n })\n ),\n }\n return coordinates\n }\n\n const medianRayDirectionPoint = math.getMiddlePointOnLineSegment(rayDirectionControlPoint1, rayDirectionControlPoint2)\n const rayOriginToRayDirectionVector = {\n x: medianRayDirectionPoint.x - rayOrigin.x,\n y: medianRayDirectionPoint.y - rayOrigin.y,\n }\n\n const rayDirectionControlPoint1ToPoint2Vector = {\n x: rayDirectionControlPoint1.x - rayDirectionControlPoint2.x,\n y: rayDirectionControlPoint1.y - rayDirectionControlPoint2.y,\n }\n\n const normalizedRayDirectionControlPoint1ToPoint2Vector = math.normalizeVector(\n rayDirectionControlPoint1ToPoint2Vector\n )\n\n const medianRayDirectionPointToRayDirectionControlPoint1Distance = math.distance(\n medianRayDirectionPoint,\n rayDirectionControlPoint1\n )\n\n coordinates.medianRay = {\n P1: getRoundedObject(rayOrigin),\n P2: getRoundedObject(\n getEdgeIntersectionPoint({\n sides,\n rayOrigin,\n rayDirection: medianRayDirectionPoint,\n })\n ),\n }\n if (trend1.active) {\n const trend1Ray = getTrendRayCoordinates({\n trend: trend1.trend,\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\n rayOriginToRayDirectionVector,\n medianRayDirectionPoint,\n sides,\n })\n\n coordinates.trend1Ray1 = trend1Ray.trendRay1\n coordinates.trend1Ray2 = trend1Ray.trendRay2\n }\n if (trend2.active) {\n const trend2Ray = getTrendRayCoordinates({\n trend: trend2.trend,\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\n rayOriginToRayDirectionVector,\n medianRayDirectionPoint,\n sides,\n })\n\n coordinates.trend2Ray1 = trend2Ray.trendRay1\n coordinates.trend2Ray2 = trend2Ray.trendRay2\n }\n\n return coordinates\n}\n\ninterface IGetTrendRayCoordinates {\n trend: number\n medianToControlPointDistance: number\n normalizedControlToControlPointVector: Point\n rayOriginToRayDirectionVector: Point\n medianRayDirectionPoint: Point\n sides: Point[][]\n}\n\nconst getTrendRayCoordinates = ({\n trend,\n medianToControlPointDistance,\n normalizedControlToControlPointVector,\n rayOriginToRayDirectionVector,\n medianRayDirectionPoint,\n sides,\n}: IGetTrendRayCoordinates) => {\n const medianToTrendLineDistance = medianToControlPointDistance * trend\n\n const trendRayPoint1Origin = math.addPoints(\n medianRayDirectionPoint,\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\n )\n const trendPoint2RayOriginPoint2 = math.subtractPoints(\n medianRayDirectionPoint,\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\n )\n\n const trendRayPoint1DirectionPoint = {\n x: trendRayPoint1Origin.x + rayOriginToRayDirectionVector.x,\n y: trendRayPoint1Origin.y + rayOriginToRayDirectionVector.y,\n }\n const trendPoint2RayDirectionPoint = {\n x: trendPoint2RayOriginPoint2.x + rayOriginToRayDirectionVector.x,\n y: trendPoint2RayOriginPoint2.y + rayOriginToRayDirectionVector.y,\n }\n\n return {\n trendRay1: {\n P1: getRoundedObject(trendRayPoint1Origin),\n P2: getRoundedObject(\n getEdgeIntersectionPoint({\n sides,\n rayOrigin: trendRayPoint1Origin,\n rayDirection: trendRayPoint1DirectionPoint,\n })\n ),\n },\n trendRay2: {\n P1: getRoundedObject(trendPoint2RayOriginPoint2),\n P2: getRoundedObject(\n getEdgeIntersectionPoint({\n sides,\n rayOrigin: trendPoint2RayOriginPoint2,\n rayDirection: trendPoint2RayDirectionPoint,\n })\n ),\n },\n }\n}\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\nimport { CanvasElementType } from '../../constants/common'\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport { getHEXWithSpecificAplha } from '../../utils/colors'\nimport Element from '../element'\nimport Thumb from '../thumb'\nimport { getPitchforkCoordinates } from './pitchfork_utils'\n\nexport interface ITrendAttrs {\n active: boolean\n trend: number\n color: string\n}\n\nexport interface IPitchforkAttrs {\n x1: number\n y1: number\n x2: number\n y2: number\n x3: number\n y3: number\n median: { color: string; width: number }\n trend1: ITrendAttrs\n trend2: ITrendAttrs\n}\n\nclass Pitchfork extends Element {\n static type = CanvasElementType.pitchforkV1\n\n declare scaled: Pick\n name = 'Pitchfork'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.resize = this.resize.bind(this)\n\n this._thumbs = [\n new Thumb(\n 'medianRayOrigin',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'rayDirectionControlPoint1',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'rayDirectionControlPoint2',\n () => this.attrs.x3,\n () => this.attrs.y3,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n median: { color: '#e72f2f', width: 1 },\n trend1: {\n color: '#004ad31c',\n active: true,\n trend: 1,\n },\n trend2: {\n color: '#00ca4e1f',\n active: true,\n trend: 0.5,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n\n const offset = getOffsetFromLineWidth(this.attrs.median.width)\n context.translate(offset, offset)\n\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\n paneModel: this.model,\n rayOrigin: { x: x1, y: y1 },\n rayDirectionControlPoint1: { x: x2, y: y2 },\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\n trend1: this.attrs.trend1,\n trend2: this.attrs.trend2,\n })\n\n context.set('lineWidth', this.attrs.median.width)\n\n const trendLines = [\n { trend: this.attrs.trend1, line1: trend1Ray1, line2: trend1Ray2 },\n { trend: this.attrs.trend2, line1: trend2Ray1, line2: trend2Ray2 },\n ].sort((a, b) => {\n if (Math.abs(a.trend.trend) > Math.abs(b.trend.trend)) {\n return -1\n }\n if (Math.abs(a.trend.trend) < Math.abs(b.trend.trend)) {\n return 1\n }\n return 0\n })\n\n // Draw trend lines and fill\n trendLines.forEach((trendLine, trendLineIndex) => {\n if (trendLine.line1 && trendLine.line2) {\n const { line1, line2 } = trendLine\n const solidTrendColor = getHEXWithSpecificAplha(trendLine.trend.color)\n const nextTrendLine = trendLines[trendLineIndex + 1]\n\n context.beginPath()\n context.moveTo(line1.P1.x, line1.P1.y)\n context.lineTo(line1.P2.x, line1.P2.y)\n if (trendLineIndex !== trendLines.length - 1 && nextTrendLine.line1 && nextTrendLine.line2) {\n context.lineTo(nextTrendLine.line1.P2.x, nextTrendLine.line1.P2.y)\n context.lineTo(nextTrendLine.line1.P1.x, nextTrendLine.line1.P1.y)\n context.moveTo(nextTrendLine.line2.P1.x, nextTrendLine.line2.P1.y)\n context.lineTo(nextTrendLine.line2.P2.x, nextTrendLine.line2.P2.y)\n }\n context.lineTo(line2.P2.x, line2.P2.y)\n context.lineTo(line2.P1.x, line2.P1.y)\n context.closePath()\n context.set('fillStyle', trendLine.trend.color)\n context.fill()\n\n context.beginPath()\n context.moveTo(line1.P1.x, line1.P1.y)\n context.lineTo(line1.P2.x, line1.P2.y)\n context.moveTo(line2.P1.x, line2.P1.y)\n context.lineTo(line2.P2.x, line2.P2.y)\n context.set('strokeStyle', solidTrendColor)\n context.stroke()\n }\n })\n\n // Draw median ray line\n context.beginPath()\n context.moveTo(medianRay.P1.x, medianRay.P1.y)\n context.lineTo(medianRay.P2.x, medianRay.P2.y)\n\n // Draw line between outer trend lines origin points or if smaller than 1 between direction control points\n const outerTrendLines =\n trendLines.filter(\n (item) => item.line1 && item.line2 && item.trend.active && Math.abs(item.trend.trend) >= 1\n )[0] ?? {}\n\n if (outerTrendLines.line1 && outerTrendLines.line2) {\n context.moveTo(outerTrendLines.line1.P1.x, outerTrendLines.line1.P1.y)\n context.lineTo(outerTrendLines.line2.P1.x, outerTrendLines.line2.P1.y)\n } else if (!Number.isNaN(x3) && !Number.isNaN(y3)) {\n context.moveTo(x2, y2)\n context.lineTo(x3, y3)\n }\n\n context.set('strokeStyle', this.attrs.median.color)\n context.stroke()\n\n context.translate(offset * -1, offset * -1)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n this.attrs.x3 += x\n this.attrs.y3 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'medianRayOrigin':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'rayDirectionControlPoint1':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'rayDirectionControlPoint2':\n this.attrs.x3 += difX\n this.attrs.y3 += difY\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\n paneModel: this.model,\n rayOrigin: { x: x1, y: y1 },\n rayDirectionControlPoint1: { x: x2, y: y2 },\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\n trend1: this.attrs.trend1,\n trend2: this.attrs.trend2,\n })\n const outerTrendLines =\n Math.abs(this.attrs.trend1.trend) > Math.abs(this.attrs.trend2.trend)\n ? { line1: trend1Ray1, line2: trend1Ray2 }\n : { line1: trend2Ray1, line2: trend2Ray2 }\n\n if (\n math.distanceToSegment(area.scaled, {\n x1: medianRay.P1.x,\n y1: medianRay.P1.y,\n x2: medianRay.P2.x,\n y2: medianRay.P2.y,\n }) <= 10\n ) {\n // cursor is near median ray\n return true\n } else if (\n !Number.isNaN(x3) &&\n !Number.isNaN(y3) &&\n math.distanceToSegment(area.scaled, {\n x1: x2,\n y1: y2,\n x2: x3,\n y2: y3,\n }) <= 10\n ) {\n // cursor is near line connecting direction control points\n return true\n } else if (\n outerTrendLines.line1 &&\n outerTrendLines.line2 &&\n math.pointInPolygon(area.scaled, [\n outerTrendLines.line1.P1,\n outerTrendLines.line1.P2,\n outerTrendLines.line2.P2,\n outerTrendLines.line2.P1,\n ])\n ) {\n // cursor is on polygon created by outer trend lines\n return true\n }\n return super.isInArea(area)\n }\n}\n\nPitchfork.prototype.modalConfig = {\n inputs: [\n { type: 'line', name: 'median' },\n { type: 'trend', name: 'trend1' },\n { type: 'trend', name: 'trend2' },\n ],\n}\n\nexport default Pitchfork\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\ntype Points = Array<{ x: number; y: number }>\n\nexport interface IPolygonAttrs {\n points: Points\n fill: string\n border: DrawingBorder\n positionPointsTimestamps?: Points\n}\n\nclass Polygon extends Element {\n static type = CanvasElementType.polygon\n\n name = 'Polygon'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this.attrs.fill = this.attrs.fill || 'rgba(50, 60, 70, 0.8)'\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n context.set('fillStyle', this.attrs.fill)\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.translate(offset, offset)\n\n const { points } = this.attrs\n context.beginPath()\n context.moveTo(this.fx(points[0].x), this.fy(points[0].y))\n for (const p of points.slice(1)) {\n context.lineTo(this.fx(p.x), this.fy(p.y))\n }\n\n if (this.isPolygon()) {\n context.closePath()\n context.fill()\n }\n context.translate(offset * -1, offset * -1)\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getThumbs() {\n return this.attrs.points.map(\n (point, index) =>\n new Thumb(\n `${index}`,\n () => point.x,\n () => point.y,\n this.resize,\n this.model\n )\n )\n }\n\n cachePointPositionTimestamp = () => {\n const quote = this.model?.chart()?.quote()\n if (quote) {\n const positionPointsTimestamps = this.attrs.points.map((point) => ({\n ...point,\n x: quote.getTimestampFomPositionX(point.x),\n }))\n\n this.set({ positionPointsTimestamps } as Partial)\n }\n }\n\n updateScales() {\n const quote = this.model.chart().quote()\n const { positionPointsTimestamps } = this.attrs\n if (!quote || !positionPointsTimestamps) {\n // positionWavesTimestamps check is temporary to prevent app from crashing\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\n return\n }\n const points = positionPointsTimestamps.map((point) => ({\n ...point,\n x: quote.getPositionXFromTimestamp(point.x),\n }))\n this.set({ points } as Partial)\n }\n\n moveBy(x: number, y: number) {\n for (const point of this.attrs.points) {\n point.x += x\n point.y += y\n }\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n const last = this.attrs.points.length - 1\n if (this.isPolygon() && (+type === 0 || +type === last)) {\n this.attrs.points[0].x += difX\n this.attrs.points[0].y += difY\n this.attrs.points[last].x += difX\n this.attrs.points[last].y += difY\n } else {\n this.attrs.points[+type].x += difX\n this.attrs.points[+type].y += difY\n }\n }\n\n isPolygon() {\n return (\n this.attrs.points[0].x === this.attrs.points.last()?.x && this.attrs.points[0].y === this.attrs.points.last()?.y\n )\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const scaledPoints = this.attrs.points.map((p) => ({\n x: this.fx(p.x),\n y: this.fy(p.y),\n }))\n if (this.isPolygon()) {\n if (math.pointInPolygon(area.scaled, scaledPoints)) {\n return true\n }\n } else {\n for (let i = 0; i < scaledPoints.length - 1; i++) {\n if (\n math.distanceToSegment(area.scaled, {\n x1: scaledPoints[i].x,\n y1: scaledPoints[i].y,\n x2: scaledPoints[i + 1].x,\n y2: scaledPoints[i + 1].y,\n }) <= 10\n ) {\n return true\n }\n }\n }\n\n return super.isInArea(area)\n }\n\n getAutosaveOmittedProperties() {\n return ['points']\n }\n}\n\nPolygon.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default Polygon\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType, TextBaseline } from '../constants/common'\nimport { getRoundedObject } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Text, { ITextAttrs } from './text'\nimport Thumb from './thumb'\n\ninterface Coordinates {\n x1: number\n x2: number\n y1: number\n y2: number\n}\n\nexport interface IPositionAttrs extends Coordinates {\n targetColor: string\n stopColor: string\n targetY: number\n centerY: number\n stopY: number\n}\n\nclass Position extends Element {\n static type = CanvasElementType.position\n\n name = 'Position'\n\n declare scaled: Pick\n\n x1Dif: number\n x2Dif: number\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 't1',\n () => this.attrs.x1,\n () => this.attrs.targetY,\n this.resize,\n this.model\n ),\n new Thumb(\n 't2',\n () => this.attrs.x2,\n () => this.attrs.targetY,\n this.resize,\n this.model\n ),\n new Thumb(\n 's1',\n () => this.attrs.x1,\n () => this.attrs.stopY,\n this.resize,\n this.model\n ),\n new Thumb(\n 's2',\n () => this.attrs.x2,\n () => this.attrs.stopY,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c1',\n () => this.attrs.x1,\n () => this.attrs.centerY,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c2',\n () => this.attrs.x2,\n () => this.attrs.centerY,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n this.x1Dif = this.x2Dif = 0\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['targetY', 'centerY', 'stopY'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, targetY, centerY, stopY } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, targetY, centerY, stopY })\n let sign, stopBaseline, targetBaseline\n const width = roundedXY.x2 - roundedXY.x1\n\n context.set('fillStyle', this.attrs.targetColor)\n context.fillRect(roundedXY.x1, roundedXY.targetY, width, roundedXY.centerY - roundedXY.targetY)\n\n context.set('fillStyle', this.attrs.stopColor)\n context.fillRect(roundedXY.x1, roundedXY.centerY, width, roundedXY.stopY - roundedXY.centerY)\n\n const targetDif = Math.abs(this.attrs.targetY - this.attrs.centerY)\n const targetPerc = (100 / this.attrs.centerY) * targetDif\n const targetStr = `Target: ${targetDif.toFixed(2)} (${targetPerc.toFixed(2)}%)`\n\n const stopDif = Math.abs(this.attrs.stopY - this.attrs.centerY)\n const stopPerc = (100 / this.attrs.centerY) * stopDif\n const stopStr = `Stop: ${stopDif.toFixed(2)} (${stopPerc.toFixed(2)}%)`\n\n if (this.attrs.targetY > this.attrs.centerY) {\n sign = 1\n targetBaseline = TextBaseline.bottom\n stopBaseline = TextBaseline.top\n } else {\n sign = -1\n targetBaseline = TextBaseline.top\n stopBaseline = TextBaseline.bottom\n }\n\n const text = new Text(\n {\n text: targetStr,\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n font: { size: 10, family: 'Arial', weight: 'bold' },\n y: roundedXY.targetY - sign * 4,\n textBaseline: targetBaseline,\n },\n this.model\n )\n let textWidth = text.measure(context)\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\n text.render(context)\n\n text.set({\n text: stopStr,\n y: roundedXY.stopY + sign * 4,\n textBaseline: stopBaseline,\n })\n textWidth = text.measure(context)\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\n text.render(context)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n addToCoordinates(difs: Partial) {\n let middle, middle1, result\n if (difs.targetY) {\n result = this.attrs.targetY + difs.targetY\n if (\n (this.attrs.targetY > this.attrs.centerY && result < this.attrs.centerY) ||\n (this.attrs.targetY < this.attrs.centerY && result > this.attrs.centerY)\n ) {\n this.attrs.stopY = this.attrs.centerY - (this.attrs.stopY - this.attrs.centerY) // swap target&stop\n }\n this.attrs.targetY = result\n }\n\n if (difs.stopY) {\n result = this.attrs.stopY + difs.stopY\n if (\n (this.attrs.stopY > this.attrs.centerY && result < this.attrs.centerY) ||\n (this.attrs.stopY < this.attrs.centerY && result > this.attrs.centerY)\n ) {\n this.attrs.targetY = this.attrs.centerY - (this.attrs.targetY - this.attrs.centerY) // swap target&stop\n }\n this.attrs.stopY = result\n }\n\n if (\n difs.centerY &&\n ((this.attrs.stopY < (middle = this.attrs.centerY + difs.centerY) && middle < this.attrs.targetY) ||\n (this.attrs.stopY > (middle1 = this.attrs.centerY + difs.centerY) && middle1 > this.attrs.targetY))\n ) {\n this.attrs.centerY += difs.centerY\n }\n\n this.x1Dif += difs.x1 || 0\n this.x2Dif += difs.x2 || 0\n const roundDif = ~~this.x1Dif || ~~this.x2Dif\n if (roundDif !== 0) {\n if (difs.x1 != null) {\n this.attrs.x1 += roundDif\n }\n if (difs.x2 != null) {\n this.attrs.x2 += roundDif\n }\n this.x1Dif = this.x2Dif = 0\n }\n }\n\n moveBy(x: number, y: number) {\n return this.addToCoordinates({\n x1: x,\n x2: x,\n targetY: y,\n centerY: y,\n stopY: y,\n })\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n const [coordType, coordIndex] = (type as string).split('')\n const yPoints: Record = { t: 'targetY', c: 'centerY', s: 'stopY' }\n const obj: Partial = {\n [`x${coordIndex}`]: difX,\n [yPoints[coordType]]: difY,\n }\n return this.addToCoordinates(obj)\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const x1 = Math.round(this.attrs.x1)\n const x2 = Math.round(this.attrs.x2)\n const left = Math.min(x1, x2)\n const right = Math.max(x1, x2)\n const top = Math.min(this.attrs.targetY, this.attrs.stopY)\n const bottom = Math.max(this.attrs.targetY, this.attrs.stopY)\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nPosition.prototype.defaults = {\n targetColor: 'rgba(0,200,0,0.3)',\n stopColor: 'rgba(200,0,0,0.3)',\n}\n\nPosition.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'targetColor' },\n { type: 'background', name: 'stopColor' },\n ],\n}\n\nexport default Position\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface IRectangleAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n fill: string\n border: DrawingBorder\n}\n\nclass Rectangle extends Element {\n static type = CanvasElementType.rectangle\n\n name = 'Rectangle'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'br',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'tl',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n const width = roundedXY.x2 - roundedXY.x1\n const height = roundedXY.y2 - roundedXY.y1\n\n context.set('fillStyle', this.attrs.fill)\n\n context.fillRect(roundedXY.x1, roundedXY.y1, width, height)\n\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.strokeRect(roundedXY.x1 + offset, roundedXY.y1 + offset, width, height)\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.y1 += y\n this.attrs.y2 += y\n\n // @todo - Live sync of elements while they are being moved around\n // In order to have live sync across charts we need to trigger change so listeners can update other charts with new values\n // this.set(this.attrs)\n // this.trigger('change', this)\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'tl') {\n this.attrs.x1 += difX\n return (this.attrs.y1 += difY)\n } else {\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const left = Math.min(this.attrs.x1, this.attrs.x2)\n const right = Math.max(this.attrs.x1, this.attrs.x2)\n const top = Math.min(this.attrs.y1, this.attrs.y2)\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nRectangle.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default Rectangle\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\nimport { CanvasElementType } from '../../constants/common'\nimport { getOffsetFromLineWidth, getRoundedObject } from '../../controllers/renderUtils'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport Element from '../element'\nimport Thumb from '../thumb'\n\nexport interface IRotatedRectangleV1Attrs {\n x1: number\n x2: number\n y1: number\n y2: number\n cursorTargetX: number\n cursorTargetY: number\n fill: string\n border: DrawingBorder\n}\n\nclass RotatedRectangleV1 extends Element {\n static type = CanvasElementType.rotatedRectangleV1\n\n name = 'New Rotated Rectangle'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'middleLeft',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'middleRight',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'topRight',\n () => this.getRectCoordinates(true).P1.x || this.attrs.x2,\n () => this.getRectCoordinates(true).P1.y || this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'topLeft',\n () => this.getRectCoordinates(true).P2.x || this.attrs.x2,\n () => this.getRectCoordinates(true).P2.y || this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'bottomLeft',\n () => this.getRectCoordinates(true).P3.x || this.attrs.x1,\n () => this.getRectCoordinates(true).P3.y || this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'bottomRight',\n () => this.getRectCoordinates(true).P4.x || this.attrs.x1,\n () => this.getRectCoordinates(true).P4.y || this.attrs.y1,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { P1, P2, P3, P4 } = this.getRectCoordinates()\n const roundedXY = {\n P1: getRoundedObject(P1),\n P2: getRoundedObject(P2),\n P3: getRoundedObject(P3),\n P4: getRoundedObject(P4),\n }\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.set('fillStyle', this.attrs.fill)\n\n context.translate(offset, offset)\n context.beginPath()\n if (roundedXY.P1.x === roundedXY.P4.x && roundedXY.P1.y === roundedXY.P4.y) {\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\n } else {\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\n context.lineTo(roundedXY.P3.x, roundedXY.P3.y)\n context.lineTo(roundedXY.P4.x, roundedXY.P4.y)\n context.closePath()\n context.fill()\n }\n context.translate(offset * -1, offset * -1)\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n context.stroke()\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getRectCoordinates(inverted = false) {\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\n let perpendicularPoint\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\n const cursor = { x: cursorTargetX, y: cursorTargetY }\n const line = { x1, y1, x2, y2 }\n const distance = math.distanceToLine(cursor, line)\n perpendicularPoint = math.perpendicularPointToLine({\n distance,\n line,\n })\n } else {\n return {\n P1: { x: x2, y: y2 },\n P2: { x: x1, y: y1 },\n P3: { x: x1, y: y1 },\n P4: { x: x2, y: y2 },\n }\n }\n\n const pointOffsetX = perpendicularPoint.x - x2\n const pointOffsetY = perpendicularPoint.y - y2\n\n const P1 = { x: x2 + pointOffsetX, y: y2 + pointOffsetY }\n const P2 = { x: x1 + pointOffsetX, y: y1 + pointOffsetY }\n const P3 = { x: x1 + -1 * pointOffsetX, y: y1 + -1 * pointOffsetY }\n const P4 = { x: x2 + -1 * pointOffsetX, y: y2 + -1 * pointOffsetY }\n\n const invertX = this.model.scale.x.invert\n const invertY = this.model.scale.y.invert\n if (inverted) {\n return {\n P1: { x: invertX(P1.x), y: invertY(P1.y) },\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\n P3: { x: invertX(P3.x), y: invertY(P3.y) },\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\n }\n }\n return { P1, P2, P3, P4 }\n }\n\n getRotatedPointCoordinates = ({\n rotationAxisPoint,\n pointToRotate,\n oldLinePoint,\n newLinePoint,\n }: {\n rotationAxisPoint: Point\n pointToRotate: Point\n oldLinePoint: Point\n newLinePoint: Point\n }) => {\n const angle = math.sharedPointLinesAngle({\n sharedPoint: rotationAxisPoint,\n oldLinePoint,\n newLinePoint,\n })\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\n rotationAxisPoint,\n angle,\n pointToRotate,\n })\n return {\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n this.attrs.cursorTargetX += x\n this.attrs.cursorTargetY += y\n }\n\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'middleLeft':\n const newMiddleLeftPoint = {\n x: this.attrs.x1 + difX,\n y: this.attrs.y1 + difY,\n }\n const middleLeftRotatedCursorPoint = this.getRotatedPointCoordinates({\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\n pointToRotate: {\n x: this.scaled.cursorTargetX,\n y: this.scaled.cursorTargetY,\n },\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\n newLinePoint: { x: this.model.scale.x(newMiddleLeftPoint.x), y: this.model.scale.y(newMiddleLeftPoint.y) },\n })\n this.attrs = {\n ...this.attrs,\n x1: newMiddleLeftPoint.x,\n y1: newMiddleLeftPoint.y,\n cursorTargetX: middleLeftRotatedCursorPoint.x,\n cursorTargetY: middleLeftRotatedCursorPoint.y,\n }\n break\n case 'middleRight':\n const newMiddleRightPoint = {\n x: this.attrs.x2 + difX,\n y: this.attrs.y2 + difY,\n }\n const middleRightRotatedCursorPoint = this.getRotatedPointCoordinates({\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\n pointToRotate: {\n x: this.scaled.cursorTargetX,\n y: this.scaled.cursorTargetY,\n },\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\n newLinePoint: { x: this.model.scale.x(newMiddleRightPoint.x), y: this.model.scale.y(newMiddleRightPoint.y) },\n })\n this.attrs = {\n ...this.attrs,\n x2: newMiddleRightPoint.x,\n y2: newMiddleRightPoint.y,\n cursorTargetX: middleRightRotatedCursorPoint.x,\n cursorTargetY: middleRightRotatedCursorPoint.y,\n }\n break\n case 'topRight':\n case 'topLeft':\n case 'bottomLeft':\n case 'bottomRight':\n this.attrs = {\n ...this.attrs,\n cursorTargetX: area.x,\n cursorTargetY: area.y,\n }\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const coordinates = this.getRectCoordinates()\n const polygon = Object.keys(coordinates).map((point) => ({\n x: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].x,\n y: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].y,\n }))\n if (math.pointInPolygon(area.scaled, polygon)) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nRotatedRectangleV1.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default RotatedRectangleV1\n","import { DrawingBorder, PaneArea } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Line from './line'\n\nexport interface IScaledLineAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n dashLength: number\n lineWidth: number\n strokeStyle: string\n border: DrawingBorder\n}\n\nclass ScaledLine extends Line {\n static type = CanvasElementType.scaledLine\n\n name = 'Line'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.renderContent = this.renderContent.bind(this)\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n border: {\n width: 1,\n color: this.getChartLayoutSettings().ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\n\n context.translate(translateXY.x, translateXY.y)\n context.beginPath()\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n context.moveTo(roundedXY.x1, roundedXY.y1)\n if (this.attrs.dashLength) {\n context.setLineDash([this.attrs.dashLength])\n }\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.stroke()\n context.translate(translateXY.x * -1, translateXY.y * -1)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\n return true\n }\n return this.thumbsAreInArea(area)\n }\n}\n\nScaledLine.prototype.modalConfig = {\n inputs: [{ type: 'line', name: 'border' }],\n}\n\nexport default ScaledLine\n","import merge from 'lodash.merge'\n\nimport { PaneArea } from '../../types/shared'\nimport { PADDING } from '../constants/common'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport Text, { ITextAttrs } from './text'\n\ninterface FontFamilyHeightCoefficient {\n Arial: {\n firstLine: number\n otherLines: number\n }\n Verdana: {\n firstLine: number\n otherLines: number\n }\n}\n\nclass ScaledText extends Text {\n static type = CanvasElementType.scaledText\n\n name = 'Text'\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\n declare lastAttrs: Attrs\n declare scaled: Partial\n declare measuredHeight: number\n\n declare font: string\n declare context: CanvasRenderingContext2D\n declare lines: {\n text: string\n metrics: TextMetrics\n }[]\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.scale({ x: ['x'], y: ['y'] })\n }\n\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n this.render(context)\n }\n\n setupTextMetricsCache() {\n if (\n this.attrs.text !== this.lastAttrs?.text ||\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)\n ) {\n this.lastAttrs = merge({}, this.attrs)\n this.lines = this.getLines().map((line) => ({\n text: line,\n metrics: this.context.measureText(line),\n }))\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\n const lineHeight =\n current.metrics.actualBoundingBoxAscent +\n current.metrics.actualBoundingBoxDescent +\n (currentIndex !== this.lines.length - 1 ? PADDING.XXXS : 0)\n return acc + lineHeight\n }, 0)\n }\n }\n\n // private\n setupContext(context: CanvasRenderingContext2D) {\n this.context = context\n context.set('font', this.font)\n context.set('fillStyle', this.attrs.fillStyle!)\n context.set('textAlign', this.attrs.textAlign!)\n context.set('textBaseline', this.attrs.textBaseline)\n this.setupTextMetricsCache()\n }\n\n // private\n renderText() {\n let y = this.scaled.y! + this.attrs.padding.top\n let previousDescent = 0\n for (let i = 0; i < this.lines.length; i++) {\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.XXXS\n this.context.fillText(this.lines[i].text, this.scaled.x! + this.attrs.padding.left, y)\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\n }\n }\n\n // private\n renderBackground() {\n if (!this.attrs.background) {\n return\n }\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\n\n this.context.beginPath()\n this.context.rect(\n this.scaled.x! - padding,\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding,\n this.width + padding * 2,\n this.measuredHeight + padding * 2\n )\n this.context.set('fillStyle', this.attrs.background)\n this.context.fill()\n this.context.set('fillStyle', this.attrs.fillStyle!)\n this.renderBorder()\n this.context.closePath()\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n // TODO\n // if @attrs.textBaseline == 'middle'\n // rect.y = @attrs.y - rect.height/2\n if (\n this.lines &&\n this.scaled.x! < area.scaled.x &&\n area.scaled.x < this.scaled.x! + this.width &&\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent < area.scaled.y &&\n area.scaled.y < this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent + this.measuredHeight\n ) {\n return true\n }\n return this.thumbsAreInArea(area)\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x! += x\n this.attrs.y! += y\n }\n}\n\nexport default ScaledText\n","import { PaneArea, RequireByKey, TextAttrs } from '../../types/shared'\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\nimport Element, { TodoModalConfig } from './element'\n\nexport interface Area {\n x: number\n y: number\n}\n\nexport type ITextAttrs = RequireByKey & Partial\n\nconst DEFAULTS: Partial = {\n text: '',\n font: {\n size: 20,\n family: 'Arial',\n style: 'normal',\n weight: 'normal',\n },\n lineHeight: 20,\n // left | right | center | start | end\n textAlign: TextAlign.left,\n // top | hanging | middle | alphabetic | ideographic | bottom\n textBaseline: TextBaseline.alphabetic,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n },\n}\n\nclass Text extends Element {\n static type = CanvasElementType.text\n\n static getMergedPropsWithDefaults>(\n propKey: T,\n props: Partial = {}\n ) {\n return {\n ...DEFAULTS[propKey],\n ...Object.entries(props).reduce((acc, [key, value]) => (value ? { ...acc, [key]: value } : acc), {}),\n }\n }\n\n name = 'Anchored text'\n declare context: CanvasRenderingContext2D\n declare width: number\n declare height: number\n declare font: string\n\n static initClass() {\n Object.defineProperty(this.prototype, 'width', {\n get() {\n // TODO: revisit this getter, when you call `this.width` you don't expect/want context change\n if (this.context) {\n this.setupContext(this.context)\n }\n return this.measure() + this.attrs.padding.left + this.attrs.padding.right\n },\n })\n\n Object.defineProperty(this.prototype, 'height', {\n get() {\n const count = this.getLines().length\n return this.attrs.lineHeight * count + this.attrs.padding.top + this.attrs.padding.bottom\n },\n })\n\n Object.defineProperty(this.prototype, 'font', {\n get() {\n const f = this.attrs.font\n return `${f.style} ${f.weight} ${f.size}pt ${f.family}`\n },\n })\n }\n\n getModalConfigBase() {\n return {\n inputs: [\n { type: 'multiline_string', name: 'text', required: true },\n { type: 'font', name: 'font' },\n {\n type: 'background',\n name: 'fillStyle',\n label: 'Color',\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n },\n {\n type: 'background',\n name: 'background',\n label: 'Background',\n default: 'rgba(0,0,0,0)',\n },\n {\n type: 'border',\n name: 'border',\n min: 0,\n default: { color: 'rgba(0,0,0)', width: 0 },\n },\n ],\n } as unknown as TodoModalConfig\n }\n\n getDefaults() {\n return {\n ...DEFAULTS,\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\n\n set(obj: Partial) {\n super.set(obj)\n if (obj.font?.size && !obj.lineHeight) {\n this.attrs.lineHeight = Math.max(obj.font.size, this.attrs.lineHeight)\n }\n return this\n }\n\n render(context: CanvasRenderingContext2D) {\n this.setupContext(context)\n if (this.attrs.angle) {\n // TODO background & multiline text\n this.context.save()\n this.context.translate(this.attrs.x!, this.attrs.y!)\n this.context.rotate((this.attrs.angle * Math.PI) / 180)\n this.context.fillText(this.attrs.text, 0, 0)\n this.context.restore()\n } else {\n this.renderBackground()\n this.renderText()\n }\n }\n\n measure(context?: CanvasRenderingContext2D) {\n if (context) {\n this.setupContext(context)\n }\n const lines = this.getLines()\n let max = 0\n for (const line of lines) {\n max = Math.max(this.context.measureText(line).width, max)\n }\n return ~~max\n }\n\n isInArea(testArea: PaneArea) {\n const area = this.convertArea(testArea)\n // TODO iny align\n if (\n this.attrs.x! < area.x &&\n area.x < this.attrs.x! + this.width &&\n this.attrs.y! - this.attrs.font.size < area.y &&\n area.y < this.attrs.y! - this.attrs.font.size + this.height\n ) {\n return true\n }\n return super.isInArea(testArea)\n }\n\n setupContext(context: CanvasRenderingContext2D) {\n this.context = context\n context.set('font', this.font)\n context.set('fillStyle', this.attrs.fillStyle)\n context.set('textAlign', this.attrs.textAlign)\n context.set('textBaseline', this.attrs.textBaseline)\n }\n\n getLines() {\n return this.attrs.text.toString().split('\\n')\n }\n\n renderText() {\n let { y } = this.attrs // + @attrs.padding.top\n for (const line of this.getLines()) {\n this.context.fillText(line, this.attrs.x! + this.attrs.padding.left, y!)\n y! += this.attrs.lineHeight\n }\n }\n\n renderBackground() {\n if (!this.attrs.background) {\n return\n }\n\n const { width } = this\n const { height } = this\n const rawHight = height - this.attrs.padding.top - this.attrs.padding.bottom\n const { x } = this.attrs\n let y = this.attrs.y! - height\n\n if (this.attrs.textBaseline === 'middle') {\n y = this.attrs.y! - rawHight / 2 - this.attrs.padding.top - 1\n } else if (this.attrs.textBaseline === 'alphabetic') {\n y = this.attrs.y! - this.attrs.lineHeight\n }\n\n this.context.beginPath()\n this.context.set('fillStyle', this.attrs.background)\n this.context.rect(x!, y, width, height)\n this.context.fill()\n this.context.set('fillStyle', this.attrs.fillStyle)\n this.renderBorder()\n this.context.closePath()\n }\n\n renderBorder() {\n const { lineWidth = 0, strokeStyle, border } = this.attrs\n const borderWidth = border?.width ?? 0\n\n if (lineWidth || this.attrs.strokeStyle || borderWidth > 0) {\n this.context.set('strokeStyle', strokeStyle ?? border?.color ?? '')\n this.context.set('lineWidth', Math.max(lineWidth, borderWidth))\n this.context.stroke()\n }\n }\n\n private convertArea(area: PaneArea) {\n const { ChartSettings } = this.getChartLayoutSettings()\n return {\n x: this.model.scale.x(area.x) + this.model.chart().leftOffset + ChartSettings.left.width,\n y: this.model.scale.y(area.y) + ChartSettings.top.height,\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x! += this.model.scale.x(x) + 1\n this.attrs.y! += this.model.scale.y(y) - this.model.scale.y(0)\n }\n\n getHeight() {\n return this.height\n }\n}\n\nText.initClass()\n\nexport default Text\n","import { PaneArea, ResizeByThumbFuncProps, ThumbType } from '../../types/shared'\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\n\ntype Area = PaneArea\ntype ResizeFunc = (props: ResizeByThumbFuncProps) => void\ntype ScaleFunc = () => number\n\nclass Thumb {\n type: ThumbType\n lastX = 0\n lastY = 0\n fx: ScaleFunc\n fy: ScaleFunc\n resize: ResizeFunc\n model: PaneModel\n\n constructor(type: ThumbType, fx: ScaleFunc, fy: ScaleFunc, resize: ResizeFunc, model: PaneModel) {\n this.type = type\n this.fx = fx\n this.fy = fy\n this.resize = resize\n this.model = model\n }\n\n render(context: CanvasRenderingContext2D) {\n const { ThumbSettings } = this.model.getChartLayoutSettings()\n context.set('fillStyle', ThumbSettings.color)\n context.set('strokeStyle', ThumbSettings.borderColor)\n context.set('lineWidth', ThumbSettings.borderWidth)\n const x = ~~this.x()\n const y = ~~this.y()\n const thumbWidth = this.getThumbWidth()\n const offset = getOffsetFromLineWidth(ThumbSettings.borderWidth)\n context.beginPath()\n context.rect(x + offset, y + offset, thumbWidth, thumbWidth)\n context.fill()\n context.stroke()\n }\n\n startEditing(area: Area) {\n this.lastX = area.x\n return (this.lastY = area.y)\n }\n\n moveTo(area: Area) {\n const difX = area.x - this.lastX\n const difY = area.y - this.lastY\n this.resize({ type: this.type, difX, difY, area })\n this.lastX = area.x\n this.lastY = area.y\n }\n\n isInArea(area: Area) {\n const width = this.model.scale.x.invert(this.getThumbWidth())\n const height = this.model.scale.y.invert(0) - this.model.scale.y.invert(this.getThumbWidth())\n // +- width/2 because we have coordinates of a center\n if (\n this.fx() + width / 2 >= area.x &&\n this.fx() - width / 2 <= area.x &&\n this.fy() + height / 2 > area.y &&\n this.fy() - height / 2 < area.y\n ) {\n return true\n }\n return false\n }\n\n getThumbWidth() {\n const { ThumbSettings } = this.model.getChartLayoutSettings()\n return ThumbSettings.size + ThumbSettings.borderWidth * 2\n }\n\n x() {\n const { ThumbSettings } = this.model.getChartLayoutSettings()\n return this.model.scale.x(this.fx()) - ThumbSettings.size / 2\n }\n\n y() {\n const { ThumbSettings } = this.model.getChartLayoutSettings()\n return this.model.scale.y(this.fy()) - ThumbSettings.size / 2\n }\n}\n\nexport default Thumb\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface ITriangleAttrs {\n x1: number\n x2: number\n x3: number\n y1: number\n y2: number\n y3: number\n fill: string\n border: string\n}\n\nclass Triangle extends Element {\n static type = CanvasElementType.triangle\n\n declare scaled: Pick\n name = 'Triangle'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.resize = this.resize.bind(this)\n\n this._thumbs = [\n new Thumb(\n 'a',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'b',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c',\n () => this.attrs.x3,\n () => this.attrs.y3,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return { fill: ElementSettings.defaultFill, border: ElementSettings.Colors.border } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, x3, y1, y2, y3 })\n\n context.set('fillStyle', this.attrs.fill)\n\n const offset = this.getShouldRenderThumbs() ? getOffsetFromLineWidth(1) : 0\n\n context.translate(offset, offset)\n context.beginPath()\n context.moveTo(roundedXY.x1, roundedXY.y1)\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.lineTo(roundedXY.x3, roundedXY.y3)\n context.lineTo(roundedXY.x1, roundedXY.y1)\n context.fill()\n context.translate(offset * -1, offset * -1)\n\n if (this.getShouldRenderThumbs()) {\n context.set('strokeStyle', this.attrs.border)\n context.stroke()\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n this.attrs.x3 += x\n this.attrs.y3 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'a':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'b':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'c':\n this.attrs.x3 += difX\n this.attrs.y3 += difY\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const polygon = [1, 2, 3].map((i) => ({\n x: this.scaled[`x${i}` as 'x1' | 'x2' | 'x3'],\n y: this.scaled[`y${i}` as 'y1' | 'y2' | 'y3'],\n }))\n if (math.pointInPolygon(area.scaled, polygon)) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nTriangle.prototype.modalConfig = {\n inputs: [{ type: 'background', name: 'fill' }],\n}\n\nexport default Triangle\n","import { RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\n\nclass VerticalLine extends ScaledLine {\n static type = CanvasElementType.verticalLine\n\n name = 'Vertical line'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.renderContent = this.renderContent.bind(this)\n\n this.attrs.x2 = this.attrs.x1\n this._thumbs = [this._thumbs[0]]\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const domain = this.model.scale.y.domain()\n this.attrs.y1 = domain[0]\n this.attrs.y2 = domain[1]\n this._thumbs[0].fy = () => (this.attrs.y1 + this.attrs.y2) / 2\n super.renderContent(context)\n }\n\n moveBy(x: number) {\n return (this.attrs.x1 = this.attrs.x2 += x)\n }\n\n resize({ difX }: RequireByKey) {\n return this.moveBy(difX)\n }\n}\n\nexport default VerticalLine\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType, TextBaseline } from '../constants/common'\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Text, { ITextAttrs } from './text'\nimport Thumb from './thumb'\n\nexport interface IXABCDPositionAttrs {\n xx: number\n xy: number\n ax: number\n ay: number\n bx: number\n by: number\n cx: number\n cy: number\n dx: number\n dy: number\n}\n\ntype xPoints = 'xx' | 'ax' | 'bx' | 'cx' | 'dx'\ntype yPoints = 'xy' | 'ay' | 'by' | 'cy' | 'dy'\n\nexport interface IXABCDAttrs extends IXABCDPositionAttrs {\n fill: string\n border: DrawingBorder\n lineWidth: number\n}\n\nclass XABCD extends Element {\n static type = CanvasElementType.xabcd\n\n name = 'XABCD pattern'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.resize = this.resize.bind(this)\n\n this._thumbs = [\n new Thumb(\n 'x',\n () => this.attrs.xx,\n () => this.attrs.xy,\n this.resize,\n this.model\n ),\n new Thumb(\n 'a',\n () => this.attrs.ax,\n () => this.attrs.ay,\n this.resize,\n this.model\n ),\n new Thumb(\n 'b',\n () => this.attrs.bx,\n () => this.attrs.by,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c',\n () => this.attrs.cx,\n () => this.attrs.cy,\n this.resize,\n this.model\n ),\n new Thumb(\n 'd',\n () => this.attrs.dx,\n () => this.attrs.dy,\n this.resize,\n this.model\n ),\n ]\n if (this.attrs.lineWidth == null) {\n this.attrs.lineWidth = 1\n }\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({\n x: ['xx', 'ax', 'bx', 'cx', 'dx'],\n y: ['xy', 'ay', 'by', 'cy', 'dy'],\n })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { xx, xy, ax, ay, bx, by, cx, cy, dx, dy } = this.scaled\n const roundedXY = getRoundedObject({ xx, xy, ax, ay, bx, by, cx, cy, dx, dy })\n\n context.set('fillStyle', this.attrs.fill)\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.translate(offset, offset)\n\n context.beginPath()\n context.moveTo(roundedXY.xx, roundedXY.xy)\n context.lineTo(roundedXY.ax, roundedXY.ay)\n context.lineTo(roundedXY.bx, roundedXY.by)\n context.lineTo(roundedXY.xx, roundedXY.xy)\n context.fill()\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n context.beginPath()\n context.moveTo(roundedXY.bx, roundedXY.by)\n context.lineTo(roundedXY.cx, roundedXY.cy)\n context.lineTo(roundedXY.dx, roundedXY.dy)\n context.lineTo(roundedXY.bx, roundedXY.by)\n context.fill()\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n context.beginPath()\n context.moveTo(roundedXY.ax, roundedXY.ay)\n context.lineTo(roundedXY.cx, roundedXY.cy)\n context.moveTo(roundedXY.xx, roundedXY.xy)\n context.lineTo(roundedXY.dx, roundedXY.dy)\n context.stroke()\n\n const text = new Text(\n {\n font: { size: 8, style: 'bold' },\n lineHeight: 8,\n padding: {\n top: 2,\n right: 2,\n bottom: 2,\n left: 2,\n },\n textBaseline: TextBaseline.middle,\n // @ts-expect-error - TODO - textAlign doesnt have `middle` value\n textAlign: 'middle',\n fillStyle: '#ffffff',\n background: this.attrs.fill || '#000000',\n },\n this.model\n )\n\n for (const t of Array.from('xabcd')) {\n text\n .set({\n text: t.toUpperCase(),\n x: roundedXY[(t + 'x') as xPoints] - 6,\n y: roundedXY[(t + 'y') as yPoints] + 12,\n } as Partial)\n .render(context)\n }\n\n const retLabel = (y1: string, y2: string, y3: string) => {\n const len = Math.abs(this.attrs[(y1 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints])\n const ret = Math.abs(this.attrs[(y3 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints]) / len\n const x = (roundedXY[(y1 + 'x') as xPoints] + roundedXY[(y3 + 'x') as xPoints]) / 2\n const y = (roundedXY[(y1 + 'y') as yPoints] + roundedXY[(y3 + 'y') as yPoints]) / 2\n return text\n .set({\n text: ret.toFixed(3),\n x,\n y,\n })\n .render(context)\n }\n\n retLabel('x', 'a', 'b')\n retLabel('a', 'b', 'c')\n retLabel('b', 'c', 'd')\n retLabel('x', 'a', 'd')\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n context.translate(offset * -1, offset * -1)\n }\n\n moveBy(x: number, y: number) {\n for (const t of Array.from('xabcd')) {\n this.attrs[(t + 'x') as xPoints] += x\n this.attrs[(t + 'y') as yPoints] += y\n }\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n this.attrs[(type + 'x') as xPoints] += difX\n return (this.attrs[(type + 'y') as yPoints] += difY)\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n let t\n const xab = (() => {\n const result = []\n for (t of Array.from('xab')) {\n result.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\n }\n return result\n })()\n const bcd = (() => {\n const result1 = []\n for (t of Array.from('bcd')) {\n result1.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\n }\n return result1\n })()\n if (math.pointInPolygon(area.scaled, xab) || math.pointInPolygon(area.scaled, bcd)) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nXABCD.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1 },\n ],\n}\n\nexport default XABCD\n","import { getContextWithCache } from '../lib/shims'\nimport Utils from '../utils'\nimport { captureException, getIsSSr } from '../utils/helpers'\n\nclass Cache {\n constructor() {\n this.canvas = getIsSSr() ? null : document.createElement('canvas')\n }\n\n set(callback, width, height) {\n this.callback = callback\n this.width = width\n this.height = height\n this.rendered = false\n }\n\n render(context, x, y) {\n if (x == null) {\n x = 0\n }\n if (y == null) {\n y = 0\n }\n if (!this.rendered) {\n this.refresh()\n }\n if (this.width < 1 || this.height < 1) {\n return\n }\n\n try {\n if (this.ratio >= 1 && this.canvas) {\n context.drawImage(\n this.canvas,\n 0,\n 0,\n ~~(this.width * this.ratio),\n ~~(this.height * this.ratio),\n x,\n y,\n this.width,\n this.height\n )\n } else {\n context.save()\n context.translate(x, y)\n this.callback(context)\n context.restore()\n }\n } catch (e) {\n captureException(\n e,\n this.canvas\n ? {\n extra: {\n width: this.width,\n height: this.height,\n ratio: this.ratio,\n cWidth: this.canvas.width,\n cHeight: this.canvas.height,\n sWidth: window.screen.width,\n sHeight: window.screen.height,\n },\n }\n : {}\n )\n }\n }\n\n refresh() {\n if (getIsSSr()) {\n return\n }\n this.canvas.width = this.width\n this.canvas.height = this.height\n this.context = getContextWithCache(this.canvas)\n this.ratio = Utils.getScaleRatio()\n Utils.setSizeOnCanvasElement({ canvasElement: this.canvas, width: this.width, height: this.height })\n this.context.scale(this.ratio, this.ratio)\n\n this.callback(this.context)\n this.rendered = true\n }\n}\n\nexport default Cache\n","export enum ChartMinWidthBreakpoints {\n xs = 0,\n s = 480,\n m = 768,\n l = 1024,\n}\n\nexport function getChartBreakpoints(chartWidthInPx: number) {\n return {\n isXs: chartWidthInPx >= ChartMinWidthBreakpoints.xs,\n isS: chartWidthInPx >= ChartMinWidthBreakpoints.s,\n isM: chartWidthInPx >= ChartMinWidthBreakpoints.m,\n isL: chartWidthInPx >= ChartMinWidthBreakpoints.l,\n }\n}\n","import * as d3 from 'd3'\nimport merge from 'lodash.merge'\n\nimport {\n ChartConfigChartPaneElement,\n CustomSpineEvents,\n Instrument,\n Maybe,\n RequireByKey,\n Theme,\n} from '../../types/shared'\nimport Cache from '../canvas/cache'\nimport Element from '../canvas/element'\nimport Line from '../canvas/line'\nimport Text from '../canvas/text'\nimport tailwindColors from '../constants/colors'\nimport {\n CHART_MARGIN,\n ChartElementType,\n FONT_SIZE,\n IndicatorType,\n IntradayTimeframeInterval,\n LINE_HEIGHT,\n MONTHS,\n OFFSET,\n PADDING,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n TIMEFRAMES_WITH_PRE_MARKET,\n TextAlign,\n TextBaseline,\n getTimeframeLabel,\n} from '../constants/common'\nimport {\n getIsSmallIndexChart,\n getPercentageFromValue,\n getTranslate,\n getValueFromPercentage,\n} from '../controllers/renderUtils'\nimport Chart from '../models/chart'\nimport { getColorOverwrites } from '../models/chart_settings'\nimport { ISettings, OHLCType } from '../models/chart_settings/interfaces'\nimport { darkerWickColors, thinBarColorsOverride } from '../models/constants'\nimport mouseModel from '../models/mouse'\nimport PaneModel, { ScaleAxis } from '../models/pane'\nimport Quote from '../models/quote'\nimport { getChartLayoutSettings } from '../models/settings'\nimport Overlay from '../overlays/overlay'\nimport { overlaysByType } from '../overlays/overlays'\nimport utils, { dateFromDateString, isRedesignedPage, numberToStringWithUnitsSuffix } from '../utils'\nimport {\n ITickerChange,\n getBarWidthWithMargin,\n getBarWidthWithMarginByParts,\n getChangeColor,\n getShouldUseDarkerWickColors,\n getTickerChange,\n getTickerChangeFromCloseValues,\n getVirtualTimeframeTradedDates,\n renderCross,\n round,\n unmountCanvas,\n} from '../utils/chart'\nimport { convertColorToHEX, getHEXWithSpecificAplha, getHSVAFromColor, stringifyHSVAColor } from '../utils/colors'\nimport { setElementCursor } from '../utils/cursor'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getChartBreakpoints } from './utils'\n\nexport interface BaseChartAttrs {\n overlays: Required['overlays']\n}\n\ntype OhlcLineElements = Array<{ text: string; color: string } | 'space'>\n\ninterface LastOHLCAttrs {\n text: string\n x: number\n y: number\n width: number\n textBaseline: TextBaseline\n textAlign: TextAlign\n}\n\ninterface IRenderOHLCParameters {\n context: CanvasRenderingContext2D\n date: Maybe\n open?: Maybe\n high?: Maybe\n low?: Maybe\n close?: Maybe\n volume?: Maybe\n afterHour?: string\n isSmallIndexChart?: boolean\n isNewestOHLC?: boolean\n directRender?: boolean\n time?: string\n changePercentage?: Maybe\n}\n\ninterface XAxisLabel {\n x: number\n text: string\n textWidth: number\n hasPriority?: boolean\n allowedOverflow?: number\n}\n\nconst getDateString = ({ date, timeframe }: { date: Date; timeframe: TIMEFRAME }) => {\n let dateString = ''\n const month = date.getMonth() // 20141126\n const year = date.getFullYear()\n const day = date.getDate()\n switch (timeframe) {\n case TIMEFRAME.i1:\n case TIMEFRAME.i2:\n case TIMEFRAME.i3:\n case TIMEFRAME.i5:\n case TIMEFRAME.i10:\n case TIMEFRAME.i15:\n case TIMEFRAME.i30:\n case TIMEFRAME.h:\n case TIMEFRAME.h2:\n case TIMEFRAME.h4:\n const t =\n (((date.getHours() + 11) % 12) + 1).toString().padLeft('00') +\n ':' +\n date.getMinutes().toString().padLeft('00') +\n (date.getHours() < 12 ? 'AM' : 'PM')\n dateString = `${MONTHS[month]} ${day} ${t}`\n break\n case TIMEFRAME.d:\n case TIMEFRAME.w:\n dateString = `${MONTHS[month]} ${day}`\n break\n case TIMEFRAME.m:\n dateString = `${MONTHS[month]} ${year}`\n break\n default:\n break\n }\n\n return dateString\n}\n\nconst getIsOverlapping = ({\n x,\n textWidth,\n renderedLabelRanges,\n}: {\n x: number\n textWidth: number\n renderedLabelRanges: Array<{ from: number; to: number }>\n}) =>\n renderedLabelRanges.some(({ from, to }) => {\n const minX = x - textWidth / 2\n const maxX = x + textWidth / 2\n return (from < maxX && maxX < to) || (from < minX && minX < to)\n })\n\nconst SMALL_INDEX_CHART_LABEL_BUFFER = 15\n\nconst gray300 = tailwindColors.gray[300]\n\nclass BaseChart extends Element {\n static initClass() {\n Object.defineProperty(this.prototype, 'width', {\n get() {\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\n return this.model.width - ChartSettings.left.width - ChartSettings.right.width\n },\n })\n\n Object.defineProperty(this.prototype, 'height', {\n get() {\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\n return this.paneModel.height - ChartSettings.top.height - ChartSettings.bottom.height\n },\n })\n }\n\n static getNumOfBarsBuffer({ overlays }: RequireByKey) {\n return Math.max(0, ...overlays.map((overlay) => overlaysByType[overlay.type].getNumOfBarsBuffer(overlay)))\n }\n\n static label = 'Chart'\n static iconName = ''\n\n paneModel: PaneModel\n model: Chart\n data: Quote\n specificChartFunctionality: SpecificChartFunctionality\n tickerWidth = 0\n changeWidth = 0\n lastOhlc: Array> = []\n overlays: Overlay[] = []\n isLargeChart?: boolean\n shouldRenderVolume = true\n afterChange: {\n x: number\n y: number\n width: number\n } | null = null\n\n declare setupAxisTimeFrame: string\n declare volumeFY: d3.ScaleLinear\n declare tickerText: Text\n declare baseCache: Cache\n declare leftOffset: number\n declare context: CanvasRenderingContext2D\n declare width: number\n declare height: number\n declare isMobile: boolean\n\n constructor(values: Partial, paneModel: PaneModel) {\n super(values, paneModel)\n\n this.paneModel = paneModel\n this.model = this.paneModel.chart()\n this.data = this.model.quote()\n const chartLayoutModel = this.model.chart_layout()\n this.specificChartFunctionality = chartLayoutModel.specificChartFunctionality\n this.isLargeChart = chartLayoutModel.isLargeChart\n this.isMobile = utils.isMobile(true)\n\n this.overlays = []\n if (values.overlays) {\n for (const overlayDefinition of values.overlays) {\n // overlayDefinition.color coming from DB is always string however overlays\n // internaly didn't use format as in db (type, color, period) but rather\n // more overlay specific parameters eg. (BB: topColor, bottomColor, etc.)\n // thus overlayDefinition.color might be undefined\n // approach could be reworked in https://github.com/finvizhq/charts/issues/770\n // but for now (!overlayDefinition.color) check solve issue as well\n const overlay = overlaysByType[overlayDefinition.type].fromObject(\n {\n ...overlayDefinition,\n color:\n !overlayDefinition.color || overlayDefinition.color.includes('|')\n ? ''\n : convertColorToHEX(overlayDefinition.color),\n },\n this.paneModel\n )\n this.addOverlay(overlay)\n }\n delete values.overlays\n }\n\n this.renderYAxis = this.renderYAxis.bind(this)\n this.renderText = this.renderText.bind(this)\n this.renderCrossText = this.renderCrossText.bind(this)\n this.setupCache = this.setupCache.bind(this)\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\n\n // this.paneModel.bind('update', this.setupAxis.bind(this))\n this.paneModel.bind('update', this.setupCache)\n this.paneModel.bind('change', this.trigger.bind(this, 'change'))\n this.model = this.paneModel.chart()\n // this.model.bind('change', this.setupAxis.bind(this))\n this.model.bind('change', this.setupCache)\n this.model.bind('change', this.trigger.bind(this, 'change'))\n this.model.bind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\n this.model.bind('destroy', () => {\n this.model.unbind('change', this.setupCache)\n this.model.unbind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\n mouseModel.unbind('change', mouseModelChangeHandler)\n unmountCanvas(this.baseCache.canvas)\n })\n mouseModel.bind('change', mouseModelChangeHandler)\n\n this.model.chart_layout().bind('theme', this.setupCache)\n this.model.chart_layout().bind('update', this.updateShouldRenderVolume.bind(this))\n\n this.setupCache()\n }\n\n renderChart() {\n throw Error('Implement renderChart')\n }\n\n render(context: CanvasRenderingContext2D) {\n this.data = this.model.quote()\n this.leftOffset = this.model.leftOffset\n this.context = context\n\n if (this.data.close.length === 0) {\n this.renderChartNotAvailable()\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\n return\n }\n\n this.context.save()\n this.clip()\n this.renderVolume()\n this.renderChart()\n this.renderOverlays()\n this.renderPrevClose()\n this.renderFadeExtendedHours()\n this.context.restore()\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\n }\n\n renderGrid(context: CanvasRenderingContext2D) {\n this.data = this.model.quote()\n this.leftOffset = this.model.leftOffset\n this.context = context\n // text, xAxis, volumeAxis\n this.renderXAxis()\n this.baseCache.render(context)\n }\n\n renderTicker(context: CanvasRenderingContext2D) {\n if (this.tickerText) {\n const { ChartSettings } = this.getChartLayoutSettings()\n context.translate(ChartSettings.left.width, 0)\n this.tickerText.render(context)\n\n if (getIsSmallIndexChart(this.specificChartFunctionality) && this.data.ticker === 'RUSSELL 2000') {\n const { Colors } = ChartSettings.general\n new Text(\n {\n text: 'ETF',\n x: ChartSettings.top.ticker.margin.left,\n y: ChartSettings.top.ticker.margin.top! + FONT_SIZE.XXS + OFFSET.XXS,\n font: { size: FONT_SIZE.XXS },\n fillStyle: Colors.text,\n textBaseline: ChartSettings.top.baseline,\n },\n this.paneModel\n ).render(context)\n }\n\n context.translate(-ChartSettings.left.width, 0)\n }\n }\n\n renderTimeframe(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const quote = this.model.quote()\n const y = (this.height - this.volumeFY.range()[1] - 4) / 2\n\n return new Text(\n {\n text: quote.instrument === Instrument.Group ? 'YEAR PERFORMANCE %' : getTimeframeLabel(quote.timeframe),\n x: ChartSettings.left.timeframe.margin.left,\n y: ChartSettings.top.height + y + (ChartSettings.left.timeframe.margin.top ?? 0),\n angle: -90,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.timeframe.font),\n fillStyle: Colors.textSecondary,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.alphabetic,\n },\n this.paneModel\n ).render(context)\n }\n\n renderText(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n context.save()\n context.translate(ChartSettings.left.width, 0)\n\n if (!getIsSmallIndexChart(this.specificChartFunctionality)) {\n this.tickerText = new Text(\n {\n text: this.data.name || this.data.ticker,\n x: ChartSettings.top.ticker.margin.left,\n y: ChartSettings.top.ticker.margin.top,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.ticker.font),\n textBaseline: ChartSettings.top.baseline,\n fillStyle: Colors.text,\n },\n this.paneModel\n )\n } else {\n this.tickerText = new Text(\n {\n text: this.data.name || this.data.ticker,\n x: ChartSettings.top.ticker.margin.left,\n y: ChartSettings.top.ticker.margin.top,\n font: { size: FONT_SIZE.L, style: 'bold' },\n fillStyle: Colors.text,\n },\n this.paneModel\n )\n }\n this.tickerWidth = this.tickerText.measure(context)\n\n // render watermark on backend chart\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\n new Text(\n {\n text: '© finviz.com',\n x: this.width + ChartSettings.right.width - 2,\n y: 1,\n font: { size: FONT_SIZE.XS },\n textAlign: TextAlign.right,\n textBaseline: TextBaseline.top,\n fillStyle: 'rgb(136, 193, 233)',\n },\n this.paneModel\n ).render(context)\n }\n\n if (!this.getIsRedesignedChart()) {\n this.renderChange({ context })\n if (!this.lastOhlc[0]) {\n this.getOHLC({ context, directRender: false })\n }\n this.getOHLC({ context })\n }\n\n context.restore()\n if (!this.getIsRedesignedChart() && !getIsSmallIndexChart(this.specificChartFunctionality)) {\n this.renderTimeframe(context)\n }\n }\n\n getOHLC({\n context,\n directRender = true,\n data,\n date,\n dateString = null,\n changePercentage = null,\n }: {\n context: CanvasRenderingContext2D\n directRender?: boolean\n data?: {\n open?: string\n high?: string\n low?: string\n close?: string\n volume?: string\n }\n date?: Date\n dateString?: string | null\n changePercentage?: ITickerChange | null\n }) {\n if (!this.data.lastDate) return\n\n // modulo \"parsing\" is 100% faster than with str.slice()\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${this.data.lastDate % 100}` // YYYYMMDD / 20211118 => Nov 18\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\n this.renderOHLC({\n context,\n date: lastDate,\n isSmallIndexChart: true,\n isNewestOHLC: true,\n directRender,\n })\n } else if (data && date) {\n this.renderOHLC({\n context,\n date: getDateString({ date, timeframe: this.data.timeframe }),\n open: data.open,\n high: data.high,\n low: data.low,\n close: data.close,\n volume: numberToStringWithUnitsSuffix(Number(data.volume)),\n directRender,\n changePercentage,\n })\n } else if (dateString !== null) {\n this.renderOHLC({\n context,\n date: dateString,\n open: null,\n high: null,\n low: null,\n close: null,\n volume: null,\n directRender,\n })\n } else {\n this.renderOHLC({\n context,\n date: lastDate,\n afterHour:\n Number.isFinite(this.data.afterClose) && this.data.afterClose !== this.data.lastClose\n ? this.roundOhlc(this.data.afterClose)\n : undefined,\n volume: numberToStringWithUnitsSuffix(this.data.lastVolume),\n isNewestOHLC: true,\n time: utils.dateFromUnixTimestamp(this.data.date.last()!).toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n }),\n directRender,\n ...this.getRoundedLastData(),\n })\n }\n }\n\n getRoundedLastData() {\n return {\n open: this.roundOhlc(this.data.lastOpen),\n high: this.roundOhlc(this.data.lastHigh),\n low: this.roundOhlc(this.data.lastLow),\n close: this.roundOhlc(this.data.lastClose),\n }\n }\n\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\n if (!this.getIsRedesignedChart()) {\n this.renderOverlaysLabelsQuotePage(context)\n } else if (this.data.close.length !== 0) {\n this.renderOverlaysLabelsChartsPage(context)\n }\n }\n\n renderOverlaysLabelsQuotePage(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const text = new Text(\n {\n x: ChartSettings.left.overlayLabel.margin.left,\n y: ChartSettings.top.height + ChartSettings.left.overlayLabel.margin.top!,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.overlayLabel.font),\n textBaseline: TextBaseline.top,\n },\n this.paneModel\n )\n for (const overlay of this.overlays) {\n if (!overlay.isRenderedOverlaysLabel()) {\n continue\n }\n text\n .set({\n text: overlay.toString(),\n y: text.get('y')! + ChartSettings.left.overlayLabel.labelSpacing,\n fillStyle: overlay.getLabelColor(),\n })\n .render(context)\n }\n }\n\n getYAxisLeftMargin() {\n if (this.data.instrument === Instrument.Crypto && this.data.lastClose <= 0.001) {\n return 3\n }\n return 8\n }\n\n getYAxisLastCloseLabel({ lastClose, firstVisibleClose }: { lastClose: number; firstVisibleClose?: number | null }) {\n if (typeof firstVisibleClose === 'number' && this.model.scale === ScaleType.Percentage) {\n return `${this.round(getPercentageFromValue({ number: lastClose, base: firstVisibleClose }), 2)}%`\n }\n return this.round(lastClose)\n }\n\n renderYAxis(\n context: CanvasRenderingContext2D,\n { lastClose }: RequireByKey, 'lastClose'> = this.data,\n renderLabels = true\n ) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const contentHeight = this.paneModel.height - ChartSettings.top.height - ChartSettings.bottom.height\n let y, lineTicks, textTicks, lastCloseLabel\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\n translate.do()\n const tickCount = Math.floor(this.paneModel.height / 35)\n const minMax = this.getMinMax()\n const { firstVisibleClose } = minMax\n let stepPrice = 0\n let placesAxis\n\n switch (this.model.scale) {\n case ScaleType.Percentage: {\n if (!firstVisibleClose) return\n\n const scaleRange = this.paneModel.scaleRange\n const { min, max } = scaleRange || minMax\n\n this.model.updateAttribute('firstBarClose', firstVisibleClose)\n\n const minPerc = getPercentageFromValue({ number: min, base: firstVisibleClose })\n const maxPerc = getPercentageFromValue({ number: max, base: firstVisibleClose })\n\n const percScale = d3.scaleLinear().range([0, contentHeight]).domain([maxPerc, minPerc]).nice(10)\n textTicks = percScale.ticks(Math.min(tickCount, 9))\n lineTicks = textTicks.map((tick) => getValueFromPercentage({ number: tick, base: firstVisibleClose }))\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\n break\n }\n case ScaleType.Logarithmic: {\n if (!firstVisibleClose) return\n\n const scaleRange = this.paneModel.scaleRange\n const { min, max } = scaleRange || minMax\n lineTicks = [Math.floor(min)]\n const pixelGap = 30\n\n const negativeScale = []\n if (min < 0) {\n let previousNegativeTick = Math.min(0, max)\n while (this.paneModel.scale.y(previousNegativeTick) + pixelGap < this.paneModel.scale.y(min)) {\n const tick = this.paneModel.scale.y.invert(this.paneModel.scale.y(previousNegativeTick) + pixelGap)\n const range = d3.nice(-previousNegativeTick, -tick, 2)\n previousNegativeTick = -range[range.length - 1]\n negativeScale.unshift(previousNegativeTick)\n }\n }\n\n const positiveScale = []\n if (max > 0) {\n positiveScale.push(Math.max(this.paneModel.scale.y.invert(this.paneModel.scale.y(min) + pixelGap), 0))\n }\n while (this.paneModel.scale.y(positiveScale[positiveScale.length - 1]) - pixelGap > 0) {\n const tick = this.paneModel.scale.y.invert(\n this.paneModel.scale.y(positiveScale[positiveScale.length - 1]) - pixelGap\n )\n const range = d3.nice(positiveScale[positiveScale.length - 1], tick, 2)\n positiveScale.push(range[range.length - 1])\n }\n lineTicks = [...negativeScale, ...positiveScale]\n textTicks = lineTicks\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\n break\n }\n default:\n // default to linear scale type\n lineTicks = this.paneModel.scale.y.ticks(Math.min(tickCount, 9))\n textTicks = lineTicks\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\n }\n\n if (textTicks.length >= 2) {\n stepPrice = Math.abs(textTicks[1] - textTicks[0])\n }\n if (stepPrice > 10 || getIsSmallIndexChart(this.specificChartFunctionality)) {\n placesAxis = 0\n }\n\n const getYLineText = (val: number, places?: number) => {\n switch (this.model.scale) {\n case ScaleType.Percentage:\n return `${val}%`\n default:\n return this.round(val, places)\n }\n }\n\n const yTickText = new Text(\n {\n x: this.width + this.getYAxisLeftMargin() + ChartSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n },\n this.paneModel\n )\n\n let yTickLine = this.getYLine()\n const resetYTicksStyles = () => {\n yTickText.set({\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n })\n yTickLine = this.getYLine()\n }\n for (let i = 0; i < lineTicks.length; i++) {\n y = Math.round(this.fy(lineTicks[i]))\n if (y < 0 || y > contentHeight) continue\n if (y === contentHeight) y -= 1 // due pixel perfect rendering of lines, last line is moved outside of \"chart area\" because of 0.5px translate, to compensate for this we subtract 1px\n yTickLine.set({ y1: y, y2: y })\n yTickText.set({\n text: getYLineText(textTicks[i], placesAxis),\n y,\n })\n if (this.model.scale === ScaleType.Percentage && textTicks[i] === 0) {\n yTickLine.set({ strokeStyle: Colors.text })\n yTickText.set({\n font: { weight: 'bold', size: yTickText.attrs.font.size },\n fillStyle: Colors.percentageZeroLineText,\n })\n yTickLine.render(context)\n yTickText.render(context)\n resetYTicksStyles()\n } else {\n yTickLine.render(context)\n yTickText.render(context)\n }\n }\n translate.undo()\n\n if (renderLabels) {\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: lastCloseLabel })\n // if (typeof this.data.afterClose === 'number') {\n // this.renderYAxisLabel({\n // context,\n // yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\n // mainLabelValue: lastClose,\n // secondaryLabelValue: this.data.afterClose,\n // }),\n // label: this.getYAxisLastCloseLabel({ lastClose: this.data.afterClose, firstVisibleClose }),\n // background: this.getSecondaryLabelBackgroundColor(),\n // })\n // }\n }\n }\n\n getSecondaryLabelBackgroundColor() {\n return stringifyHSVAColor(\n {\n ...getHSVAFromColor(this.getChartLayoutSettings().ChartSettings.general.Colors.currentBackground),\n s: 0.3,\n },\n 'hex'\n )\n }\n\n getYAxisSecondaryLabelYCoordinate({\n mainLabelValue,\n secondaryLabelValue,\n }: {\n mainLabelValue: number\n secondaryLabelValue: number\n }) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { lineHeight } = ChartSettings.right.axis.font\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\n\n const direction = Math.sign(mainLabelValue - secondaryLabelValue) || 1\n const offset = (lineHeight ?? LINE_HEIGHT.S) + (padding.top ?? PADDING.XXS) + (padding.bottom ?? PADDING.XXS)\n const mainLabelValuePosition = Math.round(this.fy(mainLabelValue))\n const secondaryLabelValuePosition = Math.round(this.fy(secondaryLabelValue))\n const offsetedY = mainLabelValuePosition + offset * direction\n\n return Math.abs(secondaryLabelValuePosition - mainLabelValuePosition) > offset\n ? secondaryLabelValuePosition\n : offsetedY\n }\n\n renderYAxisLabel({\n context,\n yCoordinate,\n label,\n background,\n }: {\n context: CanvasRenderingContext2D\n yCoordinate: number\n label: string\n background?: string\n }) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\n const { Colors } = ChartSettings.general\n const { size, lineHeight } = ChartSettings.right.axis.font\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\n\n translate.do()\n new Text(\n {\n text: label,\n x: this.width + this.getYAxisLeftMargin() - padding.left + ChartSettings.right.axis.margin.left!,\n y: yCoordinate,\n font: Text.getMergedPropsWithDefaults('font', { size, style: 'bold' }),\n lineHeight,\n padding,\n textBaseline: TextBaseline.middle,\n fillStyle:\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen ? 'black' : Colors.currentText,\n background: background || Colors.currentBackground,\n },\n this.paneModel\n ).render(context)\n translate.undo()\n }\n\n renderXAxis() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n this.context.save()\n if (\n this.data.getDrawDays() !== 1 &&\n !getIsSmallIndexChart(this.specificChartFunctionality) &&\n this.data.instrument !== Instrument.MarketSentiment\n ) {\n this.clip(true)\n }\n this.context.translate(ChartSettings.left.width, ChartSettings.top.height)\n const text = new Text(\n {\n y: this.height + ChartSettings.bottom.axis.margin.top!,\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.bottom.axis.font.size }),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.top,\n textAlign: TextAlign.center,\n },\n this.paneModel\n )\n switch (this.data.timeframe) {\n case TIMEFRAME.i1:\n case TIMEFRAME.i2:\n case TIMEFRAME.i3:\n case TIMEFRAME.i5:\n if (this.data.instrument === Instrument.Stock) {\n if (\n this.type === ChartElementType.LineChart &&\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen &&\n this.data.timeframe === 'i5'\n ) {\n this.render15MinXAxis(text)\n } else {\n this.renderIntradayXAxis(text)\n }\n } else {\n this.renderIntradayXAxisFutures(text)\n }\n break\n case TIMEFRAME.i10:\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\n this.renderIntradayXAxis(text)\n } else {\n this.render15MinXAxis(text)\n }\n break\n case TIMEFRAME.i15:\n case TIMEFRAME.i30:\n case TIMEFRAME.h:\n case TIMEFRAME.h2:\n case TIMEFRAME.h4:\n this.render15MinXAxis(text)\n break\n case TIMEFRAME.d:\n this.renderDailyXAxis(text)\n break\n case TIMEFRAME.w:\n this.renderWeeklyXAxis(text)\n break\n case TIMEFRAME.m:\n this.renderMonthlyXAxis(text)\n break\n default:\n break\n }\n this.context.restore()\n }\n\n isXPointVisible(x: number, buffer = 0) {\n return x >= 0 - buffer && x <= this.width + buffer\n }\n\n renderXAxisLabels({\n labels,\n textRenderer,\n allowedOverflow = 0,\n }: {\n labels: Omit[]\n textRenderer: Text\n allowedOverflow?: number\n }) {\n const sortedLabels: XAxisLabel[] = []\n const renderedLabelRanges: Array<{ from: number; to: number }> = []\n labels.reverse().forEach((label) => {\n textRenderer.set({ text: label.text })\n const textWidth = Math.floor(textRenderer.measure(this.context))\n const newLabel = { ...label, textWidth }\n if (label.hasPriority) {\n sortedLabels.unshift(newLabel)\n } else {\n sortedLabels.push(newLabel)\n }\n })\n\n sortedLabels.forEach(({ x, text, textWidth }) => {\n if (!this.isXPointVisible(x, allowedOverflow)) {\n return\n }\n const halfOfTextWidth = textWidth / 2\n const overflowLeft = x - halfOfTextWidth + allowedOverflow\n const overflowRight = this.width - (x + halfOfTextWidth) + allowedOverflow\n let labelX = x\n if (overflowLeft < 0) {\n labelX = Math.round(x - overflowLeft)\n } else if (overflowRight < 0) {\n labelX = Math.round(x + overflowRight)\n }\n if (getIsOverlapping({ x: labelX, textWidth, renderedLabelRanges })) {\n return\n }\n renderedLabelRanges.push({\n from: labelX - halfOfTextWidth - OFFSET.M,\n to: labelX + halfOfTextWidth + OFFSET.M,\n })\n textRenderer.set({ text, x: labelX })\n textRenderer.render(this.context)\n })\n }\n\n renderIntradayXAxis(text: Text) {\n const interval = IntradayTimeframeInterval[this.data.timeframe as keyof typeof IntradayTimeframeInterval]\n const marketStartHour = ~~(this.data.marketStartMinutes / 60)\n let marketEndHour = 15 + Math.ceil(this.data.aftermarketLengthMinutes / 60)\n const labels = []\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\n marketEndHour = 16\n }\n\n const xLine = this.getXLine()\n const barWidth = getBarWidthWithMargin({\n zoomFactor: this.model.zoomFactor,\n chartLayout: this.model.chart_layout(),\n })\n\n const dayToOffset = this.data.getDayToOffset()\n const isSmallIndexChart = getIsSmallIndexChart(this.specificChartFunctionality)\n const allowedOverflow = isSmallIndexChart ? SMALL_INDEX_CHART_LABEL_BUFFER : 0\n for (const day in dayToOffset) {\n const dayIndex = dayToOffset[day]\n const date = dateFromDateString(day)\n\n for (let i = marketStartHour; i <= marketEndHour; i++) {\n let x =\n ((i * 60 - this.data.marketStartMinutes) / interval) * barWidth +\n dayIndex * (this.data.drawMinutesPerDay / interval) * barWidth +\n this.leftOffset\n if (!this.isXPointVisible(x, allowedOverflow)) {\n continue\n }\n let roundedX = Math.round(x)\n\n if (i === marketStartHour) {\n if (isSmallIndexChart) {\n roundedX = Math.round(x - 3 + (30 / interval) * barWidth)\n // ~9:30AM\n xLine\n .set({\n x1: roundedX,\n x2: roundedX,\n })\n .render(this.context)\n continue\n }\n if (this.data.premarketLengthMinutes === 0) {\n // If there is no premarket, day starts at 9:30 AM\n x += (30 / interval) * barWidth\n }\n roundedX = Math.round(x)\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\n labels.push({\n hasPriority: true,\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\n x: roundedX,\n })\n } else {\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\n labels.push({\n text: ((i + 11) % 12) + 1 + (i < 12 ? 'AM' : 'PM'),\n x: roundedX,\n })\n }\n }\n }\n this.renderXAxisLabels({ labels, textRenderer: text, allowedOverflow })\n }\n\n renderIntradayXAxisFutures(textRenderer: Text) {\n let lastDay = ''\n let lastHours = NaN\n\n const labels = []\n const xLine = this.getXLine()\n for (let i = 0; i < this.data.date.length; i++) {\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\n const day = date.getDate() + '-' + date.getMonth()\n const hours = date.getHours()\n const x = Math.round(this.fx(i) + this.leftOffset)\n\n if (day !== lastDay) {\n lastDay = day\n lastHours = hours\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({\n x,\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\n })\n } else if (hours % 2 === 0 && hours !== lastHours) {\n lastHours = hours\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({ x, text: ((hours + 11) % 12) + 1 + (hours < 12 ? 'AM' : 'PM') })\n }\n }\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n render15MinXAxis(textRenderer: Text) {\n let lastDay = ''\n let x = 0\n\n const labels = []\n const xLine = this.getXLine()\n for (let i = 0; i < this.data.date.length; i++) {\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\n const day = date.getDate() + '-' + date.getMonth()\n if (day !== lastDay) {\n lastDay = day\n if (this.data.instrument === Instrument.Stock) {\n const barAtMinute = date.getMinutes() + date.getHours() * 60\n const indexOffset = (barAtMinute - this.data.marketStartMinutes) / this.data.interval\n x = Math.round(this.paneModel.scale.x(this.data.barIndex[i] - indexOffset) + this.leftOffset)\n } else {\n x = Math.round(this.fx(i) + this.leftOffset)\n }\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\n x,\n })\n }\n }\n\n // Offscreen only - if lastDate !== lastBarDate add tick\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${(this.data.lastDate % 100)\n .toString()\n .padLeft('00')}` // YYYYMMDD / 20211118 => Nov 18\n\n if (labels.length > 0 && labels[labels.length - 1].text !== lastDate) {\n const barsInDay = this.data.getBarsInDay()!\n const barWidth = getBarWidthWithMargin({\n zoomFactor: this.model.zoomFactor,\n chartLayout: this.model.chart_layout(),\n })\n const dayWidth = barsInDay * barWidth\n x += dayWidth\n labels.push({\n text: lastDate,\n x,\n })\n xLine.set({ x1: x, x2: x }).render(this.context)\n }\n }\n\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n renderDailyXAxis(textRenderer: Text) {\n let lastMonth = ''\n\n const labels = []\n const xLine = this.getXLine()\n for (let i = 0; i < this.data.date.length; i++) {\n const date = new Date(this.data.date[i] * 1000)\n const month = date.getMonth() + '-' + date.getFullYear()\n if (month !== lastMonth) {\n lastMonth = month\n const x = Math.round(this.fx(i) + this.leftOffset)\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({\n hasPriority: date.getMonth() === 0,\n text: date.getMonth() === 0 ? date.getFullYear().toString() : MONTHS[date.getMonth()],\n x,\n })\n }\n }\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n renderWeeklyXAxis(textRenderer: Text) {\n let lastMonth = ''\n\n const labels = []\n const xLine = this.getXLine()\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\n for (let i = 0; i < this.data.date.length; i++) {\n const date = new Date(this.data.date[i] * 1000)\n const month = date.getMonth() + '-' + date.getFullYear()\n if (month !== lastMonth) {\n lastMonth = month\n const x = Math.round(this.fx(i) + this.leftOffset)\n if (!this.isXPointVisible(x)) {\n continue\n }\n if (date.getMonth() % 3 === 0) {\n xLine.set({ x1: x, x2: x }).render(this.context)\n } else {\n new Line(\n {\n x1: x,\n x2: x,\n y1: 0,\n y2: this.height,\n strokeStyle: Colors.gridSecondary,\n dashLength: 3,\n },\n this.paneModel\n ).render(this.context)\n }\n const isYearLabel = date.getMonth() === 0\n labels.push({\n text: isYearLabel ? date.getFullYear().toString().substring(2) : MONTHS[date.getMonth()][0],\n hasPriority: isYearLabel,\n x,\n })\n }\n }\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n renderMonthlyXAxis(textRenderer: Text) {\n let lastYear = null\n\n const labels = []\n const xLine = this.getXLine()\n for (let i = 0; i < this.data.date.length; i++) {\n const date = new Date(this.data.date[i] * 1000)\n const year = date.getFullYear()\n const isJanuary = date.getMonth() === 0\n if (year !== lastYear && (labels.length !== 0 || isJanuary)) {\n lastYear = year\n const x = Math.round(this.fx(i) + this.leftOffset)\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({\n text: date.getFullYear().toString(),\n x,\n })\n }\n }\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n handleIndicatorsChange() {\n this.updateShouldRenderVolume()\n this.setupCache()\n this.trigger('change')\n }\n\n updateShouldRenderVolume() {\n this.shouldRenderVolume = !this.model.chart_layout().getIsIndicatorPresent(IndicatorType.Vol)\n }\n\n getVolumeTicks(count: number, maxHeight: number, fontHeight: number): number[] {\n const maxCount = 5\n const minCount = 1\n if (count > maxCount) {\n count = maxCount\n }\n const ticks = this.volumeFY.ticks(count).filter((tick) => tick !== 0)\n if (count <= minCount) {\n return [ticks[ticks.length - 1]]\n }\n // ticks are rendered on middle line so we have +- 1/2 of font size above and below range[min,max]\n // so we already have +-1 fontsize space, but in some cases that wouldn't be enough so we need to scale\n // dynamically, we add 3px of space per tick gap\n if (ticks.length * fontHeight + (ticks.length - 1) * 3 > maxHeight) {\n return this.getVolumeTicks(count - 1, maxHeight, fontHeight)\n }\n return ticks\n }\n\n renderVolumeAxis(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\n context.save()\n const relativeVolume = Math.max(0, Math.min(2, this.data.relativeVolume))\n\n const x = 20\n const fy = (y: number) => ChartSettings.top.height + this.height - this.height * (0.5 * y)\n const height = this.height * (0.5 * relativeVolume)\n\n const label = new Text(\n {\n x: 15,\n font: { size: 8 },\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n textAlign: TextAlign.right,\n },\n this.paneModel\n )\n for (let i = 0.5; i <= 2; i += 0.5) {\n const y = Math.round(fy(i))\n label\n .set({\n text: i.toFixed(1),\n y: y,\n })\n .render(context)\n\n context.set('strokeStyle', 'rgb(130, 130, 130)')\n context.beginPath()\n context.setLineDash([2, 3])\n context.translate(0, 0.5)\n context.moveTo(x, y)\n context.lineTo(x + 7, y)\n context.translate(0, -0.5)\n context.stroke()\n }\n\n context.set('fillStyle', 'rgba(0, 135, 255, 0.58)')\n context.set('lineWidth', 1)\n context.set('strokeStyle', Colors.grid)\n context.setLineDash([])\n\n context.fillRect(x, Math.round(ChartSettings.top.height + this.height - height), 7, Math.round(height))\n context.translate(0.5, 0.5)\n context.strokeRect(x, ChartSettings.top.height, 7, this.height)\n context.translate(-0.5, -0.5)\n\n new Text(\n {\n text: 'RELATIVE\\nVOLUME',\n x: 33,\n y: ChartSettings.top.height + this.height + 6,\n font: { size: FONT_SIZE.XXS },\n lineHeight: LINE_HEIGHT.XS,\n fillStyle: Colors.text,\n textBaseline: TextBaseline.top,\n textAlign: TextAlign.right,\n },\n this.paneModel\n ).render(context)\n context.restore()\n return\n }\n const rangeMax = this.volumeFY.range()[1]\n const volumeAxisFontSize = ChartSettings.left.volumeAxis.font.size!\n const tickCount = Math.floor(rangeMax / volumeAxisFontSize)\n const ticks = this.getVolumeTicks(tickCount, rangeMax, volumeAxisFontSize)\n const format = this.volumeFY.tickFormat(4, 's')\n const text = new Text(\n {\n x: ChartSettings.left.volumeAxis.margin.left,\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.left.volumeAxis.font.size }),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n textAlign: TextAlign.right,\n },\n this.paneModel\n )\n ticks.forEach((tick) =>\n text\n .set({\n text: format(tick).replace(/G/, 'B'), // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\n y: ChartSettings.top.height + this.height - this.volumeFY(tick),\n })\n .render(context)\n )\n }\n\n renderVolume() {\n if (!this.shouldRenderVolume) return\n\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n // Return if the domain bounds are equal, this would put any value in the middle\n const [domainFrom, domainTo] = this.volumeFY.domain()\n if (this.setupAxisTimeFrame !== this.data.timeframe || domainFrom === domainTo) {\n return\n }\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height + this.height - 59,\n })\n translate.do()\n const halfBarWidth = this.getHalfBarWidth()\n const barWidthWithoutMargin = this.getBarWithoutMarginWidth()\n drawInVisibleArea({\n quote: this.data,\n scale: this.paneModel.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i, x) => {\n // Skip render if the value is <= 0\n if (this.data.volume[i] <= 0) {\n return\n }\n\n this.context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\n const y = Math.round(this.volumeFY(this.data.volume[i]))\n this.context.fillRect(x - halfBarWidth, 60, barWidthWithoutMargin, -y)\n },\n })\n translate.undo()\n }\n\n renderOverlays() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n for (const overlay of this.overlays) {\n overlay.renderContent(this.context)\n }\n translate.undo()\n }\n\n renderCross(context: CanvasRenderingContext2D) {\n const isRendered = renderCross({\n context,\n mouseModel,\n paneModel: this.paneModel,\n contentWidth: this.width,\n contentHeight: this.height,\n quote: this.data,\n getRoundDecimalPlaces: (price) => this.getPlacesLastClose(price),\n onRenderCrossText: !this.getIsRedesignedChart() ? this.renderCrossText : undefined,\n })\n if (this.getIsRedesignedChart()) {\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.paneModel))\n }\n\n if (isRendered !== undefined) {\n setElementCursor({\n elementId: this.model.chart_layout().getHTMLElementId(),\n cursor: isRendered ? 'crosshair' : 'default',\n conditionalCursor: 'grabbing',\n })\n }\n }\n\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\n const n = this.data.getDataByBarIndex(key, crossIndex)\n if (n !== null) {\n return shouldReturnRoundedString ? this.roundOhlc(n) : `${n}`\n }\n }\n\n getCrossIndexChange(crossIndex: number) {\n const crossDataIndex = this.data.getDataIndexByBarIndex(crossIndex)\n const crossClose = this.data.close[crossDataIndex] ?? null\n const previousClose = this.data.close[crossDataIndex - 1] ?? null\n if (crossClose !== null && previousClose !== null) {\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\n }\n\n return null\n }\n\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\n const { ChartSettings } = this.getChartLayoutSettings()\n context.save()\n context.translate(ChartSettings.left.width, 0)\n\n if (this.getIsRedesignedChart()) {\n this.renderOverlaysLabels(context)\n if (Number.isNaN(crossIndex)) {\n this.getOHLC({ context })\n context.restore()\n return\n }\n }\n\n const dateByBarIndex = this.data.getDataByBarIndex('date', crossIndex)\n const date = dateByBarIndex ? utils.dateFromUnixTimestamp(dateByBarIndex) : null\n\n if (date === null) {\n const virtualTradedDates =\n this.data.date.length > 0\n ? getVirtualTimeframeTradedDates({\n dateStart: this.data.date[0],\n dateEnd: this.data.date[this.data.date.length - 1],\n quote: this.data,\n })\n : []\n this.getOHLC({\n context,\n dateString: virtualTradedDates[crossIndex]\n ? getDateString({\n date: utils.dateFromUnixTimestamp(virtualTradedDates[crossIndex]),\n timeframe: this.data.timeframe,\n })\n : null,\n })\n context.restore()\n return\n }\n\n this.getOHLC({\n context,\n date,\n data: {\n open: this.getDataByCrossIndex(crossIndex, 'open'),\n high: this.getDataByCrossIndex(crossIndex, 'high'),\n low: this.getDataByCrossIndex(crossIndex, 'low'),\n close: this.getDataByCrossIndex(crossIndex, 'close'),\n volume: this.getDataByCrossIndex(crossIndex, 'volume', false),\n },\n changePercentage: this.getCrossIndexChange(crossIndex),\n })\n\n context.restore()\n }\n\n renderChange({ context }: { context: CanvasRenderingContext2D }) {\n const CHANGE_SPACER = 10\n const { ChartSettings } = this.getChartLayoutSettings()\n const { ticker, change, ohlc } = ChartSettings.top\n const { tickerChange, tickerAfterChange } = getTickerChange({ data: this.data })\n\n if (!tickerChange) {\n return\n }\n\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\n const isGroupInstrument = this.data.instrument === Instrument.Group\n const changeText = new Text(\n {\n text: isOffscreen && isGroupInstrument ? tickerChange.percentString : tickerChange.string,\n x: !getIsSmallIndexChart(this.specificChartFunctionality)\n ? this.width - ChartSettings.top.change.margin.right!\n : this.width,\n y: ChartSettings.top.change.margin.top,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\n textAlign: TextAlign.right,\n textBaseline: ChartSettings.top.baseline,\n fillStyle: getChangeColor({ change: tickerChange.points, ChartSettings }),\n },\n this.paneModel\n )\n this.changeWidth = changeText.measure(context)\n changeText.render(context)\n\n if (isOffscreen && (!this.isLargeChart || isGroupInstrument)) {\n return\n }\n if (tickerAfterChange) {\n const afterChangeText = new Text(\n {\n text: tickerAfterChange?.string,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\n textAlign: TextAlign.right,\n textBaseline: ChartSettings.top.baseline,\n fillStyle: getChangeColor({ change: tickerAfterChange.points, ChartSettings }),\n },\n this.paneModel\n )\n const afterChangeTextWidth = afterChangeText.measure(context)\n const oneLineAHChangeWidth = this.changeWidth + CHANGE_SPACER + afterChangeTextWidth\n\n if (\n ChartSettings.left.width + this.tickerWidth + ticker.margin.left! + OFFSET.S <\n ChartSettings.left.width + this.width - oneLineAHChangeWidth - change.margin.right!\n ) {\n afterChangeText\n .set({\n x: this.width - ChartSettings.top.change.margin.right! - this.changeWidth - CHANGE_SPACER,\n y: ChartSettings.top.change.margin.top,\n })\n .render(context)\n this.afterChange = null\n this.changeWidth = oneLineAHChangeWidth\n } else if (\n this.lastOhlc[0] &&\n ChartSettings.left.width +\n this.tickerWidth +\n ticker.margin.left! +\n this.lastOhlc[0].width! +\n ohlc.margin.left! +\n ohlc.margin.right! <\n ChartSettings.left.width + this.width - afterChangeTextWidth - change.margin.right!\n ) {\n afterChangeText\n .set({\n x: this.width - ChartSettings.top.change.margin.right!,\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\n })\n .render(context)\n this.changeWidth = Math.max(this.changeWidth, afterChangeTextWidth)\n this.afterChange = {\n x: this.width - ChartSettings.top.change.margin.right!,\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\n width: afterChangeTextWidth,\n }\n }\n }\n }\n\n renderOHLC(parameters: IRenderOHLCParameters) {\n if (!this.getIsRedesignedChart()) {\n this.renderOHLCQuotePage(parameters)\n } else {\n this.renderOHLCChartsPage(parameters)\n }\n }\n\n renderOHLCChartsPage({ context, date, open, high, low, close, volume, changePercentage }: IRenderOHLCParameters) {\n const chartBreakpoints = getChartBreakpoints(this.width)\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n\n const OhlcText = new Text(\n {\n font: { size: FONT_SIZE.S },\n lineHeight: 18,\n fillStyle: Colors.text,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\n },\n this.paneModel\n )\n\n const dateElements = date ? [{ text: date, color: gray300 }] : []\n const trendColor = (open ?? 0) > (close ?? 0) ? tailwindColors.red[400] : tailwindColors.green[400]\n const oElements = open\n ? [\n { text: 'O', color: gray300 },\n { text: open, color: trendColor },\n ]\n : []\n const hElements = high\n ? [\n { text: 'H', color: gray300 },\n { text: high, color: trendColor },\n ]\n : []\n const lElements = low\n ? [\n { text: 'L', color: gray300 },\n { text: low, color: trendColor },\n ]\n : []\n const cElements = close\n ? [\n { text: 'C', color: gray300 },\n { text: close, color: trendColor },\n ]\n : []\n const volElements = volume\n ? [\n { text: 'Vol', color: gray300 },\n { text: volume, color: trendColor },\n ]\n : []\n const changeElements = changePercentage != null ? [{ text: changePercentage.string, color: trendColor }] : []\n\n const lines: OhlcLineElements[] = []\n\n const getFlatLineArrayWithSpaces = (lineElements: OhlcLineElements[]) =>\n lineElements.flatMap((elements, index) =>\n index > 0 ? ([...(elements.length > 0 ? ['space'] : []), ...elements] as OhlcLineElements) : elements\n )\n if (chartBreakpoints.isM) {\n lines.push(\n getFlatLineArrayWithSpaces([\n dateElements,\n oElements,\n hElements,\n lElements,\n cElements,\n volElements,\n changeElements,\n ])\n )\n } else if (chartBreakpoints.isS) {\n lines.push(getFlatLineArrayWithSpaces([dateElements, changeElements]))\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements, volElements]))\n } else {\n lines.push(getFlatLineArrayWithSpaces([dateElements, volElements, changeElements]))\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements]))\n }\n\n const startX = OFFSET.M - ChartSettings.left.width\n let x = startX\n let y = OFFSET.M + OhlcText.attrs.lineHeight / 2\n\n lines.forEach((line) => {\n x = startX\n line.forEach((lineElement, index, lineElements) => {\n const padding = { left: 1, right: 1, top: 0, bottom: 0 }\n const { text = '', color = undefined } = lineElement === 'space' ? {} : lineElement\n if (index === 0) {\n padding.left = 5\n } else if (index === lineElements.length - 1) {\n padding.right = 5\n } else if (lineElement === 'space') {\n padding.left = 7\n padding.right = 7\n if (!chartBreakpoints.isS) {\n padding.left = 5\n padding.right = 5\n }\n }\n OhlcText.set({ text, fillStyle: color, x, y, padding })\n OhlcText.render(context)\n x += OhlcText.width\n })\n y += OhlcText.attrs.lineHeight\n })\n }\n\n renderOverlaysLabelsChartsPage(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const chartBreakpoints = getChartBreakpoints(this.width)\n const LabelsText = new Text(\n {\n font: { size: FONT_SIZE.S },\n lineHeight: 18,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n background: getHEXWithSpecificAplha(ChartSettings.general.Colors.canvasFill, 0.8),\n // this function gets (indirectly) called from renderCrossText which is already \"translateX\" by ChartSettings.left.width\n x: OFFSET.M - ChartSettings.left.width,\n padding: { left: PADDING.S, right: PADDING.S, top: 0, bottom: 0 },\n },\n this.paneModel\n )\n\n let numberOfNewOhlcLines = 2\n if (chartBreakpoints.isM) {\n numberOfNewOhlcLines = 1\n } else if (chartBreakpoints.isS) {\n numberOfNewOhlcLines = 2\n }\n\n // We assume lineheight is the same as OHLC text\n const { lineHeight } = LabelsText.attrs\n let y = lineHeight * numberOfNewOhlcLines + lineHeight / 2 + OFFSET.M\n\n for (const overlay of this.overlays) {\n if (!overlay.isRenderedOverlaysLabel()) {\n continue\n }\n LabelsText.set({\n text: overlay.toString(),\n y,\n fillStyle: overlay.getLabelColor(),\n }).render(context)\n y += lineHeight\n }\n }\n\n renderOHLCQuotePage({\n context,\n date,\n open,\n high,\n low,\n close,\n volume,\n afterHour,\n isSmallIndexChart = false,\n isNewestOHLC = false,\n time,\n directRender = false,\n changePercentage,\n }: IRenderOHLCParameters) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const { ohlc } = ChartSettings.top\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\n const isGroupInstrument = this.data.instrument === Instrument.Group\n if (isOffscreen && isGroupInstrument) {\n ohlc.type = OHLCType.dateOnly\n } else if (isOffscreen && this.data.instrument !== Instrument.Stock && time) {\n ohlc.type = OHLCType.timeOnly\n }\n\n const lineTopY = ohlc.type ? ohlc.margin.top : ohlc.margin.top! - ChartSettings.top.ticker.font.size!\n const OHLCFontSize = ohlc.font.size!\n const centerXOffset =\n this.tickerWidth +\n ChartSettings.top.ticker.margin.left! +\n (this.width -\n (this.tickerWidth +\n ChartSettings.top.ticker.margin.left! +\n this.changeWidth +\n (isSmallIndexChart ? 0 : ChartSettings.top.change.margin.right!))) / // smallIndexChart don't have change.margin.right\n 2\n const leftXOffset = this.tickerWidth + ChartSettings.top.ticker.margin.left! + ohlc.margin.left!\n const hasOhlc = ![open, high, low, close, volume].some((ohlcString) => !ohlcString)\n const OHLC = hasOhlc\n ? {\n date: [date ?? ''],\n singleLine: [\n `${date} O:${open} H:${high} L:${low} C:${close}${\n afterHour ? ` AH:${afterHour}` : ''\n } Vol:${volume} `,\n /*\n * this is needed because of the way we render ohlc text down below in renderOHLCToCanvas\n * undefined is used instead of null because TS had some issues with `null` even if it is filtered out\n * */\n changePercentage ? changePercentage.string : undefined,\n ].filter((value) => value !== undefined),\n }\n : {\n date: [date ?? ''],\n singleLine: [`${date ?? ''}`],\n }\n\n const OHLC_TEXT = new Text(\n {\n font: { size: OHLCFontSize },\n },\n this.paneModel\n )\n\n const getOHLCType = () => {\n if (!isSmallIndexChart) {\n return OHLCType.singleLine\n }\n return OHLCType.dateOnly\n }\n\n const getOHLCSettings = () => {\n switch (ohlc.type || getOHLCType()) {\n case OHLCType.singleLine:\n return {\n text: OHLC.singleLine,\n x: [leftXOffset, leftXOffset],\n y: [ohlc.margin.top],\n textAlign: TextAlign.left,\n textBaseline: [TextBaseline.alphabetic],\n }\n case OHLCType.dateOnly:\n if (isOffscreen && isGroupInstrument) {\n const text = `${OHLC.date} Volume: ${volume}`\n const textWidth = OHLC_TEXT.set({ text }).measure(context)\n return {\n text: [text],\n x: [\n this.width - ChartSettings.top.change.margin.right! - this.changeWidth - textWidth - CHART_MARGIN.XXL,\n ],\n y: [ohlc.margin.top],\n textAlign: TextAlign.center,\n textBaseline: [TextBaseline.alphabetic],\n }\n } else if (isSmallIndexChart) {\n return {\n text: OHLC.date,\n x: [centerXOffset],\n y: [ohlc.margin.top],\n textAlign: TextAlign.center,\n textBaseline: [TextBaseline.alphabetic],\n }\n } else {\n const isEnoughSpace =\n this.width -\n (this.tickerWidth +\n ChartSettings.top.ticker.margin.left! +\n ohlc.margin.left! +\n ohlc.margin.right! +\n this.changeWidth +\n ChartSettings.top.change.margin.right!) >\n OHLC_TEXT.set({ text: OHLC.date[0] }).measure(context)\n const alignTop = !isEnoughSpace || ohlc.font.baseline === TextBaseline.top\n return {\n text: OHLC.date,\n x: [leftXOffset],\n y: alignTop ? [lineTopY] : [ohlc.margin.top],\n textAlign: TextAlign.left,\n textBaseline: alignTop ? [TextBaseline.top] : [TextBaseline.alphabetic],\n }\n }\n case OHLCType.timeOnly:\n return {\n text: [time],\n x: [centerXOffset - OHLC_TEXT.set({ text: time }).measure(context) / 2],\n y: [lineTopY],\n textAlign: TextAlign.center,\n textBaseline: [ohlc.font.baseline],\n }\n default:\n return\n }\n }\n\n if (!isNewestOHLC) {\n context.fillStyle = Colors.canvasFill\n this.lastOhlc.forEach((line) => {\n const x = (line.textAlign === TextAlign.left ? line.x : line.x! - line.width! / 2)!\n const y = (line.textBaseline === TextBaseline.top ? line.y : line.y! - OHLCFontSize)!\n context.fillRect(\n x - PADDING.XXS,\n y - PADDING.XXS,\n PADDING.XXS + line.width! + PADDING.XXS,\n PADDING.XXS + OHLCFontSize + PADDING.XXS\n )\n })\n\n if (this.afterChange) {\n context.fillRect(\n this.afterChange.x - this.afterChange.width - PADDING.XXS,\n this.afterChange.y - ChartSettings.top.change.font.size! - PADDING.XXS,\n PADDING.XXS + this.afterChange.width + PADDING.XXS,\n PADDING.XXS + ChartSettings.top.change.font.size! + PADDING.XS\n )\n }\n } else {\n this.lastOhlc = []\n }\n\n const ohlcSettings = getOHLCSettings()\n\n const renderOHLCToCanvas = ({\n ohlcSet,\n render = true,\n }: {\n ohlcSet?: {\n text: (string | undefined)[]\n x: number[]\n y: (number | undefined)[]\n textAlign: TextAlign\n textBaseline: (TextBaseline | undefined)[]\n }\n render?: boolean\n }) => {\n const isSingleLineWithChange = (ohlc.type || getOHLCType()) === OHLCType.singleLine && changePercentage\n ohlcSet?.text.forEach((line: string | undefined, index: number) => {\n let i = index\n let leftOffset = 0\n let fillStyle = Colors.text\n let text = line\n if (index > 0 && isSingleLineWithChange) {\n i -= 1\n leftOffset = OHLC_TEXT.measure(context)\n text = line\n\n fillStyle = getChangeColor({ change: changePercentage.points, ChartSettings })\n }\n const options = {\n text,\n x: ohlcSet.x[i] + leftOffset,\n y: ohlcSet.y[i],\n textBaseline: ohlc.font.baseline ? ohlc.font.baseline : ohlcSet.textBaseline[i],\n textAlign: ohlc.font.textAlign ? ohlc.font.textAlign : ohlcSet.textAlign,\n fillStyle,\n }\n OHLC_TEXT.set(options)\n if (isNewestOHLC) {\n this.lastOhlc[i] = { width: OHLC_TEXT.measure(context), ...options }\n }\n if (render) {\n OHLC_TEXT.render(context)\n }\n })\n }\n renderOHLCToCanvas({ ohlcSet: ohlcSettings, render: directRender })\n\n return {\n ohlcSettings,\n renderOHLCToCanvas,\n }\n }\n\n // only for stocks on i1/i3/i5 and one day view\n renderFadeExtendedHours() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const period = this.model.quote().timeframe\n if (this.data.instrument !== Instrument.Stock) {\n return\n }\n if (![TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5].includes(period)) {\n return\n }\n\n const interval = parseInt(period.substring(1), 10)\n const dayToOffset = this.data.getDayToOffset()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n const halfBarWidth = this.getHalfBarWidth()\n for (const day in dayToOffset) {\n // todo aftermarket\n const dayIndex = dayToOffset[day]\n let n0 = (this.data.drawMinutesPerDay / interval) * dayIndex\n let n1 = this.data.premarketLengthMinutes / interval + n0 // bars in 90mins from 8am to 9:30am\n let x0 = this.paneModel.scale.x(n0) - halfBarWidth\n let width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\n this.context.set('fillStyle', Colors.premarketFade)\n this.context.fillRect(x0, 0, width, this.height + 1)\n\n if (this.data.aftermarketLengthMinutes > 0) {\n n0 =\n (this.data.drawMinutesPerDay / interval) * dayIndex +\n (this.data.drawMinutesPerDay - this.data.aftermarketLengthMinutes) / interval\n n1 = this.data.aftermarketLengthMinutes / interval + n0 // bars in 90mins from 4pm to 5:30pm\n x0 = this.paneModel.scale.x(n0) - halfBarWidth\n width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\n\n this.context.set('fillStyle', Colors.aftermarketFade)\n this.context.fillRect(x0, 0, width, this.height + 1)\n }\n }\n translate.undo()\n }\n\n shouldShowPrevClose() {\n const quote = this.model.quote()\n const isStock = quote.instrument === Instrument.Stock\n const isIntradayWithPreMarket = TIMEFRAMES_WITH_PRE_MARKET.includes(quote.timeframe)\n const isIndexChart = this.specificChartFunctionality === SpecificChartFunctionality.smallIndex\n\n return isStock && (isIntradayWithPreMarket || isIndexChart)\n }\n\n renderPrevClose() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n if (!this.shouldShowPrevClose()) {\n return\n }\n const translate = getTranslate({\n context: this.context,\n xOffset: ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n\n const y = Math.round(this.fy(this.model.quote().prevClose))\n new Line(\n {\n x1: 0,\n x2: this.width,\n y1: y,\n y2: y,\n strokeStyle: Colors.prevClose,\n dashLength: 3,\n },\n this.paneModel\n ).render(this.context)\n translate.undo()\n }\n\n renderChartNotAvailable() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const x = ~~((ChartSettings.left.width + ChartSettings.right.width + this.width) / 2)\n const y = ~~((ChartSettings.top.height + ChartSettings.bottom.height + this.height) / 2)\n new Text(\n {\n text: 'Chart not available',\n x,\n y,\n font: { size: FONT_SIZE.M, style: 'bold' },\n fillStyle: Colors.text,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.middle,\n },\n this.paneModel\n ).render(this.context)\n }\n\n // private\n setupCache() {\n const { ChartSettings } = this.getChartLayoutSettings()\n /*\n * Don't create new Cache instances, because Safari takes too long to free up memory\n * leading to canvas.getContext returning null. https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\n *\n * To further improve performance, cache.set shouldn't be called when unnecessary,\n * because setupCache is called for many model updates. The same applies for indicators/indicator.js.\n */\n this.baseCache = this.baseCache || new Cache()\n\n this.baseCache.set(\n (context: CanvasRenderingContext2D) => {\n if (this.data.close.length === 0) {\n this.renderText(context)\n return\n }\n this.renderYAxis(context)\n this.renderText(context)\n if (!this.getIsMobileChartPage() && this.shouldRenderVolume) {\n this.renderVolumeAxis(context)\n }\n if (!this.getIsRedesignedChart()) {\n this.renderOverlaysLabels(context)\n }\n },\n this.width + ChartSettings.left.width + ChartSettings.right.width,\n this.height + ChartSettings.top.height + ChartSettings.bottom.height\n )\n }\n\n // called by controllers/pane on recountScale\n setupAxis(fx: ScaleAxis) {\n this.data = this.model.quote()\n const { volumeHeight } = this.getChartLayoutSettings().ChartSettings.center\n\n if (typeof fx !== 'function') {\n return\n }\n\n const halfBarWidth = this.getHalfBarWidth()\n\n const volumes = []\n for (let i = 0; i < this.data.volume.length; i++) {\n const x = fx(this.data.barIndex[i]) - halfBarWidth\n if (x + this.model.leftOffset < 0 || x + this.model.leftOffset > this.width) {\n // margin?\n continue\n }\n volumes.push(this.data.volume[i])\n }\n\n const max = utils.max(volumes) ?? 0\n const rangeMax = volumeHeight || 60\n this.volumeFY = d3.scaleLinear().range([0, rangeMax]).domain([0, max]).nice(4)\n this.setupAxisTimeFrame = this.data.timeframe\n }\n\n // private\n clip(addMarginBottom?: boolean) {\n const { ChartSettings } = this.getChartLayoutSettings()\n if (addMarginBottom == null) {\n addMarginBottom = false\n }\n this.context.beginPath()\n let marginBottom = 0\n if (addMarginBottom) {\n marginBottom = ChartSettings.bottom.height\n }\n this.context.rect(ChartSettings.left.width, ChartSettings.top.height, this.width, this.height + marginBottom)\n this.context.clip()\n }\n\n addOverlay(overlay: Overlay) {\n overlay.chart = this\n this.overlays.push(overlay)\n return this.trigger('change')\n }\n\n setOverlays(overlays: Overlay[]) {\n this.overlays = overlays\n return this.trigger('change')\n }\n\n removeOverlay(overlay: Overlay) {\n for (let index = 0; index < this.overlays.length; index++) {\n const el = this.overlays[index]\n if (el === overlay) {\n this.attrs.overlays.splice(index, 1)\n this.overlays.splice(index, 1)\n this.trigger('change')\n break\n }\n }\n }\n\n getMinMax(): { min: number; max: number; firstVisibleClose?: number | null } {\n let min = Number.MAX_VALUE\n let max = Number.MIN_VALUE\n let firstVisibleClose = null\n const data = (this.data = this.model.quote())\n\n for (let i = 0; i < data.open.length; i++) {\n const center = this.fx(i)\n if (center + this.model.leftOffset < 0 || center + this.model.leftOffset > this.width) {\n // margin?\n continue\n }\n if (firstVisibleClose === null) {\n firstVisibleClose = data.close[i]\n }\n min = Math.min(min, data.low[i])\n max = Math.max(max, data.high[i])\n }\n\n if (min === Number.MAX_VALUE && max === Number.MIN_VALUE) {\n for (\n let start = Math.max(data.open.length - 10, 0), i = start, end1 = data.open.length, asc1 = start <= end1;\n asc1 ? i < end1 : i > end1;\n asc1 ? i++ : i--\n ) {\n min = Math.min(min, data.low[i])\n max = Math.max(max, data.high[i])\n }\n }\n\n if (this.shouldShowPrevClose() && data.prevClose !== null) {\n min = Math.min(min, data.prevClose)\n max = Math.max(max, data.prevClose)\n }\n\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen && !this.model.dateRange) {\n min = Math.min(min, data.lastClose)\n max = Math.max(max, data.lastClose)\n }\n return { min, max, firstVisibleClose }\n }\n\n moveBy() {}\n\n isInArea() {\n return false\n }\n\n fx = (x: number) => this.paneModel.scale.x(this.data.barIndex[x])\n\n fy = (y: number) => this.paneModel.scale.y(y)\n\n round(n: number, overridePlaces?: number) {\n return round({ data: this.data, num: n, overridePlaces: overridePlaces ?? this.getPlacesLastClose() })\n }\n\n roundOhlc(n: number) {\n const placesLastClose = this.getPlacesLastClose()\n return round({\n data: this.data,\n num: n,\n overridePlaces: placesLastClose ? Math.max(placesLastClose, 2) : undefined,\n })\n }\n\n toObject() {\n const overlays = this.overlays.map((overlay) => overlay.toObject())\n return merge({}, this.attrs, { type: this.type, overlays })\n }\n\n toConfig() {\n const overlays = this.overlays.map((overlay) => overlay.toConfig())\n return merge({}, this.attrs, { type: this.type, overlays })\n }\n\n getBarWithoutMarginWidth() {\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\n chartLayout: this.model.chart_layout(),\n zoomFactor: this.model.zoomFactor,\n })\n return barFillWidth + barBorderWidth * 2\n }\n\n getHalfBarWidth() {\n return ~~Math.max(1, this.getBarWithoutMarginWidth() / 2)\n }\n\n getPlacesLastClose(price?: number) {\n const { lastClose, instrument } = this.data\n const priceAbs = price && Math.abs(price)\n if (lastClose >= 100000) {\n return 0\n } else if (lastClose >= 10000) {\n return 1\n } else if (instrument === Instrument.Stock && (priceAbs ?? lastClose) < 1) {\n return 4\n } else if (lastClose === undefined) {\n // if lastClose is not defined we'll always display 2 decimpal places, e.g. backtests, screener stats\n return 2\n }\n\n return undefined\n }\n\n hasOverlay(type: string) {\n return this.overlays.some((x) => x.type === 'overlays/' + type)\n }\n\n getXLine() {\n return new Line(\n {\n y1: 0,\n y2: this.height,\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\n dashLength: 3,\n },\n this.paneModel\n )\n }\n\n getYLine() {\n return new Line(\n {\n x1: 0,\n x2: this.width,\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\n dashLength: 3,\n },\n this.paneModel\n )\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.model.chart_layout())\n }\n\n getIsMobileChartPage() {\n return (\n this.isMobile && this.model.chart_layout().specificChartFunctionality === SpecificChartFunctionality.chartPage\n )\n }\n\n getCandleLikeChartsRenderingColors() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const { theme, specificChartFunctionality } = this.model.chart_layout()\n let colors = Colors\n const overwrittenColors = getColorOverwrites({\n colors,\n theme,\n })\n const overwrittenColorKeys = Object.keys(overwrittenColors)\n const hasOverwrittenCandleColor = ['borderUp', 'wickUp', 'borderDown', 'wickDown', 'trendUp', 'trendDown'].some(\n (colorKey) => overwrittenColorKeys.includes(colorKey)\n )\n\n const shouldUseDarkerColors =\n theme === Theme.light &&\n getShouldUseDarkerWickColors({\n specificChartFunctionality: specificChartFunctionality,\n totalBarWidth: ChartSettings.center.barWidth + ChartSettings.center.border * 2,\n })\n\n if (shouldUseDarkerColors && !hasOverwrittenCandleColor) {\n colors = { ...colors, ...darkerWickColors }\n }\n const isNodeChartWithThinBars =\n specificChartFunctionality === SpecificChartFunctionality.offScreen && ChartSettings.center.border === 0\n if (isNodeChartWithThinBars && !hasOverwrittenCandleColor) {\n colors = { ...colors, ...thinBarColorsOverride, ...overwrittenColors }\n }\n\n return colors\n }\n\n getIsRedesignedChart() {\n return this.specificChartFunctionality === SpecificChartFunctionality.chartPage || isRedesignedPage(this)\n }\n}\n\nBaseChart.initClass()\n\nexport default BaseChart\n","import { RendererChartBarProps } from '../../types/shared'\nimport { ChartElementType } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport utils from '../utils'\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getIsSSr } from '../utils/helpers'\nimport Chart from './base_chart'\n\nconst WICK_WIDTH = 1\n\nclass CandleStick extends Chart {\n static type = ChartElementType.CandleStick\n static label = 'Candle'\n static iconName = 'candleBarBasic'\n\n getRenderChartBarProps({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) {\n const { trendDown, trendUp, borderDown, borderUp, wickDown, wickUp } = chartSettingsColors\n const open = this.data.open[index]\n const close = this.data.close[index]\n const trendColor = close < open ? trendDown : trendUp\n const wickColor = close < open ? wickDown : wickUp\n return {\n open,\n close,\n high: this.data.high[index],\n low: this.data.low[index],\n barFillColor: trendColor,\n borderColor: close < open ? borderDown : borderUp,\n wickColor: hasFillAndBorder ? wickColor : trendColor,\n }\n }\n\n renderChart() {\n if (this.setupAxisTimeFrame !== this.data.timeframe) {\n return\n }\n const { ChartSettings } = this.getChartLayoutSettings()\n const Colors = this.getCandleLikeChartsRenderingColors()\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\n chartLayout: this.model.chart_layout(),\n zoomFactor: this.model.zoomFactor,\n })\n const shouldRenderFillAndBorder =\n barFillWidth + barBorderWidth * 2 >= 2 &&\n !(this.type === ChartElementType.HollowCandleStick && barBorderWidth === 0)\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n const translateForWick = getTranslate({\n context: this.context,\n xOffset: WICK_WIDTH / 2,\n yOffset: 0,\n })\n\n translate.do()\n drawInVisibleArea({\n quote: this.data,\n scale: this.paneModel.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, center: number) => {\n const { open, close, high, low, wickColor, borderColor, barFillColor } = this.getRenderChartBarProps({\n index: i,\n chartSettingsColors: Colors,\n hasFillAndBorder: shouldRenderFillAndBorder,\n })\n\n const candleBodyHigh = Math.round(this.fy(utils.max(open, close)))\n const candleBodyLow = Math.round(this.fy(utils.min(open, close)))\n const candleWickHigh = Math.round(this.fy(high))\n const candleWickLow = Math.round(this.fy(low))\n\n const candleBodyHeight = candleBodyLow - candleBodyHigh\n const candleBodyLeftX = center - Math.floor(barBorderWidth + barFillWidth / 2)\n const halfBorderWidth = barBorderWidth / 2\n\n // TODO: revisit for better approach, this solve issue with candlesticks\n // with even width are shifted 1px to the left and thus first candle is vertically sliced\n if (getIsSSr() && candleBodyLeftX + this.leftOffset < 0) {\n return\n }\n\n const isBodyHeightGreaterOrEqualBorders = candleBodyHeight >= barBorderWidth * 2\n const isWickLineCandleLessThanOnePixel = !shouldRenderFillAndBorder && candleWickLow - candleWickHigh < 1\n\n translateForWick.do()\n this.context.set('strokeStyle', wickColor)\n this.context.beginPath()\n this.context.moveTo(center, candleWickHigh)\n if (shouldRenderFillAndBorder) {\n this.context.lineTo(center, candleBodyHigh)\n this.context.moveTo(\n center,\n candleBodyHigh + (isBodyHeightGreaterOrEqualBorders ? candleBodyHeight : WICK_WIDTH)\n )\n }\n this.context.lineTo(center, isWickLineCandleLessThanOnePixel ? candleWickHigh + 1 : candleWickLow)\n this.context.stroke()\n translateForWick.undo()\n\n if (shouldRenderFillAndBorder) {\n const hasBorder = barBorderWidth > 0\n if (hasBorder) {\n this.context.set('strokeStyle', borderColor)\n if (isBodyHeightGreaterOrEqualBorders) {\n this.context.set('lineWidth', barBorderWidth)\n this.context.strokeRect(\n candleBodyLeftX + halfBorderWidth,\n candleBodyHigh + halfBorderWidth,\n barFillWidth + 2 * halfBorderWidth,\n candleBodyHeight - 2 * halfBorderWidth\n )\n this.context.set('lineWidth', WICK_WIDTH)\n } else {\n this.context.beginPath()\n this.context.moveTo(candleBodyLeftX, candleBodyHigh + WICK_WIDTH / 2)\n this.context.lineTo(candleBodyLeftX + barFillWidth + 2 * barBorderWidth, candleBodyHigh + WICK_WIDTH / 2)\n this.context.stroke()\n }\n }\n\n const fillHeight = candleBodyHeight - 2 * barBorderWidth\n const hasFill = fillHeight > 0\n if (hasFill || !hasBorder) {\n this.context.set('fillStyle', hasFill ? barFillColor : borderColor)\n this.context.fillRect(\n candleBodyLeftX + barBorderWidth,\n candleBodyHigh + barBorderWidth,\n barFillWidth,\n hasFill ? fillHeight : WICK_WIDTH\n )\n }\n }\n },\n })\n translate.undo()\n }\n\n toString() {\n return `Candle stick ${this.data.ticker}`\n }\n}\n\nexport default CandleStick\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\nimport { ChartElementType } from '../constants/common'\nimport CandleStick from './candle_stick'\n\nclass HollowCandleStick extends CandleStick {\n static type = ChartElementType.HollowCandleStick\n static label = 'Hollow Candle'\n static iconName = 'candleBarHollow'\n\n static getNumOfBarsBuffer(element: RequireByKey) {\n return Math.max(1, super.getNumOfBarsBuffer(element))\n }\n\n getRenderChartBarProps({ index, chartSettingsColors }: RendererChartBarProps) {\n const open = this.data.open[index]\n const close = this.data.close[index]\n const isHollow = close > open\n const generalTrendColor =\n close > this.data.close[index - 1] ? chartSettingsColors.ohlcTrendUp : chartSettingsColors.ohlcTrendDown\n const trendColor = index === 0 ? chartSettingsColors.zeroChange : generalTrendColor\n return {\n open,\n close,\n high: this.data.high[index],\n low: this.data.low[index],\n // hollow candles have transparend bodies that's why rgba is here\n barFillColor: isHollow ? 'rgba(0, 0, 0, 0)' : trendColor,\n borderColor: trendColor,\n wickColor: trendColor,\n }\n }\n\n toString() {\n return `Hollow Candle stick ${this.data.ticker}`\n }\n}\n\nexport default HollowCandleStick\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\nimport { ChartElementType, ScaleType } from '../constants/common'\nimport Quote from '../models/quote'\nimport { getTickerChangeFromCloseValues } from '../utils/chart'\nimport CandleStick from './candle_stick'\n\ntype OhlcKeys = 'high' | 'low' | 'open' | 'close'\n\nclass HeikinAshi extends CandleStick {\n static type = ChartElementType.HeikinAshi\n static label = 'Heikin Ashi'\n static iconName = 'candleBarHeikinAshi'\n\n static getNumOfBarsBuffer(element: RequireByKey) {\n return Math.max(1, super.getNumOfBarsBuffer(element))\n }\n\n getRenderChartBarProps = ({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) => {\n const haData = this.data.getHeikinAshiData()\n\n const open = haData.open[index]\n const close = haData.close[index]\n const trendColor = close < open ? chartSettingsColors.trendDown : chartSettingsColors.trendUp\n const wickColor = close < open ? chartSettingsColors.wickDown : chartSettingsColors.wickUp\n return {\n open,\n close,\n high: Math.max(this.data.high[index], open, close),\n low: Math.min(open, close, this.data.low[index]),\n barFillColor: trendColor,\n borderColor: close < open ? chartSettingsColors.borderDown : chartSettingsColors.borderUp,\n wickColor: hasFillAndBorder ? wickColor : trendColor,\n }\n }\n\n getLastValues = () => {\n const Colors = this.getCandleLikeChartsRenderingColors()\n const {\n open: lastOpen,\n close: lastClose,\n high: lastHigh,\n low: lastLow,\n } = this.getRenderChartBarProps({\n index: this.data.date.length - 1,\n chartSettingsColors: Colors,\n })\n\n return { lastOpen, lastClose, lastHigh, lastLow }\n }\n\n getRoundedLastData() {\n const lastOhlc = this.getLastValues()\n return {\n open: this.roundOhlc(lastOhlc.lastOpen),\n high: this.roundOhlc(lastOhlc.lastHigh),\n low: this.roundOhlc(lastOhlc.lastLow),\n close: this.roundOhlc(lastOhlc.lastClose),\n }\n }\n\n renderYAxis = (context: CanvasRenderingContext2D) => {\n const { lastClose } = this.getLastValues()\n super.renderYAxis(context, { lastClose }, false)\n\n const { firstVisibleClose } = this.getMinMax()\n if (this.model.scale === ScaleType.Percentage && !firstVisibleClose) return\n\n const originalLatestClose = this.data.close[this.data.close.length - 1]\n const heikinLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\n const originalLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose: originalLatestClose, firstVisibleClose })\n\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: heikinLatestCloseLabel })\n\n if (heikinLatestCloseLabel === originalLatestCloseLabel) return\n\n this.renderYAxisLabel({\n context,\n yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\n mainLabelValue: lastClose,\n secondaryLabelValue: originalLatestClose,\n }),\n label: originalLatestCloseLabel,\n background: this.getSecondaryLabelBackgroundColor(),\n })\n }\n\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\n const Colors = this.getCandleLikeChartsRenderingColors()\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\n if (barIndex > -1) {\n let value = null\n if (['high', 'low', 'open', 'close'].includes(key)) {\n const data = this.getRenderChartBarProps({ index: barIndex, chartSettingsColors: Colors })\n value = data[key as OhlcKeys]\n }\n value = value === null ? this.data.getDataByBarIndex(key, crossIndex) : value\n if (value !== null) {\n return shouldReturnRoundedString ? this.roundOhlc(value) : `${value}`\n }\n }\n }\n\n getCrossIndexChange(crossIndex: number) {\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\n const haData = this.data.getHeikinAshiData()\n const crossClose = haData.close[barIndex] ?? null\n const previousClose = haData.close[barIndex - 1] ?? null\n if (crossClose !== null && previousClose !== null) {\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\n }\n\n return null\n }\n\n toString() {\n return `HA Candle stick ${this.data.ticker}`\n }\n}\n\nexport default HeikinAshi\n","import { ChartElementType } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Chart from './base_chart'\n\nclass LineChart extends Chart {\n static type = ChartElementType.LineChart\n static label = 'Line'\n static iconName = 'lineChartType'\n\n renderChart() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n let first: number | undefined, last: number | undefined\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\n yOffset: ChartSettings.top.height + 0.5,\n })\n translate.do()\n this.context.beginPath()\n this.context.set('lineWidth', 1)\n this.context.set('strokeStyle', Colors.line)\n drawInVisibleArea({\n quote: this.data,\n scale: this.paneModel.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n const y = Math.round(this.fy(this.data.close[i]))\n this.context.lineTo(x, y)\n last = x\n if (first === undefined) {\n first = x\n }\n },\n })\n if (first !== undefined && last !== undefined) {\n this.context.stroke()\n this.context.set('fillStyle', Colors.background)\n this.context.lineTo(last!, this.height)\n this.context.lineTo(first!, this.height)\n this.context.fill()\n }\n\n translate.undo()\n }\n\n toString() {\n return `Line chart ${this.data.ticker}`\n }\n}\n\nexport default LineChart\n","import Text from '../canvas/text'\nimport { ChartElementType, TextAlign, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport { isRedesignEnabled } from '../utils'\nimport Chart, { BaseChartAttrs } from './base_chart'\n\nconst interval = 3\nconst domainMin = -1\nconst domainMax = 1\nconst red = 'rgba(200, 0, 0, 0.392)'\nconst redLine = 'rgb(120, 0, 0)'\nconst green = 'rgba(0, 180, 0, 0.392)'\nconst greenLine = 'rgb(0, 100, 0)'\n\nclass MarketSentiment extends Chart {\n static type = ChartElementType.MarketSentiment\n\n static initClass() {\n Object.defineProperty(this.prototype, 'width', {\n get() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n return this.model.width - MarketSentimentSettings.left.width - MarketSentimentSettings.right.width\n },\n })\n\n Object.defineProperty(this.prototype, 'height', {\n get() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n return this.paneModel.height - MarketSentimentSettings.top.height - MarketSentimentSettings.bottom.height\n },\n })\n }\n\n declare _data: number[]\n declare _dataLastIndex: number | null\n\n constructor(values: Partial, model: Pane) {\n super(values, model)\n this.renderText = this.renderText.bind(this)\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\n this.renderYAxis = this.renderYAxis.bind(this)\n this.setupCache = this.setupCache.bind(this)\n }\n\n setupCache() {\n super.setupCache()\n if (!this.data) {\n return\n }\n const arr: number[] = []\n this.data.close.forEach((sum, i) => {\n arr[i] = sum / this.data.volume[i]\n })\n this._data = arr\n\n let lastIndex = null\n for (let i = this.data.volume.length - 1; i >= 0; i--) {\n if (this.data.volume[i] !== 0) {\n lastIndex = i\n break\n }\n }\n this._dataLastIndex =\n lastIndex === null\n ? null\n : Math.min(lastIndex, Math.round((this.data.drawMinutesPerDay - this.data.marketStartMinutes) / interval))\n }\n\n renderChart() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + MarketSentimentSettings.left.width + 0.5,\n yOffset: MarketSentimentSettings.top.height + 0.5,\n })\n translate.do()\n this.renderLineBullBear(this.context, this._data, 0, 0, 0)\n translate.undo()\n }\n\n renderLineBullBear(\n context: CanvasRenderingContext2D,\n array: number[],\n from: number,\n oversold: number,\n overbought: number\n ) {\n if (this._dataLastIndex === null) {\n return\n }\n const isRedesign = isRedesignEnabled()\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n\n const domain = [domainMax, domainMin]\n\n context.save()\n context.beginPath()\n context.rect(\n -this.leftOffset,\n this.fy(domain[1]),\n this.fx(this._dataLastIndex),\n Math.round(this.fy(oversold) - this.fy(domain[1])) - 0.5\n )\n context.clip()\n context.set('fillStyle', red)\n context.set('strokeStyle', isRedesign ? Colors.marketDown : redLine)\n context.beginPath()\n context.moveTo(this.fx(0), Math.round(this.fy(domain[0])))\n for (let i = from; i < this.data.close.length; i++) {\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\n }\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[0])))\n context.fill()\n context.stroke()\n context.restore()\n\n context.save()\n context.beginPath()\n context.rect(\n -this.leftOffset,\n this.fy(domain[0]),\n this.fx(this._dataLastIndex),\n Math.round(this.fy(overbought)) - 0.5\n )\n context.clip()\n context.set('fillStyle', green)\n context.set('strokeStyle', isRedesign ? Colors.marketUp : greenLine)\n context.beginPath()\n context.moveTo(this.fx(0), Math.round(this.fy(domain[1])))\n for (let i = from; i < this.data.close.length; i++) {\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\n }\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[1])))\n context.fill()\n context.stroke()\n context.restore()\n }\n\n renderXAxis() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n const { Colors } = MarketSentimentSettings.general\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + MarketSentimentSettings.left.width,\n yOffset: MarketSentimentSettings.top.height,\n })\n translate.do()\n\n const xLine = this.getXLine()\n const text = new Text(\n {\n y: this.height + 12,\n font: { size: 7 },\n fillStyle: Colors.text,\n textBaseline: TextBaseline.bottom,\n textAlign: TextAlign.center,\n },\n this.paneModel\n )\n let x\n\n x = this.fx(0)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10) + 2 /* remove overflow */\n text.set({ text: '10AM', x }).render(this.context)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 20)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 40)\n text.set({ text: '12PM', x }).render(this.context)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 60)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 80)\n text.set({ text: '2PM', x }).render(this.context)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 100)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 120 - 1)\n text.set({ text: '4PM', x }).render(this.context)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n translate.undo()\n }\n\n renderText() {}\n\n renderCrossText() {}\n\n renderOverlaysLabels() {}\n\n _compute() {\n return { min: domainMin, max: domainMax }\n }\n\n computeVisibleMinMax() {\n return this._compute()\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n const { MarketSentimentSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const isRedesign = isRedesignEnabled()\n const translate = getTranslate({\n context: this.context,\n xOffset: MarketSentimentSettings.left.width,\n yOffset: MarketSentimentSettings.top.height,\n })\n translate.do()\n\n const yLine = this.getYLine()\n for (const tick of [domainMin, 0, domainMax]) {\n const y = Math.round(this.fy(tick))\n yLine.set({ y1: y, y2: y }).render(context)\n }\n\n const text = new Text(\n {\n x: this.width + 27,\n font: { size: 8 },\n textBaseline: TextBaseline.middle,\n textAlign: TextAlign.right,\n },\n this.paneModel\n )\n\n const fillUp = isRedesign ? Colors.marketUp : greenLine\n const fillDown = isRedesign ? Colors.marketDown : redLine\n const last = this._data[this._dataLastIndex!]\n const percent = this._dataLastIndex !== null ? Math.floor(last * 50 + 50) : 50\n text.set({ y: this.fy(0) - 5, fillStyle: fillUp, text: `${percent}%` }).render(context)\n text.set({ y: this.fy(0) + 7, fillStyle: fillDown, text: `${100 - percent}%` }).render(context)\n\n translate.undo()\n }\n\n clip() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n this.context.beginPath()\n this.context.rect(MarketSentimentSettings.left.width, MarketSentimentSettings.top.height, this.width, this.height)\n this.context.clip()\n }\n\n getMinMax() {\n return this._compute()\n }\n\n renderVolumeAxis() {}\n\n renderVolume() {}\n\n toString() {\n return `Market sentiment chart`\n }\n}\nMarketSentiment.initClass()\n\nexport default MarketSentiment\n","import { ObjectHash } from '../../types/shared'\nimport Text from '../canvas/text'\nimport { ChartElementType, FONT_SIZE, LINE_HEIGHT, PADDING, TextAlign, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport Quote from '../models/quote'\nimport utils from '../utils'\nimport Chart, { BaseChartAttrs } from './base_chart'\n\ninterface MultiLineChartAttrs extends BaseChartAttrs {\n tickers: string[]\n label?: string\n min?: number\n max?: number\n}\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\nclass MultiLineChart extends Chart {\n static type = ChartElementType.MultiLineChart\n tickersDimensions: number[] = []\n\n constructor(values: Partial, model: Pane) {\n super(values, model)\n this.renderText = this.renderText.bind(this)\n }\n\n renderChart() {\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\n yOffset: ChartSettings.top.height + 0.5,\n })\n translate.do()\n\n this.context.set('lineWidth', 1)\n\n const quotes: ObjectHash = {}\n for (const quote of this.getQuotes()) {\n quotes[quote.ticker] = quote\n }\n\n for (let index = this.attrs.tickers.length - 1; index >= 0; index--) {\n const ticker = this.attrs.tickers[index]\n const quote = quotes[ticker]\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\n this.context.beginPath()\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const x = this.fx(i)\n if (x + this.leftOffset < -10 || x + this.leftOffset > this.model.width + 10) {\n // margin?\n continue\n }\n const y = Math.round(this.fy(quote.close[i]))\n this.context.lineTo(x, y)\n }\n this.context.stroke()\n }\n\n translate.undo()\n }\n\n renderText(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const text = this.attrs.label || ''\n const y = (this.height - 4) / 2\n new Text(\n {\n text,\n x: 28,\n y: ChartSettings.top.height + y,\n angle: -90,\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\n fillStyle: Colors.textSecondary,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.alphabetic,\n },\n this.paneModel\n ).render(context)\n return this.renderCrossText(context, this.data.close.length - 1)\n }\n\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const maxTickerLength = utils.max(this.attrs.tickers.map((t) => t.length))\n\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\n const month = date.getMonth() // 20141126\n const year = date.getFullYear()\n const day = date.getDate()\n const isLastDate = crossIndex === this.data.close.length - 1\n\n new Text(\n {\n text: `${months[month]} ${day} ${year} `,\n x: ChartSettings.left.width + (maxTickerLength > 15 ? 200 : 132),\n y: 30,\n font: { size: 8 },\n fillStyle: Colors.text,\n background: Colors.canvasFill,\n },\n this.paneModel\n ).render(context)\n\n const quotes: ObjectHash = {}\n for (const quote of this.getQuotes()) {\n quotes[quote.ticker] = quote\n }\n for (let index = 0; index < this.attrs.tickers.length; index++) {\n const y = PADDING.S + (PADDING.S + LINE_HEIGHT.M) * index\n if (this.tickersDimensions[index]) {\n context.fillStyle = Colors.canvasFill\n context.fillRect(\n ChartSettings.left.width - PADDING.XXXS,\n y - PADDING.XXXS,\n PADDING.XXXS + this.tickersDimensions[index] + PADDING.XXXS,\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\n )\n }\n const ticker = this.attrs.tickers[index]\n const closeValue = quotes[ticker].close[crossIndex]\n const text = new Text(\n {\n text: `${ticker} ${typeof closeValue === 'number' ? closeValue.toFixed(2) : NaN} `,\n x: ChartSettings.left.width,\n y,\n font: { size: FONT_SIZE.M, style: 'bold' },\n lineHeight: LINE_HEIGHT.M,\n fillStyle: ColorsSettings[index % ColorsSettings.length],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.paneModel\n )\n if (isLastDate) {\n this.tickersDimensions[index] = text.measure(context)\n }\n text.render(context)\n }\n }\n\n computeVisibleMinMax(...arrays: Array) {\n let min = Number.MAX_VALUE\n let max = Number.MIN_VALUE\n\n const { leftOffset } = this.model\n for (const arr of arrays) {\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const center = this.fx(i)\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\n // margin?\n continue\n }\n\n if (min > arr[i]) {\n min = arr[i]\n }\n if (max < arr[i]) {\n max = arr[i]\n }\n }\n }\n\n return { min, max }\n }\n\n getMinMax() {\n const quotes = this.getQuotes()\n let { min, max } = this.computeVisibleMinMax(...quotes.map((q) => q.close))\n if (typeof this.attrs.min !== 'undefined') {\n min = this.attrs.min\n }\n if (typeof this.attrs.max !== 'undefined') {\n max = this.attrs.max\n }\n return { min, max }\n }\n\n renderVolumeAxis() {}\n\n renderVolume() {}\n\n getQuotes() {\n return Quote.select(\n (q: Quote) =>\n this.attrs.tickers.includes(q.ticker) &&\n q.timeframe === this.data?.timeframe &&\n this.model.chart_layout().isIdeaId(q.ideaID)\n )\n }\n\n toString() {\n return `Line chart ${this.data.ticker}`\n }\n}\n\nexport default MultiLineChart\n","import { ChartElementType } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Chart from './base_chart'\n\nclass OHLCChart extends Chart {\n static type = ChartElementType.OhlcChart\n static label = 'OHLC'\n static iconName = 'ohlcChartType'\n\n renderChart() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n\n const barWithoutMarginWidth = this.getBarWithoutMarginWidth()\n\n let lineWidth = 1\n if (barWithoutMarginWidth >= 40) {\n lineWidth = 4\n } else if (barWithoutMarginWidth >= 30) {\n lineWidth = 3\n } else if (barWithoutMarginWidth >= 15) {\n lineWidth = 2\n }\n const lineThickness = lineWidth / 2\n const handleLengthFromWick = Math.round(barWithoutMarginWidth / 2 - lineThickness)\n const lineOffset = lineWidth % 2 === 0 ? 0 : 0.5\n this.context.set('lineWidth', lineWidth)\n\n drawInVisibleArea({\n quote: this.data,\n scale: this.paneModel.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n const barX = ~~(x + 1) + lineOffset // move 1px to right so cursor don't cover bar of ohlc-chart & round for pixel perfect render on zoom\n\n this.context.beginPath()\n this.context.set(\n 'strokeStyle',\n this.data.close[i] < this.data.open[i] ? Colors.ohlcTrendDown : Colors.ohlcTrendUp\n )\n\n this.context.moveTo(barX, Math.round(this.fy(this.data.high[i])))\n this.context.lineTo(barX, Math.round(this.fy(this.data.low[i])))\n\n if (handleLengthFromWick >= 1) {\n const open = Math.round(this.fy(this.data.open[i]))\n this.context.moveTo(barX + lineThickness, open + lineOffset) // move to right edge of wick\n this.context.lineTo(barX - lineThickness - handleLengthFromWick, open + lineOffset) // draw line to the left\n\n const close = Math.round(this.fy(this.data.close[i]))\n this.context.moveTo(barX - lineThickness, close + lineOffset) // move to left edge of wick\n this.context.lineTo(barX + lineThickness + handleLengthFromWick, close + lineOffset) // draw line to the right\n }\n\n this.context.stroke()\n },\n })\n\n translate.undo()\n }\n\n toString() {\n return `OHLC ${this.data.ticker}`\n }\n}\n\nexport default OHLCChart\n","import * as d3 from 'd3'\n\nimport { ObjectHash } from '../../types/shared'\nimport Text from '../canvas/text'\nimport { ChartElementType, FONT_SIZE, MARGIN, OFFSET, PADDING, TextAlign, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport Quote from '../models/quote'\nimport utils from '../utils'\nimport Chart, { BaseChartAttrs } from './base_chart'\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\ninterface PerfChartAttrs extends BaseChartAttrs {\n tickers: string[]\n label?: string\n fromDate: string\n toDate: string\n min?: number\n max?: number\n}\n\nclass PerfChart extends Chart {\n static type = ChartElementType.PerfChart\n\n overlayLabelWidth: ObjectHash\n perf: ObjectHash = {}\n\n constructor(values: Partial, model: Pane) {\n super(values, model)\n this.renderText = this.renderText.bind(this)\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\n this.renderYAxis = this.renderYAxis.bind(this)\n this.overlayLabelWidth = {}\n }\n\n renderChart() {\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\n yOffset: ChartSettings.top.height + 0.5,\n })\n translate.do()\n\n this.context.beginPath()\n this.context.set('lineWidth', 1)\n for (let index = 0; index < this.attrs.tickers.length; index++) {\n const ticker = this.attrs.tickers[index]\n if ((this.perf[ticker] != null ? this.perf[ticker].length : 0) > 0) {\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\n this.context.beginPath()\n for (let i = 0, end = this.data.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n this.context.lineTo(this.fx(i), Math.round(this.fy(this.perf[ticker][i])))\n }\n this.context.stroke()\n }\n }\n\n translate.undo()\n }\n\n renderText(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const period = (() => {\n switch (this.model.quote().timeframe) {\n case 'd':\n return 'DAILY'\n case 'w':\n return 'WEEKLY'\n case 'm':\n return 'MONTHLY'\n default:\n return\n }\n })()\n const y = (this.height - 4) / 2\n new Text(\n {\n text: period,\n x: 28,\n y: ChartSettings.top.height + y,\n angle: -90,\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\n fillStyle: Colors.textSecondary,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.alphabetic,\n },\n this.paneModel\n ).render(context)\n }\n\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\n let dateString = ''\n const month = date.getMonth() // 20141126\n const year = date.getFullYear()\n const day = date.getDate()\n switch (this.data.timeframe) {\n case 'd':\n case 'w':\n dateString = `${months[month]} ${day}`\n break\n case 'm':\n dateString = `${months[month]} ${year}`\n break\n default:\n return\n }\n\n let shouldRenderDate = false\n for (let index = 0; index < this.attrs.tickers.length; index++) {\n const ticker = this.attrs.tickers[index]\n const tickerData = this.perf[ticker]\n if (tickerData?.length) {\n context.fillStyle = Colors.canvasFill\n context.fillRect(\n ChartSettings.left.width - PADDING.XXXS,\n OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index - PADDING.XXXS,\n PADDING.XXXS + this.overlayLabelWidth[ticker] + PADDING.XXXS,\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\n )\n const hasData = Number.isFinite(tickerData[crossIndex])\n const percentageText = hasData ? `${tickerData[crossIndex].toFixed(2)}%` : ''\n shouldRenderDate = shouldRenderDate || hasData\n new Text(\n {\n text: `${ticker} ${percentageText}`,\n x: ChartSettings.left.width,\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\n font: { size: FONT_SIZE.M, style: 'bold' },\n fillStyle: ColorsSettings[index % ColorsSettings.length],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.paneModel\n ).render(context)\n }\n }\n\n if (shouldRenderDate) {\n new Text(\n {\n text: `${dateString} `,\n x: ChartSettings.left.width + 132,\n y: 30,\n font: { size: 8 },\n fillStyle: Colors.text,\n background: Colors.canvasFill,\n },\n this.paneModel\n ).render(context)\n }\n }\n\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\n super.renderOverlaysLabels(context)\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n\n for (let index = 0; index < this.attrs.tickers.length; index++) {\n const ticker = this.attrs.tickers[index]\n const tickerData = this.perf[ticker]\n if (tickerData?.length) {\n const lastCrossIndex = this.perf[ticker].length - 1\n const hasData = Number.isFinite(tickerData[lastCrossIndex])\n const percentageText = hasData ? `${tickerData[lastCrossIndex].toFixed(2)}%` : ''\n const text = new Text(\n {\n text: `${ticker} ${percentageText}`,\n x: ChartSettings.left.width,\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\n font: { size: FONT_SIZE.M, style: 'bold' },\n fillStyle: ColorsSettings[index % ColorsSettings.length],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.paneModel\n )\n this.overlayLabelWidth = { ...this.overlayLabelWidth, [ticker]: text.measure(context) }\n text.render(context)\n }\n }\n }\n\n _compute() {\n this.perf = {}\n const quotes = this.getQuotes()\n\n const fromDate = new Date(this.attrs.fromDate + ' 00:00')\n const toDate = new Date(this.attrs.toDate + ' 23:59')\n const filteredQuotes = []\n for (const quote of quotes) {\n const closes = []\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const date = utils.dateFromUnixTimestamp(quote.date[i])\n if (fromDate <= date && date <= toDate) {\n closes.push(quote.close[i])\n }\n }\n filteredQuotes.push({ ticker: quote.ticker, close: closes })\n }\n\n const daysCount = d3.max(filteredQuotes, (q) => q.close.length) ?? 0\n for (const quote of filteredQuotes) {\n this.perf[quote.ticker] = []\n const first = quote.close[0]\n let offset = 0\n if (daysCount > quote.close.length) {\n offset = daysCount - quote.close.length\n for (let i = 0, end1 = offset, asc1 = end1 >= 0; asc1 ? i < end1 : i > end1; asc1 ? i++ : i--) {\n this.perf[quote.ticker][i] = NaN\n }\n }\n for (let i = 0, end2 = quote.close.length, asc2 = end2 >= 0; asc2 ? i < end2 : i > end2; asc2 ? i++ : i--) {\n this.perf[quote.ticker][offset + i] = (quote.close[i] * 100) / first - 100\n }\n }\n const { min, max } = this.computeVisibleMinMax(...Object.keys(this.perf).map((x) => this.perf[x]))\n return { min, max }\n }\n\n // TODO refactor into ?utils\n computeVisibleMinMax(...arrays: Array) {\n let min = Number.MAX_VALUE\n let max = Number.MIN_VALUE\n\n const { leftOffset } = this.model\n for (const arr of arrays) {\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const center = this.fx(i)\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\n // margin?\n continue\n }\n\n if (min > arr[i]) {\n min = arr[i]\n }\n if (max < arr[i]) {\n max = arr[i]\n }\n }\n }\n\n return { min, max }\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context,\n xOffset: ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n const ticks = this.paneModel.scale.y.ticks(10)\n const yLine = this.getYLine()\n const text = new Text(\n {\n x: this.width + 8,\n font: { size: 8 },\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n },\n this.paneModel\n )\n for (const tick of ticks) {\n const y = Math.round(this.fy(tick))\n yLine.set({ y1: y, y2: y }).render(context)\n text.set({ text: tick.toFixed(2), y }).render(context)\n }\n translate.undo()\n }\n\n renderXAxis() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n const text = new Text(\n {\n y: this.height + 18,\n font: { size: 8 },\n fillStyle: Colors.text,\n textBaseline: TextBaseline.bottom,\n textAlign: TextAlign.center,\n },\n this.paneModel\n )\n const textWidth = text.set({ text: '2020' }).measure(this.context)\n\n let date = new Date(this.data.date[0] * 1000)\n let lastMonth = date.getMonth() + '-' + date.getFullYear()\n\n let monthsInData = 0\n this.data.date.forEach((d, index) => {\n if (index < 1) {\n return\n }\n\n const date = new Date(d * 1000)\n const month = date.getMonth() + '-' + date.getFullYear()\n if (month !== lastMonth) {\n monthsInData++\n }\n lastMonth = month\n })\n\n const availableTickSpots = ~~(this.width / textWidth)\n const monthsToAvail = monthsInData / availableTickSpots\n let renderMonth\n if (monthsToAvail <= 1) {\n renderMonth = () => true\n } else if (monthsToAvail <= 2) {\n renderMonth = (x: number) => x % 2 === 0\n } else if (monthsToAvail <= 3) {\n renderMonth = (x: number) => x % 3 === 0\n } else if (monthsToAvail <= 4) {\n renderMonth = (x: number) => x % 4 === 0\n } else if (monthsToAvail <= 6) {\n renderMonth = (x: number) => x % 6 === 0\n } else {\n renderMonth = (x: number) => x === 0\n }\n\n date = new Date(this.data.date[0] * 1000)\n lastMonth = date.getMonth() + '-' + date.getFullYear()\n\n const xLine = this.getXLine()\n\n for (let i = 0; i < this.data.date.length; i++) {\n date = new Date(this.data.date[i] * 1000)\n const month = date.getMonth() + '-' + date.getFullYear()\n if (month !== lastMonth) {\n lastMonth = month\n const x = this.fx(i)\n if (x + this.leftOffset < -15 || x + this.leftOffset > this.width + 15) {\n // margin?\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n if (!renderMonth(date.getMonth())) {\n continue\n }\n\n text\n .set({\n text: date.getMonth() === 0 ? date.getFullYear().toString() : months[date.getMonth()],\n x: x,\n })\n .render(this.context)\n }\n }\n\n translate.undo()\n }\n\n getMinMax() {\n return this._compute()\n }\n\n renderVolumeAxis() {}\n\n renderVolume() {}\n\n getQuotes() {\n return Quote.select(\n (q: Quote) =>\n this.attrs.tickers.includes(q.ticker) &&\n q.timeframe === this.data?.timeframe &&\n this.model.chart_layout().isIdeaId(q.ideaID)\n )\n }\n\n toString() {\n return `Perf chart ${this.data.ticker}`\n }\n}\n\nexport default PerfChart\n","import { ChartElementType } from '../constants/common'\nimport candleStick from './candle_stick'\nimport hollowCandleStick from './candle_stick_hollow'\nimport heikinAshi from './heikin_ashi'\nimport lineChart from './line_chart'\nimport marketSentiment from './market_sentiment'\nimport multiLineCharts from './multi_line_chart'\nimport ohlcChart from './ohlc_chart'\nimport perfChart from './perf_chart'\n\nexport const chartsByType = Object.freeze({\n [ChartElementType.CandleStick]: candleStick,\n [ChartElementType.HeikinAshi]: heikinAshi,\n [ChartElementType.HollowCandleStick]: hollowCandleStick,\n [ChartElementType.LineChart]: lineChart,\n [ChartElementType.MarketSentiment]: marketSentiment,\n [ChartElementType.MultiLineChart]: multiLineCharts,\n [ChartElementType.OhlcChart]: ohlcChart,\n [ChartElementType.PerfChart]: perfChart,\n})\n","export const FONT_SIZE = {\n XXS: 5,\n XS: 7,\n S: 8,\n M: 10,\n L: 11,\n XXL: 18,\n XXXL: 23,\n}\nexport const LINE_HEIGHT = {\n XS: 7,\n S: 8,\n M: 10,\n}\nexport const PADDING = {\n XXXS: 1,\n XXS: 2,\n XS: 3,\n S: 5,\n}\nexport const MARGIN = {\n XS: 4,\n}\nexport const CHART_MARGIN = {\n S: 15,\n M: 30,\n L: 35,\n XL: 38,\n XXL: 48,\n}\nexport const SETTINGS_HEIGHT = 44\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\nexport const OFFSET = {\n XXS: 2,\n XS: 4,\n S: 6,\n M: 8,\n XXL: 20,\n}\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\nexport enum ChartEditorEnum {\n publish = 'publish',\n tools = 'tools',\n ideas = 'ideas',\n settings = 'settings',\n timeframe = 'timeframe',\n}\n\nexport enum LayoutType {\n '1h1v' = '1h1v',\n '1h2v' = '1h2v',\n '1h3v' = '1h3v',\n '2h1v' = '2h1v',\n '2h2v' = '2h2v',\n '3h1v' = '3h1v',\n '3h2v' = '3h2v',\n '1l2r' = '1l2r',\n '1t2b' = '1t2b',\n}\n\nexport enum CanvasElementType {\n element = 'canvas/element',\n arrow = 'canvas/arrow',\n brushV1 = 'canvas/brush/brush_v1',\n curve = 'canvas/curve',\n ellipse = 'canvas/ellipse',\n fibonacciRetracements = 'canvas/fibonacci_retracements',\n horizontalLine = 'canvas/horizontal_line',\n line = 'canvas/line',\n measure = 'canvas/measure',\n pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\n polygon = 'canvas/polygon',\n position = 'canvas/position',\n rectangle = 'canvas/rectangle',\n rotatedRectangle = 'canvas/rotated_rectangle',\n scaledLine = 'canvas/scaled_line',\n scaledText = 'canvas/scaled_text',\n symbol = 'canvas/symbol',\n text = 'canvas/text',\n triangle = 'canvas/triangle',\n verticalLine = 'canvas/vertical_line',\n xabcd = 'canvas/xabcd',\n calloutV1 = 'canvas/callout/callout_v1',\n elliottWaves = 'canvas/elliott_waves/elliott_waves',\n ellipseV1 = 'canvas/ellipse/ellipse_v1',\n rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\n}\n\nexport enum ChartElementType {\n CandleStick = 'charts/candle_stick',\n HeikinAshi = 'charts/heikin_ashi',\n HollowCandleStick = 'charts/candle_stick_hollow',\n LineChart = 'charts/line_chart',\n OhlcChart = 'charts/ohlc_chart',\n MarketSentiment = 'charts/market_sentiment',\n MultiLineChart = 'charts/multi_line_chart',\n PerfChart = 'charts/perf_chart',\n}\n\nexport enum IndicatorType {\n Indicator = 'indicators/indicator',\n None = 'indicators/none',\n Adx = 'indicators/adx',\n Aro = 'indicators/aro',\n Aroosc = 'indicators/aroosc',\n Atr = 'indicators/atr',\n Cci = 'indicators/cci',\n Cot = 'indicators/cot',\n Fi = 'indicators/fi',\n Macd = 'indicators/macd',\n Mfi = 'indicators/mfi',\n Obv = 'indicators/obv',\n Perf = 'indicators/perf',\n Rmi = 'indicators/rmi',\n Roc = 'indicators/roc',\n Rsi = 'indicators/rsi',\n Rvol = 'indicators/rvol',\n Rwi = 'indicators/rwi',\n Stofa = 'indicators/stofa',\n Stofu = 'indicators/stofu',\n Stosl = 'indicators/stosl',\n Trix = 'indicators/trix',\n Ult = 'indicators/ult',\n Vol = 'indicators/vol',\n Wr = 'indicators/wr',\n}\n\nexport enum OverlayType {\n Overlay = 'overlays/overlay',\n None = 'overlays/none',\n Bb = 'overlays/bb',\n Dch = 'overlays/dch',\n Ema = 'overlays/ema',\n Ema2 = 'overlays/ema2',\n Hilo = 'overlays/hilo',\n Hline = 'overlays/hline',\n Ic = 'overlays/ic',\n Icf = 'overlays/icf',\n Kch = 'overlays/kch',\n Patterns = 'overlays/patterns',\n Sar = 'overlays/sar',\n Sma = 'overlays/sma',\n Sma2 = 'overlays/sma2',\n Str = 'overlays/str',\n Vp = 'overlays/vp',\n Vwap = 'overlays/vwap',\n}\n\nexport enum ChartEventDbType {\n Dividends = 'chartEvent/dividends',\n Split = 'chartEvent/split',\n Earnings = 'chartEvent/earnings',\n}\n\nexport enum ChartEventType {\n ChartEvent = 'chartEvent/chartEvent',\n Dividends = 'chartEvent/dividends',\n Split = 'chartEvent/split',\n Earnings = 'chartEvent/earnings',\n}\n\nexport enum ChartEventBadgeType {\n Dividends = 'chartEvent/dividends',\n Split = 'chartEvent/split',\n EarningsPositive = 'chartEvent/earnings',\n EarningsNegative = 'chartEvent/earningsNegative',\n EarningsNeutral = 'chartEvent/earningsNeutral',\n EarningsFuture = 'chartEvent/earningsFuture',\n}\n\nexport const ChartEventLabels: Record = {\n [ChartEventBadgeType.Dividends]: 'Dividends',\n [ChartEventBadgeType.Split]: 'Split',\n [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\n [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\n [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\n [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\n}\n\ninterface LayoutRule {\n columns: number\n rows: number\n count: number\n gridAreas?: string[]\n}\n\nexport const LAYOUTS: Record = {\n '1h1v': { columns: 1, rows: 1, count: 1 },\n '1h2v': { columns: 1, rows: 2, count: 2 },\n '1h3v': { columns: 1, rows: 3, count: 3 },\n '2h1v': { columns: 2, rows: 1, count: 2 },\n '2h2v': { columns: 2, rows: 2, count: 4 },\n '3h1v': { columns: 3, rows: 1, count: 3 },\n '3h2v': { columns: 3, rows: 2, count: 6 },\n '1l2r': {\n columns: 2,\n rows: 2,\n count: 3,\n gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\n },\n '1t2b': {\n columns: 2,\n rows: 2,\n count: 3,\n gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\n },\n}\n\nexport const SORT_DIRECTION = {\n ASC: 'ASC',\n DESC: 'DESC',\n}\n\nexport const ICON_SIZE = {\n L: 32,\n}\n\n// Keep in sync with the copy in Website repo - Website/js/main/constants.ts\nexport enum TIMEFRAME {\n i1 = 'i1',\n i2 = 'i2',\n i3 = 'i3',\n i5 = 'i5',\n i10 = 'i10',\n i15 = 'i15',\n i30 = 'i30',\n h = 'h',\n h2 = 'h2',\n h4 = 'h4',\n d = 'd',\n w = 'w',\n m = 'm',\n}\n\nexport type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\n\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\n\nexport const IntradayTimeframeInterval = {\n [TIMEFRAME.i1]: 1,\n [TIMEFRAME.i2]: 2,\n [TIMEFRAME.i3]: 3,\n [TIMEFRAME.i5]: 5,\n [TIMEFRAME.i10]: 10,\n [TIMEFRAME.i15]: 15,\n [TIMEFRAME.i30]: 30,\n [TIMEFRAME.h]: 60,\n [TIMEFRAME.h2]: 120,\n [TIMEFRAME.h4]: 240,\n}\n\nexport enum DateRangeType {\n d1 = 'd1',\n d5 = 'd5',\n m1 = 'm1',\n m3 = 'm3',\n m6 = 'm6',\n ytd = 'ytd',\n y1 = 'y1',\n y2 = 'y2',\n y5 = 'y5',\n max = 'max',\n}\n\nexport const TIMEFRAME_SECONDS = {\n [TIMEFRAME.i1]: 60,\n [TIMEFRAME.i2]: 120,\n [TIMEFRAME.i3]: 180,\n [TIMEFRAME.i5]: 300,\n [TIMEFRAME.i10]: 600,\n [TIMEFRAME.i15]: 900,\n [TIMEFRAME.i30]: 1800,\n [TIMEFRAME.h]: 3600,\n [TIMEFRAME.h2]: 7200,\n [TIMEFRAME.h4]: 14400,\n [TIMEFRAME.d]: 86400,\n [TIMEFRAME.w]: 604800,\n [TIMEFRAME.m]: 2592000,\n}\n\nexport const CRYPTOS = {\n BTCUSD: 'BTCUSD',\n LTCUSD: 'LTCUSD',\n ETHUSD: 'ETHUSD',\n XRPUSD: 'XRPUSD',\n BCHUSD: 'BCHUSD',\n BTCEUR: 'BTCEUR',\n LTCEUR: 'LTCEUR',\n ETHEUR: 'ETHEUR',\n XRPEUR: 'XRPEUR',\n BCHEUR: 'BCHEUR',\n LTCBTC: 'LTCBTC',\n ETHBTC: 'ETHBTC',\n XRPBTC: 'XRPBTC',\n BCHBTC: 'BCHBTC',\n}\n\nexport enum SpecificChartFunctionality {\n default = 'default',\n quotePage = 'quotePage',\n quotePerf = 'quotePerf',\n chartPage = 'chartPage',\n smallIndex = 'smallIndex',\n offScreen = 'offScreen',\n forexPage = 'forexPage',\n futuresPage = 'futuresPage',\n cryptoPage = 'cryptoPage',\n}\n\nexport enum TextAlign {\n left = 'left',\n right = 'right',\n center = 'center',\n start = 'start',\n end = 'end',\n}\n\nexport enum TextBaseline {\n top = 'top',\n hanging_dont_use = 'hanging', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\n middle = 'middle',\n alphabetic = 'alphabetic',\n ideographic_dont_use = 'ideographic', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\n bottom = 'bottom',\n}\n\nexport enum ScaleType {\n Linear = 'linear',\n Percentage = 'percentage',\n Logarithmic = 'logarithmic',\n}\n\nexport enum QuotePollingIntervalInMs {\n Default = 3000,\n Free = 180000,\n Elite = 3000,\n EliteStocksReduced = 60000,\n}\n\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\n\nexport const ScaleLabel = {\n [ScaleType.Linear]: 'Linear',\n [ScaleType.Percentage]: 'Percentage',\n [ScaleType.Logarithmic]: 'Logarithmic',\n}\n\nexport const PANE_HEIGHT_DEFAULT = {\n chart: 400,\n indicator: 120,\n}\n\nexport const INDICATOR_LABEL_HEIGHT = 24\n\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\n\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\n\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\n\nexport const getTimeframeLabel = (timeframe: string) => {\n switch (timeframe) {\n case TIMEFRAME.i1:\n return '1 MIN'\n case TIMEFRAME.i2:\n return '2 MIN'\n case TIMEFRAME.i3:\n return '3 MIN'\n case TIMEFRAME.i5:\n return '5 MIN'\n case TIMEFRAME.i10:\n return '10 MIN'\n case TIMEFRAME.i15:\n return '15 MIN'\n case TIMEFRAME.i30:\n return '30 MIN'\n case TIMEFRAME.h:\n return '1 HR'\n case TIMEFRAME.h2:\n return '2 HR'\n case TIMEFRAME.h4:\n return '4 HR'\n case TIMEFRAME.d:\n return 'DAILY'\n case TIMEFRAME.w:\n return 'WEEKLY'\n case TIMEFRAME.m:\n return 'MONTHLY'\n default:\n return ''\n }\n}\n\nexport type ChartsPageQueryParams = {\n p: string\n t: string\n l: string\n r?: string\n i?: string\n sidebar?: string\n}\n\nexport type QuotePageQueryParams = {\n p?: string\n t: string\n r?: string\n i?: string\n ty?: QuotePageQueryChartTypes\n}\n\nexport enum QuotePageQueryChartTypes {\n l = 'l',\n c = 'c',\n cs = 'cs',\n hc = 'hc',\n ha = 'ha',\n o = 'o',\n p = 'p',\n}\n\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\n\nexport enum MacroTimeframe {\n // seconds = 'seconds',\n minutes = 'minutes',\n hours = 'hours',\n days = 'days',\n weeks = 'weeks',\n months = 'months',\n}\n\nexport const MicroMacroTimeframe = {\n [TIMEFRAME.i1]: {\n micro: 1,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i2]: {\n micro: 2,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i3]: {\n micro: 3,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i5]: {\n micro: 5,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i10]: {\n micro: 10,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i15]: {\n micro: 15,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i30]: {\n micro: 30,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.h]: {\n micro: 1,\n macro: MacroTimeframe.hours,\n },\n [TIMEFRAME.h2]: {\n micro: 2,\n macro: MacroTimeframe.hours,\n },\n [TIMEFRAME.h4]: {\n micro: 4,\n macro: MacroTimeframe.hours,\n },\n [TIMEFRAME.d]: {\n micro: 1,\n macro: MacroTimeframe.days,\n },\n [TIMEFRAME.w]: {\n micro: 1,\n macro: MacroTimeframe.weeks,\n },\n [TIMEFRAME.m]: {\n micro: 1,\n macro: MacroTimeframe.months,\n },\n}\n\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\n (prev, curr) => ({\n ...prev,\n [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\n ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\n : [MicroMacroTimeframe[curr].micro],\n }),\n {} as { [key in MacroTimeframe]: number[] }\n)\n\ntype IRange = {\n from?: number\n to?: number\n}\n\nexport type IVisibility = {\n [key in MacroTimeframe]?: IRange\n}\n\nexport enum SetVisibilityTo {\n currentAndAbove,\n currentAndBelow,\n currentOnly,\n all,\n}\n\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\n\n// Keep in sync with the clone in Website repo in shared/is-stock-fast-refresh-available.ts\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\n","import React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { Instrument } from '../../../types/shared'\nimport {\n Notification,\n Paragraph,\n generatePathForTimeframeDateRange,\n getDateRangeGroupsWithHref,\n timeframeUtm,\n useNotification,\n} from '../../components'\nimport { SpecificChartFunctionality, TIMEFRAME, TimeframeAndIntradayType } from '../../constants/common'\nimport Chart from '../../models/chart'\nimport Quote from '../../models/quote'\nimport { dateFromUnixTimestamp } from '../../utils'\nimport { getChartStartEndDates, getVisibleBarsNumber } from '../renderUtils'\nimport { useChartsPathLocation } from './use-charts-path-location'\nimport { getTimeframeGroupsWithHref } from './utils'\n\ninterface IPathForTimeframeDateRangeProps {\n timeframe: TimeframeAndIntradayType\n dateRange?: string | null\n ticker?: string\n}\n\nexport interface IDateRange {\n value: string\n timeframe: TIMEFRAME\n}\n\nexport function useChartModelCustomDateRangeValues({\n chartModel,\n isPremium,\n}: {\n chartModel: Chart | null\n isPremium: boolean\n}) {\n const notificationContext = useNotification()\n const location = useLocation()\n const [isFetching, setIsFetching] = React.useState(false)\n const chartLayoutModel = chartModel?.chart_layout() || null\n const chartIndex = chartLayoutModel?.getAllCharts().findIndex((chart) => chartModel!.eql(chart)) ?? -1\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel, chartIndex })\n const specificChartFunctionality = chartLayoutModel?.specificChartFunctionality ?? SpecificChartFunctionality.default\n\n const anchorDate = React.useMemo(() => {\n if (!chartModel) return new Date()\n const quote = chartModel.quote()\n return dateFromUnixTimestamp(quote.date[quote.date.length - 1])\n }, [chartModel])\n\n const generateChartLayoutRouterPath = React.useCallback(\n ({ ticker, timeframe, dateRange }: IPathForTimeframeDateRangeProps) => {\n if (specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n return getChartsToPath({\n ticker: ticker,\n timeframe: timeframe as TIMEFRAME,\n dateRange: dateRange,\n })\n }\n\n return generatePathForTimeframeDateRange({\n isPremium,\n pathname: location.pathname,\n timeframe: timeframe,\n dateRange: dateRange,\n utmCampaign: timeframeUtm[specificChartFunctionality],\n })\n },\n [getChartsToPath, isPremium, specificChartFunctionality, location.pathname]\n )\n\n const timeframeGroupsWithHref = (isPremium: boolean) =>\n getTimeframeGroupsWithHref({\n isPremium,\n generatePath: (timeFrame) => generateChartLayoutRouterPath({ timeframe: timeFrame.value, dateRange: null }),\n })\n\n const dateRangeGroupsWithHref = ({\n isPremium,\n customRange,\n instrument,\n }: {\n isPremium: boolean\n customRange?: string\n instrument: Instrument\n }) =>\n getDateRangeGroupsWithHref({\n isPremium,\n customRange,\n instrument,\n generatePath: (dateRange: { timeframe?: TIMEFRAME; value: string }) =>\n generateChartLayoutRouterPath({ timeframe: dateRange.timeframe!, dateRange: dateRange.value }),\n })\n\n const handleCustomDateRangeValidation = async (dateRangeState: { value: string | null; timeframe: TIMEFRAME }) => {\n if (dateRangeState.value !== null) {\n const { timeframe, ticker, instrument, premarket, aftermarket } = chartModel?.quote() || {}\n const patterns = !!chartModel?.getHasPatterns()\n if (!anchorDate || !instrument || !ticker || !timeframe || !dateRangeState.value) return false\n setIsFetching(true)\n const quote = await Quote.get({\n ticker,\n instrument,\n timeframe: dateRangeState.timeframe,\n options: {\n premarket,\n aftermarket,\n patterns,\n cachePredicate: (quote) => quote.ideaID === undefined,\n fetchNewDataOnCachedQuote: true,\n },\n })\n setIsFetching(false)\n\n const { numOfVisibleBars } = getVisibleBarsNumber({\n ...getChartStartEndDates({ dateRange: dateRangeState.value, quote }),\n quote,\n dateRange: dateRangeState.value,\n })\n if (numOfVisibleBars === 0) {\n notificationContext.show(\n \n \n There are no data for the selected date range. Try selecting different dates.\n \n \n )\n\n return false\n }\n }\n return true\n }\n\n return {\n anchorDate,\n generateChartLayoutRouterPath,\n timeframeGroupsWithHref,\n dateRangeGroupsWithHref,\n isFetching,\n handleCustomDateRangeValidation,\n }\n}\n","import * as React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { ChartsPageQueryParams, LAYOUTS, LayoutType, TIMEFRAME } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { ChartSyncablePart } from '../../models/chart/contstants'\nimport ChartLayout from '../../models/chart_layout'\nimport { getIsMobilePortrait } from '../../utils'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\n\nexport function useChartsPathLocation({\n chartLayoutModel: unwatchedChartLayoutModel,\n chartIndex = -1,\n}: {\n chartLayoutModel: ChartLayout | null\n chartIndex?: number\n}) {\n const location = useLocation()\n const chartLayoutModel = useModelState(unwatchedChartLayoutModel, {\n watchProperties: ['syncChartParts'],\n })\n const hasSyncedTimeframe = React.useMemo(\n () => !!chartLayoutModel?.getIsChartPartInSync(ChartSyncablePart.Timeframe),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [chartLayoutModel?.syncChartParts]\n )\n const hasSyncedTicker = React.useMemo(\n () => !!chartLayoutModel?.getIsChartPartInSync(ChartSyncablePart.Ticker),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [chartLayoutModel?.syncChartParts]\n )\n\n const getChartsToPath = React.useCallback(\n ({\n ticker,\n timeframe,\n dateRange,\n layout,\n }: {\n timeframe?: TIMEFRAME\n dateRange?: string | null\n ticker?: string\n layout?: LayoutType\n }) => {\n if (!chartLayoutModel) {\n return {\n pathname: location.pathname,\n search: '',\n }\n }\n\n const decodedSearch = decodeQueryString(location.search)\n const { count } = LAYOUTS[(layout ?? chartLayoutModel.layout) as LayoutType]\n const urlTickers = decodedSearch.t?.split(',') ?? []\n const urlTimeframes = decodedSearch.p?.split(',') ?? []\n const urlDateRanges = decodedSearch.r?.split(',')\n\n const chartsArrayPlaceholder = Array.from({ length: count })\n const tickers = chartsArrayPlaceholder\n .map((_, index) => {\n const currentTicker = urlTickers[index] ?? urlTickers[urlTickers.length - 1]\n return (chartIndex === index || hasSyncedTicker) && ticker ? ticker : currentTicker\n })\n .join(',')\n const timeframes = chartsArrayPlaceholder\n .map((_, index) => {\n const currentTimeframe = urlTimeframes[index] ?? urlTimeframes[urlTimeframes.length - 1]\n return (chartIndex === index || hasSyncedTimeframe) && timeframe ? timeframe : currentTimeframe\n })\n .join(',')\n const ranges = chartsArrayPlaceholder\n .map((_, index) => {\n const currentDaterange = urlDateRanges\n ? urlDateRanges[index] ?? urlDateRanges[urlDateRanges.length - 1]\n : undefined\n return (chartIndex === index || hasSyncedTimeframe) && dateRange !== undefined ? dateRange : currentDaterange\n })\n .join(',')\n\n return {\n pathname: location.pathname,\n search: `?${encodeQueryString({\n t: tickers,\n p: timeframes,\n r: ranges.split(',').some(Boolean) ? ranges : undefined,\n l: layout ?? chartLayoutModel.layout,\n sidebar: getIsMobilePortrait() ? undefined : decodedSearch.sidebar,\n })}`,\n }\n },\n [chartLayoutModel, chartIndex, location, hasSyncedTicker, hasSyncedTimeframe]\n )\n\n return { getChartsToPath }\n}\n","import { type To } from 'react-router-dom'\n\nimport { getTimeframeGroups } from '../../components'\nimport { TimeframeAndIntradayType } from '../../constants/common'\n\ninterface ITimeFrame {\n value: TimeframeAndIntradayType\n label: string\n labelShort: string\n labelPageTitle?: string\n}\n\ninterface ITimeframeGroup {\n label: string\n timeframes: ITimeFrame[]\n}\n\nexport function getTimeframeGroupsWithHref({\n isPremium,\n generatePath,\n}: {\n isPremium: boolean\n generatePath: (timeframe: ITimeFrame) => To\n}) {\n return getTimeframeGroups(isPremium).map((timeFrameGroup: ITimeframeGroup) => ({\n label: timeFrameGroup.label,\n timeframes: timeFrameGroup.timeframes.map((timeFrame) => ({\n ...timeFrame,\n href: generatePath(timeFrame),\n })),\n }))\n}\n\nexport enum QuoteNodeChartTypes {\n candlesticksimple = 'candlesticksimple',\n candlestick = 'candlestick',\n line = 'line',\n ohlc = 'ohlc',\n heikinashi = 'heikinashi',\n hollowcandlestick = 'hollowcandlestick',\n}\n\nexport enum QuoteUrlChartTypes {\n cs = 'cs',\n c = 'c',\n l = 'l',\n o = 'o',\n ha = 'ha',\n hc = 'hc',\n}\n\nexport const QuoteShortToLongType = {\n [QuoteUrlChartTypes.cs]: QuoteNodeChartTypes.candlesticksimple,\n [QuoteUrlChartTypes.c]: QuoteNodeChartTypes.candlestick,\n [QuoteUrlChartTypes.l]: QuoteNodeChartTypes.line,\n [QuoteUrlChartTypes.o]: QuoteNodeChartTypes.ohlc,\n [QuoteUrlChartTypes.ha]: QuoteNodeChartTypes.heikinashi,\n [QuoteUrlChartTypes.hc]: QuoteNodeChartTypes.hollowcandlestick,\n} as const\n\nexport const QuoteLongToShortType = {\n [QuoteNodeChartTypes.candlesticksimple]: QuoteUrlChartTypes.cs,\n [QuoteNodeChartTypes.candlestick]: QuoteUrlChartTypes.c,\n [QuoteNodeChartTypes.line]: QuoteUrlChartTypes.l,\n [QuoteNodeChartTypes.ohlc]: QuoteUrlChartTypes.o,\n [QuoteNodeChartTypes.heikinashi]: QuoteUrlChartTypes.ha,\n [QuoteNodeChartTypes.hollowcandlestick]: QuoteUrlChartTypes.hc,\n} as const\n\nexport const DEFAULT_TYPES = [\n { iconName: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle' },\n { iconName: 'lineChartType', value: QuoteNodeChartTypes.line, label: 'Line' },\n { iconName: 'ohlcChartType', value: QuoteNodeChartTypes.ohlc, label: 'OHLC' },\n { iconName: 'candleBarHollow', value: QuoteNodeChartTypes.hollowcandlestick, label: 'Hollow Candle' },\n { iconName: 'candleBarHeikinAshi', value: QuoteNodeChartTypes.heikinashi, label: 'Heikin Ashi' },\n]\n\nexport const FREE_TYPES_QUOTE = [\n { iconName: 'candleBarBasic', value: 'candlesticksimple', label: 'Candle - simple' },\n { iconName: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle - advanced' },\n // Filter out the candle from DEFAULT_TYPES, we’re naming it differently\n ...DEFAULT_TYPES.filter((type) => type.value !== QuoteNodeChartTypes.candlestick),\n]\n\nexport const FREE_TYPES_QUOTE_VALUES = ['candlesticksimple', 'candlestick', 'line']\n\nexport type TypeBaseOption = {\n label: string\n value: QuoteNodeChartTypes\n iconName: string\n href?: string\n}\n","import { ObjectHash, Theme } from '../../../../types/shared'\nimport { ChartEventBadgeType } from '../../../constants/common'\nimport { ChartEventBadgeState, IChartEventBadgeProps } from '../utils'\nimport { chartBadgeSvgByType } from './chart-badges-svg-by-type'\n\nconst badgeImages = {} as ObjectHash\nexport const CHART_EVENT_BADGE_SIZE = 24\n\ntype ChartEventBadgeCommonType = Omit & { badgeType: ChartEventBadgeType }\n\nfunction getSvgImageCacheKey(props: Pick) {\n return `${props.badgeType}-${props.theme}-${props.state}`\n}\n\nasync function cacheEventBadgeSvg(props: ChartEventBadgeCommonType) {\n const cacheKey = getSvgImageCacheKey(props)\n const svgHTML = chartBadgeSvgByType[props.badgeType]({ ...props, width: CHART_EVENT_BADGE_SIZE })\n const img = new Image()\n img.src = `data:image/svg+xml,${encodeURIComponent(svgHTML)}`\n badgeImages[cacheKey] = img\n}\n\nfunction prefetchEventBadgeSvgs() {\n Object.values(ChartEventBadgeState).forEach((badgeState) => {\n Object.values(ChartEventBadgeType).forEach((badgeType) => {\n Object.values(Theme).forEach((theme) => {\n void cacheEventBadgeSvg({\n badgeType,\n state: badgeState,\n theme,\n })\n })\n })\n })\n}\n\nif (typeof window !== 'undefined') {\n prefetchEventBadgeSvgs()\n}\n\nexport function getChartEventBadgeImage(props: ChartEventBadgeCommonType) {\n const cacheKey = getSvgImageCacheKey(props)\n return badgeImages[cacheKey]\n}\n","import { Theme } from '../../../../types/shared'\nimport {\n ChartEventBadgeState,\n IChartEventBadgeProps,\n getChartEventBadgeColors,\n getChartEventBageColors,\n} from '../utils'\n\nexport function getChartEventEarningSvgString({\n theme = Theme.light,\n state = ChartEventBadgeState.default,\n width,\n isFuture = false,\n}: IChartEventBadgeProps & { isFuture: boolean }) {\n const { outerStroke, innerStroke, innerFill, textFill } = getChartEventBadgeColors({\n theme,\n state,\n colors: getChartEventBageColors(isFuture ? 'purple' : 'gray'),\n })\n\n // browsers have issue rendering non-straight paths when one have same edge as other,\n // outer stroke line edge is same as inner fill edge and when browser rasterize diagonal line it breaks it down to pixels with variable opacity/color\n // but if there aren't opacity pixels on same place render is correct, due that adding fill solve incorrect color of colliding opacity pixels\n return `\n \n \n \n \n \n \n `\n}\n","import { ChartEventBadgeType } from '../../../constants/common'\nimport { getChartEventDividendsSvgString } from './dividends'\nimport { getChartEventEarningsFutureSvgString } from './earnings-future'\nimport { getChartEventEarningsNegativeSvgString } from './earnings-negative'\nimport { getChartEventEarningsNeutralSvgString } from './earnings-neutral'\nimport { getChartEventEarningsPositiveSvgString } from './earnings-positive'\nimport { getChartEventSplitSvgString } from './split'\n\nexport const chartBadgeSvgByType = Object.freeze({\n [ChartEventBadgeType.Split]: getChartEventSplitSvgString,\n [ChartEventBadgeType.Dividends]: getChartEventDividendsSvgString,\n [ChartEventBadgeType.EarningsPositive]: getChartEventEarningsPositiveSvgString,\n [ChartEventBadgeType.EarningsNegative]: getChartEventEarningsNegativeSvgString,\n [ChartEventBadgeType.EarningsNeutral]: getChartEventEarningsNeutralSvgString,\n [ChartEventBadgeType.EarningsFuture]: getChartEventEarningsFutureSvgString,\n})\n","import { Theme } from '../../../../types/shared'\nimport {\n ChartEventBadgeState,\n IChartEventBadgeProps,\n getChartEventBadgeColors,\n getChartEventBageColors,\n} from '../utils'\n\nexport function getChartEventSplitSvgString({\n theme = Theme.light,\n state = ChartEventBadgeState.default,\n width,\n}: IChartEventBadgeProps) {\n const { outerStroke, innerStroke, innerFill, textFill } = getChartEventBadgeColors({\n theme,\n state,\n colors: getChartEventBageColors('violet'),\n })\n\n // browsers have issue rendering non-straight paths when one have same edge as other,\n // outer stroke line edge is same as inner fill edge and when browser rasterize diagonal line it breaks it down to pixels with variable opacity/color\n // but if there aren't opacity pixels on same place render is correct, due that adding fill solve incorrect color of colliding opacity pixels\n return `\n \n \n \n \n\n \n \n `\n}\n","import { Theme } from '../../../../types/shared'\nimport {\n ChartEventBadgeState,\n IChartEventBadgeProps,\n getChartEventBadgeColors,\n getChartEventBageColors,\n} from '../utils'\n\nexport function getChartEventDividendsSvgString({\n theme = Theme.light,\n state = ChartEventBadgeState.default,\n width,\n}: IChartEventBadgeProps) {\n const { outerStroke, innerStroke, innerFill, textFill } = getChartEventBadgeColors({\n theme,\n state,\n colors: getChartEventBageColors('blue'),\n })\n\n // browsers have issue rendering non-straight paths when one have same edge as other,\n // outer stroke line edge is same as inner fill edge and when browser rasterize diagonal line it breaks it down to pixels with variable opacity/color\n // but if there aren't opacity pixels on same place render is correct, due that adding fill solve incorrect color of colliding opacity pixels\n return `\n \n \n \n \n\n \n \n `\n}\n","import { Theme } from '../../../../types/shared'\nimport {\n ChartEventBadgeState,\n IChartEventBadgeProps,\n getChartEventBadgeColors,\n getChartEventBageColors,\n} from '../utils'\n\nexport function getChartEventEarningsPositiveSvgString({\n theme = Theme.light,\n state = ChartEventBadgeState.default,\n width,\n}: IChartEventBadgeProps) {\n const { outerStroke, innerStroke, innerFill, textFill } = getChartEventBadgeColors({\n theme,\n state,\n colors: getChartEventBageColors('green'),\n })\n\n // browsers have issue rendering non-straight paths when one have same edge as other,\n // outer stroke line edge is same as inner fill edge and when browser rasterize diagonal line it breaks it down to pixels with variable opacity/color\n // but if there aren't opacity pixels on same place render is correct, due that adding fill solve incorrect color of colliding opacity pixels\n return `\n \n \n \n \n \n `\n}\n","import { Theme } from '../../../../types/shared'\nimport {\n ChartEventBadgeState,\n IChartEventBadgeProps,\n getChartEventBadgeColors,\n getChartEventBageColors,\n} from '../utils'\n\nexport function getChartEventEarningsNegativeSvgString({\n theme = Theme.light,\n state = ChartEventBadgeState.default,\n width,\n}: IChartEventBadgeProps) {\n const { outerStroke, innerStroke, innerFill, textFill } = getChartEventBadgeColors({\n theme,\n state,\n colors: getChartEventBageColors('red'),\n })\n\n // browsers have issue rendering non-straight paths when one have same edge as other,\n // outer stroke line edge is same as inner fill edge and when browser rasterize diagonal line it breaks it down to pixels with variable opacity/color\n // but if there aren't opacity pixels on same place render is correct, due that adding fill solve incorrect color of colliding opacity pixels\n return `\n \n \n \n \n \n `\n}\n","import { IChartEventBadgeProps } from '../utils'\nimport { getChartEventEarningSvgString } from './earnings'\n\nexport function getChartEventEarningsNeutralSvgString(args: IChartEventBadgeProps) {\n return getChartEventEarningSvgString({ ...args, isFuture: false })\n}\n","import { IChartEventBadgeProps } from '../utils'\nimport { getChartEventEarningSvgString } from './earnings'\n\nexport function getChartEventEarningsFutureSvgString(args: IChartEventBadgeProps) {\n return getChartEventEarningSvgString({ ...args, isFuture: true })\n}\n","import { Theme } from '../../../types/shared'\nimport twColors from '../../constants/colors'\nimport { ChartEventType } from '../../constants/common'\nimport math, { BIG_NUMBER_VALUES, BigNumber } from '../../helpers/math'\nimport utils from '../../utils'\nimport { formatDateToStringUS } from '../../utils/helpers'\n\ninterface IChartEventBase {\n elementId: string\n eventType: ChartEventType\n dateTimestamp: number // represent 'earningsDate' column of earnings and 'exdate' column for dividends & split\n}\n\nexport interface IEarnings extends IChartEventBase {\n epsActual?: number\n epsEstimate?: number\n epsReportedActual?: number\n epsReportedEstimate?: number\n fiscalEndDate: number\n fiscalPeriod: string\n salesActual?: number\n salesEstimate?: number\n}\n\nexport interface IDividends extends IChartEventBase {\n ordinary: number\n special: number\n}\n\nexport interface ISplit extends IChartEventBase {\n factorFrom: number\n factorTo: number\n}\n\nexport enum ChartEventBadgeState {\n default = 'default',\n hover = 'hover',\n selected = 'selected',\n}\n\nexport interface IChartEventBadgeProps {\n theme: Theme\n state: ChartEventBadgeState\n width: number\n}\n\ninterface IGetChartEventBadgeColors {\n theme: Theme\n state: ChartEventBadgeState\n colors: IBadgeColors\n}\n\ninterface IBadgeStateColors {\n default: string\n hover: string\n selected: string\n}\n\ninterface IBadgeThemeColors {\n outerStroke: string\n innerStroke: string\n innerFill: IBadgeStateColors\n textFill: IBadgeStateColors\n}\n\ninterface IBadgeColors {\n light: IBadgeThemeColors\n dark: IBadgeThemeColors\n}\n\nexport function getChartEventBadgeColors({ theme, state, colors }: IGetChartEventBadgeColors) {\n return {\n outerStroke: colors[theme].outerStroke,\n innerStroke: colors[theme].innerStroke,\n innerFill: colors[theme].innerFill[state],\n textFill: colors[theme].textFill[state],\n }\n}\n\nexport function getFormattedEventDate(\n exdate: number,\n hasEarningsDateSuffix = false,\n options: ObjectHash = {\n month: 'short',\n }\n) {\n const parsedDate = utils.dateFromUnixTimestamp(exdate)\n\n const hours = parsedDate.getHours()\n const formattedDate = formatDateToStringUS(parsedDate, options)\n\n if (hasEarningsDateSuffix) {\n let suffix = ''\n\n if (hours <= 9) {\n suffix = 'BMO'\n } else if (hours >= 16) {\n suffix = 'AMC'\n }\n\n return `${formattedDate} ${suffix}`\n }\n\n return formattedDate\n}\n\nexport function getFormattedValue({\n value,\n bigNumberUnit,\n maxDecimalPlaces = 3,\n}: {\n value: number\n bigNumberUnit?: BigNumber\n maxDecimalPlaces?: number\n}) {\n let numberString = ''\n let suffix = ''\n\n if (bigNumberUnit === undefined) {\n numberString = math.round({ value, overridePlaces: 3 })\n } else {\n const bigNumber = math.formatBigNumber(value * BIG_NUMBER_VALUES[bigNumberUnit], 3, BigNumber.Million)\n numberString = parseFloat(bigNumber.substring(0, bigNumber.length - 1)).toString() // parseFloat with toString are removing trailing zeroes\n suffix = bigNumber.substring(bigNumber.length - 1)\n }\n\n const [wholeNumber, decimalNumber] = numberString.split('.')\n\n if (decimalNumber === undefined) return `${wholeNumber}${suffix}`\n\n let formattedDecimalNumber = decimalNumber\n if (maxDecimalPlaces === 2 || decimalNumber[decimalNumber.length - 1] === '0') {\n formattedDecimalNumber = decimalNumber.slice(0, -1)\n }\n\n return `${[wholeNumber, formattedDecimalNumber].join('.')}${suffix}`\n}\n\nexport function getChartEventBageColors(colorKey: 'violet' | 'blue' | 'red' | 'gray' | 'purple' | 'green') {\n return {\n light: {\n outerStroke: twColors.white,\n innerStroke: twColors[colorKey][400],\n innerFill: {\n default: twColors[colorKey][50],\n hover: twColors[colorKey][100],\n selected: twColors[colorKey][400],\n },\n textFill: {\n default: twColors[colorKey][500],\n hover: twColors[colorKey][600],\n selected: twColors.white,\n },\n },\n dark: {\n outerStroke: twColors.gray[900],\n innerStroke: twColors[colorKey][400],\n innerFill: {\n default: twColors[colorKey][800],\n hover: twColors[colorKey][600],\n selected: twColors[colorKey][400],\n },\n textFill: {\n default: twColors.white,\n hover: twColors.white,\n selected: twColors.white,\n },\n },\n } as IBadgeColors\n}\n","export const chartSettingsAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"chart-settings\" */ './module-entry'),\n cacheKey: 'chart-settings',\n}\n","import * as dateFns from 'date-fns'\n\nimport { getChartStartEndDates } from '../controllers/renderUtils'\nimport Quote from '../models/quote'\n\n// **************START**************\n// Functions from here until END have to be in sync with\n// Finviz-Website: components/timeframe-bar/custom-date-range-utils.ts\n// *********************************\n\nexport enum CustomDateRangePrefixEnum {\n Range = 'range',\n Prev = 'prev',\n}\n\nexport const CUSTOM_DATE_RANGE = 'custom'\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\n\nexport function getParsedDateRange(dateRange: string) {\n return dateRange.split(DATE_RANGE_PREFIX_DELMITER)\n}\n\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\n\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\n const dateFrom = dateFromString ? new Date(dateFromString) : null\n const dateTo = dateToString ? new Date(dateToString) : null\n return {\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\n }\n }\n\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\n\n if ([years, months, days].some(Number.isNaN)) {\n return { start: null, end: null }\n }\n\n return {\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\n end: anchorDate,\n }\n }\n\n return { start: null, end: anchorDate }\n}\n\n// **************END**************\n// Functions below don't need to be\n// in sync with Website repository\n// *******************************\n\nexport function getParsedDateRangeMetaData({ dateRange, quote }: { dateRange: string; quote: Quote }) {\n const parsedRange = getChartStartEndDates({ dateRange, quote })\n const [dateRangePrefix] = getParsedDateRange(dateRange)\n\n let startQuoteDate: Date | null = null\n let endQuoteDate: Date | null = null\n let numOfDaysToRender: number | null = null\n\n if (parsedRange.start && dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\n const daysInQuote = quote.getDaysInQuote()\n const reversedDaysInQuote = [...daysInQuote].reverse()\n const startQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.start!.getTime())\n const endQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.end!.getTime())\n startQuoteDate = reversedDaysInQuote[startQuoteDayIndex] ?? null\n endQuoteDate = reversedDaysInQuote[endQuoteDayIndex] ?? null\n numOfDaysToRender = quote.interval <= 5 ? startQuoteDayIndex - endQuoteDayIndex + 1 : null\n }\n\n return {\n start: parsedRange.start,\n end: parsedRange.end,\n startQuoteDate,\n endQuoteDate,\n numOfDaysToRender,\n numOfBarsToRender: (numOfDaysToRender ?? 0) * (quote.getBarsInDay() ?? 0) || undefined,\n renderDateStart: parsedRange.start && dateFns.startOfDay(parsedRange.start),\n renderDateEnd: parsedRange.end && dateFns.endOfDay(parsedRange.end),\n }\n}\n","import * as d3 from 'd3'\nimport * as dateFns from 'date-fns'\n\nimport { Instrument, ObjectHash } from '../../types/shared'\nimport {\n CHART_MARGIN,\n DateRangeType,\n PREMARKET_AFTERMARKET_HOURS,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n} from '../constants/common'\nimport Chart from '../models/chart'\nimport ChartEventElement from '../models/chart-event-element'\nimport ChartLayout from '../models/chart_layout'\nimport { ISettings } from '../models/chart_settings/interfaces'\nimport Element from '../models/element'\nimport Pane, { ScaleAxis } from '../models/pane'\nimport Quote from '../models/quote'\nimport Utils from '../utils'\nimport utils, { convertLocalToNyTime, dateFromUnixTimestamp, isRedesignedPage } from '../utils'\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../utils/chart'\nimport {\n DATE_RANGE_PREFIX_DELMITER,\n getParsedDateRangeMetaData,\n parseCustomDateRangeUrlParam,\n} from '../utils/chart-date-range-utils'\nimport { CHART_EVENT_BADGE_SIZE } from './chart-events/badges/chart-badge-svg-by-type'\n\ninterface VisibleBarNumberProps {\n start: Date | null\n end: Date\n quote: Quote\n dateRange: string\n}\n\ninterface ChartZoomAndLeftOffsetProps extends Omit {\n chartVisibleWidth: number\n numOfBarsToRender?: number\n chartModel: Chart\n}\n\ninterface ChartStartEndDatesProps {\n dateRange: string\n quote: Quote\n}\n\nexport const getVisibleBarsNumber = ({ start, end, quote, dateRange }: VisibleBarNumberProps) => {\n const startInSec = start ? start.getTime() / 1000 : 0\n const endInSec = end.getTime() / 1000\n const isQuoteDateInRange = (quoteDate: number) => quoteDate >= startInSec && quoteDate <= endInSec\n const lastQuoteDateIndex = quote.date.length - 1\n let lastVisibleBarIndex = lastQuoteDateIndex\n let numOfVisibleBars = 0\n if (\n [DateRangeType.d1, DateRangeType.d5].includes(dateRange as DateRangeType) &&\n quote.instrument === Instrument.Stock\n ) {\n numOfVisibleBars = quote.drawMinutesPerDay\n } else {\n let firstVisibleBarIndex = -1\n lastVisibleBarIndex = -1\n quote.date.forEach((quoteDate, index) => {\n if (isQuoteDateInRange(quoteDate)) {\n if (firstVisibleBarIndex === -1) {\n firstVisibleBarIndex = index\n }\n lastVisibleBarIndex = index\n }\n })\n numOfVisibleBars = lastVisibleBarIndex - firstVisibleBarIndex + 1\n\n if (firstVisibleBarIndex === -1 && lastVisibleBarIndex === -1) {\n return { numOfVisibleBars: 0, numOfBarsOffset: 0 }\n }\n }\n\n return { numOfVisibleBars, numOfBarsOffset: lastQuoteDateIndex - lastVisibleBarIndex }\n}\n\nexport const getChartZoomAndLeftOffset = ({\n chartVisibleWidth,\n start,\n end,\n quote,\n chartModel,\n numOfBarsToRender,\n}: ChartZoomAndLeftOffsetProps) => {\n const { numOfVisibleBars, numOfBarsOffset } = getVisibleBarsNumber({\n start,\n end,\n quote,\n dateRange: chartModel.dateRange,\n })\n if (numOfVisibleBars === 0) {\n return { zoomFactor: chartModel.zoomFactor, leftOffset: chartModel.leftOffset }\n }\n\n const chartLayout = chartModel.chart_layout()\n const zoomFactor = getZoomFactorForBarsToDisplay({\n chartLayout,\n chartVisibleWidth,\n numOfVisibleBars: numOfBarsToRender ?? numOfVisibleBars,\n })\n const barWidth = getBarWidthWithMargin({ chartLayout, zoomFactor })\n const leftOffset =\n getLeftOffset({\n quote,\n chartModel,\n config: {},\n barWidth,\n numberOfBarsToDraw: numOfBarsToRender,\n }) +\n numOfBarsOffset * barWidth\n return { zoomFactor, leftOffset }\n}\n\nexport const getChartStartEndDates = ({ dateRange, quote }: ChartStartEndDatesProps) => {\n const daysInQuote = quote.getDaysInQuote()\n const lastDate = dateFromUnixTimestamp(quote.date[quote.date.length - 1])\n\n if (dateRange.includes(DATE_RANGE_PREFIX_DELMITER)) {\n const range = parseCustomDateRangeUrlParam({ dateRange, anchorDate: lastDate })\n const end = convertLocalToNyTime(\n range.end && range.end.getTime() <= lastDate.getTime() ? range.end : lastDate,\n false\n )\n return {\n start: range.start && convertLocalToNyTime(range.start, false),\n end,\n }\n }\n\n let start\n // No condition is needed here, but this would be dateRangePrefix === DateRangePrefixEnum.Enum\n switch (dateRange) {\n case DateRangeType.d1:\n lastDate.setHours(23, 59, 59, 999)\n start = daysInQuote.length === 0 ? lastDate : daysInQuote[daysInQuote.length - 1]\n break\n case DateRangeType.d5:\n lastDate.setHours(23, 59, 59, 999)\n const startDateIndex = daysInQuote.length === 0 ? -1 : Math.max(daysInQuote.length - 5, 0)\n start = startDateIndex === -1 ? lastDate : daysInQuote[startDateIndex]\n break\n case DateRangeType.m1:\n start = dateFns.subMonths(lastDate, 1)\n break\n case DateRangeType.m3:\n start = dateFns.subMonths(lastDate, 3)\n break\n case DateRangeType.m6:\n start = dateFns.subMonths(lastDate, 6)\n break\n case DateRangeType.ytd:\n start = dateFns.startOfYear(lastDate)\n break\n case DateRangeType.y1:\n start = dateFns.subYears(lastDate, 1)\n break\n case DateRangeType.y2:\n start = dateFns.subYears(lastDate, 2)\n break\n case DateRangeType.y5:\n start = dateFns.subYears(lastDate, 5)\n break\n case DateRangeType.max:\n default:\n start = null\n break\n }\n\n return { start: start && convertLocalToNyTime(start, false), end: convertLocalToNyTime(lastDate, false) }\n}\n\ninterface GetLeftOffsetProps {\n quote: Quote\n chartModel: Chart\n config?: { stretch?: boolean }\n barWidth?: number\n barIndex?: number\n numberOfBarsToDraw?: number\n shouldAlignDaysToLeftApplied?: boolean\n}\n\nexport const getMinMaxLeftOffset = ({\n newLeftOffset,\n chartModel,\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\n barIndex,\n}: {\n newLeftOffset: number\n chartModel: Chart\n barWidth?: number\n barIndex: number\n}) => {\n const { ChartSettings } = chartModel.getChartLayoutSettings()\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\n const numOfBarsInView = Math.floor(width / barWidth)\n const fx = (index: number) => index * barWidth\n return ~~Utils.min(barWidth / 2, Utils.max(newLeftOffset, width - fx(barIndex + numOfBarsInView)))\n}\n\nexport function getFullChartWidth({\n hasAftermarket,\n hasPremarket,\n timeframeMinutes,\n barWidthWithMargin,\n}: {\n hasPremarket: boolean\n hasAftermarket: boolean\n timeframeMinutes: number\n barWidthWithMargin: number\n}) {\n const premarketHoursLength = hasPremarket ? PREMARKET_AFTERMARKET_HOURS : 0\n const aftermarketHoursLength = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS : 0\n const marketMinutesLength = (6.5 + premarketHoursLength + aftermarketHoursLength) * 60\n // CHART_MARGIN.L as left offset + CHART_MARGIN.XXL as right offset\n return CHART_MARGIN.L + CHART_MARGIN.XXL + (marketMinutesLength / timeframeMinutes) * barWidthWithMargin\n}\n\nexport function getIntradayChartConfig({\n timeframeMinutes,\n barWidthWithMargin,\n hasPremarket,\n hasAftermarket,\n maxWidth,\n}: {\n hasPremarket: boolean\n hasAftermarket: boolean\n timeframeMinutes: number\n barWidthWithMargin: number\n maxWidth: number\n}) {\n const fullChartWidth = getFullChartWidth({ hasPremarket, hasAftermarket, barWidthWithMargin, timeframeMinutes })\n const offsetChartAfter = 16 // Int from 0-23 , if last quote date is >= this constant `offsetInPx` is applied (chart is moved to the left)\n const cropChartMinutesLength = PREMARKET_AFTERMARKET_HOURS * 60\n const offsetInPx = (cropChartMinutesLength / timeframeMinutes) * barWidthWithMargin\n const chartWidthWithOffset = fullChartWidth - offsetInPx\n const shouldCropChart =\n hasAftermarket && hasPremarket && maxWidth >= chartWidthWithOffset && maxWidth < fullChartWidth\n\n return {\n fullChartWidth,\n offsetInPx: shouldCropChart ? offsetInPx : 0,\n chartWidthWithOffset: shouldCropChart ? fullChartWidth - offsetInPx : fullChartWidth,\n offsetChartAfter,\n }\n}\n\nexport const getLeftOffset = ({\n quote,\n chartModel,\n config,\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\n barIndex = getBarIndex(quote),\n numberOfBarsToDraw,\n shouldAlignDaysToLeftApplied = true,\n}: GetLeftOffsetProps) => {\n const { ChartSettings } = chartModel.getChartLayoutSettings()\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\n const specificChartFunctionality = chartModel.chart_layout().specificChartFunctionality\n if (config?.stretch) {\n return 0\n }\n if (getIsSmallIndexChart(specificChartFunctionality)) {\n return barWidth\n }\n const fx = (index: number) => index * barWidth\n let leftOffset = width - fx(barIndex) - Math.round(barWidth / 2)\n leftOffset = Math.round(Utils.min(barWidth / 2, Utils.max(leftOffset, width - fx(barIndex + 45))))\n if (\n shouldAlignDaysToLeftApplied &&\n shouldAlignDaysToLeft({\n quote,\n numberOfBarsToDraw,\n specificChartFunctionality,\n dateRange: chartModel.dateRange,\n })\n ) {\n let drawDaysInOneChart = 1\n if (numberOfBarsToDraw) {\n drawDaysInOneChart = Math.ceil(numberOfBarsToDraw / quote.getBarsInDay()!)\n } else if (quote.interval === 10 || chartModel.dateRange === DateRangeType.d5) {\n drawDaysInOneChart = 5\n } else if (quote.interval === 15) {\n drawDaysInOneChart = 6\n } else if (quote.interval === 30) {\n drawDaysInOneChart = 12\n } else if (quote.interval === 60) {\n drawDaysInOneChart = 22\n } else if (quote.interval === 120) {\n drawDaysInOneChart = 39\n } else if (quote.interval === 240) {\n drawDaysInOneChart = 78\n } else if (quote.interval > 240) {\n drawDaysInOneChart = (quote.interval / 30) * 10\n }\n const { offsetInPx, offsetChartAfter } = getIntradayChartConfig({\n hasPremarket: quote.premarket,\n hasAftermarket: quote.aftermarket,\n barWidthWithMargin: barWidth,\n timeframeMinutes: quote.interval,\n maxWidth: chartModel.width,\n })\n const drawDaysWidth = drawDaysInOneChart * quote.getBarsInDay()! * barWidth - offsetInPx\n\n // +1 is a buffer as it often happens drawDaysWidth is wider than width by tiny amount (< 1/10000 of px)\n if (drawDaysWidth <= width + 1) {\n const lastQuoteDate = quote.date.last() ? utils.dateFromUnixTimestamp(quote.date.last()!) : null\n // Align start of day to left if we have enough space to show all bars in day\n const barsToOffset = (Object.keys(quote.getDayToOffset()).length - drawDaysInOneChart) * quote.getBarsInDay()!\n const offsetChartInPx = (lastQuoteDate?.getHours() ?? 0) >= offsetChartAfter ? offsetInPx : 0\n leftOffset = Math.round(-fx(barsToOffset) + barWidth / 2) - offsetChartInPx\n }\n }\n // getMinMaxLeftOffset move left offset to keep at least one bar in view what isn't desired for offscreen charts\n if (specificChartFunctionality === SpecificChartFunctionality.offScreen) {\n return leftOffset\n }\n return getMinMaxLeftOffset({\n newLeftOffset: leftOffset,\n chartModel,\n barWidth,\n barIndex,\n })\n}\n\nexport const getBarIndex = (quote: Quote) => quote?.getBarIndex(quote.open?.length ? quote.open.length - 1 : 0) || 0\n\nexport const getIsSmallIndexChart = (specificChartFunctionality: SpecificChartFunctionality) =>\n specificChartFunctionality === SpecificChartFunctionality.smallIndex\n\ninterface ShouldAlignDaysToLeftProps {\n quote: Quote\n numberOfBarsToDraw?: number\n specificChartFunctionality: SpecificChartFunctionality\n dateRange: DateRangeType | null\n}\n\n/**\n * Evaluate if days should be aligned to the left\n * @param {object} object.quote - Quote model\n * @param {string} object.specificChartFunctionality - SpecificChartFunctionality enum\n * @returns {boolean} boolean\n * */\nexport const shouldAlignDaysToLeft = ({\n quote,\n dateRange,\n numberOfBarsToDraw,\n specificChartFunctionality,\n}: ShouldAlignDaysToLeftProps) => {\n const isStockIntraday = quote.isIntraday && quote.instrument === Instrument.Stock\n // We don't want this to affect /charts page, only if intraday daterange is applied\n const isQuoteOrOffscreen = [SpecificChartFunctionality.quotePage, SpecificChartFunctionality.offScreen].includes(\n specificChartFunctionality\n )\n const isChartPage = specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isChartsInradayDateRange =\n isChartPage && !!dateRange && [DateRangeType.d1, DateRangeType.d5].includes(dateRange)\n const isChartPageWithFixedBars = isChartPage && numberOfBarsToDraw\n return isStockIntraday && (isQuoteOrOffscreen || isChartsInradayDateRange || isChartPageWithFixedBars)\n}\n\ninterface ClipProps {\n canvasCtx: RenderingContext2DType\n width: number\n height: number\n Settings: ISettings['ChartSettings'] | ISettings['IndicatorSettings']\n}\n// pane canvasCtx clip\nexport const clip = ({ canvasCtx, width, height, Settings }: ClipProps) => {\n const contentWidth = width - Settings.left.width - Settings.right.width\n const contentHeight = height - Settings.top.height - Settings.bottom.height\n canvasCtx.beginPath()\n canvasCtx.rect(Settings.left.width, Settings.top.height, contentWidth, contentHeight)\n canvasCtx.clip()\n}\n\nexport const getSettings = (paneModel: Pane) => {\n const { ChartSettings, IndicatorSettings } = paneModel.chart().getChartLayoutSettings()\n for (const element of paneModel.elements().all()) {\n if (element.isIndicator()) {\n return IndicatorSettings\n }\n }\n return ChartSettings\n}\n\ninterface RecountScaleProps {\n chartModel: Chart\n paneModel: Pane\n}\n\ntype ScaledFn = Partial & (d3.ScaleLinear | d3.ScaleSymLog)\n\nconst getShouldOffsetChartDomain = (elementModel: Element | ChartEventElement) => {\n const quote = elementModel.pane().chart().quote()\n\n return quote.chartEvents.length > 0 && ![TIMEFRAME.w, TIMEFRAME.m].includes(quote.timeframe)\n}\n\nexport const recountScale = ({ chartModel, paneModel }: RecountScaleProps) => {\n const { ChartSettings, IndicatorSettings, MarketSentimentSettings } = chartModel.getChartLayoutSettings()\n const chartLayout = chartModel.chart_layout()\n const barWidthWithMargin = getBarWidthWithMargin({ chartLayout, zoomFactor: chartModel.zoomFactor })\n for (const elementModel of [...paneModel.getAllElements(), ...paneModel.getAllChartEvents(false)]) {\n const el = elementModel.instance\n const isChart = elementModel.isChart()\n if (isChart || elementModel.isIndicator()) {\n let fx: ScaledFn, Settings: ISettings['MarketSentimentSettings' | 'ChartSettings' | 'IndicatorSettings'], width\n const scaleType = isChart ? chartModel.scale : ScaleType.Linear\n if (isChart) {\n Settings = chartModel.instrument === Instrument.MarketSentiment ? MarketSentimentSettings : ChartSettings\n } else {\n Settings = IndicatorSettings as ISettings['IndicatorSettings']\n }\n const contentHeight = paneModel.height - Settings.top.height - Settings.bottom.height\n\n if (chartModel.stretch) {\n width = chartModel.width - Settings.left.width - Settings.right.width\n fx = d3\n .scaleLinear()\n .range([0, width])\n .domain([0, Math.max(0, chartModel.quote().close.length - 1)]) as ScaledFn\n } else {\n fx = ((index: number) => index * barWidthWithMargin) as ScaledFn\n fx.invert = (x: number) => x / barWidthWithMargin\n fx.width = function (w) {\n return this.invert(w) - this.invert(0)\n }\n }\n paneModel.updateAttribute('scale', { x: fx }) // some elements need fx to count getMinMax\n\n const { min, max } = paneModel.scaleRange || el.getMinMax!()\n let fy\n\n const handleDomainOffset = (currentScale: ScaledFn, scaleCreator: any) => {\n if (isChart && getShouldOffsetChartDomain(elementModel)) {\n const protectedHeightPx = contentHeight - CHART_EVENT_BADGE_SIZE\n const minPx = currentScale(min)\n const domain = currentScale.domain()\n if (minPx > protectedHeightPx) {\n const tempScale = scaleCreator().range([0, protectedHeightPx]).domain([max, min])\n const extendedMin = tempScale.invert(contentHeight)\n currentScale.domain([domain[0], extendedMin])\n }\n }\n }\n\n switch (scaleType) {\n case ScaleType.Logarithmic:\n fy = d3.scaleSymlog().range([0, contentHeight]).domain([max, min]) as ScaledFn\n handleDomainOffset(fy, d3.scaleSymlog)\n break\n default:\n fy = d3.scaleLinear().range([0, contentHeight]).domain([max, min]) as ScaledFn\n if (!paneModel.scaleRange) {\n fy = fy.nice(10)\n handleDomainOffset(fy, d3.scaleLinear)\n }\n break\n }\n fy.height = function (h: number) {\n return this.invert(h) - this.invert(0)\n }\n paneModel.updateAttribute('scale', {\n x: fx,\n y: fy,\n })\n\n if (isChart) {\n el.setupAxis!(fx as ScaleAxis)\n }\n break\n }\n }\n}\n\n// general, only when blurry ends won't be visible or didn't matter\nexport const getOffsetFromLineWidth = (lineWidth: number) => (lineWidth % 2 === 0 ? 0 : 0.5)\n\ninterface IXYOffsetFromLine {\n lineWidth: number\n x1: number\n y1: number\n x2: number\n y2: number\n}\n\n// return x,y offsets for pixel perfect line rendering\nexport const getXYOffsetFromLine = ({ lineWidth, x1, y1, x2, y2 }: IXYOffsetFromLine) => {\n // don't add offset is lineWidth is even\n if (lineWidth % 2 === 0) {\n return { x: 0, y: 0 }\n }\n if (y1 === y2) {\n return { x: 0, y: 0.5 } // horizontal line\n } else if (x1 === x2) {\n return { x: 0.5, y: 0 } // vertical line\n } else {\n return { x: 0.5, y: 0.5 } // diagonal line\n }\n}\n\nexport const getRoundedObject = (obj: T): T => {\n const rounded = Object.entries(obj)\n for (let i = 0; i < rounded.length; i++) {\n rounded[i][1] = Math.round(rounded[i][1])\n }\n return Object.fromEntries(rounded) as T\n}\n\ninterface ITranslate {\n context: CanvasRenderingContext2D\n xOffset: number\n yOffset: number\n}\n\ninterface ITranslateObj {\n do: () => void\n undo: () => void\n}\n\nexport const getTranslate = ({ context, xOffset, yOffset }: ITranslate): ITranslateObj => ({\n do: () => context.translate(xOffset, yOffset),\n undo: () => context.translate(xOffset * -1, yOffset * -1),\n})\n\ninterface IPercentageScaleValue {\n number: number\n base: number\n}\n\nexport const getPercentageFromValue = ({ number, base }: IPercentageScaleValue) => ((number - base) / base) * 100\n\nexport const getValueFromPercentage = ({ number, base }: IPercentageScaleValue) => (number / 100) * base + base\n\ninterface UpdateZoomAndLeftOffsetByDateRangeProps {\n chartModel: Chart\n quote: Quote\n}\n\nexport function updateZoomAndLeftOffsetByDateRange({ chartModel, quote }: UpdateZoomAndLeftOffsetByDateRangeProps) {\n const { ChartSettings } = chartModel.getChartLayoutSettings()\n const chartVisibleWidth = chartModel.width - (ChartSettings.left.width + ChartSettings.right.width)\n\n const { start, end, numOfBarsToRender } = getParsedDateRangeMetaData({\n dateRange: chartModel.dateRange,\n quote,\n })\n\n const { zoomFactor, leftOffset } = getChartZoomAndLeftOffset({\n chartVisibleWidth,\n start,\n end,\n quote,\n numOfBarsToRender,\n chartModel: chartModel,\n })\n\n if (chartModel.zoomFactor !== zoomFactor || chartModel.leftOffset !== leftOffset) {\n chartModel.updateAttributes({ zoomFactor, leftOffset })\n }\n}\n\nexport function renderPane({\n chartLayoutModel,\n chartModel,\n paneModel,\n canvasCtx,\n shouldRenderCross = false,\n}: {\n chartLayoutModel: ChartLayout\n chartModel: Chart\n paneModel: Pane\n canvasCtx: CanvasRenderingContext2D\n shouldRenderCross?: boolean\n}) {\n if (paneModel.chart().instrument === Instrument.MarketSentiment) {\n canvasCtx.clearRect(0, 0, chartModel.width, paneModel.height)\n } else {\n canvasCtx.set('fillStyle', chartModel.getChartLayoutSettings().ChartSettings.general.Colors.canvasFill)\n canvasCtx.fillRect(0, 0, chartModel.width, paneModel.height)\n }\n const elements = paneModel.getAllElements()\n for (const { instance: elementInstance } of elements) {\n if (typeof elementInstance.renderGrid === 'function') {\n canvasCtx.save()\n elementInstance.renderGrid(canvasCtx)\n canvasCtx.restore()\n }\n }\n\n const chartEvents = paneModel.getAllChartEvents()\n const Settings = getSettings(paneModel)\n for (const { instance: elementInstance } of [...elements, ...chartEvents]) {\n const isDrawing = elementInstance.getIsDrawing()\n const isChartEvent = elementInstance.getIsChartEvent()\n\n if (isDrawing && (chartLayoutModel.isHideDrawingsActive || !elementInstance.getIsVisible())) {\n continue\n } else if ((isDrawing || isChartEvent) && !elementInstance.getIsInChartView(chartModel)) {\n continue\n }\n\n canvasCtx.save()\n if (elementInstance.renderContent != null) {\n canvasCtx.save()\n clip({\n canvasCtx,\n width: chartModel.width,\n height: paneModel.height,\n Settings,\n })\n canvasCtx.translate(paneModel.chart().leftOffset + Settings.left.width, Settings.top.height)\n elementInstance.renderContent(canvasCtx)\n canvasCtx.restore()\n if (typeof elementInstance.renderLabels === 'function') {\n elementInstance.renderLabels(canvasCtx)\n }\n } else {\n elementInstance.render(canvasCtx)\n }\n if (\n shouldRenderCross &&\n (chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage ||\n isRedesignedPage(chartLayoutModel)) &&\n elementInstance.renderCross != null\n ) {\n elementInstance.renderCross(canvasCtx)\n }\n canvasCtx.restore()\n }\n}\n","export const DEFAULT_WIDTHS = {\n min: 200,\n max: 400,\n}\n\nexport enum SidebarDirection {\n vertical,\n horizontal,\n}\n","import React from 'react'\n\nimport { DEFAULT_WIDTHS, SidebarDirection } from '../constants'\nimport { SidebarModule, SidebarModuleType } from '../modules/modules'\n\nexport type SidebarContextType = {\n isOpen: boolean\n isCloseVisible: boolean\n direction: SidebarDirection\n width?: {\n min?: number | string\n max?: number | string\n default?: { desktop?: number; mobile?: number }\n }\n activeModule: SidebarModuleType | null\n close: () => void\n onResize: () => void\n selectModule: (module?: SidebarModule) => void\n}\n\nconst DEFAULT_CONTEXT: SidebarContextType = {\n activeModule: null,\n isOpen: false,\n isCloseVisible: false,\n direction: SidebarDirection.horizontal,\n width: DEFAULT_WIDTHS,\n close: () => {},\n onResize: () => {},\n selectModule: () => {},\n}\n\nexport const SidebarContext = React.createContext(DEFAULT_CONTEXT)\nexport const useSidebarContext = () => React.useContext(SidebarContext)\n","import ChartLayout from '../../models/chart_layout'\n\nexport enum DrawingTool {\n Arrow = 'arrow',\n Brush = 'brush',\n Callout = 'callout',\n Curve = 'curve',\n ElliottWaves = 'elliott-wave',\n Ellipse = 'ellipse',\n FibonacciRetracements = 'fibonacci-retracements',\n HorizontalLine = 'horizontal-line',\n Measure = 'measure',\n Mouse = 'mouse',\n Pitchfork = 'pitchfork',\n Polygon = 'polygon',\n Position = 'position',\n Rectangle = 'rectangle',\n RotatedRectangle = 'rotated-rectangle',\n ScaledLine = 'scaled-line',\n ScaledText = 'scaled-text',\n Triangle = 'triangle',\n VerticalLine = 'vertical-line',\n Xabcd = 'xabcd',\n}\n\nexport enum DrawingActions {\n AddNote = 'add-note',\n DeleteDrawings = 'delete-drawings',\n DeleteAutoSavedDrawings = 'delete-autosaved-drawings',\n}\n\nexport enum DrawingSetting {\n PreserveDrawings = 'preserve-drawings',\n DrawingModeContinuous = 'drawing-mode-continuous',\n HideDrawings = 'hide-drawings',\n LockDrawings = 'lock-drawings',\n}\n\nexport interface IToolBarProps {\n chartLayoutModel: ChartLayout\n isSidebar?: boolean\n isHorizontal?: boolean\n isMobileOverlay?: boolean\n /**\n * Current selected tool id\n */\n activeTool: DrawingTool\n /**\n * On tool item select callback\n */\n onActiveToolChange: (activeTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => void\n /**\n * On drawing actions item select callback\n */\n onDrawingActionClick?: (actionId: DrawingActions) => void\n /**\n * On drawing settings item select callback\n */\n onDrawingSettingClick?: (settingId: DrawingSetting) => void\n /**\n * On drawing end callback\n */\n onDrawingEnd?: () => void\n /**\n * Current state of drawing settings\n */\n drawingSettings: Record\n isAlternativeTheme?: boolean\n /**\n * Are tools disabled\n */\n areToolsDisabled?: boolean\n}\n\nexport interface IToolbarItemProperties {\n icon: string\n iconActive?: string\n iconAction?: string\n title: string\n titleActive?: string\n titleAction?: string\n}\n\nexport interface IToolbarDrawingTool extends IToolbarItemProperties {\n id: DrawingTool\n}\n\nexport interface IToolbarDrawingAction extends IToolbarItemProperties {\n id: DrawingActions\n}\n\nexport interface IToolbarDrawingSetting extends IToolbarItemProperties {\n id: DrawingSetting\n}\n\nexport interface IToolbarDrawingToolItem {\n defaultItem: IToolbarDrawingTool\n toolGroup?: Array\n toolGroupTitle?: string\n}\n\nexport interface IToolbarDrawingActionItem {\n defaultItem: IToolbarDrawingAction\n isDisabled?: boolean\n disabledTooltip?: string\n}\n\nexport interface IToolbarDrawingsSettingItem {\n defaultItem: IToolbarDrawingSetting\n isDisabled?: boolean\n isInAction?: boolean\n disabledTooltip?: string\n}\n","import { Instrument } from '../../types/shared'\nimport { ChartElementType } from '../constants/common'\nimport QuoteModel from '../models/quote'\n\nexport function getInstrumentLabel(instrument: Instrument) {\n switch (instrument) {\n case Instrument.Stock:\n return 'Stock'\n case Instrument.Futures:\n return 'Futures'\n case Instrument.Forex:\n return 'Forex'\n case Instrument.Crypto:\n return 'Crypto'\n case Instrument.MarketSentiment:\n return 'Market Sentiment'\n }\n}\n\nexport function getChartAlt(quoteModel: QuoteModel) {\n return `${quoteModel.name || quoteModel.ticker} - ${getInstrumentLabel(quoteModel.instrument)} Price Chart`\n}\n\nexport const getResponseChartType = (chartType: ChartElementType) => {\n switch (chartType) {\n case ChartElementType.HeikinAshi:\n return 'heikinashi'\n case ChartElementType.HollowCandleStick:\n return 'hollowcandlestick'\n case ChartElementType.LineChart:\n return 'line'\n case ChartElementType.OhlcChart:\n return 'ohlc'\n case ChartElementType.CandleStick:\n default:\n return 'candlestick'\n }\n}\n\nexport const getChartElementTypeFromResponseType = (chartResponseType: string | null) =>\n chartResponseType === null\n ? null\n : Object.values(ChartElementType).find(\n (chartType: ChartElementType) => chartResponseType === getResponseChartType(chartType)\n )\n","import utils from '../utils'\n\nclass AverageTrueRange {\n period: number\n sum: number\n count: number\n value: number\n\n constructor(period: number) {\n this.period = period\n this.sum = 0\n this.count = 0\n this.value = 0\n }\n\n add(high: number, low: number, prevClose: number) {\n const tr = utils.max([high - low, Math.abs(high - prevClose), Math.abs(low - prevClose)])\n\n if (this.count < this.period) {\n this.sum += tr\n this.value = this.sum / (this.count + 1)\n if (this.count === this.period - 1) {\n this.sum /= this.period\n }\n } else {\n this.value = (this.value * (this.period - 1) + tr) / this.period\n }\n this.count++\n }\n}\n\nexport default AverageTrueRange\n","class ExponentialMovingAverage {\n period: number\n multiplier: number\n sum: number\n count: number\n value: number\n\n constructor(period: number) {\n this.period = period\n this.multiplier = 2 / (this.period + 1)\n this.sum = 0\n this.count = 0\n this.value = 0\n }\n\n add(d: number) {\n if (this.count < this.period) {\n this.sum += d\n this.count++\n this.value = this.sum / this.count\n } else {\n this.value = d * this.multiplier + this.value * (1 - this.multiplier)\n }\n }\n}\n\nexport default ExponentialMovingAverage\n","import { PaneArea } from '../../types/shared'\nimport Element, { DefaultAttrs } from '../canvas/element'\nimport BaseChart from '../charts/base_chart'\nimport { ChartEventBadgeType, ChartEventType, TIMEFRAME } from '../constants/common'\nimport {\n CHART_EVENT_BADGE_SIZE,\n getChartEventBadgeImage,\n} from '../controllers/chart-events/badges/chart-badge-svg-by-type'\nimport { ChartEventBadgeState } from '../controllers/chart-events/utils'\nimport { getRoundedObject } from '../controllers/renderUtils'\nimport Chart from '../models/chart'\nimport ChartEventElement from '../models/chart-event-element'\nimport type PaneModel from '../models/pane'\n\ninterface ChartEventAttrs extends DefaultAttrs {\n x: number\n}\n\nfunction getChartEventState(chartEvent: ChartEvent): ChartEventBadgeState {\n if (chartEvent.isOpen) {\n return ChartEventBadgeState.selected\n }\n if (chartEvent.isHovered) {\n return ChartEventBadgeState.hover\n }\n return ChartEventBadgeState.default\n}\n\nclass ChartEvent extends Element {\n static type = ChartEventType.ChartEvent\n static label = 'ChartEvent'\n\n declare scaled: Pick\n\n declare chart: BaseChart\n\n declare model: PaneModel\n\n isOpen = false\n\n left = 0\n top = 0\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.scale(this.getBoundingPointKeys())\n }\n\n getBoundingPointKeys = () => ({ x: ['x'], y: [] })\n\n get type() {\n return (this.constructor as typeof ChartEvent).type\n }\n\n get label() {\n return (this.constructor as typeof ChartEvent).label\n }\n\n getChartEvenBadgeType(): ChartEventBadgeType {\n switch (this.type) {\n case ChartEventType.Dividends:\n return ChartEventBadgeType.Dividends\n case ChartEventType.Split:\n return ChartEventBadgeType.Split\n }\n\n return ChartEventBadgeType.EarningsNeutral\n }\n\n getChartEventModel(): ChartEventElement | undefined {\n return this.model.chartEvents()?.findByAttribute('instance', this)\n }\n\n getXYPosition() {\n const { top, bottom } = this.getChartLayoutSettings().ChartSettings\n const chartEventModel = this.getChartEventModel()\n const { x } = this.scaled\n const roundedXY = getRoundedObject({ x })\n const y =\n (this.model as PaneModel).height -\n top.height -\n bottom.height -\n CHART_EVENT_BADGE_SIZE -\n (chartEventModel?.yIndex ?? 0) * CHART_EVENT_BADGE_SIZE\n\n return { x: roundedXY.x - CHART_EVENT_BADGE_SIZE / 2, y }\n }\n\n getIsVisible() {\n return ![TIMEFRAME.w, TIMEFRAME.m].includes(this.model.chart().quote()?.timeframe)\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n if (!this.getIsVisible()) return\n\n this.attrs.x = Math.round(this.attrs.x)\n const chart = this.model.chart()\n const chartLayout = chart.chart_layout()\n const { x, y } = this.getXYPosition()\n const buffer = 10 + CHART_EVENT_BADGE_SIZE\n if (x + chart.leftOffset < -buffer || x + chart.leftOffset > chart.width + buffer) {\n return\n }\n const item = getChartEventBadgeImage({\n theme: chartLayout.theme,\n state: getChartEventState(this),\n badgeType: this.getChartEvenBadgeType(),\n })\n const { left, top } = this.getChartLayoutSettings().ChartSettings\n this.left = x + chart.leftOffset + left.width + CHART_EVENT_BADGE_SIZE / 2\n this.top = y + top.height\n context.drawImage(item, x, y, CHART_EVENT_BADGE_SIZE, CHART_EVENT_BADGE_SIZE)\n }\n\n setIsHovered(isHovered: boolean) {\n if (!this.getIsVisible()) return\n\n this.isHovered = isHovered\n this.model.updateChartEventsZIndexes()\n this.trigger('change')\n }\n\n // If isOpenOverride is undefined, the function works as toggle\n toggleIsOpen(isOpenOverride?: boolean) {\n const chartLayout = this.model.chart().chart_layout()\n const chartEventModel = this.getChartEventModel()\n\n const isCurrentEventActive = chartLayout.activeChartEvent?.elementId === chartEventModel?.elementId\n const isOpen = isOpenOverride ?? (isCurrentEventActive ? !chartEventModel?.instance.isOpen : true)\n this.isOpen = isOpen\n if (chartLayout.activeChartEvent?.instance.isOpen && !isCurrentEventActive) {\n chartLayout.activeChartEvent?.instance.toggleIsOpen(false)\n }\n if (isOpen || isCurrentEventActive) {\n chartLayout.updateAttribute('activeChartEvent', !isOpen && isCurrentEventActive ? undefined : chartEventModel)\n }\n\n this.model.updateChartEventsZIndexes()\n this.trigger('change')\n }\n\n isInArea(area: PaneArea) {\n if (!this.getIsVisible()) return false\n\n const scaledArea = area.scaled\n const { x, y } = this.getXYPosition()\n const isInArea =\n x <= scaledArea.x &&\n x + CHART_EVENT_BADGE_SIZE >= scaledArea.x &&\n y <= scaledArea.y &&\n y + CHART_EVENT_BADGE_SIZE >= scaledArea.y\n return isInArea\n }\n\n getIsInChartView(chart: Chart) {\n if (!this.getIsVisible()) return false\n\n const { x } = this.getXYPosition()\n const isInView = x + CHART_EVENT_BADGE_SIZE >= -chart.leftOffset && x <= -chart.leftOffset + chart.width\n return isInView\n }\n}\n\nexport default ChartEvent\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\nimport ChartEvent from './chart-event'\n\nclass Dividends extends ChartEvent {\n static type = ChartEventType.Dividends\n static label = ChartEventLabels[ChartEventType.Dividends]\n}\n\nexport default Dividends\n","import { ChartEventBadgeType, ChartEventLabels, ChartEventType } from '../constants/common'\nimport { IEarnings } from '../controllers/chart-events/utils'\nimport ChartEvent from './chart-event'\n\nclass Earnings extends ChartEvent {\n static type = ChartEventType.Earnings\n static label = ChartEventLabels[ChartEventType.Earnings]\n\n getChartEvenBadgeType(): ChartEventBadgeType {\n const eventItem = this.getChartEventModel()?.getChartEventData() as IEarnings | undefined\n\n if (!eventItem) {\n return ChartEventBadgeType.EarningsNeutral\n }\n\n if (eventItem.epsActual === undefined || eventItem.epsEstimate === undefined) {\n const now = Date.now() / 1000\n return eventItem.dateTimestamp > now ? ChartEventBadgeType.EarningsFuture : ChartEventBadgeType.EarningsNeutral\n }\n return eventItem.epsActual - eventItem.epsEstimate < 0\n ? ChartEventBadgeType.EarningsNegative\n : ChartEventBadgeType.EarningsPositive\n }\n}\n\nexport default Earnings\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\nimport ChartEvent from './chart-event'\n\nclass Split extends ChartEvent {\n static type = ChartEventType.Split\n static label = ChartEventLabels[ChartEventType.Split]\n}\n\nexport default Split\n","import { ChartEventType } from '../constants/common'\nimport chartEvent from './chart-event'\nimport dividends from './dividends'\nimport earnings from './earnings'\nimport split from './split'\n\nexport const chartEventsByType = Object.freeze({\n [ChartEventType.ChartEvent]: chartEvent,\n [ChartEventType.Dividends]: dividends,\n [ChartEventType.Split]: split,\n [ChartEventType.Earnings]: earnings,\n})\n","import { ChartConfigChartPaneElement } from '../../types/shared'\nimport { drawingToolsByType } from '../canvas/drawingTools'\nimport { chartEventsByType } from '../chart-events'\nimport { chartsByType } from '../charts/charts'\nimport { indicatorsByType } from '../indicators/indicators'\nimport { overlaysByType } from '../overlays/overlays'\n\nconst canvasElements = {\n ...overlaysByType,\n ...indicatorsByType,\n ...drawingToolsByType,\n ...chartsByType,\n ...chartEventsByType,\n}\n\nexport function getCanvasElementByType(elementType: ChartConfigChartPaneElement['type']) {\n return canvasElements[elementType]\n}\n","import { Instrument, Point } from '../../types/shared'\n\ninterface LinePoints {\n x1: number\n x2: number\n y1: number\n y2: number\n}\n\nexport enum BigNumber {\n Thousand,\n Million,\n Billion,\n Trillion,\n}\n\nexport const BIG_NUMBER_VALUES = {\n [BigNumber.Thousand]: 1e3,\n [BigNumber.Million]: 1e6,\n [BigNumber.Billion]: 1e9,\n [BigNumber.Trillion]: 1e12,\n}\n\nconst BIG_NUMBER_ZEROES = {\n [BigNumber.Thousand]: 3,\n [BigNumber.Million]: 6,\n [BigNumber.Billion]: 9,\n [BigNumber.Trillion]: 12,\n}\n\nconst BIG_NUMBER_SUFFIX = {\n [BigNumber.Thousand]: 'K',\n [BigNumber.Million]: 'M',\n [BigNumber.Billion]: 'B',\n [BigNumber.Trillion]: 'T',\n}\n\nconst math = {\n dotProduct(p1: Point, p2: Point) {\n return p1.x * p2.x + p1.y * p2.y\n },\n\n crossProduct(p1: Point, p2: Point) {\n return p1.x * p2.y - p1.y * p2.x\n },\n\n distance(p1: Point, p2: Point) {\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2))\n },\n\n lineEquation(line: LinePoints) {\n // ax + by + c = 0\n if (line.x1 === line.x2) {\n return {\n a: 1,\n b: 0,\n c: -line.x1,\n }\n }\n const k = (line.y2 - line.y1) / (line.x2 - line.x1)\n return {\n a: -k,\n b: 1,\n c: k * line.x1 - line.y1,\n k,\n }\n },\n\n pointInPolygon(point: Point, polygon: Point[]) {\n // http://alienryderflex.com/polygon/\n let j = polygon.length - 1\n let oddNodes = false\n for (let i = 0; i < polygon.length; i++) {\n const p = polygon[i]\n if (\n ((p.y < point.y && polygon[j].y >= point.y) || (polygon[j].y < point.y && p.y >= point.y)) &&\n (p.x <= point.x || polygon[j].x <= point.x)\n ) {\n if (p.x + ((point.y - p.y) / (polygon[j].y - p.y)) * (polygon[j].x - p.x) < point.x) {\n oddNodes = !oddNodes\n }\n }\n j = i\n }\n return oddNodes\n },\n\n distanceToLine(point: Point, line: LinePoints) {\n const { a, b, c } = this.lineEquation(line)\n const dist = Math.abs(a * point.x + b * point.y + c) / Math.sqrt(a * a + b * b)\n return dist\n },\n\n distanceToSegment(point: Point, line: LinePoints) {\n const l2 = Math.pow(line.x1 - line.x2, 2) + Math.pow(line.y1 - line.y2, 2)\n if (l2 === 0) {\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\n }\n const t = ((point.x - line.x1) * (line.x2 - line.x1) + (point.y - line.y1) * (line.y2 - line.y1)) / l2\n if (t < 0) {\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\n }\n if (t > 1) {\n return Math.sqrt(Math.pow(point.x - line.x2, 2) + Math.pow(point.y - line.y2, 2))\n }\n const x = line.x1 + t * (line.x2 - line.x1)\n const y = line.y1 + t * (line.y2 - line.y1)\n return Math.sqrt(Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2))\n },\n\n getInstrumentDecimalPlaces({ value, instrument }: { value: number; instrument?: Instrument }) {\n if (instrument === Instrument.Crypto && value <= 0.001) {\n return 8\n }\n\n if ((instrument !== Instrument.Stock && value <= 6) || (instrument === Instrument.Stock && value < 1)) {\n return 4\n }\n\n return 2\n },\n\n formatBigNumber(number: number, toFixed?: number, minNumber?: BigNumber) {\n const absNum = Math.abs(number)\n const getString = ({ num, suffix, zeroes }: { num: number; suffix: string; zeroes: number }) => {\n const str = num.toString()\n if (str.includes('e')) {\n const splitString = str.split('e')\n const addZeroes = Number(splitString[1]) - zeroes\n return Math.round(Number(splitString[0])).toString().padEnd(Math.max(0, addZeroes), '0') + suffix\n }\n const sign = Math.sign(num)\n const numberByZeroesCount = Math.pow(10, zeroes)\n const result = (absNum / numberByZeroesCount) * sign\n return (Number.isInteger(result) ? result : result.toFixed(toFixed !== undefined ? toFixed : 1)) + suffix\n }\n\n if (absNum >= BIG_NUMBER_VALUES[BigNumber.Trillion] || minNumber === BigNumber.Trillion) {\n return getString({\n num: number,\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Trillion],\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Trillion],\n })\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Billion] || minNumber === BigNumber.Billion) {\n return getString({\n num: number,\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Billion],\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Billion],\n })\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Million] || minNumber === BigNumber.Million) {\n return getString({\n num: number,\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Million],\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Million],\n })\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Thousand] || minNumber === BigNumber.Thousand) {\n return getString({\n num: number,\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Thousand],\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Thousand],\n })\n } else {\n return toFixed !== undefined ? number.toFixed(toFixed) : number.toString()\n }\n },\n\n round({\n value,\n lastClose = 0,\n instrument,\n overridePlaces,\n }: {\n value: number\n lastClose?: number\n instrument?: Instrument\n overridePlaces?: number\n }) {\n if (Math.abs(value) >= BIG_NUMBER_VALUES[BigNumber.Million]) {\n return this.formatBigNumber(value, overridePlaces)\n }\n\n const places =\n typeof overridePlaces === 'number'\n ? overridePlaces\n : this.getInstrumentDecimalPlaces({ value: lastClose, instrument })\n\n if (places >= 8 && value < 0.000001) {\n // There was an issue with getting NaN when rounding small numbers with latter method\n return value.toFixed(places)\n }\n return Number(`${Math.round(Number(`${value}e+${places}`))}e-${places}`).toFixed(places)\n },\n\n perpendicularPointToLine({ line, distance }: { line: LinePoints; distance: number }) {\n if (distance === 0) {\n return { x: line.x2, y: line.y2 }\n }\n\n let yAxisCoeficient\n let xAxisCoeficient\n\n if (line.x1 <= line.x2 && line.y1 >= line.y2) {\n xAxisCoeficient = -1\n yAxisCoeficient = -1\n } else if (line.x1 <= line.x2 && line.y1 <= line.y2) {\n xAxisCoeficient = 1\n yAxisCoeficient = -1\n } else if (line.x1 >= line.x2 && line.y1 >= line.y2) {\n xAxisCoeficient = -1\n yAxisCoeficient = 1\n } else {\n // conditions falling to else: (line.x1 >= line.x2 && line.y1 <= line.y2)\n xAxisCoeficient = 1\n yAxisCoeficient = 1\n }\n\n const radAngle = Math.atan2(Math.abs(line.x2 - line.x1), Math.abs(line.y2 - line.y1))\n const x = line.x2 + xAxisCoeficient * (distance * Math.cos(radAngle))\n const y = line.y2 + yAxisCoeficient * (distance * Math.sin(radAngle))\n return { x, y }\n },\n\n rotatedPointCoordinates({\n rotationAxisPoint,\n angle,\n pointToRotate,\n }: {\n rotationAxisPoint: Point\n angle: number\n pointToRotate: Point\n }) {\n // return newCoordinates for pointToRotate after rotation defined by\n // angle around rotationAxisPoint\n const sin = Math.sin(angle)\n const cos = Math.cos(angle)\n const rotatedX =\n cos * (pointToRotate.x - rotationAxisPoint.x) +\n sin * (pointToRotate.y - rotationAxisPoint.y) +\n rotationAxisPoint.x\n const rotatedY =\n cos * (pointToRotate.y - rotationAxisPoint.y) -\n sin * (pointToRotate.x - rotationAxisPoint.x) +\n rotationAxisPoint.y\n return { x: rotatedX, y: rotatedY }\n },\n sharedPointLinesAngle({\n sharedPoint,\n oldLinePoint,\n newLinePoint,\n }: {\n sharedPoint: Point\n oldLinePoint: Point\n newLinePoint: Point\n }) {\n // return angle between line from sharedPoint to oldLinePoint and\n // line from sharedPoint to newLinePoint\n const numerator =\n oldLinePoint.y * (sharedPoint.x - newLinePoint.x) +\n sharedPoint.y * (newLinePoint.x - oldLinePoint.x) +\n newLinePoint.y * (oldLinePoint.x - sharedPoint.x)\n const denominator =\n (oldLinePoint.x - sharedPoint.x) * (sharedPoint.x - newLinePoint.x) +\n (oldLinePoint.y - sharedPoint.y) * (sharedPoint.y - newLinePoint.y)\n const ratio = numerator / denominator\n\n return Math.atan(ratio)\n },\n\n twoSegmentLinesIntersection(p1: Point, p2: Point, p3: Point, p4: Point) {\n // line intercept math by Paul Bourke http://paulbourke.net/geometry/pointlineplane/\n // Determine the intersection point of two line segments\n // Return FALSE if the lines don't intersect\n\n // Check if none of the lines are of length 0\n if ((p1.x === p2.x && p1.y === p2.y) || (p3.x === p4.x && p3.y === p4.y)) {\n return false\n }\n\n const denominator = (p4.y - p3.y) * (p2.x - p1.x) - (p4.x - p3.x) * (p2.y - p1.y)\n\n // Lines are parallel\n if (denominator === 0) {\n return false\n }\n\n const ua = ((p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x)) / denominator\n const ub = ((p2.x - p1.x) * (p1.y - p3.y) - (p2.y - p1.y) * (p1.x - p3.x)) / denominator\n\n // is the intersection along the segments\n if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\n return false\n }\n\n // Return a object with the x and y coordinates of the intersection\n const x = p1.x + ua * (p2.x - p1.x)\n const y = p1.y + ua * (p2.y - p1.y)\n\n return { x, y }\n },\n\n // https://stackoverflow.com/a/60368757\n checkLineIntersection(line1_p1: Point, line1_p2: Point, line2_p1: Point, line2_p2: Point) {\n // if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite) and booleans for whether line segment 1 or line segment 2 contain the point\n let a, b\n const result: { x: number; y: number; onLine1: boolean; onLine2: boolean } = {\n x: 0,\n y: 0,\n onLine1: false,\n onLine2: false,\n }\n const denominator =\n (line2_p2.y - line2_p1.y) * (line1_p2.x - line1_p1.x) - (line2_p2.x - line2_p1.x) * (line1_p2.y - line1_p1.y)\n if (denominator === 0) {\n return false\n }\n\n a = line1_p1.y - line2_p1.y\n b = line1_p1.x - line2_p1.x\n const numerator1 = (line2_p2.x - line2_p1.x) * a - (line2_p2.y - line2_p1.y) * b\n const numerator2 = (line1_p2.x - line1_p1.x) * a - (line1_p2.y - line1_p1.y) * b\n a = numerator1 / denominator\n b = numerator2 / denominator\n\n // if we cast these lines infinitely in both directions, they intersect here:\n result.x = line1_p1.x + a * (line1_p2.x - line1_p1.x)\n result.y = line1_p1.y + a * (line1_p2.y - line1_p1.y)\n\n // if line1 is a segment and line2 is infinite, they intersect if:\n if (a > 0 && a < 1) {\n result.onLine1 = true\n }\n // if line2 is a segment and line1 is infinite, they intersect if:\n if (b > 0 && b < 1) {\n result.onLine2 = true\n }\n // if line1 and line2 are segments, they intersect if both of the above are true\n return result\n },\n\n // ray is considered line1, segment is considered line2\n getRayToLineSegmentIntersection(rayOrigin: Point, rayEnd: Point, segmentStart: Point, segmentEnd: Point) {\n const lineIntersection = this.checkLineIntersection(rayOrigin, rayEnd, segmentStart, segmentEnd)\n\n if (\n !lineIntersection ||\n lineIntersection.onLine1 ||\n this.dotProduct(\n this.subtractPoints(rayOrigin, lineIntersection as Point),\n this.subtractPoints(rayOrigin, rayEnd)\n ) <= 0\n )\n return false\n return { ...lineIntersection, x: Math.round(lineIntersection.x), y: Math.round(lineIntersection.y) } // sometimes edge value can have crazy precision instead of `0` something like `5.684341886080802e-14` which is basically 0.00000000000005684341886080802 we should round it\n },\n\n getMiddlePointOnLineSegment(P1: Point, P2: Point) {\n const x = (P1.x - P2.x) / 2 + P2.x\n const y = (P1.y - P2.y) / 2 + P2.y\n return { x, y }\n },\n\n normalizeVector(v: Point) {\n const length = Math.sqrt(v.x * v.x + v.y * v.y)\n return { x: v.x / length, y: v.y / length }\n },\n\n multiplyVectorByScalar(v: Point, scalar: number) {\n return { x: v.x * scalar, y: v.y * scalar }\n },\n\n addPoints(P1: Point, P2: Point) {\n return { x: P1.x + P2.x, y: P1.y + P2.y }\n },\n\n subtractPoints(P1: Point, P2: Point): Point {\n return { x: P1.x - P2.x, y: P1.y - P2.y }\n },\n}\n\nexport default math\n","import Spine from '@finviz/spine'\n\nexport const defaults = {\n enabled: false,\n collapsed: true,\n duration: false,\n timestamp: true,\n logErrors: true,\n withStackTrace: false,\n level: 'log',\n logger: console,\n filterChanges: (model, attrs) => {\n const props = Object.keys(attrs)\n return (\n model.constructor.name === 'Mouse' ||\n model.constructor.name === 'Quote' ||\n (props.length === 1 && (props[0] === 'scale' || props[0] === 'leftOffset'))\n )\n },\n errorTransformer: (error) => error,\n titleFormatter: ({ timestamp, duration }, title, time, took) => {\n const parts = ['model']\n parts.push(`%c${String(title)}`)\n if (timestamp) {\n parts.push(`%c@ ${time}`)\n }\n if (duration) {\n parts.push(`%c(in ${took.toFixed(2)} ms)`)\n }\n return parts.join(' ')\n },\n colors: {\n title: () => 'inherit',\n prevState: () => '#9E9E9E',\n action: () => '#03A9F4',\n nextState: () => '#4CAF50',\n error: () => '#F20404',\n },\n}\n\nconst repeat = (str, times) => new Array(times + 1).join(str)\nconst pad = (num, maxLength = 2) => repeat('0', maxLength - num.toString().length) + num\nconst formatTime = (time) =>\n `${pad(time.getHours())}:${pad(time.getMinutes())}:${pad(time.getSeconds())}.${pad(time.getMilliseconds(), 3)}`\n\nexport const printLogEntry = (logEntry, options = {}) => {\n const { logger, logErrors, titleFormatter, collapsed, timestamp, duration, withStackTrace, colors, level } = {\n ...defaults,\n ...options,\n }\n const { startedTime, title, prevState, data, error, nextState, took } = logEntry\n\n const formattedTime = formatTime(startedTime)\n const titleCSS = colors.title ? `color: ${colors.title(title)};` : ''\n const headerCSS = ['color: gray; font-weight: lighter;']\n headerCSS.push(titleCSS)\n if (timestamp) {\n headerCSS.push('color: gray; font-weight: lighter;')\n }\n if (duration) {\n headerCSS.push('color: gray; font-weight: lighter;')\n }\n const formattedTitle = titleFormatter(defaults, title, formattedTime, took)\n\n try {\n if (collapsed) {\n if (colors.title) {\n logger.groupCollapsed(`%c ${formattedTitle}`, ...headerCSS)\n } else {\n logger.groupCollapsed(formattedTitle)\n }\n } else if (colors.title) {\n logger.group(`%c ${formattedTitle}`, ...headerCSS)\n } else {\n logger.group(formattedTitle)\n }\n } catch (e) {\n logger.log(formattedTitle)\n }\n\n if (colors.prevState) {\n const styles = `color: ${colors.prevState(prevState)}; font-weight: bold`\n logger[level]('%c prev state', styles, prevState)\n } else {\n logger[level]('prev state', prevState)\n }\n\n if (colors.action) {\n const styles = `color: ${colors.action(data)}; font-weight: bold`\n logger[level]('%c arguments ', styles, data)\n } else {\n logger[level]('arguments ', data)\n }\n\n if (error && logErrors) {\n if (colors.error) {\n const styles = `color: ${colors.error(error, prevState)}; font-weight: bold;`\n logger['error']('%c error ', styles, error)\n } else {\n logger['error']('error ', error)\n }\n }\n\n if (colors.nextState) {\n const styles = `color: ${colors.nextState(nextState)}; font-weight: bold`\n logger[level]('%c next state', styles, nextState)\n } else {\n logger[level]('next state', nextState)\n }\n\n if (withStackTrace) {\n logger.groupCollapsed('TRACE')\n logger.trace()\n logger.groupEnd()\n }\n\n try {\n logger.groupEnd()\n } catch (e) {\n logger.log('—— log end ——')\n }\n}\n\nexport const initialize = () => {\n window['logger'] = defaults\n\n const protoModelLoad = Spine.Model.prototype.load\n Spine.Model.prototype.load = function (attrs) {\n if (defaults.enabled && !defaults.filterChanges(this, attrs)) {\n const started = Date.now()\n const logEntry = {\n title: `${this.constructor.name}[#${this.id || this.cid}]`,\n started: started,\n startedTime: new Date(started),\n prevState: this.attributes(),\n data: attrs,\n }\n\n let returnedValue\n try {\n returnedValue = protoModelLoad.apply(this, arguments)\n } catch (e) {\n logEntry.error = e\n }\n\n logEntry.nextState = this.attributes()\n logEntry.took = Date.now() - logEntry.started\n\n printLogEntry(logEntry)\n return returnedValue\n } else {\n return protoModelLoad.apply(this, arguments)\n }\n }\n}\n","import ChartEvent from '../chart-events/chart-event'\nimport ElementModel from '../models/element'\nimport Pane from './pane'\n\nclass ChartEventElement extends ElementModel {\n static initClass(paneModel: typeof Pane) {\n this.configure('ChartEventElement', 'instance', 'lastChange', 'zIndex', 'yIndex', 'elementId')\n this.belongsTo('pane', paneModel)\n }\n\n declare instance: ChartEvent\n yIndex = 0\n\n getChartEventData() {\n return this.instance.model\n .chart()\n .quote()\n ?.chartEvents?.find((stockEvent) => stockEvent.elementId === this?.elementId)\n }\n\n toObject() {\n return {\n ...super.toObject(),\n yIndex: this.yIndex,\n }\n }\n\n toConfig() {\n return {\n ...super.toConfig(),\n yIndex: this.yIndex,\n }\n }\n}\n\nexport default ChartEventElement\n","import Spine from '@finviz/spine'\n\nimport Chart from './chart'\n\nclass Indicator extends Spine.Model {\n static initClass(chartModel: typeof Chart) {\n this.configure('Indicator', 'instance')\n this.belongsTo('chart', chartModel)\n }\n\n declare chart: () => Chart\n\n // instance - todo - not sure what instance type to put here\n}\n\nexport default Indicator\n","import Spine from '@finviz/spine'\n\nimport Chart from './chart'\n\nclass Overlay extends Spine.Model {\n static initClass(chartModel: typeof Chart) {\n this.configure('Overlay', 'overlay')\n this.belongsTo('chart', chartModel)\n }\n\n declare overlay: any\n declare chart: () => Chart\n}\n\nexport default Overlay\n","/**\n * This file sets up the relationships between models and solves circular dependencies\n * This file needs to be imported in the index file so that the relationships are\n * called in time for instantiation.\n */\nimport Chart from './chart'\nimport ChartEventElement from './chart-event-element'\nimport ChartLayout from './chart_layout'\nimport DrawingsInternalStore from './drawings-internal-store'\nimport Element from './element'\nimport Indicator from './indicator'\nimport Overlay from './overlay'\nimport Pane from './pane'\nimport Quote from './quote'\n\nChart.initClass(Pane, Quote, ChartLayout)\nChartLayout.initClass(Chart, DrawingsInternalStore)\nDrawingsInternalStore.initClass()\nElement.initClass(Pane)\nChartEventElement.initClass(Pane)\nIndicator.initClass(Chart)\nOverlay.initClass(Chart)\nPane.initClass(Element, ChartEventElement, Chart)\n","import 'lib/shims'\n\nimport { initialize } from './logger'\nimport './models/relationships'\n\nif (document.location.hostname === 'localhost') {\n initialize()\n}\n","import Spine from '@finviz/spine'\nimport merge from 'lodash.merge'\n\nimport {\n ChartConfigChartPaneElement,\n CustomSpineEvents,\n IModalConfig,\n IModalConfigInput,\n ObjectHash,\n PaneArea,\n RequireByKey,\n Theme,\n} from '../../types/shared'\nimport Line from '../canvas/line'\nimport Text from '../canvas/text'\nimport tailwindColors from '../constants/colors'\nimport {\n FONT_SIZE,\n INDICATOR_LABEL_HEIGHT,\n IndicatorType,\n OFFSET,\n PADDING,\n SpecificChartFunctionality,\n TextAlign,\n TextBaseline,\n} from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport mouseModel from '../models/mouse'\nimport Pane from '../models/pane'\nimport Quote from '../models/quote'\nimport { getChartLayoutSettings } from '../models/settings'\nimport { isRedesignEnabled } from '../utils'\nimport { roundedRect } from '../utils/canvas-render'\nimport { renderCross } from '../utils/chart'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getIsSSr, getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\n\nconst INDICATOR_DEFAULT_DOMAIN = (indicator: IndicatorType) => {\n switch (indicator) {\n case IndicatorType.Rvol:\n return { min: 0, max: 2 }\n case IndicatorType.Atr:\n return { min: 0, max: 10 }\n case IndicatorType.Adx:\n case IndicatorType.Aro:\n case IndicatorType.Mfi:\n case IndicatorType.Perf:\n case IndicatorType.Rmi:\n case IndicatorType.Rsi:\n case IndicatorType.Stofu:\n case IndicatorType.Ult:\n return { min: 0, max: 100 }\n case IndicatorType.Macd:\n case IndicatorType.Rwi:\n case IndicatorType.Trix:\n return { min: -1, max: 1 }\n case IndicatorType.Wr:\n return { min: -100, max: 0 }\n case IndicatorType.Aroosc:\n case IndicatorType.Roc:\n return { min: -100, max: 100 }\n case IndicatorType.Cci:\n case IndicatorType.Fi:\n return { min: -200, max: 200 }\n default:\n return { min: 0, max: 100 }\n }\n}\n\nexport interface IIndicatorIsValid {\n getIsValid(key: string): boolean | void\n}\n\nclass Indicator extends Spine.Module implements IIndicatorIsValid {\n static type = IndicatorType.Indicator\n static label = 'Indicator'\n\n static initClass() {\n Object.defineProperty(this.prototype, 'height', {\n get() {\n return this.model.height\n },\n })\n Object.defineProperty(this.prototype, 'contentHeight', {\n get() {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n return this.height - IndicatorSettings.top.height - IndicatorSettings.bottom.height\n },\n })\n }\n\n static fromObject(values: ObjectHash, model: Pane) {\n const indicator = new this(values, model)\n indicator.set(values)\n return indicator\n }\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\n return periodInt\n }\n\n declare data: Quote\n declare min: number\n declare max: number\n declare contentHeight: number\n declare height: number\n\n attrs: Attrs\n model: Pane\n labelWidth = 0\n fetchedAt = -1\n leftOffset = 0\n width = 0\n contentWidth = 0\n lastValue: number | null = null\n shouldUpdate = true\n tickers: string | null = null\n period?: string | number\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.attrs = attrs\n this.model = model\n this.data = this.model.chart().quote()\n\n this.renderYAxis = this.renderYAxis.bind(this)\n this.renderCrossText = this.renderCrossText.bind(this)\n\n this.model.chart().bind('update', this.trigger.bind(this, 'change'))\n this.model.bind('update change', this.trigger.bind(this, 'change'))\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\n this.model.bind('destroy', () => {\n mouseModel.unbind('change', mouseModelChangeHandler)\n })\n mouseModel.bind('change', mouseModelChangeHandler)\n\n this.model.chart().chart_layout().bind('theme', this.setupCache.bind(this))\n }\n\n get type() {\n return (this.constructor as typeof Indicator).type\n }\n\n get label() {\n return (this.constructor as typeof Indicator).label\n }\n\n render(context: CanvasRenderingContext2D) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n this.data = this.model.chart().quote()\n this.leftOffset = this.model.chart().leftOffset\n this.width = this.model.chart().width\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\n\n this.compute()\n\n this.setupCache()\n\n this.renderYAxis(context)\n\n context.save()\n this.clip(context)\n this.renderXAxis(context)\n const translate = getTranslate({\n context,\n xOffset: this.leftOffset + IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n this.renderIndicator(context)\n translate.undo()\n context.restore()\n\n if (!this.getIsChartPageSpecificFunctionality()) {\n this.renderLabel(context)\n }\n }\n\n isComputeNecessary() {\n // if quote was updated (this.fetchedAt !== this.data.fetchedAt)\n // or indicator setting was changed via modal (this.shouldUpdate)\n // allow compute and update variables to prevent another unless\n // those variables change again\n if (this.fetchedAt !== this.data.fetchedAt || this.shouldUpdate) {\n this.fetchedAt = this.data.fetchedAt\n this.shouldUpdate = false\n return true\n }\n return false\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n let y\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n const ticks = this.model.scale.y.ticks(10)\n const tickTextStep = Math.abs(ticks[2] - ticks[0])\n const yLine = new Line(\n {\n x1: 0,\n x2: this.contentWidth,\n strokeStyle: Colors.grid,\n dashLength: 3,\n },\n this.model\n )\n const text = new Text(\n {\n x: this.contentWidth + OFFSET.M + IndicatorSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n },\n this.model\n )\n for (let index = 0; index < ticks.length; index++) {\n const tick = ticks[index]\n y = Math.round(this.fy(tick))\n yLine.set({ y1: y, y2: y }).render(context)\n if (index % 2 === 0) {\n text.set({ text: this.formatAxis(tick, tickTextStep), y }).render(context)\n }\n }\n\n const minY = 0\n const maxY = this.contentHeight\n const valueY = this.lastValue === null ? 0 : Math.round(this.fy(this.lastValue))\n if (this.lastValue != null && valueY >= minY && valueY <= maxY) {\n new Text(\n {\n text: math.formatBigNumber(this.lastValue, 2),\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\n y: valueY,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\n padding: {\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\n },\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.indicatorCurrentText,\n background: Colors.indicatorCurrentBackground,\n },\n this.model\n ).render(context)\n }\n\n translate.undo()\n }\n\n renderXAxis(context: CanvasRenderingContext2D) {\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const xLine = new Line(\n {\n x1: 0,\n x2: 0,\n y1: 0,\n y2: this.contentHeight,\n strokeStyle: Colors.grid,\n dashLength: 3,\n },\n this.model\n )\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n for (let tick = 0, end = this.data.date.length; tick < end; tick += 10) {\n const x = Math.round(this.fx(tick) + this.leftOffset)\n if (x < -15 || x > this.width + 15) {\n // margin?\n continue\n }\n xLine.set({ x1: x, x2: x }).render(context)\n }\n translate.undo()\n }\n\n renderLabel(context: CanvasRenderingContext2D) {\n if (this.getIsChartPageSpecificFunctionality()) {\n this.renderLabelChartsPage(context)\n } else {\n this.renderLabelQuotePage(context)\n }\n }\n\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const label = new Text(\n {\n text: this.toString(),\n x: IndicatorSettings.left.indicatorLabel.margin.left,\n y: IndicatorSettings.left.indicatorLabel.margin.top,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\n fillStyle: Colors.text,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.model\n )\n this.labelWidth = label.measure(context)\n return label.render(context)\n }\n\n renderLabelChartsPage(context: CanvasRenderingContext2D): { x: number; y: number; labelWidth: number } | void {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n const { theme, specificChartFunctionality } = this.model.chart().chart_layout()\n const isDarkMode = theme === Theme.dark\n const x =\n specificChartFunctionality === SpecificChartFunctionality.quotePage\n ? OFFSET.S\n : IndicatorSettings.left.indicatorLabel.margin.left!\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\n const label = new Text(\n {\n text: this.toString(),\n x: x * 2,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n },\n this.model\n )\n this.labelWidth = label.measure(context) + IndicatorSettings.left.indicatorLabel.margin.left! * 2\n label.set({ y: y + (INDICATOR_LABEL_HEIGHT - label.attrs.lineHeight / 2) })\n roundedRect({\n ctx: context,\n x,\n y,\n height: INDICATOR_LABEL_HEIGHT,\n width: this.labelWidth,\n radius: 6,\n color: `${tailwindColors.gray[isDarkMode ? 700 : 50]}cc`,\n })\n label.render(context)\n\n return { x, y, labelWidth: this.labelWidth }\n }\n\n renderCross(context: CanvasRenderingContext2D) {\n renderCross({\n context,\n mouseModel,\n paneModel: this.model,\n quote: this.data,\n contentWidth: this.contentWidth,\n contentHeight: this.contentHeight,\n isIndicator: true,\n isPerfIndicator: this.type === IndicatorType.Perf,\n onRenderCrossText: !this.getIsChartPageSpecificFunctionality() ? this.renderCrossText : undefined,\n })\n\n if (this.getIsChartPageSpecificFunctionality()) {\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.model))\n }\n }\n\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\n this.data = this.model.chart().quote()\n const index = Number.isNaN(crossIndex) ? this.data.close.length - 1 : crossIndex\n if (this.getIsChartPageSpecificFunctionality()) {\n this.renderLabelChartsPage(context)\n\n this.renderCrossTextChartsPage(context, index)\n } else {\n this.renderCrossTextQuotePage(context, index)\n }\n }\n\n renderCrossTextChartsPage(_: CanvasRenderingContext2D, __: number) {}\n\n renderCrossTextQuotePage(_: CanvasRenderingContext2D, __: number) {}\n\n renderOversoldOverbought(\n context: CanvasRenderingContext2D,\n array: number[],\n from: number,\n oversold: number,\n zero: number,\n overbought: number,\n drawLines?: boolean\n ) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n if (this.data.close.length === 0) return\n\n if (drawLines == null) {\n drawLines = true\n }\n\n context.save()\n\n let clipHeight = Math.round(this.fy(oversold) - this.fy(this.model.scale.y.domain()[1]))\n if (clipHeight <= 0 || getIsSSr()) {\n context.beginPath()\n context.rect(\n -this.leftOffset,\n this.fy(this.model.scale.y.domain()[1]) + 1, // compensation to addition of 1 in clip function\n this.contentWidth,\n clipHeight < 0 ? clipHeight - 1 : -1 // clipHeight - 1 is a compensation to addition of 1 in clip function ; fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\n )\n }\n context.clip()\n context.set('fillStyle', '#87ceef')\n\n context.beginPath()\n context.moveTo(this.fx(0), Math.round(this.fy(this.model.scale.y.domain()[0])))\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: from,\n }\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(array[i])))\n },\n })\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[0])))\n context.fill()\n context.restore()\n if (drawLines) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(oversold)),\n y2: Math.round(this.fy(oversold)),\n strokeStyle: '#69c1ea',\n },\n this.model\n ).render(context)\n }\n\n if (drawLines) {\n this.renderZeroLine(context, zero)\n }\n\n context.save()\n clipHeight = Math.round(this.fy(overbought))\n if (clipHeight >= 0 || getIsSSr()) {\n context.beginPath()\n context.rect(\n -this.leftOffset,\n this.fy(this.model.scale.y.domain()[0]),\n this.contentWidth,\n clipHeight > 0 ? clipHeight : 1 // // fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\n )\n }\n\n context.clip()\n context.set('fillStyle', '#dc9fe5')\n context.beginPath()\n context.moveTo(this.fx(0), Math.round(this.fy(this.model.scale.y.domain()[1])))\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(array[i])))\n },\n })\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[1]) + 1))\n context.fill()\n context.restore()\n if (drawLines) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(overbought)),\n y2: Math.round(this.fy(overbought)),\n strokeStyle: '#d386df',\n },\n this.model\n ).render(context)\n }\n\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\n context.set('fillStyle', '#dc9fe5')\n\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(Math.round(x), Math.round(this.fy(array[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n renderZeroLine(context: CanvasRenderingContext2D, zero: number) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(zero)),\n y2: Math.round(this.fy(zero)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n }\n\n setupCache() {}\n\n clip(context: CanvasRenderingContext2D) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n context.beginPath()\n context.rect(IndicatorSettings.left.width, IndicatorSettings.top.height, this.contentWidth, this.contentHeight + 1) // +1 shows one more pixel which is needed to be able to see a line at very bottom of an indicaor\n return context.clip()\n }\n\n formatAxis(value: number, tickStep?: number) {\n if (tickStep !== undefined && 10 > tickStep) {\n return value.toFixed(2)\n }\n return value.toString()\n }\n\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\n\n fy = (y: number) => this.model.scale.y(y)\n\n set(values: Partial) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n this.shouldUpdate = true\n for (const key in values) {\n if (key !== 'type') {\n // @ts-expect-error - values keys don't have to always match variables on the instance\n this[key] = values[key]\n }\n }\n this.width = this.model.chart().width\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\n\n const newAttrs = this.getModalConfig()\n .inputs.map(({ value }) => value.toString())\n .join(',')\n if (newAttrs) this.attrs = { ...this.attrs, period: newAttrs }\n\n this.model.trigger(CustomSpineEvents.ManualChange)\n }\n\n parsePeriodInt(values: Partial) {\n if (typeof values.period === 'string') {\n this.period = Number.parseInt(values.period, 10)\n this.model.trigger(CustomSpineEvents.ManualChange)\n }\n }\n\n setModel(model: Pane) {\n return (this.model = model)\n }\n\n isInArea(area: PaneArea) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n const x = IndicatorSettings.left.indicatorLabel.margin.left!\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\n let width = OFFSET.M * 2 + this.labelWidth\n let height = OFFSET.S * 2 + FONT_SIZE.M\n\n if (this.getIsChartPageSpecificFunctionality()) {\n width = this.labelWidth\n height = INDICATOR_LABEL_HEIGHT\n }\n\n if (x < area.cursorX && area.cursorX < width + x && y < area.cursorY && area.cursorY < height + y) {\n return true\n }\n return false\n }\n\n moveBy() {}\n\n thumbsAreInArea() {\n return false\n }\n\n computeVisibleMinMax(...arrays: number[][]) {\n let min = Number.MAX_VALUE\n let max = -Number.MAX_VALUE\n\n const { leftOffset } = this.model.chart()\n for (const arr of arrays) {\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const center = this.fx(i)\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\n // margin?\n continue\n }\n\n if (min > arr[i]) {\n min = arr[i]\n }\n if (max < arr[i]) {\n max = arr[i]\n }\n }\n }\n\n return min !== max ? { min, max } : this.getDomainDefaults(this.type)\n }\n\n getModalConfig(): IModalConfig {\n return {\n title: '',\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n getDomainDefaults = (indicatorType: IndicatorType) => INDICATOR_DEFAULT_DOMAIN(indicatorType)\n\n getMinMax() {\n this.data = this.model.chart().quote()\n this.compute()\n return { min: this.min, max: this.max }\n }\n\n toObject() {\n return merge({}, this.attrs, { type: this.type, tickers: this.tickers })\n }\n\n toConfig(): T['attrs'] & { type: T['type'] } {\n return {\n type: this.type,\n period: this.getModalConfig()\n .inputs.map((input: IModalConfigInput) => input.value.toString())\n .join(','),\n }\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.model.chart().chart_layout())\n }\n\n renderIndicator(_: CanvasRenderingContext2D) {\n throw Error('Implement renderIndicator method')\n }\n\n getIsValid(_: string): boolean | undefined {\n throw Error('Implement')\n }\n\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\n }\n\n getIsChartPageSpecificFunctionality() {\n const { specificChartFunctionality } = this.model.chart().chart_layout()\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isRedesignedFuturesForexCrypto =\n isRedesignEnabled() &&\n [\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n SpecificChartFunctionality.quotePage,\n ].includes(specificChartFunctionality)\n\n return isCharts || isRedesignedFuturesForexCrypto\n }\n\n getIsDrawing() {\n return false\n }\n\n getIsChartEvent() {\n return false\n }\n\n compute() {\n throw Error('Implement compute method')\n }\n}\n\nIndicator.initClass()\n\nexport default Indicator\n","export function roundedRect({\n ctx,\n x,\n y,\n width,\n height,\n radius,\n color,\n}: {\n ctx: CanvasRenderingContext2D\n x: number\n y: number\n width: number\n height: number\n radius: number\n color: string\n}) {\n ctx.translate(0.5, 0.5)\n ctx.set('strokeStyle', color)\n ctx.set('fillStyle', color)\n ctx.beginPath()\n ctx.moveTo(x, y + radius)\n ctx.lineTo(x, y + height - radius)\n ctx.arcTo(x, y + height, x + radius, y + height, radius)\n ctx.lineTo(x + width - radius, y + height)\n ctx.arcTo(x + width, y + height, x + width, y + height - radius, radius)\n ctx.lineTo(x + width, y + radius)\n ctx.arcTo(x + width, y, x + width - radius, y, radius)\n ctx.lineTo(x + radius, y)\n ctx.arcTo(x, y, x, y + radius, radius)\n ctx.stroke()\n ctx.fill()\n ctx.translate(-0.5, -0.5)\n}\n","import { IndicatorType } from '../constants/common'\nimport utils from '../utils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass ADX extends Indicator {\n static type = IndicatorType.Adx\n static label = 'ADX'\n\n declare period: number\n pdi: number[] = []\n mdi: number[] = []\n adx: number[] = []\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n let adx, amdm, apdm, mdi, pdi\n this.pdi = []\n this.mdi = []\n this.adx = []\n let atr = (apdm = amdm = adx = 0)\n for (let i = this.period; i < this.data.close.length; i++) {\n const deltaHigh = this.data.high[i] - this.data.high[i - 1]\n const deltaLow = this.data.low[i - 1] - this.data.low[i]\n\n let pdm = 0\n if (deltaHigh > 0 && deltaHigh > deltaLow) {\n pdm = deltaHigh\n }\n\n let mdm = 0\n if (deltaLow > 0 && deltaLow > deltaHigh) {\n mdm = deltaLow\n }\n\n const tr = utils.max([\n this.data.high[i] - this.data.low[i],\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\n ])\n\n atr = (atr * (this.period - 1) + tr) / this.period\n apdm = (apdm * (this.period - 1) + pdm) / this.period\n amdm = (amdm * (this.period - 1) + mdm) / this.period\n\n pdi = atr > 0 ? (apdm * 100) / atr : 0\n mdi = atr > 0 ? (amdm * 100) / atr : 0\n const di = Math.abs(pdi - mdi)\n const dx = pdi + mdi > 0 ? (di * 100) / (pdi + mdi) : 0\n adx = (adx * (this.period - 1) + dx) / this.period\n\n this.pdi[i] = pdi\n this.mdi[i] = mdi\n this.adx[i] = adx\n }\n this.lastValue = this.adx.last() ?? null\n }\n const { min, max } =\n this.pdi.length > 0 || this.mdi.length > 0 || this.adx.length > 0\n ? this.computeVisibleMinMax(this.pdi, this.mdi, this.adx)\n : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (this.data.close.length === 0) return\n\n context.translate(0.5, 0.5)\n context.set('strokeStyle', '#2eb12e')\n context.beginPath()\n\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period,\n }\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.pdi[i])))\n },\n })\n\n context.stroke()\n\n context.set('strokeStyle', '#d43737')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.mdi[i])))\n },\n })\n context.stroke()\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.beginPath()\n\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.adx[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `ADX ${this.period}`\n }\n}\n\nexport default ADX\n","import Text from '../canvas/text'\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nconst COLORS = {\n aroonUp: '#00a000',\n aroonDown: '#c80000',\n}\n\nclass Aroon extends Indicator {\n static type = IndicatorType.Aro\n static label = 'Aroon'\n\n aroonUp: number[] = []\n aroonDown: number[] = []\n declare period: number\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.renderYAxis = this.renderYAxis.bind(this)\n }\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n this.aroonUp = []\n this.aroonDown = []\n\n const startAt = this.period - 1\n for (let i = startAt; i < this.data.close.length; i++) {\n const highPeriod = this.data.high.slice(i - startAt, i + 1)\n const highestInPeriod = Math.max(...highPeriod)\n const periodSinceHigh = this.period - (highPeriod.indexOf(highestInPeriod) + 1)\n this.aroonUp[i] = 100 * ((this.period - periodSinceHigh) / this.period)\n\n const lowPeriod = this.data.low.slice(i - startAt, i + 1)\n const lowestInPeriod = Math.min(...lowPeriod)\n const periodSinceLow = this.period - (lowPeriod.indexOf(lowestInPeriod) + 1)\n this.aroonDown[i] = 100 * ((this.period - periodSinceLow) / this.period)\n }\n\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (this.data.close.length === 0) return\n\n context.translate(0.5, 0.5)\n context.set('strokeStyle', COLORS.aroonDown)\n context.beginPath()\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period,\n }\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.aroonDown[i])))\n },\n })\n context.stroke()\n\n context.set('strokeStyle', COLORS.aroonUp)\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.aroonUp[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n super.renderYAxis(context)\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n const text = new Text(\n {\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\n padding: {\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\n },\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.indicatorCurrentText,\n },\n this.model\n )\n const textLabels = []\n if (this.aroonDown.length > 0) {\n textLabels.push({\n text: this.aroonDown.last()!.toFixed(2),\n y: Math.round(this.fy(this.aroonDown.last()!)),\n background: COLORS.aroonDown,\n })\n }\n if (this.aroonUp.length > 0) {\n textLabels.push({\n text: this.aroonUp.last()!.toFixed(2),\n y: Math.round(this.fy(this.aroonUp.last()!)),\n background: COLORS.aroonUp,\n })\n }\n\n const minY = 0\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\n textLabels.forEach((labelSetting) => {\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\n text.set(labelSetting).render(context)\n }\n })\n\n translate.undo()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 25,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Aroon ${this.period}`\n }\n}\n\nexport default Aroon\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass AroonOscillator extends Indicator {\n static type = IndicatorType.Aroosc\n static label = 'Aroon Oscillator'\n\n oscillator: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.oscillator = []\n\n const startAt = this.period - 1\n for (let i = startAt; i < this.data.close.length; i++) {\n const highPeriod = this.data.high.slice(i - startAt, i + 1)\n const highestInPeriod = Math.max(...highPeriod)\n const periodSinceHigh = this.period - highPeriod.indexOf(highestInPeriod)\n const aroonUp = 100 * ((this.period - periodSinceHigh) / this.period)\n\n const lowPeriod = this.data.low.slice(i - startAt, i + 1)\n const lowestInPeriod = Math.min(...lowPeriod)\n const periodSinceLow = this.period - lowPeriod.indexOf(lowestInPeriod)\n const aroonDown = 100 * ((this.period - periodSinceLow) / this.period)\n\n this.oscillator[i] = aroonUp - aroonDown\n }\n\n this.lastValue = this.oscillator.last() ?? null\n }\n\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.oscillator, this.period, 0, 0, 0, false)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 25,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Aroon Oscillator ${this.period}`\n }\n}\n\nexport default AroonOscillator\n","import { IndicatorType } from '../constants/common'\nimport AverageTrueRange from '../helpers/atr'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass ATR extends Indicator {\n static type = IndicatorType.Atr\n static label = 'Average True Range'\n\n atr: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.atr = []\n const atr = new AverageTrueRange(this.period)\n for (let i = 0; i < this.data.close.length; i++) {\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\n this.atr[i] = atr.value\n }\n\n this.lastValue = this.atr.last() ?? null\n }\n const { min, max } = this.atr.length > 0 ? this.computeVisibleMinMax(this.atr) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.atr[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `ATR ${this.period}`\n }\n}\n\nexport default ATR\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nconst constant = 0.015\nclass CommodityChannelIndex extends Indicator {\n static type = IndicatorType.Cci\n static label = 'Commodity Channel Index'\n\n cci: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n let smaCount\n const tp = []\n this.cci = []\n let smaSum = (smaCount = 0)\n for (let i = 0; i < this.data.close.length; i++) {\n let devCount\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\n tp[i] = typicalPrice\n\n smaSum += typicalPrice\n smaCount++\n if (smaCount > this.period) {\n smaSum -= tp[i - this.period]\n smaCount--\n }\n const sma = smaSum / smaCount\n\n if (i < this.period - 1) {\n continue\n }\n\n let devSum = (devCount = 0)\n for (let j = i - this.period + 1; j <= i; j++) {\n devSum += Math.abs(tp[j] - sma)\n devCount++\n }\n\n const dev = devSum / devCount\n this.cci[i] = 0\n if (dev > 0) {\n this.cci[i] = (typicalPrice - sma) / (constant * dev)\n }\n }\n\n this.lastValue = this.cci.last() ?? null\n }\n\n const { min, max } = this.cci.length > 0 ? this.computeVisibleMinMax(this.cci) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.cci, this.period, -100, 0, 100)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 20,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `CCI ${this.period}`\n }\n}\n\nexport default CommodityChannelIndex\n","import * as d3 from 'd3'\n\nimport { ObjectHash, Theme } from '../../types/shared'\nimport Text from '../canvas/text'\nimport tailwindColors from '../constants/colors'\nimport { INDICATOR_LABEL_HEIGHT, IndicatorType, TextAlign, TextBaseline } from '../constants/common'\nimport utils from '../utils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\nexport interface ICOT {\n code: string\n name: string\n units: string\n commercialHedgers: number[]\n largeTraders: number[]\n smallTraders: number[]\n}\n\ninterface Attrs {\n period: string\n code: string\n}\n\ntype ColorsKeys = keyof Pick\n\nclass COT extends Indicator {\n static type = IndicatorType.Cot\n static label = 'COT'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n declare colors: ObjectHash\n\n compute() {\n if (!this.isComputeNecessary() || !this.data.COTs) return\n const cotQuoteCode = Object.keys(this.data.COTs)[0]\n if (!this.attrs.code && cotQuoteCode) {\n this.attrs.code = cotQuoteCode\n }\n const cot = this.data.COTs[this.attrs.code]\n const [min, max] = utils.minMax(cot.commercialHedgers, cot.largeTraders, cot.smallTraders)\n this.max = Math.max(Math.abs(max), Math.abs(min))\n this.min = -this.max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (!this.data.COTs) return\n context.translate(0.5, 0.5)\n for (const key in this.colors) {\n context.set('strokeStyle', this.colors[key as ColorsKeys])\n context.beginPath()\n const data = this.data.COTs[this.attrs.code][key as ColorsKeys]\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(data[i])))\n },\n })\n context.stroke()\n }\n context.translate(-0.5, -0.5)\n }\n\n renderLabel(context: CanvasRenderingContext2D) {\n if (!this.data.COTs) return\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const name = new Text(\n {\n text: this.toString(),\n x: 8,\n y: 16,\n font: { size: 10, style: 'bold' },\n fillStyle: Colors.text,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.bottom,\n },\n this.model\n )\n name.render(context)\n\n new Text(\n {\n text: this.data.COTs[this.attrs.code].units as string,\n x: 38 + name.measure(),\n y: 16,\n font: { size: 8 },\n fillStyle: Colors.text,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.bottom,\n },\n this.model\n ).render(context)\n\n this.renderAdditionalLabels(context)\n }\n\n renderLabelChartsPage(context: CanvasRenderingContext2D) {\n const { x, y, labelWidth } = super.renderLabelChartsPage(context) as { x: number; y: number; labelWidth: number }\n\n const { IndicatorSettings } = this.getChartLayoutSettings()\n const isDarkMode = this.model.chart().chart_layout().theme === Theme.dark\n const secondarylabelX = labelWidth + x * 2\n const fontSettings = IndicatorSettings.left.indicatorLabel.font\n const scaleCoefficient = 0.7\n\n const secondarylabel = new Text(\n {\n text: this.data.COTs[this.attrs.code].units as string,\n x: secondarylabelX + x,\n font: Text.getMergedPropsWithDefaults('font', {\n ...fontSettings,\n size: fontSettings.size ? fontSettings.size * scaleCoefficient : undefined,\n style: 'normal',\n }),\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n },\n this.model\n )\n secondarylabel.set({\n y: y + (INDICATOR_LABEL_HEIGHT * scaleCoefficient - (secondarylabel.attrs.lineHeight * scaleCoefficient) / 2),\n })\n secondarylabel.render(context)\n\n this.renderAdditionalLabels(context)\n }\n\n renderAdditionalLabels(context: CanvasRenderingContext2D) {\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n\n new Text(\n {\n text: 'COT',\n x: 23,\n y: IndicatorSettings.top.height + (IndicatorSettings.bottom.height + this.contentHeight) / 2,\n angle: -90,\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\n fillStyle: Colors.textSecondary,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.alphabetic,\n },\n this.model\n ).render(context)\n\n const text = new Text(\n {\n text: 'Commercial Hedgers',\n x: IndicatorSettings.left.width,\n y: IndicatorSettings.top.height + this.contentHeight + IndicatorSettings.bottom.height - 1, // allign to very bottom of indicator with 1 pixel bottom padding\n font: { size: 8, style: 'bold' },\n fillStyle: this.colors.commercialHedgers,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.bottom,\n },\n this.model\n )\n text.render(context)\n\n let x = text.get('x')! + 8 + text.measure()\n text.set({ text: 'Large Traders', x, fillStyle: this.colors.largeTraders })\n text.render(context)\n\n x += 8 + text.measure()\n text.set({ text: 'Small Traders', x, fillStyle: this.colors.smallTraders })\n text.render(context)\n }\n\n formatAxis(value: number) {\n // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\n const scaleY = this.model.scale.y as unknown as d3.ScaleLinear\n return scaleY.tickFormat(4, 's')(value).replace(/G/, 'B')\n }\n\n getModalConfig() {\n return {\n title: 'COT',\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n toString() {\n return this.data?.COTs ? (this.data.COTs[this.attrs.code].name as string) : undefined\n }\n\n toConfig(): T['attrs'] & { type: T['type'] } {\n return {\n type: this.type,\n code: this.attrs.code,\n }\n }\n}\n\nCOT.prototype.colors = {\n commercialHedgers: '#10cc10',\n largeTraders: '#cc1010',\n smallTraders: '#1010cc',\n}\n\nexport default COT\n","import { IndicatorType } from '../constants/common'\nimport EMA from '../helpers/ema'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass ForceIndex extends Indicator {\n static type = IndicatorType.Fi\n static label = 'Force Index'\n\n fi: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.fi = []\n const ema = new EMA(this.period)\n for (let i = 1; i < this.data.close.length; i++) {\n ema.add(((this.data.close[i] - this.data.close[i - 1]) * this.data.volume[i]) / 1000000)\n this.fi[i] = ema.value\n }\n this.lastValue = this.fi.last() ?? null\n }\n const { min, max } = this.fi.length > 0 ? this.computeVisibleMinMax(this.fi) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.fi, 1, 0, 0, 0, false)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 13,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `FORCE ${this.period}`\n }\n}\n\nexport default ForceIndex\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { IndicatorType } from '../constants/common'\nimport EMA from '../helpers/ema'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n fastPeriod: number\n slowPeriod: number\n signalPeriod: number\n}\n\nclass MACD extends Indicator {\n static type = IndicatorType.Macd\n static label = 'MACD'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(period)\n return Math.max(fastPeriod, slowPeriod, signalPeriod)\n }\n\n macd: number[] = []\n signal: number[] = []\n histogram: number[] = []\n declare fastPeriod: number\n declare slowPeriod: number\n declare signalPeriod: number\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(this.attrs.period)\n super.set({ ...values, fastPeriod, slowPeriod, signalPeriod })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.macd = []\n this.signal = []\n this.histogram = []\n const ema1 = new EMA(this.fastPeriod)\n const ema2 = new EMA(this.slowPeriod)\n const ema3 = new EMA(this.signalPeriod)\n\n for (let i = 0; i < this.data.close.length; i++) {\n ema1.add(this.data.close[i])\n ema2.add(this.data.close[i])\n const macd = ema1.value - ema2.value\n ema3.add(macd)\n const signal = ema3.value\n\n this.macd[i] = macd\n this.signal[i] = signal\n this.histogram[i] = macd - signal\n }\n\n this.lastValue = this.macd.last() ?? null\n }\n const { min, max } =\n this.macd.length > 0 || this.signal.length > 0 || this.histogram.length > 0\n ? this.computeVisibleMinMax(this.macd, this.signal, this.histogram)\n : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n if (this.data.close.length === 0) return\n const y = Math.round(this.fy(0))\n const w = ChartSettings.center.barWidth + ChartSettings.center.border * 2\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n }\n\n context.set('fillStyle', '#79c3e8')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.rect(x - ~~(ChartSettings.center.barWidth / 2), y, w, Math.round(this.fy(this.histogram[i]) - y))\n },\n })\n context.fill()\n\n context.translate(0.5, 0.5)\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\n context.beginPath()\n\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.macd[i])))\n },\n })\n context.stroke()\n\n context.set('strokeStyle', IndicatorSettings.general.Colors.signalLine)\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.signal[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const fastPeriod = {\n type: 'number',\n label: 'Period',\n name: 'fastPeriod',\n value: this.fastPeriod ?? 12,\n required: true,\n min: 1,\n max: 999999,\n }\n const slowPeriod = {\n type: 'number',\n label: 'Slow',\n name: 'slowPeriod',\n value: this.slowPeriod ?? 26,\n required: true,\n min: 1,\n max: 999999,\n }\n const signalPeriod = {\n type: 'number',\n label: 'Signal',\n name: 'signalPeriod',\n value: this.signalPeriod ?? 9,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [fastPeriod, slowPeriod, signalPeriod],\n inputsErrorMessages: {\n fastPeriod: `${fastPeriod.label} must be a whole number between ${fastPeriod.min} and ${fastPeriod.max}`,\n slowPeriod: `${slowPeriod.label} must be a whole number between ${slowPeriod.min} and ${slowPeriod.max}`,\n signalPeriod: `${signalPeriod.label} must be a whole number between ${signalPeriod.min} and ${signalPeriod.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'fastPeriod':\n case 'slowPeriod':\n case 'signalPeriod':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `MACD ${this.fastPeriod},${this.slowPeriod},${this.signalPeriod}`\n }\n}\n\nexport default MACD\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass MFI extends Indicator {\n static type = IndicatorType.Mfi\n static label = 'Money Flow Index'\n\n mfi: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n let negativeMoneyFlow\n const mf = []\n this.mfi = []\n let prevTypicalPrice = (this.data.close[0] + this.data.low[0] + this.data.high[0]) / 3\n let positiveMoneyFlow = (negativeMoneyFlow = 0)\n for (let i = 1; i < this.data.close.length; i++) {\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\n const moneyFlow = typicalPrice * this.data.volume[i]\n\n if (typicalPrice > prevTypicalPrice) {\n positiveMoneyFlow += moneyFlow\n mf[i] = moneyFlow\n } else if (typicalPrice < prevTypicalPrice) {\n negativeMoneyFlow += moneyFlow\n mf[i] = -moneyFlow\n }\n\n if (i > this.period) {\n const oldMF = mf[i - this.period]\n if (oldMF > 0) {\n positiveMoneyFlow -= oldMF\n } else if (oldMF < 0) {\n negativeMoneyFlow += oldMF\n }\n\n if (positiveMoneyFlow + negativeMoneyFlow > 0) {\n this.mfi[i] = (positiveMoneyFlow * 100) / (positiveMoneyFlow + negativeMoneyFlow)\n } else {\n this.mfi[i] = 50\n }\n }\n\n prevTypicalPrice = typicalPrice\n }\n\n this.lastValue = this.mfi.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.mfi, this.period, 20, 50, 80)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `MFI ${this.period}`\n }\n}\n\nexport default MFI\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\nclass None extends Indicator {\n static type = IndicatorType.None\n static label = 'None'\n\n compute() {}\n\n renderIndicator() {}\n\n toString() {\n return ''\n }\n}\n\nexport default None\n","import { IndicatorType } from '../constants/common'\nimport math from '../helpers/math'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\nclass OBV extends Indicator {\n static type = IndicatorType.Obv\n static label = 'On-Balance Volume'\n\n obv: number[] = []\n\n compute() {\n if (this.isComputeNecessary()) {\n this.obv = [0]\n\n for (let i = 1; i < this.data.volume.length; i++) {\n let currentObv = this.obv[i - 1]\n if (this.data.close[i] > this.data.close[i - 1]) {\n currentObv += this.data.volume[i]\n } else if (this.data.close[i] < this.data.close[i - 1]) {\n currentObv -= this.data.volume[i]\n }\n\n this.obv[i] = currentObv\n }\n\n this.lastValue = this.obv.last() ?? null\n }\n const { min, max } = this.obv.length > 0 ? this.computeVisibleMinMax(this.obv) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.obv[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n formatAxis(value: number) {\n return math.formatBigNumber(value, 2)\n }\n\n getModalConfig() {\n return {\n title: this.label,\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n toString() {\n return 'OBV'\n }\n}\n\nexport default OBV\n","import * as d3 from 'd3'\n\nimport { ObjectHash } from '../../types/shared'\nimport Line from '../canvas/line'\nimport Text from '../canvas/text'\nimport {\n INDICATOR_LABEL_HEIGHT,\n IndicatorType,\n MOBILE_VIEW_BREAKPOINT_WIDTH,\n OFFSET,\n PADDING,\n TextAlign,\n TextBaseline,\n} from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport Quote from '../models/quote'\nimport { getSanitizedTicker } from '../utils'\nimport { getInstrument } from '../utils/chart'\nimport { getHEXWithSpecificAplha } from '../utils/colors'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n tickers?: string\n}\n\nconst DEFAULT_TICKERS = 'SPY,QQQ'\n\nclass PricePerformance extends Indicator {\n static type = IndicatorType.Perf\n static label = 'Price Performance %'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n timeframe: string\n tickers = ''\n ready = false\n firstFetchCalled = false\n first: ObjectHash = {}\n perf: ObjectHash = {}\n quotes: ObjectHash = {}\n indicatorLabelWidth: ObjectHash = {}\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.renderYAxis = this.renderYAxis.bind(this)\n\n this.timeframe = this.model.chart().timeframe\n this.fy = d3.scaleLinear().range([0, this.contentHeight])\n if (this.attrs.period && !this.tickers) {\n this.tickers = this.attrs.period\n }\n }\n\n async compute() {\n const tickers = this.getTickers()\n const chartLayoutModel = this.model.chart().chart_layout()\n const chartUuid = chartLayoutModel.uuid\n const hasCachedData = this.getTickersAndTimeframe().every(\n ({ ticker, instrument, timeframe }) =>\n Quote.select(\n (q: Quote) =>\n q.ticker === ticker &&\n q.instrument === instrument &&\n q.timeframe === timeframe &&\n chartLayoutModel.isIdeaId(q.ideaID) &&\n chartUuid === q.chartUuid &&\n !q.isFetching\n ).length > 0\n )\n\n if (this.timeframe !== this.model.chart().quote().timeframe || (!this.ready && !this.firstFetchCalled)) {\n this.timeframe = this.model.chart().quote().timeframe\n this.firstFetchCalled = true\n\n if (!hasCachedData) {\n const data = await Quote.getAll(this.getTickersAndTimeframe())\n if (data) {\n this._compute(tickers, data)\n this.trigger('change')\n }\n } else {\n this.ready = true\n this.compute()\n }\n } else if (this.ready) {\n const data: ObjectHash = {}\n for (const ticker of tickers) {\n data[ticker] = Quote.select(\n (q: Quote) =>\n q.ticker === ticker &&\n q.timeframe === this.timeframe &&\n chartUuid === q.chartUuid &&\n chartLayoutModel.isIdeaId(q.ideaID)\n )[0]\n }\n this._compute(tickers, data)\n }\n }\n\n _compute(tickers: string[], data: ObjectHash) {\n const { leftOffset } = this.model.chart()\n let firstBarTime = null\n let lastBarTime = null\n for (let i = 0; i < this.data.close.length; i++) {\n const center = this.fx(i)\n if (center + leftOffset < 0 || center + leftOffset > this.contentWidth) {\n // margin?\n continue\n }\n\n // Rendering one extra bar out of viewport ensures continuity of line, if there are missing data on intraday the indicator may have gaps\n if (firstBarTime === null) {\n firstBarTime = this.data.date[i]\n }\n\n lastBarTime = this.data.date[i]\n }\n\n data[this.data.ticker] = this.data\n this.quotes = data\n this.perf = {}\n const dateToIndex = this.data.getDateToIndex()\n for (const ticker of [this.data.ticker, ...tickers]) {\n this.perf[ticker] = []\n const d = data[ticker]\n if (!d) {\n continue\n }\n let first = null\n let index = -1\n for (let i = 0; i < d.close.length; i++) {\n const date = d.date[i]\n if (date < firstBarTime! || date > lastBarTime!) {\n continue\n }\n\n index = dateToIndex[date]\n if (index === undefined || index === null) {\n continue\n }\n\n if (first === null) {\n first = d.close[i]\n this.first[ticker] = first\n if (index > 0) {\n this.perf[ticker][index - 1] = (d.close[i] * 100) / first - 100\n }\n }\n\n this.perf[ticker][index] = (d.close[i] * 100) / first - 100\n }\n\n if (index < this.data.date.length - 1 && first !== null) {\n this.perf[ticker][index + 1] = this.perf[ticker][index]\n }\n }\n\n const perfArrays = Object.keys(this.perf).map((x) => this.perf[x])\n const { min, max } = perfArrays.some((array) => array.length > 0)\n ? this.computeVisibleMinMax(...perfArrays)\n : this.getDomainDefaults(this.type)\n\n this.min = min\n this.max = max\n\n const fy = d3\n .scaleLinear()\n .range([0, this.contentHeight])\n .domain([this.model.scaleRange?.max ?? this.max, this.model.scaleRange?.min ?? this.min])\n if (!this.model.scaleRange) {\n fy.nice(10)\n }\n // @ts-expect-error - TODO scale.y types dont match\n this.model.scale.y = this.fy = fy\n this.ready = true\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (!this.ready) {\n return\n }\n const { ColorsSettings, IndicatorSettings } = this.getChartLayoutSettings()\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(0)),\n y2: Math.round(this.fy(0)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n\n context.translate(0.5, 0.5)\n const iterable = this.getTickers()\n for (let index = 0; index < iterable.length; index++) {\n const ticker = iterable[index]\n if (this.perf[ticker].length > 0) {\n context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\n context.beginPath()\n for (let i = 0; i < this.perf[ticker].length; i++) {\n const y = Math.round(this.fy(this.perf[ticker][i]))\n context.lineTo(this.fx(i), y)\n }\n context.stroke()\n }\n }\n\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\n context.beginPath()\n for (let i = 0; i < this.perf[this.data.ticker].length; i++) {\n const y = Math.round(this.fy(this.perf[this.data.ticker][i]))\n if (!isNaN(y)) {\n context.lineTo(this.fx(i), y)\n }\n }\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n renderCrossTextQuotePage(context: CanvasRenderingContext2D, crossIndex: number) {\n if (!context || !crossIndex) {\n return\n }\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const tickers = [this.data.ticker, ...this.getTickers()]\n tickers.forEach((key, index) => {\n const crossIndexTickerTimeStamp = this.quotes?.[this.data.ticker]?.getDataByBarIndex('date', crossIndex)\n const tickerDateToIndex = crossIndexTickerTimeStamp\n ? this.quotes?.[key]?.getDateToIndex()?.[crossIndexTickerTimeStamp]\n : null\n const tickerPerformance = tickerDateToIndex\n ? (this.quotes?.[key]?.close?.[tickerDateToIndex] * 100) / this.first[key] - 100\n : null\n if (tickerPerformance !== null && !isNaN(tickerPerformance)) {\n context.fillStyle = Colors.canvasFill\n context.fillRect(\n IndicatorSettings.left.indicatorLabel.margin.left! - PADDING.XXXS,\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\n (index + 1) +\n IndicatorSettings.left.indicatorLabel.margin.top! -\n PADDING.XXXS,\n PADDING.XXXS + this.indicatorLabelWidth[key] + PADDING.XXXS,\n PADDING.XXXS + IndicatorSettings.left.indicatorLabel.font.size! + PADDING.XXXS\n )\n new Text(\n {\n text: `${key} ${tickerPerformance.toFixed(2)}%`,\n x: IndicatorSettings.left.indicatorLabel.margin.left,\n y:\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\n (index + 1) +\n IndicatorSettings.left.indicatorLabel.margin.top!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\n fillStyle:\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.model\n ).render(context)\n }\n })\n }\n\n renderCrossTextChartsPage(context: CanvasRenderingContext2D, crossIndex: number) {\n if (!context || !crossIndex) {\n return\n }\n\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n let isVertical = true\n const labelBottom = IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\n const tickers = [this.data.ticker, ...this.getTickers()]\n const tickerText = new Text(\n {\n font: Text.getMergedPropsWithDefaults('font', {\n ...IndicatorSettings.left.indicatorLabel.font,\n style: 'normal',\n }),\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\n padding: { top: 0, bottom: 0, left: 5, right: 5 },\n },\n this.model\n )\n let x = IndicatorSettings.left.indicatorLabel.margin.left!\n let y =\n IndicatorSettings.left.indicatorLabel.margin.top! + (2 * INDICATOR_LABEL_HEIGHT - tickerText.attrs.lineHeight) / 2\n\n const maxHeight = tickerText.attrs.lineHeight * tickers.length\n\n const canFitItemsVertically = maxHeight + labelBottom <= this.height\n if (this.width <= MOBILE_VIEW_BREAKPOINT_WIDTH || !canFitItemsVertically) {\n isVertical = false\n x += x + this.labelWidth\n } else {\n y += IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\n }\n\n const tickerQuote = this.quotes?.[this.data.ticker]\n const maxCrossIndex = Math.min(crossIndex, (tickerQuote?.close.length ?? Infinity) - 1)\n tickers.forEach((key, index) => {\n const crossIndexTickerTimeStamp = tickerQuote?.getDataByBarIndex('date', maxCrossIndex)\n const tickerDateToIndex = crossIndexTickerTimeStamp\n ? this.quotes?.[key]?.getDateToIndex()?.[crossIndexTickerTimeStamp]\n : null\n const tickerPerformance = tickerDateToIndex\n ? (this.quotes?.[key]?.close?.[tickerDateToIndex] * 100) / this.first[key] - 100\n : null\n if (tickerPerformance !== null && !isNaN(tickerPerformance)) {\n tickerText.set({\n x,\n y,\n fillStyle:\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\n text: `${key} ${tickerPerformance.toFixed(2)}%`,\n })\n const tickerTextWidth =\n tickerText.measure(context) + tickerText.attrs.padding.left + tickerText.attrs.padding.right\n if (\n !isVertical &&\n this.width - IndicatorSettings.left.indicatorLabel.margin.left! - IndicatorSettings.right.width! <=\n x + tickerTextWidth\n ) {\n x = 2 * IndicatorSettings.left.indicatorLabel.margin.left! + this.labelWidth\n y += tickerText.attrs.lineHeight\n tickerText.set({ x, y })\n }\n tickerText.render(context)\n\n if (isVertical) {\n y += tickerText.attrs.lineHeight\n } else {\n x += tickerTextWidth\n }\n }\n })\n }\n\n renderXAxis(context: CanvasRenderingContext2D) {\n if (!this.ready) {\n return\n }\n return super.renderXAxis(context)\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n let ticker\n super.renderYAxis(context)\n const { IndicatorSettings, ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n if (!this.ready) {\n return\n }\n if (this.perf[this.data.ticker].length === 0) {\n return\n }\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n const { lineHeight, padding, size } = IndicatorSettings.right.axis.font\n const text = new Text(\n {\n x: this.contentWidth + OFFSET.M - padding!.left! + IndicatorSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', { size }),\n lineHeight,\n padding: {\n left: padding!.left!,\n right: padding!.right!,\n top: padding!.top!,\n bottom: padding!.bottom!,\n },\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.crossText,\n },\n this.model\n )\n const iterable = this.getTickers()\n const textLabels = []\n for (let index = 0; index < iterable.length; index++) {\n ticker = iterable[index]\n if (this.perf[ticker].length > 0) {\n textLabels.push({\n text: this.perf[ticker].last().toFixed(2) + '%',\n y: Math.round(this.fy(this.perf[ticker].last())),\n background: ColorsSettings[index % ColorsSettings.length],\n })\n }\n }\n textLabels.push({\n text: this.perf[this.data.ticker].last().toFixed(2) + '%',\n y: Math.round(this.fy(this.perf[this.data.ticker].last())),\n background: Colors.performanceIndicatorLabel,\n })\n\n const minY = 0\n const maxY = this.contentHeight\n textLabels.forEach((labelSetting) => {\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\n text.set(labelSetting).render(context)\n }\n })\n\n translate.undo()\n }\n\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\n super.renderLabelQuotePage(context)\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n if (this.ready) {\n const tickers = this.getTickers()\n const tickerPerformance = [\n { [this.data.ticker]: this.perf[this.data.ticker][this.perf[this.data.ticker].length - 1] },\n ...tickers.map((ticker) => ({ [ticker]: this.perf[ticker][this.perf[ticker].length - 1] })),\n ].reduce((prev, current) => ({ ...prev, ...current }), {})\n Object.keys(tickerPerformance).forEach((key, index) => {\n if (tickerPerformance[key]) {\n const text = new Text(\n {\n text: `${key} ${tickerPerformance[key].toFixed(2)}%`,\n x: IndicatorSettings.left.indicatorLabel.margin.left,\n y:\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\n (index + 1) +\n IndicatorSettings.left.indicatorLabel.margin.top!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\n fillStyle:\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.model\n )\n this.indicatorLabelWidth = { ...this.indicatorLabelWidth, [key]: text.measure(context) }\n text.render(context)\n }\n })\n }\n }\n\n getTickers() {\n return this.tickers\n .split(',')\n .map((ticker) => ticker)\n .filter((x) => x)\n }\n\n getTickersAndTimeframe() {\n const { timeframe } = this.model.chart().quote()\n return this.getTickers().map((ticker) => ({\n ticker,\n instrument: getInstrument(ticker),\n timeframe,\n }))\n }\n\n set(values: Partial) {\n this.ready = false\n this.firstFetchCalled = false\n super.set({ ...values, tickers: values.period || (values.tickers ? getSanitizedTicker(values.tickers, true) : '') })\n this.tickers = (this.tickers || '').toUpperCase()\n }\n\n getModalConfig() {\n return {\n title: this.label,\n inputs: [\n {\n type: 'text',\n label: 'Tickers',\n name: 'tickers',\n value: !!this.tickers ? this.tickers : DEFAULT_TICKERS,\n required: true,\n },\n ],\n inputsErrorMessages: {\n tickers: 'At least one ticker has to be provided',\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'tickers':\n return this[key].length > 0\n default:\n return false\n }\n }\n\n toString() {\n return this.getIsChartPageSpecificFunctionality() ? 'PERF %' : `PERF% ${this.tickers}`\n }\n}\n\nexport default PricePerformance\n","import { IndicatorType } from '../constants/common'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: number | string\n momentum: number\n}\n\nclass RMI extends Indicator {\n static type = IndicatorType.Rmi\n static label = 'Relative Momentum Index'\n\n rmi: number[] = []\n declare momentum: number\n declare period: number\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, momentum = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period, momentum })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n this.rmi = []\n let count = 0\n let sumu = 0\n let sumd = 0\n let u: number, d: number, ad: number, au: number\n for (let i = this.momentum; i < this.data.close.length; i++) {\n u = d = 0\n if (this.data.close[i] > this.data.close[i - this.momentum]) {\n u = this.data.close[i] - this.data.close[i - this.momentum]\n }\n if (this.data.close[i] < this.data.close[i - this.momentum]) {\n d = this.data.close[i - this.momentum] - this.data.close[i]\n }\n\n if (count < this.period) {\n sumu += u\n sumd += d\n count++\n au = sumu / count\n ad = sumd / count\n } else {\n au = (au! * (this.period - 1) + u) / this.period\n ad = (ad! * (this.period - 1) + d) / this.period\n }\n\n const rs = ad > 0 ? au / ad : 1\n this.rmi[i] = 100 - 100 * (1 / (1 + rs))\n }\n\n this.lastValue = this.rmi.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.rmi, this.momentum, 30, 50, 70)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 20,\n required: true,\n min: 1,\n max: 999999,\n }\n const momentum = {\n type: 'number',\n label: 'Momentum',\n name: 'momentum',\n value: this.momentum ?? 5,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, momentum],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n momentum: `${momentum.label} must be a whole number between ${momentum.min} and ${momentum.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n case 'momentum':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `RMI ${this.period},${this.momentum}`\n }\n}\n\nexport default RMI\n","import Line from '../canvas/line'\nimport { IndicatorType } from '../constants/common'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass ROC extends Indicator {\n static type = IndicatorType.Roc\n static label = 'Rate of Change %'\n\n roc: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.roc = []\n for (let i = this.period; i < this.data.close.length; i++) {\n this.roc[i] = ((this.data.close[i] - this.data.close[i - this.period]) / this.data.close[i - this.period]) * 100\n }\n\n this.lastValue = this.roc.last() ?? null\n }\n const { min, max } = this.roc.length > 0 ? this.computeVisibleMinMax(this.roc) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(0)),\n y2: Math.round(this.fy(0)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.roc[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 12,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `ROC ${this.period}`\n }\n}\n\nexport default ROC\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass RSI extends Indicator {\n static type = IndicatorType.Rsi\n static label = 'Relative Strength Index'\n\n rsi: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n this.rsi = []\n let count = 0\n let sumu = 0\n let sumd = 0\n let u: number, d: number, ad: number, au: number\n for (let i = 1; i < this.data.close.length; i++) {\n u = d = 0\n if (this.data.close[i] > this.data.close[i - 1]) {\n u = this.data.close[i] - this.data.close[i - 1]\n }\n if (this.data.close[i] < this.data.close[i - 1]) {\n d = this.data.close[i - 1] - this.data.close[i]\n }\n\n if (count < this.period) {\n sumu += u\n sumd += d\n count++\n au = sumu / count\n ad = sumd / count\n } else {\n au = (au! * (this.period - 1) + u) / this.period\n ad = (ad! * (this.period - 1) + d) / this.period\n }\n\n const rs = ad > 0 ? au / ad : 1\n this.rsi[i] = 100 - 100 * (1 / (1 + rs))\n }\n\n this.lastValue = this.rsi.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.rsi, 1, 30, 50, 70)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `RSI ${this.period}`\n }\n}\n\nexport default RSI\n","import Line from '../canvas/line'\nimport { IndicatorType } from '../constants/common'\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\nimport { getHEXWithSpecificAplha } from '../utils/colors'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: number | string\n baseLine: number\n}\n\nconst DEFAULT_PARAMETERS = {\n Period: 50,\n BaseLine: 1.0,\n}\n\nfunction parsePeriod(periodStr: string) {\n const values = periodStr.split(',')\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\n const baseLine = parseFloat(values[1]) || DEFAULT_PARAMETERS.BaseLine\n\n return [period, baseLine]\n}\n\nclass RelativeVolume extends Indicator {\n static type = IndicatorType.Rvol\n static label = 'Relative Volume'\n\n rvol: number[] = []\n declare period: number\n declare baseLine: number\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, baseLine = 0] = parsePeriod(values.period)\n super.set({ ...values, period, baseLine })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.rvol = []\n\n let sum = 0\n for (let i = 0; i < this.period; i++) {\n sum += this.data.volume[i]\n }\n for (let i = this.period; i < this.data.volume.length; i++) {\n sum = sum - this.data.volume[i - this.period] + this.data.volume[i]\n this.rvol[i] = this.data.volume[i] / (sum / this.period)\n }\n\n this.lastValue = this.rvol.last() ?? null\n }\n\n const { min, max } =\n this.rvol.length > 0\n ? this.computeVisibleMinMax([...this.rvol, this.baseLine])\n : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const chartModel = this.model.chart()\n const { zoomFactor } = chartModel\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\n zoomFactor,\n chartLayout: chartModel.chart_layout(),\n })\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\n\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period + 1,\n drawBarCallback: (i, x) => {\n if (this.rvol[i] === undefined) return\n\n const baseLine = Math.round(this.fy(this.baseLine))\n const y = Math.round(this.fy(this.rvol[i]))\n\n context.fillStyle = this.rvol[i] < this.baseLine ? Colors.volumeTrendDown : Colors.volumeTrendUp\n context.fillRect(x - halfBarWidth, baseLine, barWidthWithoutMargin, y - baseLine)\n },\n })\n\n const baseLineY = this.fy(this.baseLine)\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(baseLineY),\n y2: Math.round(baseLineY),\n strokeStyle: getHEXWithSpecificAplha(Colors.zeroChange, 0.5),\n },\n this.model\n ).render(context)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? DEFAULT_PARAMETERS.Period,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const baseLine = {\n type: 'number',\n label: 'Baseline',\n name: 'baseLine',\n value: this.baseLine ?? DEFAULT_PARAMETERS.BaseLine,\n required: true,\n step: 0.1,\n allowDecimal: true,\n min: 0,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, baseLine],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n baseLine: `${baseLine.label} must be a number between ${baseLine.min} and ${baseLine.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'baseLine':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n default:\n return false\n }\n }\n\n toString() {\n return `RVOL ${this.period}, ${this.baseLine}, SMA`\n }\n}\n\nexport default RelativeVolume\n","import Text from '../canvas/text'\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport utils from '../utils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass RWI extends Indicator {\n static type = IndicatorType.Rwi\n static label = 'Random Walk Index'\n\n tr: number[] = []\n atr: number[] = []\n rwiHi: number[] = []\n rwiLo: number[] = []\n declare period: number\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.renderYAxis = this.renderYAxis.bind(this)\n }\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.tr = []\n this.atr = []\n this.rwiHi = []\n this.rwiLo = []\n let atr = 0\n\n for (let i = 0; i < this.data.close.length; i++) {\n const tr = utils.max([\n this.data.high[i] - this.data.low[i],\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\n ])\n this.tr[i] = tr\n\n if (i < this.period) {\n atr += tr\n this.atr[i] = atr / (i + 1)\n if (i === this.period - 1) {\n atr /= this.period\n }\n } else {\n this.atr[i] = (this.atr[i - 1] * (this.period - 1) + tr) / this.period\n }\n }\n\n for (let i = this.period + 2; i < this.data.close.length; i++) {\n const h = this.data.high[i]\n const l = this.data.low[i]\n let trSum = this.tr[i - 1] + this.tr[i - 2]\n let count = 2\n let atrWeight = (trSum / count) * Math.sqrt(count)\n let maxHi = atrWeight > 0 ? (h - this.data.low[i - 1]) / atrWeight : -1\n let maxLo = atrWeight > 0 ? (this.data.high[i - 1] - l) / atrWeight : -1\n for (let j = i - 1; j > i - this.period + 1; j--) {\n trSum += this.tr[j - 2]\n count++\n atrWeight = (trSum / count) * Math.sqrt(count)\n if (atrWeight === 0) {\n continue\n }\n\n const hi = (h - this.data.low[j - 1]) / atrWeight\n if (hi > maxHi) {\n maxHi = hi\n }\n\n const lo = (this.data.high[j - 1] - l) / atrWeight\n if (lo > maxLo) {\n maxLo = lo\n }\n }\n this.rwiHi[i] = maxHi\n this.rwiLo[i] = maxLo\n }\n }\n const { min, max } =\n this.rwiHi.length > 0 || this.rwiLo.length > 0\n ? this.computeVisibleMinMax(this.rwiHi, this.rwiLo)\n : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (this.data.close.length === 0) return\n\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period,\n }\n\n context.translate(0.5, 0.5)\n context.set('strokeStyle', '#c80000')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.rwiLo[i])))\n },\n })\n context.stroke()\n\n context.set('strokeStyle', '#00a000')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.rwiHi[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n super.renderYAxis(context)\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n const text = new Text(\n {\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\n padding: {\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\n },\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.indicatorCurrentText,\n },\n this.model\n )\n const textLabels = []\n if (this.rwiLo.length > 0) {\n textLabels.push({\n text: this.rwiLo.last()!.toFixed(2),\n y: Math.round(this.fy(this.rwiLo.last()!)),\n background: '#c80000',\n })\n }\n if (this.rwiHi.length > 0) {\n textLabels.push({\n text: this.rwiHi.last()!.toFixed(2),\n y: Math.round(this.fy(this.rwiHi.last()!)),\n background: '#00a000',\n })\n }\n\n const minY = 0\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\n textLabels.forEach((labelSetting) => {\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\n text.set(labelSetting).render(context)\n }\n })\n\n translate.undo()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 9,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `RWI ${this.period}`\n }\n}\n\nexport default RWI\n","import Line from '../canvas/line'\nimport { IndicatorType } from '../constants/common'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string | number\n dPeriod: number\n kPeriod: number\n}\n\nclass Stochastics extends Indicator {\n static type = IndicatorType.Stofu\n static label = 'Stochastics FULL'\n\n k: number[] = []\n k1: number[] = []\n d: number[] = []\n declare kPeriod: number\n declare period: number\n declare dPeriod: number\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, kPeriod = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period, dPeriod, kPeriod })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n const period = Math.min(this.period, this.data.close.length - 1)\n let dCount, dSum, k\n this.k1 = []\n this.k = []\n this.d = []\n let kSum = (dSum = 0)\n let kCount = (dCount = 0)\n for (let i = 0; i < this.data.close.length; i++) {\n let highestHigh = this.data.high[i]\n let lowestLow = this.data.low[i]\n\n for (let j = i - period + 1; j <= i; j++) {\n if (this.data.high[j] > highestHigh) {\n highestHigh = this.data.high[j]\n }\n if (this.data.low[j] < lowestLow) {\n lowestLow = this.data.low[j]\n }\n }\n\n k = ((this.data.close[i] - lowestLow) / (highestHigh - lowestLow)) * 100\n if (highestHigh === lowestLow) {\n k = 100\n }\n this.k1[i] = k\n if (this.kPeriod > 1) {\n kSum += k\n kCount++\n if (kCount > this.kPeriod) {\n kSum -= this.k1[i - this.kPeriod]\n kCount--\n }\n k = kSum / kCount\n }\n\n dSum += k\n dCount++\n if (dCount > this.dPeriod) {\n dSum -= this.k[i - this.dPeriod]\n dCount--\n }\n\n const d = dSum / dCount\n this.k[i] = k\n this.d[i] = d\n }\n\n this.lastValue = this.k.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (this.data.close.length === 0) return\n\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(50)),\n y2: Math.round(this.fy(50)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(20)),\n y2: Math.round(this.fy(20)),\n strokeStyle: '#69c1ea',\n },\n this.model\n ).render(context)\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(80)),\n y2: Math.round(this.fy(80)),\n strokeStyle: '#d386df',\n },\n this.model\n ).render(context)\n\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period,\n }\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.k[i])))\n },\n })\n context.stroke()\n\n context.set('strokeStyle', '#c80000')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.d[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n const kPeriod = {\n type: 'number',\n label: 'K Period',\n name: 'kPeriod',\n value: this.kPeriod ?? 3,\n required: true,\n min: 1,\n max: 999999,\n }\n const dPeriod = {\n type: 'number',\n label: 'D Period',\n name: 'dPeriod',\n value: this.dPeriod ?? 3,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, kPeriod, dPeriod],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\n kPeriod: `${kPeriod.label} must be a whole number between ${kPeriod.min} and ${kPeriod.max}`,\n } as {\n period: string\n dPeriod: string\n kPeriod?: string\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n case 'dPeriod':\n case 'kPeriod':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Stochastics FULL ${this.period},${this.kPeriod},${this.dPeriod}`\n }\n}\n\nexport default Stochastics\n","import { IndicatorType } from '../constants/common'\nimport Pane from '../models/pane'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Stochastics from './stofu'\n\ninterface Attrs {\n period: string | number\n dPeriod: number\n kPeriod: number\n}\n\nclass StochasticsFast extends Stochastics {\n static type = IndicatorType.Stofa\n static label = 'Stochastics FAST'\n\n declare kPeriod: number\n declare period: number\n declare dPeriod: number\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.kPeriod = 1\n }\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period, dPeriod, kPeriod: 1 })\n } else {\n super.set(values)\n }\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n const dPeriod = {\n type: 'number',\n label: 'D Period',\n name: 'dPeriod',\n value: this.dPeriod ?? 3,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, dPeriod],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n case 'dPeriod':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Stochastics FAST ${this.period},${this.dPeriod}`\n }\n}\n\nexport default StochasticsFast\n","import { IndicatorType } from '../constants/common'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Stochastics from './stofu'\n\ninterface Attrs {\n period: string | number\n dPeriod: number\n kPeriod: number\n}\n\nclass StochasticsSlow extends Stochastics {\n static type = IndicatorType.Stosl\n static label = 'Stochastics SLOW'\n\n kPeriod = 3\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period, dPeriod, kPeriod: 3 })\n } else {\n super.set(values)\n }\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n const dPeriod = {\n type: 'number',\n label: 'D Period',\n name: 'dPeriod',\n value: this.dPeriod ?? 3,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, dPeriod],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n case 'dPeriod':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Stochastics SLOW ${this.period},${this.dPeriod}`\n }\n}\n\nexport default StochasticsSlow\n","import Line from '../canvas/line'\nimport { IndicatorType } from '../constants/common'\nimport EMA from '../helpers/ema'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass Trix extends Indicator {\n static type = IndicatorType.Trix\n static label = 'TRIX'\n\n trix: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.trix = []\n const ema1 = new EMA(this.period)\n const ema2 = new EMA(this.period)\n const ema3 = new EMA(this.period)\n let prev = 0\n\n for (let i = 0; i < this.data.close.length; i++) {\n ema1.add(this.data.close[i])\n ema2.add(ema1.value)\n ema3.add(ema2.value)\n if (prev > 0) {\n this.trix[i] = (ema3.value * 100) / prev - 100\n }\n prev = ema3.value\n }\n this.lastValue = this.trix.last() ?? null\n }\n const { min, max } = this.trix.length > 0 ? this.computeVisibleMinMax(this.trix) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(0)),\n y2: Math.round(this.fy(0)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n if (this.trix[i]) context.lineTo(x, ~~this.fy(this.trix[i]))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 9,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `TRIX ${this.period}`\n }\n}\n\nexport default Trix\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { IndicatorType } from '../constants/common'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n period1: number\n period2: number\n period3: number\n}\n\nclass UltimateOscillator extends Indicator {\n static type = IndicatorType.Ult\n static label = 'Ultimate Oscillator'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(period)\n return Math.max(period1, period2, period3)\n }\n\n declare period1: number\n declare period2: number\n declare period3: number\n ult: number[] = []\n tr: number[] = []\n bp: number[] = []\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period1, period2, period3 })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n this.ult = []\n let bpSum2, bpSum3, count2, count3, trSum2, trSum3\n const tr = []\n const bp = []\n let bpSum1 = (bpSum2 = bpSum3 = 0)\n let trSum1 = (trSum2 = trSum3 = 0)\n let count1 = (count2 = count3 = 0)\n let avg2, avg3\n for (let i = 1; i < this.data.close.length; i++) {\n bp[i] = this.data.close[i] - Math.min(this.data.low[i], this.data.close[i - 1])\n tr[i] = Math.max(this.data.high[i], this.data.close[i - 1]) - Math.min(this.data.low[i], this.data.close[i - 1])\n\n bpSum1 += bp[i]\n trSum1 += tr[i]\n count1++\n if (count1 > this.period1) {\n bpSum1 -= bp[i - this.period1]\n trSum1 -= tr[i - this.period1]\n }\n\n bpSum2 += bp[i]\n trSum2 += tr[i]\n count2++\n if (count2 > this.period2) {\n bpSum2 -= bp[i - this.period2]\n trSum2 -= tr[i - this.period2]\n }\n\n bpSum3 += bp[i]\n trSum3 += tr[i]\n count3++\n if (count3 > this.period3) {\n bpSum3 -= bp[i - this.period3]\n trSum3 -= tr[i - this.period3]\n }\n\n let avg1 = (avg2 = avg3 = 0)\n if (trSum1 > 0) {\n avg1 = bpSum1 / trSum1\n }\n if (trSum2 > 0) {\n avg2 = bpSum2 / trSum2\n }\n if (trSum3 > 0) {\n avg3 = bpSum3 / trSum3\n }\n\n this.ult[i] = (100 * (4 * avg1 + 2 * avg2 + avg3)) / 7\n }\n\n this.lastValue = this.ult.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.ult, 1, 30, 50, 70)\n }\n\n getModalConfig() {\n const period1 = {\n type: 'number',\n label: 'Period 1',\n name: 'period1',\n value: this.period1 ?? 7,\n required: true,\n min: 1,\n max: 999999,\n }\n const period2 = {\n type: 'number',\n label: 'Period 2',\n name: 'period2',\n value: this.period2 ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n const period3 = {\n type: 'number',\n label: 'Period 3',\n name: 'period3',\n value: this.period3 ?? 28,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period1, period2, period3],\n inputsErrorMessages: {\n period1: `${period1.label} must be a whole number between ${period1.min} and ${period1.max}`,\n period2: `${period2.label} must be a whole number between ${period2.min} and ${period2.max}`,\n period3: `${period3.label} must be a whole number between ${period3.min} and ${period3.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period1':\n case 'period2':\n case 'period3':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `ULT ${this.period1},${this.period2},${this.period3}`\n }\n}\n\nexport default UltimateOscillator\n","import { IndicatorType } from '../constants/common'\nimport math from '../helpers/math'\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\nclass Volume extends Indicator {\n static type = IndicatorType.Vol\n static label = 'Volume'\n\n compute() {\n const { min, max } =\n this.data.volume.length > 0 ? this.computeVisibleMinMax(this.data.volume) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n this.lastValue = this.data.volume.last() ?? null\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const chartModel = this.model.chart()\n const { zoomFactor } = chartModel\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\n zoomFactor,\n chartLayout: chartModel.chart_layout(),\n })\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\n\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i, x) => {\n context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\n const y = Math.round(this.fy(this.data.volume[i]))\n context.fillRect(x - halfBarWidth, y, barWidthWithoutMargin, context.canvas.height - y)\n },\n })\n }\n\n formatAxis(value: number) {\n return math.formatBigNumber(value, 2)\n }\n\n getModalConfig() {\n return {\n title: this.label,\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n toString() {\n return `Volume`\n }\n}\n\nexport default Volume\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass WilliamsR extends Indicator {\n static type = IndicatorType.Wr\n static label = 'Williams %R'\n\n declare period: number\n r: number[] = []\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.r = []\n for (let i = this.period; i < this.data.close.length; i++) {\n let highestHigh = this.data.high[i]\n let lowestLow = this.data.low[i]\n for (let j = i - this.period + 1; j <= i; j++) {\n if (this.data.high[j] > highestHigh) {\n highestHigh = this.data.high[j]\n }\n if (this.data.low[j] < lowestLow) {\n lowestLow = this.data.low[j]\n }\n }\n\n this.r[i] = 0\n if (highestHigh - lowestLow > 0) {\n this.r[i] = ((highestHigh - this.data.close[i]) / (highestHigh - lowestLow)) * -100\n }\n }\n\n this.lastValue = this.r.last() ?? null\n }\n const { min, max } = this.r.length > 0 ? this.computeVisibleMinMax(this.r) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.r, this.period, -80, -50, -20)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `W%R ${this.period}`\n }\n}\n\nexport default WilliamsR\n","import { IndicatorType } from '../constants/common'\nimport adx from './adx'\nimport aro from './aro'\nimport aroosc from './aroosc'\nimport atr from './atr'\nimport cci from './cci'\nimport cot from './cot'\nimport fi from './fi'\nimport indicator from './indicator'\nimport macd from './macd'\nimport mfi from './mfi'\nimport none from './none'\nimport obv from './obv'\nimport perf from './perf'\nimport rmi from './rmi'\nimport roc from './roc'\nimport rsi from './rsi'\nimport rvol from './rvol'\nimport rwi from './rwi'\nimport stofa from './stofa'\nimport stofu from './stofu'\nimport stosl from './stosl'\nimport trix from './trix'\nimport ult from './ult'\nimport vol from './vol'\nimport wr from './wr'\n\n// TODO check if this doesn't break saved charts\nexport const indicatorsByType = Object.freeze({\n [IndicatorType.Indicator]: indicator,\n [IndicatorType.None]: none,\n [IndicatorType.Adx]: adx,\n [IndicatorType.Aro]: aro,\n [IndicatorType.Aroosc]: aroosc,\n [IndicatorType.Atr]: atr,\n [IndicatorType.Cci]: cci,\n [IndicatorType.Cot]: cot,\n [IndicatorType.Fi]: fi,\n [IndicatorType.Macd]: macd,\n [IndicatorType.Mfi]: mfi,\n [IndicatorType.Obv]: obv,\n [IndicatorType.Perf]: perf,\n [IndicatorType.Rmi]: rmi,\n [IndicatorType.Roc]: roc,\n [IndicatorType.Rsi]: rsi,\n [IndicatorType.Rvol]: rvol,\n [IndicatorType.Rwi]: rwi,\n [IndicatorType.Stofa]: stofa,\n [IndicatorType.Stofu]: stofu,\n [IndicatorType.Stosl]: stosl,\n [IndicatorType.Trix]: trix,\n [IndicatorType.Ult]: ult,\n [IndicatorType.Vol]: vol,\n [IndicatorType.Wr]: wr,\n})\n\nexport const indicatorsWithoutPeriod = Object.freeze([IndicatorType.Obv, IndicatorType.Vol])\n","import Spine from '@finviz/spine'\n\n// eslint-disable-next-line no-extend-native\nArray.prototype.last = function () {\n return this[this.length - 1]\n}\n\n// eslint-disable-next-line no-extend-native\nString.prototype.padLeft = function (paddingValue) {\n return String(paddingValue + this).slice(-paddingValue.length)\n}\n\n// eslint-disable-next-line no-extend-native\nString.prototype.startsWith = function (str) {\n return this.indexOf(str) === 0\n}\n\ninterface CallbackCacheItem {\n newCb: (...args: any[]) => any\n origCb: (...args: any[]) => any\n}\n\nconst _callbackCache: CallbackCacheItem[] = []\nSpine.Collection.prototype.bind = function (ev, callback) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this\n const cb = (record: Spine.Model, ...rest: any[]) => {\n if (record[that.fkey as keyof Spine.Model] === that.record.id) {\n return callback(record, ...rest)\n }\n }\n _callbackCache.push({ newCb: cb, origCb: callback })\n this.model.bind(ev, cb)\n return this\n}\n\nSpine.Collection.prototype.unbind = function (ev, callback) {\n let cb\n for (const item of _callbackCache) {\n if (item.origCb === callback) {\n cb = item.newCb\n break\n }\n }\n return this.model.unbind(ev, cb)\n}\n\nSpine.Model.findIndex = function (element) {\n const iterable = this.all()\n for (let index = 0; index < iterable.length; index++) {\n const el = iterable[index]\n if (element.eql(el)) {\n return index\n }\n }\n}\n\nexport function getContextWithCache(canvas: HTMLCanvasElement | null): CanvasRenderingContext2D | null {\n if (!canvas) {\n return null\n }\n\n const context = canvas.getContext('2d')\n if (!context) {\n window.Sentry?.captureMessage('Context unavailable')\n return null\n }\n\n context._cache = {}\n\n const _restore = CanvasRenderingContext2D.prototype.restore\n context.restore = function () {\n this._cache = {}\n return _restore.apply(this)\n }\n\n context.set = function (key, value) {\n if (this._cache[key] !== value) {\n this[key] = value\n this._cache[key] = value\n }\n }\n\n return context\n}\n","import Spine from '@finviz/spine'\nimport * as React from 'react'\n\nimport { DefaultSpineEvents } from '../../types/shared'\nimport ElementModule from '../canvas/element'\nimport IndicatorModule from '../indicators/indicator'\nimport { useForceUpdate } from '../utils/force-update'\nimport { getJSONReplacerFunc } from '../utils/helpers'\n\ninterface UseModelStateOptions {\n watchProperties?: T extends null ? never[] : Array\n listenOnEvents?: string[]\n}\n\nconst getIsSpineObject = (value: any) =>\n [Spine.Model, Spine.Module, Spine.Collection].some((spineObject) => value instanceof spineObject)\n\nconst getWatchedPropValue = (\n watchedProp: Model[keyof Model] | ElementModule | IndicatorModule | undefined,\n model: Model | null\n) => {\n if (typeof watchedProp === 'function') {\n const value = watchedProp.call(model)\n\n if (value && !getIsSpineObject(value)) {\n throw Error('Watched prop should have a primitive value or a spine object')\n }\n\n if (typeof value?.all === 'function') {\n return value.all()\n }\n\n return value\n }\n\n if (typeof watchedProp === 'object') {\n const hasToObject = !!watchedProp && 'toObject' in watchedProp\n return JSON.stringify(hasToObject ? watchedProp.toObject() : watchedProp, getJSONReplacerFunc())\n }\n\n return watchedProp\n}\n\nconst getWatchedProps = (model: Model | null, props?: Array) =>\n props?.reduce(\n (acc, propKey) => ({\n ...acc,\n [propKey]: getWatchedPropValue(model?.[propKey], model),\n }),\n {} as Partial\n )\n\nconst getAreWatchedPropsEqual = (\n currentValue: Value,\n previousValue: Value\n) => {\n if (currentValue instanceof Spine.Model) {\n return currentValue.eql(previousValue)\n }\n\n return currentValue === previousValue\n}\n\nconst DEFAULT_SPINE_EVENTS = Object.values(DefaultSpineEvents)\n\nexport function useModelState(\n model: Model,\n options: UseModelStateOptions = {}\n) {\n const { watchProperties = [], listenOnEvents = DEFAULT_SPINE_EVENTS } = options\n const stringifiedOptions = JSON.stringify(options)\n const { forceUpdate } = useForceUpdate()\n const watchedPropertiesRef = React.useRef(getWatchedProps(model, watchProperties))\n\n React.useEffect(() => {\n const handleModelChange = () => {\n const hasChange = watchProperties.some((propKey) => {\n const currentValue = getWatchedPropValue(model?.[propKey], model)\n const previousValue = watchedPropertiesRef.current?.[propKey]\n\n if (Array.isArray(currentValue)) {\n return (\n !Array.isArray(previousValue) ||\n currentValue.length !== previousValue.length ||\n currentValue.some((record, index) => !getAreWatchedPropsEqual(record, previousValue[index]))\n )\n }\n\n return !getAreWatchedPropsEqual(currentValue, previousValue)\n })\n\n if (hasChange) {\n watchedPropertiesRef.current = getWatchedProps(model, watchProperties)\n forceUpdate()\n }\n }\n\n const spineEvents = listenOnEvents.join(' ')\n\n model?.bind(spineEvents, handleModelChange)\n\n forceUpdate()\n\n return () => {\n model?.unbind(spineEvents, handleModelChange)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [model?.cid, stringifiedOptions, forceUpdate])\n\n return model\n}\n","import Spine, { Collection } from '@finviz/spine'\nimport omit from 'lodash.omit'\n\nimport {\n ChartConfigChartPane,\n CustomSpineEvents,\n Instrument,\n ObjectHash,\n TodoObjectHashAnyType,\n} from '../../types/shared'\nimport BaseChart from '../charts/base_chart'\nimport PerfChart from '../charts/perf_chart'\nimport {\n DateRangeType,\n IndicatorType,\n QuotePollingIntervalInMs,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n} from '../constants/common'\nimport { IDividends, IEarnings, ISplit } from '../controllers/chart-events/utils'\nimport { getCanvasElementByType } from '../helpers/get-canvas-element-by-type'\nimport COT from '../indicators/cot'\nimport PricePerformance from '../indicators/perf'\nimport { getChartLayoutSettings } from '../models/settings'\nimport Utils from '../utils'\nimport ChartEventElement from './chart-event-element'\nimport { ChartPartToAttrsSyncMap, ChartSyncablePart } from './chart/contstants'\nimport ChartLayout from './chart_layout'\nimport Pane from './pane'\nimport Quote from './quote'\n\nclass Chart extends Spine.Model {\n static initClass(paneModel: typeof Pane, quoteModel: typeof Quote, chartLayoutModel: typeof ChartLayout) {\n this.configure(\n 'Chart',\n 'width',\n 'height',\n 'timeframe',\n 'dateRange',\n 'scale',\n 'leftOffset',\n 'ticker',\n 'instrument',\n 'fx',\n 'fy',\n 'zoomFactor',\n 'refreshData',\n 'stretch',\n 'isHideDrawingsActive',\n 'isScrolled',\n 'firstBarClose',\n 'premarket',\n 'aftermarket',\n 'hasChartEvents'\n )\n this.hasMany('panes', paneModel)\n this.belongsTo('quote', quoteModel)\n this.belongsTo('chart_layout', chartLayoutModel)\n }\n\n declare stretch: boolean\n declare chart_layout_id: string\n declare chart_layout: () => ChartLayout\n declare quote_id: string\n declare quote: () => Quote\n declare panes: () => Collection\n declare refreshData: boolean | number\n declare dateRange: DateRangeType\n declare width: number\n declare height: number\n declare timeframe: TIMEFRAME\n declare leftOffset: number\n declare ticker: string\n declare instrument: Instrument\n declare fx: (x: number) => number\n declare fy: (x: number) => number\n declare zoomFactor: number\n declare isHideDrawingsActive: boolean\n declare isScrolled: boolean\n declare scale: ScaleType\n declare firstBarClose: number\n declare premarket: boolean\n declare aftermarket: boolean\n declare hasChartEvents: boolean\n\n getChartPane() {\n return this.panes()\n .all()\n .find((pane: Pane) =>\n pane\n .elements()\n .all()\n .some((el) => el.isChart())\n )\n }\n\n getChartElement() {\n for (const pane of this.panes().all()) {\n for (const el of pane.elements().all()) {\n if (el.isChart()) {\n return el\n }\n }\n }\n }\n\n getChartType() {\n return this.getChartElement()?.instance.type\n }\n\n getRefreshInterval() {\n let defaultRefreshInterval: number | null = null\n if (typeof this.refreshData === 'number') {\n defaultRefreshInterval = this.refreshData\n } else if (this.refreshData === true) {\n defaultRefreshInterval = QuotePollingIntervalInMs.Default\n }\n\n const isStock = this.instrument === Instrument.Stock\n const isPremium = window.FinvizSettings.hasUserPremium\n let customRefreshInterval = QuotePollingIntervalInMs.Elite\n if (!isPremium) {\n customRefreshInterval = QuotePollingIntervalInMs.Free\n } else if (isStock && !Utils.isStockFastRefreshAvailable()) {\n customRefreshInterval = QuotePollingIntervalInMs.EliteStocksReduced\n }\n\n return defaultRefreshInterval && Math.max(defaultRefreshInterval, customRefreshInterval)\n }\n\n toObject() {\n const panes = this.panes()\n .all()\n .map((pane) => pane.toObject())\n return {\n width: this.width,\n dateRange: this.dateRange,\n height: this.height,\n timeframe: this.timeframe,\n scale: this.scale,\n leftOffset: this.leftOffset,\n ticker: this.ticker,\n instrument: this.instrument,\n zoomFactor: this.zoomFactor,\n refreshData: this.refreshData,\n stretch: this.stretch,\n chartId: this.cid,\n panes,\n isHideDrawingsActive: this.isHideDrawingsActive,\n isScrolled: this.isScrolled,\n premarket: this.premarket,\n aftermarket: this.aftermarket,\n hasChartEvents: this.hasChartEvents,\n }\n }\n\n toConfig(omitKeys = [] as string[]) {\n const panes = this.panes()\n .all()\n .map((pane) => pane.toConfig(omitKeys))\n return omit(\n {\n width: this.width,\n height: this.height,\n timeframe: this.timeframe,\n scale: this.scale,\n leftOffset: this.leftOffset,\n ticker: this.ticker,\n instrument: this.instrument,\n zoomFactor: this.zoomFactor,\n refreshData: this.refreshData,\n stretch: this.stretch,\n chartId: this.cid,\n panes,\n isHideDrawingsActive: this.isHideDrawingsActive,\n isScrolled: this.isScrolled,\n premarket: this.premarket,\n aftermarket: this.aftermarket,\n hasChartEvents: this.hasChartEvents,\n },\n omitKeys\n )\n }\n\n destroyCascade(options?: TodoObjectHashAnyType) {\n this.panes()\n .all()\n .forEach((pane) => {\n pane.destroyCascade()\n })\n return this.destroy(options)\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.chart_layout())\n }\n\n getIsDisabled() {\n return this.quote()?.close.length === 0\n }\n\n getIsScrollable() {\n return this.chart_layout().scrollable\n }\n\n getAllPanes() {\n return this.panes().all()\n }\n\n getAllValidPanes() {\n const cotKeys = Object.keys(this.quote().COTs ?? {})\n return this.getAllPanes().filter((pane) => {\n const mainElement = pane.mainElement()\n if (mainElement?.instance.type === IndicatorType.Cot) {\n // Type of mainElement is `Element` but it can be an indicator too\n return cotKeys.includes((mainElement.instance as unknown as COT).attrs.code)\n }\n return true\n })\n }\n\n getAllElements() {\n return this.getAllPanes().flatMap((pane) => pane.getAllElements())\n }\n\n getAllQuotes(): Quote[] {\n const perfQuotes = this.getAllElements()\n .filter(({ instance }) => instance.type === IndicatorType.Perf)\n .flatMap(({ instance }) => Object.values((instance as unknown as PricePerformance).quotes))\n\n let quotePerfTickers: Quote[] = []\n if (this.chart_layout().specificChartFunctionality === SpecificChartFunctionality.quotePerf) {\n const perfChart = this.getChartElement()?.instance as PerfChart | undefined\n if (perfChart) {\n quotePerfTickers = Quote.select(\n (q: Quote) => perfChart.attrs.tickers.includes(q.ticker) && [TIMEFRAME.d, TIMEFRAME.m].includes(q.timeframe)\n )\n }\n }\n\n return [...perfQuotes, ...quotePerfTickers, this.quote()].filter(\n (quote, index, quotes) => quote && quotes.findIndex((q) => q?.id === quote.id) === index\n )\n }\n\n createPaneCascade(paneProperties: ChartConfigChartPane) {\n const paneModel = this.panes().create(paneProperties)\n\n paneProperties.elements?.forEach(({ zIndex, elementId, ...element }) => {\n const instance = getCanvasElementByType(element.type).fromObject(element, paneModel)\n paneModel.elements().create({ instance, zIndex, elementId })\n paneModel.chart().trigger(CustomSpineEvents.IndicatorsChange)\n })\n\n const chartOrIndicator = paneModel.getChartOrIndicatorElement()\n if (paneModel.mainElement()?.elementId !== chartOrIndicator?.elementId) {\n paneModel.updateAttributes({ mainElement: chartOrIndicator })\n }\n\n return paneModel\n }\n\n updateAttributesAndSync(value: T) {\n const attrsInSync = Object.entries(ChartPartToAttrsSyncMap)\n .filter(([key]) => this.getIsChartPartInSync(key as unknown as ChartSyncablePart))\n .flatMap(([_, modelAttr]) => modelAttr)\n this.updateAttributes(value)\n\n if (attrsInSync.length > 0) {\n this.chart_layout()\n .getAllCharts()\n .forEach((chartModel) => {\n if (this.eql(chartModel)) {\n return\n }\n const newAttrs: ObjectHash = {}\n attrsInSync.forEach((modelAttr) => {\n if (value.hasOwnProperty(modelAttr)) {\n newAttrs[modelAttr] = value[modelAttr]\n }\n })\n chartModel.updateAttributes(newAttrs)\n })\n }\n }\n\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\n this.chart_layout().setSyncChartParts(chartParts, isInSync)\n }\n\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\n return this.chart_layout().getIsChartPartInSync(chartPart)\n }\n\n getHasPatterns() {\n return this.getAllElements().some((element) => {\n if ('hasOverlay' in element.instance) {\n return (element.instance as BaseChart).hasOverlay?.('patterns')\n }\n\n return false\n })\n }\n\n getQuoteRawTicker(): string | null {\n return this.quote()?.getRawTicker() ?? null\n }\n\n setChartEvents(chartEvents?: Array, shouldClear = false) {\n const chartPane = this.getChartPane()\n if (!chartPane) {\n return\n }\n const allChartEvents = chartPane.chartEvents().all()\n if (shouldClear) {\n allChartEvents.forEach((chartEvent) => chartEvent.destroyCascade())\n }\n\n const events = shouldClear\n ? chartEvents\n : chartEvents?.filter((chartEvent) => !allChartEvents.some(({ elementId }) => chartEvent.elementId === elementId))\n\n events?.forEach(({ elementId, eventType, dateTimestamp }) => {\n const newChartEvent = chartPane.chartEvents().create({\n instance: getCanvasElementByType(eventType).fromObject({ positionTimestamps: { x: dateTimestamp } }, chartPane),\n elementId,\n })\n newChartEvent.instance.updateScales()\n })\n\n chartPane.updateChartEventsZIndexes()\n }\n}\n\nexport default Chart\n","/*\n * it converts it to numbered index and it causes problems later on\n * the reason it's not just numbered enum is that it when used in const below\n * */\nexport enum ChartSyncablePart {\n Crosshair = 'crosshair',\n Ticker = 'ticker',\n Timeframe = 'timeframe',\n}\n\nexport const ChartPartToAttrsSyncMap = {\n [ChartSyncablePart.Ticker]: ['ticker'],\n [ChartSyncablePart.Timeframe]: ['timeframe', 'dateRange'],\n}\n\nexport const ChartSyncableParts = [\n { value: ChartSyncablePart.Ticker, label: 'Ticker' },\n { value: ChartSyncablePart.Timeframe, label: 'Timeframe' },\n { value: ChartSyncablePart.Crosshair, label: 'Crosshair' },\n]\n","import Spine, { Collection } from '@finviz/spine'\nimport omit from 'lodash.omit'\n\nimport { IIdea, RootChartConfigObject, Theme, TodoObjectHashAnyType } from '../../types/shared'\nimport { ChartEditorEnum, IndicatorType, LayoutType, SpecificChartFunctionality } from '../constants/common'\nimport Indicator from '../indicators/indicator'\nimport Chart from './chart'\nimport ChartEventElement from './chart-event-element'\nimport { ChartSyncablePart } from './chart/contstants'\nimport { ISettings } from './chart_settings/interfaces'\nimport DrawingsInternalStore from './drawings-internal-store'\nimport Pane from './pane'\nimport { QuoteFetchType } from './quote/constants'\n\nclass ChartLayout extends Spine.Model {\n static initClass(chartModel: typeof Chart, drawingsInternalStoreModel: typeof DrawingsInternalStore) {\n this.configure(\n 'ChartLayout',\n 'layout',\n 'activeChart',\n 'activePane',\n 'activeChartEvent',\n 'width',\n 'height',\n 'editable',\n 'canChangeTicker',\n 'scrollable',\n 'initialScrollable',\n 'cross',\n 'editors',\n 'theme',\n 'settings',\n 'isWheelZoomEnabled',\n 'specificChartFunctionality',\n 'isLargeChart',\n 'isHideDrawingsActive',\n 'isPreserveDrawingsActive',\n 'isLockDrawingsActive',\n 'isDrawingModeContinuousActive',\n 'uuid',\n 'isTouchCrossActive',\n 'defaultZoomFactor',\n 'syncChartParts',\n 'isInit',\n 'idea'\n )\n this.hasMany('charts', chartModel)\n this.belongsTo('drawingsInternalStore', drawingsInternalStoreModel)\n }\n\n declare layout: LayoutType\n declare activeChart: Chart\n declare activePane?: Pane\n declare activeChartEvent?: ChartEventElement\n declare width: number\n declare height: number\n declare editable: boolean\n declare canChangeTicker: boolean\n declare scrollable: boolean\n declare readonly initialScrollable: boolean\n declare cross: boolean\n declare editors: ChartEditorEnum[]\n declare theme: Theme\n declare settings: ISettings\n declare isWheelZoomEnabled: boolean\n declare specificChartFunctionality: SpecificChartFunctionality\n declare isLargeChart?: boolean\n declare charts: () => Collection\n declare isHideDrawingsActive: boolean\n declare isPreserveDrawingsActive: boolean\n declare isLockDrawingsActive: boolean\n declare isDrawingModeContinuousActive: boolean\n declare uuid: string\n declare isTouchCrossActive?: boolean\n declare defaultZoomFactor: number\n declare syncChartParts: ChartSyncablePart[]\n declare idea?: IIdea\n declare isInit?: boolean\n declare drawingsInternalStore: () => DrawingsInternalStore\n\n getPaneWithSelection() {\n for (const pane of this.getAllPanes()) {\n if (pane.selection) {\n return pane\n }\n }\n }\n\n toObject() {\n const charts = this.getAllCharts().map((chart) => chart.toObject())\n return {\n layout: this.layout,\n width: this.width,\n height: this.height,\n charts,\n isHideDrawingsActive: this.isHideDrawingsActive,\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\n }\n }\n\n toConfig = RootChartConfigObject>(omitKeys = [] as string[]): T {\n const charts = this.getAllCharts().map((chart) => chart.toConfig(omitKeys))\n return JSON.parse(\n JSON.stringify(\n omit(\n {\n ...this.settings.ChartSettings.center,\n layout: this.layout,\n width: this.width,\n height: this.height,\n charts,\n isHideDrawingsActive: this.isHideDrawingsActive,\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\n colors: this.settings.ChartSettings.general.Colors,\n specificChartFunctionality: this.specificChartFunctionality,\n editors: this.editors,\n editable: this.editable,\n scrollable: this.scrollable,\n theme: this.theme,\n newCharts: /\\bcharts\\b/.test(window.location.pathname),\n },\n omitKeys\n )\n )\n )\n }\n\n destroyCascade(options?: TodoObjectHashAnyType) {\n this.getAllCharts().forEach((chart) => {\n chart.destroyCascade()\n })\n return this.destroy(options)\n }\n\n getAllCharts() {\n return this.charts().all()\n }\n\n getAllPanes() {\n return this.getAllCharts().flatMap((chart) => chart.getAllPanes())\n }\n\n getAllElements() {\n return this.getAllCharts().flatMap((chart) => chart.getAllElements())\n }\n\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\n const chartPartsToSync = Array.isArray(chartParts) ? chartParts : [chartParts]\n\n const newSyncedChartParts = this.syncChartParts?.filter((chartPart) => !chartPartsToSync.includes(chartPart)) ?? []\n\n if (isInSync) {\n newSyncedChartParts.push(...chartPartsToSync)\n }\n\n this.updateAttributes({ syncChartParts: newSyncedChartParts })\n }\n\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\n return !!this.syncChartParts?.includes(chartPart)\n }\n\n getIsIndicatorPresent(type: IndicatorType) {\n return !!this.charts()\n .first()\n ?.getAllElements()\n .some((element) => element.isIndicator() && (element.instance as unknown as Indicator).type === type)\n }\n\n getHTMLElementId() {\n return `chart-layout-${this.id}`\n }\n\n exitIdea() {\n this.updateAttribute('idea', undefined)\n this.getAllCharts().forEach((chart) => {\n // Change all idea quotes to non idea quotes and refetch because we don't need them anymore, but they may cause inconsistencies if they are in cache\n chart.getAllQuotes().forEach((quote) => {\n if (quote.ideaID) {\n quote.updateAttributes({ ideaID: undefined })\n quote.fetchData({ fetchType: QuoteFetchType.Refetch })\n }\n })\n\n chart.updateAttributes({ refreshData: true })\n })\n }\n\n isIdeaId(id: number | null = null) {\n return (this.idea?.id ?? null) === id\n }\n}\n\nexport default ChartLayout\n","export const largeChartFontSize = {\n S: 8,\n M: 10,\n XXL: 16,\n XXXL: 24,\n}\n","import { Theme } from '../../../types/shared'\nimport {\n FONT_SIZE,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextAlign,\n TextBaseline,\n} from '../../constants/common'\nimport {\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n generalColors,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from '../constants'\nimport { largeChartFontSize } from './constants'\nimport { ISettings, OHLCType } from './interfaces'\n\n// large & ta\n\nconst center = {\n barWidth: 2,\n barMargin: 0,\n border: 1,\n}\n\nexport const BE_LARGE_CHART_WITH_OVERLAYS_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...chartLightTheme,\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center,\n top: {\n height: 20,\n baseline: TextBaseline.top,\n ticker: {\n margin: { left: -46, top: -4 },\n font: {\n size: largeChartFontSize.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 2,\n left: 15,\n right: 15,\n },\n font: {\n size: largeChartFontSize.S,\n textAlign: TextAlign.left,\n baseline: TextBaseline.top,\n },\n type: OHLCType.singleLine,\n },\n change: {\n margin: {\n top: 1,\n right: 40,\n },\n font: {\n size: largeChartFontSize.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: 50,\n axis: {\n margin: {\n left: 0,\n },\n font: {\n size: largeChartFontSize.S,\n lineHeight: largeChartFontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 20,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 3,\n },\n font: {\n size: largeChartFontSize.S,\n },\n },\n },\n left: {\n width: 50,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: 6,\n left: 4,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 35,\n },\n font: {\n size: largeChartFontSize.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 40,\n },\n font: {\n size: largeChartFontSize.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center,\n top: {\n height: 20,\n },\n right: {\n width: 50,\n axis: {\n margin: {\n left: -2,\n },\n font: {\n size: largeChartFontSize.S,\n lineHeight: largeChartFontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 20,\n },\n left: {\n width: 50,\n indicatorLabel: {\n labelSpacing: 1,\n margin: {\n top: OFFSET.S,\n left: OFFSET.M,\n },\n font: {\n size: largeChartFontSize.M,\n style: 'bold',\n lineHeight: largeChartFontSize.M,\n },\n },\n },\n },\n MarketSentimentSettings: {\n general: {\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: 0,\n },\n bottom: {\n height: 12,\n },\n left: {\n width: 0,\n },\n right: {\n width: 30,\n },\n },\n ColorsSettings: generalColors,\n ThumbSettings: {\n size: 8,\n touchSize: 16,\n color: '#ddd',\n borderWidth: 1,\n borderColor: '#999',\n },\n ElementSettings: {\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\n defaultFill: '#1e6dc066',\n defaultTransparentFill: '#1e6dc000',\n },\n})\n","import { Theme } from '../../../types/shared'\nimport {\n FONT_SIZE,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextAlign,\n TextBaseline,\n} from '../../constants/common'\nimport {\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n generalColors,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from '../constants'\nimport { largeChartFontSize } from './constants'\nimport { ISettings, OHLCType } from './interfaces'\n\n// large & !ta\n\nconst center = {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n}\n\nexport const BE_LARGE_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...chartLightTheme,\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center,\n top: {\n height: 20,\n baseline: TextBaseline.top,\n ticker: {\n margin: { left: -46, top: -4 },\n font: {\n size: largeChartFontSize.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 2,\n left: 15,\n right: 15,\n },\n font: {\n size: largeChartFontSize.S,\n textAlign: TextAlign.left,\n baseline: TextBaseline.top,\n },\n type: OHLCType.singleLine,\n },\n change: {\n margin: {\n top: 1,\n right: 40,\n },\n font: {\n size: largeChartFontSize.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: 50,\n axis: {\n margin: {\n left: 0,\n },\n font: {\n size: largeChartFontSize.S,\n lineHeight: largeChartFontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 20,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 3,\n },\n font: {\n size: largeChartFontSize.S,\n },\n },\n },\n left: {\n width: 50,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: 6,\n left: 4,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 35,\n },\n font: {\n size: largeChartFontSize.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 40,\n },\n font: {\n size: largeChartFontSize.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center,\n top: {\n height: 20,\n },\n right: {\n width: 50,\n axis: {\n margin: {\n left: -2,\n },\n font: {\n size: largeChartFontSize.S,\n lineHeight: largeChartFontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 20,\n },\n left: {\n width: 50,\n indicatorLabel: {\n labelSpacing: 1,\n margin: {\n top: OFFSET.S,\n left: OFFSET.M,\n },\n font: {\n size: largeChartFontSize.M,\n style: 'bold',\n lineHeight: largeChartFontSize.M,\n },\n },\n },\n },\n MarketSentimentSettings: {\n general: {\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: 0,\n },\n bottom: {\n height: 12,\n },\n left: {\n width: 0,\n },\n right: {\n width: 30,\n },\n },\n ColorsSettings: generalColors,\n ThumbSettings: {\n size: 8,\n touchSize: 16,\n color: '#ddd',\n borderWidth: 1,\n borderColor: '#999',\n },\n ElementSettings: {\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\n defaultFill: '#1e6dc066',\n defaultTransparentFill: '#1e6dc000',\n },\n})\n","import { Theme } from '../../../types/shared'\nimport {\n FONT_SIZE,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextAlign,\n TextBaseline,\n} from '../../constants/common'\nimport {\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n generalColors,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from '../constants'\nimport { ISettings, OHLCType } from './interfaces'\n\n// !large & ta => http://localhost:3000/?cs=m&ct=candle_stick&t=AAPL&tf=d&o[0][ot]=sma&o[0][op]=20&o[0][oc]=dc32b363&o[1][ot]=sma&o[1][op]=50&o[1][oc]=ff8f33c7&o[2][ot]=sma&o[2][op]=200&o[2][oc]=dcb3326e&o[3][ot]=patterns&o[3][op]=&o[3][oc]=87ceef|dc9fe5\n\nconst center = {\n barWidth: 2,\n barMargin: 0,\n border: 0,\n}\n\nconst fontSize = {\n S: 7,\n M: 8,\n XXXL: 16,\n}\n\nexport const BE_SMALL_CHART_WITH_OVERLAYS_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...chartLightTheme,\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center,\n top: {\n height: 15,\n baseline: TextBaseline.top,\n ticker: {\n margin: { left: -26, top: 0 },\n font: {\n size: fontSize.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 2,\n left: 15,\n right: 15,\n },\n font: {\n size: fontSize.S,\n textAlign: TextAlign.left,\n baseline: TextBaseline.top,\n },\n type: OHLCType.dateOnly,\n },\n change: {\n margin: {\n top: 1,\n right: 30,\n },\n font: {\n size: fontSize.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: 34,\n axis: {\n margin: {\n left: -4,\n },\n font: {\n size: fontSize.S,\n lineHeight: fontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 15,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 2,\n },\n font: {\n size: fontSize.S,\n },\n },\n },\n left: {\n width: 30,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: -4,\n left: 4,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 20,\n },\n font: {\n size: fontSize.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 25,\n },\n font: {\n size: fontSize.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center,\n top: {\n height: 8,\n },\n right: {\n width: 34,\n axis: {\n margin: {\n left: -4,\n },\n font: {\n size: fontSize.S,\n lineHeight: fontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 8,\n },\n left: {\n width: 30,\n indicatorLabel: {\n labelSpacing: 1,\n margin: {\n top: OFFSET.XXS,\n left: OFFSET.M,\n },\n font: {\n size: fontSize.M,\n style: 'bold',\n lineHeight: fontSize.M,\n },\n },\n },\n },\n MarketSentimentSettings: {\n general: {\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: 0,\n },\n bottom: {\n height: 12,\n },\n left: {\n width: 0,\n },\n right: {\n width: 30,\n },\n },\n ColorsSettings: generalColors,\n ThumbSettings: {\n size: 8,\n touchSize: 16,\n color: '#ddd',\n borderWidth: 1,\n borderColor: '#999',\n },\n ElementSettings: {\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\n defaultFill: '#1e6dc066',\n defaultTransparentFill: '#1e6dc000',\n },\n})\n","import { Theme } from '../../../types/shared'\nimport {\n FONT_SIZE,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextAlign,\n TextBaseline,\n} from '../../constants/common'\nimport {\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n generalColors,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from '../constants'\nimport { ISettings, OHLCType } from './interfaces'\n\n// !large & !ta => http://localhost:3000/?cs=m&ct=candle_stick&t=AAPL&tf=d\n\nconst center = {\n barWidth: 2,\n barMargin: 0,\n border: 1,\n}\n\nconst fontSize = {\n S: 7,\n M: 8,\n XXXL: 16,\n}\n\nexport const BE_SMALL_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...chartLightTheme,\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center,\n top: {\n height: 15,\n baseline: TextBaseline.top,\n ticker: {\n margin: { left: -26, top: 0 },\n font: {\n size: fontSize.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 2,\n left: 15,\n right: 15,\n },\n font: {\n size: fontSize.S,\n textAlign: TextAlign.left,\n baseline: TextBaseline.top,\n },\n type: OHLCType.dateOnly,\n },\n change: {\n margin: {\n top: 1,\n right: 30,\n },\n font: {\n size: fontSize.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: 34,\n axis: {\n margin: {\n left: -4,\n },\n font: {\n size: fontSize.S,\n lineHeight: fontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 15,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 2,\n },\n font: {\n size: fontSize.S,\n },\n },\n },\n left: {\n width: 30,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: -4,\n left: 4,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 20,\n },\n font: {\n size: fontSize.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 25,\n },\n font: {\n size: fontSize.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center,\n top: {\n height: 8,\n },\n right: {\n width: 34,\n axis: {\n margin: {\n left: -4,\n },\n font: {\n size: fontSize.S,\n lineHeight: fontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 8,\n },\n left: {\n width: 30,\n indicatorLabel: {\n labelSpacing: 1,\n margin: {\n top: OFFSET.XXS,\n left: OFFSET.M,\n },\n font: {\n size: fontSize.M,\n style: 'bold',\n lineHeight: fontSize.M,\n },\n },\n },\n },\n MarketSentimentSettings: {\n general: {\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: 0,\n },\n bottom: {\n height: 12,\n },\n left: {\n width: 0,\n },\n right: {\n width: 30,\n },\n },\n ColorsSettings: generalColors,\n ThumbSettings: {\n size: 8,\n touchSize: 16,\n color: '#ddd',\n borderWidth: 1,\n borderColor: '#999',\n },\n ElementSettings: {\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\n defaultFill: '#1e6dc066',\n defaultTransparentFill: '#1e6dc000',\n },\n})\n","import { ObjectHash, Theme } from '../../../types/shared'\nimport { IChartThemeColors, chartDarkTheme, chartLightTheme } from '../constants'\nimport { BE_LARGE_CHART_WITH_OVERLAYS_CHART_SETTINGS } from './be_large_chart_with_overlays'\nimport { BE_LARGE_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS } from './be_large_chart_without_overlays'\nimport { BE_SMALL_CHART_WITH_OVERLAYS_CHART_SETTINGS } from './be_small_chart_with_overlays'\nimport { BE_SMALL_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS } from './be_small_chart_without_overlays'\nimport { INTERACTIVE_CHART_SETTINGS } from './interactive_chart_settings'\nimport { ISettings } from './interfaces'\n\nexport enum CHART_FORMAT {\n INTERACTIVE = 'INTERACTIVE',\n BE_SMALL_CHART_WITHOUT_OVERLAYS = 'BE_SMALL_CHART_WITHOUT_OVERLAYS',\n BE_SMALL_CHART_WITH_OVERLAYS = 'BE_SMALL_CHART_WITH_OVERLAYS',\n BE_LARGE_CHART_WITHOUT_OVERLAYS = 'BE_LARGE_CHART_WITHOUT_OVERLAYS',\n BE_LARGE_CHART_WITH_OVERLAYS = 'BE_LARGE_CHART_WITH_OVERLAYS',\n}\n\nexport const getChartSettings = ({ chartFormat, theme }: { theme: Theme; chartFormat?: CHART_FORMAT }): ISettings => {\n switch (chartFormat) {\n case CHART_FORMAT.BE_SMALL_CHART_WITHOUT_OVERLAYS:\n return BE_SMALL_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS(theme)\n case CHART_FORMAT.BE_SMALL_CHART_WITH_OVERLAYS:\n return BE_SMALL_CHART_WITH_OVERLAYS_CHART_SETTINGS(theme)\n case CHART_FORMAT.BE_LARGE_CHART_WITHOUT_OVERLAYS:\n return BE_LARGE_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS(theme)\n case CHART_FORMAT.BE_LARGE_CHART_WITH_OVERLAYS:\n return BE_LARGE_CHART_WITH_OVERLAYS_CHART_SETTINGS(theme)\n case CHART_FORMAT.INTERACTIVE:\n default:\n return INTERACTIVE_CHART_SETTINGS(theme)\n }\n}\n\nfunction normalizeHexAlpha(hexString = '') {\n const hexValue = hexString.replace('#', '')\n if (hexValue.length === 6) {\n return `${hexString}FF`\n }\n return hexString\n}\n\nexport const getColorOverwrites = ({\n theme,\n colors,\n}: {\n theme: Theme\n colors: ObjectHash, Theme>\n}) => {\n const customColors = colors[theme]\n const customColorKeys = Object.keys(customColors) as Array>\n const defaultColors = theme === Theme.light ? chartLightTheme : chartDarkTheme\n\n return customColorKeys.reduce((acc, colorKey) => {\n const isDefaultOverWritten =\n normalizeHexAlpha(customColors[colorKey]).toLowerCase() !==\n normalizeHexAlpha(defaultColors[colorKey]).toLowerCase()\n\n return isDefaultOverWritten\n ? {\n ...acc,\n [colorKey]: customColors[colorKey],\n }\n : acc\n }, {})\n}\n","import { Theme } from '../../../types/shared'\nimport {\n CHART_MARGIN,\n FONT_SIZE,\n LINE_HEIGHT,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextBaseline,\n} from '../../constants/common'\nimport {\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n generalColors,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from '../constants'\nimport { ISettings } from './interfaces'\n\nexport const INTERACTIVE_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...(theme === Theme.light ? chartLightTheme : chartDarkTheme),\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: CHART_MARGIN.XL,\n baseline: TextBaseline.alphabetic,\n ticker: {\n margin: {\n top: 30,\n left: 0,\n },\n font: {\n size: FONT_SIZE.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 30,\n left: 30,\n right: 30,\n },\n font: {\n size: FONT_SIZE.S,\n },\n },\n change: {\n margin: {\n top: 30,\n right: 0,\n },\n font: {\n size: FONT_SIZE.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: CHART_MARGIN.XXL,\n axis: {\n margin: {\n left: 0,\n },\n font: {\n size: FONT_SIZE.S,\n lineHeight: LINE_HEIGHT.S,\n padding: {\n top: PADDING.XXS,\n bottom: PADDING.XXS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: CHART_MARGIN.M,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 8,\n },\n font: {\n size: FONT_SIZE.S,\n },\n },\n },\n left: {\n width: CHART_MARGIN.L,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: -8,\n left: 6,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 28,\n },\n font: {\n size: FONT_SIZE.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 33,\n },\n font: {\n size: FONT_SIZE.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 2,\n border: 1,\n },\n top: {\n height: CHART_MARGIN.S,\n },\n right: {\n width: CHART_MARGIN.XXL,\n axis: {\n margin: {\n left: 0,\n },\n font: {\n size: FONT_SIZE.S,\n lineHeight: LINE_HEIGHT.S,\n padding: {\n top: PADDING.XXS,\n bottom: PADDING.XXS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: CHART_MARGIN.S,\n },\n left: {\n width: CHART_MARGIN.L,\n indicatorLabel: {\n labelSpacing: 4,\n margin: {\n top: OFFSET.S,\n left: OFFSET.M,\n },\n font: {\n size: FONT_SIZE.M,\n style: 'bold',\n lineHeight: LINE_HEIGHT.M,\n },\n },\n },\n },\n MarketSentimentSettings: {\n general: {\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: 0,\n },\n bottom: {\n height: 12,\n },\n left: {\n width: 0,\n },\n right: {\n width: 30,\n },\n },\n ColorsSettings: generalColors,\n ThumbSettings: {\n size: 8,\n touchSize: 16,\n color: '#ddd',\n borderWidth: 1,\n borderColor: '#999',\n },\n ElementSettings: {\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\n defaultFill: '#1e6dc066',\n defaultTransparentFill: '#1e6dc000',\n },\n})\n","import { ObjectHash, Theme } from '../../../types/shared'\nimport { TextAlign, TextBaseline } from '../../constants/common'\nimport { IChartThemeColors, IElementThemeColors, IIndicatorThemeColors } from '../constants'\n\nexport enum OHLCType {\n singleLine = 'singleLine',\n dateOnly = 'dateOnly',\n timeOnly = 'timeOnly',\n}\n\nexport interface IMargin {\n top?: number\n right?: number\n bottom?: number\n left?: number\n}\n\ninterface IPadding {\n top?: number\n right?: number\n bottom?: number\n left?: number\n}\n\ninterface IGenericText {\n margin: IMargin\n font: IFont\n}\n\ninterface IFont {\n size?: number\n style?: string\n weight?: string\n family?: string\n lineHeight?: number\n padding?: IPadding\n baseline?: TextBaseline\n textAlign?: TextAlign\n}\n\ninterface ISettingsGeneralBase {\n Colors: IChartThemeColors\n}\n\nexport interface ISettingsCenterBase {\n barWidth: number\n barMargin: number\n border: number\n volumeHeight?: number\n}\n\ninterface ISettingsTopBase {\n height: number\n}\n\ninterface ISettingsBottomBase {\n height: number\n}\n\ninterface ISettingsLeftBase {\n width: number\n}\n\ninterface ISettingsRightBase {\n width: number\n}\n\nexport interface ISettings {\n ChartSettings: IChartSettings\n IndicatorSettings: IIndicatorSettings\n MarketSentimentSettings: IMarketSentimentChartSettings\n ColorsSettings: Array\n ThumbSettings: IThumbSettings\n ElementSettings: IElementSettings\n}\n\nexport interface IChartSettings {\n general: IChartGeneral\n center: ISettingsCenterBase\n top: IChartTop\n bottom: IChartBottom\n left: IChartLeft\n right: IChartRight\n}\n\ninterface IChartGeneral {\n settingsHeight: number\n tickerTimeframeChangeHeight: number\n Colors: IChartThemeColors & ObjectHash\n}\n\ninterface IChartTop extends ISettingsTopBase {\n baseline: TextBaseline\n ticker: IGenericText\n ohlc: IOHLC\n change: IGenericText\n}\n\ninterface IOHLC extends IGenericText {\n type?: OHLCType\n}\n\ninterface IChartBottom extends ISettingsBottomBase {\n baseline: TextBaseline\n axis: IGenericText\n}\n\ninterface IChartLeft extends ISettingsLeftBase {\n overlayLabel: IOverlayLabel\n timeframe: IGenericText\n volumeAxis: IGenericText\n}\n\ninterface IOverlayLabel extends IGenericText {\n labelSpacing: number\n}\n\ninterface IChartRight extends ISettingsRightBase {\n axis: IGenericText\n}\n\ninterface IIndicatorSettings {\n general: IIndicatorGeneral\n center: ISettingsCenterBase\n top: ISettingsTopBase\n bottom: ISettingsBottomBase\n left: IIndicatorLeft\n right: IIndicatorRight\n}\n\ninterface IIndicatorRight extends ISettingsRightBase {\n axis: IGenericText\n}\n\ninterface IIndicatorLeft extends ISettingsLeftBase {\n indicatorLabel: IIndicatorLabel\n}\n\ninterface IIndicatorLabel extends IGenericText {\n labelSpacing: number\n}\n\ninterface IIndicatorGeneral {\n Colors: IIndicatorThemeColors\n height: number\n}\n\ninterface IMarketSentimentChartSettings {\n general: ISettingsGeneralBase\n center: ISettingsCenterBase\n top: ISettingsTopBase\n bottom: ISettingsBottomBase\n left: ISettingsLeftBase\n right: ISettingsRightBase\n}\n\ninterface IThumbSettings {\n size: number\n touchSize: number\n color: string\n borderWidth: number\n borderColor: string\n}\n\ninterface IElementSettings {\n Colors: IElementThemeColors\n defaultFill: string\n defaultTransparentFill: string\n}\n","import tailwindColors from '../constants/colors'\nimport { getHEXWithSpecificAplha } from '../utils/colors'\n\nexport interface IChartThemeColors {\n aftermarketFade: string\n background: string\n borderDown: string\n borderUp: string\n canvasFill: string\n cross: string\n crossText: string\n crossTextBackground: string\n currentBackground: string\n currentText: string\n grid: string\n gridSecondary: string\n indicatorCurrentBackground: string\n indicatorCurrentText: string\n line: string\n marketDown: string\n marketUp: string\n negativeChange: string\n ohlcTrendDown: string\n ohlcTrendUp: string\n overlayTransparentBackground: string\n percentageZeroLineText: string\n performanceIndicatorLabel: string\n positiveChange: string\n premarketFade: string\n prevClose: string\n text: string\n textSecondary: string\n trendDown: string\n trendUp: string\n volumeTrendDown: string\n volumeTrendUp: string\n wickDown: string\n wickUp: string\n zeroChange: string\n}\n\nexport interface IIndicatorThemeColors {\n line: string\n signalLine: string\n}\n\nexport interface IElementThemeColors {\n line: string\n border: string\n textWithoutBackground: string\n}\n\ninterface IDarkerWickColors {\n borderUp: string\n wickUp: string\n borderDown: string\n wickDown: string\n}\n\nexport const chartLightTheme: IChartThemeColors = {\n aftermarketFade: '#FFFFFF99',\n background: '#008CFF0E',\n borderDown: '#000000FF',\n borderUp: '#000000FF',\n canvasFill: '#FFFFFFFF',\n cross: '#0000004C',\n crossText: '#fff',\n crossTextBackground: '#111',\n currentBackground: tailwindColors.brightYellow[100],\n currentText: tailwindColors.gray[800],\n grid: '#D2D2D2FF',\n gridSecondary: '#ECECEC',\n indicatorCurrentBackground: tailwindColors.gray[600],\n indicatorCurrentText: '#fff',\n line: '#1E6DC0FF',\n marketDown: tailwindColors.red[500],\n marketUp: tailwindColors.green[500],\n negativeChange: '#C80000FF',\n ohlcTrendDown: '#E54040FF',\n ohlcTrendUp: '#40A140FF',\n overlayTransparentBackground: getHEXWithSpecificAplha('#C9CCD6', 0.25),\n percentageZeroLineText: '#111',\n performanceIndicatorLabel: '#646464',\n positiveChange: '#009600FF',\n premarketFade: '#FFFFFF99',\n prevClose: '#C80000FF',\n text: '#828282',\n textSecondary: '#dedede',\n trendDown: '#FF0000FF',\n trendUp: '#00FF00FF',\n volumeTrendDown: '#ffc0c0',\n volumeTrendUp: '#a8e0a8',\n wickDown: '#000000FF',\n wickUp: '#000000FF',\n zeroChange: '#000',\n}\n\nexport const chartDarkTheme: IChartThemeColors = {\n aftermarketFade: '#4C526133',\n background: '#1E6DC019',\n borderDown: '#F63538FF',\n borderUp: '#30CC5AFF',\n canvasFill: tailwindColors.gray[800],\n cross: '#404553',\n crossText: '#fff',\n crossTextBackground: '#111',\n currentBackground: tailwindColors.yellow[200],\n currentText: tailwindColors.gray[700],\n grid: '#363A46FF',\n gridSecondary: '#2C303A',\n indicatorCurrentBackground: tailwindColors.gray[500],\n indicatorCurrentText: '#fff',\n line: '#1E6DC0FF',\n marketDown: tailwindColors.red[300],\n marketUp: tailwindColors.green[300],\n negativeChange: tailwindColors.red[400],\n ohlcTrendDown: '#E54040FF',\n ohlcTrendUp: '#40A140FF',\n overlayTransparentBackground: getHEXWithSpecificAplha('#0C0E13', 0.35),\n percentageZeroLineText: '#fff',\n performanceIndicatorLabel: '#646464',\n positiveChange: tailwindColors.green[400],\n premarketFade: '#4C526133',\n prevClose: '#C80000FF',\n text: '#929cb3',\n textSecondary: '#929CB399',\n trendDown: '#F63538FF',\n trendUp: '#30CC5AFF',\n volumeTrendDown: '#F635387F',\n volumeTrendUp: '#30CC5A7F',\n wickDown: '#F63538FF',\n wickUp: '#30CC5AFF',\n zeroChange: '#929cb3',\n}\n\nexport const darkerWickColors: IDarkerWickColors = {\n borderUp: '#006400FF',\n wickUp: '#006400',\n borderDown: '#6E0000FF',\n wickDown: '#6E0000FF',\n}\n\nexport const indicatorLightTheme: IIndicatorThemeColors = {\n line: '#000000',\n signalLine: tailwindColors.red[400],\n}\n\nexport const indicatorDarkTheme: IIndicatorThemeColors = {\n line: '#D07933',\n signalLine: tailwindColors.red[400],\n}\n\nexport const elementLightTheme: IElementThemeColors = {\n line: '#000000',\n border: '#000000',\n textWithoutBackground: '#000000',\n}\n\nexport const elementDarkTheme: IElementThemeColors = {\n line: '#5faaf4',\n border: '#5192D1',\n textWithoutBackground: '#929cb3',\n}\nexport const generalColors: Array = [\n '#1f77b4',\n '#ff7f0e',\n '#2ca02c',\n '#d62728',\n '#9467bd',\n '#8c564b',\n '#e377c2',\n '#7f7f7f',\n '#bcbd22',\n '#17becf',\n]\n\n// node chart with thin bars color override\nexport const thinBarColorsOverride = {\n trendUp: '#00b400',\n trendDown: '#b40000',\n}\n\nexport enum AutoSaveState {\n Off,\n Saved,\n Unsaved,\n Saving,\n}\n","import Spine from '@finviz/spine'\n\nimport { AutoSaveElement } from '../controllers/autosave/constants'\nimport { getUuid } from '../utils/helpers'\nimport { HLC, initHlc } from '../utils/hlc'\nimport { AutoSaveState } from './constants'\n\ninterface DrawingsInternalStateAttrs {\n elements: AutoSaveElement[]\n latestRemoteUpdateTimestamp: HLC\n latestLocalUpdateTimestamp: HLC\n instanceUUID: string\n autoSaveState: AutoSaveState\n}\n\nclass DrawingsInternalStore extends Spine.Model {\n static initClass() {\n this.configure(\n 'DrawingsInternalState',\n 'elements',\n 'latestRemoteUpdateTimestamp',\n 'latestLocalUpdateTimestamp',\n 'autoSaveState',\n 'instanceUUID'\n )\n }\n\n elements: AutoSaveElement[]\n latestRemoteUpdateTimestamp: HLC\n latestLocalUpdateTimestamp: HLC\n instanceUUID: string\n autoSaveState: AutoSaveState\n\n constructor(attrs: Partial = {}) {\n super(attrs)\n\n this.elements = attrs.elements ?? []\n this.instanceUUID = attrs.instanceUUID ?? getUuid()\n this.latestLocalUpdateTimestamp = attrs.latestLocalUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\n this.latestRemoteUpdateTimestamp = attrs.latestRemoteUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\n this.autoSaveState = attrs.autoSaveState ?? AutoSaveState.Off\n }\n\n setAutoSaveState = (newAutoSaveState: AutoSaveState) => {\n if (this.autoSaveState !== newAutoSaveState) {\n this.updateAttributes({ autoSaveState: newAutoSaveState })\n }\n }\n}\n\nexport default DrawingsInternalStore\n","import Spine from '@finviz/spine'\nimport merge from 'lodash.merge'\n\nimport { TodoObjectHashAnyType } from '../../types/shared'\nimport { drawingToolsByType } from '../canvas/drawingTools'\nimport CanvasElement from '../canvas/element'\nimport { CanvasElementType } from '../constants/common'\nimport { getIsSSr, getUuid } from '../utils/helpers'\nimport Pane from './pane'\nimport { changeElementZIndexes } from './utils'\n\nclass Element extends Spine.Model {\n static initClass(paneModel: typeof Pane) {\n this.configure('Element', 'instance', 'lastChange', 'zIndex', 'elementId')\n this.belongsTo('pane', paneModel)\n }\n\n declare instance: CanvasElement\n declare pane_id: string\n declare destroyed: true | undefined\n declare pane: () => Pane\n lastChange: number | null = null\n elementId: string | null = null\n zIndex = -1\n\n generateUuid = getIsSSr() ? undefined : getUuid\n\n constructor(...args: any[]) {\n super(...args)\n const elementAttrs = args[0]\n this.elementId = elementAttrs?.elementId ?? this.generateUuid?.()\n this.one('create', () => {\n this.updateAttributes({\n zIndex: elementAttrs?.zIndex ?? this.pane().getElementZIndexRange().max + 1,\n })\n })\n }\n\n replace(instance: CanvasElement) {\n const oldInstance = this.instance\n this.updateAttribute('instance', instance)\n this.trigger('replace', this, oldInstance)\n }\n\n makeClone() {\n const { instance, pane_id } = this\n const { attrs } = instance\n const { scale } = instance.model\n const clonedObj = merge({ pane_id }, attrs)\n const cloned = drawingToolsByType[instance.type as CanvasElementType].fromObject(clonedObj, instance.model)\n const { ThumbSettings } = this.pane().getChartLayoutSettings()\n const offset = ThumbSettings.size + ThumbSettings.borderWidth * 2\n cloned.moveBy(scale.x.invert(offset), scale.y.invert(offset) - scale.y.invert(0))\n cloned.cachePointPositionTimestamp()\n Element.create({ instance: cloned, pane_id })\n this.trigger('makeClone', this, cloned)\n }\n\n moveToZIndex(zIndex: number) {\n const currentZIndex = this.zIndex\n const directionCoef = zIndex > currentZIndex ? 1 : -1\n\n if (this.isChart() || this.isIndicator()) {\n if (this.zIndex !== 0) {\n this.updateAttributes({ zIndex: 0 })\n }\n this.pane()\n .getAllElements()\n .filter((element) => {\n const shouldMove = directionCoef === 1 ? element.zIndex <= zIndex : element.zIndex >= zIndex\n return shouldMove && element.isDrawing()\n })\n .forEach((element) => element.moveToZIndex(directionCoef * -1))\n\n return\n }\n\n const newZIndex = zIndex === 0 ? directionCoef : zIndex // 0 is protected value for chart/indicator element\n const { min, max } = this.pane().getElementZIndexRange()\n if (\n currentZIndex === newZIndex ||\n (currentZIndex === min && directionCoef === -1) ||\n (currentZIndex === max && directionCoef === 1)\n ) {\n return\n }\n const { elementsBelowZero, elementsAboveZero } = this.pane().getBelowAboveZeroElements()\n\n changeElementZIndexes({\n elementsArray: elementsBelowZero,\n addElement: newZIndex < 0 ? this : undefined,\n oldZIndex: currentZIndex,\n newZIndex,\n isBelowZero: true,\n })\n\n changeElementZIndexes({\n elementsArray: elementsAboveZero,\n addElement: newZIndex > 0 ? this : undefined,\n oldZIndex: currentZIndex,\n newZIndex,\n })\n }\n\n bringToFront() {\n this.moveToZIndex(this.pane().getElementZIndexRange().max + 1)\n }\n\n sendToBack() {\n this.moveToZIndex(this.pane().getElementZIndexRange().min - 1)\n }\n\n bringForward() {\n this.moveToZIndex(this.zIndex + 1)\n }\n\n sendBackward() {\n this.moveToZIndex(this.zIndex - 1)\n }\n\n isChart() {\n return !!this.instance?.type.startsWith('charts/')\n }\n\n isIndicator() {\n return !!this.instance?.type.startsWith('indicators/')\n }\n\n isOverlay() {\n return !!this.instance?.type.startsWith('overlays/')\n }\n\n isDrawing() {\n return !!this.instance?.type.startsWith('canvas/')\n }\n\n isChartEvent() {\n return !!this.instance?.type.startsWith('chartEvent/')\n }\n\n isMouseDown() {\n return !!this.instance?.isMouseDown\n }\n\n hasOngoingInteraction() {\n return this.isMouseDown() || this.instance.isEditInProgress\n }\n\n toObject() {\n return {\n ...this.instance.toObject(),\n elementId: this.elementId,\n zIndex: this.zIndex,\n }\n }\n\n toConfig() {\n return {\n ...this.instance.toConfig(),\n elementId: this.elementId,\n zIndex: this.zIndex,\n }\n }\n\n destroyCascade(options?: TodoObjectHashAnyType) {\n return this.destroy(options)\n }\n\n refreshElementId() {\n this.updateAttribute('elementId', this.generateUuid?.())\n }\n}\n\nexport default Element\n","import endOfDay from 'date-fns/endOfDay'\nimport lastDayOfMonth from 'date-fns/lastDayOfMonth'\nimport lastDayOfWeek from 'date-fns/lastDayOfWeek'\nimport setDate from 'date-fns/set'\n\nimport { TIMEFRAME, TIMEFRAMES_WITH_PRE_MARKET } from '../../constants/common'\nimport { convertLocalToNyTime, dateFromUnixTimestamp } from '../../utils'\nimport Chart from '../chart'\n\nconst MARKET_START = { hours: 9, minutes: 30 }\nconst END_OF_DAY = { hours: 23, minutes: 59 }\n\nfunction getIsDateBeforeMarketStart(date: Date) {\n const hours = date.getHours()\n const minutes = date.getMinutes()\n return hours < MARKET_START.hours || (hours === MARKET_START.hours && minutes < MARKET_START.minutes)\n}\n\nexport function roundTimeForSyncedPane({\n sourceChart,\n targetChart,\n timestamp,\n}: {\n sourceChart: Chart\n targetChart: Chart\n timestamp: number\n}) {\n let dateToReturn = dateFromUnixTimestamp(timestamp)\n const sourceChartHasPremarket =\n sourceChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(sourceChart.timeframe)\n const targetChartHasPremarket =\n targetChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(targetChart.timeframe)\n\n if ([TIMEFRAME.d, TIMEFRAME.w, TIMEFRAME.m].includes(sourceChart.timeframe)) {\n dateToReturn = setDate(dateToReturn, MARKET_START)\n }\n\n if (targetChart.timeframe === TIMEFRAME.m) {\n dateToReturn = setDate(lastDayOfMonth(dateToReturn), END_OF_DAY)\n } else if (targetChart.timeframe === TIMEFRAME.w) {\n dateToReturn = setDate(lastDayOfWeek(dateToReturn, { weekStartsOn: 1 }), END_OF_DAY)\n } else if (targetChart.timeframe === TIMEFRAME.d && targetChart.quote().instrument !== 'stock') {\n dateToReturn = endOfDay(dateToReturn)\n }\n\n if (sourceChartHasPremarket && !targetChartHasPremarket && targetChart.quote().instrument === 'stock') {\n dateToReturn = getIsDateBeforeMarketStart(dateToReturn) ? setDate(dateToReturn, MARKET_START) : dateToReturn\n }\n\n return ~~(convertLocalToNyTime(dateToReturn, false).getTime() / 1000)\n}\n","import Spine from '@finviz/spine'\n\nimport { ChartSyncablePart } from '../chart/contstants'\nimport Pane from '../pane'\nimport { roundTimeForSyncedPane } from './mouse-utils'\n\nexport class Mouse extends Spine.Model {\n static initClass() {\n this.configure('Mouse', 'position')\n this.belongsTo('pane', Pane)\n }\n\n declare position: { x: number; y: number } | undefined\n declare pane: () => Pane | null\n\n getIsCrossSyncOn = () => !!this.pane()?.chart().getIsChartPartInSync(ChartSyncablePart.Crosshair)\n\n getIsMouseInChartOfPane = (pane: Pane) => !!this.pane()?.chart().eql(pane.chart())\n\n getShouldRenderCrossInPane = (pane: Pane) => this.getIsCrossSyncOn() || this.getIsMouseInChartOfPane(pane)\n\n getCrossIndexForPane = (pane: Pane) => {\n if (this.position) {\n if (this.getIsMouseInChartOfPane(pane)) {\n return Math.round(this.position.x)\n }\n const paneOfMouse = this.pane()\n if (this.getIsCrossSyncOn() && paneOfMouse) {\n const mouseInChart = paneOfMouse.chart()\n const currentPaneChart = pane.chart()\n const mousePositionTimestamp = mouseInChart.quote().getTimestampFomPositionX(Math.round(this.position.x))\n const currentPanePositionX = currentPaneChart.quote().getPositionXFromTimestamp(\n roundTimeForSyncedPane({\n sourceChart: mouseInChart,\n targetChart: currentPaneChart,\n timestamp: mousePositionTimestamp,\n })\n )\n return Math.floor(currentPanePositionX)\n }\n }\n\n return Number.NaN\n }\n\n getPriceForPane = (pane: Pane) => {\n const positionY = this.position?.y ?? null\n\n if (this.pane()?.eql(pane)) {\n return positionY\n }\n\n if (this.getIsCrossSyncOn() && this.pane()) {\n const mousePaneIndex = this.pane()?.getIndexInChart()\n const currentPaneIndex = pane.getIndexInChart()\n return mousePaneIndex === currentPaneIndex ? positionY : null\n }\n\n return null\n }\n}\n\n/**\n * Mouse is a singleton, so `initClass` must be called before we create the instance\n * otherwise it wouldn’t work\n */\nMouse.initClass()\n\nconst mouse = Mouse.create()\nmouse.save()\n\nexport default mouse as Mouse\n","import Spine, { Collection } from '@finviz/spine'\nimport omit from 'lodash.omit'\n\nimport { Position, TodoObjectHashAnyType } from '../../types/shared'\nimport CanvasElement from '../canvas/element'\nimport { ChartEventBadgeType, PANE_HEIGHT_DEFAULT } from '../constants/common'\nimport { getChartLayoutSettings } from '../models/settings'\nimport Chart from './chart'\nimport ChartEventElement from './chart-event-element'\nimport Element from './element'\nimport { rebuildElementZIndexes } from './utils'\n\nexport interface ScaleAxis {\n (index: number): number\n invert: (x: number) => number\n domain: () => [currentDomainMax: number, currentDomainMin: number]\n width: (x: number) => number\n height: (y: number) => number\n ticks: (y: number) => number[]\n}\n\nconst CHART_EVENT_BADGE_TYPE_ORDER = [\n ChartEventBadgeType.Split,\n ChartEventBadgeType.Dividends,\n ChartEventBadgeType.EarningsPositive,\n ChartEventBadgeType.EarningsNegative,\n ChartEventBadgeType.EarningsNeutral,\n ChartEventBadgeType.EarningsFuture,\n]\n\nclass Pane extends Spine.Model {\n static initClass(\n elementModel: typeof Element,\n chartEventElementModel: typeof ChartEventElement,\n chartModel: typeof Chart\n ) {\n this.configure('Pane', 'height', 'scale', 'scaleRange', 'instance', 'selection')\n this.hasMany('elements', elementModel)\n this.hasMany('chartEvents', chartEventElementModel)\n this.belongsTo('mainElement', elementModel)\n this.belongsTo('chart', chartModel)\n }\n\n declare id: string\n declare chart_id: string\n declare height: number\n declare scale: {\n x: ScaleAxis\n y: ScaleAxis\n }\n\n declare instance: any\n declare chart: () => Chart\n declare mainElement: () => T | null\n declare elements: () => Collection\n declare chartEvents: () => Collection\n selection: CanvasElement | null = null\n scaleRange: { min: number; max: number } | null = null\n\n destroyCascade(options?: TodoObjectHashAnyType) {\n this.elements()\n .all()\n .forEach((element) => {\n element.destroyCascade()\n })\n return this.destroy(options)\n }\n\n toObject() {\n const elements = this.elements()\n .all()\n .map((el) => el.toObject())\n return {\n height: this.height,\n scale: this.scale,\n scaleRange: this.scaleRange,\n elements,\n }\n }\n\n toConfig(omitKeys = [] as string[]) {\n const elements = this.elements()\n .all()\n .map((el) => el.toConfig())\n return omit(\n {\n height: this.height,\n scaleRange: this.scaleRange,\n elements,\n },\n omitKeys\n )\n }\n\n move(direction: Position) {\n const chartPanes = this.chart().getAllPanes()\n const chartPane = chartPanes.find((pane) => !pane.getIsIndicatorPane())\n const targetPane = chartPanes.find((pane) => this.eql(pane))\n\n if (!chartPane || !targetPane) return\n\n const currentChartPaneRecords = Pane.records.filter((pane) => pane.chart_id === targetPane.chart_id)\n const ohterChartPaneRecords = Pane.records.filter((pane) => pane.chart_id !== targetPane.chart_id)\n\n const targetRecordIndex = currentChartPaneRecords.findIndex((record) => record.id === targetPane.id)\n const arrayWithoutTargetRecord = currentChartPaneRecords.filter((_, index) => index !== targetRecordIndex)\n const chartRecordIndex = arrayWithoutTargetRecord.findIndex((record) => record.id === chartPane.id)\n\n const panesAbove = arrayWithoutTargetRecord.slice(0, chartRecordIndex)\n const panesBelow = arrayWithoutTargetRecord.slice(chartRecordIndex + 1)\n if (direction === Position.Above) {\n panesAbove.push(currentChartPaneRecords[targetRecordIndex])\n panesAbove.sort((a, b) => a.getNumericId() - b.getNumericId())\n }\n if (direction === Position.Below) {\n panesBelow.push(currentChartPaneRecords[targetRecordIndex])\n panesBelow.sort((a, b) => a.getNumericId() - b.getNumericId())\n }\n\n Pane.records = ohterChartPaneRecords.concat([\n ...panesAbove,\n arrayWithoutTargetRecord[chartRecordIndex],\n ...panesBelow,\n ])\n this.chart().trigger('change', this.chart())\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.chart().chart_layout())\n }\n\n getAllElements() {\n return this.elements()\n .all()\n .sort((a, b) => a.zIndex - b.zIndex)\n }\n\n getAllChartEvents(isSorted = true) {\n const chartEvents = [...this.chartEvents().all()]\n return isSorted ? chartEvents.sort((a, b) => a.zIndex - b.zIndex) : chartEvents\n }\n\n getChartOrIndicatorElement() {\n return this.getAllElements().find((el) => el.isChart() || el.isIndicator()) ?? null\n }\n\n getIsIndicatorPane() {\n return !!this.mainElement()?.isIndicator()\n }\n\n getIsChartPane() {\n return !!this.mainElement()?.isChart()\n }\n\n resetHeight() {\n if (this.getIsIndicatorPane()) {\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.indicator)\n }\n if (this.getIsChartPane()) {\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.chart)\n }\n }\n\n getIndexInChart() {\n return this.chart()\n .getAllPanes()\n .findIndex((chartPane) => chartPane.eql(this))\n }\n\n getElementZIndexRange() {\n let max = -1\n let min = 1\n this.getAllElements().forEach((el) => {\n if (el.zIndex > max) {\n max = el.zIndex\n }\n if (el.zIndex < min) {\n min = el.zIndex\n }\n })\n return { min, max }\n }\n\n getBelowAboveZeroElements() {\n const allPaneElements = this.getAllElements()\n const elementsBelowZero: Element[] = []\n const elementsAboveZero: Element[] = []\n allPaneElements.forEach((el) => {\n if (el.zIndex < 0) {\n elementsBelowZero.push(el)\n }\n if (el.zIndex > 0) {\n elementsAboveZero.push(el)\n }\n })\n\n return { elementsBelowZero, elementsAboveZero }\n }\n\n normalizeZIndexes() {\n const { elementsBelowZero, elementsAboveZero } = this.getBelowAboveZeroElements()\n rebuildElementZIndexes({ elementsArray: elementsBelowZero, isBelowZero: true })\n rebuildElementZIndexes({ elementsArray: elementsAboveZero, isBelowZero: false })\n }\n\n getQuoteRawTicker() {\n return this.chart().getQuoteRawTicker()\n }\n\n getNumericId() {\n return Number(this.id.replace('c-', ''))\n }\n\n updateChartEventsZIndexes() {\n if (!this.scale || !this.scale.hasOwnProperty('x')) {\n return\n }\n\n const chartEvents = this.getAllChartEvents(false).sort(\n (a, b) => a.instance.attrs.positionTimestamps!.x - b.instance.attrs.positionTimestamps!.x\n )\n const hoveredChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isHovered)\n const openedChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isOpen)\n\n const hoveredTypeChartEventElements: ChartEventElement[] = []\n const openedTypeChartEventElements: ChartEventElement[] = []\n const nonActiveChartEventElements: ChartEventElement[] = []\n\n chartEvents.forEach((chartEvent, index) => {\n const chartEventsOnSameXPoint = chartEvents.filter(\n (chartEvent_B, i) =>\n i < index && Math.round(chartEvent.instance.attrs.x) === Math.round(chartEvent_B!.instance.attrs.x)\n )\n chartEvent.updateAttributes({ yIndex: chartEventsOnSameXPoint.length })\n const isHovered = chartEvent.instance === hoveredChartEvent?.instance\n const isOpened = chartEvent.instance === openedChartEvent?.instance\n const isHoveredType = chartEvent.instance.type === hoveredChartEvent?.instance.type\n const isOpenType = chartEvent.instance.type === openedChartEvent?.instance.type\n if (!isHovered || !isOpened) {\n if (isHoveredType) {\n hoveredTypeChartEventElements.push(chartEvent)\n } else if (isOpenType) {\n openedTypeChartEventElements.push(chartEvent)\n } else {\n nonActiveChartEventElements.push(chartEvent)\n }\n }\n })\n\n nonActiveChartEventElements.sort(\n (a, b) =>\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(a.instance.getChartEvenBadgeType()) -\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(b.instance.getChartEvenBadgeType())\n )\n\n const chartEventElements = [\n ...nonActiveChartEventElements,\n ...openedTypeChartEventElements,\n openedChartEvent,\n ...hoveredTypeChartEventElements,\n hoveredChartEvent,\n ].filter(Boolean)\n chartEventElements.forEach((chartEvent, index) => {\n chartEvent!.updateAttributes({ zIndex: index })\n })\n }\n}\n\nexport default Pane\n","import { ObjectHash, RequireByKey } from '../../types/shared'\n\ninterface HeikinAshiData {\n HAOpen: number[]\n HAClose: number[]\n}\n\ninterface QuoteValues {\n cachedAt: null | number\n dayToOffset: ObjectHash[]\n dateToIndex: ObjectHash[]\n heikinAshiData?: HeikinAshiData\n daysInQuote: Date[]\n}\n\ninterface QuoteCacheFunctionProps {\n cid: string\n key: keyof QuoteValues\n fetchedAt: number\n value: any\n}\n\nconst quoteCache = {} as ObjectHash\n\nexport function getCachedQuote({\n cid,\n key,\n fetchedAt,\n}: RequireByKey>, 'cid'>) {\n const quote = quoteCache[cid]\n if (quote?.cachedAt === fetchedAt && key) {\n return quote[key]\n } else if (!key) {\n return quote\n }\n return null\n}\n\nexport function setCachedQuote({\n cid,\n key,\n value,\n fetchedAt,\n}: Pick) {\n quoteCache[cid] = {\n ...(quoteCache[cid]?.cachedAt === fetchedAt ? quoteCache[cid] : {}),\n [key]: value,\n cachedAt: fetchedAt,\n } as QuoteValues\n}\n\nexport function deleteCachedQuote({ cid }: Pick) {\n delete quoteCache[cid]\n}\n","import Spine from '@finviz/spine'\nimport { isSameMonth, isSameWeek } from 'date-fns'\nimport queryString from 'query-string'\n\nimport { Instrument, ObjectHash, TodoObjectHashAnyType } from '../../types/shared'\nimport { ChartEventDbType, ChartEventType, IntradayTimeframeInterval, TIMEFRAME } from '../constants/common'\nimport { IDividends, IEarnings, ISplit } from '../controllers/chart-events/utils'\nimport type { ICOT } from '../indicators/cot'\nimport { dateFromUnixTimestamp, dateStringFromDate } from '../utils'\nimport { getIsAbortError } from '../utils/abort_controller'\nimport { getPositionXFromTimestamp, getTimestampFromPositionX } from '../utils/chart'\nimport fetchApi, { NotFoundError } from '../utils/fetch_api'\nimport { getIsSSr } from '../utils/helpers'\nimport { QuoteFetchType, QuoteFetchTypeUrlOption, QuoteUrlOptions } from './quote/constants'\nimport { deleteCachedQuote, getCachedQuote, setCachedQuote } from './quoteCache'\nimport { getRawTickerForInstrument } from './utils'\n\nconst quoteRefreshChecksBeforeFullRefresh = 15\n\ntype TodoPattern = TodoObjectHashAnyType\n\nexport interface TickerTimeframesProps {\n ticker: string\n instrument: string\n timeframe: string\n}\n\ninterface QuoteFetchOptions {\n aftermarket?: boolean\n premarket?: boolean\n patterns?: boolean\n events?: boolean\n maxBars?: number\n}\n\ninterface QuoteInternalOptions {\n cachePredicate?: (quote: Quote) => boolean\n fetchNewDataOnCachedQuote?: boolean\n}\n\ninterface UrlOptions extends QuoteFetchOptions {\n ticker: string\n instrument: string\n timeframe: string\n}\n\ntype ChartEventDataRaw = Omit & { eventType: ChartEventDbType }\n\ninterface DataResponse {\n COTs: COTData\n name: string\n ticker: string\n instrument: string\n interval: number\n timeframe: string\n open: number[]\n high: number[]\n low: number[]\n close: number[]\n date: number[]\n volume: number[]\n lastOpen: number\n lastHigh: number\n lastLow: number\n lastClose: number\n lastDate: number\n lastTime: string | null\n lastVolume: number\n dataId: string\n prevClose: number\n afterClose: number\n afterChange: number\n afterTime: string | null\n drawMinutesPerDay: number\n marketStartMinutes: number\n premarketLengthMinutes: number\n aftermarketLengthMinutes: number\n aftermarket: boolean\n premarket: boolean\n hasPatterns: boolean\n patterns: Array\n patternsMinRange: number\n patternsMaxRange: number\n relativeVolume: number\n isIntraday: boolean\n noNewData?: boolean\n chartEvents?: ChartEventDataRaw[]\n}\n\ninterface COTData {\n [code: string]: ICOT\n}\n\nconst emptyQuote = {\n open: [],\n high: [],\n low: [],\n close: [],\n volume: [],\n date: [],\n fetchedAt: -1,\n numberOfRefreshChecks: 0,\n isFetching: false,\n is404: false,\n COTs: undefined,\n name: undefined,\n drawMinutesPerDay: undefined,\n marketStartMinutes: undefined,\n premarketLengthMinutes: undefined,\n aftermarketLengthMinutes: undefined,\n patterns: [],\n patternsMinRange: undefined,\n patternsMaxRange: undefined,\n relativeVolume: undefined,\n lastOpen: undefined,\n lastHigh: undefined,\n lastLow: undefined,\n lastClose: undefined,\n lastVolume: undefined,\n dataId: undefined,\n lastDate: undefined,\n prevClose: undefined,\n afterClose: undefined,\n afterChange: undefined,\n chartEvents: [],\n}\n\ninterface ICacheAvailabilityCheckFunctionsArguments {\n quote: Quote\n options?: QuoteFetchOptions & QuoteInternalOptions\n}\n\nconst doesQuoteAndOptionsMatch = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\n !quote.premarket === !options?.premarket &&\n !quote.aftermarket === !options?.aftermarket &&\n !quote.hasPatterns === !options?.patterns &&\n // if options.events is false we can reuse quote with events\n (!options?.events || !!quote.events)\n\nconst doesQuoteAndFetchParamsMatch = ({\n quote,\n ticker,\n instrument,\n timeframe,\n}: {\n quote: Quote\n ticker: string\n instrument: Instrument\n timeframe: TIMEFRAME\n}) => quote.ticker === ticker && quote.instrument === instrument && quote.timeframe === timeframe\n\n// either we don't care about matching uuid at all, or they have to match\nconst isSameOrNoChartUuid = ({ quote, uuid }: { quote: Quote; uuid?: string }) => !uuid || quote.chartUuid === uuid\n\nconst isCacheAllowed = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\n !options?.cachePredicate || options.cachePredicate(quote)\n\nconst isNotEmptyQuote = (quote: Quote) => quote.fetchedAt !== -1 || quote.isFetching\n\nexport type QuoteGetParams = {\n ticker: string\n instrument: Instrument\n timeframe: TIMEFRAME\n options?: QuoteFetchOptions & QuoteInternalOptions\n abortController?: null | AbortController\n fetchFunc?: any\n shouldUseCache?: boolean\n chartUuid?: string\n}\n\nfunction getChartEventsWithId({ ticker, chartEvents }: { ticker: string; chartEvents?: ChartEventDataRaw[] }) {\n return (\n chartEvents?.map((item) => {\n let eventType: ChartEventType\n switch (item.eventType) {\n case ChartEventDbType.Dividends:\n eventType = ChartEventType.Dividends\n break\n case ChartEventDbType.Split:\n eventType = ChartEventType.Split\n break\n case ChartEventDbType.Earnings:\n eventType = ChartEventType.Earnings\n break\n }\n return {\n ...item,\n elementId: `${ticker.toLowerCase()}-${item.eventType}-${item.dateTimestamp}`,\n eventType,\n }\n }) ?? []\n )\n}\n\nclass Quote extends Spine.Model {\n static initClass() {\n this.configure(\n 'Quote',\n 'ticker',\n 'name',\n 'instrument',\n 'timeframe',\n 'open',\n 'high',\n 'low',\n 'close',\n 'date',\n 'volume',\n 'lastOpen',\n 'lastHigh',\n 'lastLow',\n 'lastClose',\n 'lastDate',\n 'lastVolume',\n 'lastTime',\n 'dataId',\n 'prevClose',\n 'COTs',\n 'chartEvents',\n 'afterClose',\n 'afterChange',\n 'afterTime',\n 'drawMinutesPerDay',\n 'marketStartMinutes',\n 'premarketLengthMinutes',\n 'aftermarketLengthMinutes',\n 'aftermarket',\n 'premarket',\n 'events',\n 'hasPatterns',\n 'patterns',\n 'patternsMinRange',\n 'patternsMaxRange',\n 'relativeVolume',\n 'fetchedAt',\n 'isIntraday',\n 'interval',\n 'drawDays',\n 'barIndex',\n 'barToDataIndex',\n 'fetchingPromise',\n 'isFetching',\n 'wasFetchAborted',\n 'chartUuid',\n 'numberOfRefreshChecks',\n 'maxBars',\n 'ideaID',\n 'is404'\n )\n }\n\n static async get({\n ticker: tickerRaw,\n instrument,\n timeframe,\n options,\n abortController,\n fetchFunc,\n shouldUseCache = true,\n chartUuid,\n }: QuoteGetParams): Promise {\n const ticker = tickerRaw.replace('@', '')\n const [quote] = shouldUseCache\n ? Quote.select(\n (q) =>\n doesQuoteAndFetchParamsMatch({ quote: q, ticker, instrument, timeframe }) &&\n isSameOrNoChartUuid({ quote: q, uuid: chartUuid }) &&\n isNotEmptyQuote(q) &&\n isCacheAllowed({ quote: q, options }) &&\n (q.instrument !== Instrument.Stock ||\n Number.isInteger(q.ideaID) ||\n doesQuoteAndOptionsMatch({ quote: q, options }))\n )\n : []\n\n if (quote) {\n if (quote.isFetching) {\n await quote.getResolvedFetchingPromise()\n } else if (options?.fetchNewDataOnCachedQuote) {\n await quote.fetchData({ fetchType: QuoteFetchType.NewerData, abortController, fetchFunc })\n }\n return quote\n }\n\n const newQuote = Quote.create({\n ...emptyQuote,\n ticker,\n timeframe,\n instrument,\n chartUuid,\n maxBars: options?.maxBars,\n premarket: !!options?.premarket,\n aftermarket: !!options?.aftermarket,\n hasPatterns: !!options?.patterns,\n events: !!options?.events,\n })\n\n await newQuote.fetchData({ fetchType: QuoteFetchType.Refetch, abortController, fetchFunc })\n\n return newQuote\n }\n\n static async getAll(tickersAndTimeframes: Array<{ ticker: string; instrument: Instrument; timeframe: TIMEFRAME }>) {\n // TODO: fetch in 1 request\n if (tickersAndTimeframes.length === 0) {\n return {}\n }\n\n try {\n await Promise.all(\n tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\n this.get({ ticker: ticker, instrument, timeframe })\n )\n )\n const data = tickersAndTimeframes.reduce(\n (accumulator, currentValue) => ({\n ...accumulator,\n [currentValue.ticker]: Quote.select(\n (q: Quote) =>\n q.ticker === currentValue.ticker &&\n q.instrument === currentValue.instrument &&\n q.timeframe === currentValue.timeframe\n )[0],\n }),\n {}\n )\n return data\n } catch (err) {\n // TODO: handle somehow\n }\n }\n\n declare ticker: string\n declare name: string\n declare instrument: Instrument\n declare interval: number\n declare timeframe: TIMEFRAME\n declare open: number[]\n declare high: number[]\n declare low: number[]\n declare close: number[]\n declare date: number[]\n declare volume: number[]\n declare lastOpen: number\n declare lastHigh: number\n declare lastLow: number\n declare lastClose: number\n declare lastDate: number\n declare lastVolume: number\n declare dataId: string\n declare prevClose: number\n declare COTs: COTData\n declare afterClose: number\n declare afterChange: number\n declare drawMinutesPerDay: number\n declare marketStartMinutes: number\n declare premarketLengthMinutes: number\n declare aftermarketLengthMinutes: number\n declare hasPatterns: boolean\n declare patterns: Array\n declare patternsMinRange: number\n declare patternsMaxRange: number\n declare relativeVolume: number\n declare isIntraday: boolean\n declare drawDays?: number\n declare barIndex: number[]\n /**\n * Array of length the same as number of bars\n *\n * If there's a gap and a bar index has no corresponding data index,\n * the last data index is used (or 0 if there's no last data index)\n *\n * @type {number[]}\n */\n declare barToDataIndex: number[]\n declare chartUuid?: string\n declare aftermarket: boolean\n declare premarket: boolean\n declare fetchedAt: number\n declare numberOfRefreshChecks: number\n declare isFetching: boolean\n declare fetchingPromise?: Promise\n declare wasFetchAborted: boolean\n declare maxBars?: number\n declare ideaID?: number\n declare is404?: boolean\n declare chartEvents: Array\n declare events?: boolean\n\n async fetchRequest({\n abortController,\n fetchFunc,\n options = { type: QuoteFetchTypeUrlOption.New },\n }: {\n abortController?: null | AbortController\n fetchFunc?: any\n options?: QuoteUrlOptions\n }) {\n let data: DataResponse | null = null\n let is404 = false\n let wasFetchAborted = false\n\n const fetchingPromise = fetchApi({\n location: this.getUrl(options),\n throwOnStatusCodes: [404],\n abortController,\n fetchFunc,\n })\n\n this.updateAttributes({\n isFetching: true,\n fetchingPromise,\n })\n\n try {\n data = await fetchingPromise\n } catch (err) {\n if (getIsAbortError(err as Error)) {\n wasFetchAborted = true\n } else if (process.env.IS_E2E_TESTING) {\n throw new Error('Quote fetch error', { cause: err })\n }\n is404 = err instanceof NotFoundError\n // Ignore network/notfound errors\n }\n\n const shouldUseEmptyQuote = !data && !wasFetchAborted && options.type === QuoteFetchTypeUrlOption.New\n\n if (process.env.IS_E2E_TESTING && shouldUseEmptyQuote) {\n throw new Error('Quote fetch new fail', { cause: { options, is404, wasFetchAborted, data } })\n }\n\n this.updateAttributes({\n ...(shouldUseEmptyQuote ? emptyQuote : {}),\n is404,\n wasFetchAborted,\n isFetching: false,\n })\n\n return data\n }\n\n async isPossibleToFetchSequentialData({\n abortController,\n fetchFunc,\n }: {\n abortController?: null | AbortController\n fetchFunc?: any\n } = {}) {\n const data = await this.fetchRequest({ abortController, fetchFunc })\n if (data && data.date.length > 0 && this.date.length > 0) {\n return this.date[this.date.length - 1] >= data.date[0]\n }\n return false\n }\n\n async fetchData({\n fetchType,\n abortController,\n fetchFunc,\n }: {\n fetchType: QuoteFetchType\n abortController?: null | AbortController\n fetchFunc?: any\n }) {\n let options: QuoteUrlOptions\n if (fetchType === QuoteFetchType.Refetch) {\n options = { type: QuoteFetchTypeUrlOption.New }\n } else if (fetchType === QuoteFetchType.NewerData) {\n options = { type: QuoteFetchTypeUrlOption.Newer }\n if ((this.numberOfRefreshChecks ?? 0) < quoteRefreshChecksBeforeFullRefresh) {\n options.dataId = this.dataId\n }\n } else {\n return\n }\n if (this.instrument === Instrument.Stock) {\n options.events = this.events == null ? true : this.events\n }\n\n const data = await this.fetchRequest({ abortController, fetchFunc, options })\n\n if (!data || data.noNewData === true) {\n this.updateAttributes({\n numberOfRefreshChecks: (this.numberOfRefreshChecks ?? 0) + 1,\n })\n return\n }\n if (this.timeframe !== data.timeframe || this.ticker.toLowerCase() !== data.ticker?.toLowerCase()) {\n return\n }\n\n const newQuoteData = {\n COTs: data.COTs,\n name: data.name,\n open: data.open,\n high: data.high,\n low: data.low,\n close: data.close,\n volume: data.volume,\n date: data.date,\n drawMinutesPerDay: data.drawMinutesPerDay,\n marketStartMinutes: data.marketStartMinutes,\n premarketLengthMinutes: data.premarketLengthMinutes,\n aftermarketLengthMinutes: data.aftermarketLengthMinutes,\n patterns: data.patterns ?? [],\n patternsMinRange: data.patternsMinRange,\n patternsMaxRange: data.patternsMaxRange,\n relativeVolume: data.relativeVolume,\n lastOpen: data.lastOpen,\n lastHigh: data.lastHigh,\n lastLow: data.lastLow,\n lastClose: data.lastClose,\n lastVolume: data.lastVolume,\n dataId: data.dataId,\n lastDate: data.lastDate,\n lastTime: data.lastTime,\n prevClose: data.prevClose,\n afterClose: data.afterClose,\n afterChange: data.afterChange,\n afterTime: data.afterTime,\n numberOfRefreshChecks: 0,\n chartEvents: data.chartEvents ?? [],\n fetchedAt: Date.now(),\n }\n\n if (\n !(\n fetchType === QuoteFetchType.Refetch ||\n [Instrument.Futures, Instrument.Forex, Instrument.Crypto].includes(this.instrument)\n )\n ) {\n /*\n * Merges current and new data taking date as index\n */\n let AIndex = 0\n let BIndex = 0\n let mergeIndex = -1\n while (AIndex < this.date.length || BIndex < data.date.length) {\n const ADate = this.date[AIndex]\n const BDate = data.date[BIndex]\n if (BDate === undefined) {\n break\n } else if (ADate === BDate) {\n // Same date, update OHLCV\n this.open[AIndex] = data.open[BIndex]\n this.high[AIndex] = data.high[BIndex]\n this.low[AIndex] = data.low[BIndex]\n this.close[AIndex] = data.close[BIndex]\n this.volume[AIndex] = data.volume[BIndex]\n AIndex++\n BIndex++\n } else if (ADate > BDate || ADate === undefined) {\n // New bar for a date not yet in our dataset\n // If weekly or monthly timeframe & wasn't merged on AIndex\n if (mergeIndex === -1 && [TIMEFRAME.w, TIMEFRAME.m].includes(this.timeframe)) {\n const prevAIndex = AIndex - 1\n const prevDate = dateFromUnixTimestamp(this.date[prevAIndex])\n const newDate = dateFromUnixTimestamp(data.date[BIndex])\n // If merge bar for weekly is sameWeek or for monthly is sameMonth perform merge on AIndex\n if (\n (TIMEFRAME.w === this.timeframe && isSameWeek(prevDate, newDate, { weekStartsOn: 1 })) ||\n (TIMEFRAME.m === this.timeframe && isSameMonth(prevDate, newDate))\n ) {\n this.date[prevAIndex] = data.date[BIndex]\n this.open[prevAIndex] = data.open[BIndex]\n this.high[prevAIndex] = data.high[BIndex]\n this.low[prevAIndex] = data.low[BIndex]\n this.close[prevAIndex] = data.close[BIndex]\n this.volume[prevAIndex] = data.volume[BIndex]\n mergeIndex = prevAIndex\n // Incrementing BIndex only because we're mergin arrays on AIndex\n BIndex++\n continue\n }\n }\n this.date.splice(AIndex, 0, data.date[BIndex])\n this.open.splice(AIndex, 0, data.open[BIndex])\n this.high.splice(AIndex, 0, data.high[BIndex])\n this.low.splice(AIndex, 0, data.low[BIndex])\n this.close.splice(AIndex, 0, data.close[BIndex])\n this.volume.splice(AIndex, 0, data.volume[BIndex])\n // Incrementing AIndex because we're changing the array in-place\n AIndex++\n BIndex++\n } else if (ADate < BDate) {\n AIndex++\n } else {\n console.warn('fetchNewerData merge warning')\n window.Sentry?.captureMessage('quote.ts fetchNewerData merge warning', {\n extra: {\n thisDateLength: this.date.length,\n dataDateLength: data.date.length,\n AIndex,\n BIndex,\n ADate,\n BDate,\n },\n })\n }\n }\n\n newQuoteData.date = this.date\n newQuoteData.open = this.open\n newQuoteData.high = this.high\n newQuoteData.low = this.low\n newQuoteData.close = this.close\n newQuoteData.volume = this.volume\n }\n\n const hasUpdatedSuccessfully = this.updateAttributes(newQuoteData)\n // https://github.com/finvizhq/charts/issues/510\n if (!hasUpdatedSuccessfully) {\n // attempt to find if this.model.quote() => null is comming from this.save() validation fail\n window.Sentry?.captureMessage('quote.ts fetchNewerData save() validation failed', { extra: this })\n }\n if (!this) {\n // or this somehow became null / falsy\n window.Sentry?.captureMessage('quote.ts fetchNewerData this is falsy', { extra: this })\n }\n this.trigger(fetchType, this, fetchType)\n }\n\n async getResolvedFetchingPromise() {\n try {\n return await this.fetchingPromise\n } catch {\n // do nothing\n }\n }\n\n fetchOlderData() {\n return // not yet implemented\n // TODO cancel previous request\n }\n\n load(atts: ObjectHash) {\n super.load(atts)\n const { fetchedAt = 0 } = atts\n const { cachedAt } = (getCachedQuote({ cid: this.cid }) as { cachedAt: number } | null) || {}\n if (this.timeframe && cachedAt !== fetchedAt) {\n setCachedQuote({ cid: this.cid, key: 'cachedAt', value: fetchedAt, fetchedAt })\n this.isIntraday = [\n TIMEFRAME.i1,\n TIMEFRAME.i2,\n TIMEFRAME.i3,\n TIMEFRAME.i5,\n TIMEFRAME.i10,\n TIMEFRAME.i15,\n TIMEFRAME.i30,\n TIMEFRAME.h,\n TIMEFRAME.h2,\n TIMEFRAME.h4,\n ].includes(this.timeframe)\n this.interval = this.isIntraday\n ? IntradayTimeframeInterval[this.timeframe as keyof typeof IntradayTimeframeInterval]\n : 0\n this.drawDays = this.getDrawDays()\n this.barIndex = this.getBarIndexes()\n this.barToDataIndex = this.barIndex.flatMap((barIndex, index) => {\n const lastIndex = this.barIndex[index - 1] ?? -1\n return [...Array.from({ length: barIndex - lastIndex - 1 }).fill(Math.max(0, index - 1)), index] as number[]\n })\n }\n if (this.timeframe && this.ticker) {\n this.chartEvents = getChartEventsWithId({\n ticker: this.ticker,\n chartEvents: this.chartEvents as unknown as ChartEventDataRaw[],\n })\n }\n return this\n }\n\n destroy(options?: ObjectHash) {\n super.destroy(options)\n deleteCachedQuote({ cid: this.cid })\n return this\n }\n\n getDrawDays() {\n if (this.instrument !== Instrument.Stock) {\n return Infinity\n }\n switch (this.timeframe) {\n case TIMEFRAME.i1:\n case TIMEFRAME.i2:\n case TIMEFRAME.i3:\n case TIMEFRAME.i5:\n case TIMEFRAME.i10:\n return 10\n case TIMEFRAME.i15:\n case TIMEFRAME.i30:\n case TIMEFRAME.h:\n case TIMEFRAME.h2:\n case TIMEFRAME.h4:\n return 15\n default:\n break\n }\n }\n\n getHeikinAshiData() {\n const cachedHeikinAshiData = getCachedQuote({ cid: this.cid, key: 'heikinAshiData', fetchedAt: this.fetchedAt })\n if (cachedHeikinAshiData) {\n return cachedHeikinAshiData as unknown as { open: number[]; close: number[] }\n }\n\n const HAClose = this.open.map((_, i) => (this.open[i] + this.high[i] + this.close[i] + this.low[i]) / 4)\n const HAOpen = this.open.reduce(\n (acc, open, i) => [...acc, (i === 0 ? open + HAClose[0] : acc[i - 1] + HAClose[i - 1]) / 2],\n [] as number[]\n )\n\n const heikAshiData = { open: HAOpen, close: HAClose }\n\n setCachedQuote({ cid: this.cid, key: 'heikinAshiData', value: heikAshiData, fetchedAt: this.fetchedAt })\n\n return heikAshiData\n }\n\n getDayToOffset(): ObjectHash {\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'dayToOffset', fetchedAt: this.fetchedAt })\n if (cachedDayToOffset) {\n return cachedDayToOffset as unknown as ObjectHash\n }\n const dayToOffset: ObjectHash = {}\n let day = 0\n let lastDay\n for (let i = 0, end = this.date.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const date = dateFromUnixTimestamp(this.date[i])\n const dateString = dateStringFromDate(date)\n if (dateString !== lastDay) {\n dayToOffset[dateString] = day\n day++\n lastDay = dateString\n }\n }\n // for ofscreen renderer we need to add lastDate to have correct dayToOffset because if\n // premarket=false in fetch query there isn't other way to distinguish that\n if (getIsSSr() && this.lastDate) {\n // YYYYMMDD / 20211118 => YYYY-MM-DD\n const [yyyy, mm, dd] = [~~(this.lastDate / 10000), ~~(this.lastDate / 100) % 100, this.lastDate % 100]\n const lastDate = `${yyyy}-${String(mm).padStart(2, '0')}-${String(dd).padStart(2, '0')}`\n\n if (lastDay !== lastDate) {\n dayToOffset[lastDate] = day\n }\n }\n\n setCachedQuote({ cid: this.cid, key: 'dayToOffset', value: dayToOffset, fetchedAt: this.fetchedAt })\n return dayToOffset\n }\n\n getDaysInQuote() {\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'daysInQuote', fetchedAt: this.fetchedAt })\n if (cachedDayToOffset) {\n return cachedDayToOffset as unknown as Date[]\n }\n const dayToOffset = this.getDayToOffset()\n const daysInQuote = Object.keys(dayToOffset)\n .map((dateString) => {\n const [year, month, day] = dateString.split('-')\n return new Date(Number.parseInt(year), Number.parseInt(month) - 1, Number.parseInt(day))\n })\n .sort((a, b) => a.getTime() - b.getTime())\n\n setCachedQuote({ cid: this.cid, key: 'daysInQuote', value: daysInQuote, fetchedAt: this.fetchedAt })\n return daysInQuote\n }\n\n getBarIndexes() {\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\n return Array.from({ length: this.date.length }).map((_, index) => index)\n }\n\n const barIndex = []\n const dayToOffset = this.getDayToOffset()\n\n for (let i = 0; i < this.date.length; i += 1) {\n const date = dateFromUnixTimestamp(this.date[i])\n let x = Math.ceil((date.getHours() * 60 + date.getMinutes() - this.marketStartMinutes) / this.interval)\n x += dayToOffset[dateStringFromDate(date)] * this.getBarsInDay()! // add days\n barIndex[i] = x\n }\n\n return barIndex\n }\n\n getBarIndex(i: number) {\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\n return i\n }\n return this.barIndex[i]\n }\n\n getBarsInDay() {\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\n return\n }\n return Math.ceil(this.drawMinutesPerDay / this.interval)\n }\n\n getDataIndexByBarIndex(index: number) {\n if (this.barIndex) {\n for (let i = 0; i < this.barIndex.length; i++) {\n if (this.barIndex[i] === index) {\n return i\n }\n }\n }\n return -1\n }\n\n getDataByBarIndex(key: keyof Quote, index: number) {\n const dataIndex = this.getDataIndexByBarIndex(index)\n if (dataIndex > -1) {\n const quoteData = this[key as keyof Quote]! as number[]\n return quoteData[dataIndex] ?? null\n }\n return null\n }\n\n getDateToIndex() {\n const cachedDateToIndex = getCachedQuote({ cid: this.cid, key: 'dateToIndex', fetchedAt: this.fetchedAt })\n if (cachedDateToIndex) {\n return cachedDateToIndex as unknown as ObjectHash\n }\n const dateToIndex: ObjectHash = {}\n for (let i = 0; i < this.date.length; i++) {\n dateToIndex[this.date[i]] = i\n }\n setCachedQuote({ cid: this.cid, key: 'dateToIndex', value: dateToIndex, fetchedAt: this.fetchedAt })\n return dateToIndex\n }\n\n getTimestampFomPositionX(positionX: number) {\n if (this.date.length === 0) {\n return 0\n }\n return getTimestampFromPositionX({\n positionX,\n quote: this,\n })\n }\n\n getPositionXFromTimestamp(timestamp: number) {\n if (this.date.length === 0) {\n return 0\n }\n return getPositionXFromTimestamp({\n timestamp,\n quote: this,\n })\n }\n\n getUrl(options: QuoteUrlOptions) {\n const config: UrlOptions = {\n ticker: this.ticker,\n instrument: this.instrument,\n timeframe: this.timeframe || 'd1',\n aftermarket: this.aftermarket,\n premarket: this.premarket,\n patterns: this.hasPatterns,\n maxBars: this.maxBars,\n ...options,\n }\n\n const isStock = config.instrument === Instrument.Stock\n const isBrowserElite = !getIsSSr() && document.location.host === 'elite.finviz.com'\n let domain = isBrowserElite && isStock ? 'https://api.finviz.com' : ''\n\n if (getIsSSr()) {\n domain = process.env.BE_API_URL!\n }\n\n return `${domain}/api/quote.ashx?${queryString.stringify({ rev: Date.now(), ...config })}`\n }\n\n getRawTicker() {\n return getRawTickerForInstrument(this.instrument, this.ticker)\n }\n\n clearData() {\n this.updateAttributes(emptyQuote)\n }\n}\n\nQuote.initClass()\n\nexport default Quote\n","export enum QuoteFetchType {\n Refetch = 'refetch',\n NewerData = 'newerData',\n}\n\nexport enum QuoteFetchTypeUrlOption {\n New = 'new',\n Newer = 'newer',\n}\n\nexport interface QuoteUrlOptions {\n type: QuoteFetchTypeUrlOption\n dataId?: string\n events?: boolean\n}\n","import merge from 'lodash.merge'\n\nimport { ChartConfigChart } from '../../server/chartConfig'\nimport { Instrument, ObjectHash, Theme } from '../../types/shared'\nimport { SpecificChartFunctionality } from '../constants/common'\nimport Utils, { isRedesignedPage } from '../utils'\nimport LayoutModel from './chart_layout'\nimport { CHART_FORMAT, getChartSettings, getColorOverwrites } from './chart_settings'\nimport { largeChartFontSize } from './chart_settings/constants'\nimport { ISettings } from './chart_settings/interfaces'\nimport {\n IChartThemeColors,\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from './constants'\n\ninterface Config {\n theme: Theme\n barMargin?: number\n barWidth?: number\n border?: number\n charts?: ChartConfigChart[]\n colorsOverride?: Array\n chartFormat?: CHART_FORMAT\n volumeHeight?: number\n colors?: ObjectHash, Theme>\n specificChartFunctionality?: SpecificChartFunctionality\n}\n\nexport function getSettings(config: Config): ISettings {\n const settings = merge({}, getChartSettings({ chartFormat: config.chartFormat, theme: config.theme }))\n\n if (config.barWidth != null) {\n settings.ChartSettings.center.barWidth = config.barWidth\n settings.IndicatorSettings.center.barWidth = config.barWidth\n }\n if (config.barMargin != null) {\n settings.ChartSettings.center.barMargin = config.barMargin\n settings.IndicatorSettings.center.barMargin = config.barMargin\n }\n if (config.border != null) {\n settings.ChartSettings.center.border = config.border\n settings.IndicatorSettings.center.border = config.border\n }\n if (config.colorsOverride) {\n settings.ColorsSettings = config.colorsOverride\n }\n if (config.volumeHeight) {\n settings.ChartSettings.center.volumeHeight = config.volumeHeight\n }\n if (config.colors) {\n const settingColors = settings.ChartSettings.general.Colors\n settings.ChartSettings.general.Colors = {\n ...settingColors,\n [Theme.light]: {\n ...settingColors[Theme.light],\n ...getColorOverwrites({ theme: Theme.light, colors: config.colors }),\n },\n [Theme.dark]: {\n ...settingColors[Theme.dark],\n ...getColorOverwrites({ theme: Theme.dark, colors: config.colors }),\n },\n }\n }\n if (config.specificChartFunctionality === SpecificChartFunctionality.chartPage && Utils.isMobile()) {\n settings.ChartSettings.left.width = 0\n settings.ChartSettings.top.ticker.margin.left = settings.ChartSettings.left.overlayLabel.margin.left\n settings.IndicatorSettings.left.width = 0\n }\n if (SpecificChartFunctionality.chartPage === config.specificChartFunctionality || isRedesignedPage(config)) {\n settings.ChartSettings.top.height = 10\n }\n\n if (config.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\n const isGroupInstrument = config.charts?.some(({ instrument }) => instrument === Instrument.Group)\n if (isGroupInstrument) {\n settings.ChartSettings.top.ohlc.margin.top = 4\n settings.ChartSettings.top.ticker.margin.top = 0\n settings.ChartSettings.top.ticker.font = {\n size: largeChartFontSize.XXL,\n style: 'bold',\n }\n settings.ChartSettings.left.timeframe.margin.top = 12\n settings.ChartSettings.left.timeframe.font = {\n size: largeChartFontSize.S,\n style: 'bold',\n }\n }\n }\n\n return settings\n}\n\nexport function updateSettings(chart_layout: LayoutModel, theme: string): ISettings {\n const settings = merge({}, chart_layout.settings)\n const isLight = theme === Theme.light\n settings.MarketSentimentSettings.general.Colors = isLight ? { ...chartLightTheme } : { ...chartDarkTheme }\n settings.IndicatorSettings.general.Colors = isLight ? { ...indicatorLightTheme } : { ...indicatorDarkTheme }\n settings.ElementSettings.Colors = isLight ? { ...elementLightTheme } : { ...elementDarkTheme }\n\n return settings\n}\n\nexport function getChartLayoutSettings(chart_layout: LayoutModel): ISettings {\n const settings = chart_layout.settings\n\n return {\n ...settings,\n ChartSettings: {\n ...settings.ChartSettings,\n general: {\n ...settings.ChartSettings.general,\n Colors: {\n ...settings.ChartSettings.general.Colors,\n ...settings.ChartSettings.general.Colors[chart_layout.theme],\n },\n },\n },\n }\n}\n","import { Instrument } from '../../types/shared'\nimport ChartLayoutModel from './chart_layout'\nimport Element from './element'\n\nexport const handleRemoveIndicatorPane = ({\n paneIndex,\n chartLayoutModel,\n}: {\n paneIndex: number\n chartLayoutModel: ChartLayoutModel\n}) => {\n const charts = chartLayoutModel.getAllCharts()\n charts.forEach((chart) => chart.getAllPanes()[paneIndex].destroyCascade())\n}\n\nexport function getNormalizedZIndex({ index, isBelowZero }: { index: number; isBelowZero: boolean }) {\n return (index + 1) * (isBelowZero ? -1 : 1)\n}\n\nexport function rebuildElementZIndexes({\n elementsArray,\n isBelowZero,\n}: {\n elementsArray: Element[]\n isBelowZero: boolean\n}) {\n const elements = isBelowZero ? [...elementsArray].reverse() : elementsArray\n elements.forEach((element, index) => {\n const newZIndex = getNormalizedZIndex({ index, isBelowZero })\n if (newZIndex !== element.zIndex) {\n element.updateAttributes({ zIndex: newZIndex })\n }\n })\n}\n\nexport function changeElementZIndexes({\n elementsArray,\n addElement,\n oldZIndex,\n newZIndex,\n isBelowZero = false,\n}: {\n elementsArray: Element[]\n addElement: Element | undefined\n oldZIndex: number\n newZIndex: number\n isBelowZero?: boolean\n}) {\n const array = isBelowZero ? [...elementsArray].reverse() : elementsArray\n const elements =\n elementsArray.length === 0 && addElement\n ? [...array, addElement]\n : array\n .filter((_, index) => getNormalizedZIndex({ index, isBelowZero }) !== oldZIndex)\n .flatMap((el, index) =>\n getNormalizedZIndex({ index, isBelowZero }) === newZIndex && addElement ? [addElement, el] : el\n )\n\n // If there are only 2 drawings and we move a drawing from index 1 to index 2 to have to push it to the array because it's the last element and it didn't get into the array in the flatMap above\n if (elements.length < Math.abs(newZIndex) && addElement) {\n elements.push(addElement)\n }\n\n rebuildElementZIndexes({ elementsArray: isBelowZero ? [...elements].reverse() : elements, isBelowZero })\n}\n\nexport function getRawTickerForInstrument(instrument: Instrument, ticker: string) {\n return `${\n [Instrument.Crypto, Instrument.Forex, Instrument.Futures].includes(instrument) && !ticker.includes('@') ? '@' : ''\n }${ticker}`\n}\n","import {\n ChartConfigChartPaneElement,\n IModalConfig,\n IModalConfigInput,\n ObjectHash,\n RequireByKey,\n} from '../../types/shared'\nimport Element from '../canvas/element'\nimport BaseChart from '../charts/base_chart'\nimport { OverlayType } from '../constants/common'\nimport Quote from '../models/quote'\nimport { convertColorToHEX, getRGBAValueFromValidColorString } from '../utils/colors'\nimport { getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\n\nexport interface IOverlayIsValid {\n getIsValid(key: string): boolean | void\n}\n\nconst DEFAULT_LABEL_COLOR = '#0587cd'\n\nclass Overlay extends Element implements IOverlayIsValid {\n static type = OverlayType.Overlay\n static label = 'Overlay'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt] = getParsedIntegersFromPeriodString(period)\n return periodInt\n }\n\n declare data: Quote\n declare chart: BaseChart\n\n get type() {\n return (this.constructor as typeof Overlay).type\n }\n\n get label() {\n return (this.constructor as typeof Overlay).label\n }\n\n getLabelColor() {\n return this.attrs.color ? convertColorToHEX(this.attrs.color) : DEFAULT_LABEL_COLOR\n }\n\n getFreeColor() {\n return this.getChartLayoutSettings().ColorsSettings[0]\n // TODO proper implementation - example how this could be done:\n // let colorsUsed = []\n // for (let overlay of this.chart.overlays) {\n // let object = overlay.getModalConfig().inputs\n // for (let _ in object) {\n // let input = object[_]\n // if (input.type === 'color') {\n // colorsUsed.push(input.value)\n // }\n // }\n // }\n // for (let color of colors) {\n // if (!colorsUsed.includes(color)) {\n // return color\n // }\n // }\n // return colors[0]\n }\n\n renderContent(_?: RenderingContext2DType) {\n this.data = this.model.chart().quote()\n }\n\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\n\n getIsValid(_: string): boolean | undefined {\n throw Error('Implement')\n }\n\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\n }\n\n isRendered() {\n return true\n }\n\n isRenderedOverlaysLabel() {\n return this.isRendered()\n }\n\n getModalConfig(): IModalConfig {\n return {\n title: '',\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n toConfig() {\n const colors: string[] = []\n const periods: string[] = []\n\n this.getModalConfig().inputs.forEach((input: IModalConfigInput) => {\n if (input.type === 'color') {\n colors.push(getRGBAValueFromValidColorString(input.value.toString()))\n } else {\n periods.push(input.value.toString())\n }\n })\n\n return { type: this.type, period: periods.join(','), color: colors.join('|') }\n }\n}\n\nexport default Overlay\n","import { ChartConfigChartPaneElement, RequireByKey, Theme } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Overlay from './overlay'\n\nconst BB_COLORS = {\n [Theme.light]: {\n TOP: '#D386DF',\n BOTTOM: '#69C1EA',\n MIDDLE: '#CFD2F2',\n },\n [Theme.dark]: {\n TOP: '#D38BFB',\n BOTTOM: '#57AEFB',\n MIDDLE: '#E1B6FC',\n },\n}\n\nconst DEFAULT_PARAMETERS = {\n Period: 20,\n Deviations: 2.0,\n}\n\ninterface Attrs {\n period: number | string\n deviations: number\n topColor?: string\n bottomColor?: string\n}\n\nfunction parsePeriod(periodStr: string) {\n const values = periodStr.split(',')\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\n const deviations = parseFloat(values[1]) || DEFAULT_PARAMETERS.Deviations\n\n return [period, deviations]\n}\n\nclass BollingerBands extends Overlay {\n static type = OverlayType.Bb\n static label = 'Bollinger Bands'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n const [periodInt, deviations] = parsePeriod(period)\n this.attrs.period = periodInt\n this.attrs.deviations = deviations\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n if (typeof this.attrs.period !== 'number') {\n return\n }\n super.renderContent()\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\n const theme = this.model.chart().chart_layout().theme as Theme\n const { leftOffset, width } = this.model.chart()\n const [top, bottom] = this.model.scale.y.domain()\n const scaledTop = this.fy(top)\n const scaledBottom = this.fy(bottom)\n const { close } = this.data\n const period = Math.min(this.attrs.period, close.length - 1)\n\n let firstBarToRender\n let lastBarToRender = 0\n\n const sma: number[] = []\n const stdDev: number[] = []\n\n let sum = 0\n for (let i = 0; i < period; i++) {\n sum += close[i]\n }\n\n // middle line && find first & last bar to render\n context.translate(0.5, 0.5)\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', BB_COLORS[theme].MIDDLE)\n for (let i = period; i < close.length; i++) {\n sum = sum - close[i - period] + close[i]\n sma[i] = sum / period\n\n let stdDevSum = 0\n for (let j = i - period + 1; j <= i; j++) {\n stdDevSum += Math.pow(close[j] - sma[i], 2)\n }\n stdDev[i] = Math.sqrt(stdDevSum / period)\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (firstBarToRender === undefined) firstBarToRender = i\n\n context.lineTo(this.fx(i), Math.round(this.fy(sma[i])))\n\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n lastBarToRender = i\n }\n if (firstBarToRender === undefined) return\n context.stroke()\n context.set('fillStyle', Colors.overlayTransparentBackground)\n\n // top line\n context.beginPath()\n context.moveTo(this.fx(firstBarToRender), scaledTop)\n context.set('strokeStyle', BB_COLORS[theme].TOP)\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const upperBand = sma[i] + stdDev[i] * this.attrs.deviations\n context.lineTo(this.fx(i), Math.round(this.fy(upperBand)))\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), scaledTop)\n context.fill()\n\n // bottom line\n context.beginPath()\n context.moveTo(this.fx(firstBarToRender), scaledBottom)\n context.set('strokeStyle', BB_COLORS[theme].BOTTOM)\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const lowerBand = sma[i] - stdDev[i] * this.attrs.deviations\n context.lineTo(this.fx(i), Math.round(this.fy(lowerBand)))\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), scaledBottom)\n context.fill()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\n required: true,\n min: 1,\n max: 999999,\n }\n const deviations = {\n type: 'number',\n label: 'Deviations',\n name: 'deviations',\n value: this.attrs.deviations ?? DEFAULT_PARAMETERS.Deviations,\n required: true,\n min: 0.1,\n max: 999,\n step: 0.1,\n }\n const topColor = {\n type: 'color',\n label: 'Top Color',\n name: 'topColor',\n value: this.attrs.topColor ?? this.getFreeColor(),\n }\n const bottomColor = {\n type: 'color',\n label: 'Bottom Color',\n name: 'bottomColor',\n value: this.attrs.bottomColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, deviations, topColor, bottomColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n deviations: `${deviations.label} must be a number between ${deviations.min} and ${deviations.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'deviations':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n case 'topColor':\n case 'bottomColor':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n const theme = this.model.chart().chart_layout().theme as Theme\n return this.attrs.topColor || BB_COLORS[theme].TOP\n }\n\n toString() {\n return `BB ${this.attrs.period},${this.attrs.deviations}`\n }\n}\n\nBollingerBands.prototype.defaults = { topColor: '#69c1ea', bottomColor: '#d386df' }\n\nexport default BollingerBands\n","import { OverlayType } from '../constants/common'\nimport utils from '../utils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n channelStrokeColor: string\n channelFillColor: string\n medianBandColor: string\n}\n\nconst DEFAULT_PERIOD = 20\n\nconst COLORS = {\n ChannelStroke: '#69c1ea',\n ChannelFill: '#69C1EA12',\n MedianBandStroke: '#ffa75f',\n}\n\nclass DonchianChannels extends Overlay {\n static type = OverlayType.Dch\n static label = 'Donchian Channels'\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n this.attrs.period = parseInt(period, 10)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const { period } = this.attrs\n const upperBand: number[] = []\n const lowerBand: number[] = []\n const medianBand: number[] = []\n let firstBarToRender = -1\n let lastBarToRender = 0\n if (this.data.close.length === undefined) {\n return\n }\n\n context.save()\n context.translate(0.5, 0.5)\n context.set('lineWidth', 1)\n context.set('strokeStyle', COLORS.ChannelStroke)\n context.set('fillStyle', COLORS.ChannelFill)\n\n //upper band + clip\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n firstBarToRender = firstBarToRender === -1 ? i : firstBarToRender\n upperBand[i] = utils.max(this.data.high.slice(Math.max(0, i - period), i + 1))\n lowerBand[i] = utils.min(this.data.low.slice(Math.max(0, i - period), i + 1))\n medianBand[i] = (upperBand[i] + lowerBand[i]) / 2\n\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\n lastBarToRender = i\n },\n })\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\n context.clip()\n\n // lower band + fill\n context.beginPath()\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), 0)\n context.lineTo(0, 0)\n context.fill()\n\n // median band\n context.set('strokeStyle', COLORS.MedianBandStroke)\n context.beginPath()\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n context.lineTo(x, Math.round(this.fy(medianBand[i])))\n }\n context.stroke()\n context.restore()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? DEFAULT_PERIOD,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const strokeColor = {\n type: 'color',\n label: 'Channels Stroke Color',\n name: 'strokeColor',\n value: this.attrs.channelStrokeColor ?? this.getFreeColor(),\n }\n const fillColor = {\n type: 'color',\n label: 'Channels Fill Color',\n name: 'fillColor',\n value: this.attrs.channelFillColor ?? this.getFreeColor(),\n }\n const medianBandColor = {\n type: 'color',\n label: 'Median Band Color',\n name: 'medianBandColor',\n value: this.attrs.medianBandColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, medianBandColor, strokeColor, fillColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'medianBandColor':\n case 'strokeColor':\n case 'fillColor':\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.medianBandColor\n }\n\n toString() {\n return `Donchian ${this.attrs.period}`\n }\n}\n\nDonchianChannels.prototype.defaults = {\n medianBandColor: COLORS.MedianBandStroke,\n channelStrokeColor: COLORS.ChannelStroke,\n channelFillColor: COLORS.ChannelFill,\n}\n\nexport default DonchianChannels\n","import { OverlayType } from '../constants/common'\nimport ExponentialMovingAverage from '../helpers/ema'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n deviations: number\n color: string\n}\n\nclass EMA extends Overlay {\n static type = OverlayType.Ema\n static label = 'Exponential Moving Average'\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n this.attrs.period = parseInt(period, 10)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const ema = new ExponentialMovingAverage(this.attrs.period)\n\n context.translate(0.5, 0.5)\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', this.attrs.color)\n for (let i = 0; i < this.data.close.length; i++) {\n ema.add(this.data.close[i])\n const x = this.fx(i)\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n context.lineTo(x, Math.round(this.fy(ema.value)))\n }\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? 5,\n required: true,\n min: 1,\n max: 999999,\n }\n const color = {\n type: 'color',\n label: 'Color',\n name: 'color',\n value: this.attrs.color ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, color],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'color':\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\n default:\n return false\n }\n }\n\n toString() {\n return `EMA ${this.attrs.period}`\n }\n}\n\nEMA.prototype.defaults = { color: '#ffa75f' }\n\nexport default EMA\n","import { OverlayType } from '../constants/common'\nimport EMA from './ema'\n\nclass EMA2 extends EMA {\n static type = OverlayType.Ema2\n}\n\nEMA2.prototype.defaults = { color: '#ff6400' }\n\nexport default EMA2\n","import { OverlayType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport { getBarWidthWithMargin } from '../utils/chart'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n lowColor: string\n highColor: string\n}\n\nclass HighLow extends Overlay {\n static type = OverlayType.Hilo\n static label = 'High/Low'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.renderContent = this.renderContent.bind(this)\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n this.attrs.period = parseInt(period, 10)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const chartModel = this.model.chart()\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const { leftOffset, width, zoomFactor } = chartModel\n const barWidth = getBarWidthWithMargin({\n zoomFactor,\n chartLayout: chartModel.chart_layout(),\n })\n const halfWidth = barWidth / 2\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\n let firstBarToRender\n let lastBarToRender = 0\n context.translate(0.5, 0.5)\n context.set('fillStyle', Colors.overlayTransparentBackground)\n context.beginPath()\n context.set('strokeStyle', this.attrs.highColor)\n let prevHigh = -1\n for (let i = 0; i < this.data.close.length; i++) {\n let highestHigh = this.data.high[i]\n for (let j = i - period + 1; j <= i; j++) {\n if (this.data.high[j] > highestHigh) {\n highestHigh = this.data.high[j]\n }\n }\n\n const x = this.fx(i)\n if (this.fx(i + 1) + leftOffset < -10) {\n prevHigh = highestHigh\n continue\n }\n if (firstBarToRender === undefined) firstBarToRender = i\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n\n const diff = this.data.barIndex[i] - this.data.barIndex[lastBarToRender]\n if (diff > 1 && prevHigh !== highestHigh && prevHigh > 0) {\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevHigh)))\n }\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(highestHigh)))\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(highestHigh)))\n\n prevHigh = highestHigh\n lastBarToRender = i\n }\n context.stroke()\n if (firstBarToRender === undefined) return\n\n // return to start and fill with background color\n context.lineTo(this.fx(lastBarToRender) + halfWidth, 0)\n context.lineTo(this.fx(firstBarToRender) - halfWidth, 0)\n context.fill()\n\n context.beginPath()\n context.set('strokeStyle', this.attrs.lowColor)\n let prevLow = -1\n let prevBar = firstBarToRender\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n let lowestLow = this.data.low[i]\n for (let j = i - period + 1; j <= i; j++) {\n if (this.data.low[j] < lowestLow) {\n lowestLow = this.data.low[j]\n }\n }\n\n const x = this.fx(i)\n const diff = this.data.barIndex[i] - this.data.barIndex[prevBar]\n if (diff > 1 && prevLow !== lowestLow && prevLow > 0) {\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevLow)))\n }\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(lowestLow)))\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(lowestLow)))\n\n prevLow = lowestLow\n prevBar = i\n }\n context.stroke()\n context.translate(-0.5, -0.5)\n\n // return to start and fill with background color\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\n context.lineTo(this.fx(firstBarToRender) - halfWidth, context.canvas.height)\n context.fill()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? 50,\n required: true,\n min: 1,\n max: 999999,\n }\n const highColor = {\n type: 'color',\n label: 'High Color',\n name: 'highColor',\n value: this.attrs.highColor ?? this.getFreeColor(),\n }\n const lowColor = {\n type: 'color',\n label: 'Low Color',\n name: 'lowColor',\n value: this.attrs.lowColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, highColor, lowColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'highColor':\n case 'lowColor':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.highColor\n }\n\n toString() {\n return `HILO ${this.attrs.period}`\n }\n}\n\nHighLow.prototype.defaults = {\n lowColor: '#69c1ea',\n highColor: '#d386df',\n}\n\nexport default HighLow\n","import { OverlayType } from '../constants/common'\nimport { isPositiveFloat } from '../utils/helpers'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n price: number\n color: string\n}\n\nclass HorizontalLine extends Overlay {\n static type = OverlayType.Hline\n static label = 'Horizontal Line'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n set(obj: Partial) {\n super.set(obj)\n if (typeof this.attrs.period === 'string' && this.attrs.price === undefined) {\n this.attrs.price = parseFloat(this.attrs.period)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const y = Math.round(this.fy(this.attrs.price))\n context.set('strokeStyle', this.attrs.color)\n context.translate(0, 0.5)\n context.beginPath()\n context.moveTo(-this.model.chart().leftOffset, y)\n context.lineTo(-this.model.chart().leftOffset + this.model.chart().width, y)\n context.stroke()\n context.translate(0, -0.5)\n }\n\n getModalConfig() {\n const price = {\n type: 'number',\n label: 'Price',\n name: 'price',\n value: this.attrs.price || this.model?.scale?.y?.domain().reduce((a: number, b: number) => a + b, 0) / 2,\n required: true,\n step: 0.1,\n }\n const color = {\n type: 'color',\n label: 'Color',\n name: 'color',\n value: this.attrs.color ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [price, color],\n inputsErrorMessages: {\n price: `${price.label} must be number`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'price':\n return isPositiveFloat(this.attrs[key])\n case 'color':\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\n default:\n return false\n }\n }\n\n toString() {\n return `HL ${this.attrs.price}`\n }\n}\n\nHorizontalLine.prototype.defaults = { color: '#0587cd' }\n\nexport default HorizontalLine\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period?: string\n conversion: number\n base: number\n spanB: number\n spanAStrokeColor: string\n spanAFillColor: string\n spanBStrokeColor: string\n spanBFillColor: string\n conversionLineColor: string\n baseLineColor: string\n laggingSpanColor: string\n}\n\nconst COLORS = {\n SpanA: {\n Stroke: '#009600',\n Fill: '#00960022',\n },\n SpanB: {\n Stroke: '#C80000',\n Fill: '#C8000022',\n },\n ConversionLine: '#69C1EA',\n BaseLine: '#E54040',\n LaggingSpan: '#FFA75F',\n}\n\nconst DEFAULT_PARAMETERS = {\n Conversion: 9,\n Base: 26,\n SpanB: 52,\n}\n\nfunction parsePeriod(period: string) {\n const [conversion = DEFAULT_PARAMETERS.Conversion, base = DEFAULT_PARAMETERS.Base, spanB = DEFAULT_PARAMETERS.SpanB] =\n getParsedIntegersFromPeriodString(period)\n return [conversion, base, spanB]\n}\n\nclass IchimokuCloud extends Overlay {\n static type = OverlayType.Ic\n static label = 'Ichimoku Cloud'\n static renderFull = false\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n return Math.max(...parsePeriod(period))\n }\n\n get renderFull() {\n return (this.constructor as typeof IchimokuCloud).renderFull\n }\n\n set(obj: Partial) {\n super.set(obj)\n if (\n typeof this.attrs.period === 'string' &&\n (this.attrs.conversion === undefined || this.attrs.base === undefined || this.attrs.spanB === undefined)\n ) {\n const [conversion, base, spanB] = parsePeriod(this.attrs.period)\n this.attrs.conversion = conversion\n this.attrs.base = base\n this.attrs.spanB = spanB\n }\n this.trigger('change')\n return this\n }\n\n fx = (x: number) => {\n const lastIndex = this.data.close.length - 1\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\n\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const { high, low, close } = this.data\n\n const {\n conversion,\n base,\n spanB,\n spanAFillColor,\n spanAStrokeColor,\n spanBFillColor,\n spanBStrokeColor,\n baseLineColor,\n conversionLineColor,\n laggingSpanColor,\n } = this.attrs\n\n const conversionLine: number[] = []\n const baseLine: number[] = []\n const senkouSpanA: number[] = []\n const senkouSpanB: number[] = []\n const conversionStartIndex = conversion - 1\n const baseStartIndex = base - 1\n const spanBIndex = spanB - 1\n const start = Math.min(baseStartIndex, conversionStartIndex)\n const end = close.length + baseStartIndex\n\n if (this.data.close.length === 0) return\n\n // Calculation\n for (let i = start; i < end; i++) {\n if (i >= conversionStartIndex && i < close.length) {\n const highestHi = Math.max(...high.slice(i - conversionStartIndex, i + 1))\n const lowestLo = Math.min(...low.slice(i - conversionStartIndex, i + 1))\n conversionLine[i] = (highestHi + lowestLo) / 2\n }\n\n if (i >= baseStartIndex && i < close.length) {\n const highestHi = Math.max(...high.slice(i - baseStartIndex, i + 1))\n const lowestLo = Math.min(...low.slice(i - baseStartIndex, i + 1))\n baseLine[i] = (highestHi + lowestLo) / 2\n\n senkouSpanA[i + baseStartIndex] = (baseLine[i] + conversionLine[i]) / 2 // + baseStart because it needs to be shifted to the future\n }\n\n if (i >= spanBIndex) {\n const highestHi = Math.max(...high.slice(i - spanBIndex, i + 1))\n const lowestLo = Math.min(...low.slice(i - spanBIndex, i + 1))\n senkouSpanB[i + baseStartIndex] = (highestHi + lowestLo) / 2 // + baseStart because it needs to be shifted to the future\n }\n }\n\n let lastSpanAX = 0\n let lastSpanBX = 0\n const cloudStartingX = this.fx(spanBIndex + baseStartIndex)\n\n context.set('lineWidth', 1)\n context.translate(0.5, 0.5)\n context.save()\n // 1. Senkou Span A\n // 1.1 Stroke\n context.set('strokeStyle', spanAStrokeColor)\n context.set('fillStyle', spanAFillColor)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\n lastSpanAX = x\n },\n })\n context.stroke()\n // 1.2 Clipping area\n context.lineTo(lastSpanAX, context.canvas.height)\n context.lineTo(cloudStartingX, context.canvas.height)\n context.clip()\n // 1.3 Fill\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n if (i >= senkouSpanA.length) return\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\n lastSpanBX = x\n },\n })\n context.lineTo(lastSpanBX, 0)\n context.lineTo(cloudStartingX, 0)\n context.fill()\n context.restore()\n\n // 2. Senkou Span B\n // 2.1 Stroke\n context.save()\n context.set('strokeStyle', spanBStrokeColor)\n context.set('fillStyle', spanBFillColor)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n if (i >= senkouSpanA.length) return\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\n },\n })\n context.stroke()\n // 2.2 Clipping area\n context.lineTo(lastSpanBX, context.canvas.height)\n context.lineTo(cloudStartingX, context.canvas.height)\n context.clip()\n // 2.3 Fill\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\n },\n })\n context.lineTo(lastSpanBX, 0)\n context.lineTo(cloudStartingX, 0)\n context.fill()\n context.restore()\n context.translate(-0.5, -0.5)\n\n if (this.renderFull) {\n // conversion line\n context.set('strokeStyle', conversionLineColor)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(conversionLine[i])))\n },\n })\n context.stroke()\n\n // base line\n context.set('strokeStyle', baseLineColor)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(baseLine[i])))\n },\n })\n context.stroke()\n\n // lagging span\n context.set('strokeStyle', laggingSpanColor)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: (x: number) => this.fx(x - base),\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.data.close[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n }\n\n getModalConfig() {\n const conversion = {\n type: 'number',\n label: 'Conversion Line',\n name: 'conversion',\n value: this.attrs.conversion ?? DEFAULT_PARAMETERS.Conversion,\n required: true,\n min: 1,\n max: 999999,\n }\n const base = {\n type: 'number',\n label: 'Base Line Length',\n name: 'base',\n value: this.attrs.base ?? DEFAULT_PARAMETERS.Base,\n required: true,\n min: 1,\n max: 999999,\n }\n const spanB = {\n type: 'number',\n label: 'Leading Span B Length',\n name: 'spanB',\n value: this.attrs.spanB ?? DEFAULT_PARAMETERS.SpanB,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const spanAStrokeColor = {\n type: 'color',\n label: 'Span A Stroke Color',\n name: 'spanAStrokeColor',\n value: this.attrs.spanAStrokeColor ?? this.getFreeColor(),\n }\n const spanAFillColor = {\n type: 'color',\n label: 'Span A Fill Color',\n name: 'spanAFillColor',\n value: this.attrs.spanAFillColor ?? this.getFreeColor(),\n }\n const spanBStrokeColor = {\n type: 'color',\n label: 'Span B Stroke Color',\n name: 'spanBStrokeColor',\n value: this.attrs.spanBStrokeColor ?? this.getFreeColor(),\n }\n const spanBFillColor = {\n type: 'color',\n label: 'Span B Fill Color',\n name: 'spanBFillColor',\n value: this.attrs.spanBFillColor ?? this.getFreeColor(),\n }\n const conversionLineColor = {\n type: 'color',\n label: 'Conversion Line Color',\n name: 'conversionLineColor',\n value: this.attrs.conversionLineColor ?? this.getFreeColor(),\n }\n const baseLineColor = {\n type: 'color',\n label: 'Base Line Color',\n name: 'baseLineColor',\n value: this.attrs.baseLineColor ?? this.getFreeColor(),\n }\n const laggingSpanColor = {\n type: 'color',\n label: 'Lagging Span Color',\n name: 'laggingSpanColor',\n value: this.attrs.laggingSpanColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [\n conversion,\n base,\n spanB,\n spanAStrokeColor,\n spanAFillColor,\n spanBStrokeColor,\n spanBFillColor,\n conversionLineColor,\n baseLineColor,\n laggingSpanColor,\n ],\n inputsErrorMessages: {\n conversion: `${conversion.label} must be a whole number between ${conversion.min} and ${conversion.max}`,\n base: `${base.label} must be a whole number between ${base.min} and ${base.max}`,\n spanB: `${spanB.label} must be a whole number between ${spanB.min} and ${spanB.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'conversion':\n case 'base':\n case 'spanB':\n case 'lagging':\n return this.getIsNumberInputValid({ key })\n case 'spanAStrokeColor':\n case 'spanAFillColor':\n case 'spanBStrokeColor':\n case 'spanBFillColor':\n case 'conversionLineColor':\n case 'baseLineColor':\n case 'laggingSpanColor':\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.spanAStrokeColor\n }\n\n toString() {\n return `Ichimoku ${this.attrs.conversion},${this.attrs.base},${this.attrs.spanB}`\n }\n}\n\nIchimokuCloud.prototype.defaults = {\n spanAStrokeColor: COLORS.SpanA.Stroke,\n spanAFillColor: COLORS.SpanA.Fill,\n spanBStrokeColor: COLORS.SpanB.Stroke,\n spanBFillColor: COLORS.SpanB.Fill,\n conversionLineColor: COLORS.ConversionLine,\n baseLineColor: COLORS.BaseLine,\n laggingSpanColor: COLORS.LaggingSpan,\n}\n\nexport default IchimokuCloud\n","import { OverlayType } from '../constants/common'\nimport IchimokuCloud from './ic'\n\nclass IchimokuCloudFull extends IchimokuCloud {\n static type = OverlayType.Icf\n static label = 'Ichimoku Cloud (Full)'\n static renderFull = true\n}\n\nexport default IchimokuCloudFull\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport AverageTrueRange from '../helpers/atr'\nimport ExponentialMovingAverage from '../helpers/ema'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period?: string\n emaPeriod: number\n multiplier: number\n atrPeriod: number\n strokeColor: string\n fillColor: string\n}\n\nconst DEFAULT_PARAMETERS = {\n emaPeriod: 20,\n multiplier: 2.0,\n atrPeriod: 10,\n}\n\nconst COLORS = {\n Stroke: '#69C1EA',\n Fill: '#69C1EA33',\n}\n\nfunction parsePeriod(period: string) {\n const values = period.split(',')\n const emaPeriod = parseInt(values[0])\n const multiplier = parseFloat(values[1])\n const atrPeriod = parseInt(values[2])\n\n return [emaPeriod, multiplier, atrPeriod]\n}\n\nclass KeltnerChannel extends Overlay {\n static type = OverlayType.Kch\n static label = 'Keltner Channel'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n return Math.max(...parsePeriod(period)) * 2\n }\n\n set(obj: Partial) {\n super.set(obj)\n if (\n typeof this.attrs.period === 'string' &&\n (this.attrs.emaPeriod === undefined || this.attrs.multiplier === undefined || this.attrs.atrPeriod === undefined)\n ) {\n const [emaPeriod, multiplier, atrPeriod] = parsePeriod(this.attrs.period)\n this.attrs.emaPeriod = emaPeriod\n this.attrs.multiplier = multiplier\n this.attrs.atrPeriod = atrPeriod\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const { emaPeriod, multiplier, atrPeriod, strokeColor, fillColor } = this.attrs\n const ema = new ExponentialMovingAverage(emaPeriod)\n const atr = new AverageTrueRange(atrPeriod)\n const middleLine: number[] = []\n const upperBand: number[] = []\n const lowerBand: number[] = []\n const start = Math.max(emaPeriod, atrPeriod)\n let firstBarToRender\n let lastBarToRender = 0\n\n context.save()\n context.translate(0.5, 0.5)\n context.set('lineWidth', 1)\n context.set('strokeStyle', strokeColor)\n context.set('fillStyle', fillColor)\n\n //top line + clip\n context.beginPath()\n for (let i = 1; i < this.data.close.length; i++) {\n ema.add(this.data.close[i])\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\n if (i < start) {\n continue\n }\n\n const x = this.fx(i)\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n if (firstBarToRender === undefined) firstBarToRender = i\n\n middleLine[i] = ema.value\n upperBand[i] = ema.value + multiplier * atr.value\n lowerBand[i] = ema.value - multiplier * atr.value\n\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\n lastBarToRender = i\n }\n if (firstBarToRender === undefined) {\n context.restore()\n return\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\n context.clip()\n\n // bottom line + fill\n context.beginPath()\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), 0)\n context.lineTo(0, 0)\n context.fill()\n\n // middle line\n context.beginPath()\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n context.lineTo(x, Math.round(this.fy(middleLine[i])))\n }\n context.stroke()\n context.restore()\n }\n\n getModalConfig() {\n const emaPeriod = {\n type: 'number',\n label: 'EMA Period',\n name: 'emaPeriod',\n value: this.attrs.emaPeriod ?? DEFAULT_PARAMETERS.emaPeriod,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const multiplier = {\n type: 'number',\n label: 'Multiplier',\n name: 'multiplier',\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.multiplier,\n required: true,\n step: 0.1,\n min: 0.0,\n max: 999,\n }\n\n const atrPeriod = {\n type: 'number',\n label: 'ATR Period',\n name: 'atrPeriod',\n value: this.attrs.atrPeriod ?? DEFAULT_PARAMETERS.atrPeriod,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const strokeColor = {\n type: 'color',\n label: 'Stroke Color',\n name: 'strokeColor',\n value: this.attrs.strokeColor ?? this.getFreeColor(),\n }\n const fillColor = {\n type: 'color',\n label: 'Fill Color',\n name: 'fillColor',\n value: this.attrs.fillColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [emaPeriod, multiplier, atrPeriod, strokeColor, fillColor],\n inputsErrorMessages: {\n emaPeriod: `${emaPeriod.label} must be a whole number between ${emaPeriod.min} and ${emaPeriod.max}`,\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\n atrPeriod: `${atrPeriod.label} must be a whole number between ${atrPeriod.min} and ${atrPeriod.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'emaPeriod':\n return this.getIsNumberInputValid({ key })\n case 'multiplier':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n case 'atrPeriod':\n return this.getIsNumberInputValid({ key })\n case 'strokeColor':\n case 'fillColor':\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.strokeColor\n }\n\n toString() {\n return `Keltner Channel ${this.attrs.emaPeriod},${this.attrs.multiplier},${this.attrs.atrPeriod}`\n }\n}\n\nKeltnerChannel.prototype.defaults = { strokeColor: COLORS.Stroke, fillColor: COLORS.Fill }\n\nexport default KeltnerChannel\n","import { OverlayType } from '../constants/common'\nimport Overlay from './overlay'\n\n// This indicator is used as a placeholder when we need to render TA like chart but don't need any overlay or indicator in the chart\nclass None extends Overlay {\n static type = OverlayType.None\n static label = 'None'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n isRendered() {\n return false\n }\n\n getIsValid() {\n return true\n }\n}\n\nexport default None\n","import Text from '../canvas/text'\nimport { OverlayType, TextAlign, TextBaseline } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport Overlay from './overlay'\n\ntype aboveBelowType = 'above' | 'below'\n\nclass Patterns extends Overlay {\n static type = OverlayType.Patterns\n static label = 'Patterns (daily charts)'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { ChartSettings } = this.getChartLayoutSettings()\n const data = this.data\n if (data.patterns.length === 0) {\n return\n }\n\n const originalScale = {\n width: 600,\n height: 300,\n barsInDay: Math.min(data.close.length, 200),\n high: data.patternsMaxRange,\n low: data.patternsMinRange,\n barWidth: 0,\n }\n originalScale.barWidth = originalScale.width / 200\n\n const scaleY = (originalScale.high - originalScale.low) / originalScale.height\n const fx = (x: number) => {\n if (x === 0) {\n return this.fx(0)\n }\n return this.fx(data.close.length - 1 - ~~(originalScale.barsInDay - x / originalScale.barWidth))\n }\n const fy = (y: number) => this.fy(originalScale.high - y * scaleY)\n const line = (color: string, x1: number, y1: number, x2: number, y2: number) => {\n const roundedXY = getRoundedObject({\n x1: fx(x1),\n y1: fy(y1),\n x2: fx(x2),\n y2: fy(y2),\n })\n const translateXY = getXYOffsetFromLine({ lineWidth: 1, ...roundedXY })\n context.translate(translateXY.x, translateXY.y)\n\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', color)\n context.lineTo(roundedXY.x1, roundedXY.y1)\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.stroke()\n\n context.translate(translateXY.x * -1, translateXY.y * -1)\n }\n const text = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, x2: number, y1: number) => {\n new Text(\n {\n x: fx((x1 + x2) / 2),\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\n font: { size: 8, style: 'bold' },\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\n fillStyle: color,\n textAlign: TextAlign.center,\n text,\n },\n this.model\n ).render(context)\n }\n const textHS = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, y1: number) => {\n new Text(\n {\n x: fx(x1) + 5,\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\n font: { size: 9, style: 'bold' },\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\n fillStyle: color,\n textAlign: TextAlign.center,\n text,\n },\n this.model\n ).render(context)\n }\n const above = (y: number) =>\n fy(y) + 10 >= this.model.height - ChartSettings.top.height - ChartSettings.bottom.height ? 'above' : 'below'\n const below = (y: number) => (fy(y) <= 15 ? 'below' : 'above')\n\n const supportColor = 'rgb(0, 150, 220)'\n const resistColor = 'rgb(180, 50, 200)'\n\n for (const pattern of data.patterns) {\n const { x1, x2, x3, y3 } = pattern\n let { y1, y2 } = pattern\n switch (pattern.kind) {\n case 1: // Horiz S/R\n line('rgba(50, 50, 180, 0.588)', x1, y1, x2, y2)\n break\n\n case 2: // tl resist\n line(resistColor, x1, y1, x2, y2)\n break\n\n case 3: // tl support\n if (y1 === originalScale.height && y2 === originalScale.height) {\n y1 = y2 = originalScale.height - 1\n // Maybe just need to check on the new scale?\n } // support \"pod grafom\"\n line(supportColor, x1, y1, x2, y2)\n break\n\n case 12: // double top\n text('Double Top', below(y1), resistColor, x1, x2, y1)\n break\n\n case 13: // double bottom\n text('Double Bottom', above(y1), supportColor, x1, x2, y1)\n break\n\n case 14: // multi top\n text('Multiple Top', below(y1), resistColor, x1, x2, y1)\n break\n\n case 15: // multi bottom\n text('Multiple Bottom', above(y1), supportColor, x1, x2, y1)\n break\n\n case 16: // h&s top\n textHS('L', below(y1), resistColor, x1, y1)\n textHS('H', below(y2), resistColor, x2, y2)\n textHS('R', below(y3), resistColor, x3, y3)\n break\n\n case 17: // h&s bot\n textHS('L', above(y1), supportColor, x1, y1)\n textHS('H', above(y2), supportColor, x2, y2)\n textHS('R', above(y3), supportColor, x3, y3)\n break\n default:\n break\n }\n }\n }\n\n getModalConfig() {\n const supportColor = {\n type: 'color',\n label: 'Support Color',\n name: 'supportColor',\n value: this.attrs.supportColor ?? this.getFreeColor(),\n }\n const resistColor = {\n type: 'color',\n label: 'Resist Color',\n name: 'resistColor',\n value: this.attrs.resistColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [supportColor, resistColor],\n inputsErrorMessages: {},\n }\n }\n\n getIsValid() {\n return true\n }\n\n isRenderedOverlaysLabel() {\n return false\n }\n\n toString() {\n return ''\n }\n}\n\nPatterns.prototype.defaults = { supportColor: '#69c1ea', resistColor: '#d386df' }\n\nexport default Patterns\n","import { OverlayType } from '../constants/common'\nimport Overlay from './overlay'\n\ninterface Attrs {\n step: number\n period: string\n maxStep: number\n risingColor: string\n fallingColor: string\n}\n\nclass SAR extends Overlay {\n static type = OverlayType.Sar\n static label = 'Parabolic SAR'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n set(obj: Partial) {\n super.set(obj)\n if (typeof this.attrs.period === 'string' && (this.attrs.step === undefined || this.attrs.maxStep === undefined)) {\n const [step = 0, maxStep = 0] = this.attrs.period.split(',').map((x) => parseFloat(x))\n this.attrs.step = step\n this.attrs.maxStep = maxStep\n }\n this.trigger('change')\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const data = this.data\n const deltaHigh = data.high[1] - data.high[0]\n const deltaLow = data.low[0] - data.low[1]\n const pdm = deltaHigh > 0 && deltaHigh > deltaLow ? deltaHigh : 0\n const mdm = deltaLow > 0 && deltaLow > deltaHigh ? deltaLow : 0\n let isLong = pdm >= mdm\n\n let sar = isLong ? data.low[0] : data.high[0]\n let ep = isLong ? data.high[1] : data.low[1]\n let newHigh = data.high[0]\n let newLow = data.low[0]\n let af = this.attrs.step\n\n for (let i = 1, end = data.close.length, asc = end >= 1; asc ? i < end : i > end; asc ? i++ : i--) {\n let sarToDraw\n const prevHigh = newHigh\n const prevLow = newLow\n newHigh = data.high[i]\n newLow = data.low[i]\n\n if (isLong) {\n if (newLow <= sar) {\n isLong = false\n sar = ep\n\n if (sar < prevHigh) {\n sar = prevHigh\n }\n if (sar < newHigh) {\n sar = newHigh\n }\n\n sarToDraw = sar\n\n af = this.attrs.step\n ep = newLow\n\n sar = sar + af * (ep - sar)\n\n if (sar < prevHigh) {\n sar = prevHigh\n }\n if (sar < newHigh) {\n sar = newHigh\n }\n } else {\n sarToDraw = sar\n\n if (newHigh > ep) {\n ep = newHigh\n af += this.attrs.step\n if (af > this.attrs.maxStep) {\n af = this.attrs.maxStep\n }\n }\n\n sar = sar + af * (ep - sar)\n\n if (sar > prevLow) {\n sar = prevLow\n }\n if (sar > newLow) {\n sar = newLow\n }\n }\n } else {\n if (newHigh >= sar) {\n isLong = true\n sar = ep\n\n if (sar > prevLow) {\n sar = prevLow\n }\n if (sar > newLow) {\n sar = newLow\n }\n\n sarToDraw = sar\n\n af = this.attrs.step\n ep = newHigh\n\n sar = sar + af * (ep - sar)\n\n if (sar > prevLow) {\n sar = prevLow\n }\n if (sar > newLow) {\n sar = newLow\n }\n } else {\n sarToDraw = sar\n\n if (newLow < ep) {\n ep = newLow\n af += this.attrs.step\n if (af > this.attrs.maxStep) {\n af = this.attrs.maxStep\n }\n }\n\n sar = sar + af * (ep - sar)\n\n if (sar < prevHigh) {\n sar = prevHigh\n }\n if (sar < newHigh) {\n sar = newHigh\n }\n }\n }\n\n const x = Math.round(this.fx(i) - 1.5)\n const y = Math.round(this.fy(sarToDraw) - 1.5)\n context.set('fillStyle', isLong ? this.attrs.risingColor : this.attrs.fallingColor)\n context.fillRect(x, y, 3, 3)\n }\n }\n\n getModalConfig() {\n const step = {\n type: 'number',\n step: 0.01,\n min: 0.01,\n max: 999,\n label: 'Step',\n name: 'step',\n value: this.attrs.step ?? 0.02,\n required: true,\n }\n const maxStep = {\n type: 'number',\n step: 0.01,\n min: 0.01,\n max: 999,\n label: 'Maximum Step',\n name: 'maxStep',\n value: this.attrs.maxStep ?? 0.2,\n required: true,\n }\n const risingColor = {\n type: 'color',\n label: 'Rising Color',\n name: 'risingColor',\n value: this.attrs.risingColor ?? this.getFreeColor(),\n customizable: false,\n }\n const fallingColor = {\n type: 'color',\n label: 'Falling Color',\n name: 'fallingColor',\n value: this.attrs.fallingColor ?? this.getFreeColor(),\n customizable: false,\n }\n\n return {\n title: this.label,\n inputs: [step, maxStep, risingColor, fallingColor],\n inputsErrorMessages: {\n step: `${step.label} must be a number between ${step.min} and ${step.max}`,\n maxStep: `${maxStep.label} must be a number between ${maxStep.min} and ${maxStep.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'step':\n case 'maxStep': {\n return this.getIsNumberInputValid({ key, integerOnly: false })\n }\n case 'risingColor':\n case 'fallingColor':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.risingColor\n }\n\n toString() {\n return `SAR ${this.attrs.step},${this.attrs.maxStep}`\n }\n}\n\nSAR.prototype.defaults = {\n risingColor: '#69c1ea',\n fallingColor: '#d386df',\n}\n\nexport default SAR\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport Overlay from './overlay'\n\ninterface Attrs {\n step: number\n period: string\n maxStep: number\n risingColor: string\n color: string\n}\n\nclass SMA extends Overlay {\n static type = OverlayType.Sma\n static label = 'Simple Moving Average'\n\n static getNumOfBarsBuffer(chartConfig: RequireByKey) {\n const numOfBarsBuffer = Overlay.getNumOfBarsBuffer(chartConfig)\n return numOfBarsBuffer + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n this.attrs.period = parseInt(period, 10)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\n context.beginPath()\n context.translate(0.5, 0.5)\n context.set('lineWidth', 1)\n context.set('strokeStyle', this.attrs.color)\n let sum = 0\n for (let i = 0; i < period; i++) {\n sum += this.data.close[i]\n }\n for (let i = period; i < this.data.close.length; i++) {\n const x = this.fx(i)\n sum = sum - this.data.close[i - period] + this.data.close[i]\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n context.lineTo(x, Math.round(this.fy(sum / period)))\n }\n context.translate(-0.5, -0.5)\n context.stroke()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? 5,\n required: true,\n min: 1,\n max: 999999,\n }\n const color = {\n type: 'color',\n label: 'Color',\n name: 'color',\n value: this.attrs.color ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, color],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'color':\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\n default:\n return false\n }\n }\n\n toString() {\n return `SMA ${this.attrs.period}`\n }\n}\n\nSMA.prototype.defaults = { color: '#ffa75f' }\n\nexport default SMA\n","import { OverlayType } from '../constants/common'\nimport SMA from './sma'\n\nclass SMA2 extends SMA {\n static type = OverlayType.Sma2\n}\n\nSMA2.prototype.defaults = { color: '#ff6400' }\n\nexport default SMA2\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport AverageTrueRange from '../helpers/atr'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n multiplier: number\n uptrendColor: string\n downtrendColor: string\n}\n\nconst DEFAULT_PARAMETERS = {\n Period: 7,\n Multiplier: 3.0,\n}\n\nconst COLORS = {\n Uptrend: '#00a000',\n Downtrend: '#c80000',\n}\n\nfunction parsePeriod(periodStr: string) {\n const values = periodStr.split(',')\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\n const multiplier = parseFloat(values[1]) || DEFAULT_PARAMETERS.Multiplier\n\n return [period, multiplier]\n}\n\nclass Supertrend extends Overlay {\n static type = OverlayType.Str\n static label = 'Supertrend'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt] = parsePeriod(period)\n return periodInt + 1\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n const [periodInt, multiplier] = parsePeriod(period)\n this.attrs.period = periodInt\n this.attrs.multiplier = multiplier\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const { period, multiplier } = this.attrs\n const { high, low, close } = this.data\n const atr = new AverageTrueRange(period)\n const finalUpperBand: number[] = []\n const finalLowerBand: number[] = []\n const supertrend: boolean[] = []\n let firstBarToRender\n let lastBarToRender = 0\n\n context.translate(0.5, 0.5)\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', this.attrs.uptrendColor)\n for (let i = 1; i < close.length; i++) {\n atr.add(high[i], low[i], close[i - 1])\n\n // compute bands\n const avg = (high[i] + low[i]) / 2\n const upperBand = avg + multiplier * atr.value\n const lowerBand = avg - multiplier * atr.value\n\n finalUpperBand[i] = upperBand\n finalLowerBand[i] = lowerBand\n\n // identify supertrend\n if (close[i] > finalUpperBand[i - 1]) {\n supertrend[i] = true\n } else if (close[i] < finalLowerBand[i - 1]) {\n supertrend[i] = false\n } else {\n supertrend[i] = supertrend[i - 1]\n }\n\n // adjust bands\n if (supertrend[i] && finalLowerBand[i] < finalLowerBand[i - 1]) {\n finalLowerBand[i] = finalLowerBand[i - 1]\n }\n if (!supertrend[i] && finalUpperBand[i] > finalUpperBand[i - 1]) {\n finalUpperBand[i] = finalUpperBand[i - 1]\n }\n\n const x = this.fx(i)\n if (i < period || x + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n if (firstBarToRender === undefined) firstBarToRender = i\n\n if (supertrend[i] && !supertrend[i - 1]) {\n // buy\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalUpperBand[i - 1])))\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\n } else if (supertrend[i]) {\n // keep buying\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\n } else {\n // keep selling\n context.moveTo(x, Math.round(this.fy(finalLowerBand[i])))\n }\n lastBarToRender = i\n }\n context.stroke()\n\n if (firstBarToRender === undefined) {\n context.translate(-0.5, -0.5)\n return\n }\n\n context.beginPath()\n context.set('strokeStyle', this.attrs.downtrendColor)\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n if (!supertrend[i] && supertrend[i - 1]) {\n // sell\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalLowerBand[i - 1])))\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\n } else if (!supertrend[i]) {\n // keep selling\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\n } else {\n // keep buying\n context.moveTo(x, Math.round(this.fy(finalUpperBand[i])))\n }\n }\n context.stroke()\n\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\n required: true,\n min: 1,\n max: 999999,\n }\n const multiplier = {\n type: 'number',\n label: 'Period',\n name: 'multiplier',\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.Multiplier,\n required: true,\n step: 0.1,\n min: 0.0,\n max: 999,\n }\n\n const uptrendColor = {\n type: 'color',\n label: 'Uptrend Color',\n name: 'uptrendColor',\n value: this.attrs.uptrendColor ?? this.getFreeColor(),\n }\n const downtrendColor = {\n type: 'color',\n label: 'Downtrend Color',\n name: 'downtrendColor',\n value: this.attrs.downtrendColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, multiplier, uptrendColor, downtrendColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'multiplier':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n case 'uptrendColor':\n case 'downtrendColor':\n return true\n default:\n return false\n }\n }\n\n getLabelColor(): string {\n return this.attrs.uptrendColor\n }\n\n toString() {\n return `Supertrend ${this.attrs.period},${this.attrs.multiplier}`\n }\n}\n\nSupertrend.prototype.defaults = {\n uptrendColor: COLORS.Uptrend,\n downtrendColor: COLORS.Downtrend,\n}\n\nexport default Supertrend\n","import * as d3 from 'd3'\n\nimport { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport Chart from '../models/chart'\nimport utils from '../utils'\nimport { convertColorToHEX, getHEXWithSpecificAplha } from '../utils/colors'\nimport { getFirstBarToRenderIndex, getLastBarToRenderIndex } from '../utils/draw_in_visible_area'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Overlay from './overlay'\n\nconst VP_COLORS = {\n UP: '#00FF00',\n DOWN: '#FF0000',\n}\n\nconst DEFAULT_PARAMETERS = {\n Period: 20,\n Opacity: 0.3,\n}\n\ninterface Attrs {\n period: number | string\n opacity: number\n upColor?: string\n downColor?: string\n}\n\nfunction applyOpacityToColor(color: string, opacity: number) {\n return getHEXWithSpecificAplha(convertColorToHEX(color), opacity)\n}\n\nfunction getColorsWithAppliedOpacity(attrs: Attrs) {\n return [\n applyOpacityToColor(attrs.upColor ?? VP_COLORS.UP, attrs.opacity),\n applyOpacityToColor(attrs.downColor ?? VP_COLORS.DOWN, attrs.opacity),\n ]\n}\n\n// Only time when we want value to be able to equal start of segment is first segment,\n// because start of next segment is equal to end of previous and value would match two segments\nfunction isInSegment(val: number, start: number, end: number, notEqualStart: boolean) {\n return (notEqualStart ? val > start : val >= start) && val <= end\n}\n\nfunction parsePeriod(periodStr: string) {\n const values = periodStr.split(',')\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\n const opacity = parseFloat(values[1]) || DEFAULT_PARAMETERS.Opacity\n\n return [period, opacity]\n}\n\nclass VolumeProfile extends Overlay {\n static type = OverlayType.Vp\n static label = 'Volume Profile'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n const [periodInt, opacity] = parsePeriod(period)\n this.attrs.period = periodInt\n this.attrs.opacity = opacity\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n if (typeof this.attrs.period !== 'number') {\n return\n }\n super.renderContent()\n\n const chartModel = this.model.chart() as Chart\n const { leftOffset, width } = chartModel\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\n const chartWidth = width - left.width - right.width\n\n if (this.data.close.length === 0) return\n\n const firstBarToRender = getFirstBarToRenderIndex({\n quote: this.data,\n scale: this.model.scale,\n leftOffset,\n })\n\n const lastBarToRender = getLastBarToRenderIndex({\n quote: this.data,\n scale: this.model.scale,\n leftOffset,\n chartWidth,\n })\n\n const [upColor, downColor] = getColorsWithAppliedOpacity(this.attrs)\n const [minClose, maxClose] = utils.minMax(this.data.close.slice(firstBarToRender, lastBarToRender + 1))\n\n const segment = Math.abs(maxClose - minClose) / this.attrs.period\n const segments = [] // create an empty array to hold the segments\n\n for (let i = 0; i < this.attrs.period; i++) {\n const segmentStart = minClose + segment * i // calculate start of current segment\n const segmentEnd = segmentStart + segment // calculate end of current segment\n segments.push({ start: segmentStart, end: segmentEnd, up: 0, down: 0 }) // add segment to array\n }\n\n // loop through visible bars and assign volumes to segments\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const segmentIndex: number = segments.findIndex((item, segmentIndex) =>\n isInSegment(this.data.close[i], item.start, item.end, !!segmentIndex)\n )\n if (segmentIndex === -1) continue\n const volumeTrend = this.data.close[i] < this.data.open[i] ? 'down' : 'up'\n segments[segmentIndex][volumeTrend] += this.data.volume[i]\n }\n\n const max = utils.max(segments.map((item) => item.up + item.down))\n const rangeMax = chartWidth * 0.4 // maximum range in pixels where longest bar would reach (now it's 40% of chart width)\n const volumeFX = d3.scaleLinear().range([0, rangeMax]).domain([0, max])\n\n segments.forEach((item) => {\n const y = Math.round(this.fy(item.start))\n const segmentHeightRaw = Math.round(this.fy(item.end)) - y // raw segment height without gap between segments\n const segmentHeight = segmentHeightRaw + (Math.abs(segmentHeightRaw) > 5 ? 2 : 1) // apply gap to segment based on how high segment is\n const x = Math.abs(leftOffset) // segments are alligned to left side of chart which equal to absoulute value of leftOffset\n const upSegmentWidth = Math.round(volumeFX(item.up))\n const downSegmentWidth = Math.round(volumeFX(item.down))\n\n context.fillStyle = upColor\n context.fillRect(x, y, upSegmentWidth, segmentHeight)\n context.fillStyle = downColor\n context.fillRect(x + upSegmentWidth, y, downSegmentWidth, segmentHeight)\n })\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Zones',\n name: 'period',\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\n required: true,\n min: 1,\n max: 999999,\n }\n const opacity = {\n type: 'number',\n label: 'Opacity',\n name: 'opacity',\n value: this.attrs.opacity ?? DEFAULT_PARAMETERS.Opacity,\n required: true,\n min: 0,\n max: 1,\n step: 0.1,\n }\n const upColor = {\n type: 'color',\n label: 'Up Color',\n name: 'upColor',\n value: this.attrs.upColor ?? VP_COLORS.UP,\n }\n const downColor = {\n type: 'color',\n label: 'Down Color',\n name: 'downColor',\n value: this.attrs.downColor ?? VP_COLORS.DOWN,\n }\n\n return {\n title: this.label,\n inputs: [period, opacity, upColor, downColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n opacity: `${opacity.label} must be a number between ${opacity.min} and ${opacity.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'opacity':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n case 'upColor':\n case 'downColor':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.upColor || VP_COLORS.UP\n }\n\n toString() {\n return `VP ${this.attrs.period}`\n }\n}\n\nVolumeProfile.prototype.defaults = { upColor: VP_COLORS.UP, downColor: VP_COLORS.DOWN }\n\nexport default VolumeProfile\n","import { OverlayType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport { dateFromUnixTimestamp } from '../utils'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n color: string\n}\n\nconst datesAreOnSameDay = (first: Date, second: Date) =>\n first.getFullYear() === second.getFullYear() &&\n first.getMonth() === second.getMonth() &&\n first.getDate() === second.getDate()\n\nclass VWAP extends Overlay {\n static type = OverlayType.Vwap\n static label = 'VWAP (intraday charts)'\n\n static getNumOfBarsBuffer() {\n return 1\n }\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.attrs.period = 5\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n if (!this.isRendered()) {\n return\n }\n\n const { leftOffset, width } = this.model.chart()\n context.translate(0.5, 0.5)\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', this.attrs.color)\n\n let cumulativePV = 0\n let cumulativeVolume = 0\n for (let i = 0; i < this.data.close.length; i++) {\n if (i > 0) {\n const prevDate = dateFromUnixTimestamp(this.data.date[i - 1])\n const date = dateFromUnixTimestamp(this.data.date[i])\n if (!datesAreOnSameDay(prevDate, date)) {\n cumulativePV = 0\n cumulativeVolume = 0\n }\n }\n\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\n const pv = typicalPrice * this.data.volume[i]\n\n cumulativePV += pv\n cumulativeVolume += this.data.volume[i]\n\n const vwap = cumulativePV / cumulativeVolume\n\n const x = this.fx(i)\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n const y = Math.round(this.fy(vwap))\n context.lineTo(x, y)\n }\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const color = {\n type: 'color',\n label: 'Color',\n name: 'color',\n value: this.attrs.color ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [color],\n inputsErrorMessages: {},\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'color':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n isRendered() {\n return this.model.chart().quote().isIntraday\n }\n\n isRenderedOverlaysLabel() {\n return this.isRendered()\n }\n\n toString() {\n return `VWAP`\n }\n}\n\nVWAP.prototype.defaults = { color: '#9467bd' }\n\nexport default VWAP\n","import { OverlayType } from '../constants/common'\nimport bb from './bb'\nimport dch from './dch'\nimport ema from './ema'\nimport ema2 from './ema2'\nimport hilo from './hilo'\nimport hline from './hline'\nimport ic from './ic'\nimport icf from './icf'\nimport kch from './kch'\nimport none from './none'\nimport overlay from './overlay'\nimport patterns from './patterns'\nimport sar from './sar'\nimport sma from './sma'\nimport sma2 from './sma2'\nimport str from './str'\nimport vp from './vp'\nimport vwap from './vwap'\n\nexport const overlaysByType = Object.freeze({\n [OverlayType.Overlay]: overlay,\n [OverlayType.None]: none,\n [OverlayType.Bb]: bb,\n [OverlayType.Dch]: dch,\n [OverlayType.Ema]: ema,\n [OverlayType.Ema2]: ema2,\n [OverlayType.Hilo]: hilo,\n [OverlayType.Hline]: hline,\n [OverlayType.Ic]: ic,\n [OverlayType.Icf]: icf,\n [OverlayType.Kch]: kch,\n [OverlayType.Patterns]: patterns,\n [OverlayType.Sar]: sar,\n [OverlayType.Sma]: sma,\n [OverlayType.Sma2]: sma2,\n [OverlayType.Str]: str,\n [OverlayType.Vp]: vp,\n [OverlayType.Vwap]: vwap,\n})\n","import {\n MOBILE_VIEW_BREAKPOINT_WIDTH,\n PREMARKET_AFTERMARKET_HOURS,\n SpecificChartFunctionality,\n} from './constants/common'\nimport { captureException, getIsSSr } from './utils/helpers'\n\nfunction getIsDstInNy(date: Date) {\n const dayNumber = date.getDate()\n const monthIndex = date.getMonth()\n const dayOfWeek = date.getDay()\n const previousSunday = dayNumber - dayOfWeek\n if (monthIndex < 2 || monthIndex > 10) {\n return false\n }\n if (monthIndex > 2 && monthIndex < 10) {\n return true\n }\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\n}\n\nclass Utils {\n static min(...args: T[]): number {\n if (typeof args[0] === 'number') {\n return args[0] < +args[1] ? args[0] : (args[1] as number)\n }\n let min = args[0][0]\n for (const arg of args) {\n for (const el of arg as number[]) {\n if (el < min) {\n min = el\n }\n }\n }\n return min\n }\n\n static max(...args: T[]): number {\n if (typeof args[0] === 'number') {\n return args[0] > +args[1] ? args[0] : (args[1] as number)\n }\n let max = args[0][0]\n for (const arg of args) {\n for (const el of arg as number[]) {\n if (el > max) {\n max = el\n }\n }\n }\n return max\n }\n\n static minMax(...args: number[][]) {\n let max\n let min = (max = args[0][0] as number)\n for (const arg of args) {\n for (const el of arg) {\n if (el < min) {\n min = el\n }\n if (el > max) {\n max = el\n }\n }\n }\n return [min, max]\n }\n\n static getScaleRatio() {\n return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\n }\n\n static setSizeOnCanvasElement({\n canvasElement,\n width,\n height,\n ratio = Utils.getScaleRatio(),\n }: {\n canvasElement: HTMLCanvasElement | null\n width: number\n height: number\n ratio?: number\n }) {\n if (canvasElement) {\n canvasElement.width = width * ratio\n canvasElement.height = height * ratio\n canvasElement.style.width = width + 'px'\n canvasElement.style.height = height + 'px'\n }\n }\n\n static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\n const date = referenceDate || new Date()\n const dateAsNY = new Date(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours() - 5,\n date.getUTCMinutes(),\n date.getUTCSeconds()\n )\n const isDst = getIsDstInNy(dateAsNY)\n return (isDst ? 4 : 5) * 60 * 60\n }\n\n static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\n const date = new Date(referenceDate)\n const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\n const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\n const offsetDirectionCoefficient = addOffset ? 1 : -1\n date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\n return date\n }\n\n // Keep in sync with the clone in Website repo in shared/isStockFastRefreshAvailable.ts\n static isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\n const MARKET_START = { hours: 9, minutes: 30 }\n const MARKET_END = { hours: 16, minutes: 0 }\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\n\n const date = convertLocalToNyTime(new Date(), true)\n const dayOfWeek = date.getDay()\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\n\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\n\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\n return !isWeekend && isOpen && !isClosed\n }\n\n static dateFromUnixTimestamp(timestamp: number) {\n /*\n * Passing 0 as a param is needed in order to setUTCSeconds work properly.\n * The function adds seconds to the date instance if it exceeds 60.\n * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\n * */\n const date = new Date(0)\n date.setUTCSeconds(timestamp)\n return Utils.convertLocalToNyTime(date, true)\n }\n\n static dateStringFromDate(date: Date) {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\n 2,\n '0'\n )}`\n }\n\n static dateFromDateString(dateString: string) {\n const [yyyy, mm, dd] = dateString.split('-')\n\n const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\n if (Number.isNaN(date.getTime())) {\n captureException(new Error('Invalid Date'), { extra: { date } })\n }\n\n return date\n }\n\n static isMobile(testTouchPoints?: boolean) {\n if (getIsSSr()) return false\n let isMobileOs = false\n\n // New iOS versions no longer report iPad in user agent\n if (navigator.userAgent.indexOf('Macintosh') > -1) {\n try {\n document.createEvent('TouchEvent')\n isMobileOs = true\n } catch (e) {}\n } else {\n isMobileOs = !!navigator.userAgent.match(\n /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\n )\n }\n\n if (testTouchPoints) {\n try {\n return (\n isMobileOs &&\n (window.navigator.msMaxTouchPoints ||\n window.navigator.maxTouchPoints ||\n 'ontouchstart' in document.createElement('div'))\n )\n } catch (e) {}\n }\n\n return isMobileOs\n }\n\n static isIPad() {\n const matchesIPad = navigator.userAgent.match(/iPad/i)\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\n const matchesIPod = navigator.userAgent.match(/iPod/i)\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\n\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\n }\n\n static getCookie(name: string) {\n const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\n return document.cookie.replace(re, '$1')\n }\n\n static setCookie(name: string, value: string, expires: Date) {\n let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\n if (document.location.hostname !== 'localhost') {\n cookie += '; domain=.finviz.com'\n }\n document.cookie = cookie\n }\n}\n\nexport default Utils\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\nexport const dateStringFromDate = Utils.dateStringFromDate\nexport const dateFromDateString = Utils.dateFromDateString\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const getSanitizedTicker = (...args) => window.FLibs.getSanitizedTicker(...args)\n\nexport function getFullscreenStatus(): boolean {\n return (\n document.fullscreenElement ??\n document.webkitFullscreenElement ??\n document.mozFullScreenElement ??\n document.msFullscreenElement ??\n false\n )\n}\n\nexport function getRequestFullscreen(element: HTMLElement) {\n return (\n element.requestFullscreen ??\n element.webkitRequestFullScreen ??\n element.mozRequestFullScreen ??\n element.msRequestFullscreen\n )\n}\n\nexport function getExitFullscreen() {\n return (\n document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\n )\n}\n\nexport function ready(fn: () => void) {\n if (document.readyState !== 'loading') {\n fn()\n return\n }\n\n document.addEventListener('DOMContentLoaded', fn)\n}\n\nexport function getChartsDimensions(chartElementId: string) {\n const PADDING = 2 // Border widths\n const containerElement = document.getElementById(chartElementId)\n\n const box = containerElement?.getBoundingClientRect()\n\n return {\n width: Math.max((box?.width ?? 0) - PADDING, 0),\n height: Math.max((box?.height ?? 0) - PADDING, 0),\n }\n}\n\nexport function getIsMobileScreenSize() {\n return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\n}\n\nexport function getIsMobilePortrait(isMobile?: boolean) {\n if (isMobile ?? Utils.isMobile()) {\n return window.orientation % 180 === 0\n }\n return false\n}\n\nexport function numberToStringWithUnitsSuffix(value: number) {\n let suffix = ''\n if (value >= 1000000000) {\n value /= 1000000000\n suffix = 'B'\n } else if (value >= 1000000) {\n value /= 1000000\n suffix = 'M'\n } else if (value >= 1000) {\n value /= 1000\n suffix = 'K'\n }\n\n return value.toFixed(2) + suffix\n}\n\nexport function isRedesignEnabled() {\n return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\n}\n\nexport function isRedesignedPage(\n obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\n matchingPages = [\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.cryptoPage,\n ]\n) {\n return (\n (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\n // Legacy design on quote uses redesigned elements (page header + chart controls)\n obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\n )\n}\n","import { ObjectHash } from '../../types/shared'\n\nconst requestsAbortControllersCache: ObjectHash = {}\n\nexport function removeFromAbortCache(key: string) {\n delete requestsAbortControllersCache[key]\n}\n\nexport function abortRequest(key: string) {\n requestsAbortControllersCache[key]?.abort()\n removeFromAbortCache(key)\n}\n\nexport function getIsAbortError(error: Error) {\n return error.name === 'AbortError'\n}\n\nexport function createRequestAbortController({\n key,\n shouldAbortRunningRequest = false,\n}: {\n key: string\n shouldAbortRunningRequest?: boolean\n}) {\n if (shouldAbortRunningRequest) {\n abortRequest(key)\n }\n const controller = 'AbortController' in window ? new AbortController() : undefined\n if (controller) {\n requestsAbortControllersCache[key] = controller\n }\n return controller\n}\n","import * as React from 'react'\n\nimport { Notification, Paragraph, useNotification } from '../components'\nimport { captureException } from './helpers'\nimport { useIsMounted } from './use-is-mounted'\n\nconst cache: any = {}\nconst errorsCache: any = {}\n\nconst NUM_OF_RETRIES = 3\n\nenum ErrorSeverity {\n medium,\n high,\n}\n\nfunction importWithRetry(importFn: () => Promise, retries = 0) {\n const result = importFn().catch(async (err) => {\n if (retries > NUM_OF_RETRIES) {\n throw err\n }\n\n await new Promise((r) => setTimeout(r, 1000 * retries))\n\n return importWithRetry(importFn, retries + 1)\n }) as Promise\n\n return result\n}\n\n/**\n * Hook used to asynchronously load a module\n *\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#useasyncmodule)\n */\nexport function useAsyncModule({\n importFn,\n onError,\n errorSeverity,\n cacheKey,\n shouldLoadModule = false,\n isSuspenseMode = false as SuspenseMode,\n}: {\n importFn: () => Promise\n onError?: () => void\n cacheKey: string\n errorSeverity?: keyof typeof ErrorSeverity\n shouldLoadModule?: boolean\n isSuspenseMode?: SuspenseMode\n}) {\n const notificationContext = useNotification()\n const [isLoading, setIsLoading] = React.useState(false)\n const [isError, setIsError] = React.useState(false)\n const getIsMounted = useIsMounted()\n\n const handleError = () => {\n onError?.()\n setIsError(true)\n\n if (errorSeverity === undefined) {\n return\n }\n\n if (ErrorSeverity[errorSeverity] === ErrorSeverity.high) {\n window.handleScriptNotLoaded()\n window.renderScriptNotLoaded()\n }\n\n if (ErrorSeverity[errorSeverity] === ErrorSeverity.medium) {\n notificationContext.show(\n \n \n One or more of the required application components couldn’t be loaded.
Please try to repeat the\n action or{' '}\n window.location.reload()}>\n refresh the page\n {' '}\n if the problem persists.\n
\n
\n )\n }\n }\n\n const loadModule = async () => {\n if (cache[cacheKey]) {\n return cache[cacheKey]\n }\n\n setIsLoading(true)\n\n try {\n cache[cacheKey] = await importWithRetry(importFn)\n } catch (error) {\n captureException(error as Error)\n handleError()\n } finally {\n if (getIsMounted()) {\n setIsLoading(false)\n }\n }\n\n return cache[cacheKey]\n }\n\n React.useEffect(() => {\n if (shouldLoadModule) {\n loadModule()\n }\n // We want to run it only on shouldLoadModule change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shouldLoadModule])\n\n const cachedModule = cache[cacheKey]\n if (isSuspenseMode) {\n if (errorsCache[cacheKey]) throw errorsCache[cacheKey]\n if (!cachedModule) {\n throw importFn()\n .then((mod) => (cache[cacheKey] = mod))\n .catch((err) => {\n handleError()\n errorsCache[cacheKey] = err\n })\n }\n }\n\n return [cachedModule ?? null, { isLoading, loadModule, isError }] as [\n SuspenseMode extends true ? T : T | null,\n { isLoading: boolean; loadModule: () => Promise; isError: boolean },\n ]\n}\n\n/**\n * HOC which wraps component in React.Suspense\n *\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#withsuspense)\n */\nexport function withSuspense

>(\n Component: React.ComponentType

,\n fallback: React.ReactNode = null\n) {\n return function WrappedComponent(props: P) {\n return (\n \n \n \n )\n }\n}\n","import * as dateFns from 'date-fns'\n\nimport { ChartConfigChartPane, Instrument, ObjectHash } from '../../types/shared'\nimport Line from '../canvas/line'\nimport Text from '../canvas/text'\nimport { chartsByType } from '../charts/charts'\nimport {\n CRYPTOS,\n ChartEditorEnum,\n ChartElementType,\n OFFSET,\n PADDING,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n TIMEFRAME_SECONDS,\n TextBaseline,\n} from '../constants/common'\nimport { getPercentageFromValue } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport ChartLayoutModel from '../models/chart_layout'\nimport { IChartSettings } from '../models/chart_settings/interfaces'\nimport { Mouse } from '../models/mouse'\nimport Pane from '../models/pane'\nimport Quote, { QuoteGetParams } from '../models/quote'\nimport { getChartLayoutSettings } from '../models/settings'\nimport Utils, { dateFromUnixTimestamp } from '../utils'\nimport { FetchFunc } from './fetch_api'\nimport { captureException } from './helpers'\n\nconst DAY_IN_SECONDS = 86400\nconst TWO_MIN_IN_MS = 2 * 60 * 1000\nconst virtualDatesCache: ObjectHash<{\n fromSeconds: number\n toSeconds: number\n lastUsed: number\n virtualDates: number[]\n}> = {}\n\n// The reason to use this func instead of dateFns.isSameDay is performance as this is way faster\nfunction areTimestampsFromSameDay({ ts1, ts2 }: { ts1: number; ts2: number }) {\n const ts1Utc = ts1\n const ts2Utc = ts2\n return Math.floor(ts1Utc / DAY_IN_SECONDS) === Math.floor(ts2Utc / DAY_IN_SECONDS)\n}\n\nfunction getVirtualDatesCacheId({\n idRevision,\n ticker,\n timeframe,\n}: {\n idRevision: number\n ticker: string\n timeframe: string\n}) {\n return `${ticker}-${timeframe}-${idRevision}`\n}\n\nfunction getCachedVirtualDates({\n idRevision,\n ticker,\n timeframe,\n fromSeconds,\n toSeconds,\n}: {\n idRevision: number\n ticker: string\n timeframe: string\n fromSeconds: number\n toSeconds: number\n}) {\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\n const cache = virtualDatesCache[id]\n if (cache?.fromSeconds <= fromSeconds && cache?.toSeconds >= toSeconds) {\n cache.lastUsed = Date.now()\n if (cache.fromSeconds === fromSeconds && cache.toSeconds === toSeconds) {\n return cache.virtualDates\n }\n return cache.virtualDates.filter(\n (virtualDateSeconds) => virtualDateSeconds >= fromSeconds && virtualDateSeconds <= toSeconds\n )\n }\n return null\n}\n\nfunction checkVirtualCacheSize() {\n const now = Date.now()\n Object.keys(virtualDatesCache).forEach((virtualDatesCacheId) => {\n if (virtualDatesCache[virtualDatesCacheId].lastUsed < now - TWO_MIN_IN_MS) {\n delete virtualDatesCache[virtualDatesCacheId]\n }\n })\n}\n\nfunction setCachedVirtualDates({\n idRevision,\n ticker,\n timeframe,\n fromSeconds,\n toSeconds,\n virtualDates,\n}: {\n idRevision: number\n ticker: string\n timeframe: string\n fromSeconds: number\n toSeconds: number\n virtualDates: number[]\n}) {\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\n checkVirtualCacheSize()\n virtualDatesCache[id] = {\n fromSeconds,\n toSeconds,\n virtualDates,\n lastUsed: Date.now(),\n }\n}\n\nconst MAX_BAR_BORDER_WIDTH = 1\nconst MIN_BAR_MARGIN_WIDTH = 0\nconst MAX_BAR_MARGIN_WIDTH = 16\n\nexport function getBarWidthWithMarginByParts({\n zoomFactor = 1,\n chartLayout,\n}: {\n zoomFactor?: number\n chartLayout: ChartLayoutModel\n}) {\n const { ChartSettings } = chartLayout.settings\n const settingsCenter = ChartSettings.center\n const barMargin =\n zoomFactor > 1 && settingsCenter.barMargin === 0\n ? Math.min(settingsCenter.barWidth, 1 - 1 / zoomFactor)\n : settingsCenter.barMargin\n\n const barFillWidth = settingsCenter.barWidth * zoomFactor\n const barBorderWidth = Math.min(settingsCenter.border * zoomFactor, MAX_BAR_BORDER_WIDTH)\n const barMarginWidth = Math.max(MIN_BAR_MARGIN_WIDTH, Math.min(barMargin * zoomFactor, MAX_BAR_MARGIN_WIDTH))\n\n return {\n barFillWidth,\n barBorderWidth,\n barMarginWidth,\n }\n}\n\nexport function getBarWidthWithMargin({\n zoomFactor = 1,\n chartLayout,\n shouldRound = true,\n}: {\n zoomFactor?: number\n chartLayout: ChartLayoutModel\n shouldRound?: boolean\n}) {\n const { barFillWidth, barBorderWidth, barMarginWidth } = getBarWidthWithMarginByParts({ zoomFactor, chartLayout })\n\n const barWidth = barFillWidth + barBorderWidth * 2 + barMarginWidth\n if (!shouldRound) {\n return barWidth\n }\n const roundDecimalPlaces = barWidth > 100 ? 10 : 10000\n return Math.round(barWidth * roundDecimalPlaces) / roundDecimalPlaces\n}\n\nconst DEFAULT_ZOOM_GUESS_INCREMENT = 0.001\n\nconst zoomFactorForBarsToDisplayCache: ObjectHash = {}\nconst zoomFactorForBarsToDisplayCacheKeys: string[] = []\nconst NUMBER_OF_CACHED_ZOOM_FACTORS = 10\nconst getZoomFactorFromCache = (key: string) => zoomFactorForBarsToDisplayCache[key] ?? null\nconst setZoomFactorToCache = (key: string, value: number) => {\n if (!zoomFactorForBarsToDisplayCacheKeys.includes(key)) {\n zoomFactorForBarsToDisplayCacheKeys.unshift(key)\n if (zoomFactorForBarsToDisplayCacheKeys.length > NUMBER_OF_CACHED_ZOOM_FACTORS) {\n const poppedKey = zoomFactorForBarsToDisplayCacheKeys.pop()\n if (poppedKey) {\n delete zoomFactorForBarsToDisplayCache[poppedKey]\n }\n }\n }\n\n zoomFactorForBarsToDisplayCache[key] = value\n}\n\nexport function getZoomFactorForBarsToDisplay({\n chartVisibleWidth,\n numOfVisibleBars,\n chartLayout,\n}: {\n chartVisibleWidth: number\n numOfVisibleBars: number\n chartLayout: ChartLayoutModel\n}) {\n const defaultBarWidthWithMargin = getBarWidthWithMargin({ chartLayout })\n const barWidthWithMargin = chartVisibleWidth / numOfVisibleBars\n const cacheKey = `${defaultBarWidthWithMargin}-${barWidthWithMargin}`\n let zoomIncrement = 0\n let currentZoomFactor = 1\n let finalZoomFactor = getZoomFactorFromCache(cacheKey)\n let iteration = 0\n if (barWidthWithMargin <= defaultBarWidthWithMargin) {\n finalZoomFactor = barWidthWithMargin / defaultBarWidthWithMargin\n }\n while (finalZoomFactor === null) {\n iteration += 1\n const threshold = 0.01\n currentZoomFactor += zoomIncrement\n const barWidth = getBarWidthWithMargin({ zoomFactor: currentZoomFactor, chartLayout, shouldRound: false })\n const barWidthDiff = barWidthWithMargin - barWidth\n if (barWidthDiff > threshold) {\n zoomIncrement = zoomIncrement > 0 ? zoomIncrement * 2 : DEFAULT_ZOOM_GUESS_INCREMENT\n } else if (barWidthDiff < -threshold) {\n zoomIncrement = zoomIncrement < 0 ? zoomIncrement * 2 : -DEFAULT_ZOOM_GUESS_INCREMENT\n } else {\n finalZoomFactor = currentZoomFactor\n }\n\n if (iteration === 1000) {\n captureException(new Error('Invalid zoom factor from getZoomFactorForBarsToDisplay'), {\n extra: {\n iteration,\n zoomIncrement,\n barWidthWithMargin,\n barWidth,\n barWidthDiff,\n currentZoomFactor,\n chartLayout: chartLayout.toConfig(['colors', 'panes']),\n },\n })\n return currentZoomFactor\n }\n }\n\n setZoomFactorToCache(cacheKey, finalZoomFactor)\n\n return finalZoomFactor\n}\n\nexport function getTimeframeSeconds({\n lowerIndex,\n dates,\n timeframe,\n}: {\n lowerIndex: number\n dates: number[]\n timeframe: TIMEFRAME\n}) {\n const upperIndex = lowerIndex + 1\n const areBoundsDefined = ![dates[upperIndex], dates[lowerIndex]].some((index) => index === undefined)\n return areBoundsDefined ? dates[upperIndex] - dates[lowerIndex] : TIMEFRAME_SECONDS[timeframe]\n}\n\nfunction getVirtualTradedDays({\n dateStartSeconds,\n dateEndSeconds,\n datesSeconds,\n marketStartMinutes,\n}: {\n dateStartSeconds: number\n dateEndSeconds: number\n datesSeconds: number[]\n marketStartMinutes: number\n}) {\n const dateStart = dateFromUnixTimestamp(dateStartSeconds)\n const dateEnd = dateFromUnixTimestamp(dateEndSeconds)\n const isStartBeforeDates = dateStartSeconds < datesSeconds[0]\n const isEndAfterDates = datesSeconds.length > 0 && datesSeconds[datesSeconds.length - 1] < dateEndSeconds\n const firstDate = dateFromUnixTimestamp(datesSeconds[0])\n const lastDate = dateFromUnixTimestamp(datesSeconds[datesSeconds.length - 1])\n return dateFns\n .eachDayOfInterval({\n start:\n isStartBeforeDates && (dateFns.isWeekend(dateStart) || dateStart.getMinutes() < marketStartMinutes)\n ? dateFns.addBusinessDays(dateStart, -1)\n : dateStart,\n end: isEndAfterDates ? dateFns.addBusinessDays(dateEnd, 1) : dateEnd,\n })\n .filter((date) => {\n const ts2 = date.getTime() / 1000 - date.getTimezoneOffset() * 60\n return (\n !dateFns.isWithinInterval(date, { start: dateFns.startOfDay(firstDate), end: dateFns.endOfDay(lastDate) }) ||\n datesSeconds.some((dateTime) =>\n areTimestampsFromSameDay({\n ts1: dateTime - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateTime * 1000)),\n ts2,\n })\n )\n )\n })\n}\n\nexport function getVirtualTimeframeTradedDates({\n dateStart,\n dateEnd,\n quote,\n}: {\n dateStart: number\n dateEnd: number\n quote: Quote\n}) {\n const { date: dates, ticker, timeframe, instrument, isIntraday, marketStartMinutes } = quote\n const barsInDay = quote.getBarsInDay() ?? 0\n\n // Currently we're passing first and last quote dates to dateStart / dateEnd so this is always true\n // but this function can be used on other places in the future where it will work with dates out of quote dates range\n const isWithinRangeOfQuoteDate = dateStart === dates[0] && dateEnd === dates[dates.length - 1]\n\n const commonVirtualCacheProps = {\n idRevision: dates.length,\n ticker,\n timeframe,\n fromSeconds: dateStart,\n toSeconds: dateEnd,\n }\n const cachedDates = getCachedVirtualDates(commonVirtualCacheProps)\n if (cachedDates) {\n return cachedDates\n }\n if (!isIntraday || instrument !== Instrument.Stock) {\n if (isWithinRangeOfQuoteDate) {\n return dates\n }\n const timeframeSeconds = TIMEFRAME_SECONDS[timeframe]\n const firstDate = dates[0]\n const lastDate = dates[dates.length - 1]\n const numOfDatesBefore = Math.ceil((firstDate - dateStart) / timeframeSeconds)\n const numOfDatesAfter = Math.ceil((dateEnd - lastDate) / timeframeSeconds)\n return [\n ...Array.from({ length: numOfDatesBefore })\n .map((_, index) => firstDate - (index + 1) * timeframeSeconds)\n .reverse(),\n ...dates,\n ...Array.from({ length: numOfDatesAfter }).map((_, index) => lastDate + (index + 1) * timeframeSeconds),\n ]\n }\n\n const virtualTradedDays = isWithinRangeOfQuoteDate\n ? quote.getDaysInQuote()\n : getVirtualTradedDays({\n dateStartSeconds: dateStart,\n dateEndSeconds: dateEnd,\n datesSeconds: dates,\n marketStartMinutes,\n })\n\n const marketStartSeconds = marketStartMinutes * 60\n const barTimeframeSeconds = Array.from({ length: barsInDay }).map((_, i) => i * TIMEFRAME_SECONDS[timeframe])\n const quoteDatesTimestampOffset = Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateStart * 1000))\n const virtualDates = virtualTradedDays.flatMap((date) => {\n const daySeconds =\n date.getTime() / 1000 + Utils.getQuoteDateTimestampOffsetInSeconds(date) - date.getTimezoneOffset() * 60\n const dayStartSeconds = daySeconds + marketStartSeconds\n return barTimeframeSeconds.map(\n // Hourly market starts at 9:30 but all other time ticks should be rounded down to :00 of the current hour\n (barSeconds, index) =>\n ([TIMEFRAME.h, TIMEFRAME.h2, TIMEFRAME.h4].includes(timeframe) && index > 0 ? -1800 : 0) +\n dayStartSeconds +\n barSeconds\n )\n })\n\n if (!isWithinRangeOfQuoteDate) {\n virtualDates.filter((date, index, virtualTimeframeTradedDates) => {\n const isLowerBounded =\n date >= dateStart ||\n areTimestampsFromSameDay({\n ts1: date - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(date * 1000)),\n ts2: dateStart - quoteDatesTimestampOffset,\n })\n const isOneBeforeLowerBoundStarts = dateStart > date && dateStart < virtualTimeframeTradedDates[index + 1]\n return isLowerBounded || isOneBeforeLowerBoundStarts\n })\n }\n\n setCachedVirtualDates({\n ...commonVirtualCacheProps,\n virtualDates,\n })\n\n return virtualDates\n}\n\ninterface TimestampPositionGettersProps {\n quote: Quote\n}\n\nexport function getTimestampFromPositionX({ positionX, quote }: TimestampPositionGettersProps & { positionX: number }) {\n const { date, timeframe } = quote\n const dates = getVirtualTimeframeTradedDates({\n dateStart: date[0],\n dateEnd: date[date.length - 1],\n quote,\n })\n const dateStart = dates[0]\n const dateEnd = dates[dates.length - 1]\n const lastDateIndex = dates.length - 1\n if (positionX >= 0 && positionX <= lastDateIndex) {\n const lowerIndex = Math.floor(positionX)\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex, dates, timeframe })\n return dates[lowerIndex] + (positionX - lowerIndex) * timeframeSeconds\n }\n const isLookingBack = positionX < 0\n const averageBarDate = (dateEnd - dateStart) / dates.length\n const numOfSecondsOutOfBounds = isLookingBack\n ? Math.abs(positionX) * averageBarDate\n : (positionX - lastDateIndex) * averageBarDate\n return ~~(isLookingBack ? dateStart - numOfSecondsOutOfBounds : dateEnd + numOfSecondsOutOfBounds)\n}\n\nexport function getPositionXFromTimestamp({ timestamp, quote }: TimestampPositionGettersProps & { timestamp: number }) {\n const { date, timeframe } = quote\n const dates = getVirtualTimeframeTradedDates({\n dateStart: date[0],\n dateEnd: date[date.length - 1],\n quote,\n })\n const dateStart = dates[0]\n const dateEnd = dates[dates.length - 1]\n const lastDateIndex = dates.length - 1\n if (timestamp >= dates[0] && timestamp <= dates[dates.length - 1]) {\n const upperIndex = timestamp === dateEnd ? lastDateIndex : dates.findIndex((date) => date > timestamp)\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex: upperIndex - 1, dates, timeframe })\n const positionDiffUpperTimestamp = (dates[upperIndex] - timestamp) / timeframeSeconds\n return upperIndex - positionDiffUpperTimestamp\n }\n const isLookingBack = timestamp < dateStart\n const averageBarDate = (dateEnd - dateStart) / dates.length\n return isLookingBack\n ? -((dateStart - timestamp) / averageBarDate)\n : lastDateIndex + (timestamp - dateEnd) / averageBarDate\n}\n\n// counterpart in Finviz-Website 'Finviz-Website/js/main/util.ts'\nexport function getInstrument(tickerRaw: string) {\n if (tickerRaw.indexOf('@') === 0) {\n const ticker = tickerRaw.substring(1) as keyof typeof CRYPTOS\n\n if (CRYPTOS[ticker]) {\n return Instrument.Crypto\n } else if (ticker.length === 6) {\n return Instrument.Forex\n } else {\n return Instrument.Futures\n }\n }\n return Instrument.Stock\n}\n\nexport function getPerfIndicatorTickerAndTimeframes({\n paneWithPerfIndicator,\n timeframe,\n}: {\n paneWithPerfIndicator: ChartConfigChartPane\n timeframe: TIMEFRAME\n}) {\n const { elements } = paneWithPerfIndicator\n const perfIndicatorElement = elements.find(({ type }) => type === 'indicators/perf')\n const tickers = perfIndicatorElement?.period?.split(',') ?? []\n return tickers.map((ticker) => ({\n ticker,\n instrument: getInstrument(ticker),\n timeframe,\n }))\n}\n\ninterface PrefetchPerfIndicatorAllQuotesProps extends Pick {\n paneWithPerfIndicator: ChartConfigChartPane\n fetchFunc?: FetchFunc\n chartUuid?: string\n}\n\nexport async function prefetchPerfIndicatorAllQuotes({\n paneWithPerfIndicator,\n timeframe,\n fetchFunc,\n options,\n chartUuid,\n}: PrefetchPerfIndicatorAllQuotesProps) {\n const tickersAndTimeframes = getPerfIndicatorTickerAndTimeframes({ paneWithPerfIndicator, timeframe })\n\n if (tickersAndTimeframes.length > 0) {\n const promises = tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\n Quote.get({\n ticker,\n instrument,\n timeframe,\n options,\n fetchFunc,\n chartUuid,\n })\n )\n return Promise.all(promises)\n }\n return Promise.resolve([])\n}\n\ninterface RenderCrossProps {\n context: CanvasRenderingContext2D\n mouseModel: Mouse\n paneModel: Pane\n quote: Quote\n contentWidth: number\n contentHeight: number\n onRenderCrossText?: (context: CanvasRenderingContext2D, crossIndex: number) => void\n getRoundDecimalPlaces?: (price?: number) => number | undefined\n isIndicator?: boolean\n isPerfIndicator?: boolean\n}\n\nexport function renderCross({\n context,\n mouseModel,\n paneModel,\n quote,\n contentWidth,\n contentHeight,\n onRenderCrossText,\n getRoundDecimalPlaces,\n isIndicator = false,\n isPerfIndicator = false,\n}: RenderCrossProps) {\n const crossIndex = mouseModel.getCrossIndexForPane(paneModel)\n const chartModel = paneModel.chart()\n const { ChartSettings, IndicatorSettings } = getChartLayoutSettings(chartModel.chart_layout())\n const settings = isIndicator ? IndicatorSettings : ChartSettings\n const { Colors } = ChartSettings.general\n\n if (!mouseModel.getShouldRenderCrossInPane(paneModel)) {\n return false\n }\n\n const price = mouseModel.getPriceForPane(paneModel)\n const middle = paneModel.scale.x(crossIndex) + chartModel.leftOffset\n const isXAxisInView = middle > 0 && middle <= contentWidth\n if (isXAxisInView) {\n const x = middle + settings.left.width\n new Line(\n {\n x1: x,\n x2: x,\n y1: settings.top.height,\n y2: settings.top.height + contentHeight,\n strokeStyle: Colors.cross,\n },\n paneModel\n ).render(context)\n\n onRenderCrossText?.(context, crossIndex)\n }\n\n const domainRange = paneModel.scale.y\n .domain()\n .slice()\n .sort((a, b) => a - b)\n\n if (price === null || !(domainRange[0] <= price && price <= domainRange[1])) {\n return isXAxisInView\n }\n\n const priceFy = paneModel.scale.y(price)\n const y = Math.round(priceFy + settings.top.height)\n new Line(\n {\n x1: settings.left.width,\n x2: settings.left.width + contentWidth,\n y1: y,\n y2: y,\n strokeStyle: Colors.cross,\n },\n paneModel\n ).render(context)\n const YAxisLeftMargin = quote.instrument === Instrument.Crypto && quote.lastClose <= 0.001 ? 3 : 8\n\n const getCrossText = () => {\n if (chartModel.scale === ScaleType.Percentage && !isIndicator) {\n return `${math.round({\n value: getPercentageFromValue({ number: price, base: chartModel.firstBarClose }),\n lastClose: quote.lastClose,\n instrument: quote.instrument,\n overridePlaces: 2,\n })}%`\n }\n return `${math.round({\n value: price,\n lastClose: quote.lastClose,\n instrument: quote.instrument,\n overridePlaces: getRoundDecimalPlaces?.(price) ?? (paneModel.getIsChartPane() ? undefined : 2),\n })}${isPerfIndicator ? '%' : ''}`\n }\n\n new Text(\n {\n text: getCrossText(),\n x:\n settings.left.width +\n settings.right.axis.margin.left! +\n contentWidth +\n (isIndicator ? OFFSET.S : YAxisLeftMargin - PADDING.XXS),\n padding: isIndicator\n ? Text.getMergedPropsWithDefaults('padding', IndicatorSettings.right.axis.font.padding)\n : {\n top: PADDING.XXS,\n right: PADDING.XXS,\n bottom: PADDING.XXS,\n left: PADDING.XXS,\n },\n ...{\n y,\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.crossText,\n background: Colors.crossTextBackground,\n font: Text.getMergedPropsWithDefaults('font', { ...settings.right.axis.font, style: 'bold' }),\n lineHeight: settings.right.axis.font.lineHeight,\n },\n },\n paneModel\n ).render(context)\n\n return true\n}\n\n/**\n * Set canvas width and height to 0 which fixes Safari memory problems\n *\n * @see https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\n */\nexport function unmountCanvas(canvas?: HTMLCanvasElement | null) {\n if (!canvas) return\n\n canvas.width = 0\n canvas.height = 0\n canvas.style.width = '0px'\n canvas.style.height = '0px'\n}\n\nexport function getChangeColor({ change, ChartSettings }: { change: number; ChartSettings: IChartSettings }) {\n const { Colors } = ChartSettings.general\n if (change === 0) {\n return Colors.zeroChange\n }\n return change > 0 ? Colors.positiveChange : Colors.negativeChange\n}\n\nexport function round({ data, num, overridePlaces }: { data: Quote; num: number; overridePlaces?: number }) {\n return math.round({\n value: num,\n lastClose: data.lastClose,\n instrument: data.instrument,\n overridePlaces: overridePlaces,\n })\n}\n\nexport interface ITickerChange {\n points: number\n string: string\n percentString: string\n}\ninterface ITickerChangeResult {\n tickerChange: ITickerChange | null\n tickerAfterChange: ITickerChange | null\n}\n\nexport function getTickerChangeFromCloseValues({\n anchorClose,\n prevClose,\n data,\n}: {\n anchorClose: number\n prevClose: number\n data: Quote\n}): ITickerChange {\n const changePoints = anchorClose - prevClose\n const changePercent = (anchorClose / prevClose - 1) * 100\n const changePercentString = `${round({\n data,\n num: Math.abs(changePercent),\n overridePlaces: 2,\n })}%`\n const changePointsString = `${changePoints > 0 ? '+' : ''}${round({\n data,\n num: changePoints,\n })} (${changePercentString})`\n\n return {\n points: changePoints,\n string: changePointsString,\n percentString: `${changePoints > 0 ? '+' : ''}${changePoints < 0 ? '-' : ''}${changePercentString}`,\n }\n}\nexport function getTickerChange({ data }: { data: Quote }) {\n const result: ITickerChangeResult = { tickerChange: null, tickerAfterChange: null }\n const isChange = Number.isFinite(data.prevClose) // if not new stock always present\n if (isChange) {\n result.tickerChange = getTickerChangeFromCloseValues({\n data,\n anchorClose: data.lastClose,\n prevClose: data.prevClose,\n })\n }\n\n const isAfterChange = Number.isFinite(data.afterClose) && data.afterClose !== data.lastClose\n if (isAfterChange) {\n const tickerAfterChange = getTickerChangeFromCloseValues({\n data,\n anchorClose: data.afterClose,\n prevClose: data.lastClose,\n })\n result.tickerAfterChange = {\n ...tickerAfterChange,\n string: `AH: ${tickerAfterChange.string}`,\n }\n }\n\n return result\n}\n\nexport function isForexFuturesCryptoPage(specificChartFunctionality: SpecificChartFunctionality) {\n return [\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n SpecificChartFunctionality.futuresPage,\n ].includes(specificChartFunctionality)\n}\n\nexport function getShouldUseDarkerWickColors({\n specificChartFunctionality,\n totalBarWidth,\n}: {\n specificChartFunctionality: SpecificChartFunctionality\n timeFrame?: TIMEFRAME\n totalBarWidth: number\n}) {\n const isForexFuturesCrypto = isForexFuturesCryptoPage(specificChartFunctionality)\n const isOffscreenChartWithNarrowBars =\n specificChartFunctionality === SpecificChartFunctionality.offScreen && totalBarWidth < 5\n const isQuoteChartWithNarrowBars =\n specificChartFunctionality === SpecificChartFunctionality.quotePage && totalBarWidth < 5\n\n return isForexFuturesCrypto || isOffscreenChartWithNarrowBars || isQuoteChartWithNarrowBars\n}\n\nexport const DRAWING_COOKIE_NAME = 'charts-draw'\nexport function getIsDrawingEnabled() {\n return Utils.getCookie(DRAWING_COOKIE_NAME) === 'on'\n}\n\nexport function setIsDrawingEnabled(value: boolean) {\n const expires = new Date()\n expires.setMonth(expires.getMonth() + 1)\n Utils.setCookie(DRAWING_COOKIE_NAME, value ? 'on' : 'off', expires)\n}\n\nexport function getIsSidebarEnabled(specificChartFunctionality: SpecificChartFunctionality) {\n return (\n specificChartFunctionality === SpecificChartFunctionality.chartPage && !!window.FinvizSettings.hasSidebarEnabled\n )\n}\n\nexport const handleTypeChange = ({\n type,\n chartLayoutModel,\n}: {\n type: ChartElementType\n chartLayoutModel: ChartLayoutModel\n}) => {\n const elements = chartLayoutModel.getAllElements()\n elements.forEach((element) => {\n if (element.isChart() && element.instance.attrs.type !== type) {\n const pane = element.pane()\n const instance = chartsByType[type].fromObject(\n {\n ...element.instance.attrs,\n type,\n },\n pane\n )\n element.replace(instance)\n }\n })\n}\n\nexport const getIsPreserveDrawingsAndAutosaveAvailable = (args: {\n specificChartFunctionality: SpecificChartFunctionality\n editable: boolean\n editors: ChartEditorEnum[]\n}) => {\n const { specificChartFunctionality, editable, editors } = args\n\n return (\n editable &&\n editors?.includes(ChartEditorEnum.tools) &&\n specificChartFunctionality &&\n [\n SpecificChartFunctionality.chartPage,\n SpecificChartFunctionality.quotePage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.cryptoPage,\n ].includes(specificChartFunctionality)\n )\n}\n","/**\n * Keep this file in sync with `Website/js/main/components/color-picker/util.ts` in website repo\n * */\n\nexport interface RGBA {\n r: number\n g: number\n b: number\n a: number\n}\n\nexport interface HSVA {\n h: number\n s: number\n v: number\n a: number\n}\n\nexport interface HSLA {\n h: number\n s: number\n l: number\n a: number\n}\n\n/**\n * Convert Hex string to RGBA object.\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\n *\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hexStringToRGBA(hexString: string): RGBA {\n const hexColor = removeHashSymbol(hexString)\n let r: string | number = 0\n let g: string | number = 0\n let b: string | number = 0\n let a: string | number = 255\n\n // 3 digits\n if (hexColor.length === 3 || hexColor.length === 4) {\n r = '0x' + hexColor[0] + hexColor[0]\n g = '0x' + hexColor[1] + hexColor[1]\n b = '0x' + hexColor[2] + hexColor[2]\n // Get channel if defined\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\n\n // 6 digits\n } else if (hexColor.length === 6 || hexColor.length === 8) {\n r = '0x' + hexColor[0] + hexColor[1]\n g = '0x' + hexColor[2] + hexColor[3]\n b = '0x' + hexColor[4] + hexColor[5]\n // Get channel if defined\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\n }\n\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\n}\n\n/**\n * Convert HEX string to HSVA color representation.\n *\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\n *\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\n */\nexport function hexStringToHSVA(hexString: string) {\n return rgbaToHSVA(hexStringToRGBA(hexString))\n}\n\n/**\n * Convert HEX string to HSLA color representation.\n *\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\n *\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n */\nexport function hexStringToHSLA(hexString: string) {\n return rgbaToHSLA(hexStringToRGBA(hexString))\n}\n\n/**\n * Convert alpha value to hex value\n *\n * Input: [0,1]\n *\n * Output: alpha in HEX format\n */\nexport function alphaToHex(alpha: number) {\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\n .toString(16)\n .padStart(2, '0')\n}\n\n/**\n * Convert RGBA color to HEX string.\n *\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n *\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\n */\nexport function rgbaToHexString(color: RGBA, alpha = false) {\n const r = color.r.toString(16)\n const g = color.g.toString(16)\n const b = color.b.toString(16)\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\n\n if (!alpha || color.a === 1) {\n return hexString\n }\n\n return `${hexString}${alphaToHex(color.a)}`\n}\n\n/**\n * Convert HSVA object to HEX string\n *\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\n *\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\n const rgbaColor = hsvaToRGBA(color)\n\n return rgbaToHexString(rgbaColor, alpha)\n}\n\n/**\n * Convert HSLA object to HEX string\n *\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\n *\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hslaToHexString(color: HSLA, alpha = false) {\n const rgbaColor = hslaToRGBA(color)\n\n return rgbaToHexString(rgbaColor, alpha)\n}\n\n/**\n * Convert RGBA color to HSVA\n * @see https://stackoverflow.com/a/54070620/6662683\n *\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n *\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\n */\nexport function rgbaToHSVA(color: RGBA): HSVA {\n const r = color.r / 255\n const g = color.g / 255\n const b = color.b / 255\n\n const v = Math.max(r, g, b)\n const c = v - Math.min(r, g, b)\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\n\n return {\n h: 60 * (h < 0 ? h + 6 : h),\n s: v ? c / v : 0,\n v: v,\n a: color.a,\n }\n}\n\n/**\n * Convert RGBA to HSLA\n * @see https://stackoverflow.com/a/54071699/6662683\n *\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n *\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n */\nexport function rgbaToHSLA(color: RGBA): HSLA {\n const r = color.r / 255\n const g = color.g / 255\n const b = color.b / 255\n\n const v = Math.max(r, g, b)\n const c = v - Math.min(r, g, b)\n const f = 1 - Math.abs(v + v - c - 1)\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\n\n return {\n h: 60 * (h < 0 ? h + 6 : h),\n s: f ? c / f : 0,\n l: (v + v - c) / 2,\n a: color.a,\n }\n}\n\n/**\n * Convert HSVA color to RGBA\n * @see https://stackoverflow.com/a/54024653/6662683\n *\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hsvaToRGBA(color: HSVA): RGBA {\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\n\n return {\n r: Math.round(f(5) * 255),\n g: Math.round(f(3) * 255),\n b: Math.round(f(1) * 255),\n a: Math.round(color.a * 100) / 100,\n }\n}\n\n/**\n * Convert HSLA color to RGBA\n * @see https://stackoverflow.com/a/54014428/6662683\n *\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hslaToRGBA(color: HSLA): RGBA {\n const a = color.s * Math.min(color.l, 1 - color.l)\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\n\n return {\n r: Math.round(f(0) * 255),\n g: Math.round(f(8) * 255),\n b: Math.round(f(4) * 255),\n a: color.a,\n }\n}\n\n/**\n * Convert RGBA color to rgba() string\n *\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n *\n * Output: rgba(r, g, b, a)\n */\nexport function rgbaToRGBAString(color: RGBA) {\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\n}\n\n/**\n * Convert rgba() string to RGBA color\n *\n * Input: rgba(r, g, b, a)\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function rgbaStringToObject(color: string) {\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\n return {\n r: Number.parseInt(red),\n g: Number.parseInt(green),\n b: Number.parseInt(blue),\n a: Number.parseFloat(alpha),\n }\n}\n\n/**\n * Convert HSLA color to hsla() string\n *\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n *\n * Output: hsla(h, s, l, a)\n */\nexport function hslaToHSLAString(color: HSLA) {\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\n color.a\n })`\n}\n\nexport function removeHashSymbol(strColor: string) {\n return strColor.replace(/#/g, '')\n}\n\n/**\n * Check if the param is a valid color by setting it as style\n */\nexport function isValidColor(strColor: string) {\n const isRgb = strColor.startsWith('rgba')\n const s = new Option().style\n\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\n\n return s.color !== ''\n}\n\n/**\n * Normalize color to be a hex value\n */\nexport function convertColorToHEX(strColor: string, allowAlpha = true) {\n const isRgb = getIsRgb(strColor)\n const hexColor = isRgb ? rgbaToHexString(rgbaStringToObject(strColor), allowAlpha) : strColor\n\n if (allowAlpha) {\n return hexColor\n }\n return hexColor.slice(0, 7)\n}\n\n/**\n * Returns true if color is rgb or rgba\n */\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\n const rgbKeys = ['rgb']\n if (isAlphaAllowed) {\n rgbKeys.push('rgba')\n }\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\n}\n\n/**\n * Convert any color format to HSVA (internal color picker representation)\n */\nexport function getHSVAFromColor(strColor: string) {\n if (getIsRgb(strColor)) {\n return rgbaToHSVA(rgbaStringToObject(strColor))\n }\n\n return hexStringToHSVA(strColor)\n}\n\n/**\n * Stringify HSVA color representation into a output format\n */\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\n switch (output) {\n case 'rgba':\n return rgbaToRGBAString(hsvaToRGBA(color))\n default:\n return hsvaToHEXString(color, canSelectAlpha)\n }\n}\n\n/**\n * Get luma value from RGBA color using the Rec. 709 coefficients\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\n *\n * If luma is >= 165 the foreground color should be dark\n */\nexport function getLumaFromRGBA(color: RGBA) {\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\n}\n\n/**\n * Checks if luma is >= 165 or alpha < 0.3\n */\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\n}\n\n/**\n * Set specific alpha for a hex color\n */\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\n const rgbaColor = hexStringToRGBA(color)\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\n}\n\n/**\n * Get rgba from valid color string\n */\nexport function getRGBAValueFromValidColorString(value: string) {\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\n return rgbaToRGBAString(hexStringToRGBA(value))\n}\n","// if conditionalCursor provided, cursor is set only if current cursor !== conditionalCursor\n// otherwise cursor is set if element exists\nexport const setElementCursor = ({\n elementId,\n cursor,\n conditionalCursor,\n}: {\n elementId: string\n cursor: string\n conditionalCursor?: string\n}) => {\n const element = document.getElementById(elementId)\n if (element && (conditionalCursor ? element.style.cursor !== conditionalCursor : true)) {\n element.style.cursor = cursor\n }\n}\n","/*\n * We want to be able to render only bars/parts of line that are visible to users,\n * but without introducing visual artifacts like bars missing in front of users while scrolling\n * or lines that start in middle of chart for sparse intraday stock data.\n *\n * In general we want to start rendering lines one bar sooner than what is visible to user and stop rendering\n * one bar outside of visible area to create a continuous line.\n */\nimport { ScaleAxis } from '../models/pane'\nimport type Quote from '../models/quote'\n\nexport const drawInVisibleArea = ({\n quote,\n scale,\n fxOverride,\n fromIndexOffset = 0,\n toIndexOffset = 0,\n leftOffset,\n drawBarCallback,\n width,\n}: {\n quote: Quote\n scale: { x: ScaleAxis }\n fromIndexOffset?: number\n toIndexOffset?: number\n fxOverride?: (index: number) => number\n leftOffset: number\n width: number\n drawBarCallback: (i: number, x: number) => void\n}) => {\n const fx = fxOverride ?? ((index: number) => scale.x(quote.barIndex[index]))\n // We want to render one bar before first visible bar to fix disconnected lines on charts with missing data\n const firstBarToRender = Math.max(0, getFirstBarToRenderIndex({ quote, scale, leftOffset }) - 1, fromIndexOffset - 1)\n\n let lastBarToRender = -1\n for (let i = firstBarToRender; i < quote.close.length + toIndexOffset; i++) {\n const x = fx(i)\n if (x + leftOffset > width) {\n lastBarToRender = i\n break\n }\n drawBarCallback(i, x)\n }\n\n if (lastBarToRender > -1) {\n const x = fx(lastBarToRender)\n drawBarCallback(lastBarToRender, x)\n }\n}\n\nexport const getFirstBarToRenderIndex = ({\n leftOffset,\n quote,\n scale,\n}: {\n quote: Quote\n scale: { x: ScaleAxis }\n leftOffset: number\n}) => {\n const barIndex = Math.ceil(scale.x.invert(-leftOffset))\n return quote.barToDataIndex[Math.max(barIndex, 0)]\n}\n\nexport const getLastBarToRenderIndex = ({\n leftOffset,\n quote,\n scale,\n chartWidth,\n}: {\n quote: Quote\n scale: { x: ScaleAxis }\n leftOffset: number\n chartWidth: number\n}) => {\n const { barToDataIndex } = quote\n const barIndex = Math.ceil(scale.x.invert(-leftOffset + chartWidth))\n return barToDataIndex[Math.max(barIndex, 0)] ?? barToDataIndex[barToDataIndex.length - 1]\n}\n","import queryString from 'query-string'\n\nimport { ObjectHash } from '../../types/shared'\n\nexport type FetchFunc = (input: Request | string, init?: ObjectHash) => Promise\n\ninterface FetchApiProps {\n location: string\n queryParameters?: ObjectHash\n method?: string\n body?: ObjectHash | string\n contentType?: string\n abortController?: null | AbortController\n throwOnStatusCodes?: number[]\n throwOnPredicate?: (response: Response) => boolean\n fetchFunc?: FetchFunc\n keepalive?: boolean\n}\n\nexport const getFormDataFromObject = (object: ObjectHash) =>\n Object.keys(object).reduce((formData, key) => {\n formData.append(key, object[key])\n return formData\n }, new FormData())\n\n// Keep in sync with ContentType in https://github.com/finvizhq/Finviz-Website/blob/master/Website/js/main/services/api.ts\n// START\nexport enum ContentType {\n ApplicationJson = 'application/json',\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\n FormUrlEncoded = 'application/x-www-form-urlencoded',\n Html = 'text/html; charset=utf-8',\n}\n\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\n switch (contentType) {\n case ContentType.ApplicationJson:\n case ContentType.ApplicationJsonUTF:\n case ContentType.FormUrlEncoded:\n return JSON.parse(response)\n default:\n return response\n }\n}\n// END\n\nconst fetchApi = async ({\n location,\n queryParameters,\n method,\n body,\n contentType,\n abortController,\n throwOnStatusCodes,\n throwOnPredicate,\n fetchFunc = fetch,\n keepalive = false,\n}: FetchApiProps) => {\n const url = `${location}${queryParameters ? `?${queryString.stringify(queryParameters)}` : ''}`\n const parameters = {\n method: method || 'GET',\n credentials: 'include',\n headers: contentType && {\n 'Content-Type': contentType,\n },\n signal: abortController?.signal,\n body: body,\n keepalive,\n }\n try {\n const response = await fetchFunc(url, parameters)\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\n const responseData = parseResponseForContentType(await response.text(), responseContentType)\n if (throwOnStatusCodes?.includes(response.status) || throwOnPredicate?.(response)) {\n const StatusCodeError = getStatusCodeError(response.status)\n throw new StatusCodeError(`${url} returned ${response.status}`, responseData as T, response.status)\n }\n return responseData as T\n } catch (err) {\n throw err\n }\n}\n\nfunction getStatusCodeError(statusCode: number): typeof GenericStatusCodeError {\n switch (statusCode) {\n case 403:\n return ForbiddenError\n case 404:\n return NotFoundError\n case 500:\n return InternalServerError\n default:\n return GenericStatusCodeError\n }\n}\n\nexport class GenericStatusCodeError extends Error {\n response: ObjectHash | string\n statusCode: number\n\n constructor(message: string, response: ObjectHash | string, statusCode: number) {\n super(message)\n this.response = response\n this.statusCode = statusCode\n }\n}\nexport class ForbiddenError extends GenericStatusCodeError {}\nexport class NotFoundError extends GenericStatusCodeError {}\nexport class InternalServerError extends GenericStatusCodeError {}\n\nexport default fetchApi\n","import React from 'react'\n\nexport function useForceUpdate() {\n const [forceUpdateKey, increment] = React.useState(0)\n const forceUpdate = React.useCallback(() => {\n increment((prev) => prev + 1)\n }, [])\n return { forceUpdate, forceUpdateKey }\n}\n","import { EmptyObject, ObjectHash } from '../../types/shared'\n\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\n const precision = Math.pow(10, numOfDecimalPlaces)\n return String(Math.round(number * precision) / precision)\n}\n\nexport function getIsSSr() {\n return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\n}\n\nexport function isValidHexColor(color: string) {\n const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\n return !!color && regex.test(color)\n}\n\nexport function getParsedIntegersFromPeriodString(periodString: string) {\n const periodParts = periodString.split(',')\n return periodParts.map((part) => Number.parseInt(part, 10))\n}\n\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\n if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\n console.error(exception)\n } else if (process.env.IS_OFFSCREEN_RENDERER) {\n import('@sentry/node').then((client) => {\n client.captureException(exception, captureContext)\n })\n } else {\n window.Sentry.captureException(exception, captureContext)\n }\n}\n\nexport function isPositiveFloat(value: string | number) {\n const parsedNumber = Number.parseFloat(`${value}`)\n return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\n}\n\nexport function isPositiveInteger(value: string | number) {\n const string = `${value}`\n return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\n}\n\nexport function isInRange({\n value,\n min = Number.MIN_SAFE_INTEGER,\n max = Number.MAX_SAFE_INTEGER,\n}: {\n value: string | number\n min?: number\n max?: number\n}) {\n const parsedNumber = Number.parseFloat(`${value}`)\n return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\n}\n\nexport function tryJsonParse(json: string | null = '') {\n try {\n return JSON.parse(json ?? '') as Result\n } catch {\n return null\n }\n}\n\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\n return Math.min(Math.max(value, min), max)\n}\n\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\n // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\n // as cy.get('.target').trigger('mousedown', { button: 0 })\n if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\n return (e as unknown as MouseEvent).button === 0\n } else {\n return true\n }\n}\n\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\nexport function getJSONReplacerFunc() {\n const visited = new WeakSet()\n return (key: string, value: any) => {\n if (typeof value === 'object' && value !== null) {\n if (visited.has(value)) {\n return\n }\n visited.add(value)\n }\n return value\n }\n}\n\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\n date.toLocaleDateString('en-US', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n ...options,\n })\n\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\nexport function randomUUID() {\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\n const c = Number(substring)\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\n })\n}\n\nexport function getUuid() {\n return window.crypto?.randomUUID?.() ?? randomUUID()\n}\n","export type HLC = {\n ts: number\n count: number\n uuid: string\n}\n\nexport const serializeHlc = ({ ts, count, uuid }: HLC) =>\n ts.toString().padStart(15, '0') + ':' + count.toString(36).padStart(5, '0') + ':' + uuid\n\nexport const parseHlc = (serialized: string) => {\n const [ts, count, uuid] = serialized.split(':')\n return {\n ts: Number.parseInt(ts),\n count: Number.parseInt(count, 36),\n uuid,\n }\n}\n\nexport const initHlc = (uuid: string, now: number): HLC => ({\n ts: now,\n count: 0,\n uuid,\n})\n\nexport const compareHlc = (one: HLC, two: HLC) => {\n if (one.ts === two.ts) {\n if (one.count === two.count) {\n if (one.uuid === two.uuid) {\n return 0\n }\n return one.uuid < two.uuid ? -1 : 1\n }\n return one.count - two.count\n }\n return one.ts - two.ts\n}\n\nexport const incrementHlc = (local: HLC, now: number): HLC => {\n if (now > local.ts) {\n return { ts: now, count: 0, uuid: local.uuid }\n }\n\n return { ...local, count: local.count + 1 }\n}\n\nexport const receiveHlc = (local: HLC, remote: HLC): HLC => {\n if (compareHlc(local, remote) >= 0) {\n return local\n }\n return { ...local, ts: remote.ts, count: remote.count }\n}\n","import { ObjectHash } from '../../types/shared'\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const decodeQueryString = = ObjectHash>(...args): T =>\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window.FLibs.decodeQueryString(...args)\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const encodeQueryString = (...args) => window.FLibs.encodeQueryString(...args)\n","// Copy if this file is in Website repo in Website/js/main/hooks/ folder\nimport * as React from 'react'\n\nexport function useIsMounted() {\n const isMountedRef = React.useRef(false)\n const getIsMounted = React.useCallback(() => isMountedRef.current, [])\n\n React.useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n return getIsMounted\n}\n","import { CanvasRenderingContext2D as NodeCanvasRenderingContext2D } from 'skia-canvas'\n\nimport {\n CanvasElementType,\n ChartEditorEnum,\n ChartElementType,\n ChartEventType,\n IndicatorType,\n LayoutType,\n OverlayType,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n TextAlign,\n TextBaseline,\n} from '../app/constants/common'\nimport ChartModel from '../app/models/chart'\nimport ChartLayout from '../app/models/chart_layout'\nimport { IChartThemeColors } from '../app/models/constants'\n\ninterface ISentry {\n captureException: (exception: any, captureContext?: { extra: ObjectHash }) => any\n captureMessage: (message: string, captureContext?: { extra: ObjectHash }) => any\n}\n\ndeclare global {\n interface Window {\n Sentry: ISentry\n FinvizSettings: ObjectHash\n FinvizChartsSettings: ObjectHash\n globalChartConfig: ObjectHash\n isRenderInProgress: boolean | number\n FinvizQuoteTypeCurrent: string\n handleScriptNotLoaded: () => void\n renderScriptNotLoaded: () => void\n }\n\n interface Document {\n fullscreenElement: any\n mozFullScreenElement: any\n webkitFullscreenElement: any\n msFullscreenElement: any\n webkitExitFullscreen: any\n mozExitFullScreen: any\n msExitFullscreen: any\n }\n\n interface HTMLElement {\n webkitRequestFullScreen: any\n mozRequestFullScreen: any\n msRequestFullscreen: any\n }\n\n interface Navigator {\n msMaxTouchPoints: any\n }\n\n interface Array {\n last(): T | undefined\n }\n\n interface String {\n padLeft(paddingValue: string): string\n startsWith(str: string): boolean\n }\n\n type CanvasCache = Partial>\n\n interface CanvasRenderingContext2D {\n _cache: CanvasCache\n // We need to omit `canvas` because it is read only\n set>(\n key: Key,\n value: CanvasRenderingContext2D[Key]\n ): void\n }\n\n interface HTMLCanvasElement {\n _cache: CanvasCache\n }\n\n interface ImageBitmapRenderingContext {\n _cache: CanvasCache\n }\n\n type RenderingContext2DType = CanvasRenderingContext2D | NodeCanvasRenderingContext2D\n}\n\ndeclare module 'skia-canvas' {\n interface CanvasRenderingContext2D {\n _cache: CanvasCache\n\n set>(\n key: Key,\n value: CanvasRenderingContext2D[Key]\n ): void\n }\n}\n\nexport type TodoObjectHashAnyType = Record\nexport type TodoAreaObject = Record\nexport type ObjectHash = Record\nexport type EmptyObject = Record\n\nexport type TodoAnyType = any\n\nexport type ThumbType = string\n\nexport type PaneArea = {\n mouseDown?: boolean\n x: number\n y: number\n scaled: {\n x: number\n y: number\n }\n width: number\n height: number\n cursorX: number\n cursorY: number\n isCursorInChartWidthBoundaries: boolean\n} & T\n\nexport type Maybe = T | null | undefined\n\nexport interface DrawingBorder {\n color: string\n width: number\n}\n\nexport interface TextAttrs {\n text?: string\n background: string\n border?: { width: number; color: string }\n lineWidth?: number\n font: {\n size: number\n family?: string\n style?: string\n weight?: string\n }\n fillStyle?: string\n strokeStyle?: string\n angle?: number\n lineHeight: number\n textAlign?: TextAlign\n textBaseline: TextBaseline\n padding: {\n top: number\n right: number\n bottom: number\n left: number\n }\n}\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport type RequireByKey = Omit & Required>\n\nexport interface ResizeByThumbFuncProps {\n type: ThumbType\n difX: number\n difY: number\n area: PaneArea\n}\n\nexport type ResizeByThumbWithTypeAndDifs = RequireByKey\n\nexport interface ChartConfigChartPaneElement {\n type: ChartElementType | CanvasElementType | IndicatorType | OverlayType | ChartEventType\n overlays?: OverlayConfigObject[]\n period?: string\n code?: string\n elementId?: string | null\n zIndex?: number\n}\n\nexport interface RendererChartBarProps {\n index: number\n chartSettingsColors: IChartThemeColors\n hasFillAndBorder?: boolean\n}\n\nexport interface ChartConfigChartPane {\n elements: ChartConfigChartPaneElement[]\n height: number\n chart?: ChartConfigObject | ChartModel\n}\n\nexport interface IIdea {\n id?: number\n date?: string\n note: string\n}\n\nexport interface ChartConfigObjectExtended {\n editable: boolean\n canChangeTicker: boolean\n scrollable: boolean\n cross: boolean\n ideas: boolean\n editors: ChartEditorEnum[]\n specificChartFunctionality: SpecificChartFunctionality\n theme: Theme\n layout: LayoutType\n uuid?: string\n idea?: IIdea\n}\n\nexport interface ChartConfigObject {\n width: number\n height: number\n panes: ChartConfigChartPane[]\n premarket: boolean\n aftermarket: boolean\n dateRange: string | null\n hasChartEvents?: boolean\n stretch: boolean\n ticker: string\n instrument: Instrument\n timeframe: TIMEFRAME\n chart_layout: ChartLayout\n zoomFactor: number\n leftOffset: number | null\n refreshData: boolean | number\n isHideDrawingsActive: boolean\n isScrolled?: boolean\n scale: ScaleType\n}\n\nexport interface RootChartConfigObject extends Partial {\n charts: ChartConfigObject[]\n width: number\n height: number\n newCharts?: boolean\n useGrid?: boolean\n}\n\nexport interface TaConfigObject {\n indicators: IndicatorConfigObject[]\n overlays: OverlayDatabaseRecordObject[]\n height: number\n style: string\n scale: string\n}\n\nexport interface IndicatorConfigObject {\n name: string\n parameters: string\n position: Position\n}\n\nexport interface OverlayConfigObject {\n color: string\n period: string\n type: OverlayType\n}\n\nexport interface OverlayDatabaseRecordObject {\n name: string\n parameters: string | null\n color: string | null\n}\n\nexport enum Instrument {\n Stock = 'stock',\n Crypto = 'crypto',\n MarketSentiment = 'market_sentiment',\n Futures = 'futures',\n Forex = 'forex',\n Group = 'group',\n}\n\nexport enum Theme {\n light = 'light',\n dark = 'dark',\n}\n\nexport interface IModalConfig {\n title: string\n inputs: IModalConfigInput[]\n inputsErrorMessages: ObjectHash\n}\nexport interface IModalConfigInput {\n type: React.HTMLInputTypeAttribute\n label: string\n name: string\n value: number | string\n required?: boolean\n min?: number\n color?: string\n step?: number\n}\n\nexport enum Position {\n Above = 'above',\n Below = 'below',\n}\n\nexport enum DefaultSpineEvents {\n Change = 'change',\n Destroy = 'destroy',\n Refresh = 'refresh',\n Update = 'update',\n}\n\nexport enum CustomSpineEvents {\n IndicatorsChange = 'indicatorsChange',\n ManualChange = 'manualChange',\n}\n\nexport enum DrawingSpineOptionsEvent {\n Remove = 'remove',\n}\n\nexport interface DrawingSpineOptions {\n eventType: DrawingSpineOptionsEvent\n}\n\nexport type TodoButtonProps = ObjectHash\nexport type TodoButtonTheme = string\n","module.exports = FLibs.DateFns;","module.exports = FLibs.React;","module.exports = FLibs.ReactDOM;","module.exports = FLibs.ReactRouterDOM;","module.exports = FLibs.classnames;","module.exports = FLibs.d3;"],"names":["BackgroundInput","_ref","label","value","onChange","React","InputColorPicker","inputDataTestId","concat","toLocaleLowerCase","color","convertColorToHEX","ColorRangeRowInput","colorValue","colorTestId","rangeValue","rangeTestId","rangeLabel","rangeProps","handleRangeChange","useCallback","ev","currentTarget","handleColorChange","className","RangeSlider","_extends","rightContent","Paragraph","as","size","BorderInput","min","max","width","step","CheckBox","Checkbox","checked","FONT_VALUES","FontInput","_FONT_VALUES$find","family","setFamily","useState","setSize","style","setStyle","weight","setWeight","setValue","key","valueSetter","Select","items","find","option","selected","map","SelectOption","Input","type","LineInput","MultilineStringInput","required","Textarea","placeholder","e","target","autoFocus","NumberInput","props","name","allowDecimal","pattern","parseFloat","parseInt","StringInput","Trend","active","trend","valueAsNumber","VisibilityInput","isCheckboxOnly","isOff","setIsOff","from","setFrom","to","setTo","macroKey","macroLabel","charAt","toUpperCase","slice","disabled","DEFAULTS","Math","Number","MacroTimeframe","INPUTS_AVAILABLE","getInitialState","visibilities","merge","visibility","macroTimeframe","valueMacroTimeframe","Object","keys","length","getIsVisibilityOutsideAvailableTimeframes","every","macrotimeframe","macroRange","MicroTimeframeRange","some","item","_macroRange$from","_macroRange$to","isInRange","Visibility","initialVisibilityRef","handleChange","result","handleDisableSubmit","current","includes","TAB_BUTTON_COMMON_PROPS","contentClass","getValuesFromFormState","formState","reduce","acc","cur","DialogTabs","ElementStyleDialog","_config$title","config","element","getModalConfig","initialFormStateRef","JSON","parse","stringify","inputs","setFormState","finalFocusRef","_document$querySelect","document","querySelector","body","selectedTab","setSelectedTab","Style","isSubmitDisabled","setIsSubmitDisabled","isDrawingElement","getIsDrawing","isEditInProgress","trigger","handleValuesChange","values","shouldSubmit","shouldDismiss","hasOnSubmit","onSubmit","hasOnDismiss","onDismiss","set","state","hide","handleValuesChangeDebounceRef","debounce","newFormState","maxWait","cancel","preventDefault","checkValidity","handleCloseDialog","Dialog","isDraggable","title","onOverlayClick","onHide","DialogHeader","onCloseClick","DialogBody","ButtonGroup","hasDivider","Button","onClick","input","InputComponent","getInputForType","inputType","prevState","stateInput","DialogFooter","animating","theme","ElementStyleDialogContext","ElementStyleDialogWrapper","setElement","setOnSubmit","setOnDismiss","dialog","useDialogState","modal","Provider","openDialog","show","children","getContainerType","model","_mainElement$instance","_mainElement$instance2","mainElement","indicatorType","instance","isIndicator","IndicatorType","isChart","getTickersAndContainerTypesInLayoutModel","chartLayout","tickers","containerTypes","getAllPanes","forEach","paneModel","ticker","getQuoteRawTicker","containerType","push","getInitialStoreDrawings","_ref4","_window$FinvizSetting","_window$FinvizSetting2","_window$FinvizChartsS","_initialDrawings$map","initialDrawings","window","FinvizSettings","initialDrawingsStore","FinvizChartsSettings","drawings","getAutosaveElementFromDBRecord","handleCallMethodOnAllDrawings","_ref5","chartLayoutModel","elementMethod","getAllElements","isDrawing","getNoteElementId","getElementNoteText","noteElement","_ref6","_JSON$parse","elementAttrs","text","getTickerNoteText","_ref7","elements","_ref8","elementId","zIndex","changeType","lastChange","ts","lastChangeTimestamp","count","lastChangeCounter","uuid","lastChangeNodeUUID","DRAWINGS_SAVE_INTERVAL_MS","RETRY_LIMIT","useDrawingAutoSaveApi","postRetryCountRef","deleteRetryCountRef","fetchDrawings","async","fetchApi","location","queryParameters","join","undefined","throwOnStatusCodes","drawing","saveDrawings","bodyJsonString","getDBRecordFromAutosaveElement","keepalive","s","n","i","l","hi","charCodeAt","lo","Error","getByteLengthOfString","error","_window$Sentry","Sentry","captureException","method","contentType","ContentType","latestChangeHlc","sort","a","b","compareHlc","_window$Sentry2","InternalServerError","Promise","r","setTimeout","ForbiddenError","extra","GenericStatusCodeError","response","invalidItems","index","deleteAllDrawings","lastLocalChange","_ref2","newHlc","incrementHlc","Date","now","getUuid","_window$Sentry3","useDrawingAutoSaveControls","isAutoSaveActive","useModelState","watchProperties","idea","isInit","isPreserveDrawingsActive","getIsPreserveDrawingsAndAutosaveAvailable","id","useIsAutoSaveActive","drawingsInternalStore","saveTimeoutRef","clearTimeout","saveLatestChanges","withDelayInMs","arguments","saveQueueExtraFilterCallback","saveQueue","filter","latestLocalUpdateTimestamp","instanceUUID","setAutoSaveState","AutoSaveState","save","updateAttributes","receiveHlc","syncChartLayoutDrawings","isRemove","paneContainerType","paneInternalStoreElements","autoSaveElement","paneElement","isCreator","paneDrawing","destroyCascade","parsedElementAttrs","toAutosaveConfig","pane","selection","hasOngoingInteraction","updateScales","getCanvasElementByType","fromObject","create","handleAutoSaveNoteChange","note","newNoteElement","handleIdeaNoteChange","_chartLayout$idea","_chartLayout$activeCh","_chartLayout$activeCh2","updateAttribute","activeChart","checkDrawingUpdate","isRefetchAll","latestRemoteUpdateTimestamp","initHlc","updatedDrawings","newLastUpdateTimestamp","updatedElementIds","newInternalStore","currentInternalStore","lastUpdateTimestamp","drawingIndex","findIndex","_ref3","currentDrawing","currentNote","autoSavedNote","mergeUpdatedDrawingsToInternalStore","allElements","normalizeZIndexes","specificChartFunctionality","SpecificChartFunctionality","_chartLayout$activeCh3","_chartLayout$activeCh4","activeTicker","updateInternalStoreWithElement","updateResult","destroyed","instanceJson","newDrawing","updateDrawingIndex","drawingElement","shouldSyncAndSave","updatedRecord","hasChangedZIndex","hasChangedType","hasChangedAttrs","hasChange","updateInternalStoreWithChangedElement","deleteAllAutoSavedElements","onElementChange","_","options","elementPane","elementContainerType","elementPaneTicker","eventType","DrawingSpineOptionsEvent","useDrawingAutoSave","drawingsInternalStoreUnwatched","prevIsAutoSaveActive","ref","usePrevious","runInitialSaveAndRefetchUpdate","onChartOrIndicatorChange","newTickers","newContainerTypes","ChartModel","CustomSpineEvents","Element","checkDrawingUpdateInterval","setInterval","clearInterval","getIdeaUrl","instrument","period","searchObject","t","p","isStock","Instrument","isQuotePage","test","pathname","isStockOnQute","path","queryString","ta","IdeasList","hasError","setHasError","hasFetched","setHasFetched","isDeleting","setIsDeleting","ideas","setIdeas","currentIdea","decodeQueryString","useEffect","_window$gtag","_window","gtag","call","event_category","getInstrument","fetchIdeas","onDeleteIdeaClick","useRef","_window$FinvizChartsS2","_window$globalChartCo","confirm","search","row","fetch","headers","String","href","url","ideaChart","globalChartConfig","stateIdea","reload","company","date","stopPropagation","IdeasDialog","IdeasDropdown","rounding","dropdownButtonClassName","tooltipState","useTooltipState","placement","isAnyQuoteLoading","setIsAnyQuoteLoading","dropdown","useDropdownState","hideTooltip","checkIfAnyQuoteIsLoading","fetchingQuotes","Quote","quote","isFetching","fetchedAt","visible","hasUserPremium","Dropdown","leftContent","appearance","DropdownItem","TooltipTrigger","closeOnClick","layoutModel","_layoutModel$idea","_window$gtag2","_window2","activeChartQuote","toJSON","cid","timeframe","ChartSettings","settings","layout","toObject","LayoutType","barWidth","center","barMargin","charts","c","chartId","dateRange","refreshData","layoutModelObjectPanes","tickersString","split","replace","getChartTickers","panes","quotes","isIdeaId","ideaID","array","quotesJsonString","q","omit","chart","quoteTickersTimeframes","toConfig","data","getFormDataFromObject","ideaUrl","open","saveIdea","DialogTrigger","Tooltip","Spinner","classnames","getIsMobileScreenSize","encodeQueryString","utm_source","utm_medium","utm_campaign","publishModalAsyncModule","importFn","cacheKey","Publish","publishModalModule","isLoading","useAsyncModule","shouldLoadModule","errorSeverity","onError","PublishDialog","default","buttonProps","Delayed","delayComponent","Icon","isPremium","TourButton","page","tour","useTour","pageTours","steps","getRequestFullscreen","documentElement","overlayPadding","isRedesignEnabled","Boolean","getTour","userTour","setCurrentTour","getStepsForUser","buttonTheme","hasNewTours","activeTour","startTour","once","isNativeMobileSelect","ChartTypesSelect","_chartTypes$find","_chartTypes$find2","chartTypes","getCurrentType","useLocation","ty","taInt","defaultType","QuoteShortToLongType","FinvizQuoteTypeCurrent","QuoteNodeChartTypes","generateRouterPath","FREE_TYPES_QUOTE_VALUES","QuoteLongToShortType","DEFAULT_TYPES","FREE_TYPES_QUOTE","reloadDocument","useChartTypes","currentType","selectedType","setSelectedType","icon","iconName","listProps","hasPopoverButtonWidthLimit","Link","CHANGE_UPATE_EVENTS","QUOTE_MODEL_CHANGE_EVENTS","QuoteFetchType","ChangeLabel","changePoints","isTiny","DailyChangeDisplay","withSuspense","_chartLayoutModel$get","_chartModel$quote","chartIndex","chartsModule","chartSettingsAsyncModule","isSuspenseMode","useChartLayoutGlobalModel","chartModel","getAllCharts","listenOnEvents","quoteModel","tickerChange","getTickerChange","math","lastClose","tickerAfterChange","points","string","prevProps","nextProps","utmCampaign","testId","DrawButton","newValue","getIsDrawingEnabled","DRAWING_COOKIE_NAME","catch","then","res","ok","expires","setMonth","getMonth","utils","rest","getLayoutType","tickersCount","FullscreenButton","urlTickers","all","getRawTicker","Array","_tickers$index","Search","onTickerSelected","dropdownState","saveToPortfolioDialog","createAlertDialog","detailLink","formattedTicker","WebsiteSearchComponent","inputClass","isSearchIcon","isSearchItemLink","isShowAllVisible","_window$gtag3","_window3","SaveToPortfolio","onClose","CreateAlert","SETTINGS_WIDTH","BUTTON_POPOVER_GUTTER","SETTINGS_POPOVER_ID","ScrollableChartSettingsPopover","elementWidth","bodyWidth","useElementMeasure","PreventClosingUnsavedChanges","isFullyClosed","getExtendedDialogState","chartElement","getElementById","popoverContentElement","settingsButton","unstable_referenceRef","popoverStyles","newPopoverStyles","buttonRect","getBoundingClientRect","topOffset","top","height","maxHeight","innerHeight","position","scrollY","chartHeight","clientHeight","popoverContentHeight","offsetHeight","emptySpaceDiff","maxOffset","rightOffset","wrapper","marginRight","checkForUnsavedChangesAndClose","Popover","popoverWrapperStyle","focusOnHide","hideOnClickOutside","ChartSettingsButton","settingsPopoverState","usePopoverState","PopoverTrigger","focusRing","getQuoteRequestKey","useChartControls","_chartModel$chart_lay","_chartLayoutModel$ide","unwatchedChartModel","isInteractive","navigate","useNavigate","chart_layout","chartModelRef","modelRef","useModelRef","setIsLoading","abortControllerKeyRef","isIdeaChart","updateChartModelWithNewQuote","_chartLayoutModel$act","_chartPane$getAllChar","isSameTicker","getChartOrIndicatorElement","leftOffset","getLeftOffset","isScrolled","getAllQuotes","chartQuote","eql","fetchData","fetchType","chartPane","getChartPane","activeChartEvent","toggleIsOpen","getAllChartEvents","isChartEvent","setChartEvents","chartEvents","updateChartEventsZIndexes","fetchQuote","hasChartEvents","premarket","aftermarket","patterns","getHasPatterns","currentQuote","abortController","createRequestAbortController","shouldAbortRunningRequest","events","cachePredicate","fetchNewDataOnCachedQuote","wasFetchAborted","isQuoteUsedInOtherCharts","destroy","removeFromAbortCache","decodedQueryString","rangesArray","ranges","shouldRecalculateOnCharts","hasSameBarWidth","IndicatorSettings","hasSameBarMargin","hasRedesignEnabled","ChartControls","_chartModel$quote$nam","favoriteTimeframes","toggleFavoriteTimeframe","useFavoriteTimeframes","anchorDate","generateChartLayoutRouterPath","timeframeGroupsWithHref","dateRangeGroupsWithHref","handleCustomDateRangeValidation","useChartModelCustomDateRangeValues","onDialogSubmit","customDateRangeDialogState","handleDateRangeSelect","getDateRangeTimeframe","useCustomDateRangeDialog","pathGenerator","handleTickerSelect","upperCaseTicker","handleCustomRangeSubmit","dateRangeTimeframe","timeframeBarProps","timeFrameGroups","dateRangeGroups","customRange","selectedTimeframe","onTimeframeSelect","selectedDateRange","loadingTimeframe","onDateRangeSelect","isFavoritesEnabled","onFavoriteTimeframeToggle","canChangeTicker","TimeframeBar","CustomDateRange","dialogState","hasTimeframe","editors","ChartEditorEnum","Heading","level","editable","compactViewMaxBreakpointPx","grow","FLibs","Hammerjs","getChartEventBadgeElement","svgHtmlString","chartBadgeSvgByType","badgeType","dangerouslySetInnerHTML","__html","ChartEventPopoverTableRow","colSpan","ChartEventDividendsPopoverContent","rawData","dataArray","getFormattedEventDate","dateTimestamp","ordinary","getFormattedValue","special","ChartEventBadgeState","CHART_EVENT_BADGE_SIZE","ChartEventLabels","SURPRISE_POSITIVE_COLOR","SURPRISE_NEGATIVE_COLOR","getFormattedFiscalPeriod","fiscalPeriodRaw","fiscalPeriod","toLowerCase","year","quarter","semester","getPercentValueString","totalValue","percent","percentValue","isNaN","abs","maxDecimalPlaces","ChartEventEarningsPopoverContent","fiscalEndDate","month","day","epsActual","epsEstimate","epsSurprise","epsSurpriseColor","percentageValue","epsReportedActual","epsReportedEstimate","epsReportedSurprise","epsReportedSurpriseColor","salesActual","salesEstimate","bigNumberUnit","BigNumber","revenueSurprise","revenueSurpriseColor","ChartEventSplitPopoverContent","factorFrom","factorTo","ChartEventPopover","popoverState","ZIndexContext","tabIndex","hasBackdrop","classNames","ChartEventBadgeType","focusOnShow","hasViewportHeightLimit","getChartEventContentComponent","ChartEventPopoverWithState","unwatchedChartLayout","left","isChartEventOfThisChart","setData","clickAwayRef","callback","isListening","refCallback","isMobile","Utils","handler","contains","addEventListener","removeEventListener","useClickAway","_chartModel$getChartP","chartEvent","isHovered","unstable_popoverRef","popoverShow","popoverHide","isOpen","newData","getChartEventData","getChartEvenBadgeType","CHART_LAYOUT_CHILD_CHANGE_EVENT","ContextMenu","Spine","static","this","configure","initClass","contextMenu","selector","constructor","_defineProperty","forceUpdate","componentDidMount","update","componentWillUnmount","render","_document$querySelect2","classList","remove","onContextMenu","ContextMenuComponent","add","ready","el","ReactDOM","event","shown","clientY","pageYOffset","clientX","LoadLatestDataButton","chartModelUnwatched","getIsMounted","useIsMounted","hasNewDataAvailable","setHasNewDataAvailable","getRefreshInterval","isPossibleToFetchSequentialData","hasNewData","promises","ZOOM_CONTROLS_ACTIVE_CLASS","ZOOM_CONTROLS_IS_IN_AREA_CLASS","buttonCommonProps","getDefaultLeftOffset","ZoomControls","zoomControlsRef","isVisible","onZoomIn","onZoomOut","onZoomReset","isGoToRecentVisible","setIsGoToRecentVisible","defaultZoomFactor","isZoomResetVisible","setIsZoomResetVisible","zoomFactor","handleGoToMostRecent","handleChartModelChangeDebounced","bind","unbind","hidden","Pane","_this","super","hasSeenCrossNotification","localStorage","getItem","isTouchCrossActive","scrollable","renderAll","oldElementInstance","isDrawingModeContinuousActive","setSelection","startsWith","onPaneDestroy","setSelectedElement","clonedElementInstance","setCanvasSize","recountScale","area","getArea","MouseModel","x","y","_event$targetTouches","activeChartInteraction","TouchEvent","targetTouches","lastClientX","dif","addToLeftOffset","scaleRange","lastClientY","_this$props$model$get","_this$props$model$get2","_this$props$model$get3","difY","scale","ScaleType","invert","currentViewRange","getMinMax","touchEventsDisabled","onScalerMouseDown","onScalerMouseMove","onScalerMouseUp","setActiveChartInteraction","MouseEvent","button","scalerLastY","currentDomainMax","currentDomainMin","domain","onScalerTouchMove","onScalerTouchEnd","_model$getChartOrIndi","_model$getChartOrIndi2","originalMinMax","currentDiff","originalDiff","getBarWidthWithMargin","getMinMaxLeftOffset","newLeftOffset","barIndex","fetchOlderData","getElement","openElementStyleDialog","pointerType","onCanvasPress","elementInArea","thumbsAreInArea","elementModel","ElementModel","hasProperties","isElementDrawing","makeClone","setVisibilityTo","SetVisibilityTo","bringToFront","sendToBack","bringForward","sendBackward","handleRemoveIndicatorPane","paneIndex","element_type","updateType","canvasCtx","_this$props$model$sel","_this$props$model$sel2","getIsCreator","hoveredElement","setIsHovered","_element$instance$get","_element$instance","_element$instance$get2","_element$instance2","getIsCreatorDialogOpen","cross","crossRafId","requestAnimationFrame","renderCross","rafId","_renderAll","canvasRef","getIsUpdatedDesign","renderPane","isMouseInPane","crossCanvasCtx","clearRect","isCrossDisabled","PaneModel","getIsDisabled","elementInstance","renderCrossText","NaN","restore","additionalData","Settings","getSettings","areaRectangle","canvas","areaRectangleCursorX","areaRectangleCursorY","chartLeftX","chartRightX","right","scaled","cursorX","cursorY","isCursorInChartWidthBoundaries","ratio","canvasElement","crossCanvasRef","isDisableTouchCrossAvailable","initialScrollable","lastActiveTool","DrawingTool","isChartsPage","setState","notificationContext","Notification","actions","setItem","inline","activeTool","_this$zoomControlsRef","isMouseDownIgnored","zoomControls","paneHeight","mouseDown","isInArea","touchEvent","onCanvasInteractionStart","_MouseModel$pane","setMousePosition","getMousePositionInBoundaries","_element$getIsChartEv","isTouch","getIsChartEvent","onPaneMouseMove","getIsHammerAllowScrollActive","onCanvasInteractionMove","onCanvasInteractionEnd","onMouseMoveOnScrolling","Touch","isPrimaryClick","_element$getIsChartEv2","_model$getChartOrIndi3","_model$getChartOrIndi4","_model$getChartOrIndi5","setElementCursor","getHTMLElementId","cursor","lastX","lastY","_model$selection$getI","_model$selection","CanvasElement","activeThumb","moveBy","isElementHovered","isSelected","crossCanvas","canvasAreaRectangle","chartLeft","chartRight","chartTop","chartBottom","bottom","getValueInRange","_MouseModel$pane2","isSameMouseModel","setIsSelected","isSelectionCanvas","onModelUpdate","onElementCreate","onElementDestroy","onElementReplace","onElementSelect","onElementClone","immediateRecountScaleOnChartIndicatorChange","onChartUpdate","isIndicatorPane","getIsIndicatorPane","_getInitialStoreDrawi","_this$canvasWrapperRe","initialStoreDrawings","_element$instance3","cachePointPositionTimestamp","_element$instance4","getContextWithCache","paneHammer","Hammer","paneRef","touchAction","threshold","time","on","onPress","canvasWrapperHammer","canvasWrapperRef","onTouchMove","passive","scalerRef","scalerHammer","onScalerReset","zoomerRef","zoomerHammer","onZoomerReset","onDoubleClick","_this$canvasWrapperRe2","unmountCanvas","onPaneClick","_this$paneHammer","_this$scalerHammer","_this$zoomerHammer","_this$canvasWrapperHa","_this$scalerHammer2","_this$zoomerHammer2","_this$paneHammer2","_this$canvasWrapperHa2","isChartPane","getIsChartPane","onMouseMove","onMouseLeave","onPaneMouseLeave","onTouchStart","onMouseDown","onResizerMouseDown","onMouseEnter","onScalerMouseEnter","onScalerTouchStart","onZoomerMouseDown","onZoomerMouseMove","onZoomerTouchStart","onAddToZoomFactor","diff","shouldCalculateRightAlign","onTouchEnd","onBlur","getChartAlt","isCharts","isRedesignedFuturesForexCrypto","isRedesignedPage","withNotificationContext","Component","context","withElementStyleDialogState","ChartSpinnerOverlay","shouldDisplay","setIsVisible","timeout","DEFAULT_WRAPPER_COMPONENT","preventDefaultFunc","Chart","panesWrapperElement","isWheelZoomEnabled","zoomerRightAlign","calcZoomerRightAlign","mouseWheelTimeout","activePane","_this$props$layoutMod","onModelChange","calculateMinimalPaneHeight","paneId","chartModelParam","panesHeight","sum","_pane$height","newPaneHeight","round","newChartPaneHeight","newIsScrolled","lastWidth","lastHeight","handleQuoteChange","_pane$selection","resizerPaneIndex","onResizerMouseMove","onResizerMouseUp","resizePanesAccordingly","touches","onZoomerMouseUp","p1","p2","getRawDistance","onPinchMove","onPinchEnd","getChartLayoutSettings","fx","first","currentLeftOffset","isIntraday","getBarIndex","close","offsetDiff","shouldAlignDaysToLeftApplied","offsetBars","offset","_e$clientX","onZoomerTouchMove","onZoomerTouchEnd","deltaY","log","sign","isMouseWheel","difX","normalizeWheelDeltaY","addToZoomFactor","diffCoefficient","currentZoomFactor","minBarWidthInPx","maxBarWidthInPx","minZoomFactor","getZoomFactorForBarsToDisplay","chartVisibleWidth","numOfVisibleBars","maxZoomFactor","isNegativeDirection","newZoomFactor","newZoomFactorInRange","getZoomFactor","stretch","getIsSmallIndexChart","updateZoomAndLeftOffsetByDateRange","newQuote","shouldForceLeftOffsetUpdate","isMouseDown","onLayoutModelChange","onPaneCreate","onOlderDataLoaded","onDataLoaded","componentDidUpdate","_prevState$panesWrapp","_this$state$panesWrap","_this$state$panesWrap2","setStateWithPanesTimeout","renderChartToolbar","getAllValidPanes","showSettings","resetMouseModel","handleSetPanesWrapperRef","onPinchStart","onWheel","onMouseWheel","minHeight","total","optiMinHeight","floor","minimalPaneHeight","basePane","WrapperComp","gridArea","isModelDestroyedRef","initChartRef","panesConfig","_pane$elements","_element$overlays","overlays","overlay","panesWithPerfIndicator","allSettled","paneWithPerfIndicator","prefetchPerfIndicatorAllQuotes","paneProperties","createPaneCascade","shouldResize","chartsDimensions","getChartsDimensions","handleModelBeforeDestroy","isChartPage","isFuturesForexCryptoPage","isModelReady","loadingStyle","hasOutline","withWatchedPanesOnChartModel","portfolioWatchlistAsyncModule","ModuleLoadFailed","SidebarModule","sidebarModules","freeze","portfolio","description","content","asyncModule","withInitialLoading","isComponentReady","setIsComponentReady","sidebarModule","isError","withModuleAsyncLoad","mobile","SidebarContent","_width$min","_width$max","_width$default$mobile","_width$default","_width$default$deskto","_width$default2","direction","onResize","useSidebarContext","minWidth","DEFAULT_WIDTHS","maxWidth","defaultMobile","defaultDesktop","desktop","SidebarDirection","Resizable","enable","handleClasses","defaultSize","MOBILE_TOOLBAR_DIV_ID","SidebarTabs","activeModule","selectModule","unstable_timeout","entries","isActive","isBlurAfterClick","SIDEBAR_QUERY_PARAM","Sidebar","onShouldResize","tabsClassName","urlSearchParams","useSearchParams","sidebarModuleKey","get","setActiveModule","handleSelectModule","newUrlSearchParams","URLSearchParams","delete","toString","handleCloseSidebar","getIsMobilePortrait","contextValue","isCloseVisible","SidebarContext","drawingCreatorsAsyncModule","drawingActions","DrawingActions","getToolbarDrawingActions","isAddNoteAvailable","isIdea","defaultItem","isDisabled","disabledTooltip","drawingSettings","DrawingSetting","iconActive","titleActive","preserveDrawingsAutosaveOverride","iconAction","titleAction","getToolbarDrawingSettings","isPreserveDrawingsAndAutosaveAvailable","isAutoSaveInProgress","isInAction","drawingTools","toolbarDrawingTools","toolGroup","toolGroupTitle","DISABLED_ITEM_TOOLTIP_LABEL","Toolbar","_chartLayoutModel$ide2","isSidebar","isHorizontal","isMobileOverlay","onActiveToolChange","onDrawingActionClick","onDrawingSettingClick","onDrawingEnd","isAlternativeTheme","areToolsDisabled","drawingCreatorsModule","isDrawingCreatorsModuleLoading","autoSaveState","setIsDrawing","availableDrawingSettings","availableDrawingActions","isDrawingModeContinuous","hasData","hasHiddenDrawings","tool","drawingToolsTouchCreatorsByType","drawingToolsCreatorsByType","ToolClass","one","ToolbarComponent","_item$toolGroup","isToolLoading","ToolbarItem","groupItems","groupTitle","useNativeSelect","ToolbarDivider","ChartAutoSaveNote","onNoteChange","rows","ChartAutoSaveNotes","setTickers","unwatchedInternalStore","handleChartChange","tickerNoteMap","_tickerNoteMap$ticker","AutoSaveNotesDialog","isBackdropDisabled","ConfirmationDialog","onCancel","onAction","isAutosaveDialogContent","dialogContent","message","getDialogContent","ConfirmationDialogComponent","ToolButton","ToolbarMobile","isToolbarVisible","setIsToolbarVisible","setUrlSearchParams","toolbarMobileElement","setToolbarMobileElement","handleActiveToolChange","drawingTool","wrapperRef","handleClickOutside","_wrapperRef$current","openSelect","actionId","has","params","AutoSaveStateIndicator","setVisibilityTimeout","newIsVisible","checkIfNeededPreventLeaving","returnValue","hasRedesign","ChartLayoutAutoSaveNote","chartLayoutModelUnwatched","ideaNoteRef","getPublishChartHtmlElements","publishChartElements","getElementsByClassName","getChartImgUrl","_imgElement$src","imgElement","src","PublishOldButtonClickListener","dialogConfig","setDialogConfig","isCanvas","chartImgUrl","publishChartHtmlElements","clickHandler","dataset","indexInt","IdeaDrawingsConfirmationOptions","IdeaLeaveDialog","actionCallback","Cancel","Override","Merge","Nothing","getChartElementTypeFromQueryType","queryType","_getChartElementTypeF","QuotePageQueryChartTypes","ChartElementType","getChartElementTypeFromResponseType","TA","useChartRouteChange","useTrackPageView","trackInitial","dateFns","months","updateChartConfig","_ty","decodedSearch","urlType","handleTypeChange","_decodedSearch$t$spli","_decodedSearch$p$spli","_decodedSearch$p","_decodedSearch$r$spli","_decodedSearch$r","urlTicker","urlTimeframe","urlDateRange","newChartConfig","getRawTickerForInstrument","updateAttributesAndSync","_chartLayoutModel$ide3","_chartLayoutModel$ide4","exitIdea","_window$FinvizSetting3","defaultPeriod","TIMEFRAME","defaultDateRange","handleIdeaLeave","action","getDefaultZoomFactor","innerWidth","MOBILE_VIEW_BREAKPOINT_WIDTH","MOBILE_BARS_TO_VIEW","OnInitListener","onRegisterChartLayoutModel","parentElement","setIsInit","checkIfInitIsComplete","isReady","elementIndex","_config$charts$chartI","opacity","withCompleteLayoutModelInit","_props$config$editabl","_props$config$canChan","_props$config$scrolla","_props$config$cross","_props$config$editors","_props$config$ideas","_props$config$specifi","_getInitialStoreDrawi2","_newConfig$idea","newConfig","Theme","isQuotePageWithDrawingsOff","noteDrawing","ideaObject","indicatorElement","getContainerTypeFromPaneConfig","newElements","ChartLayoutModel","isHideDrawingsActive","toolsState","isLockDrawingsActive","DrawingsInternalStore","withQuotePolling","pollingIntervalToCharts","setPollingIntervalToCharts","checkForChartsWithPolling","newPollingIntervalToCharts","chartRefreshInterval","_newPollingIntervalTo","intervalIdsRef","checkForChartsWithPollingDebounced","chartsCheckerIntervalId","EXTRA_MARKET_BUFFER_MINUTES","timeoutDurations","allCharts","timeoutDurationsMin","duration","timeoutId","chartIds","flatMap","quotesToUpdate","quoteToUpdate","dispatchEvent","Event","QUOTE_FETCH_EVENT","ChartLayoutComponentBase","AbortController","preserveDrawings","handlePreserveDrawingsSettings","setPreserveDrawings","val","preserveDrawingAbortController","abort","tools_state","orientationChangeTimeout","setToolbarPosition","handleResize","throttledResize","modelAttrs","throttle","_this$state","_this$state2","getFullscreenStatus","getVisualViewportScale","visualViewport","noteDialogState","toggle","confirmationDialogState","handleConfirmationDialogCloseBtn","settingId","newObj","toggleHideDrawings","handleLockDrawings","event_label","_this$model$activeCha","updateLayout","last","chartConfig","modelProperties","isToolbarHorizontal","handleInitialPreserveDrawingsState","DELETE","getPaneWithSelection","keyCode","ThumbSettings","touchSize","onChartDestroy","onWindowResize","handleOrientationChange","checkTouchEventsDisabled","newIsToolbarHorizontal","renderToolbar","args","isOverlayToolbar","handleDrawingAction","handleDrawingsSetting","_this$props$idea2","newCharts","useGrid","publish","LAYOUTS","isMobilePortrait","_this$props$idea","isSidebarEnabled","getIsSidebarEnabled","handleConfirmationDialogDeleteBtn","ChartGrid","border","columns","_chartLayout$gridArea","ChartGridCell","gridAreas","hasChartTools","renderTools","ideaTitleContainer","ideaTitle","clear","removeCharts","addCharts","_layout$gridAreas","rowStart","columnStart","rowEnd","columnEnd","num","numOfRowsCovered","numOfColumnsCovered","percentageOfRowsCovered","percentageOfColumnsCovered","newWidth","newHeight","general","settingsHeight","wantedCount","pop","ChartLayoutComponent","flowRight","checkQuoteCacheDebounce","cleanupQuoteCache","allQuotes","allChartQuotes","usedQuote","updateChartsTitle","defaultDocumentTitleRef","afterClose","prevClose","percentageChange","overridePlaces","useChartPageTitle","handleChartsUpdate","getChartLayoutWithChartRouteChange","ChartLayout","isWithNotifications","Wrapper","NotificationWrapper","ChartLayoutWithGlobalState","setChartLayoutModel","getChartLayoutModelConfig","lastGlobalRerender","fallback","isIPad","IPAD_FULLSCREEN_CLASS","isFullscreen","setIsFullscreen","requestFullscreen","exitFullscreen","getExitFullscreen","checkFullscreen","SORTED_LAYOUT_KEYS","arr","sortBy","sortDirection","SORT_DIRECTION","directionMultiplier","sortObjects","ChartLayoutDropdown","parsedQuery","getChartsToPath","useChartsPathLocation","orientation","DropdownSeparator","ChartSyncableParts","isChartPartInSync","getIsChartPartInSync","setSyncChartParts","ThemeToggleButton","isDarkMode","updateSettings","BREAKPOINTS","Infinity","marketBadgeText","timeFormat","ChartLayoutHeaderComponent","onSettingsOpen","hasPublish","Time","breakpointMode","breakpoints","ChartLayoutHeader","StockDetailTimeframeBar","isDateRangeAvailable","isLoadingOverride","isScrollIntoViewEnabled","containerElement","pushIndicators","indicator","_options$COTs","cotKeys","COTs","code","hasPaneWithCOTCode","PANE_HEIGHT_DEFAULT","parameters","getChartTypeByTaConfigStyle","candlestick","heikinashi","hollowcandlestick","line","ohlc","mergeChartAndTAConfig","taConfig","_chartScaleMap","linear","percentage","logarithmic","indicators","Position","_overlay$parameters","_overlay$color","getPanes","_overlay$parameters2","_overlay$color2","webpackEmptyContext","req","resolve","module","exports","componentsLib","components","white","black","inherit","transparent","finviz","blue","gray","red","orange","amber","yellow","brightYellow","lime","green","emerald","teal","violet","purple","pink","FLibsExports","___EXPOSE_LOADER_IMPORT___","require","___EXPOSE_LOADER_GLOBAL_THIS___","Arrow","renderContent","resize","_thumbs","Thumb","attrs","x1","y1","x2","y2","getBoundingPointKeys","getDefaults","ElementSettings","Colors","roundedXY","getRoundedObject","translateXY","getXYOffsetFromLine","lineWidth","translate","beginPath","angle","PI","moveTo","lineTo","stroke","lineAngle","atan2","h","cos","angle1","topx","topy","sin","angle2","botx","boty","getShouldRenderThumbs","renderThumbs","isDrawingElementLockedOrInvisible","CanvasElementType","prototype","modalConfig","Brush","previousFill","shouldRenderFill","_this$model","positionPointsTimestamps","getTimestampFomPositionX","places","domainDiff","numberOfLeadingZeros","log10","roundToFixed","untranslatedContext","createElement","setFillCache","fill","defaultTransparentFill","isPolyLineClosed","cachedFill","getShouldRenderFill","_this$attrs","brushPath","Path2D","fy","xc","yc","quadraticCurveTo","point","closePath","getThumbs","firstX","firstY","moveByThumb","onMouseUp","roundY","_this$untranslatedCon","isPointInPath","getPositionXFromTimestamp","getAutosaveOmittedProperties","TailDirection","getTailHalfWidth","halfWidth","dist","Callout","Text","getModalConfigBase","textWithoutBackground","font","fillStyle","lineHeight","textAlign","textBaseline","padding","background","defaultFill","setupContext","setupTextMetricsCache","_this$lastAttrs","_this$lastAttrs2","lastAttrs","lines","getLines","metrics","measureText","measuredHeight","currentIndex","actualBoundingBoxAscent","actualBoundingBoxDescent","PADDING","renderText","previousDescent","fillText","renderBackground","textWidth","minRadius","radius","requiredTailHalfWidth","rectangleSides","topLeft","topRight","rightTop","rightBottom","bottomRight","bottomLeft","leftBottom","leftTop","getRectangleSidesCoordinates","tail","tailRoot","tailTip","getTailCoordinates","tailDirection","topLeftCorner","topRightCorner","bottomLeftCorner","bottomRightCorner","topSide","rightSide","bottomSide","leftSide","noTail","getTailToSideIntersection","lineJoin","arcTo","tailLineToTopLineIntersection","tailHalfWidth","tailLineToRightLineIntersection","tailLineToBottomLineIntersection","tailLineToLeftLineIntersection","renderCallout","renderBorder","tailP1","distance","pointOffsetX","pointOffsetY","tailP2","polygon","Curve","x3","y3","drawQuadraticCurve","curve","Bezier","cp1x","cp2x","cp1y","cp2y","project","d","Ellipse","getCoordinates","centerLeftX","centerLeftY","centerRightX","centerRightY","boundingPointKeys","bottomCenterX","bottomCenterY","bezierCurveTo","bottomRightX","bottomRightY","topRightX","topRightY","topCenterX","topCenterY","topLeftX","topLeftY","bottomLeftX","bottomLeftY","rotationAngle","atan","radiusX","radiusY","width_two_thirds","dx1","dy1","dx2","dy2","RotatedRectangle","getRectCoordinates","coords","mx1","mx2","my1","my2","nk","dx","sqrt","dy","x4","y4","SymbolElement","sx","getRotatedCoordinates","scaleX","sy","textHeight","scaleY","symbol","xScale","yScale","xOffset","yOffset","rotate","cx","cy","halfHeight","defaults","drawingToolsByType","arrow","brush_v1","callout_v1","elliottWaves","ellipse","ellipse_v1","fibonacci","horizontalLine","measure","pitchfork_v1","rectangle","rotatedRectangle","rotatedRectangle_v1","scaledLine","scaledText","symbolElement","triangle","verticalLine","xabcd","obj","xPointKeys","positionTimestamps","positionX","_this$model$chartEven","_this$model2","_this$model$elements","_this$model3","findByAttribute","__","getIsPaneSelection","_this$model$elements$","attrsSubset","customizer","objValue","srcValue","mergewith","defineProperty","globalAlpha","thumb","startEditing","pointPoitionsFromTimestamp","timestamp","getIsVisible","replaceMyself","captureMessage","oldElement","newElement","isCreatorDialogOpen","release","_this$attrs$visibilit","micro","macro","MicroMacroTimeframe","indexOf","timeframesToSet","attrsToSet","assign","getIsInChartView","ElliottWaves","positionWavesTimestamps","waves","wave","getOffsetFromLineWidth","TextBaseline","TextAlign","EllipseV1","rotationAxisPoint","pointToRotate","oldLinePoint","newLinePoint","sharedPoint","rotatedPoinCoordinates","getEllipsePoints","P2","P4","coordinates","P3","P1","CP4","CP1","CP2","CP3","ellipsePath","inverted","cursorTargetX","cursorTargetY","perpendicularPoint","lineCenterX","lineCenterY","invertX","invertY","perpendicularPointEllipseOffsetX","perpendicularPointEllipseOffsetY","P1WithOffsetX","P1WithOffsetY","P3WithOffsetX","P3WithOffsetY","controlPointOffsetX","controlPointOffsetY","newLeftPoint","leftRotatedCursorPoint","getRotatedPointCoordinates","newRightPoint","rightRotatedCursorPoint","FibonacciRetracements","parseCoefficients","coefficients","parsed","trim","getMaxCoefficientUnscaledY","heightScaled","toFixed","splice","maxCoefficientY","HorizontalLine","ScaledLine","updateDecimalPlaces","decimalPlaces","repeat","renderLabels","Line","strokeStyle","dashLength","setLineDash","Measure","volume","roundedX1","roundedX2","minIndexLimit","maxIndexLimit","volMinIndex","volMaxIndex","volumeSum","volumeIndex","numberToStringWithUnitsSuffix","x1Dif","x2Dif","startingX1","startingX2","fillRect","priceDif","heightStr","getRoundedString","number","numOfDecimalPlaces","baseX","baseY","getHeight","getVolumeSumString","addToCoordinates","difs","newX1","newX2","paneArea","getEdgeIntersectionPoint","sides","rayOrigin","rayDirection","intersection","intersectionDistance","rayToLineIntersection","getPitchforkCoordinates","rayDirectionControlPoint1","rayDirectionControlPoint2","trend1","trend2","chartVisibleAreaLeftX","chartVisibleAreaRightX","chartVisibleAreaBottomY","chartVisibleAreaTopLeftPoint","chartVisibleAreaTopRightPoint","chartVisibleAreaBottomLeftPoint","chartVisibleAreaBottomRightPoint","getChartVisibleAreaBoundaries","medianRay","trend1Ray1","trend2Ray1","trend1Ray2","trend2Ray2","medianRayDirectionPoint","rayOriginToRayDirectionVector","rayDirectionControlPoint1ToPoint2Vector","normalizedRayDirectionControlPoint1ToPoint2Vector","medianRayDirectionPointToRayDirectionControlPoint1Distance","trend1Ray","getTrendRayCoordinates","medianToControlPointDistance","normalizedControlToControlPointVector","trendRay1","trendRay2","trend2Ray","medianToTrendLineDistance","trendRayPoint1Origin","trendPoint2RayOriginPoint2","trendRayPoint1DirectionPoint","trendPoint2RayDirectionPoint","Pitchfork","median","_trendLines$filter$","trendLines","line1","line2","trendLine","trendLineIndex","solidTrendColor","getHEXWithSpecificAplha","nextTrendLine","outerTrendLines","Polygon","isPolygon","_this$attrs$points$la","_this$attrs$points$la2","scaledPoints","targetY","stopY","centerY","stopBaseline","targetBaseline","targetColor","stopColor","targetDif","targetPerc","targetStr","stopDif","stopPerc","stopStr","middle","middle1","roundDif","coordType","coordIndex","Rectangle","strokeRect","RotatedRectangleV1","newMiddleLeftPoint","middleLeftRotatedCursorPoint","newMiddleRightPoint","middleRightRotatedCursorPoint","ScaledText","rect","propKey","f","_obj$font","testArea","convertArea","rawHight","_border$width","borderWidth","borderColor","thumbWidth","getThumbWidth","Triangle","VerticalLine","XABCD","xx","xy","ax","ay","bx","by","retLabel","len","ret","xab","bcd","result1","getIsSSr","rendered","refresh","drawImage","cWidth","cHeight","sWidth","screen","sHeight","ChartMinWidthBreakpoints","getChartBreakpoints","chartWidthInPx","isXs","xs","isS","isM","m","isL","getDateString","dateString","getFullYear","getDate","getHours","padLeft","getMinutes","MONTHS","gray300","tailwindColors","BaseChart","overlaysByType","getNumOfBarsBuffer","isLargeChart","overlayDefinition","addOverlay","renderYAxis","setupCache","renderOverlaysLabels","handleIndicatorsChange","mouseModelChangeHandler","mouseModel","baseCache","updateShouldRenderVolume","renderChart","renderChartNotAvailable","getIsRedesignedChart","renderTicker","clip","renderVolume","renderOverlays","renderPrevClose","renderFadeExtendedHours","renderGrid","renderXAxis","tickerText","margin","FONT_SIZE","OFFSET","baseline","renderTimeframe","_ChartSettings$left$t","volumeFY","range","getTimeframeLabel","textSecondary","tickerWidth","renderChange","lastOhlc","getOHLC","directRender","changePercentage","lastDate","renderOHLC","isSmallIndexChart","isNewestOHLC","high","low","afterHour","isFinite","roundOhlc","lastVolume","toLocaleTimeString","hour","minute","getRoundedLastData","lastOpen","lastHigh","lastLow","renderOverlaysLabelsChartsPage","renderOverlaysLabelsQuotePage","overlayLabel","isRenderedOverlaysLabel","labelSpacing","getLabelColor","getYAxisLeftMargin","getYAxisLastCloseLabel","firstVisibleClose","getPercentageFromValue","base","contentHeight","lineTicks","textTicks","lastCloseLabel","getTranslate","do","tickCount","minMax","placesAxis","stepPrice","minPerc","maxPerc","d3","nice","ticks","tick","getValueFromPercentage","pixelGap","negativeScale","previousNegativeTick","unshift","positiveScale","getYLineText","yTickText","axis","yTickLine","getYLine","resetYTicksStyles","percentageZeroLineText","undo","renderYAxisLabel","yCoordinate","getSecondaryLabelBackgroundColor","stringifyHSVAColor","getHSVAFromColor","currentBackground","getYAxisSecondaryLabelYCoordinate","_padding$top","_padding$bottom","mainLabelValue","secondaryLabelValue","LINE_HEIGHT","mainLabelValuePosition","secondaryLabelValuePosition","offsetedY","currentText","getDrawDays","render15MinXAxis","renderIntradayXAxis","renderIntradayXAxisFutures","renderDailyXAxis","renderWeeklyXAxis","renderMonthlyXAxis","isXPointVisible","buffer","renderXAxisLabels","_ref9","labels","textRenderer","allowedOverflow","sortedLabels","renderedLabelRanges","reverse","newLabel","hasPriority","_ref10","halfOfTextWidth","overflowLeft","overflowRight","labelX","minX","maxX","getIsOverlapping","interval","IntradayTimeframeInterval","marketStartHour","marketStartMinutes","marketEndHour","ceil","aftermarketLengthMinutes","xLine","getXLine","dayToOffset","getDayToOffset","dayIndex","dateFromDateString","drawMinutesPerDay","roundedX","premarketLengthMinutes","lastDay","lastHours","hours","indexOffset","getBarsInDay","lastMonth","gridSecondary","isYearLabel","substring","lastYear","isJanuary","shouldRenderVolume","getIsIndicatorPresent","getVolumeTicks","fontHeight","renderVolumeAxis","relativeVolume","grid","rangeMax","volumeAxisFontSize","volumeAxis","format","tickFormat","domainFrom","domainTo","setupAxisTimeFrame","halfBarWidth","getHalfBarWidth","barWidthWithoutMargin","getBarWithoutMarginWidth","drawInVisibleArea","drawBarCallback","volumeTrendDown","volumeTrendUp","isRendered","contentWidth","getRoundDecimalPlaces","price","getPlacesLastClose","onRenderCrossText","conditionalCursor","getDataByCrossIndex","crossIndex","shouldReturnRoundedString","getDataByBarIndex","getCrossIndexChange","_this$data$close$cros","_this$data$close","crossDataIndex","getDataIndexByBarIndex","crossClose","previousClose","getTickerChangeFromCloseValues","anchorClose","dateByBarIndex","virtualTradedDates","getVirtualTimeframeTradedDates","dateStart","dateEnd","_ref11","change","isOffscreen","isGroupInstrument","changeText","percentString","getChangeColor","changeWidth","afterChangeText","afterChangeTextWidth","oneLineAHChangeWidth","afterChange","renderOHLCChartsPage","renderOHLCQuotePage","_ref12","chartBreakpoints","OhlcText","canvasFill","dateElements","trendColor","oElements","hElements","lElements","cElements","volElements","changeElements","getFlatLineArrayWithSpaces","lineElements","startX","lineElement","LabelsText","numberOfNewOhlcLines","_ref13","OHLCType","lineTopY","OHLCFontSize","centerXOffset","leftXOffset","OHLC","ohlcString","singleLine","OHLC_TEXT","getOHLCType","ohlcSettings","getOHLCSettings","CHART_MARGIN","alignTop","renderOHLCToCanvas","_ref14","ohlcSet","isSingleLineWithChange","n0","n1","x0","premarketFade","aftermarketFade","shouldShowPrevClose","isIntradayWithPreMarket","TIMEFRAMES_WITH_PRE_MARKET","isIndexChart","Cache","getIsMobileChartPage","setupAxis","_utils$max","volumeHeight","volumes","addMarginBottom","marginBottom","setOverlays","removeOverlay","MAX_VALUE","MIN_VALUE","start","end1","asc1","placesLastClose","barFillWidth","barBorderWidth","getBarWidthWithMarginByParts","priceAbs","hasOverlay","getCandleLikeChartsRenderingColors","colors","overwrittenColors","getColorOverwrites","overwrittenColorKeys","hasOverwrittenCandleColor","colorKey","getShouldUseDarkerWickColors","totalBarWidth","darkerWickColors","thinBarColorsOverride","CandleStick","getRenderChartBarProps","chartSettingsColors","hasFillAndBorder","trendDown","trendUp","borderDown","borderUp","wickDown","wickUp","wickColor","barFillColor","shouldRenderFillAndBorder","translateForWick","WICK_WIDTH","candleBodyHigh","candleBodyLow","candleWickHigh","candleWickLow","candleBodyHeight","candleBodyLeftX","halfBorderWidth","isBodyHeightGreaterOrEqualBorders","isWickLineCandleLessThanOnePixel","hasBorder","fillHeight","hasFill","HollowCandleStick","isHollow","generalTrendColor","ohlcTrendUp","ohlcTrendDown","zeroChange","HeikinAshi","haData","getHeikinAshiData","getLastValues","originalLatestClose","heikinLatestCloseLabel","originalLatestCloseLabel","_haData$close$barInde","_haData$close","LineChart","redLine","greenLine","MarketSentiment","MarketSentimentSettings","_data","lastIndex","_dataLastIndex","renderLineBullBear","oversold","overbought","isRedesign","marketDown","marketUp","_compute","computeVisibleMinMax","yLine","fillUp","fillDown","MultiLineChart","ColorsSettings","getQuotes","end","asc","_this$data$getDataByB","maxTickerLength","isLastDate","tickersDimensions","closeValue","_len","arrays","_key","_this$data","OHLCChart","barWithoutMarginWidth","lineThickness","handleLengthFromWick","lineOffset","barX","PerfChart","overlayLabelWidth","perf","shouldRenderDate","tickerData","MARGIN","percentageText","lastCrossIndex","_d3$max","fromDate","toDate","filteredQuotes","closes","daysCount","end2","asc2","monthsInData","availableTickSpots","monthsToAvail","renderMonth","chartsByType","candleStick","heikinAshi","hollowCandleStick","lineChart","marketSentiment","multiLineCharts","ohlcChart","perfChart","XXS","XS","S","M","L","XXL","XXXL","XXXS","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","OverlayType","ChartEventDbType","ChartEventType","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","ASC","DESC","i1","i2","i3","i5","i10","i15","i30","h2","h4","DateRangeType","TIMEFRAME_SECONDS","w","CRYPTOS","BTCUSD","LTCUSD","ETHUSD","XRPUSD","BCHUSD","BTCEUR","LTCEUR","ETHEUR","XRPEUR","BCHEUR","LTCBTC","ETHBTC","XRPBTC","BCHBTC","QuotePollingIntervalInMs","ScaleLabel","Linear","Percentage","Logarithmic","INDICATOR_LABEL_HEIGHT","FREE_DATE_RANGES","minutes","days","weeks","prev","curr","PREMARKET_AFTERMARKET_HOURS","_chartLayoutModel$spe","useNotification","setIsFetching","dateFromUnixTimestamp","generatePathForTimeframeDateRange","timeframeUtm","getTimeframeGroupsWithHref","generatePath","timeFrame","getDateRangeGroupsWithHref","dateRangeState","getVisibleBarsNumber","getChartStartEndDates","timeoutInMs","unwatchedChartLayoutModel","hasSyncedTimeframe","ChartSyncablePart","syncChartParts","hasSyncedTicker","_decodedSearch$t","urlTimeframes","urlDateRanges","chartsArrayPlaceholder","_urlTickers$index","currentTicker","timeframes","_urlTimeframes$index","currentTimeframe","_urlDateRanges$index","currentDaterange","sidebar","getTimeframeGroups","timeFrameGroup","QuoteUrlChartTypes","cs","candlesticksimple","o","ha","hc","badgeImages","getSvgImageCacheKey","getChartEventBadgeImage","badgeState","svgHTML","img","Image","encodeURIComponent","cacheEventBadgeSvg","getChartEventEarningSvgString","isFuture","outerStroke","innerStroke","innerFill","textFill","getChartEventBadgeColors","getChartEventBageColors","exdate","hasEarningsDateSuffix","parsedDate","formattedDate","formatDateToStringUS","suffix","numberString","bigNumber","BIG_NUMBER_VALUES","wholeNumber","decimalNumber","formattedDecimalNumber","light","twColors","hover","dark","CustomDateRangePrefixEnum","DATE_RANGE_PREFIX_DELMITER","getParsedDateRange","startInSec","getTime","endInSec","lastQuoteDateIndex","lastVisibleBarIndex","firstVisibleBarIndex","quoteDate","isQuoteDateInRange","numOfBarsOffset","getChartZoomAndLeftOffset","numOfBarsToRender","numberOfBarsToDraw","daysInQuote","getDaysInQuote","dateRangePrefix","dateRangeValue","Range","dateFromString","dateToString","dateFrom","dateTo","Prev","years","parseCustomDateRangeUrlParam","convertLocalToNyTime","setHours","startDateIndex","numOfBarsInView","getFullChartWidth","hasAftermarket","hasPremarket","timeframeMinutes","barWidthWithMargin","marketMinutesLength","getIntradayChartConfig","fullChartWidth","offsetInPx","shouldCropChart","chartWidthWithOffset","offsetChartAfter","shouldAlignDaysToLeft","drawDaysInOneChart","_lastQuoteDate$getHou","lastQuoteDate","barsToOffset","offsetChartInPx","_quote$open","isStockIntraday","isQuoteOrOffscreen","isChartsInradayDateRange","getShouldOffsetChartDomain","scaleType","handleDomainOffset","currentScale","scaleCreator","protectedHeightPx","minPx","extendedMin","rounded","fromEntries","_ref15","_numOfDaysToRender","_quote$getBarsInDay","parsedRange","startQuoteDate","endQuoteDate","numOfDaysToRender","_reversedDaysInQuote$","_reversedDaysInQuote$2","reversedDaysInQuote","startQuoteDayIndex","endQuoteDayIndex","renderDateStart","renderDateEnd","getParsedDateRangeMetaData","_ref16","shouldRenderCross","DEFAULT_CONTEXT","getInstrumentLabel","getResponseChartType","chartType","chartResponseType","tr","multiplier","ChartEvent","getChartEventModel","getXYPosition","_chartEventModel$yInd","chartEventModel","yIndex","_this$model$chart$quo","isOpenOverride","isCurrentEventActive","scaledArea","Earnings","_this$getChartEventMo","eventItem","chartEventsByType","dividends","earnings","canvasElements","indicatorsByType","elementType","Thousand","Million","Billion","Trillion","BIG_NUMBER_ZEROES","BIG_NUMBER_SUFFIX","dotProduct","crossProduct","pow","lineEquation","k","pointInPolygon","j","oddNodes","distanceToLine","distanceToSegment","l2","getInstrumentDecimalPlaces","formatBigNumber","minNumber","absNum","getString","zeroes","str","splitString","addZeroes","padEnd","numberByZeroesCount","isInteger","perpendicularPointToLine","yAxisCoeficient","xAxisCoeficient","radAngle","rotatedPointCoordinates","sharedPointLinesAngle","twoSegmentLinesIntersection","p3","p4","denominator","ua","ub","checkLineIntersection","line1_p1","line1_p2","line2_p1","line2_p2","onLine1","onLine2","numerator1","numerator2","getRayToLineSegmentIntersection","rayEnd","segmentStart","segmentEnd","lineIntersection","subtractPoints","getMiddlePointOnLineSegment","normalizeVector","v","multiplyVectorByScalar","scalar","addPoints","enabled","collapsed","logErrors","withStackTrace","logger","console","filterChanges","errorTransformer","titleFormatter","took","parts","nextState","pad","times","printLogEntry","logEntry","startedTime","formattedTime","getSeconds","getMilliseconds","titleCSS","headerCSS","formattedTitle","groupCollapsed","group","styles","trace","groupEnd","initialize","protoModelLoad","started","attributes","returnedValue","apply","ChartEventElement","belongsTo","_this$instance$model$","stockEvent","Indicator","Overlay","hostname","periodInt","getParsedIntegersFromPeriodString","INDICATOR_DEFAULT_DOMAIN","compute","renderIndicator","getIsChartPageSpecificFunctionality","renderLabel","isComputeNecessary","shouldUpdate","tickTextStep","formatAxis","maxY","valueY","lastValue","_IndicatorSettings$ri","_IndicatorSettings$ri2","_IndicatorSettings$ri3","_IndicatorSettings$ri4","_IndicatorSettings$ri5","_IndicatorSettings$ri6","_IndicatorSettings$ri7","_IndicatorSettings$ri8","indicatorCurrentText","indicatorCurrentBackground","renderLabelChartsPage","renderLabelQuotePage","indicatorLabel","labelWidth","ctx","roundedRect","isPerfIndicator","renderCrossTextChartsPage","renderCrossTextQuotePage","renderOversoldOverbought","zero","drawLines","clipHeight","drawInVisibleAreaProps","fromIndexOffset","renderZeroLine","tickStep","newAttrs","parsePeriodInt","setModel","getDomainDefaults","inputsErrorMessages","getIsValid","getIsNumberInputValid","integerOnly","isPositiveInteger","ADX","_this$adx$last","adx","amdm","apdm","mdi","pdi","atr","deltaHigh","deltaLow","pdm","mdm","di","_this$period","COLORS","Aroon","aroonUp","aroonDown","startAt","highPeriod","highestInPeriod","periodSinceHigh","lowPeriod","lowestInPeriod","periodSinceLow","textLabels","labelSetting","AroonOscillator","_this$oscillator$last","oscillator","ATR","_this$atr$last","AverageTrueRange","CommodityChannelIndex","_this$cci$last","smaCount","tp","cci","smaSum","devCount","typicalPrice","sma","devSum","dev","COT","cotQuoteCode","cot","commercialHedgers","largeTraders","smallTraders","units","renderAdditionalLabels","secondarylabelX","fontSettings","secondarylabel","ForceIndex","_this$fi$last","fi","ema","EMA","MACD","fastPeriod","slowPeriod","signalPeriod","_this$macd$last","macd","signal","histogram","ema1","ema2","ema3","signalLine","_this$fastPeriod","_this$slowPeriod","_this$signalPeriod","MFI","_this$mfi$last","negativeMoneyFlow","mf","mfi","prevTypicalPrice","positiveMoneyFlow","moneyFlow","oldMF","None","OBV","_this$obv$last","obv","currentObv","PricePerformance","getTickers","chartUuid","hasCachedData","getTickersAndTimeframe","firstFetchCalled","_this$model$scaleRang","_this$model$scaleRang2","_this$model$scaleRang3","_this$model$scaleRang4","firstBarTime","lastBarTime","dateToIndex","getDateToIndex","perfArrays","iterable","_this$quotes","_this$quotes2","_this$quotes3","crossIndexTickerTimeStamp","tickerDateToIndex","tickerPerformance","indicatorLabelWidth","performanceIndicatorLabel","_this$quotes4","_tickerQuote$close$le","isVertical","labelBottom","canFitItemsVertically","tickerQuote","maxCrossIndex","_this$quotes5","_this$quotes6","tickerTextWidth","crossText","getSanitizedTicker","RMI","momentum","_this$rmi$last","rmi","u","ad","au","sumu","sumd","rs","_this$momentum","ROC","_this$roc$last","roc","RSI","_this$rsi$last","rsi","DEFAULT_PARAMETERS","RelativeVolume","baseLine","periodStr","parsePeriod","_this$rvol$last","rvol","baseLineY","_this$baseLine","RWI","rwiHi","rwiLo","trSum","atrWeight","maxHi","maxLo","Stochastics","kPeriod","dPeriod","_this$k$last","dCount","dSum","k1","kSum","kCount","highestHigh","lowestLow","_this$kPeriod","_this$dPeriod","StochasticsFast","StochasticsSlow","Trix","_this$trix$last","trix","UltimateOscillator","period1","period2","period3","_this$ult$last","bpSum2","bpSum3","count2","count3","trSum2","trSum3","ult","bp","avg2","avg3","bpSum1","trSum1","count1","avg1","_this$period2","_this$period3","Volume","_this$data$volume$las","WilliamsR","_this$r$last","none","aro","aroosc","rwi","stofa","stofu","stosl","vol","wr","paddingValue","_callbackCache","getContext","_cache","_restore","CanvasRenderingContext2D","that","cb","record","fkey","newCb","origCb","getWatchedPropValue","watchedProp","spineObject","getIsSpineObject","hasToObject","getJSONReplacerFunc","getWatchedProps","getAreWatchedPropsEqual","currentValue","previousValue","DEFAULT_SPINE_EVENTS","DefaultSpineEvents","stringifiedOptions","useForceUpdate","watchedPropertiesRef","handleModelChange","_watchedPropertiesRef","isArray","spineEvents","hasMany","getChartElement","getChartType","_this$getChartElement","defaultRefreshInterval","customRefreshInterval","omitKeys","_this$quote","getIsScrollable","_this$quote$COTs","perfQuotes","quotePerfTickers","_this$getChartElement2","_paneProperties$eleme","_paneModel$mainElemen","chartOrIndicator","attrsInSync","ChartPartToAttrsSyncMap","modelAttr","hasOwnProperty","chartParts","isInSync","chartPart","_hasOverlay","_this$quote$getRawTic","_this$quote2","shouldClear","allChartEvents","Ticker","Timeframe","Crosshair","drawingsInternalStoreModel","_this$syncChartParts$","_this$syncChartParts","chartPartsToSync","newSyncedChartParts","_this$syncChartParts2","_this$charts$first","_this$idea$id","_this$idea","largeChartFontSize","fontSize","CHART_FORMAT","getChartSettings","chartFormat","BE_SMALL_CHART_WITHOUT_OVERLAYS","chartLightTheme","chartDarkTheme","tickerTimeframeChangeHeight","indicatorLightTheme","indicatorDarkTheme","generalColors","elementLightTheme","elementDarkTheme","BE_SMALL_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS","BE_SMALL_CHART_WITH_OVERLAYS","BE_SMALL_CHART_WITH_OVERLAYS_CHART_SETTINGS","BE_LARGE_CHART_WITHOUT_OVERLAYS","BE_LARGE_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS","BE_LARGE_CHART_WITH_OVERLAYS","BE_LARGE_CHART_WITH_OVERLAYS_CHART_SETTINGS","INTERACTIVE","INTERACTIVE_CHART_SETTINGS","normalizeHexAlpha","hexString","customColors","customColorKeys","defaultColors","crossTextBackground","negativeChange","overlayTransparentBackground","positiveChange","_attrs$elements","_attrs$instanceUUID","_attrs$latestLocalUpd","_attrs$latestRemoteUp","_attrs$autoSaveState","newAutoSaveState","_elementAttrs$element","_this$generateUuid","generateUuid","_elementAttrs$zIndex","getElementZIndexRange","oldInstance","pane_id","clonedObj","cloned","moveToZIndex","currentZIndex","directionCoef","newZIndex","elementsBelowZero","elementsAboveZero","getBelowAboveZeroElements","changeElementZIndexes","elementsArray","addElement","oldZIndex","isBelowZero","_this$instance","_this$instance2","isOverlay","_this$instance3","_this$instance4","_this$instance5","_this$instance6","refreshElementId","_this$generateUuid2","MARKET_START","END_OF_DAY","roundTimeForSyncedPane","sourceChart","targetChart","dateToReturn","sourceChartHasPremarket","targetChartHasPremarket","setDate","lastDayOfMonth","lastDayOfWeek","weekStartsOn","endOfDay","getIsDateBeforeMarketStart","Mouse","_this$pane","_this$pane2","getIsCrossSyncOn","getIsMouseInChartOfPane","paneOfMouse","mouseInChart","currentPaneChart","mousePositionTimestamp","currentPanePositionX","_this$position$y","_this$position","_this$pane3","positionY","_this$pane4","getIndexInChart","mouse","CHART_EVENT_BADGE_TYPE_ORDER","chartEventElementModel","move","chartPanes","targetPane","currentChartPaneRecords","records","chart_id","ohterChartPaneRecords","targetRecordIndex","arrayWithoutTargetRecord","chartRecordIndex","panesAbove","panesBelow","getNumericId","isSorted","_this$getAllElements$","_this$mainElement","_this$mainElement2","resetHeight","allPaneElements","rebuildElementZIndexes","hoveredChartEvent","openedChartEvent","hoveredTypeChartEventElements","openedTypeChartEventElements","nonActiveChartEventElements","chartEventsOnSameXPoint","chartEvent_B","isOpened","isHoveredType","isOpenType","quoteCache","getCachedQuote","cachedAt","setCachedQuote","_quoteCache$cid","emptyQuote","numberOfRefreshChecks","is404","patternsMinRange","patternsMaxRange","dataId","tickerRaw","fetchFunc","shouldUseCache","select","doesQuoteAndFetchParamsMatch","isSameOrNoChartUuid","isNotEmptyQuote","isCacheAllowed","hasPatterns","doesQuoteAndOptionsMatch","getResolvedFetchingPromise","maxBars","tickersAndTimeframes","accumulator","err","QuoteFetchTypeUrlOption","fetchingPromise","getUrl","getIsAbortError","NotFoundError","shouldUseEmptyQuote","fetchRequest","_data$ticker","_data$patterns","_data$chartEvents","_this$numberOfRefresh","_this$numberOfRefresh2","noNewData","newQuoteData","lastTime","afterTime","AIndex","BIndex","mergeIndex","ADate","BDate","prevAIndex","prevDate","newDate","isSameWeek","isSameMonth","warn","thisDateLength","dataDateLength","load","atts","drawDays","getBarIndexes","barToDataIndex","_this$barIndex","_chartEvents$map","getChartEventsWithId","deleteCachedQuote","cachedHeikinAshiData","HAClose","heikAshiData","cachedDayToOffset","dateStringFromDate","yyyy","mm","dd","padStart","dataIndex","_quoteData$dataIndex","cachedDateToIndex","getTimestampFromPositionX","host","process","env","BE_API_URL","rev","clearData","colorsOverride","settingColors","_config$charts","isLight","getNormalizedZIndex","getFreeColor","periods","getRGBAValueFromValidColorString","BB_COLORS","TOP","BOTTOM","MIDDLE","BollingerBands","deviations","scaledTop","scaledBottom","firstBarToRender","lastBarToRender","stdDev","stdDevSum","upperBand","lowerBand","_this$attrs$period","_this$attrs$deviation","_this$attrs$topColor","_this$attrs$bottomCol","topColor","bottomColor","DonchianChannels","medianBand","_this$attrs$channelSt","_this$attrs$channelFi","_this$attrs$medianBan","strokeColor","channelStrokeColor","fillColor","channelFillColor","medianBandColor","ExponentialMovingAverage","_this$attrs$color","EMA2","HighLow","highColor","prevHigh","lowColor","prevLow","prevBar","_this$attrs$highColor","_this$attrs$lowColor","isPositiveFloat","Stroke","Fill","Conversion","Base","SpanB","conversion","spanB","IchimokuCloud","_this$data$barIndex$x","outsideBar","renderFull","spanAFillColor","spanAStrokeColor","spanBFillColor","spanBStrokeColor","baseLineColor","conversionLineColor","laggingSpanColor","conversionLine","senkouSpanA","senkouSpanB","conversionStartIndex","baseStartIndex","spanBIndex","highestHi","lowestLo","lastSpanAX","lastSpanBX","cloudStartingX","fxOverride","toIndexOffset","_this$attrs$conversio","_this$attrs$base","_this$attrs$spanB","_this$attrs$spanAStro","_this$attrs$spanAFill","_this$attrs$spanBStro","_this$attrs$spanBFill","_this$attrs$conversio2","_this$attrs$baseLineC","_this$attrs$laggingSp","IchimokuCloudFull","KeltnerChannel","emaPeriod","atrPeriod","middleLine","_this$attrs$emaPeriod","_this$attrs$multiplie","_this$attrs$atrPeriod","_this$attrs$strokeCol","_this$attrs$fillColor","Patterns","originalScale","barsInDay","aboveBelow","textHS","above","below","supportColor","resistColor","kind","_this$attrs$supportCo","_this$attrs$resistCol","SAR","maxStep","isLong","sar","ep","newHigh","newLow","af","sarToDraw","risingColor","fallingColor","_this$attrs$step","_this$attrs$maxStep","_this$attrs$risingCol","_this$attrs$fallingCo","customizable","SMA","SMA2","Supertrend","finalUpperBand","finalLowerBand","supertrend","uptrendColor","avg","downtrendColor","_this$attrs$uptrendCo","_this$attrs$downtrend","VP_COLORS","applyOpacityToColor","VolumeProfile","chartWidth","getFirstBarToRenderIndex","getLastBarToRenderIndex","upColor","downColor","_attrs$upColor","_attrs$downColor","minClose","maxClose","segment","segments","up","down","segmentIndex","isInSegment","volumeTrend","volumeFX","segmentHeightRaw","segmentHeight","upSegmentWidth","downSegmentWidth","_this$attrs$opacity","_this$attrs$upColor","_this$attrs$downColor","VWAP","cumulativePV","cumulativeVolume","second","vwap","datesAreOnSameDay","bb","dch","hilo","hline","ic","icf","kch","sma2","vp","arg","_len2","_key2","_len3","_key3","devicePixelRatio","getScaleRatio","referenceDate","dayNumber","monthIndex","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","addOffset","quoteDateTimeOffsetInMs","getQuoteDateTimestampOffsetInSeconds","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","bufferMinutes","dayOfWeek","currentDayMinutes","premarketMinutes","aftermarketMinutes","isWeekend","isClosed","setUTCSeconds","testTouchPoints","isMobileOs","navigator","userAgent","createEvent","match","msMaxTouchPoints","maxTouchPoints","matchesIPad","matchesIPhone","matchesIPod","re","RegExp","cookie","toUTCString","_document$fullscreenE","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","_element$requestFulls","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","_document$exitFullscr","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","fn","readyState","chartElementId","_box$width","_box$height","box","matchingPages","requestsAbortControllersCache","_requestsAbortControl","abortRequest","controller","cache","errorsCache","NUM_OF_RETRIES","ErrorSeverity","importWithRetry","retries","setIsError","handleError","handleScriptNotLoaded","renderScriptNotLoaded","medium","loadModule","cachedModule","mod","DAY_IN_SECONDS","TWO_MIN_IN_MS","virtualDatesCache","areTimestampsFromSameDay","ts1","ts2","ts1Utc","ts2Utc","getVirtualDatesCacheId","idRevision","setCachedVirtualDates","fromSeconds","toSeconds","virtualDates","virtualDatesCacheId","lastUsed","checkVirtualCacheSize","MAX_BAR_BORDER_WIDTH","MIN_BAR_MARGIN_WIDTH","MAX_BAR_MARGIN_WIDTH","settingsCenter","barMarginWidth","shouldRound","roundDecimalPlaces","DEFAULT_ZOOM_GUESS_INCREMENT","zoomFactorForBarsToDisplayCache","zoomFactorForBarsToDisplayCacheKeys","getZoomFactorFromCache","_zoomFactorForBarsToD","setZoomFactorToCache","poppedKey","defaultBarWidthWithMargin","zoomIncrement","finalZoomFactor","iteration","barWidthDiff","getTimeframeSeconds","lowerIndex","dates","upperIndex","isWithinRangeOfQuoteDate","commonVirtualCacheProps","cachedDates","virtualDateSeconds","getCachedVirtualDates","timeframeSeconds","firstDate","numOfDatesBefore","numOfDatesAfter","virtualTradedDays","dateStartSeconds","dateEndSeconds","datesSeconds","isStartBeforeDates","isEndAfterDates","dateTime","getVirtualTradedDays","marketStartSeconds","barTimeframeSeconds","quoteDatesTimestampOffset","dayStartSeconds","barSeconds","virtualTimeframeTradedDates","isLowerBounded","isOneBeforeLowerBoundStarts","lastDateIndex","isLookingBack","averageBarDate","numOfSecondsOutOfBounds","_perfIndicatorElement","_perfIndicatorElement2","perfIndicatorElement","getPerfIndicatorTickerAndTimeframes","_ref17","getCrossIndexForPane","getShouldRenderCrossInPane","getPriceForPane","isXAxisInView","domainRange","priceFy","YAxisLeftMargin","getCrossText","_getRoundDecimalPlace","firstBarClose","_ref18","_ref19","_ref20","changePercent","changePercentString","_ref21","isForexFuturesCryptoPage","_ref22","isForexFuturesCrypto","isOffscreenChartWithNarrowBars","isQuoteChartWithNarrowBars","hasSidebarEnabled","_ref23","hexStringToRGBA","hexColor","removeHashSymbol","g","rgbaToHexString","alpha","alphaToHex","rgbaToHSVA","hsvaToRGBA","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","strColor","allowAlpha","getIsRgb","rgbKeys","output","canSelectAlpha","hsvaToHEXString","_barToDataIndex$Math$","object","formData","append","FormData","statusCode","throwOnPredicate","credentials","responseContentType","Html","responseData","ApplicationJson","ApplicationJsonUTF","FormUrlEncoded","parseResponseForContentType","status","getStatusCodeError","forceUpdateKey","increment","precision","periodString","part","exception","captureContext","parsedNumber","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","visited","WeakSet","toLocaleDateString","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","getRandomValues","Uint8Array","two","local","remote","isMountedRef","DateFns","ReactRouterDOM"],"sourceRoot":""}