{"version":3,"file":"main.js","mappings":"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C,EAAK,IAAK,KAEVD,EAAO,GAC/B,OAAIslB,GAAK,GACA,GAKLA,GADiB,MAET,QAGEA,EAAIA,GAFL,QAEaA,EADd,SACuB,MAEtB,QAECA,EADF,SACW,GAEzB,CACD,CA3nBD,CAAiB/oB,IAAM3I,EAAA2I,OAANA,EAAM,uLCTvB,MAAAizC,EAAAnZ,EAAA9gC,EAAA,QACAk6C,EAAApZ,EAAA9gC,EAAA,QAKA3B,EAAA83B,SAAA,MACS,aAAOgkB,GACZ,OAAOF,EAAAlhB,OACT,CAEO,eAAO3C,GACZ,MAAMgkB,EAA0B,oBAAX7sC,QAA0BA,OAAOhB,SAASiM,KAAK6hC,UAAUrgB,SAAS,QAAU,OAAS,QAC1G,OAAOkgB,EAAAnhB,QAAeqhB,EACxB,2GCbF,MAAAE,EAAAt6C,EAAA,OACMu6C,EAAuB,IAAI/1C,IAAI,CACnC,qBACA,uBACA,yBACA,0BACA,2BACA,gCACA,yBACA,yBACA,0BACA,6BACA,2BACA,sBACA,kBACA,qBACA,mBACA,sBACA,wBACA,mBACA,8BACA,4BACA,4BACA,6BACA,2BACA,6BACA,mBACA,sBACA,oBACA,uBACA,8BACA,oBACA,iBACA,oBACA,kBACA,qBACA,kBACA,4BACA,2BACA,mBACA,oBACA,+BACA,uBACA,oBACA,sBACA,yBACA,kBACA,qBACA,wBACA,mBACA,6BACA,sCACA,4CACA,sBACA,mBACA,iBACA,oBACA,2BACA,kBACA,6BACA,oBACA,yBACA,gBACA,uBACA,yBACA,4BACA,0BACA,6BACA,6BACA,oBACA,eACA,yBACA,gBACA,mBACA,iBACA,oBACA,sBACA,2BACA,iBACA,2BACA,6BACA,0BACA,0BACA,0BACA,oCACA,gBACA,2BACA,0BACA,kBACA,qBACA,wBACA,mBACA,sBACA,qBACA,mBACA,sBACA,wBACA,mBACA,mBACA,sBACA,uBACA,8BACA,qBACA,sBACA,uBACA,yBACA,sBACA,8BACA,oBACA,oBACA,kBACA,kBACA,mBACA,sBACA,6BACA,uBACA,6BACA,wBACA,gBACA,0BACA,mBACA,yBACA,oBACA,8BACA,8BACA,iBACA,oBACA,uBACA,4BACA,4BACA,0BACA,6BACA,0BACA,oCACA,wBACA,2BACA,yBACA,6BACA,oCACA,uBACA,qBACA,sBACA,yBACA,4BACA,oBACA,uBACA,2BACA,6BACA,wBACA,2BACA,oBACA,qBACA,wBACA,0BACA,+BACA,oBACA,8BACA,oBACA,+BACA,2BACA,iBACA,2BACA,gBACA,mBACA,cACA,iBACA,uBACA,0BACA,oBACA,+BACA,sBACA,2BACA,wBACA,yBACA,sBACA,wBACA,yBACA,0BACA,qBACA,yBACA,yBACA,8BACA,mBACA,uBACA,wBACA,qBACA,+BACA,mBACA,oBACA,cACA,oBACA,yBACA,oBACA,uBACA,qBACA,uBACA,cACA,oBACA,2BACA,sBACA,mBACA,sBACA,oBACA,uBACA,kBACA,sBACA,6BACA,6BACA,wCACA,uBACA,0BACA,wBACA,0BACA,2BACA,4BACA,yBACA,2BACA,4BACA,0BACA,qBACA,wBACA,8BACA,0BACA,2BACA,kCACA,2BACA,4BACA,gCACA,iCACA,8BACA,kCACA,iBACA,kBACA,4BACA,0BACA,qBACA,sBACA,yBACA,gCACA,sBACA,qCACA,aACA,gBACA,cACA,iBACA,wBACA,cACA,gBACA,iBACA,oBACA,kBACA,wBACA,mBACA,0BACA,6BACA,kCACA,2BACA,uBACA,6BACA,+BACA,6BACA,uCACA,0CACA,0CACA,6BACA,gCACA,qCACA,wBACA,mBACA,mBACA,uBACA,qBACA,wBACA,qBACA,kBACA,kBACA,qBACA,wBACA,sBACA,wBACA,gBACA,mBACA,iBACA,wBACA,cACA,gBACA,4BACA,+BACA,0BACA,6BACA,oCACA,oBACA,6BACA,oCACA,8CACA,wBACA,cACA,iBACA,oBACA,kBACA,wBACA,2BACA,4BACA,2BACA,8BACA,+BACA,iCACA,uBACA,+BACA,sBACA,oBACA,0BACA,mBACA,uBACA,0BACA,wBACA,6BACA,wBACA,2BACA,yBACA,4BACA,wBACA,kBACA,qBACA,mBACA,sBACA,WACA,iBACA,eACA,wBACA,oBACA,qBACA,kBACA,yBACA,yBAGIg2C,EAAuB,IAAIh2C,IAAI,CACnC,qBACA,uBACA,yBACA,0BACA,2BACA,gCACA,yBACA,yBACA,0BACA,6BACA,2BACA,sBACA,kBACA,qBACA,mBACA,sBACA,wBACA,mBACA,8BACA,4BACA,4BACA,6BACA,2BACA,6BACA,mBACA,sBACA,oBACA,uBACA,8BACA,oBACA,iBACA,oBACA,kBACA,qBACA,kBACA,4BACA,2BACA,mBACA,oBACA,+BACA,uBACA,oBACA,sBACA,yBACA,kBACA,qBACA,wBACA,mBACA,6BACA,sCACA,4CACA,sBACA,mBACA,iBACA,oBACA,2BACA,kBACA,6BACA,oBACA,yBACA,gBACA,uBACA,yBACA,4BACA,0BACA,6BACA,6BACA,oBACA,eACA,yBACA,gBACA,mBACA,iBACA,oBACA,sBACA,2BACA,iBACA,2BACA,6BACA,0BACA,0BACA,0BACA,oCACA,gBACA,2BACA,0BACA,kBACA,qBACA,wBACA,mBACA,sBACA,qBACA,mBACA,sBACA,wBACA,mBACA,mBACA,sBACA,uBACA,8BACA,qBACA,sBACA,uBACA,yBACA,sBACA,8BACA,oBACA,oBACA,kBACA,kBACA,mBACA,sBACA,6BACA,uBACA,6BACA,wBACA,gBACA,0BACA,mBACA,yBACA,oBACA,8BACA,8BACA,iBACA,oBACA,uBACA,4BACA,4BACA,0BACA,6BACA,0BACA,oCACA,wBACA,2BACA,yBACA,6BACA,oCACA,uBACA,qBACA,sBACA,yBACA,4BACA,oBACA,uBACA,2BACA,6BACA,wBACA,2BACA,oBACA,qBACA,wBACA,0BACA,+BACA,oBACA,8BACA,oBACA,+BACA,2BACA,iBACA,2BACA,gBACA,mBACA,cACA,iBACA,uBACA,0BACA,oBACA,+BACA,sBACA,2BACA,wBACA,yBACA,sBACA,wBACA,yBACA,0BACA,qBACA,yBACA,yBACA,8BACA,mBACA,uBACA,wBACA,qBACA,+BACA,mBACA,oBACA,cACA,oBACA,yBACA,oBACA,uBACA,qBACA,uBACA,cACA,oBACA,2BACA,sBACA,mBACA,sBACA,oBACA,uBACA,kBACA,sBACA,6BACA,6BACA,wCACA,uBACA,0BACA,wBACA,0BACA,2BACA,4BACA,yBACA,2BACA,4BACA,0BACA,qBACA,wBACA,8BACA,0BACA,2BACA,kCACA,2BACA,4BACA,gCACA,iCACA,8BACA,kCACA,iBACA,kBACA,4BACA,0BACA,qBACA,sBACA,yBACA,gCACA,sBACA,qCACA,aACA,gBACA,cACA,iBACA,wBACA,cACA,gBACA,iBACA,oBACA,kBACA,wBACA,mBACA,0BACA,6BACA,kCACA,2BACA,uBACA,6BACA,+BACA,6BACA,uCACA,0CACA,0CACA,6BACA,gCACA,qCACA,wBACA,mBACA,mBACA,uBACA,qBACA,wBACA,qBACA,kBACA,kBACA,qBACA,wBACA,sBACA,wBACA,gBACA,mBACA,iBACA,wBACA,cACA,gBACA,4BACA,+BACA,0BACA,6BACA,oCACA,oBACA,6BACA,oCACA,8CACA,wBACA,cACA,iBACA,oBACA,kBACA,wBACA,2BACA,4BACA,2BACA,8BACA,+BACA,iCACA,uBACA,+BACA,sBACA,oBACA,0BACA,mBACA,uBACA,0BACA,wBACA,6BACA,wBACA,2BACA,yBACA,4BACA,wBACA,kBACA,qBACA,mBACA,sBACA,WACA,iBACA,eACA,wBACA,oBACA,qBACA,kBACA,yBACA,yBAGF,IAAiBkiB,GAAjB,SAAiBA,GACf,SAAgB7kB,EAAGgN,GACjB,MAAM/M,EAAY+M,EAAK/M,WAAa,aACpC,MAAO,GAAG+M,EAAKhN,GAAGsR,kBAAkBrR,GAAa,cAAcqR,eACjE,CAEA,SAAgBsnC,EAAO5rC,EAAqB0E,GAC1C,MAAgB,UAATA,EAAmBgnC,EAAqBv7C,IAAI6C,EAAGgN,IAAS2rC,EAAqBx7C,IAAI6C,EAAGgN,GAC7F,CAGA,SAAS6rC,EACP7rC,EACAjH,SAEA,MAAM+yC,EAAoC,QAAnB72C,EAAA8D,aAAQ,E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BACA,gBACA,UACA,cACA,cACA,YACA,oBACA,kBACA,oBACA,cACA,aACA,cACA,uBACA,gBACA,iBACA,WACA,YACA,cACA,kBACA,yBACA,gBACA,YACA,mBACA,gBACA,cACA,iBACA,eACA,eACA,WACA,QACA,eACA,kBACA,WACA,gBACA,gBACA,gBACA,UACA,aACA,cACA,QACA,aACA,cACA,eACA,aACA,SACA,WACA,YACA,SACA,gBACA,cACA,aACA,+BACA,wBACA,mBACA,eACA,eACA,mBACA,SACA,eACA,kBACA,gBACA,iBACA,sBACA,yBACA,YACA,oBACA,gBACA,QACA,WACA,aACA,kBACA,gBACA,YACA,kBACA,oBACA,4BACA,+BACA,+BACA,qBACA,QACA,eACA,SACA,aACA,aACA,YACA,QACA,WACA,oBACA,SACA,mBACA,sBACA,eACA,uBACA,WACA,UACA,WACA,YACA,gBACA,kBACA,aACA,mBACA,kBACA,aACA,MACA,aACA,YACA,cACA,gBAGWzhF,EAAAiyH,iBAAmB,CAC9B,kBACA,kBACA,kBACA,iBACA,aACA,kBACA,mBACA,kBACA,oBACA,iBACA,gBACA,kBACA,iBACA,aACA,YACA,gBACA,mBACA,mBACA,WACA,aACA,mCACA,gCACA,aACA,mBACA,YACA,oBACA,SACA,WACA,sBACA,uBACA,cACA,cACA,oBACA,yBACA,0BACA,yBACA,kBACA,kBACA,iBAGWjyH,EAAAkyH,QAAUpsG,EAAEy6E,MACvBvgG,EAAAiyH,iBAAiBhuH,OACf,CAACC,EAAMghF,KACLhhF,EAAKghF,GAAU,KACRhhF,GAET,IAEF,WAIWlE,EAAAmyH,mBAAqB,CAChC,OACA,SACA,QACA,WACA,OACA,YACA,SACA,aACA,SAGWnyH,EAAAoyH,cAAgB,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,QAAS,SAC1DpyH,EAAAqyH,cAAgBvsG,EAAEy6E,MAC7BvgG,EAAAoyH,cAAcnuH,OACZ,CAACC,EAAMyN,KACLzN,EAAKyN,GAAQ,KACNzN,GAET,IAEF,iBAIWlE,EAAAsyH,UAAYxsG,EAAEy6E,MACzBvgG,EAAAmyH,mBAAmBluH,OACjB,CAACC,EAAMghF,KACLhhF,EAAKghF,GAAU,KACRhhF,GAET,IAEF,aAIWlE,EAAAuyH,2BAA6B,CAAC,SAAU,UACxCvyH,EAAAwyH,2BAA6B1sG,EAAEy6E,MAC1CvgG,EAAAuyH,2BAA2BtuH,OACzB,CAACC,EAAMghF,KACLhhF,EAAKghF,GAAU,KACRhhF,GAET,IAEF,8BAIWlE,EAAAyyH,8BAAgC,CAAC,SAAU,QAC3CzyH,EAAA0yH,8BAAgC5sG,EAAEy6E,MAC7CvgG,EAAAyyH,8BAA8BxuH,OAC5B,CAACC,EAAMghF,KACLhhF,EAAKghF,GAAU,KACRhhF,GAET,IAEF,iCAOWlE,EAAA2yH,WAAa7sG,EAAE82E,OAGf58F,EAAA4yH,YAAc9sG,EAAE82E,OAGhB58F,EAAA6yH,eAAiB/sG,EAAE+8E,aAC9B,CACE/8E,EAAEgtG,UAAU,CACVC,UAAWjtG,EAAEmoE,MAAMjuF,EAAAsyH,WACnB59C,cAAe5uD,EAAEmoE,MAAMjuF,EAAAkyH,SACvBv9C,iBAAkB7uD,EAAEmoE,MAAMjuF,EAAAkyH,WAE5BpsG,EAAE07E,QAAQ,CACRwxB,gBAAiBltG,EAAEmoE,MAAMjuF,EAAA2yH,eAG7B,kBAIW3yH,EAAAizH,cAAgBntG,EAAE+8E,aAC7B,CACE/8E,EAAEgtG,UAAU,CACVtvH,GAAIxD,EAAA4yH,cAEN9sG,EAAE07E,QAAQ,CACR/9F,UAAWzD,EAAA2yH,cAGf,iBAIW3yH,EAAAkzH,yBAA2BptG,EAAE07E,QACxC,CACE/9F,UAAWzD,EAAA2yH,WACXj2E,cAAe52B,EAAE82E,OACjBngD,cAAe32B,EAAE82E,OACjBu2B,UAAWnzH,EAAAizH,cACXpyG,KAAM7gB,EAAA6yH,eACNxoC,MAAOvkE,EAAEmoE,MAAMjuF,EAAAqyH,gBAEjB,4BAIWryH,EAAAozH,gBAAkBttG,EAAE+8E,aAC/B,CACE/8E,EAAEgtG,UAAU,CACVh3D,MAAOh2C,EAAEu6E,QAAQ,mBACjB78F,GAAIxD,EAAA4yH,YACJvoH,KAAMyb,EAAE82E,OACRy2B,UAAWvtG,EAAEwtG,QACbzyG,KAAM7gB,EAAA6yH,iBAER/sG,EAAE07E,QAAQ,CACRtrB,iBAAkBl2E,EAAA2yH,WAClBtoC,MAAOvkE,EAAEmoE,MAAMjuF,EAAAqyH,eACfkB,WAAYvzH,EAAAizH,cACZO,eAAgBxzH,EAAAizH,cAChBE,UAAWnzH,EAAAizH,cACXQ,QAASzzH,EAAAizH,cACTv2E,cAAe52B,EAAE82E,OACjBngD,cAAe32B,EAAE82E,OACjB9hC,WAAYh1C,EAAEmoE,MAAMjuF,EAAAkzH,6BAGxB,mBAKWlzH,EAAAgK,MAAQ,CAAC,KAAM,MAEfhK,EAAA0zH,MAAQ5tG,EAAEy6E,MACrBvgG,EAAAgK,MAAM/F,OACJ,CAACC,EAAMmvB,KACLnvB,EAAKmvB,GAAgB,KACdnvB,GAET,IAEF,SAIWlE,EAAA2zH,QAAU7tG,EAAEtV,KACvB,CACEvQ,MAAO6lB,EAAEzB,OACTze,KAAM5F,EAAA0zH,OAER,WAMW1zH,EAAA4zH,qBAAuB9tG,EAAE+8E,aACpC,CACE/8E,EAAEtV,KAAK,CACLnG,KAAMyb,EAAE82E,OACRpxF,MAAOsa,EAAEy6E,MAAM,CACb3a,SAAU,KACViuC,UAAW,KACXC,YAAa,KACb/gB,QAAS,KACTghB,OAAQ,KACRC,MAAO,KACPC,MAAO,KACPC,SAAU,KACV/5G,KAAM,OAERxI,KAAMmU,EAAEy6E,MAAM,CACZ4zB,WAAY,KACZ/nH,KAAM,KACNoX,KAAM,KACNnkB,OAAQ,KACR+0H,KAAM,KACNC,SAAU,KACVJ,MAAO,KACP9qC,MAAO,KACP9kE,OAAQ,OAEViwG,SAAUxuG,EAAEy6E,MAAM,CAAEg0B,OAAQ,KAAMC,MAAO,OACzCC,MAAO3uG,EAAE82E,SAEX92E,EAAE07E,QAAQ,CACRkzB,MAAO5uG,EAAEu6E,SAAQ,GACjBj0F,KAAM0Z,EAAEzB,OACR3gB,SAAU1D,EAAAizH,cACV1mH,MAAOuZ,EAAEu8E,MAAM,CACbv8E,EAAEtV,KAAK,CAAEmB,KAAMmU,EAAEu6E,QAAQ,aAAczxE,QAAS9I,EAAEzB,SAClDyB,EAAEtV,KAAK,CAAEmB,KAAMmU,EAAEu6E,QAAQ,iBAE3Bs0B,OAAQ7uG,EAAEmoE,MAAMnoE,EAAE82E,QAClBh3F,KAAMkgB,EAAE82E,OACRg4B,OAAQ9uG,EAAEmoE,MACRnoE,EAAE+8E,aAAa,CACb/8E,EAAEtV,KAAK,CACLhN,GAAIsiB,EAAE82E,OACN3oF,MAAO6R,EAAE82E,OACTjrF,KAAMmU,EAAEy6E,MAAM,CAAEl8E,OAAQ,KAAMb,KAAM,KAAM4wG,KAAM,KAAM/0H,OAAQ,KAAMg1H,SAAU,KAAMJ,MAAO,SAE7FnuG,EAAE07E,QAAQ,CAAE57F,KAAMkgB,EAAE82E,eAK5B,wBAGW58F,EAAA60H,OAAS/uG,EAAEtV,KACtB,CACEzG,OAAQ/J,EAAA2zH,QACRz6E,IAAKpzB,EAAEzB,QAET,UAMWrkB,EAAA80H,QAAUhvG,EAAEy6E,MAFT,CAAC,UAAW,QAAS,YAG3Bt8F,OACN,CAACC,EAAM6wH,KACL7wH,EAAK6wH,GAAU,KACR7wH,GAET,IAEF,WAIWlE,EAAAg1H,MAAQlvG,EAAEtf,OAAOxG,EAAA80H,QAAS90H,EAAA2zH,QAAS,SAGnC3zH,EAAAi1H,gBAAkB,CAAC,KAEnBj1H,EAAAk1H,gBAAkBpvG,EAAEy6E,MAC/BvgG,EAAAi1H,gBAAgBhxH,OACd,CAACC,EAAMmvB,KACLnvB,EAAKmvB,GAAgB,KACdnvB,GAET,IAEF,mBAIWlE,EAAAm1H,YAAcrvG,EAAEtV,KAAK,CAAEvQ,MAAO6lB,EAAEzB,OAAQze,KAAM5F,EAAAk1H,iBAAmB,eAGjEl1H,EAAAo1H,KAAOtvG,EAAE07E,QACpB,CACEp1F,KAAM0Z,EAAEzB,OACRsR,eAAgB7P,EAAEu8E,MAAM,CAACriG,EAAA2zH,QAAS3zH,EAAAm1H,cAClCprH,OAAQ/J,EAAA2zH,QACRnwH,GAAIsiB,EAAE82E,OACN9pE,QAAShN,EAAEzB,OACXhY,IAAKyZ,EAAEzB,OACP/S,OAAQwU,EAAEwtG,QACVnlF,UAAWroB,EAAEzB,OACbkF,QAASzD,EAAEwtG,QACXr/G,MAAO6R,EAAE82E,OACTrwF,MAAOuZ,EAAEzB,OACT7X,SAAUsZ,EAAEzB,OACZ5X,mBAAoBqZ,EAAEwtG,QACtBp1D,OAAQp4C,EAAEwtG,QACV5lH,kBAAmBoY,EAAEzB,OACrB/X,UAAWwZ,EAAEwtG,QAGb+B,iBAAkBvvG,EAAEwtG,QACpBpmH,YAAa4Y,EAAEwtG,QACfrhH,aAAc6T,EAAEwtG,QAChBthH,kBAAmB8T,EAAEzB,OACrBvS,cAAegU,EAAEzB,OACjB0E,gBAAiB/oB,EAAA2zH,QACjBhlF,aAAc7oB,EAAEzB,OAChBw1D,gBAAiB/zD,EAAEzB,QAErB,QAIWrkB,EAAAs1H,cAAgBxvG,EAAE0+E,WAAW1+E,EAAE82E,OAAQ92E,EAAEu8E,MAAM,CAACv8E,EAAEzB,OAAQrkB,EAAA2zH,QAAS3zH,EAAAm1H,cAAe,iBAGlFn1H,EAAAu1H,kBAAoBzvG,EAAEy6E,MACjC,CAAEh/F,KAAM,KAAMuJ,KAAM,KAAM0qH,UAAW,KAAMxQ,IAAK,KAAME,KAAM,KAAMuQ,MAAO,MACzE,qBAIWz1H,EAAA01H,cAAgB5vG,EAAEtV,KAAK,CAAEnE,IAAKyZ,EAAEwtG,QAASlnH,KAAMpM,EAAAu1H,mBAAqB,iBAGpEv1H,EAAA21H,aAAe7vG,EAAEtV,KAC5B,CACEtR,KAAMc,EAAAizH,cACNh0H,GAAIe,EAAAizH,cACJ2C,SAAU9vG,EAAE82E,OACZi5B,OAAQ/vG,EAAE82E,OACVxd,UAAWt5D,EAAEu8E,MAAM,CAACv8E,EAAEu6E,QAAQ,MAAOv6E,EAAEu6E,QAAQ,UAC/C7lB,MAAO10D,EAAEu8E,MAAM,CAACv8E,EAAEu6E,QAAQ,QAASv6E,EAAEu6E,QAAQ,aAE/C,gBAIWrgG,EAAA81H,cAAgBhwG,EAAE+8E,aAC7B,CACE/8E,EAAEgtG,UAAU,CACVpvH,SAAU1D,EAAAizH,cACV9nH,KAAM2a,EAAEmoE,MAAMjuF,EAAAo1H,MACdptG,WAAYlC,EAAEmoE,MAAMjuF,EAAAo1H,QAEtBtvG,EAAE07E,QAAQ,CACRh+F,GAAIsiB,EAAE82E,OACNlxD,kBAAmB5lB,EAAE82E,OACrBx0F,MAAOpI,EAAAs1H,cACPpvE,KAAMlmD,EAAAs1H,cACNn3E,MAAOr4B,EAAE82E,OACTkF,QAASh8E,EAAEwtG,QACXtzC,aAAcl6D,EAAEwtG,QAChB5kF,SAAU5oB,EAAE82E,OACZvrF,MAAOyU,EAAE+8E,aACP,CACE/8E,EAAEtV,KAAK,CAAEA,KAAMsV,EAAEu6E,QAAQ,aACzBv6E,EAAE07E,QAAQ,CAAExxF,QAAShQ,EAAA01H,cAAejX,SAAU34F,EAAEzB,OAAQq6F,cAAe54F,EAAEmoE,MAAMnoE,EAAEzB,WAEnF,gBAEFsrD,aAAc7pD,EAAEmoE,MAAMnoE,EAAEmoE,MAAMnoE,EAAEu8E,MAAM,CAACv8E,EAAEzB,OAAQrkB,EAAA2zH,QAAS3zH,EAAAm1H,gBAC1DY,SAAUjwG,EAAEmoE,MAAMjuF,EAAAo1H,MAClBl2C,YAAal/E,EAAA21H,gBAGjB,iBAIW31H,EAAAg2H,2BAA6BlwG,EAAE07E,QAC1C,CACE1tE,aAAchO,EAAEwtG,SAElB,8BAIWtzH,EAAAi2H,uBAAwB,EAAAj2H,EAAAwkG,YAAW1+E,EAAE82E,OAAQ58F,EAAAg2H,4BAG7Ch2H,EAAAk2H,YAAcpwG,EAAE+8E,aAC3B,CACE/8E,EAAEgtG,UAAU,CACVz3C,SAAUv1D,EAAE82E,OACZ9+B,WAAYh4C,EAAE82E,SAEhB92E,EAAE07E,QAAQ,CACRj4E,QAASzD,EAAEwtG,QACXzqC,QAAS/iE,EAAE82E,OACXu5B,YAAarwG,EAAE82E,OACftrF,OAAQwU,EAAEwtG,QACVhnH,UAAWwZ,EAAEwtG,QACbr/G,MAAO6R,EAAE82E,OACTw5B,UAAWtwG,EAAE82E,UAGjB,eAIW58F,EAAAq2H,0BAA4BvwG,EAAE+8E,aACzC,CACE/8E,EAAEgtG,UAAU,CACV3nH,KAAM2a,EAAEmoE,MAAMjuF,EAAAk2H,eAEhBpwG,EAAE07E,QAAQ,CACR80B,aAAcxwG,EAAEwtG,WAGpB,6BAIWtzH,EAAAu2H,0BAA4BzwG,EAAE+8E,aACzC,CACE/8E,EAAEtV,KAAK,CACLpE,KAAM0Z,EAAEzB,OACRpkB,MAAO6lB,EAAEu8E,MAAM,CAACriG,EAAA2zH,QAAS7tG,EAAEzB,SAC3B0O,UAAW/yB,EAAA2zH,UAEb7tG,EAAE07E,QAAQ,CACR1uE,QAAShN,EAAEzB,UAGf,6BAIWrkB,EAAAw2H,2BAA6B1wG,EAAEtV,KAC1C,CACEutB,SAAUjY,EAAEu8E,MAAM,CAACv8E,EAAE82E,OAAQ92E,EAAE/Y,YAC/ByK,OAAQsO,EAAEtf,OAAOsf,EAAE82E,OAAQ58F,EAAAs1H,gBAE7B,8BAIWt1H,EAAAy2H,iBAAmB3wG,EAAE+8E,aAChC,CACE/8E,EAAEgtG,UAAU,CACVz/F,aAAcrzB,EAAAizH,cACdzvH,GAAIsiB,EAAE82E,OACNvyF,KAAMyb,EAAE82E,OACR9hC,WAAYh1C,EAAEmoE,MAAMjuF,EAAAq2H,2BACpBjuH,MAAOpI,EAAAs1H,cACP50C,cAAe56D,EAAE82E,OACjBnc,cAAe36D,EAAE82E,OACjBnlE,aAAc3R,EAAEmoE,MAAMnoE,EAAE82E,UAE1B92E,EAAE07E,QAAQ,CACRzhF,KAAM+F,EAAEmoE,MAAMnoE,EAAEzB,QAChBqyG,cAAe5wG,EAAE82E,OACjBxZ,UAAWt9D,EAAEmoE,MAAMnoE,EAAE82E,QACrBh9E,YAAakG,EAAE82E,OACf+5B,gBAAiB7wG,EAAE82E,OACnB05B,aAAcxwG,EAAEwtG,QAChBsD,gBAAiB9wG,EAAEwtG,QACnBuD,UAAW/wG,EAAEwtG,QACb3/F,cAAe3zB,EAAAi2H,sBACfG,UAAWtwG,EAAE82E,OACbjc,WAAY3gF,EAAAw2H,2BACZxuG,WAAYlC,EAAEmoE,MAAMjuF,EAAAu2H,2BACpBO,qBAAsBhxG,EAAE82E,OACxBm6B,qBAAsBjxG,EAAE82E,UAG5B,oBAKW58F,EAAAg3H,sBAAwBlxG,EAAEy6E,MADT,CAAC,iBAAkB,iBAAkB,SAAU,YAErDt8F,OACpB,CAACC,EAAMghF,KACLhhF,EAAKghF,GAAU,KACRhhF,GAET,IAEF,yBAIWlE,EAAAi3H,oBAAsB,CAAC,WAAY,mBACnCj3H,EAAAk3H,oBAAsBpxG,EAAEy6E,MACnCvgG,EAAAi3H,oBAAoBhzH,OAClB,CAACC,EAAMghF,KACLhhF,EAAKghF,GAAU,KACRhhF,GAET,IAEF,uBAIWlE,EAAAm3H,uBAAyBrxG,EAAE07E,QACtC,CACE/9F,UAAWqiB,EAAEmoE,MAAMjuF,EAAA2yH,YACnBniH,KAAMsV,EAAEmoE,MAAMjuF,EAAAqyH,eACdptC,QAASn/D,EAAEmoE,MAAMjuF,EAAAkyH,SACjBkF,UAAWtxG,EAAEwtG,SAEf,0BAIWtzH,EAAAq3H,+BAAiCvxG,EAAEtV,KAC9C,CACEA,KAAMsV,EAAEu6E,QAAQ,WAChBhtE,aAAcrzB,EAAAizH,cACd78F,KAAMtQ,EAAEzB,OACR29B,UAAWl8B,EAAEzB,QAEf,kCAIWrkB,EAAAs3H,6BAA+BxxG,EAAE+8E,aAC5C,CACE/8E,EAAEgtG,UAAU,CACVtiH,KAAMsV,EAAEu6E,QAAQ,SAChBhtE,aAAcrzB,EAAAizH,gBAEhBntG,EAAE07E,QAAQ,CACRvtF,MAAO6R,EAAE82E,UAGb,+BAIW58F,EAAAu3H,wBAA0BzxG,EAAE+8E,aACvC,CACE/8E,EAAEgtG,UAAU,CACVtiH,KAAMsV,EAAEu6E,QAAQ,YAChBh2F,KAAMyb,EAAE82E,SAEV92E,EAAE07E,QAAQ,CACRvtF,MAAO6R,EAAE82E,UAGb,0BAIW58F,EAAAw3H,gCAAkC1xG,EAAEu8E,MAAM,CACrDriG,EAAAq3H,+BACAr3H,EAAAs3H,6BACAt3H,EAAAu3H,0BAIWv3H,EAAAy3H,qBAAuB3xG,EAAE+8E,aAAa,CACjD/8E,EAAEgtG,UAAU,CACVjgF,YAAa/sB,EAAEmoE,MAAMjuF,EAAAg3H,uBACrBhzH,KAAMhE,EAAAk3H,oBACNQ,QAAS13H,EAAAm3H,uBACTQ,kBAAmB7xG,EAAEmoE,MAAMjuF,EAAAw3H,iCAC3B9sG,KAAM5E,EAAEu8E,MAAM,CAACv8E,EAAEu6E,QAAQ,WAAYv6E,EAAEu6E,QAAQ,eAEjDv6E,EAAE07E,QAAQ,CACRo2B,YAAa9xG,EAAEwtG,QACfuE,mBAAoB/xG,EAAE82E,OACtB3oF,MAAO6R,EAAE82E,OACTk7B,aAAchyG,EAAE82E,OAChBm7B,YAAajyG,EAAEzB,OACf2zG,mBAAoBh4H,EAAAozH,gBAEpB6E,uBAAwBj4H,EAAAizH,cACxB1nG,OAAQzF,EAAE82E,OACVvpE,aAAcrzB,EAAAizH,cACd7hH,WAAY0U,EAAEzB,WAKLrkB,EAAAk4H,YAAcpyG,EAAE07E,QAC3B,CACEoiB,WAAY99F,EAAE+8E,aAAa,CACzB/8E,EAAEgtG,UAAU,CACV1hH,WAAY0U,EAAEzB,OACdzS,SAAUkU,EAAEzB,SAEdyB,EAAE07E,QAAQ,CACRj4E,QAASzD,EAAEwtG,QACXhiH,OAAQwU,EAAEwtG,QACVhnH,UAAWwZ,EAAEwtG,QACbzP,SAAU/9F,EAAEwtG,YAGhB6E,UAAWryG,EAAEtV,KAAK,CAChBk7B,kBAAmB5lB,EAAE82E,OACrBxrF,WAAY0U,EAAEzB,SAEhBo+F,UAAW38F,EAAEtV,KAAK,CAChBse,KAAMhJ,EAAE82E,OACRp5E,KAAMsC,EAAEzB,SAEV+zG,eAAgBtyG,EAAE07E,QAAQ,CACxBp5F,MAAOpI,EAAAy3H,uBAETY,eAAgBvyG,EAAE07E,QAAQ,CACxBnuE,aAAcrzB,EAAAizH,gBAEhBqF,SAAUxyG,EAAE07E,QAAQ,CAClBnuE,aAAcrzB,EAAAizH,gBAEhB3R,cAAex7F,EAAE+8E,aAAa,CAC5B/8E,EAAEtV,KAAK,CACLi+B,UAAW3oB,EAAE82E,SAGf92E,EAAE07E,QAAQ,CAAEpwF,WAAY0U,EAAEzB,WAE5Bk0G,oBAAqBzyG,EAAEtV,KAAK,CAC1BY,WAAY0U,EAAEzB,SAEhBm0G,mBAAoB1yG,EAAEzB,OACtB49F,kBAAmBn8F,EAAEzB,OACrB0pB,sBAAuBjoB,EAAEwtG,QACzBtlF,WAAYloB,EAAEwtG,QACd5T,4BAA6B55F,EAAEwtG,SAEjC,eAKWtzH,EAAAy4H,cAAgB3yG,EAAEy6E,MAC7B,CACEm4B,OAAQ,KACRl6D,QAAS,MAEX,iBAKWx+D,EAAA24H,WAAa7yG,EAAEmoE,MAAMnoE,EAAEiL,MAAM,CAACjL,EAAEzB,OAAQyB,EAAEu8E,MAAM,CAACv8E,EAAEzB,OAAQyB,EAAE/Y,UAAW+Y,EAAE8yG,SAAU,cAGpF54H,EAAA64H,UAAY/yG,EAAE+8E,aACzB,CACE/8E,EAAEtV,KAAK,CACLnG,KAAMyb,EAAE82E,OACRxwD,UAAWtmB,EAAEzB,OACbgoB,SAAUvmB,EAAEwtG,QACZhnF,SAAUxmB,EAAEu8E,MAAM,CAACv8E,EAAEzB,OAAQyB,EAAE/Y,cAEjC+Y,EAAE07E,QAAQ,CAERpwF,WAAY0U,EAAEzB,UAGlB,aAIWrkB,EAAA84H,oBAAsB,CAAC,SACvB94H,EAAA+4H,qBAAuBjzG,EAAEy6E,MACpCvgG,EAAA84H,oBAAoB70H,OAClB,CAACC,EAAMghF,KACLhhF,EAAKghF,GAAU,KACRhhF,GAET,IAEF,wBAIWlE,EAAAg5H,mBAAqBlzG,EAAE+8E,aAClC,CACE/8E,EAAEgtG,UAAU,CACVzoH,KAAMyb,EAAE82E,OACRviC,aAAcv0C,EAAE82E,SAElB92E,EAAE07E,QAAQ,CACRh+F,GAAIsiB,EAAE82E,OACNh9E,YAAakG,EAAE82E,OACfz+C,MAAOr4B,EAAE82E,UAGb,sBAIW58F,EAAAi5H,oBAAsBnzG,EAAE+8E,aACnC,CACE/8E,EAAEgtG,UAAU,CACVzoH,KAAMyb,EAAE82E,OACRlmE,KAAM5Q,EAAEmoE,MAAMjuF,EAAAg5H,sBAEhBlzG,EAAE07E,QAAQ,CACRh+F,GAAIsiB,EAAE82E,OACNh9E,YAAakG,EAAE82E,OACfz+C,MAAOr4B,EAAE82E,OACT1/C,KAAMp3B,EAAEu6E,QAAQ,YAGpB,uBAIWrgG,EAAAk5H,gBAAkBpzG,EAAEtV,KAC/B,CACEsrD,MAAOh2C,EAAEu6E,QAAQ,WACjBh2F,KAAMyb,EAAE82E,OACRtnE,MAAOxP,EAAEmoE,MAAMjuF,EAAAi5H,sBAEjB,mBAIWj5H,EAAAyG,qBAAuBqf,EAAEtV,KACpC,CACEnM,QAASrE,EAAAk5H,gBACT50H,QAASwhB,EAAEzB,OACX9f,KAAK,EAAAvE,EAAAwkG,YAAW1+E,EAAE82E,OAAQ92E,EAAEu8E,MAAM,CAACriG,EAAA2zH,QAAS7tG,EAAE8yG,QAC9CvyH,UAAWyf,EAAE82E,QAEf,wBAIW58F,EAAAm5H,2BAA6BrzG,EAAE+8E,aAC1C,CAAC/8E,EAAEtV,KAAK,CAAElJ,gBAAiBwe,EAAEzB,SAAWrkB,EAAAyG,sBACxC,8BAIWzG,EAAAo5H,eAAiBtzG,EAAE+8E,aAC9B,CACE/8E,EAAEgtG,UAAU,CACVh3D,MAAOh2C,EAAEu6E,QAAQ,kBAEjBvxE,KAAMhJ,EAAE82E,OACRz1F,UAAW2e,EAAE82E,OACbztB,YAAarpD,EAAE82E,OACfvmE,IAAKvQ,EAAEzB,OACPu6B,QAAS94B,EAAE82E,OACX32F,QAAS6f,EAAEmoE,MAAMjuF,EAAA81H,eACjB3rG,UAAWrE,EAAEzB,OACb7gB,GAAIsiB,EAAEzB,SAERyB,EAAE07E,QAAQ,CACRzyB,QAASjpD,EAAEzB,OACX+R,KAAMtQ,EAAEzB,OACR29B,UAAWl8B,EAAEzB,OACbi9B,GAAIthD,EAAAk4H,YACJzpD,UAAWzuE,EAAA24H,WACXlpD,yBAAyB,EAAAzvE,EAAAwkG,YAAW1+E,EAAE82E,OAAQ92E,EAAEwtG,SAChD70C,uBAAuB,EAAAz+E,EAAAwkG,YAAW1+E,EAAE82E,OAAQ58F,EAAAs1H,eAC5Cn3G,QAAS2H,EAAEmoE,MAAMjuF,EAAA+4H,sBACjB1uG,WAAYvE,EAAEzB,OACdgqB,UAAWruC,EAAAy4H,cACXlsH,MAAOuZ,EAAEzB,OACTurB,gBAAiB9pB,EAAEzB,OACnBwrB,cAAe/pB,EAAEzB,OACjB2qB,cAAelpB,EAAEzB,OACjBm8F,aAAcxgH,EAAAy4H,cACdxpF,mBAAoBnpB,EAAEzB,OACtB6qB,iBAAkBppB,EAAEzB,OACpB8nB,SAAUnsC,EAAA64H,UACV16E,MAAOr4B,EAAE82E,OACTy8B,eAAgBvzG,EAAEzB,OAClB2tC,UAAWlsC,EAAEzB,OACbhd,oBAAqBrH,EAAAyG,wBAGzB,kBAIWzG,EAAAs5H,iBAAmBxzG,EAAEtV,KAChC,CACE9M,SAAU1D,EAAAizH,cACV9nH,KAAM2a,EAAEmoE,MAAMjuF,EAAAk2H,cAEhB,oBAIWl2H,EAAAu5H,aAAezzG,EAAE+8E,aAC5B,CACE/8E,EAAEgtG,UAAU,CACVtvH,GAAIsiB,EAAE82E,OACNvyF,KAAMyb,EAAE82E,OACRlmE,KAAM5Q,EAAEmoE,MACNnoE,EAAEtV,KAAK,CACLhN,GAAIsiB,EAAE82E,YAIZ92E,EAAE07E,QAAQ,CACR5hF,YAAakG,EAAE82E,UAGnB,gBAIW58F,EAAAw5H,YAAc1zG,EAAE+8E,aAC3B,CACE/8E,EAAEgtG,UAAU,CACVtvH,GAAIsiB,EAAE82E,OACNvyF,KAAMyb,EAAE82E,OACR/yF,UAAWic,EAAEmoE,MACXnoE,EAAEtV,KAAK,CACLhN,GAAIsiB,EAAE82E,YAIZ92E,EAAE07E,QAAQ,CAAE5hF,YAAakG,EAAE82E,UAE7B,eAIW58F,EAAAy5H,SAAW3zG,EAAE+8E,aACxB,CACE/8E,EAAEgtG,UAAU,CACVh3D,MAAOh2C,EAAEu6E,QAAQ,WACjBx2F,UAAWic,EAAEmoE,MAAMjuF,EAAAy2H,kBACnBjzH,GAAIsiB,EAAE82E,OACNvyF,KAAMyb,EAAE82E,OACRh9E,YAAakG,EAAE82E,OACfvjF,IAAKyM,EAAE82E,OACP1oD,OAAQpuB,EAAE82E,OACVt4F,QAASwhB,EAAEzB,OACXqS,KAAM5Q,EAAEmoE,MAAMjuF,EAAAw5H,aACdlkG,MAAOxP,EAAEmoE,MAAMjuF,EAAAu5H,cACfj+C,YAAax1D,EAAEwtG,QAKfvzG,KAAM+F,EAAEmoE,MAAMnoE,EAAE82E,UAElB92E,EAAE07E,QAAQ,CACRjkB,YAAaz3D,EAAEmoE,MAAMnoE,EAAE82E,QACvBpf,aAAc13D,EAAEmoE,MAAMnoE,EAAE82E,QACxBnf,iBAAkB33D,EAAEmoE,MAAMnoE,EAAE82E,QAC5BlmB,SAAU5wD,EAAEzB,OACZ+vB,kBAAmBtuB,EAAEu6E,QAAQ,WAC7BviF,QAASgI,EAAEwtG,QACXjvH,QAASrE,EAAAk5H,gBACTlnE,UAAWlsC,EAAEzB,OACbq1G,SAAU5zG,EAAEu8E,MAAM,CAACv8E,EAAE82E,OAAQ92E,EAAE8yG,OAC/B90H,OAAQgiB,EAAEu8E,MAAM,CAACv8E,EAAE82E,OAAQ92E,EAAE8yG,OAC7Be,UAAW7zG,EAAEu8E,MAAM,CAACv8E,EAAEu6E,QAAQ,GAAIv6E,EAAEu6E,QAAQ,GAAIv6E,EAAEu6E,QAAQ,GAAIv6E,EAAEu6E,QAAQ,KACxEu5B,IAAK9zG,EAAEu8E,MAAM,CAACv8E,EAAEu6E,QAAQ,sBAAuBv6E,EAAEu6E,QAAQ,kBAAmBv6E,EAAEu6E,QAAQ,oBACtFigB,SAAUx6F,EAAEu8E,MAAM,CAACv8E,EAAEu6E,QAAQ,SAAUv6E,EAAEu6E,QAAQ,SAAUv6E,EAAEu6E,QAAQ,SAAUv6E,EAAEu6E,QAAQ,SACzFw5B,KAAM/zG,EAAEu8E,MAAM,CAACv8E,EAAEu6E,QAAQ,YAAav6E,EAAEu6E,QAAQ,eAAgBv6E,EAAEu6E,QAAQ,iCAG9E,YAIWrgG,EAAA85H,YAAc,CAAC,KAAM,MAErB95H,EAAA+5H,YAAcj0G,EAAEy6E,MAC3BvgG,EAAA85H,YAAY71H,OACV,CAACC,EAAMmvB,KACLnvB,EAAKmvB,GAAgB,KACdnvB,GAET,IAEF,SAIWlE,EAAAg6H,QAAUl0G,EAAEtV,KAAK,CAAEvQ,MAAO6lB,EAAEzB,OAAQze,KAAM5F,EAAA+5H,aAAe,WAGzD/5H,EAAAi6H,kBAAoBn0G,EAAE+8E,aACjC,CAAC/8E,EAAEgtG,UAAU,CAAEh3D,MAAOh2C,EAAEu6E,QAAQ,QAASpgG,MAAOD,EAAA2zH,QAASxlF,UAAWroB,EAAEzB,SAAWyB,EAAE07E,QAAQ,CAAExvC,UAAWlsC,EAAEzB,UAC1G,qBAIWrkB,EAAAk6H,eAAiB,CAC5BnwH,OAAQ+b,EAAEmoE,MAAMjuF,EAAAi6H,oBAELj6H,EAAAm6H,aAAer0G,EAAE07E,QAAQxhG,EAAAk6H,eAAgB,gBAGzCl6H,EAAAo6H,kBAAoBt0G,EAAE+8E,aACjC,CAAC/8E,EAAEgtG,UAAU,CAAEh3D,MAAOh2C,EAAEu6E,QAAQ,QAASpgG,MAAOD,EAAAg6H,QAAS7rF,UAAWroB,EAAEzB,SAAWyB,EAAE07E,QAAQ,CAAExvC,UAAWlsC,EAAEzB,UAC1G,qBAIWrkB,EAAAq6H,eAAiB,CAC5B3sB,KAAM5nF,EAAEmoE,MAAMjuF,EAAAo6H,mBACd/1C,UAAWv+D,EAAEmoE,MAAMjuF,EAAAo6H,mBACnBzsB,UAAW7nF,EAAEmoE,MAAMjuF,EAAAo6H,mBACnBxsB,WAAY9nF,EAAEmoE,MAAMjuF,EAAAo6H,mBACpBvsB,YAAa/nF,EAAEmoE,MAAMjuF,EAAAo6H,mBACrBtsB,aAAchoF,EAAEmoE,MAAMjuF,EAAAo6H,mBACtBz1C,MAAO7+D,EAAEmoE,MAAMjuF,EAAAo6H,mBACfrsB,MAAOjoF,EAAEmoE,MAAMjuF,EAAAo6H,mBACfpsB,KAAMloF,EAAEmoE,MAAMjuF,EAAAo6H,mBACdnsB,UAAWnoF,EAAEmoE,MAAMjuF,EAAAo6H,mBACnBlsB,WAAYpoF,EAAEmoE,MAAMjuF,EAAAo6H,mBACpBjsB,SAAUroF,EAAEmoE,MAAMjuF,EAAAo6H,mBAClBhsB,UAAWtoF,EAAEmoE,MAAMjuF,EAAAo6H,oBAERp6H,EAAAs6H,aAAex0G,EAAE07E,QAAQxhG,EAAAq6H,eAAgB,gBAGzCr6H,EAAAu6H,sBAAwBz0G,EAAE+8E,aACrC,CACE/8E,EAAEgtG,UAAU,CAAEh3D,MAAOh2C,EAAEu6E,QAAQ,QAASpgG,MAAOD,EAAAm1H,YAAahnF,UAAWroB,EAAEzB,SACzEyB,EAAE07E,QAAQ,CAAExvC,UAAWlsC,EAAEzB,UAE3B,yBAIWrkB,EAAAw6H,mBAAqB,CAChCnsB,QAASvoF,EAAEmoE,MAAMjuF,EAAAu6H,wBAENv6H,EAAAy6H,iBAAmB30G,EAAE07E,QAAQxhG,EAAAw6H,mBAAoB,oBAKjDx6H,EAAA06H,oBAAsB50G,EAAE07E,QACnCx5F,EAAAwC,YAAYzG,KAAK/D,EAAAk6H,gBAAgBj2H,OAC/B,CAACC,EAAMC,KACLD,EAAKC,GAAO2hB,EAAEwtG,QACPpvH,GAET,IAEF,uBAIWlE,EAAA26H,oBAAsB70G,EAAE07E,QACnCx5F,EAAAwC,YAAYzG,KAAK/D,EAAAq6H,gBAAgBp2H,OAC/B,CAACC,EAAMC,KACLD,EAAKC,GAAO2hB,EAAEwtG,QACPpvH,GAET,IAEF,uBAIWlE,EAAA46H,wBAA0B90G,EAAE07E,QACvCx5F,EAAAwC,YAAYzG,KAAK/D,EAAAw6H,oBAAoBv2H,OACnC,CAACC,EAAMC,KACLD,EAAKC,GAAO2hB,EAAEwtG,QACPpvH,GAET,IAEF,2BAGWlE,EAAA66H,cAAgB/0G,EAAEtV,KAC7B,CACEzG,OAAQ/J,EAAA06H,oBACRr7H,OAAQW,EAAA26H,oBACR98D,WAAY79D,EAAA46H,yBAEd,iBAIW56H,EAAA86H,gBAAkBh1G,EAAE+8E,aAC/B,CACE/8E,EAAEgtG,UAAU,CACV4F,OAAQ5yG,EAAEu8E,MAAM,CAACv8E,EAAEzB,OAAQyB,EAAE/Y,UAAW+Y,EAAE8yG,OAC1Cp6D,QAAS14C,EAAEu8E,MAAM,CAACv8E,EAAEzB,OAAQyB,EAAE/Y,UAAW+Y,EAAE8yG,SAE7C9yG,EAAE07E,QAAQ,CACR3yB,SAAU/oD,EAAEzB,OACZqqB,SAAU5oB,EAAEzB,UAGhB,mBAIWrkB,EAAA+6H,OAASj1G,EAAEu8E,MAAM,CAC5Bv8E,EAAEtV,KAAK,CAAEsrD,MAAOh2C,EAAEu6E,QAAQ,SAAU7vF,KAAMsV,EAAEu6E,QAAQ,YAAa78F,GAAIxD,EAAA4yH,cACrE9sG,EAAEtV,KAAK,CAAEsrD,MAAOh2C,EAAEu6E,QAAQ,SAAU7vF,KAAMsV,EAAEu6E,QAAQ,eAAgB78F,GAAIsiB,EAAEy6E,MAAMvgG,EAAAk6H,kBAChFp0G,EAAEtV,KAAK,CAAEsrD,MAAOh2C,EAAEu6E,QAAQ,SAAU7vF,KAAMsV,EAAEu6E,QAAQ,eAAgB78F,GAAIsiB,EAAEy6E,MAAMvgG,EAAAq6H,kBAChFv0G,EAAEtV,KAAK,CAAEsrD,MAAOh2C,EAAEu6E,QAAQ,SAAU7vF,KAAMsV,EAAEu6E,QAAQ,mBAAoB78F,GAAIsiB,EAAEy6E,MAAMvgG,EAAAw6H,sBACpF10G,EAAEtV,KAAK,CAAEsrD,MAAOh2C,EAAEu6E,QAAQ,SAAU7vF,KAAMsV,EAAEu6E,QAAQ,eAAgB78F,GAAIsiB,EAAE82E,WAI/D58F,EAAAg7H,eAAiBl1G,EAAE+8E,aAC9B,CACE/8E,EAAEgtG,UAAU,CACVh3D,MAAOh2C,EAAEu6E,QAAQ,kBACjBv8D,IAAKhe,EAAEtV,KAAK,CACVq2B,GAAI7mC,EAAA2zH,QACJsH,GAAIj7H,EAAA2zH,UAEN17E,WAAYnyB,EAAEzB,OACd6D,OAAQpC,EAAEmoE,MAAMnoE,EAAEtV,KAAK,CAAEzG,OAAQ/J,EAAA2zH,QAASz6E,IAAKpzB,EAAEzB,UACjDuzB,MAAO9xB,EAAEmoE,MAAMjuF,EAAA2zH,SACfj8E,QAAS5xB,EAAEwtG,UAEbxtG,EAAE07E,QAAQ,CACR57F,KAAM5F,EAAA0zH,MACNrpH,KAAMyb,EAAE82E,OACRs+B,UAAWp1G,EAAE82E,OACby2B,UAAWvtG,EAAEwtG,QACbr5E,oBAAqBn0B,EAAEwtG,QACvBn5E,YAAar0B,EAAEwtG,QACfn1E,MAAOr4B,EAAE82E,UAGb,kBAKW58F,EAAAm7H,cAAgBr1G,EAAE07E,QAAQ,CACrC45B,wBAAyBt1G,EAAEzB,SAIhBrkB,EAAAq7H,kBAAoBv1G,EAAEtV,KACjC,CACE00E,OAAQllF,EAAAkyH,QACRj6E,WAAYnyB,EAAEzB,QAEhB,qBAIWrkB,EAAAs7H,mBAAqBx1G,EAAE07E,QAClC,CACEj9F,IAAKvE,EAAA2zH,QACLt7E,SAAUvyB,EAAEzB,OACZ5gB,WAAW,EAAAzD,EAAAwkG,YAAW1+E,EAAE82E,OAAQ92E,EAAEu8E,MAAM,CAACv8E,EAAE82E,OAAQ92E,EAAE/Y,aACrDoxC,MAAOr4B,EAAE82E,OACT2+B,kBAAmBz1G,EAAEmoE,MAAMjuF,EAAAq7H,mBAC3BppH,aAAc6T,EAAEwtG,SAElB,sBAKWtzH,EAAAqlF,cAA0B,CACrC,YACA,UACA,OACA,MACA,SACA,aACA,aACA,QACA,SACA,SACA,YAGWrlF,EAAAw7H,cAAgB11G,EAAEu8E,MAC7B,CACEv8E,EAAEy6E,MACAvgG,EAAAqlF,cAAcphF,OACZ,CAACC,EAAMghF,KACLhhF,EAAKghF,GAAU,KACRhhF,GAET,KAGJ4hB,EAAE82E,QAEJ,iBAIW58F,EAAAy7H,iBAAmB31G,EAAEtV,KAChC,CACE0gE,oBAAqBprD,EAAEzB,OACvBq3G,gBAAiB51G,EAAEzB,OACnBs3G,mBAAoB71G,EAAEzB,OACtBu3G,iBAAiB,EAAA57H,EAAAwkG,YAAWxkG,EAAAw7H,cAAe11G,EAAEiL,MAAM,CAACjL,EAAEzB,OAAQyB,EAAEzB,UAChEw3G,iBAAiB,EAAA77H,EAAAwkG,YAAWxkG,EAAAw7H,cAAe11G,EAAEzB,SAE/C,oBAIWrkB,EAAA87H,KAAOh2G,EAAEtV,KACpB,CACEsrD,MAAOh2C,EAAEu6E,QAAQ,OACjB78F,GAAIsiB,EAAE82E,OACNvyF,KAAMyb,EAAE82E,OACRn5F,WAAW,EAAAzD,EAAAwkG,YAAWxkG,EAAA2yH,WAAY3yH,EAAAg7H,iBAEpC,QAIWh7H,EAAA+7H,YAAc,CAAC,SAAU,WAAY,mBAAoB,QACzD/7H,EAAAg8H,YAAcl2G,EAAEy6E,MAC3BvgG,EAAA+7H,YAAY93H,OACV,CAACC,EAAMmvB,KACLnvB,EAAKmvB,GAAgB,KACdnvB,GAET,IAEF,eAIWlE,EAAAi8H,iBAAmBn2G,EAAE+8E,aAChC,CACE/8E,EAAEgtG,UAAU,CACVx8C,WAAYt2E,EAAAg8H,cAEdl2G,EAAE07E,QAAQ,CACR06B,iBAAkBp2G,EAAEwtG,QACpBtN,4BAA6BlgG,EAAEwtG,WAGnC,oBAKWtzH,EAAAm8H,QAAUr2G,EAAEtV,KAAK,CAC5BsrD,MAAOh2C,EAAEu6E,QAAQ,UACjBlqB,OAAQrwD,EAAEmoE,MAAMjuF,EAAA+6H,UAGL/6H,EAAAo8H,sBAAwBt2G,EAAEtV,KAAK,CAC1CsrD,MAAOh2C,EAAEu6E,QAAQ,0BACjBxxF,KAAMiX,EAAE0+E,WACN1+E,EAAE82E,OACF92E,EAAE07E,QAAQ,CACRn3F,KAAMyb,EAAE82E,OACRrX,SAAUz/D,EAAEwtG,QACZruC,QAASn/D,EAAEmoE,MAAMjuF,EAAAkyH,cAMVlyH,EAAAq8H,UAAYv2G,EAAE+8E,aACzB,CACE/8E,EAAEgtG,UAAU,CACVtpE,OAAQxpD,EAAA86H,gBACRrkD,KAAM3wD,EAAEmoE,MAAMjuF,EAAA87H,MACdhmD,YAAahwD,EAAEmoE,MAAMnoE,EAAE82E,QACvBzmB,OAAQn2E,EAAAm8H,QACRG,cAAc,EAAAt8H,EAAAwkG,YAAW1+E,EAAE82E,OAAQ58F,EAAAm7H,eACnCoB,eAAgBz2G,EAAE07E,QAAQ,CACxBg7B,YAAa12G,EAAEwtG,QACfmJ,iBAAkB32G,EAAEwtG,QACpBoJ,YAAa52G,EAAEwtG,QACfqJ,mBAAoB72G,EAAEwtG,QACtBsJ,YAAa58H,EAAAwyH,2BACbqK,uBAAwB78H,EAAA0yH,gCAE1BoK,sBAAuBh3G,EAAE07E,QAAQ,CAC/Bu7B,cAAej3G,EAAEwtG,QACjB0J,wBAAyBl3G,EAAEwtG,QAC3B2J,yBAA0Bn3G,EAAEwtG,UAE9BzpH,WAAW,EAAA7J,EAAAwkG,YAAW1+E,EAAE82E,OAAQ58F,EAAAozH,iBAChC8J,aAAcl9H,EAAA66H,cACd7wH,MAAOhK,EAAA0zH,MACPoG,YAAa95H,EAAA+5H,YACbjoF,OAAQhsB,EAAEzB,OACV9e,cAAc,EAAAvF,EAAAwkG,YAAW1+E,EAAE82E,OAAQ58F,EAAAs7H,oBACnCj3H,QAASrE,EAAAy7H,iBACTplD,gBAAiBr2E,EAAAi8H,iBACjBplD,aAAc72E,EAAAo8H,wBAEhBt2G,EAAE07E,QAAQ,CACRl3E,mBAAoBxE,EAAEwtG,QACtB6J,aAAcr3G,EAAE82E,OAChBngF,SAAUqJ,EAAE82E,OACZwgC,gBAAiBt3G,EAAEwtG,QACnB5hF,UAAW5rB,EAAEwtG,QACb9hD,oBAAqB1rD,EAAEwtG,QACvB+J,SAAUv3G,EAAEzB,OACZi5G,kBAAkB,EAAAt9H,EAAAwkG,YAAWxkG,EAAA4yH,YAAa9sG,EAAEwtG,SAC5Cv3E,MAAOj2B,EAAEu8E,MAAM,CAACv8E,EAAEu6E,QAAQ,QAASv6E,EAAEu6E,QAAQ,WAC7CnmD,kBAAmBl6C,EAAA2zH,QAEnB4J,cAAez3G,EAAEtV,KAAK,CAAErJ,UAAW2e,EAAE82E,OAAQjsF,QAASmV,EAAE82E,OAAQqsB,OAAQnjG,EAAEzB,SAE1Em5G,oBAAqB13G,EAAEzB,OAEvBo5G,mBAAoB33G,EAAEwtG,QAEtBoK,kBAAmB53G,EAAEtV,KAAK,CAAErJ,UAAW2e,EAAE82E,OAAQnsD,GAAI3qB,EAAEzB,SAEvDs5G,QAAS73G,EAAE+8E,aAAa,CACtB/8E,EAAEtV,KAAK,CAAEotH,WAAY93G,EAAEu8E,MAAM,CAACv8E,EAAEu6E,QAAQ,GAAIv6E,EAAEu6E,QAAQ,GAAIv6E,EAAEu6E,QAAQ,OACpEv6E,EAAE07E,QAAQ,CAAEq8B,WAAY/3G,EAAEzB,OAAQy5G,YAAah4G,EAAE82E,OAAQmhC,UAAWj4G,EAAEzB,WAGxE25G,mBAAoBl4G,EAAE82E,OAEtBqhC,eAAgBn4G,EAAEtV,KAAK,CAAE0tH,YAAap4G,EAAEzB,SAExC85G,YAAar4G,EAAEtV,KAAK,CAClB4tH,YAAat4G,EAAEmoE,MACbnoE,EAAEu8E,MAAM,CACNv8E,EAAEu6E,QAAQ,YACVv6E,EAAEu6E,QAAQ,UACVv6E,EAAEu6E,QAAQ,SACVv6E,EAAEu6E,QAAQ,UACVv6E,EAAEu6E,QAAQ,YACVv6E,EAAEu6E,QAAQ,WAGdg+B,IAAKv4G,EAAEwtG,UAGTgL,YAAax4G,EAAEmoE,MAAMnoE,EAAEk+E,KAEvBu6B,kBAAmBz4G,EAAEk+E,IAErBw6B,mBAAmB,EAAAx+H,EAAAwkG,YAAW1+E,EAAE82E,OAAQ92E,EAAEk+E,KAE1Cy6B,yBAA0B34G,EAAEzB,OAE5Bq6G,oBAAqB54G,EAAEzB,OAEvBs6G,WAAY74G,EAAE07E,QAAQ,CAEpBo9B,mBAAoB94G,EAAEzB,OAEtBw6G,WAAY/4G,EAAEzB,OAEdy6G,cAAeh5G,EAAEzB,OACjB06G,UAAWj5G,EAAEmoE,MACXnoE,EAAEu8E,MAAM,CAACv8E,EAAEu6E,QAAQ,SAAUv6E,EAAEu6E,QAAQ,aAAcv6E,EAAEu6E,QAAQ,WAAYv6E,EAAEu6E,QAAQ,aAIzF2+B,WAAYl5G,EAAEtV,KAAK,CACjB6lB,IAAKvQ,EAAEtV,KAAK,CAAEyuH,QAASn5G,EAAEzB,OAAQ66G,WAAYp5G,EAAE82E,SAC/CuiC,SAAUr5G,EAAE82E,OACZga,OAAQ9wF,EAAEwtG,aAIhB,aAKWtzH,EAAAo/H,OAASt5G,EAAEtV,KACtB,CACEzG,OAAQ/J,EAAAm6H,aACR96H,OAAQW,EAAAs6H,aACRz8D,WAAY79D,EAAAy6H,kBAEd,UAIWz6H,EAAAgtG,SAAWlnF,EAAE+8E,aACxB,CACE/8E,EAAEgtG,UAAU,CACV/5G,QAAS+M,EAAEmoE,MAAMjuF,EAAAo5H,gBACjB7rB,eAAgBznF,EAAEmoE,MAAMnoE,EAAEzB,QAC1BquB,MAAO1yC,EAAAo/H,OACP3xB,aAAc3nF,EAAEmoE,MAAMnoE,EAAEzB,QACxB9a,SAAUvJ,EAAAq8H,UACVjqF,iBAAkBtsB,EAAEu8E,MAAM,CAACv8E,EAAE82E,OAAQ92E,EAAE/Y,YACvCwK,QAASuO,EAAE82E,OACX/+E,SAAUiI,EAAEmoE,MAAMjuF,EAAAy5H,UAClBjsB,gBAAiB1nF,EAAEmoE,MAAMnoE,EAAEzB,QAC3BwvB,eAAgB/tB,EAAEmoE,MAAMnoE,EAAEzB,QAC1BipF,eAAgBxnF,EAAEmoE,MAAMnoE,EAAEzB,QAC1BiqF,MAAOxoF,EAAEmoE,MAAMnoE,EAAE82E,QACjB5gF,MAAO8J,EAAEu8E,MAAM,CAACv8E,EAAE82E,OAAQ92E,EAAE/Y,cAE9B+Y,EAAE07E,QAAQ,CACR7xC,WAAY7pC,EAAEzB,OACd7gB,GAAIsiB,EAAEzB,OACN+oB,SAAUtnB,EAAE82E,OACZyiC,YAAav5G,EAAE82E,OACfhtC,UAAW9pC,EAAE45E,WAGjB,YAWW1/F,EAAAs/H,yBAA2Bx5G,EAAEtV,KACxC,CACEkkE,cAAe5uD,EAAEmoE,MAAMjuF,EAAAkyH,SACvBv9C,iBAAkB7uD,EAAEmoE,MAAMjuF,EAAAkyH,SAC1B7nC,MAAOvkE,EAAEmoE,MAAMjuF,EAAAqyH,gBAEjB,sDC/hDF,IAAiB91E,oFAAjB,SAAiBA,GAGf,SAAgBgjF,EAAK77H,GACnB,GAA2B,MAAvBA,EAASo3D,YAAqD,IAA/Bp3D,EAASo3D,WAAWz7D,OACrD,MAAM,IAAIya,MAAM,mBAAmBpW,EAASF,wBAE9C,OAAOE,EAASo3D,WAAWj3D,IAAK0E,GAAOA,EAAEsY,KAAOtY,EAAGzI,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAMS,GAAC,CAAEsY,KAAMnd,EAASmd,OAC7E,CAEA,SAAgB2+G,EAAiB97H,SAC/B,MAAMo3D,EAAaykE,EAAK77H,GACxB,OAAkD,QAA3C+B,EAAAq1D,EAAW7kC,KAAM1tB,GAAqB,MAAfA,EAAE9E,kBAAkB,IAAAgC,EAAAA,EAAIq1D,EAAW,EACnE,CAEA,SAAgBt0B,EAAQ9iC,EAA2B8M,GACjD,GAAsB,MAAlBA,EAAK/M,UACP,OAAO+M,EAET,MAAM/M,EAAY+7H,EAAiB97H,GAAUD,UAC7C,OAAoB,MAAbA,EAAmB3D,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAM0I,GAAI,CAAE/M,cAAc+M,CACtD,CApBa+rC,EAAAkjF,eAAiB,GAEdljF,EAAAgjF,KAAIA,EAOJhjF,EAAAijF,iBAAgBA,EAKhBjjF,EAAA/V,QAAOA,EAQP+V,EAAAtmB,KAAhB,SAAqBvyB,EAA2B8M,GAC9C,MAAM/M,EAAY+iC,EAAQ9iC,EAAU8M,GAAM/M,UAC1C,OAAO87H,EAAK77H,GAAUuyB,KAAM1tB,GAAMA,EAAE9E,YAAcA,EACpD,EAiBgB84C,EAAApmB,OAAhB,SACEzyB,EACAD,EACAi8H,SAEA,MAAMlsH,EAAS/P,QAAAA,EAAa+7H,EAAiB97H,GAAUD,UACjDq3D,EAAgC,QAAnBr1D,EAAA/B,EAASo3D,kBAAU,IAAAr1D,EAAAA,EAAI,GAC1C,OAAKq1D,EAAWx5D,KAAMiH,GAAMA,EAAE9E,YAAc+P,GAG5C1T,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKpE,GAAQ,CACXo3D,WAAYA,EAAWj3D,IAAK0E,GAAOA,EAAE9E,YAAc+P,EA3BvD,SACEA,EACAksH,GAEA,MAAM73H,EAAM/H,OAAAgI,OAAA,GAAkC0L,GAC9C,IAAK,MAAMrP,KAAOrE,OAAOiE,KAAK27H,QACT3yH,IAAf2yH,EAAMv7H,UACD0D,EAAO1D,GAEd0D,EAAO1D,GAAOu7H,EAAMv7H,GAGxB,OAAO0D,CACT,CAcgE83H,CAAWp3H,EAAGm3H,GAASn3H,KAJ5E7E,CAMX,EAEgB64C,EAAAqjF,SAAhB,SAAyBl8H,SACvB,MAAMo3D,EAAaykE,EAAK77H,GAClBm8H,EAAML,EAAiB97H,GACvBmE,EAAM/H,OAAAgI,OAAA,GAAiCpE,GAC7C,IAAK,MAAMS,IAAO,CAAC,gBAAiB,gBAAiB,YAAa,QAAS,cAAe,2BACjF0D,EAAO1D,GAOhB,OALA0D,EAAOizD,WAAaA,EACpBjzD,EAAOgZ,KAAe,QAARpb,EAAAo6H,EAAIh/G,YAAI,IAAApb,EAAAA,EAAI/B,EAASmd,KACd,MAAjBg/G,EAAIp8H,YACNoE,EAAOquE,iBAAmB2pD,EAAIp8H,WAEzBoE,CACT,EAEgB00C,EAAAj2C,SAAhB,SAAyB5C,GACvB,MAAMo3D,EAAap3D,EAASo3D,WAC5B,GAAkB,MAAdA,GAA4C,IAAtBA,EAAWz7D,OACnC,MAAO,2CAET,GAAIy7D,EAAWz7D,OAASk9C,EAAAkjF,eACtB,MAAO,gCAAgCljF,EAAAkjF,4BAEzC,MAAMhzC,EAAO,IAAItmF,IACjB,IAAK,MAAMoC,KAAKuyD,EAAY,CAC1B,GAAI2xB,EAAK9rF,IAAI4H,EAAE9E,WACb,OAAsB,MAAf8E,EAAE9E,UACL,4DACA,cAAc8E,EAAE9E,kCAEtBgpF,EAAK92E,IAAIpN,EAAE9E,UACb,CAEF,CACD,CA7FD,CAAiB84C,IAAuBv8C,EAAAu8C,wBAAvBA,EAAuB,iGCFxCv8C,EAAAwnF,SAAA,MACS,eAAOC,CAAY3lF,EAAW6D,GACnC,GAAI7D,EAAEoT,OAASvP,EAAEuP,KACf,OAAO,EAET,IAAK,MAAM4iC,KAAQh2C,EACjB,IAAK6D,EAAEhF,IAAIm3C,GACT,OAAO,EAGX,OAAO,CACT,CAEO,kBAAOgoF,CAAe30H,GAC3B,GAAIA,EAAK9L,OAAS,EAChB,OAAO,EAGT,MAAO6S,KAAUmtC,GAAQl0C,EACzB,IAAK,MAAMJ,KAAOs0C,EAChB,IAAKrgD,KAAKyoF,SAASv1E,EAAOnH,GACxB,OAAO,EAGX,OAAO,CACT,CAEO,wBAAOg1H,CAAqBC,EAAgB9gI,GACjD,IAAK,MAAM44C,KAAQ54C,EACjB,GAAI8gI,EAAOr/H,IAAIm3C,GACb,OAAO,EAGX,OAAO,CACT,kGCdF,MAAMmoF,EAAe,yBACfC,EAAiB,4BACjBC,EAAgB,uCAChBC,EAAa,8DAKbC,EAAgB,qBAEhBC,EAAuB,4BAEvBC,EAAiD,CACrDC,IAAK,IACLhoF,GAAI,IACJT,GAAI,IACJ0oF,KAAM,IACNC,KAAM,IACNC,KAAM,KAGR,IAAiBllD,GAAjB,SAAiBA,GAiBf,SAAgBn8D,EAAQlH,GACtB,OAAOA,EAAKpR,UAAU,OAAOkc,OAAO9Y,QAAQ,MAAO,KAAK0K,aAC1D,CAIA,SAAgB8rH,EAAYxoH,GAC1B,MAAMjU,EAAMmb,EAAQlH,GACpB,MAAO,IAAIjU,GAAK9E,QAAU,GAAK,IAAI8E,GAAK9E,QAAUo8E,EAAAolD,eAAiB,2BAA2B56G,KAAK9hB,EACrG,CAwCA,SAAS28H,EAASC,EAAkB32H,GAClC,MAAM8jF,EAAgB,GACtB,IAAI8yC,EACAC,GAAW,EACXC,GAAU,EACVC,GAAS,EACb,IAAK,MAAMl+G,KAAQm+G,EAAkBL,GAAUh+G,MAAM,MAAO,CAC1D,MAAMs+G,EAAwB,KAAhBp+G,EAAKC,OACnB,GAAI89G,EAAO,CACT9yC,EAAIp9E,KAAKmS,GACT,MAAMwqE,EAAQxqE,EAAK8yB,MAAM,+BACrB03C,GAASA,EAAM,GAAG,KAAOuzC,EAAMM,MAAQ7zC,EAAM,GAAGpuF,QAAU2hI,EAAM3hI,SAClE2hI,OAAQj0H,GAEV,QACF,CACA,MAAMotF,EAAOl3E,EAAK8yB,MAAMmqF,GACxB,GAAI/lC,IAAyB,MAAfA,EAAK,GAAG,KAAcA,EAAK,GAAGvpF,SAAS,MAAO,CAC1DowH,EAAQ,CAAEM,KAAMnnC,EAAK,GAAG,GAAI96F,OAAQ86F,EAAK,GAAG96F,QAC5C6uF,EAAIp9E,KAAKmS,GACTg+G,GAAW,EACXC,GAAU,EACV,QACF,CACA,MAAMK,GAAmBF,GAAS,aAAap7G,KAAKhD,KAAUg+G,GAAYC,KAAaC,EACnFI,GAAU,uBAAuBt7G,KAAKhD,GACxCirE,EAAIp9E,KAAKmS,GAETirE,EAAIp9E,KAAK0wH,EAAQv+G,EAAM7Y,IAEpBi3H,IACClB,EAAcl6G,KAAKhD,GACrBk+G,GAAS,EACC,SAASl7G,KAAKhD,KACxBk+G,GAAS,IAGbD,EAAUK,GAAWF,GAASH,EAC9BD,EAAWI,CACb,CACA,OAAOnzC,EAAI1gF,KAAK,KAClB,CAEA,SAASg0H,EAAQv+G,EAAc7Y,GAC7B,IAAIvC,EAAS,GACTtI,EAAI,EACR,KAAOA,EAAI0jB,EAAK5jB,QAAQ,CACtB,MAAMuyG,EAAK3uF,EAAK1jB,GAChB,GAAW,OAAPqyG,EACF/pG,GAAUob,EAAKtjB,MAAMJ,EAAGA,EAAI,GAC5BA,GAAK,OACA,GAAW,MAAPqyG,EAAY,CACrB,IAAIhnB,EAAMrrF,EACV,KAAqB,MAAd0jB,EAAK2nE,IACVA,GAAO,EAET,MAAM62C,EAAQx+G,EAAKtjB,MAAMJ,EAAGqrF,GAC5B,IAAI6C,EAAQxqE,EAAKjN,QAAQyrH,EAAO72C,GAChC,MAAkB,IAAX6C,IAAqC,MAApBxqE,EAAKwqE,EAAQ,IAA6C,MAA/BxqE,EAAKwqE,EAAQg0C,EAAMpiI,UACpEouF,EAAQxqE,EAAKjN,QAAQyrH,EAAOh0C,EAAQ,GAEtC,MAAMhhD,GAAkB,IAAXghD,EAAe7C,EAAM6C,EAAQg0C,EAAMpiI,OAChDwI,GAAUob,EAAKtjB,MAAMJ,EAAGktC,GACxBltC,EAAIktC,CACN,MAAO,GAAW,MAAPmlE,EAAY,CACrB,MAAMx5F,EAAO6K,EAAKtjB,MAAMJ,GAAGw2C,MAAMsqF,GACjC,GAAIjoH,EAAM,CACR,MAAMgZ,EAAOhZ,EAAK,GAAGpC,QAAQ,KACvB3L,GAAiB,IAAV+mB,EAAchZ,EAAK,GAAKA,EAAK,GAAGzY,MAAMyxB,EAAO,GACpDswG,GAAkB,IAAVtwG,EAAchZ,EAAK,GAAG8K,OAAS9K,EAAK,GAAGzY,MAAM,EAAGyxB,GAAMlO,OACpErb,GAAU+4H,EAAYv2H,GAAQD,EAAQC,EAAgB,KAAVq3H,EAAer3H,EAAK6Y,OAASw+G,GAAStpH,EAAK,GACvF7Y,GAAK6Y,EAAK,GAAG/Y,OACb,QACF,CACA,MAAMsiI,EAAWC,EAAa3+G,EAAM1jB,EAAG,IAAK,KAC5C,IAAIktC,EAAOltC,EAAI,EACf,IAAkB,IAAdoiI,IAA2C,MAAvB1+G,EAAK0+G,EAAW,IAAqC,MAAvB1+G,EAAK0+G,EAAW,IAAa,CACjF,MAAMxnC,EAAOl3E,EAAK0+G,EAAW,GACvBE,EAAYD,EAAa3+G,EAAM0+G,EAAW,EAAGxnC,EAAe,MAATA,EAAe,IAAM,KAC9E1tD,GAAsB,IAAfo1F,EAAmBF,EAAW,EAAIE,EAAY,CACvD,CACAh6H,GAAUob,EAAKtjB,MAAMJ,EAAGktC,GACxBltC,EAAIktC,CACN,MACE5kC,GAAU+pG,EACVryG,GAAK,CAET,CACA,OAAOsI,CACT,CAGA,SAAS+5H,EAAa3+G,EAAcsmE,EAAe4Q,EAAc1M,GAC/D,IAAI9D,EAAQ,EACZ,IAAK,IAAIpqF,EAAIgqF,EAAOhqF,EAAI0jB,EAAK5jB,OAAQE,GAAK,EACxC,GAAgB,OAAZ0jB,EAAK1jB,GACPA,GAAK,OACA,GAAI0jB,EAAK1jB,KAAO46F,EACrBxQ,GAAS,OACJ,GAAI1mE,EAAK1jB,KAAOkuF,IACrB9D,GAAS,EACK,IAAVA,GACF,OAAOpqF,EAIb,OAAQ,CACV,CAGA,SAAgB6hI,EAAkBz8H,GAChC,OAAOA,EAAKyF,QAAQ,SAAU,KAChC,CAiBA,SAAgB03H,EAAO56H,EAA6B66H,GAClD,MAAkC,YAA9B76H,EAAQktC,kBACH,UAEF2tF,EAAU,OAAS,QAC5B,CAEA,SAAgBjzH,EAAMhL,GACpB,MAAMgf,EAAQhf,EAAOsG,QAAQ,SAAU,MAAM2Y,MAAM,MAC7C0mD,EAA8B,GAC9B/1B,EAA2B,GACjC,IACIsuF,EADAnwH,EAAoB,GAEpBowH,EAAO,GAEX,MAAMC,EAAQ,KACZ,MAAMv9H,EAmFV,SAAwBme,GACtB,IAAIymE,EAAQ,EACRqB,EAAM9nE,EAAMzjB,OAChB,KAAOkqF,EAAQqB,GAA+B,KAAxB9nE,EAAMymE,GAAOrmE,QACjCqmE,GAAS,EAEX,KAAOqB,EAAMrB,GAAmC,KAA1BzmE,EAAM8nE,EAAM,GAAG1nE,QACnC0nE,GAAO,EAET,OAAO9nE,EAAMnjB,MAAM4pF,EAAOqB,GAAKp9E,KAAK,KACtC,CA7FiB20H,CAAetwH,GACxBmwH,GACFA,EAAe7nH,KAAOxV,EACtBq9H,EAAeI,QA6FrB,SAAiBjoH,GACf,GAAa,KAATA,EACF,MAAO,GAET,MAAM2I,EAAQ3I,EAAK4I,MAAM,MACnB7Q,EAAQ4Q,EAAM,GAEpB,GADc5Q,EAAM6jC,MAAMmqF,GAExB,OAAOp9G,EAAMzjB,OAAS,EAAIyjB,EAAM,GAAGI,OAAS,GAE9C,GAAI,aAAa+C,KAAK/T,GACpB,OAAOA,EAAM9H,QAAQ,aAAc,IAAI8Y,OAEzC,GAAIi9G,EAAcl6G,KAAK/T,GAAQ,CAC7B,MAAM4lC,EAAO,CAAC5lC,EAAM9H,QAAQ+1H,EAAe,KAC3C,IAAK,MAAMl9G,KAAQH,EAAMnjB,MAAM,GAAI,CACjC,GAAoB,KAAhBsjB,EAAKC,QAAiBi9G,EAAcl6G,KAAKhD,GAC3C,MAEF60B,EAAKhnC,KAAKmS,EACZ,CACA,OAAO60B,EAAKj0C,IAAKrE,GAAMA,EAAE0jB,QAAQ1V,KAAK,IACxC,CACA,MAAM60H,EAAsB,GAC5B,IAAK,MAAMp/G,KAAQH,EAAO,CACxB,GAAoB,KAAhBG,EAAKC,OACP,MAEFm/G,EAAUvxH,KAAKmS,EAAKC,OACtB,CACA,OAAOm/G,EAAU70H,KAAK,IACxB,CA5H+B40H,CAAQz9H,IAEjCs9H,EAAOt9H,EAETkN,EAAU,IAGZ,IAAImvH,EACJ,IAAK,MAAMsB,KAAWx/G,EAAO,CAC3B,GAAIk+G,EAAO,CACTnvH,EAAQf,KAAKwxH,GACb,MAAM70C,EAAQ60C,EAAQvsF,MAAM,+BACxB03C,GAASA,EAAM,GAAG,KAAOuzC,EAAMM,MAAQ7zC,EAAM,GAAGpuF,QAAU2hI,EAAM3hI,SAClE2hI,OAAQj0H,GAEV,QACF,CACA,MAAMotF,EAAOmoC,EAAQvsF,MAAMmqF,GAC3B,GAAI/lC,IAAyB,MAAfA,EAAK,GAAG,KAAcA,EAAK,GAAGvpF,SAAS,MAAO,CAC1DowH,EAAQ,CAAEM,KAAMnnC,EAAK,GAAG,GAAI96F,OAAQ86F,EAAK,GAAG96F,QAC5CwS,EAAQf,KAAKwxH,GACb,QACF,CACA,MAAMr/G,EAAOs/G,EAAcD,GACrBrlF,EAAUulF,EAAav/G,GAC7B,GAAe,MAAXg6B,EAAiB,CACnBprC,EAAQf,KAAKmS,GACb,QACF,CACAi/G,IACA,MAAMx4D,EAA2B,CAC/B+4D,MAAOxlF,EAAQwlF,MACf9iB,MAAO1iE,EAAQ0iE,MACfyiB,QAAS,GACTjoH,KAAM,GACNpO,SAAU,IAEZ,KAAO2nC,EAAMr0C,OAAS,GAAKq0C,EAAMA,EAAMr0C,OAAS,GAAGojI,OAAS/4D,EAAQ+4D,OAClE/uF,EAAM1wB,MAER,MAAMsjC,EAAS5S,EAAMA,EAAMr0C,OAAS,IACnCinD,EAASA,EAAOv6C,SAAW09D,GAAU34D,KAAK44D,GAC3Ch2B,EAAM5iC,KAAK44D,GACXs4D,EAAiBt4D,CACnB,CAEA,OADAw4D,IACO,CAAED,OAAMx4D,WACjB,CAiBA,SAAS+4D,EAAav/G,GACpB,MAAM8yB,EAAQ9yB,EAAK8yB,MAAMkqF,GACzB,GAAa,MAATlqF,EACF,OAEF,MAAM4pE,EAAQ5pE,EAAM,GAAG3rC,QAAQ,wBAAyB,IAAI8Y,OAC5D,MAAc,KAAVy8F,EAGG,CAAE8iB,MAAO1sF,EAAM,GAAG12C,OAAqBsgH,cAH9C,CAIF,CAEA,SAAS4iB,EAAct/G,GACrB,OAAOA,EAAKrS,SAAS,MAAQqS,EAAK7Y,QAAQg2H,EAAY,MAAQn9G,CAChE,CAgDA,SAASy/G,EAAe/9H,SAEtB,OAA8C,QAAvCc,EADYd,EAAKyF,QAAQ,SAAU,MAAM2Y,MAAM,cACpCkT,KAAM9sB,GAAmB,KAAbA,EAAE+Z,eAAc,IAAAzd,EAAAA,EAAI,EACpD,CAaA,SAAgBi2E,EAAWinD,GACzB,OAAOA,EACJv4H,QAAQ,eAAgB,MACxBA,QAAQ,iEAAkE,QAC1EA,QAAQ,qBAAsB,MAC9BA,QAAQ,WAAY,IACpBA,QAAQ,gCAAiC,CAACw4H,EAAOv4H,WAChD,GAAgB,MAAZA,EAAK,GAAY,CACnB,MAAMvF,EAAiC,MAA1BuF,EAAK,GAAGyK,cAAwBkvD,SAAS35D,EAAK1K,MAAM,GAAI,IAAMqkE,SAAS35D,EAAK1K,MAAM,GAAI,IACnG,OAAOmF,EAAO,GAAKA,GAAQ,QAAW4b,OAAOi2E,cAAc7xF,GAAQ89H,CACrE,CACA,OAAwC,QAAjCn9H,EAAA86H,EAAcl2H,EAAKyK,sBAAc,IAAArP,EAAAA,EAAIm9H,GAElD,CAhXannD,EAAAonD,UAAY,IACZpnD,EAAAqnD,SAAW,KAERrnD,EAAAsnD,UAAhB,SAA0Bp+H,GACxB,OAAIA,EAAKtF,OAASo8E,EAAAonD,YAGX,IAAI10E,aAAcC,OAAOzpD,GAAMtF,OAASo8E,EAAAqnD,QACjD,EAEarnD,EAAAunD,eAAiB,6CAA6CvnD,EAAAonD,UAAUI,eAAe,uBAEvFxnD,EAAAolD,cAAgB,GAIbplD,EAAAn8D,QAAOA,EAMPm8D,EAAAmlD,YAAWA,EAQXnlD,EAAAynD,UAAhB,SAA0BnC,EAAkB3hH,GAC1C,OAAO0hH,EAASC,EAAU,CAAC3oH,EAAMspH,KAC/B,MAAMv9H,EAAMmb,EAAQlH,GACd+qH,EAAuBzB,EA4BnBt3H,QAAQk2H,EAAsB,QA3BxC,OAAOxgI,OAAOJ,UAAUwC,eAAetC,KAAKwf,EAAUjb,GAClD,IAAIg/H,gBAAoBxoH,mBAAmBxW,MAC3Cg/H,GAER,EAGgB1nD,EAAA2nD,QAAhB,SAAwBrC,GACtB,MAAMt0C,EAAO,IAAItmF,IACXk9H,EAAkB,GASxB,OARAvC,EAASC,EAAU,CAAC3oH,EAAMspH,KACxB,MAAMv9H,EAAMmb,EAAQlH,GAKpB,OAJKq0E,EAAK9rF,IAAIwD,KACZsoF,EAAK92E,IAAIxR,GACTk/H,EAAMvyH,KAAKsH,EAAK8K,SAEXw+G,IAEF2B,CACT,EAGgB5nD,EAAA6nD,YAAhB,SAA4B3+H,GAC1B,OAAOm8H,EAASn8H,EAAM,CAAC4+H,EAAO7B,IAAUA,EAC1C,EAqHgBjmD,EAAA2lD,kBAAiBA,EAMjB3lD,EAAA+nD,cAAhB,SAA8B7+H,GAC5B,MAAO,iFAAiFshB,KAAKthB,EAC/F,EAIgB82E,EAAAgoD,aAAhB,SAA6B5xH,EAAiB6xH,EAAch5G,GAC1D,MAAa,YAATA,GAAyC,KAAnB7Y,EAAQqR,OACzBwgH,EAEF,GAAG7xH,EAAQzH,QAAQ,OAAQ,UAAUs5H,GAC9C,EAEgBjoD,EAAAqmD,OAAMA,EAONrmD,EAAA3sE,MAAKA,EA6DL2sE,EAAAkoD,QAAhB,SAAwBz8H,EAA6B66H,EAAkB5oH,EAAgB,aACrF,MAAMyqH,EAAS9B,EAAO56H,EAAS66H,GAC/B,IAAIp9H,EACJ,GAAe,YAAXi/H,EAAsB,CACxB,MAAM91E,EAASh/C,EAAM5H,EAAQ0Y,aAE7Bjb,EA4EJ,SAAuBA,GACrB,OAAOA,EACJyF,QAAQ,6BAA8B,MACtCA,QAAQ,oBAAqB,MAC7BA,QAAQ,yBAA0B,MAClCA,QAAQ,oEAAqE,IAC7EA,QAAQ,uBAAwB,MAChCA,QAAQ,0BAA2B,MACnCA,QAAQ,eAAgB,KAC7B,CArFWy5H,CADuB,KAAhB/1E,EAAOm0E,KAAcS,EAAe50E,EAAOm0E,MAAoC,QAA3Bz8H,EAAkB,QAAlBC,EAAAqoD,EAAO2b,SAAS,UAAE,IAAAhkE,OAAA,EAAAA,EAAE28H,eAAO,IAAA58H,EAAAA,EAAI,GAEnG,MACEb,EAAO+9H,EADa,SAAXkB,EACaloD,EAAWx0E,EAAQ0Y,aAEnB1Y,EAAQ0Y,aAEhC,OAoGF,SAAajb,EAAcwU,GACzB,GAAIxU,EAAKtF,QAAU8Z,EACjB,OAAOxU,EAET,MAAM5D,EAAO4D,EAAKhF,MAAM,EAAGqF,KAAKmqC,IAAIh2B,EAAQ,EAAG,IACzC2qH,EAAQ/iI,EAAKgjI,YAAY,KAI/B,MAAO,IAFmC,MAAtBp/H,EAAK5D,EAAK1B,SACDykI,GAAS,EAAI/iI,EAAOA,EAAKpB,MAAM,EAAGmkI,IAC/C1lF,YAClB,CA9GSs6D,CAgGT,SAAkB/zG,GAChB,OAAOA,EAAKyF,QAAQ,OAAQ,KAAK8Y,MACnC,CAlGa8gH,CAASr/H,GAAOwU,EAC7B,EAgFgBsiE,EAAAC,WAAUA,CA8B3B,CAlYD,CAAiBD,IAAWz7E,EAAAy7E,YAAXA,EAAW,qGCzC5B,MAAAxzE,EAAAtG,EAAA,OAGA,IAAiBsiI,GAAjB,SAAiBA,GAKf,SAAgBC,EAAO75H,GACrB,MAKM85H,EALQ95H,EACXrD,UAAU,OACVoD,QAAQ,SAAU,IAClB2Y,MAAM,iBACN3c,OAAQ8vB,GAAMA,EAAE72B,OAAS,GAEzBwE,IAAI,CAACqyB,EAAG32B,IAAa,IAANA,EAAU22B,EAAEphB,cAAgBohB,EAAEkuG,OAAO,GAAGC,cAAgBnuG,EAAEv2B,MAAM,GAAGmV,eAClFtH,KAAK,IACR,OAAqB,IAAjB22H,EAAM9kI,OACD,WAEF,SAAS4mB,KAAKk+G,GAAS,WAAWA,IAAUA,CACrD,CAOA,SAAgBvO,EAASvrH,EAAci6H,EAAyBC,GAC9D,MAAMn+B,EAAO,IAAIjgG,IACjB,IAAK,MAAM3C,KAAM1D,OAAOiE,KAAKkE,EAAAs4E,kBAC3B6lB,EAAKzwF,IAAInS,EAAGsR,eAEd,IAAK,MAAMtR,KAAM8gI,EACfl+B,EAAKzwF,IAAInS,EAAGsR,eAED,MAATyvH,GACFn+B,EAAKn6E,OAAOs4G,EAAMzvH,eAEpB,MAAM+qB,EAAOqkG,EAAO75H,GACpB,IAAK+7F,EAAKzlG,IAAIk/B,EAAK/qB,eACjB,OAAO+qB,EAET,IAAI9Z,EAAI,EACR,KAAOqgF,EAAKzlG,IAAI,GAAGk/B,IAAO9Z,IAAIjR,gBAC5BiR,GAAK,EAEP,MAAO,GAAG8Z,IAAO9Z,GACnB,CAxCgBk+G,EAAAC,OAAMA,EAoBND,EAAArO,SAAQA,EA2BRqO,EAAAO,OAAhB,SACE9gI,EACA+gI,EACAC,EAA8B,IAE9B,OAA6B,MAAzBD,EAAS/gI,EAASF,IACbE,EAET5D,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYpE,GAAQ,CAAEF,GAAIoyH,EAASlyH,EAAS2G,KAAK6Y,OAAQ,IAAIpjB,OAAOiE,KAAK0gI,MAAcC,KACzF,CACD,CA9DD,CAAiBT,IAAUjkI,EAAAikI,WAAVA,EAAU,8wBCiE3BjkI,EAAA2kI,UAAA,SAAgCzjH,EAAiB0jH,2CAC/C,MAAMC,QAAuBr/F,EAAAgQ,eAAe5rC,IAAI,mBAChD,OAAIi7H,EACK,aAAaA,IAEH,MAAV3jH,GAAkB0jH,EAAU,aAAa1jH,IAAW,WAE/D,IAkCAlhB,EAAA8nC,gBAAA,SACE74B,EACAkB,qDAQA,MAAMkJ,GAAMlJ,aAAI,EAAJA,EAAMkJ,MAAOf,EAAAgB,SAASzQ,MAAMqF,SAASqT,SAASC,MACpDsjH,EAAezrH,EAAIE,aAAa3P,IAAI,sBAAmBmD,EACvDg4H,EAAiB1rH,EAAIE,aAAa3P,IAAI,wBAAqBmD,EAC3Dm+B,EAA4C,SAAnC7xB,EAAIE,aAAa3P,IAAI,UAE9Bo7H,EAA+B,QAAjBv/H,EAAA0K,aAAI,EAAJA,EAAM60H,mBAAW,IAAAv/H,EAAAA,EAA4C,SAAxC4T,EAAIE,aAAa3P,IAAI,eAExDq7H,EAAa90H,aAAI,EAAJA,EAAM80H,WACzB,IAAI7jH,EACJ,GAAIjR,aAAI,EAAJA,EAAMiR,QACRA,EAAU,CAAEA,QAASjR,EAAKiR,cACrB,GAAwB,OAApBjR,aAAI,EAAJA,EAAMylC,YACf,IACEx0B,EAAUhc,KAAK0J,MAAMqB,EAAKylC,WAC5B,CAAE,MAAO5zC,GACPof,OAAUrU,CACZ,CAEF,MAAMy8G,EACJsb,GAAgBC,EACZ,CACEv0H,KAAMs0H,EAAgB,QAAqB,UAC3Ct3F,QAASs3F,GAAgBC,GAAkB,SAE7Ch4H,EAEN,GAAe,MAAXqU,GAAsC,MAAnBA,EAAQA,QAAiB,CAC9C,MAAM5L,EAAuB,GAC7B,IAAI0vH,EAOA93B,EANJ,IACE83B,QA7DN,SACEj2H,EACAy4B,EACAkO,2CAEA,MAAMuvF,GAAqB,EAAA32E,EAAA42E,iBAAgBxvF,GAAYv2C,OAAS,EAC1DgmI,EACJF,GAAwC,MAAlBz9F,EAAMnhC,eAClBy+B,EAAAmE,KAAKqoB,gBAAgBviD,EAAQ2mC,EAAWr+B,QAASmwB,EAAMnhC,SAAUmhC,EAAMgB,WAAa,IAC1F,CAAEniC,SAAUmhC,EAAMnhC,SAAUmiC,UAAWhB,EAAMgB,WAC7CW,EACc,MAAlB3B,EAAMnhC,UAA+C,MAA3BmhC,EAAM2B,wBACtB,EAAAmlB,EAAAkD,eAAcziD,EAAQy4B,EAAM2B,wBAClCt8B,EACAmgG,QAAqBhoE,EAAAqC,QAAQ39B,IAAIqF,EAAQ2mC,GAAY,GAC3D,GAAKs3D,EAAaz8F,QAGlB,OAAA3Q,OAAAgI,OAAAhI,OAAAgI,OAAA,CAASsZ,QAAS8rF,EAAar+F,MAASw2H,GAAQ,CAAEh8F,oBAAmB87F,sBACvE,GA0CqBG,CAAiBr2H,EAAQmS,EAASA,EAAQA,QAC3D,CAAE,MAAOpf,GACPmhB,QAAQtN,MAAM7T,GACdkjI,OAASn4H,CACX,CAEA,GAAc,MAAVm4H,EACF93B,EAAe83B,EAAO9jH,YACjB,CAGL,MAAMimB,EAAU,IAAIxC,EAAArsB,QAAQvJ,GACtB8R,EAAS,WAAWzN,EAAAsB,WAAWC,YAAY,KAC3C0wH,QAAkBl+F,EAAQzmB,UAAUxb,KAAKC,UAAU+b,GAAU,CAAEsmB,MAAO,SAC5ElyB,EAAOy1B,iBAAmB,CACxBlqB,OAAQwkH,QAAAA,EAAaxkH,EACrBwrE,OAAqB,MAAbg5C,EACRC,WAAW,EACX99F,OAAO,GAET0lE,EAAeloE,EAAAqC,QAAQC,YACzB,CAEA,MAAMi+F,EACgB,MAApBrkH,EAAQyG,UACJqd,EAAAqC,QAAQolE,kBAAkBvrF,EAAQyG,SAAU1kB,EAAAi2H,eAAgB,YAAY3oH,QAGxEoiC,EAA4BmyF,EAAc,CAAC,CAAE36H,KAAM,YAAe,CAAC,CAAEA,KAAM,SACjF,MAAO,CACL+W,QAASgsF,EACT7mG,SAAU2+H,aAAM,EAANA,EAAQ3+H,SAClBmiC,UAAWw8F,aAAM,EAANA,EAAQx8F,UACnBC,UAAqB,MAAVu8F,EAAiB9jH,EAAQunB,eAAY57B,EAChD4W,UAAqB,MAAVuhH,EAAiB9jH,EAAQuC,eAAY5W,EAChDs8B,kBAAmB67F,aAAM,EAANA,EAAQ77F,kBAC3BxhB,SAAU49G,EAAkB,CAAE,EAAGrkH,EAAQyG,UAAa,GACtD2hG,eACAD,QAAS,CAAE5xE,MAAO,IAClB95B,SAAU,CAAC83D,EAAAI,sBACX0zC,UAAW,GACX52E,cACA9K,KAAMk9F,EACNvb,gBAA2C,QAA1BlkH,EAAA0/H,aAAM,EAANA,EAAQC,0BAAkB,IAAA3/H,GAAAA,EAC3CgQ,SACA01B,SAEJ,CACA,MAAMxiC,GAAW,EAAAq8B,EAAAukF,YAAW,CAC1BE,eACAt+E,WAWF,OARI+5F,IACFv8H,EAASq/B,KAAOk9F,GAGdD,IACFt8H,EAASmqC,YAAc,CAAC,CAAExoC,KAAM,aAElCq7B,EAAAyH,SAAStF,IAAiB,QAAbr1B,EAAA9J,EAASq/B,YAAI,IAAAv1B,OAAA,EAAAA,EAAEhP,GAAI,qBAAsB,GAAI,QACnDkF,CACT,IAuMA1I,EAAA0lI,iBAAA,SAAiCv+F,GAC/B,MAAO,CACL,CAACb,EAAU8B,EAAQt+B,EAAUpB,KAC3B,MAAMi9H,EAAoB,SAAUv9F,GAA0B,2BAAhBA,EAAO53B,QAEnD,SAAU43B,IAA0B,gBAAhBA,EAAO53B,MAA0C,yBAAhB43B,EAAOmM,OACrCrP,EAAAqC,QAAQy7C,UAAUl5E,EAASsX,QAAS1Y,EAAS0Y,UACpEklB,EAASqtB,EAAAvtB,MAAMwE,MAAM,CAAE/C,IAAK89F,MAGhC,CAACr/F,EAAU8B,EAAQt+B,EAAUpB,KAC3B,GAAIoB,EAASsX,QAAQvD,WAAanV,EAAS0Y,QAAQvD,SAAU,CAC3D,MAAM+nH,EAAgBl9H,EAAS0Y,QAAQvD,SAASha,IAAKsF,GAAMA,EAAE3F,IAC7D,GAAI/D,MAAMP,KAAK,IAAIiH,IAAIy/H,IAAgBvmI,SAAWumI,EAAcvmI,OAAQ,EACtE,EAAAsmC,EAAA2C,IAAG,wBAAyB,CAC1Bu9F,WAAYzgI,KAAKC,UAAUugI,GAC3BE,mBAAoB1gI,KAAKC,WACtB6J,OAAO29F,oBAAsB,IAAIhpG,IAAK/B,GAAM,CAACA,EAAE0O,KAAM,SAAU1O,EAAIA,EAAEyyC,UAAOxnC,OAGjF,MAAMg5H,EAAcp7H,EAAAC,gBAAgBwO,OAAO1Q,EAAS0Y,QAAQvD,SAAU,OACtE,EAAAknB,EAAA6B,aACEN,EACA,EAAC,EAAAxB,EAAA+B,MAAa19B,EAAE,WAAWD,GAAG,YAAY1C,OAAOu/H,IACjD,4BAEJ,CACF,GAEF,CAACz/F,EAAU8B,EAAQt+B,EAAUpB,KAC3B,MAAMmf,EAAWnf,EAASmf,SAAS,GACnC,GAAgB,MAAZA,EAAkB,CACpB,MAAMy7D,EAAa9wD,EAAAta,QAAQy1B,WAAW7jC,EAAU+d,EAAS1gB,WACnDgtC,EAAa3hB,EAAAta,QAAQy1B,WAAWjlC,EAAUmf,EAAS1gB,WACvC,MAAdm8E,GAAoC,MAAdnvC,GAAuBnsC,EAAAwC,YAAY2uD,QAAQmqB,EAAYnvC,IAC/E7N,EAAS,CAAE91B,KAAM,iCAErB,GAEF,CAAC81B,EAAU8B,EAAQt+B,EAAUpB,eAC3B,GACEoB,EAASsX,QAAQsxB,QAAUhqC,EAAS0Y,QAAQsxB,QACN,QAApCjtC,EAAAiD,EAAS0Y,QAAQsxB,MAAM3oC,OAAOA,cAAM,IAAAtE,EAAAA,EAAI,IAAIpG,OAAS,GAAoD,MAA/CqJ,EAAS0Y,QAAQ7X,SAAS2wC,kBACtF,CACA,MAAM8rF,EACsF,QAA1FxgI,EAAA8zE,EAAAqF,MAAMC,kCAAkC90E,EAASsX,QAAQsxB,MAAO5oC,EAASsX,QAAQ7X,iBAAS,IAAA/D,EAAAA,EAC1F0C,EAAAS,OAAOE,MAAM,EAAGiB,EAASsX,QAAQ7X,SAASS,OACtCi8H,EACsF,QAA1FzzH,EAAA8mE,EAAAqF,MAAMC,kCAAkCl2E,EAAS0Y,QAAQsxB,MAAOhqC,EAAS0Y,QAAQ7X,iBAAS,IAAAiJ,EAAAA,EAC1FtK,EAAAS,OAAOE,MAAM,EAAGH,EAAS0Y,QAAQ7X,SAASS,OACvC9B,EAAAS,OAAOyvC,GAAG4tF,EAAeC,MAC5B,EAAAlhG,EAAA6B,aACEN,EACA,EAAC,EAAAxB,EAAA+B,MAAa19B,EAAE,WAAWA,EAAE,YAAYD,GAAG,qBAAqB1C,OAAOy/H,IACxE,6BAEF3/F,EAAS,CAAE91B,KAAM,kCAErB,GAEF,CAAC81B,EAAU8B,EAAQt+B,EAAUpB,iBAC3B,GAAI,SAAU0/B,GAA0B,gBAAhBA,EAAO53B,OAA2C,SAAhB43B,EAAOmM,MAAmC,SAAhBnM,EAAOmM,MAAkB,CAC3G,MAAM2xF,EAAgBzgG,EAAA4N,OAAOxhC,QAAQ/H,EAAS+oC,aACxCszF,EAAgB1gG,EAAA4N,OAAOxhC,QAAQnJ,EAASmqC,aACxCuzF,EAAwC,wBAAvBF,EAAc77H,KAAqD,QAApB5E,EAAAygI,EAAcpzF,cAAM,IAAArtC,OAAA,EAAAA,EAAEtB,SAAM4I,EAC5Fs5H,EACmB,wBAAvBH,EAAc77H,KAAqD,QAApB7E,EAAA0gI,EAAcpzF,cAAM,IAAAttC,OAAA,EAAAA,EAAEutC,kBAAehmC,EAChFu5H,EAAwC,wBAAvBH,EAAc97H,KAAqD,QAApBmI,EAAA2zH,EAAcrzF,cAAM,IAAAtgC,OAAA,EAAAA,EAAErO,SAAM4I,EAC5Fw5H,EACmB,wBAAvBJ,EAAc97H,KAAqD,QAApBoI,EAAA0zH,EAAcrzF,cAAM,IAAArgC,OAAA,EAAAA,EAAEsgC,kBAAehmC,EACtF,GAAuB,MAAnBs5H,GAA8C,MAAnBE,GAA6C,MAAlBH,GAA4C,MAAlBE,EAAwB,CAC1G,MAKMzlF,EALc2lF,EAAAtmF,qBAAqB4E,eACvCuhF,EAAgBx0H,QAAQ3K,QAAQ7C,QAChCkiI,EAAgB10H,QAAQ3K,QAAQ7C,QAChCqE,EAAS0Y,QAAQ7X,UAEQ68H,GACvBvlF,IACF,EAAA9b,EAAA6B,aACEN,EACA,EAEI,EAAAxB,EAAA+B,MAAa19B,EAAE,eAAe6vE,OAAO,OAAQ,uBAAuB7vE,EAAE,UAMrED,GAAG,OACH1C,OAAOq6C,IAEZ,sBAGN,CACF,GAEF,CAACva,EAAU8B,EAAQt+B,EAAUpB,KAC3B,MAAMmf,EAAWnf,EAASmf,SAAS,GACnC,GAAgB,MAAZA,EAAkB,CACpB,MAAMpgB,EAAkBqC,EAASsX,QAAQ7X,SAAShE,aAC5CmC,EAAkBgB,EAAS0Y,QAAQ7X,SAAShE,aAClD,GACqB,MAAnBkC,GACmB,MAAnBC,IACCM,EAAAwC,YAAY2uD,QAAQ1xD,EAAiBC,GACtC,CACA,MAAMyW,EAAUnW,EAAAwC,YAAYtE,YAAYuB,EAAiBC,GACzD,GAAIM,EAAAwC,YAAY87G,WAAWnoG,GAAU,CACnC,MAAMsoH,EAAmBz+H,EAAAwC,YAAYzG,KAAKoa,GACpCuoH,EAAkB7+G,EAAS5hB,QAAQG,OAAQ7C,IAC/C,MAAMY,EAAM8D,EAAA0B,SAASw5B,MAAM5/B,EAAMG,UACjC,OAA0C,IAAnC+iI,EAAiBzwH,QAAQ7R,KAE9BuiI,EAAgBrnI,OAAS,GAC3BinC,EAAS,CACP91B,KAAM,gCACNyyG,mBAAoBt4G,EAAAC,gBAAgB+B,QAAQ+5H,EAAgB7iI,IAAK7B,GAAMA,EAAE0pC,qBAG/E,CACF,CACF,GAEF,CAACpF,EAAU8B,EAAQt+B,EAAUpB,KAC3B,MAAMmf,EAAWnf,EAASmf,SAAS,GACnC,GAAgB,MAAZA,EAAkB,CACpB,MAAM8+G,EAAejkG,EAAAO,UAAU2jG,cAAc98H,EAASsX,QAAQ7X,UAAU9F,UAClEojI,EAAenkG,EAAAO,UAAU2jG,cAAcl+H,EAAS0Y,QAAQ7X,UAAU9F,UACxE,GAAoB,MAAhBkjI,GAAwC,MAAhBE,IAAyB7+H,EAAAwC,YAAY2uD,QAAQwtE,EAAcE,GAAe,CACpG,MAAMC,EAAsB9+H,EAAAwC,YAAYzG,KAAKiE,EAAAwC,YAAYtE,YAAYygI,EAAcE,IAC7Et9H,EAAWb,EAAS0Y,QAAQ7X,SAC5Bm9H,EAAkB7+G,EAAS5hB,QAAQG,OAAQ7C,IAC/C,MAAMwjI,EAAcrkG,EAAAO,UAAU+jG,8BAA8Bz9H,EAAUhG,EAAMG,UAC5E,OAAsB,MAAfqjI,IAAqE,IAA9CD,EAAoB9wH,QAAQ+wH,KAExDL,EAAgBrnI,OAAS,GAC3BinC,EAAS,CACP91B,KAAM,gCACNyyG,mBAAoBt4G,EAAAC,gBAAgB+B,QAAQ+5H,EAAgB7iI,IAAK7B,GAAMA,EAAE0pC,qBAG/E,CACF,GAEF,CAACpF,EAAU8B,EAAQt+B,EAAUpB,KACvB+8B,EAAA4N,OAAO0kC,YAAYjuE,EAAS+oC,eAAiBpN,EAAA4N,OAAO0kC,YAAYrvE,EAASmqC,cAC3E7L,WAAW,KACT93B,OAAOskC,OAAO,EAAG,IAChB,IAGP,CAAClN,EAAU8B,EAAQt+B,EAAUpB,KACvB,SAAU0/B,GAA0B,gBAAhBA,EAAO53B,MAA0C,oBAAhB43B,EAAOmM,MAC9DvN,WAAW,KACT93B,OAAO+3H,WAAY,GAClB,MAIX,EAmEAjnI,EAAAknI,kBAAAA,EAaAlnI,EAAA0tC,iBAAAA,EAyFA1tC,EAAAmnI,kBAAAA,EAjuBA,MAAA30G,EAAA7wB,EAAA,OACAyhB,EAAAzhB,EAAA,OAEAylI,EAAAzlI,EAAA,OACAwjC,EAAAxjC,EAAA,OACA0lI,EAAA1lI,EAAA,KACAujC,EAAAvjC,EAAA,OACA8jC,EAAA9jC,EAAA,OACAmjC,EAAAnjC,EAAA,OACAojC,EAAApjC,EAAA,OAWA2R,EAAA3R,EAAA,OACAwB,EAAAxB,EAAA,OAaA6jC,EAAA7jC,EAAA,OACAqjC,EAAArjC,EAAA,OACAg0E,EAAAh0E,EAAA,OACA+jC,EAAA/jC,EAAA,OACA6lB,EAAA7lB,EAAA,OACAkjC,EAAAljC,EAAA,MACA6sD,EAAA7sD,EAAA,OACAqG,EAAArG,EAAA,OACA2W,EAAA3W,EAAA,OACA2jC,EAAA3jC,EAAA,OAEAgyD,EAAAhyD,EAAA,OACAgJ,EAAAhJ,EAAA,OACA2lI,EAAA3lI,EAAA,OACAsG,EAAAtG,EAAA,OACA+lB,EAAA/lB,EAAA,OAGA6kI,EAAA7kI,EAAA,OACAgkC,EAAAhkC,EAAA,OACA+gC,EAAA/gC,EAAA,OACA23E,EAAA33E,EAAA,OACAuG,EAAAvG,EAAA,OACAokC,EAAApkC,EAAA,OAIM4lI,IACc,oBAAXr4H,UAAgC,OAANA,aAAM,IAANA,YAAM,EAANA,OAAQqS,YACnCjJ,EAAAgB,SAASzQ,MAAMqG,OAAOqS,SAASC,MAAMjI,aAAa3P,IAAI,QAuV9D,IAAI49H,EAqOJ,SAAgBN,EAAkB9+H,GAChC,OAAAtI,OAAAgI,OAAAhI,OAAAgI,OAAA,CACEsZ,QAAShZ,EAAMgZ,QACf7a,SAAU6B,EAAM7B,SAChBmiC,UAAWtgC,EAAMsgC,UACjBC,UAAWvgC,EAAMugC,UACjBhlB,UAAWvb,EAAMub,WACc,MAA3Bvb,EAAMihC,kBAA4B,CAAEA,kBAAmBjhC,EAAMihC,mBAAsB,IAAG,CAC1FxhB,SAAUzf,EAAMyf,SAAS,IAE7B,CAGA,SAAsB6lB,EAAiBtlC,iDACrC,MAAM8Y,EAAmB,QAAVzb,EAAA2C,EAAM2/B,YAAI,IAAAtiC,OAAA,EAAAA,EAAEjC,GAC3B,IAAK0d,EACH,OAEF,MAAMusC,EAAey5E,EAAkB9+H,SACjCm+B,QAAQk0D,IAAI,CAChBj1D,EAAAgQ,eAAezqC,IAAI,kBAAmBmW,GACtCskB,EAAAgQ,eAAezqC,IAAI,aAAamW,IAAU9b,KAAKC,UAAUooD,KAE7D,GAsCA,SAASg6E,EACP5/G,EACAirB,EACAvpC,EACAmpC,EACAg1F,GAEA,IAAIh3F,EAAc7oB,EA+BlB,OA9BIirB,EAAOhrB,iBAAmBgrB,EAAO60F,kBACnCj3F,EAActtB,EAAAK,SAAS0/F,gBACrBzyE,EACAoC,EAAOhrB,gBACPgrB,EAAOnH,aAAe,GACtBmH,EAAO1hC,WACP0hC,EAAOlhC,SACPkhC,EAAOpoB,KACPnhB,EACAmpC,IAGAtvB,EAAAK,SAAS2+F,mBAAmB1xE,KAC9BA,EAActtB,EAAAK,SAASg9F,UAAU/vE,IAE/BoC,EAAO80F,YACTl3F,EAActtB,EAAAK,SAASu+F,mBAAmBtxE,EAAaoC,EAAO1hC,WAAY0hC,EAAOpoB,OAEnFgmB,EAAcg3F,EAAYh3F,GAC1BA,EAAY+9B,UAAYtpC,EAAA2P,QAAQ85B,cAAcl+B,EAAaoC,EAAOhF,aAAcvkC,EAASigD,OAAOqlB,UAE3FzrD,EAAAK,SAASq/F,WAAWpyE,IACvB3K,EAAApe,oBAAoB8C,+BAClBimB,EACAoC,EAAO1hC,WACP0hC,EAAOpoB,KACPooB,EAAOhrB,gBACPve,GAGGmnC,CACT,CAEA,SAAgBy2F,EAAkB59H,EAAqBmpC,GACrD,MAAO,CAAC7qB,EAAUugB,qBAChB,OAAQA,EAAO53B,MACb,IAAK,oBAAqB,CACxB,MAAM8X,EACJ8f,EAAOtgB,iBAAmBN,EAAAe,gBAAgBD,oBAAoB8f,EAAOtgB,iBACvE,IAAI4oB,EAActtB,EAAAK,SAASigG,YACzB77F,EACAugB,EAAOh3B,WACPg3B,EAAOx2B,SACPw2B,EAAO1d,OACLpC,EACF/e,GAEF,MAAMs+H,EACJhgH,EAAS5hB,QAAQmiC,EAAOh3B,YAA4B,WAAhBg3B,EAAO1d,KAAoB,aAAe,QAAQ0d,EAAOx2B,UACzF4zG,EACJ90E,EAAYzqC,QAAQmiC,EAAOh3B,YAA4B,WAAhBg3B,EAAO1d,KAAoB,aAAe,QAAQ0d,EAAOx2B,UAC5Fg2H,GAAaC,EAAO36H,eAAiBs4G,EAAOt4G,YAiDlD,OAhDAwjC,EAAc+2F,EACZ/2F,EACA,CACEt/B,WAAYg3B,EAAOh3B,WACnBQ,SAAUw2B,EAAOx2B,SACjB8Y,KAAM0d,EAAO1d,KACb5C,gBAAiBsgB,EAAOtgB,gBACxB6jB,YAAavD,EAAOuD,YACpBmC,aAAc1F,EAAO0F,aACrB65F,kBAAmBv/F,EAAOtgB,iBAAiD,OAAhB,QAAdriB,EAAAirC,EAAY4Q,UAAE,IAAA77C,OAAA,EAAAA,EAAEm+G,YAC7DgkB,aAEFr+H,EACAmpC,EACCtE,UACC,OAAIhG,EAAO0F,cAIe,MAAtBM,EAAUjC,SAHLiC,EAMW,YAAhBhG,EAAO1d,MAAyC,MAAnB86F,EAAOh5G,SAE/B4W,EAAAK,SAASo9F,aAAaz9F,EAAAK,SAASg9F,UAAUryE,IAE3ChrB,EAAAK,SAAS87F,WACdn8F,EAAAK,SAASo9F,aAAazyE,GACN,QAAhB3oC,EAAA2iC,EAAO+F,iBAAS,IAAA1oC,EAAAA,GAAI,IAAIspB,MAAOmV,UAC/BkE,EAAO1d,KACP0d,EAAOh3B,WACPg3B,EAAOx2B,SACPrI,KAIF6+B,EAAO2F,wBACT2C,EAAW5wC,OAAAgI,OAAAhI,OAAAgI,OAAA,GACN4oC,GAAW,CACd4Q,GAAExhD,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAO4oC,EAAY4Q,IAAE,CAAEvT,wBAAsC,QAAdvoC,EAAAkrC,EAAY4Q,UAAE,IAAA97C,OAAA,EAAAA,EAAEuoC,4BAGjE3F,EAAO4F,aACT0C,EAAW5wC,OAAAgI,OAAAhI,OAAAgI,OAAA,GACN4oC,GAAW,CACd4Q,GAAExhD,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAO4oC,EAAY4Q,IAAE,CAAEtT,YAAY,OAGlC0C,CACT,CACA,IAAK,oBAAqB,CACxB,IAAIA,EAAW5wC,OAAAgI,OAAA,GAAQ+f,GACvB,GAAIugB,EAAO0/F,SACT,OAAAhoI,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAY4oC,GAAW,CAAE4Q,GAAExhD,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAO4oC,EAAY4Q,IAAE,CAAEsiE,gBAAY72G,MAEvC,MAArBq7B,EAAO2/F,aACTr3F,EAActtB,EAAAK,SAASugG,0BAA0BtzE,EAAatI,EAAO2/F,aAE1C,MAAzB3/F,EAAO4/F,iBACTt3F,EAActtB,EAAAK,SAASwgG,8BAA8BvzE,EAAatI,EAAO4/F,iBAEvE5/F,EAAO92B,SACTo/B,EAActtB,EAAAK,SAASygG,oBAAoBxzE,EAAatI,EAAOu8E,WAEvC,MAAtBv8E,EAAO61B,cACTvtB,EAActtB,EAAAK,SAAS0gG,uBAAuBzzE,EAAatI,EAAO61B,cAEpE,MAAMvyB,EAA0C,QAAtBl5B,EAAA41B,EAAOtgB,uBAAe,IAAAtV,OAAA,EAAAA,EAAErO,IAC9C6D,EAAAwC,YAAYzG,KAAKqkC,EAAOy7E,UAAY,IAAIxkH,OAAS,GAA0B,MAArBqsC,IACxDgF,EAActtB,EAAAK,SAASgiG,4BAA4B/0E,EAAahF,EAAmBtD,EAAOy7E,UAAY,KAExGnzE,EAActtB,EAAAK,SAAS06F,iBAAiBztE,EAAatI,EAAOh3B,WAAYg3B,EAAOx2B,SAAUrI,GACrF6+B,EAAOtgB,kBACT4oB,EAActtB,EAAAK,SAAS0/F,gBACrBzyE,EACAtI,EAAOtgB,gBACPsgB,EAAOuD,aAAe,GACtBvD,EAAOh3B,WACPg3B,EAAOx2B,SACP,UACArI,EACAmpC,IAGAtvB,EAAAK,SAAS2+F,mBAAmB1xE,KAC9BA,EAActtB,EAAAK,SAASg9F,UAAU/vE,IAEnCA,EAActtB,EAAAK,SAASu+F,mBAAmBtxE,EAAatI,EAAOh3B,WAAY,WAC1E,MAAM62H,EAAiD,QAAtCx1H,EAAAi+B,EAAYzqC,QAAQmiC,EAAOh3B,mBAAW,IAAAqB,OAAA,EAAAA,EAAEtH,KAAKi9B,EAAOx2B,UAyBrE,OAxB4B,MAAxB8+B,EAAYvE,WAEiB,OAAtB87F,aAAQ,EAARA,EAAUz7H,UAEnBkkC,EAActtB,EAAAK,SAASo9F,aAAaz9F,EAAAK,SAASg9F,UAAU/vE,KAEvDA,EAActtB,EAAAK,SAASo9F,aAAanwE,GACpCA,EAActtB,EAAAK,SAAS87F,WACrB7uE,GACA,IAAI3hB,MAAOmV,UACX,UACAkE,EAAOh3B,WACPg3B,EAAOx2B,SACPrI,KAGJmnC,EAAY+9B,UAAYtpC,EAAA2P,QAAQ85B,cAAcl+B,EAAatI,EAAO0F,aAAcvkC,EAASigD,OAAOqlB,UAChG9oC,EAAApe,oBAAoB8C,+BAClBimB,EACAtI,EAAOh3B,WACP,UACAg3B,EAAOtgB,gBACPve,GAEFzJ,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAY4oC,GAAW,CAAE4Q,GAAExhD,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAO4oC,EAAY4Q,IAAE,CAAEsiE,gBAAY72G,KAChE,CACA,IAAK,oBAAqB,CACxB,MAAMhC,EAAyC,QAAnC6d,EAAAf,EAAS5hB,QAAQmiC,EAAOh3B,mBAAW,IAAAwX,OAAA,EAAAA,EAAEzd,KAAKi9B,EAAOx2B,UAC7D,IAAK7G,GAAOA,EAAImC,YAEd,OAAO2a,EAET,MAAMsmB,EAA4B,QAAhBrlB,EAAAsf,EAAO+F,iBAAS,IAAArlB,EAAAA,GAAI,IAAIiG,MAAOmV,UACjD,IAAIwM,EAActtB,EAAAK,SAASo9F,aAAah5F,GAUxC,OARA6oB,EAActtB,EAAAK,SAASi9F,iBACrBhwE,EACAtI,EAAOh3B,WACPg3B,EAAOx2B,SACPw2B,EAAO16B,kBACPygC,EACA5kC,GAEKk+H,EACL/2F,EACA,CACEt/B,WAAYg3B,EAAOh3B,WACnBQ,SAAUw2B,EAAOx2B,SACjB8Y,KAAM,UACN5C,gBAAiBsgB,EAAOtgB,gBACxB6jB,YAAavD,EAAOuD,YACpBmC,aAAc1F,EAAO0F,aACrB65F,kBAAmBv/F,EAAOtgB,gBAC1B8/G,WAAW,GAEbr+H,EACAmpC,EACCtE,GACChG,EAAO0F,aACHM,EACAhrB,EAAAK,SAAS8rB,WACP1nB,EACAzE,EAAAK,SAASk9F,mBAAmBvyE,EAAWD,EAAW/F,EAAOh3B,WAAYg3B,EAAOx2B,SAAUrI,GACtF4kC,GAGZ,CACA,IAAK,iBACH,OAAO/F,EAAOuhF,eAAe1lH,OAAO,CAACC,EAAMgkI,IAAcA,EAAUrqG,GAAG35B,GAAO2jB,GAE/E,IAAK,sBAAuB,CAC1B,MAAM6oB,EAActtB,EAAAK,SAASihG,cAAc78F,EAAUugB,EAAOl3B,IAAK,CAC/D7E,IAAK+7B,EAAOu8E,SACZv4G,KAAMg8B,EAAOh8B,OAEf,OAAAtM,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAY4oC,GAAW,CAAE4Q,GAAExhD,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAO4oC,EAAY4Q,IAAE,CAAEggE,mBAAev0G,KACnE,CACA,IAAK,sBACH,OAAAjN,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAY+f,GAAQ,CAAEy5B,GAAExhD,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAO+f,EAASy5B,IAAE,CAAEggE,mBAAev0G,MAE7D,IAAK,mBACH,OAAOqW,EAAAK,SAAS0tB,WAAWtpB,EAAUugB,EAAOtB,KAE9C,IAAK,oBACH,OAAO1jB,EAAAK,SAAS4tB,YAAYxpB,EAAUugB,EAAOtB,MAIrD,CAEA,SAASwL,EACPO,EACAxoC,EACAyoC,EACAK,GAEA,GAAIN,EAAYxzC,OAAS,EAAG,CAC1B,MAAMwS,EAAU4zB,EAAA4N,OAAOxhC,QAAQghC,GAC/B,GAAIhhC,EAAQxH,OAASA,IAASrC,EAAAwC,YAAY2uD,QAAQtnD,EAAQihC,QAAU,GAAIA,GAAU,IAChF,OAAIK,EACK,CAACrzC,OAAAgI,OAAA,CAAEuC,QAAUyoC,EAAS,CAAEA,UAAW,KAEnCrN,EAAA4N,OAAOviC,KAAK+hC,EAAaxoC,EAAMyoC,EAG5C,CACA,OAAOD,CACT,CA9Xa7yC,EAAAmoI,eACVC,GACD,CAAChgI,EAAOggC,KACN,GAAsB,oBAAXl5B,SACTA,OAAO29F,mBAAqB,gCACrBzkE,GAAM,CAAE5kB,KAAM8hB,EAAA4P,UAAUmzF,aAAat5G,KAAK+X,OAAO,SAClD53B,OAAO29F,oBAAsB,IAAIltG,MAAM,EAAG,KAE5CuP,OAAOu+C,cAAc,CACvB,MAAM66E,EAAuBp5H,OAAOu+C,aAAaM,QAAQ,qBACzD,GAAIu6E,EAAsB,CACxB,MAAM9kH,KAAEA,EAAImpB,cAAEA,GAAkBvnC,KAAK0J,MAAMw5H,GAC1Bv5G,KAAK+X,MAAQtjB,EACf,MACbtU,OAAOu+C,aAAaS,WAAW,qBACX9lD,EAAMgZ,QAAQrI,QAAQkd,KAAMi6C,GAAOA,EAAG1sE,KAAOmpC,EAAcnpC,KAQ7E,EAAAmiC,EAAA2C,IAAG,sBANH,EAAA3C,EAAA2C,IAAG,sBAAuB,CACxBskE,YAAaxnG,KAAKC,UAChB6J,OAAO29F,mBAAmBhpG,IAAK/B,GAAM,CAACA,EAAE0O,KAAM,SAAU1O,EAAIA,EAAEyyC,UAAOxnC,OAO/E,CACF,CAEF,MAAMrE,GAAW,EAAA1I,EAAAuoI,SAAQngI,EAAOggC,GAG1B+mB,IADJ,SAAU/mB,GAA0B,gBAAhBA,EAAO53B,MAA0C,yBAAhB43B,EAAOmM,OAChBrP,EAAAqC,QAAQy7C,UAAU56E,EAAMgZ,QAAS1Y,EAAS0Y,SA4BxF,OA3BK1Y,EAAS8/H,0BAA4B9/H,EAAS0Y,UAAYhZ,EAAMgZ,SAC5C8jB,EAAAqC,QAAQ0lE,yBAAyBvkG,EAAS0Y,SAC7C3Q,UAClB/H,EAAS8/H,0BAA2B,GAIpC9gH,EAAA6C,YAAY6iD,QAkDpB,SAA4BtjE,EAAkBpB,EAAkBymD,SAC9D,GAAsB,oBAAXjgD,SACRA,OAAe9G,MAAQM,GAEtBymD,GACArlD,EAASvD,WAAamC,EAASnC,UAC/BuD,EAAS4+B,YAAchgC,EAASggC,WAChC5+B,EAAS6+B,YAAcjgC,EAASigC,WAChC7+B,EAAS6Z,YAAcjb,EAASib,WAChC7Z,EAASu/B,oBAAsB3gC,EAAS2gC,mBACxCjmB,EAAAK,SAASu/D,UAAUl5E,EAAS+d,SAAS,GAAInf,EAASmf,SAAS,MACI,MAApCnf,EAAS8M,OAAOy1B,kBAA0B,CACrE,MAAM/pB,EAAsB,QAAbzb,EAAAiD,EAASq/B,YAAI,IAAAtiC,OAAA,EAAAA,EAAEjC,GAC9BkqC,EAAiBhlC,GAAUqxB,KAAK,KAC1B7Y,IACF,EAAAykB,EAAA2C,IAAG,wBAAoBv7B,OAAWA,EAAWmU,IAGnD,CAGJ,CAtEMunH,CAAmBrgI,EAAOM,EAAUymD,GAEd,oBAAXjgD,QAA0BA,OAAO83B,YAAc93B,OAAOw5F,eAChD,MAAX8+B,GACFt4H,OAAOw5F,aAAa8+B,GAGrBt4H,OAAe9G,MAAQM,EACpB0/H,GAA2D,MAApC1/H,EAAS8M,OAAOy1B,mBACzCu8F,EAAUt4H,OAAO83B,WAAW,IAAW3Z,OAAA,4BACrCq7E,aAAa8+B,GAEb,MAAMkB,EAAqBx5H,OAAe9G,MAC1Co/H,OAAUz6H,QACJ2gC,EAAiBg7F,EACzB,GAAG,OAIFhgI,GAqUX,MAAMigI,EAA4C,CAChD,yBACA,iBACA,iBACA,wBACA,qBAGW3oI,EAAAuoI,QAAoC,CAACngI,EAAOggC,aACvD,GAC4D,UAAX,QAA/C3iC,EAAA2C,EAAMyqC,YAAYzqC,EAAMyqC,YAAYxzC,OAAS,UAAE,IAAAoG,OAAA,EAAAA,EAAE4E,OACjDs+H,EAAuB/3H,SAASw3B,EAAO53B,MAEvC,OAAOpI,EAET,GAAoB,sBAAhBggC,EAAO53B,KACT,OAAO4S,EAAAK,SAASs/F,YACd36G,EACA++H,EAAkB/+H,EAAMgZ,QAAQ7X,SAAUnB,EAAMgZ,QAAQsxB,MAAxDy0F,CAA+D/jH,EAAAK,SAAS0kB,YAAY//B,GAASggC,IAE1F,GAAoB,sBAAhBA,EAAO53B,KAChB,OAAO4S,EAAAK,SAASs/F,YACd36G,EACA++H,EAAkB/+H,EAAMgZ,QAAQ7X,SAAUnB,EAAMgZ,QAAQsxB,MAAxDy0F,CAA+D/jH,EAAAK,SAAS0kB,YAAY//B,GAASggC,IAE1F,GAAoB,mBAAhBA,EAAO53B,KAChB,OAAO4S,EAAAK,SAASs/F,YACd36G,EACA++H,EAAkB/+H,EAAMgZ,QAAQ7X,SAAUnB,EAAMgZ,QAAQsxB,MAAxDy0F,CAA+D/jH,EAAAK,SAAS0kB,YAAY//B,GAASggC,IAE1F,GAAoB,sBAAhBA,EAAO53B,KAChB,OAAO4S,EAAAK,SAASs/F,YACd36G,EACA++H,EAAkB/+H,EAAMgZ,QAAQ7X,SAAUnB,EAAMgZ,QAAQsxB,MAAxDy0F,CAA+D/jH,EAAAK,SAAS0kB,YAAY//B,GAASggC,IAE1F,GAAoB,wBAAhBA,EAAO53B,KAChB,OAAO4S,EAAAK,SAASs/F,YACd36G,EACA++H,EAAkB/+H,EAAMgZ,QAAQ7X,SAAUnB,EAAMgZ,QAAQsxB,MAAxDy0F,CAA+D/jH,EAAAK,SAAS0kB,YAAY//B,GAASggC,IAE1F,GAAoB,wBAAhBA,EAAO53B,KAChB,OAAO4S,EAAAK,SAASs/F,YACd36G,EACA++H,EAAkB/+H,EAAMgZ,QAAQ7X,SAAUnB,EAAMgZ,QAAQsxB,MAAxDy0F,CAA+D/jH,EAAAK,SAAS0kB,YAAY//B,GAASggC,IAE1F,GAAoB,qBAAhBA,EAAO53B,KAChB,OAAO4S,EAAAK,SAASs/F,YACd36G,EACA++H,EAAkB/+H,EAAMgZ,QAAQ7X,SAAUnB,EAAMgZ,QAAQsxB,MAAxDy0F,CAA+D/jH,EAAAK,SAAS0kB,YAAY//B,GAASggC,IAE1F,GAAoB,sBAAhBA,EAAO53B,KAChB,OAAO4S,EAAAK,SAASs/F,YACd36G,EACA++H,EAAkB/+H,EAAMgZ,QAAQ7X,SAAUnB,EAAMgZ,QAAQsxB,MAAxDy0F,CAA+D/jH,EAAAK,SAAS0kB,YAAY//B,GAASggC,IAE1F,GAAoB,0BAAhBA,EAAO53B,KAAkC,CAClD,MAAMqX,EAAWzf,EAAMyf,SAAS,GAChC,GAAgB,MAAZA,EACF,OAAA/nB,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKM,GAAK,CACRyqC,YAAaP,EAAWlqC,EAAMyqC,YAAa,WAAY,CAAErvC,GAAIqkB,EAASrkB,KAAM,KAEzE,GAAsC,MAAlC4E,EAAMgZ,QAAQgxB,iBAA0B,CACjD,MAAMlrC,EAAUsrB,EAAAta,QAAQy1B,WAAWvlC,EAAOggC,EAAOjhC,WAAaiB,EAAMgZ,QAAQgxB,kBAC5E,GAAe,MAAXlrC,EAAiB,CACnB,MAAMwpC,EAAcle,EAAAta,QAAQu6B,kBAAkBvrC,EAASkB,EAAMgZ,QAAQ7X,SAAUnB,EAAMgZ,QAAQsxB,OAC7F,OAAA5yC,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKM,GAAK,CACRyqC,YAAaP,EAAWlqC,EAAMyqC,YAAa,WAAY,CAAErvC,GAAI,IAAK,GAClEqkB,SAAQ/nB,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAOM,EAAMyf,UAAQ,CAAE,EAAG6oB,KAEtC,CAEE,OADA/G,MAAM,iCACCvhC,CAEX,CACE,OAAOA,CAEX,CAAO,GAAoB,sBAAhBggC,EAAO53B,KAA8B,CAC9C,IAAIo4H,EAAiBxgI,EAAMyqC,YAI3B,MAH8C,SAA1CpN,EAAA4N,OAAO0kC,YAAY3vE,EAAMyqC,eAC3B+1F,EAAiBnjG,EAAA4N,OAAOM,aAAqBvrC,EAAMyqC,YAAa,CAAEvrC,gBAAiB8gC,EAAOuE,cAAcnpC,MAE1G1D,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKM,GAAK,CACRyqC,YAAaP,EAAWs2F,EAAgB,WAAY,CAAEplI,GAAI4kC,EAAOuE,cAAcnpC,KAC/EqkB,SAAQ/nB,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAOM,EAAMyf,UAAQ,CAAE,CAACugB,EAAOuE,cAAcnpC,IAAK4kC,EAAOuE,iBAErE,CAAO,GAAoB,2BAAhBvE,EAAO53B,KAAmC,CACnD,MAAMjH,EAAWnB,EAAMgZ,QAAQ7X,SACzBse,EAAWzE,EAAAK,SAAS0kB,YAAY//B,GACtC,GAAgB,MAAZyf,EACF,MAAM,IAAIu/G,EAAAt0E,WAAW,uCAChB,CACL,MAAM+1E,EAAezgI,EAAMgZ,QAAQvD,SAASw/B,UAAWl0C,GAAMA,EAAE3F,KAAOqkB,EAAS1gB,WACzED,EACJ2gB,EAAS1gB,YAAcqrB,EAAAgnD,eAAiBhnD,EAAAta,QAAQuhE,qBAAuBrxE,EAAMgZ,QAAQvD,SAASgrH,GAC1Ft9F,EAAmBrkC,EAAUsrB,EAAAta,QAAQszB,SAAStkC,EAASqC,QAAYwD,EACzEqW,EAAAK,SAASg9F,UAAU54F,GACnB,MAAM8kB,EAAgBxH,EAAA2P,QAAQy6B,iBAC5B1nD,EACAzf,EAAMgZ,QAAQ7X,SACdse,EAASwO,IACTkV,EACAnD,EAAO5kB,MAET,IAAIslH,EAIFA,EAHG1lH,EAAAK,SAASC,UAAUmE,GAGT,CAAC8kB,KAAkBvkC,EAAMgZ,QAAQrI,SAFjC3Q,EAAMgZ,QAAQrI,QAAQlV,IAAKy3B,GAAOA,EAAE93B,KAAOqkB,EAASrkB,GAAKmpC,EAAgBrR,GAIxF,MAAM/1B,EAAe6C,EAAMgZ,QAAQ7X,SAAShE,cAE1C2B,QAASitC,EACT5uC,aAAcmC,EAAem4E,aAC7BA,GACEz8D,EAAAK,SAASC,UAAUmE,IAAwB,MAAX3gB,EAChCsrB,EAAAta,QAAQ0nE,uBAAuB14E,EAAS2gB,EAAUzf,EAAMgZ,QAAQsxB,MAAOnpC,GACvE,CAAErC,UAAS3B,eAAcs6E,aAAc,IAKrCkpD,EAAgB,CAAC/mI,EAAkBmC,KAAwB,IAAAsB,EAC/D,OAAAzD,EAAE0pC,oBAAsBvnC,IAAQnC,EAAEg+E,cAAyC,YAAZ,QAAbv6E,EAAAzD,EAAEk9E,mBAAW,IAAAz5E,OAAA,EAAAA,EAAE+0E,QAC7DwuD,EAAqB,IAAI/sG,IAC/B,IAAK,MAAM/G,mBAAEA,EAAkBslD,MAAEA,KAAWqF,EAAc,CACxD,MAAMopD,EAAct8F,EAAc1mC,QAAQo3C,UAAWr7C,GAAM+mI,EAAc/mI,EAAGkzB,IAC9D,WAAVslD,IAAuC,IAAjByuD,GACxBD,EAAmBj+H,IAAImqB,EAAoB+zG,EAE/C,CACAt8F,EAAc1mC,QAAU0mC,EAAc1mC,QAAQpC,IAAI,CAAC7B,EAAGzC,WACpD,MAAyB,YAAZ,QAAbkG,EAAAzD,EAAEk9E,mBAAW,IAAAz5E,OAAA,EAAAA,EAAE+0E,QAAuB/6E,MAAMP,KAAK8pI,EAAmBz+H,UAAUqG,SAASrR,GAEnFyC,EADDlC,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAM9F,GAAC,CAAEk9E,iBAAanyE,MAG3B,IAAK,IAAAyF,KAAgDqtE,EAAc,CAA9D,MAAM3qD,mBAAEA,GAAkB1iB,EAAK0sE,EAAW3qE,EAAA/B,EAApC,wBACHpB,EACsC,QAA1C5L,EAAAwjI,EAAmBp/H,IAAIsrB,UAAmB,IAAA1vB,EAAAA,EAC1CmnC,EAAc1mC,QAAQo3C,UACnBr7C,GAAMA,EAAE0pC,oBAAsBxW,IAAuBlzB,EAAEg+E,cAAgBh+E,EAAEmJ,KAAK7J,KAAMgmB,GAAMA,EAAEpa,eAE7E,IAAhBkE,IACFu7B,EAAc1mC,QAAU0mC,EAAc1mC,QAAQpC,IAAI,CAAC7B,EAAGzC,IAAOA,IAAM6R,EAAYtR,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAM9F,GAAC,CAAEk9E,gBAAgBl9E,GAE5G,CACA,MAAM+jI,EACU,MAAd5xF,GAAqB,EAAArP,EAAAs5E,IAAGh2G,EAAMgZ,QAAQvD,UAAUte,EAAEspI,GAAc99H,IAAIopC,GAAc/rC,EAAMgZ,QAAQvD,SAC5FqrH,GAA0B,EAAA5B,EAAAl1E,WAAUhqD,EAAMgZ,QAAQ7X,SAAShE,aAAcmC,GAkB/E,OAhBE0b,EAAAK,SAASC,UAAUmE,IACnBA,EAAS1gB,YAAcqrB,EAAAgnD,iBACL,IAAlBqvD,GACoB,OAApB3hI,aAAO,EAAPA,EAAS7C,UACc,OAAvB8vC,aAAU,EAAVA,EAAY9vC,WAEZsoC,EAActlC,oBAAsBggI,EAAAhkI,oBAAoByC,KACtD,CAAEzB,QAAS6C,EAAQ7C,QAAUC,QAAS4C,EAAQ5C,QAASiB,gBACvD,CAAElB,QAAS8vC,EAAY9vC,QAAUC,QAAS6vC,EAAY7vC,QAASiB,aAAc2jI,GAC7Ev8F,EAAc1mC,UAGI,oBAAXiJ,QAA0BA,OAAOu+C,gBAC1C,EAAA9nB,EAAA2C,IAAG,6BACHp5B,OAAOu+C,aAAaY,QAAQ,oBAAqBjpD,KAAKC,UAAU,CAAEme,KAAMuL,KAAK+X,MAAO6F,oBAEtF7sC,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKM,GAAK,CACRgZ,QAAOthB,OAAAgI,OAAAhI,OAAAgI,OAAA,GACFM,EAAMgZ,SAAO,CAChBrI,QAAS+vH,EACTjrH,SAAUkoH,EACVx8H,SAAQzJ,OAAAgI,OAAAhI,OAAAgI,OAAA,GACHM,EAAMgZ,QAAQ7X,UAAQ,CACzBhE,aAAc2jI,MAGlBr2F,YAAazvB,EAAAK,SAASC,UAAUmE,GAC5B,CAAC,CAAExd,KAAM,YAAayoC,OAAQ,CAAExrC,gBAAiBqlC,EAAcnpC,MAC/DiiC,EAAA4N,OAAO6kC,KAAK9vE,EAAMyqC,aACtBhrB,SAAUzE,EAAAK,SAASgpB,KAAKrkC,EAAMyf,SAAUA,EAASrkB,KAErD,CACF,CAAO,GAAoB,eAAhB4kC,EAAO53B,KAChB,OAAO4S,EAAAK,SAASs/F,YAAY36G,EAAOgb,EAAAK,SAAS++F,eAAep/F,EAAAK,SAAS0kB,YAAY//B,GAASggC,EAAOtZ,KAAMsZ,EAAO5kB,OACxG,GAAoB,gBAAhB4kB,EAAO53B,KAChB,OAAO4S,EAAAK,SAASs/F,YAAY36G,EAAOgb,EAAAK,SAASm/F,WAAWx/F,EAAAK,SAAS0kB,YAAY//B,GAASggC,EAAOtZ,KAAMsZ,EAAO5kB,OACpG,GAAoB,mBAAhB4kB,EAAO53B,KAA2B,CAC3C,MAAMqX,EAAWzE,EAAAK,SAAS0kB,YAAY//B,GACtC,OAAAtI,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKM,GAAK,CACRyqC,YAAaP,EAAWlqC,EAAMyqC,YAAa,YAAQ9lC,GAAW,GAC9D8a,SAAUzE,EAAAK,SAASC,UAAUmE,GACzBzf,EAAMyf,SACNzE,EAAAK,SAASgpB,KAAKrkC,EAAMyf,SAAUzE,EAAAK,SAASs6F,cAAc31G,EAAMyqC,eAEnE,CAAO,GAAoB,mBAAhBzK,EAAO53B,KAA2B,CAC3C,MAAMqX,EAAWzE,EAAAK,SAAS0kB,YAAY//B,GACtC,GAAgB,MAAZyf,EAAkB,CACpB,MAAM9O,EAAU3Q,EAAMgZ,QAAQrI,QAAQ3S,OAAQk1B,GAAMA,EAAE93B,KAAOqkB,EAASrkB,IAChE2lI,EAAYpwH,EAAQ1Z,SAAW+I,EAAMgZ,QAAQrI,QAAQ1Z,OAI3D,OAHI+jB,EAAAK,SAASC,UAAUmE,IACrBH,EAAA6C,YAAYC,gBAAgB,CAAEha,KAAM,iBAEtC1Q,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKM,GAAK,CACRyqC,YAAaP,EAAWlqC,EAAMyqC,YAAa,YAAQ9lC,GAAW,GAC9DqU,QAAOthB,OAAAgI,OAAAhI,OAAAgI,OAAA,GACFM,EAAMgZ,SAAO,CAChBrI,YAEF8O,SAAUzE,EAAAK,SAASgpB,KAAKrkC,EAAMyf,SAAUA,EAASrkB,IACjDmlC,UAAWwgG,EAAWrpI,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAMM,EAAMugC,WAAS,CAAE,CAAC,WAAW9gB,EAASrkB,MAAO4kC,EAAO5kB,OAASpb,EAAMugC,WAEnG,CACE,OAAOvgC,CAEX,CAAO,GAAoB,eAAhBggC,EAAO53B,KAAuB,CACvC,MAAMo4H,EAAiBt2F,EAAWlqC,EAAMyqC,YAAazK,EAAO8K,OAAQ9K,EAAO0K,OAAQ1K,EAAO+K,kBAC1F,OAAOy1F,IAAmBxgI,EAAMyqC,YAAczqC,EAAOtI,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAMM,GAAK,CAAEyqC,YAAa+1F,GACjF,CAAO,GAAoB,eAAhBxgG,EAAO53B,KAChB,OAAA1Q,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYM,GAAK,CAAEyqC,YAAapN,EAAA4N,OAAO6kC,KAAK9vE,EAAMyqC,eAC7C,GAAoB,UAAhBzK,EAAO53B,KAChB,OAAA1Q,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKM,GAAK,CACR2/B,KAAM,CAAE/rB,MAAOosB,EAAOpsB,MAAOxY,GAAI4kC,EAAOlnB,QACxCE,QAAOthB,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAOM,EAAMgZ,SAAO,CAAEpF,MAAOosB,EAAOpsB,UAExC,GAAoB,WAAhBosB,EAAO53B,KAChB,OAAA1Q,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYM,GAAK,CAAE2/B,UAAMh7B,EAAWqU,QAAOthB,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAOM,EAAMgZ,SAAO,CAAEpF,WAAOjP,MACnE,GAAoB,cAAhBq7B,EAAO53B,KAAsB,CACtC,MAAMqX,EAAWzE,EAAAK,SAAS0kB,YAAY//B,GACtC,OAAgB,MAAZyf,EACKzE,EAAAK,SAASs/F,YAAY36G,EAAOgb,EAAAK,SAASg9F,UAAU54F,IAE/Czf,CAEX,CAAO,GAAoB,eAAhBggC,EAAO53B,KAAuB,CACvC,MAAMqX,EAAWzE,EAAAK,SAAS0kB,YAAY//B,GACtC,OAAIyf,EACKzE,EAAAK,SAASs/F,YACd36G,EACAgb,EAAAK,SAAS87F,WACP13F,EACAugB,EAAO+F,UACP/F,EAAO1d,KACP0d,EAAOh3B,WACPg3B,EAAOx2B,SACPxJ,EAAMgZ,QAAQ7X,SACd6+B,EAAO77B,OACP,IAIGnE,CAEX,CAAO,GAAoB,mBAAhBggC,EAAO53B,KAIhB,OAHI+2H,GACFpkH,QAAQ0kB,IAAI,aAAYO,EAAOmM,KAAO,IAAInM,EAAOmM,OAAS,IAAM,oBAElEz0C,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKM,GAAK,CACRgZ,QAAOthB,OAAAgI,OAAAhI,OAAAgI,OAAA,GACFM,EAAMgZ,SAAO,CAChB7X,SAAU6+B,EAAOkM,cAAczW,GAAGz1B,EAAMgZ,QAAQ7X,cAG/C,GAAoB,iBAAhB6+B,EAAO53B,KAChB,OAAO43B,EAAOhgC,MACT,GAAoB,gBAAhBggC,EAAO53B,KAAwB,CACpC+2H,GACFpkH,QAAQ0kB,IAAI,aAAYO,EAAOmM,KAAO,IAAInM,EAAOmM,OAAS,IAAM,oBAElE,MAAM60F,EAAehhG,EAAOkM,cAAcrwC,OAAO,CAACC,EAAMgkI,KAClDX,GACFW,EAAUrgG,IAAI,SAEhB,MAAMn/B,EAAWw/H,EAAUrqG,GAAG35B,GAI9B,OAHIqjI,GAAuC,WAAnBW,EAAU13H,MAChC2S,QAAQ0kB,IAAI,cAAeqgG,EAAUjoI,MAAMsI,GAEtCG,GACNN,GACH,OAAOggC,EAAOihG,YAAavpI,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAMshI,GAAY,CAAEhoH,QAAShZ,EAAMgZ,UAAYgoH,CAC5E,CAAO,GAAoB,kCAAhBhhG,EAAO53B,KAA0C,CAC1D,MAAMqX,EAAWzf,EAAMyf,SAAS,GAChC,GAAgB,MAAZA,EAAkB,CACpB,MAAM3gB,EAAUsrB,EAAAta,QAAQszB,SAAShZ,EAAAta,QAAQy1B,WAAWvlC,EAAOyf,EAAS1gB,WAAaiB,EAAMgZ,QAAQ7X,UAC/F,IAAImnC,EAActtB,EAAAK,SAAS2iG,gBACzBv+F,EACA3gB,EACA2gB,EAASwO,IACTjuB,EAAMgZ,QAAQ7X,SACd6+B,EAAO66E,oBAWT,OATAvyE,EAActtB,EAAAK,SAASu/F,wBACrBtyE,EACAtI,EAAO66E,mBACPp7F,EAASwO,IACTnvB,EACAkB,EAAMgZ,QAAQ7X,SACdnB,EAAMgZ,QAAQsxB,OAGhB5yC,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKM,GAAK,CACRyf,SAAQ/nB,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAOM,EAAMyf,UAAQ,CAAE,EAAG6oB,KAEtC,CACE,OAAOtoC,CAEX,CACE,OAAOA,8FCtvCX,MAAAuC,EAAAhJ,EAAA,OACAqG,EAAArG,EAAA,OACAuG,EAAAvG,EAAA,OAEA,IAAiBg9E,GAAjB,SAAiBA,GAoCf,SAAgB2qD,EAAqB52F,SAEnC,OAAiB,QAAVjtC,EADSkF,EAAAC,gBAAgBgrB,OAAO8c,EAAM3oC,OAAOA,QAAU,GAAI,aAAa,GAChE,UAAE,IAAAtE,OAAA,EAAAA,EAAExF,KACrB,CAtCgB0+E,EAAAt0E,KAAhB,SAAqBlG,GACnB,OAAQA,GACN,IAAK,YACH,MAAO,aACT,IAAK,aACH,MAAO,cACT,IAAK,WACH,MAAO,YACT,IAAK,YACH,MAAO,aACT,IAAK,QACH,MAAO,QACT,IAAK,cACH,MAAO,eACT,IAAK,eACH,MAAO,gBACT,IAAK,OACH,MAAO,OACT,IAAK,OACH,MAAO,OACT,IAAK,YACH,MAAO,YACT,IAAK,YACH,MAAO,aACT,IAAK,aACH,MAAO,cACT,IAAK,QACH,MAAO,QACT,IAAK,SACH,MAAO,aACT,IAAK,UACH,MAAO,UAEb,EAEgBw6E,EAAA2qD,qBAAoBA,EAKpB3qD,EAAAC,kCAAhB,SAAkDlsC,EAAenpC,SAC/D,MAAM6xH,EAAsD,QAA5B31H,EAAA8D,EAAS+yH,aAAavyH,cAAM,IAAAtE,OAAA,EAAAA,EAAE21H,wBAC9D,IAAKA,EACH,OAAOkO,EAAqB52F,GAE9B,MAAMqI,EAAUpwC,EAAAC,gBAAgBgrB,OAAO8c,EAAM3oC,OAAOA,QAAU,GAAI,aAAa,GAC/E,GAAIgxC,EAAQ17C,OAAS+7H,EACnB,OAAOkO,EAAqB52F,GAE9B,MAAM62F,EAAgBxuF,EAAQp7C,MAAM,EAAGy7H,GACjCjlF,EAAcozF,EAActlI,OAChC,CAACqsD,EAAKxY,IAAS5vC,EAAAS,OAAOgN,IAAI26C,EAAKxY,EAAK73C,OACpCiI,EAAAS,OAAOE,MAAM,EAAGU,EAASS,QAE3B,OAAO9B,EAAAS,OAAOiwC,OAAOzC,EAAaozF,EAAclqI,OAClD,EAEgBs/E,EAAA6qD,kBAAhB,SAAkC92F,SAEhC,OAAiB,QAAVjtC,EADSkF,EAAAC,gBAAgBgrB,OAAO8c,EAAMmrB,WAAWwwC,SAAW,GAAI,aAAa,GACrE,UAAE,IAAA5oG,OAAA,EAAAA,EAAExF,KACrB,EAEgB0+E,EAAA8qD,SAAhB,WACE,MAAO,CACL1/H,OAAQ,GACR8zD,WAAY,GACZx+D,OAAQ,GAEZ,EAEgBs/E,EAAAtsC,QAAhB,SAAwBK,GAMtB,OAA4B,IALG,IAC1B1qC,EAAAwC,YAAYzG,KAAK2uC,EAAM3oC,QAAQ3D,OAAQwG,IAAO8lC,EAAM3oC,OAAO6C,IAAM,IAAIvN,OAAS,MAC9E2I,EAAAwC,YAAYzG,KAAK2uC,EAAMmrB,YAAYz3D,OAAQwG,IAAO8lC,EAAMmrB,WAAWjxD,IAAM,IAAIvN,OAAS,MACtF2I,EAAAwC,YAAYzG,KAAK2uC,EAAMrzC,QAAQ+G,OAAQwG,IAAO8lC,EAAMrzC,OAAOuN,IAAM,IAAIvN,OAAS,IAElEA,MACnB,CACD,CA/ED,CAAiBs/E,IAAK3+E,EAAA2+E,MAALA,EAAK,m3JCq0GtB3+E,EAAA0pI,kBAAA,SAAkCjmI,GAChC,OAAQA,GACN,IAAK,UACH,MAAO,UACT,IAAK,WACH,MAAO,WACT,IAAK,QACH,MAAO,QACT,QACE,OAEN,EAEAzD,EAAAisE,cAAAA,EAkCAjsE,EAAA2pI,cAAA,SAA8Bt/H,EAAc5G,EAA+B21C,GAEzE,MAAO,GAAG/uC,MADiB,MAAb5G,EAAoB,eAAiBwoE,EAAcxoE,EAAW21C,IAAsB31C,IAEpG,EAgBAzD,EAAAsgF,aAAAA,EA54GA,MAAAt4E,EAAArG,EAAA,OACAioI,EAAAjoI,EAAA,OACAuG,EAAAvG,EAAA,OACAwB,EAAAxB,EAAA,OAqBAgsE,EAAAhsE,EAAA,OACA4R,EAAA5R,EAAA,OACA2R,EAAA3R,EAAA,OACAgJ,EAAAhJ,EAAA,OACA4lB,EAAA5lB,EAAA,OACA+gC,EAAA/gC,EAAA,OACAs6C,EAAAt6C,EAAA,OAEA6wB,EAAA7wB,EAAA,OACAmkC,EAAAnkC,EAAA,OACAmjC,EAAAnjC,EAAA,OACAojC,EAAApjC,EAAA,OAEa3B,EAAAugF,iBAAmD,CAC9DspD,QAAS,CACPrmI,GAAI,UACJ6G,KAAM,WACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCkkI,YAAa,CACXtmI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExCmkI,eAAgB,CACdvmI,GAAI,iBACJ6G,KAAM,mBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCokI,cAAe,CACbxmI,GAAI,gBACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCqkI,UAAW,CACTzmI,GAAI,YACJ6G,KAAM,aACN6rE,iBAAkB,eAClBmU,MAAO,CAAC,OAAQ,SAChBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExCskI,YAAa,CACX1mI,GAAI,cACJ6G,KAAM,eACN6rE,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCukI,mBAAoB,CAClB3mI,GAAI,qBACJ6G,KAAM,wBACN6rE,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCwkI,SAAU,CACR5mI,GAAI,WACJ6G,KAAM,YACN6rE,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCykI,WAAY,CACV7mI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC0kI,oBAAqB,CACnB9mI,GAAI,sBACJ6G,KAAM,yBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC2kI,mBAAoB,CAClB/mI,GAAI,qBACJ6G,KAAM,wBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC4kI,kBAAmB,CACjBhnI,GAAI,oBACJ6G,KAAM,wBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC6kI,YAAa,CACXjnI,GAAI,cACJ6G,KAAM,gBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC8kI,UAAW,CACTlnI,GAAI,YACJ6G,KAAM,aACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExC+kI,cAAe,CACbnnI,GAAI,gBACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCglI,QAAS,CACPpnI,GAAI,UACJ6G,KAAM,WACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCilI,SAAU,CACRrnI,GAAI,WACJ6G,KAAM,YACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCklI,oBAAqB,CACnBtnI,GAAI,sBACJ6G,KAAM,wBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCmlI,OAAQ,CACNvnI,GAAI,SACJ6G,KAAM,SACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtColI,eAAgB,CACdxnI,GAAI,iBACJ6G,KAAM,kBACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExCqlI,YAAa,CACXznI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCslI,cAAe,CACb1nI,GAAI,gBACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExCulI,iBAAkB,CAChB3nI,GAAI,mBACJ6G,KAAM,qBACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCwlI,WAAY,CACV5nI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCylI,oBAAqB,CACnB7nI,GAAI,sBACJ6G,KAAM,0BACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC0lI,0BAA2B,CACzB9nI,GAAI,4BACJ6G,KAAM,iCACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,MAAO2F,KAAM,OAE1C2lI,SAAU,CACR/nI,GAAI,WACJ6G,KAAM,YACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC4lI,SAAU,CACRhoI,GAAI,WACJ6G,KAAM,YACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExC6lI,WAAY,CACVjoI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC8lI,kBAAmB,CACjBloI,GAAI,oBACJ6G,KAAM,sBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC+lI,OAAQ,CACNnoI,GAAI,SACJ6G,KAAM,UACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC8+F,MAAO,CACLlhG,GAAI,QACJ6G,KAAM,QACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCgmI,aAAc,CACZpoI,GAAI,eACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCimI,kBAAmB,CACjBroI,GAAI,oBACJ6G,KAAM,qBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExCkmI,gBAAiB,CACftoI,GAAI,kBACJ6G,KAAM,oBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCmmI,OAAQ,CACNvoI,GAAI,SACJ6G,KAAM,SACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtComI,QAAS,CACPxoI,GAAI,UACJ6G,KAAM,UACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCqmI,SAAU,CACRzoI,GAAI,WACJ6G,KAAM,WACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCsmI,iBAAkB,CAChB1oI,GAAI,mBACJ6G,KAAM,qBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCumI,kBAAmB,CACjB3oI,GAAI,oBACJ6G,KAAM,sBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCwmI,cAAe,CACb5oI,GAAI,gBACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCymI,gBAAiB,CACf7oI,GAAI,kBACJ6G,KAAM,mBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC0mI,kBAAmB,CACjB9oI,GAAI,oBACJ6G,KAAM,qBACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC2mI,SAAU,CACR/oI,GAAI,WACJ6G,KAAM,YACNg2E,cAAe,GACfnK,iBAAkB,OAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC4mI,cAAe,CACbhpI,GAAI,gBACJ6G,KAAM,kBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC6mI,aAAc,CACZjpI,GAAI,eACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC8mI,WAAY,CACVlpI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC+mI,WAAY,CACVnpI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCgnI,YAAa,CACXppI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCinI,YAAa,CACXrpI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCknI,YAAa,CACXtpI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCmnI,iBAAkB,CAChBvpI,GAAI,mBACJ6G,KAAM,qBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtConI,cAAe,CACbxpI,GAAI,gBACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCqnI,UAAW,CACTzpI,GAAI,YACJ6G,KAAM,aACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCsnI,WAAY,CACV1pI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCunI,gBAAiB,CACf3pI,GAAI,kBACJ6G,KAAM,oBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCwnI,UAAW,CACT5pI,GAAI,YACJ6G,KAAM,aACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCynI,WAAY,CACV7pI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC0nI,gBAAiB,CACf9pI,GAAI,kBACJ6G,KAAM,oBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC2nI,cAAe,CACb/pI,GAAI,gBACJ6G,KAAM,kBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC4nI,QAAS,CACPhqI,GAAI,UACJ6G,KAAM,WACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC6nI,YAAa,CACXjqI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,MAAO2F,KAAM,OAE1C8nI,YAAa,CACXlqI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,MAAO2F,KAAM,OAE1C+nI,UAAW,CACTnqI,GAAI,YACJ6G,KAAM,aACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCgoI,kBAAmB,CACjBpqI,GAAI,oBACJ6G,KAAM,sBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCioI,0BAA2B,CACzBrqI,GAAI,4BACJ6G,KAAM,gCACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCkoI,gBAAiB,CACftqI,GAAI,kBACJ6G,KAAM,oBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExCmoI,kBAAmB,CACjBvqI,GAAI,oBACJ6G,KAAM,sBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCooI,YAAa,CACXxqI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExCqoI,WAAY,CACVzqI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCsoI,YAAa,CACX1qI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCuoI,qBAAsB,CACpB3qI,GAAI,uBACJ6G,KAAM,0BACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCwoI,cAAe,CACb5qI,GAAI,gBACJ6G,KAAM,kBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCyoI,eAAgB,CACd7qI,GAAI,iBACJ6G,KAAM,mBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC0oI,SAAU,CACR9qI,GAAI,WACJ6G,KAAM,YACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC2oI,UAAW,CACT/qI,GAAI,YACJ6G,KAAM,aACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC4oI,YAAa,CACXhrI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,sBAAkBnpE,EAClBs9E,MAAO,CAAC,QAAS,SACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC6oI,gBAAiB,CACfjrI,GAAI,kBACJ6G,KAAM,mBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC8oI,uBAAwB,CACtBlrI,GAAI,yBACJ6G,KAAM,4BACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC+oI,cAAe,CACbnrI,GAAI,gBACJ6G,KAAM,kBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCgpI,UAAW,CACTprI,GAAI,YACJ6G,KAAM,aACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCipI,iBAAkB,CAChBrrI,GAAI,mBACJ6G,KAAM,oBACNg2E,cAAe,GACfnK,iBAAkB,OAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCkpI,cAAe,CACbtrI,GAAI,gBACJ6G,KAAM,kBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCmpI,YAAa,CACXvrI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCopI,eAAgB,CACdxrI,GAAI,iBACJ6G,KAAM,mBACNg2E,cAAe,GACfnK,sBAAkBnpE,EAClBs9E,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCqpI,aAAc,CACZzrI,GAAI,eACJ6G,KAAM,gBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCspI,iBAAkB,CAChB1rI,GAAI,mBACJ6G,KAAM,sBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCupI,QAAS,CACP3rI,GAAI,UACJ6G,KAAM,WACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,MAAO2F,KAAM,OAE1CwpI,aAAc,CACZ5rI,GAAI,eACJ6G,KAAM,gBACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,MAAO2F,KAAM,OAE1CypI,SAAU,CACR7rI,GAAI,WACJ6G,KAAM,YACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,MAAO2F,KAAM,OAE1C0pI,MAAO,CACL9rI,GAAI,QACJ6G,KAAM,QACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC2pI,eAAgB,CACd/rI,GAAI,iBACJ6G,KAAM,mBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC4pI,aAAc,CACZhsI,GAAI,eACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,MAAO2F,KAAM,OAE1C6pI,gBAAiB,CACfjsI,GAAI,kBACJ6G,KAAM,mBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,OAAQ,SAChBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC8pI,SAAU,CACRlsI,GAAI,WACJ6G,KAAM,YACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC+pI,cAAe,CACbnsI,GAAI,gBACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCgqI,cAAe,CACbpsI,GAAI,gBACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCiqI,cAAe,CACbrsI,GAAI,gBACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCkqI,QAAS,CACPtsI,GAAI,UACJ6G,KAAM,WACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCmqI,WAAY,CACVvsI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCoqI,YAAa,CACXxsI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCqqI,MAAO,CACLzsI,GAAI,QACJ6G,KAAM,QACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCsqI,WAAY,CACV1sI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCuqI,YAAa,CACX3sI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCwqI,aAAc,CACZ5sI,GAAI,eACJ6G,KAAM,gBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExCyqI,WAAY,CACV7sI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC0qI,OAAQ,CACN9sI,GAAI,SACJ6G,KAAM,UACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC2qI,SAAU,CACR/sI,GAAI,WACJ6G,KAAM,WACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC4qI,UAAW,CACThtI,GAAI,YACJ6G,KAAM,aACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC6qI,OAAQ,CACNjtI,GAAI,SACJ6G,KAAM,UACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC8qI,cAAe,CACbltI,GAAI,gBACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC+qI,YAAa,CACXntI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCgrI,WAAY,CACVptI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCirI,6BAA8B,CAC5BrtI,GAAI,+BACJ6G,KAAM,kCACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExCkrI,aAAc,CACZttI,GAAI,eACJ6G,KAAM,gBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCmrI,mBAAoB,CAClBvtI,GAAI,qBACJ6G,KAAM,uBACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCorI,aAAc,CACZxtI,GAAI,eACJ6G,KAAM,gBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCqrI,iBAAkB,CAChBztI,GAAI,mBACJ6G,KAAM,qBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCsrI,iBAAkB,CAChB1tI,GAAI,mBACJ6G,KAAM,oBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCurI,sBAAuB,CACrB3tI,GAAI,wBACJ6G,KAAM,yBACNg2E,cAAe,GACfnK,iBAAkB,OAClBmU,MAAO,CAAC,OAAQ,SAChBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCwrI,OAAQ,CACN5tI,GAAI,SACJ6G,KAAM,SACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCyrI,aAAc,CACZ7tI,GAAI,eACJ6G,KAAM,gBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC0rI,oBAAqB,CACnB9tI,GAAI,sBACJ6G,KAAM,yBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC2rI,gBAAiB,CACf/tI,GAAI,kBACJ6G,KAAM,oBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC4rI,iBAAkB,CAChBhuI,GAAI,mBACJ6G,KAAM,qBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC6rI,cAAe,CACbjuI,GAAI,gBACJ6G,KAAM,kBACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,MAAO2F,KAAM,OAE1C8rI,eAAgB,CACdluI,GAAI,iBACJ6G,KAAM,mBACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC+rI,oBAAqB,CACnBnuI,GAAI,sBACJ6G,KAAM,wBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCgsI,uBAAwB,CACtBpuI,GAAI,yBACJ6G,KAAM,6BACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCisI,UAAW,CACTruI,GAAI,YACJ6G,KAAM,aACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCksI,kBAAmB,CACjBtuI,GAAI,oBACJ6G,KAAM,uBACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCmsI,cAAe,CACbvuI,GAAI,gBACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCosI,0BAA2B,CACzBxuI,GAAI,4BACJ6G,KAAM,+BACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCqsI,MAAO,CACLzuI,GAAI,QACJ6G,KAAM,QACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCssI,SAAU,CACR1uI,GAAI,WACJ6G,KAAM,YACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCusI,WAAY,CACV3uI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCwsI,gBAAiB,CACf5uI,GAAI,kBACJ6G,KAAM,oBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCysI,cAAe,CACb7uI,GAAI,gBACJ6G,KAAM,kBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC0sI,UAAW,CACT9uI,GAAI,YACJ6G,KAAM,aACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC2sI,gBAAiB,CACf/uI,GAAI,kBACJ6G,KAAM,oBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC4sI,mBAAoB,CAClBhvI,GAAI,qBACJ6G,KAAM,wBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC6sI,kBAAmB,CACjBjvI,GAAI,oBACJ6G,KAAM,sBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC8sI,0BAA2B,CACzBlvI,GAAI,4BACJ6G,KAAM,mCACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC+sI,6BAA8B,CAC5BnvI,GAAI,+BACJ6G,KAAM,uCACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCgtI,6BAA8B,CAC5BpvI,GAAI,+BACJ6G,KAAM,oCACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCitI,mBAAoB,CAClBrvI,GAAI,qBACJ6G,KAAM,wBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCktI,WAAY,CACVtvI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCmtI,MAAO,CACLvvI,GAAI,QACJ6G,KAAM,SACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCotI,aAAc,CACZxvI,GAAI,eACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCqtI,oBAAqB,CACnBzvI,GAAI,sBACJ6G,KAAM,yBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCstI,OAAQ,CACN1vI,GAAI,SACJ6G,KAAM,SACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCutI,WAAY,CACV3vI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCwtI,WAAY,CACV5vI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCytI,UAAW,CACT7vI,GAAI,YACJ6G,KAAM,aACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC46E,MAAO,CACLh9E,GAAI,QACJ6G,KAAM,QACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC0tI,SAAU,CACR9vI,GAAI,WACJ6G,KAAM,YACNg2E,cAAe,GACfnK,iBAAkB,OAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC2tI,kBAAmB,CACjB/vI,GAAI,oBACJ6G,KAAM,sBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC4tI,YAAa,CACXhwI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvC6tI,qBAAsB,CACpBjwI,GAAI,uBACJ6G,KAAM,0BACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC8tI,4BAA6B,CAC3BlwI,GAAI,8BACJ6G,KAAM,mCACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC+tI,sCAAuC,CACrCnwI,GAAI,wCACJ6G,KAAM,gDACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCguI,gBAAiB,CACfpwI,GAAI,kBACJ6G,KAAM,qBACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCiuI,OAAQ,CACNrwI,GAAI,SACJ6G,KAAM,UACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCkuI,iBAAkB,CAChBtwI,GAAI,mBACJ6G,KAAM,qBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCmuI,oBAAqB,CACnBvwI,GAAI,sBACJ6G,KAAM,wBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCouI,aAAc,CACZxwI,GAAI,eACJ6G,KAAM,gBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCquI,qBAAsB,CACpBzwI,GAAI,uBACJ6G,KAAM,0BACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCsuI,SAAU,CACR1wI,GAAI,WACJ6G,KAAM,WACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCuuI,QAAS,CACP3wI,GAAI,UACJ6G,KAAM,YACNg2E,cAAe,GACfnK,iBAAkB,kBAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCwuI,SAAU,CACR5wI,GAAI,WACJ6G,KAAM,WACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QAAS,QAC1BngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzCyuI,UAAW,CACT7wI,GAAI,YACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC0uI,cAAe,CACb9wI,GAAI,gBACJ6G,KAAM,iBACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC2uI,gBAAiB,CACf/wI,GAAI,kBACJ6G,KAAM,oBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC4uI,WAAY,CACVhxI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtC6uI,iBAAkB,CAChBjxI,GAAI,mBACJ6G,KAAM,oBACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExC8uI,gBAAiB,CACflxI,GAAI,kBACJ6G,KAAM,mBACNg2E,cAAe,GACfnK,iBAAkB,QAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,OAEzC+uI,WAAY,CACVnxI,GAAI,aACJ6G,KAAM,cACNg2E,cAAe,GACfnK,iBAAkB,WAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,IAAK2F,KAAM,OAExCgvI,IAAK,CACHpxI,GAAI,MACJ6G,KAAM,OACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QACRngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCivI,WAAY,CACVrxI,GAAI,aACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCkvI,UAAW,CACTtxI,GAAI,YACJ6G,KAAM,aACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,GAAI2F,KAAM,MACrCqE,iBAAkB,CAAEhK,MAAO,GAAI2F,KAAM,OAEvCmvI,YAAa,CACXvxI,GAAI,cACJ6G,KAAM,eACNg2E,cAAe,GACfnK,iBAAkB,aAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,EAAG2F,KAAM,MACpCqE,iBAAkB,CAAEhK,MAAO,EAAG2F,KAAM,OAEtCovI,aAAc,CACZxxI,GAAI,eACJ6G,KAAM,gBACNg2E,cAAe,GACfnK,iBAAkB,UAClBmU,MAAO,CAAC,QAAS,QACjBngF,iBAAkB,CAAEjK,MAAO,IAAK2F,KAAM,MACtCqE,iBAAkB,CAAEhK,MAAO,KAAM2F,KAAM,QAI3C,MAAMqvI,EAAkBjtI,EAAAwC,YAAYzG,KAAK/D,EAAAugF,kBAAkBt8E,OAA6C,CAACgsE,EAAK9rE,KAC5G8rE,EAAIjwE,EAAAugF,iBAAiBp8E,GAAKkG,KAAKyK,eAAiB9U,EAAAugF,iBAAiBp8E,GAAKX,GAC/DysE,GACN,IA0sDH,SAAgBhE,EAAcxoE,EAAmC21C,GAC/D,MAAM7B,EAAgB9zC,GAAa21C,EAAoBA,EAAkB31C,QAAasJ,EACtF,GAAIwqC,aAAa,EAAbA,EAAeltC,KACjB,OAAOktC,EAAcltC,KAAK6Y,OAE5B,OAAQzf,GACN,IAAK,UACH,MAAO,UACT,IAAK,QACH,MAAO,QACT,IAAK,WACH,MAAO,WACT,IAAK,QACH,MAAO,gBACT,IAAK,OACH,MAAO,OACT,IAAK,aACH,MAAO,aACT,IAAK,aACH,MAAO,aACT,IAAK,kBACH,MAAO,mBACT,IAAK,eACH,MAAO,gBACT,IAAK,QACH,MAAO,SACT,IAAK,UACH,MAAO,WACT,QACE,MAAO,GAEb,CAsBA,SAAgB68E,EAAat2E,GAC3B,MAAO,CACL,GAAI,CACF,CACEoC,KAAM,EACN2mB,UAAqB,OAAV/oB,EAAiB9B,EAAAS,OAAOE,MAAM,GAAI,MAAQX,EAAAS,OAAOE,MAAM,GAAI,MACtE5I,MAAO,IAET,CACEmM,KAAM,EACN2mB,UAAqB,OAAV/oB,EAAiB9B,EAAAS,OAAOE,MAAM,GAAI,MAAQX,EAAAS,OAAOE,MAAM,GAAI,MACtE5I,MAAO,IAET,CACEmM,KAAM,EACN2mB,UAAqB,OAAV/oB,EAAiB9B,EAAAS,OAAOE,MAAM,GAAI,MAAQX,EAAAS,OAAOE,MAAM,EAAG,MACrE5I,MAAO,KAGX,GAAI,CACF,CACEmM,KAAM,EACN2mB,UAAqB,OAAV/oB,EAAiB9B,EAAAS,OAAOE,MAAM,IAAK,MAAQX,EAAAS,OAAOE,MAAM,GAAI,MACvE5I,MAAO,IAET,CACEmM,KAAM,EACN2mB,UAAqB,OAAV/oB,EAAiB9B,EAAAS,OAAOE,MAAM,GAAI,MAAQX,EAAAS,OAAOE,MAAM,GAAI,MACtE5I,MAAO,IAET,CACEmM,KAAM,EACN2mB,UAAqB,OAAV/oB,EAAiB9B,EAAAS,OAAOE,MAAM,GAAI,MAAQX,EAAAS,OAAOE,MAAM,GAAI,MACtE5I,MAAO,KAGX,GAAI,CACF,CACEmM,KAAM,EACN2mB,UAAqB,OAAV/oB,EAAiB9B,EAAAS,OAAOE,MAAM,IAAK,MAAQX,EAAAS,OAAOE,MAAM,GAAI,MACvE5I,MAAO,IAET,CACEmM,KAAM,EACN2mB,UAAqB,OAAV/oB,EAAiB9B,EAAAS,OAAOE,MAAM,IAAK,MAAQX,EAAAS,OAAOE,MAAM,GAAI,MACvE5I,MAAO,IAET,CACEmM,KAAM,EACN2mB,UAAqB,OAAV/oB,EAAiB9B,EAAAS,OAAOE,MAAM,GAAI,MAAQX,EAAAS,OAAOE,MAAM,GAAI,MACtE5I,MAAO,KAIf,CAcA,SAASy4H,EACP5Z,EACAo2B,GAA+B,GAE/B,MAAO,CAACnrI,EAA6BR,EAAqB8pB,IACjDyrF,EAA0B76G,OAAe,CAACC,EAAMixI,KACrD,GAAID,GAAkC,MAAVnrI,GAAkB7B,EAAAS,OAAOovC,GAAGhuC,EAAQorI,EAAyBpiH,WAAa,CACpG,MAAM9yB,EAAQk1I,EAAyBl1I,MACjC2F,EAAO88B,EAAAO,UAAU4T,gCAAgCttC,EAAU8pB,GACjE,GAAqB,iBAAVpzB,GAAgC,MAAV8J,EAAgB,CAC/C,MAAMqrI,EAAgC,iBAAVn1I,EAAqBiI,EAAAS,OAAOiuC,SAAS7sC,EAAS9J,GAASA,EAC7E25C,EAAgB1xC,EAAAS,OAAOqyC,eAAeo6F,EAAc7rI,EAAU3D,EAAMytB,GAC1EnvB,EAAK4M,KAAK,CACRtN,GAAI8P,EAAAsB,WAAWC,YAAY,GAC3BzI,KAAM+oI,EAAyB/oI,KAC/B0mB,QAASqiH,EAAyBriH,QAClC7gB,eAAcohB,GAAe1pB,EAASgf,gBAAgB0K,EAAc9pB,GACpEQ,OAAQ6vC,EACRjkB,eAAgBy/G,EAChBloI,aAAa,GAEjB,CACF,CACA,OAAOhJ,GACN,GAEP,CAMA,SAASmxI,EACP7xI,EACA2N,EACAX,SAEA,MAAM8kI,EAASnkI,EAAgB3N,GAC/B,GAAc,MAAV8xI,EACF,OAAOt1I,EAAAugF,iBAAiB/8E,GAI1B,MAAMkyB,EACmE,QAAvEjwB,EAAS,MAAR+K,EAAeyrC,EAAAM,wBAAwBtmB,KAAKq/G,EAAQ9kI,QAAQzD,SAAU,IAAAtH,EAAAA,EACvEw2C,EAAAM,wBAAwBijF,iBAAiB8V,GAC3C,OAAAx1I,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKwtI,GAAM,CACTj1D,cAAe,GACfgK,MAAO30D,EAAU20D,OAAS,GAC1BpgF,iBAAkB/B,EAAAS,OAAOE,MAAM,EAAG,MAClCqB,iBAAkBhC,EAAAS,OAAOE,MAAM,EAAG,OAEtC,CAEA,SAAS0sI,EAAcD,EAAyB9kI,WAE9C,OAAqB,QAAdhL,GADqD,QAA1CC,EAAAw2C,EAAAM,wBAAwBtmB,KAAKq/G,EAAQ9kI,UAAK,IAAA/K,EAAAA,EAAIw2C,EAAAM,wBAAwBijF,iBAAiB8V,IACxFz0H,YAAI,IAAArb,EAAAA,EAAI8vI,EAAOz0H,IAClC,CAEA,SAAS20H,EAAYhyI,EAAiB2N,EAAsCX,GAC1E,MAAM9M,EAAW2xI,EAAiB7xI,EAAI2N,EAAiBX,GACvD,OAAmB,MAAZ9M,EAAmBA,EAAW1D,EAAAugF,iBAAiBC,KACxD,CAEA,IAAiB72E,EAl4DJ3J,EAAAy1I,SAAgD,CAC3D5L,QAAS,CACPn1D,cAAe,CAAC,aAChBC,iBAAkB,CAChB,kBACA,kBACA,oBACA,mBACA,aACA,gCACA,YACA,eAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,eAEpB8W,YAAa,CACXp1D,cAAe,CAAC,oBAChBC,iBAAkB,CAAC,kBAAmB,oBAAqB,mBAC3Do+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,WAAY,eAEhC+W,eAAgB,CACdr1D,cAAe,CAAC,mBAAoB,mCAAoC,iCACxEC,iBAAkB,CAAC,kBAAmB,oBAAqB,mBAAoB,qBAC/Eo+C,UAAW,CAAC,QAAS,aACrBC,gBAAiB,CAAC,aAEpBgX,cAAe,CACbt1D,cAAe,CAAC,kBAChBC,iBAAkB,CAAC,kBAAmB,cACtCo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,aAAc,oBAElCiX,UAAW,CACTv1D,cAAe,CACb,gBACA,mBACA,cACA,cACA,yBACA,2BAEFC,iBAAkB,CAAC,mBAAoB,mCAAoC,oBAC3Eo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,iBAEpBkX,YAAa,CACXx1D,cAAe,CAAC,qBAChBC,iBAAkB,CAChB,aACA,kBACA,kBACA,gBACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,eAEpBmX,mBAAoB,CAClBz1D,cAAe,CAAC,mBAAoB,kBAAmB,qBACvDC,iBAAkB,CAAC,mBACnBo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,YAEpBoX,SAAU,CACR11D,cAAe,CAAC,mBAChBC,iBAAkB,CAChB,mBACA,mBACA,mBACA,mCACA,iCAEFo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,eAEpBqX,WAAY,CACV31D,cAAe,CAAC,iCAChBC,iBAAkB,CAAC,mBAAoB,mCAAoC,mBAC3Eo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,UAAW,QAAS,WAAY,QAAS,OAAQ,eAErEsX,oBAAqB,CACnB51D,cAAe,CAAC,mBAChBC,iBAAkB,CAAC,mBAAoB,mCAAoC,iCAC3Eo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,UAAW,QAAS,UAExCuX,mBAAoB,CAClB71D,cAAe,CAAC,iCAChBC,iBAAkB,CAAC,mBAAoB,mCAAoC,mBAC3Eo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,UAAW,UAE/BwX,kBAAmB,CACjB91D,cAAe,CAAC,mBAAoB,yBAA0B,2BAC9DC,iBAAkB,CAChB,gBACA,cACA,cACA,aACA,kBACA,oBACA,iCAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,aAEpByX,YAAa,CACX/1D,cAAe,CAAC,mBAAoB,0BAA2B,0BAC/DC,iBAAkB,CAChB,gBACA,cACA,cACA,aACA,kBACA,qBAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,QAAS,WAAY,OAAQ,kBAAmB,UAE/E0X,UAAW,CACTh2D,cAAe,CAAC,kBAChBC,iBAAkB,CAAC,aAAc,mBACjCo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,UAAW,WAAY,OAAQ,kBAAmB,QAAS,UAE/E2X,cAAe,CACbj2D,cAAe,CAAC,WAAY,oBAC5BC,iBAAkB,CAAC,kBAAmB,YAAa,cACnDo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpB4X,QAAS,CACPl2D,cAAe,CAAC,aAAc,kBAAmB,gBAAiB,UAClEC,iBAAkB,CAAC,aAAc,kBAAmB,iBAAkB,oBACtEo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpB6X,SAAU,CACRn2D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,UACtCo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAAW,aAE/B8X,oBAAqB,CACnBp2D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,UACtCo+C,UAAW,CAAC,OAAQ,UACpBC,gBAAiB,CAAC,aAEpB+X,OAAQ,CACNr2D,cAAe,CACb,aACA,kBACA,mCACA,gCACA,kBACA,mBACA,kBACA,oBACA,oBAEFC,iBAAkB,CAChB,aACA,iBACA,aACA,mBACA,WACA,iBACA,WACA,SACA,gBACA,qBAEFo+C,UAAW,CAAC,QAAS,YAAa,aAAc,QAAS,UACzDC,gBAAiB,CAAC,eAEpBgY,eAAgB,CACdt2D,cAAe,CAAC,mCAAoC,iCACpDC,iBAAkB,CAAC,oBACnBo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,UAEpBiY,YAAa,CACXv2D,cAAe,CAAC,oBAChBC,iBAAkB,CAAC,YACnBo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,UAEpBkY,cAAe,CACbx2D,cAAe,CAAC,mBAChBC,iBAAkB,GAClBo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,UAEpBmY,iBAAkB,CAChBz2D,cAAe,CAAC,mBAChBC,iBAAkB,CAAC,iBAAkB,cACrCo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAEpBoY,WAAY,CACV12D,cAAe,CAAC,YAChBC,iBAAkB,CAAC,YAAa,wBAChCo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,UAAW,aAAc,QAAS,kBAAmB,SAEzEqY,oBAAqB,CACnB32D,cAAe,CAAC,iBAChBC,iBAAkB,CAAC,UACnBo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,oBAEpBsY,0BAA2B,CACzB52D,cAAe,CAAC,gBAAiB,cACjCC,iBAAkB,CAAC,kBAAmB,aAAc,UACpDo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,oBAEpBuY,SAAU,CACR72D,cAAe,CAAC,iCAChBC,iBAAkB,CAChB,mBACA,mBACA,mBACA,mCACA,mBAEFo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpBwY,SAAU,CACR92D,cAAe,CAAC,mCAAoC,iCACpDC,iBAAkB,CAAC,iBAAkB,oBACrCo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,UAAW,QAAS,WAAY,oBAEpDyY,WAAY,CACV/2D,cAAe,CAAC,iCAChBC,iBAAkB,CAAC,iBAAkB,kBAAmB,oCACxDo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,kBAAmB,SAEvC0Y,kBAAmB,CACjBh3D,cAAe,CAAC,mBAAoB,0BAA2B,0BAC/DC,iBAAkB,CAChB,gBACA,cACA,aACA,kBACA,iCAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,aAE/B2Y,OAAQ,CACNj3D,cAAe,CAAC,oBAChBC,iBAAkB,CAChB,aACA,kBACA,oBACA,gCACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,kBAAmB,eAEvCtuB,MAAO,CACLhwB,cAAe,CACb,kBACA,aACA,aACA,mBACA,yBACA,mBACA,mBAEFC,iBAAkB,CAChB,kBACA,gBACA,SACA,iBACA,iBACA,mCACA,gCACA,iBAEFo+C,UAAW,CAAC,OAAQ,SAAU,OAAQ,aACtCC,gBAAiB,CAAC,YAEpB4Y,aAAc,CACZl3D,cAAe,CACb,kBACA,aACA,aACA,mBACA,yBACA,mBACA,mBAEFC,iBAAkB,CAChB,kBACA,gBACA,SACA,iBACA,iBACA,mCACA,gCACA,iBAEFo+C,UAAW,CAAC,OAAQ,SAAU,OAAQ,aACtCC,gBAAiB,CAAC,YAEpB6Y,kBAAmB,CACjBn3D,cAAe,CAAC,cAChBC,iBAAkB,CAAC,iBAAkB,mBACrCo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,UAAW,WAAY,OAAQ,UAEnD8Y,gBAAiB,CACfp3D,cAAe,CAAC,WAAY,oBAC5BC,iBAAkB,CAAC,kBAAmB,cACtCo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpB+Y,OAAQ,CACNr3D,cAAe,CAAC,oBAChBC,iBAAkB,CAAC,YACnBo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,QAAS,aAAc,oBAE3CgZ,QAAS,CACPt3D,cAAe,CAAC,aAAc,aAAc,kBAAmB,gBAAiB,SAAU,qBAC1FC,iBAAkB,CAChB,kBACA,kBACA,kBACA,YACA,iBACA,mBACA,YAEFo+C,UAAW,CAAC,OAAQ,SAAU,SAAU,QAAS,OAAQ,SACzDC,gBAAiB,CAAC,eAEpBiZ,SAAU,CACRv3D,cAAe,CAAC,kBAAmB,iBAAkB,cACrDC,iBAAkB,CAChB,kBACA,iBACA,aACA,aACA,SACA,mBACA,WACA,mBACA,gBACA,kBACA,UAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,QAAS,WAAY,kBAAmB,QAAS,OAAQ,aAAc,eAEtGkZ,iBAAkB,CAChBx3D,cAAe,CAAC,kBAAmB,kBAAmB,cACtDC,iBAAkB,CAChB,kBACA,iBACA,aACA,kBACA,mBACA,gBACA,gBACA,SACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,YAEpBmZ,kBAAmB,CACjBz3D,cAAe,CAAC,iCAChBC,iBAAkB,CAAC,mBAAoB,mCAAoC,mBAC3Eo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,WAAY,UAEhCoZ,cAAe,CACb13D,cAAe,CAAC,oBAChBC,iBAAkB,CAAC,WAAY,YAAa,uBAAwB,aACpEo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpBqZ,gBAAiB,CACf33D,cAAe,CAAC,mBAChBC,iBAAkB,CAAC,kBAAmB,iBAAkB,aAAc,aAAc,UACpFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,YAE/BsZ,kBAAmB,CACjB53D,cAAe,GACfC,iBAAkB,CAChB,iBACA,aACA,kBACA,mBACA,kBACA,oBACA,kBACA,aACA,mBACA,mBACA,mCACA,gCACA,aACA,qBAEFo+C,UAAW,CAAC,OAAQ,SAAU,OAAQ,aACtCC,gBAAiB,CAAC,oBAEpBuZ,SAAU,CACR73D,cAAe,CAAC,qBAChBC,iBAAkB,CAChB,aACA,kBACA,kBACA,gBACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,SAEpBwZ,cAAe,CACb93D,cAAe,CAAC,aAChBC,iBAAkB,CAAC,kBAAmB,kBAAmB,aAAc,aACvEo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,eAEpByZ,aAAc,CACZ/3D,cAAe,CAAC,YAAa,oBAC7BC,iBAAkB,CAChB,kBACA,kBACA,kBACA,WACA,aACA,aACA,YACA,wBAEFo+C,UAAW,CAAC,OAAQ,SACpBC,gBAAiB,CAAC,eAEpB0Z,WAAY,CACVh4D,cAAe,CAAC,oBAChBC,iBAAkB,CAAC,kBAAmB,mCAAoC,qBAC1Eo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,UAAW,QAAS,WAAY,aAAc,SAElE8Z,YAAa,CACXp4D,cAAe,CAAC,mBAChBC,iBAAkB,CAAC,aAAc,cACjCo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,OAAQ,UAAW,aAEvC+Z,iBAAkB,CAChBr4D,cAAe,CAAC,kBAAmB,oBACnCC,iBAAkB,CAAC,aAAc,aAAc,aAC/Co+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,eAEpBga,cAAe,CACbt4D,cAAe,CAAC,kBAAmB,kBACnCC,iBAAkB,CAAC,aAAc,uBAAwB,mBAAoB,YAC7Eo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,kBAAmB,aAAc,QAAS,SAE9D2Z,WAAY,CACVj4D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,UACtCo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,aAAc,WAAY,QAAS,UAElE4Z,YAAa,CACXl4D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,SAAU,wBAChDo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,aAAc,aAElC6Z,YAAa,CACXn4D,cAAe,CAAC,cAChBC,iBAAkB,CAAC,kBAAmB,mBACtCo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAAW,QAAS,oBAExCia,UAAW,CACTv4D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,UACtCo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,UAE/Bka,WAAY,CACVx4D,cAAe,CAAC,kBAAmB,iBAAkB,cACrDC,iBAAkB,CAAC,mBAAoB,iBACvCo+C,UAAW,CAAC,YACZC,gBAAiB,CAAC,QAAS,WAAY,SAEzCma,gBAAiB,CACfz4D,cAAe,CAAC,mBAChBC,iBAAkB,CAChB,mBACA,kBACA,mCACA,gCACA,oBACA,eAEFo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,eAEpBoa,UAAW,CACT14D,cAAe,CAAC,iBAAkB,aAAc,mBAChDC,iBAAkB,CAAC,mBAAoB,oCACvCo+C,UAAW,CAAC,YACZC,gBAAiB,CAAC,eAEpBqa,WAAY,CACV34D,cAAe,CACb,yBACA,0BACA,yBACA,aACA,mBAEFC,iBAAkB,CAChB,aACA,iBACA,mBACA,kBACA,oBACA,mBACA,iBACA,aACA,kBACA,gBACA,SACA,WACA,oBAEFo+C,UAAW,CAAC,SAAU,OAAQ,aAC9BC,gBAAiB,CAAC,YAEpBsa,gBAAiB,CACf54D,cAAe,CAAC,YAAa,oBAC7BC,iBAAkB,CAAC,WAAY,aAAc,YAAa,wBAC1Do+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,aAAc,UAElCua,cAAe,CACb74D,cAAe,CAAC,aAAc,aAAc,mBAC5CC,iBAAkB,CAChB,YACA,gBACA,SACA,oBACA,mBACA,WACA,kBACA,kBACA,mBAEFo+C,UAAW,CAAC,SAAU,QACtBC,gBAAiB,CAAC,eAEpBwa,QAAS,CACP94D,cAAe,CAAC,mBAAoB,yBAA0B,2BAC9DC,iBAAkB,CAChB,iBACA,aACA,kBACA,oBACA,gBACA,eAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,oBAEpBya,YAAa,CACX/4D,cAAe,CAAC,kBAAmB,kBACnCC,iBAAkB,CAAC,wBACnBo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,kBAAmB,aAAc,QAAS,SAE9D0a,YAAa,CACXh5D,cAAe,CAAC,kBAAmB,mBACnCC,iBAAkB,CAAC,uBAAwB,aAAc,kBAAmB,kBAAmB,mBAC/Fo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,kBAAmB,QAAS,OAAQ,eAExD2a,UAAW,CACTj5D,cAAe,CAAC,mBAChBC,iBAAkB,CAAC,aAAc,cACjCo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,kBAAmB,OAAQ,eAE1D4a,kBAAmB,CACjBl5D,cAAe,CAAC,oCAChBC,iBAAkB,CAAC,mBAAoB,mBACvCo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,UAAW,QAAS,WAAY,UAEpD6a,0BAA2B,CACzBn5D,cAAe,CAAC,oCAChBC,iBAAkB,CAAC,mBAAoB,mBACvCo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,YAEpB8a,gBAAiB,CACfp5D,cAAe,CAAC,oCAChBC,iBAAkB,CAAC,iBAAkB,oBACrCo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,QAAS,aAE7B+a,kBAAmB,CACjBr5D,cAAe,CAAC,oCAChBC,iBAAkB,CAAC,mBAAoB,mBACvCo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,kBAAmB,OAAQ,aAE/Cgb,YAAa,CACXt5D,cAAe,CAAC,kBAChBC,iBAAkB,CAAC,aAAc,mBACjCo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,aAEpBib,WAAY,CACVv5D,cAAe,CAAC,mBAAoB,0BAA2B,0BAC/DC,iBAAkB,CAChB,gBACA,cACA,aACA,kBACA,iCAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,aAE/Bkb,YAAa,CACXx5D,cAAe,CAAC,mBAAoB,yBAA0B,2BAC9DC,iBAAkB,CAChB,gBACA,cACA,cACA,aACA,kBACA,oBACA,iCAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,eAEpBmb,qBAAsB,CACpBz5D,cAAe,CAAC,mCAAoC,iCACpDC,iBAAkB,CAAC,kBAAmB,mBAAoB,qBAC1Do+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,aAEpBob,cAAe,CACb15D,cAAe,CAAC,mBAAoB,yBAA0B,2BAC9DC,iBAAkB,CAChB,iBACA,aACA,kBACA,oBACA,gBACA,eAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,aAEpBqb,eAAgB,CACd35D,cAAe,CAAC,YAAa,oBAC7BC,iBAAkB,CAChB,kBACA,kBACA,WACA,aACA,aACA,YACA,wBAEFo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpBsb,SAAU,CACR55D,cAAe,CAAC,SAAU,gBAAiB,aAAc,cACzDC,iBAAkB,CAAC,kBAAmB,mBAAoB,WAAY,qBACtEo+C,UAAW,CAAC,SAAU,UACtBC,gBAAiB,CAAC,eAEpBub,UAAW,CACT75D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,gBAAiB,UACvDo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAAW,eAE/Bwb,YAAa,CACX95D,cAAe,CACb,kBACA,aACA,kBACA,kBACA,kBACA,mBACA,kBACA,qBAEFC,iBAAkB,CAChB,gBACA,SACA,aACA,mBACA,WACA,yBACA,qBAEFo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,eAEpByb,gBAAiB,CACf/5D,cAAe,CAAC,mBAAoB,mBACpCC,iBAAkB,CAChB,kBACA,aACA,mCACA,oBACA,UAEFo+C,UAAW,CAAC,OAAQ,aACpBC,gBAAiB,CAAC,WAAY,eAEhC0b,uBAAwB,CACtBh6D,cAAe,CAAC,mBAAoB,kBAAmB,oBAAqB,aAAc,mBAC1FC,iBAAkB,CAChB,WACA,mBACA,mBACA,aACA,kBACA,kBACA,kBACA,kBACA,iBACA,qBAEFo+C,UAAW,CAAC,OAAQ,aACpBC,gBAAiB,CAAC,eAEpB2b,cAAe,CACbj6D,cAAe,CACb,mBACA,aACA,iBACA,yBACA,2BAEFC,iBAAkB,CAChB,oBACA,kBACA,gCACA,mBACA,WACA,YACA,uBACA,kBACA,kBACA,kBAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,eAEpB4b,UAAW,CACTl6D,cAAe,CAAC,mBAAoB,aACpCC,iBAAkB,CAAC,WAAY,kBAAmB,kBAAmB,mBACrEo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpB6b,iBAAkB,CAChBn6D,cAAe,CAAC,oBAChBC,iBAAkB,CAChB,aACA,kBACA,oBACA,gBACA,cACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,SAEpB8b,cAAe,CACbp6D,cAAe,CAAC,YAAa,oBAC7BC,iBAAkB,CAAC,WAAY,aAAc,aAC7Co+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpB+b,YAAa,CACXr6D,cAAe,CAAC,oBAChBC,iBAAkB,CAChB,aACA,kBACA,oBACA,WACA,gCACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAEpBgc,eAAgB,CACdt6D,cAAe,CAAC,kBAAmB,aAAc,cACjDC,iBAAkB,CAChB,kBACA,kBACA,kBACA,iBACA,uBACA,mBACA,WACA,mBACA,oBACA,mBAEFo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,eAEpBic,aAAc,CACZv6D,cAAe,CAAC,mBAChBC,iBAAkB,CAAC,mBAAoB,qBACvCo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,QAAS,WAAY,kBAAmB,OAAQ,eAEpEkc,iBAAkB,CAChBx6D,cAAe,CAAC,iCAChBC,iBAAkB,CAAC,mBAAoB,mCAAoC,mBAC3Eo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,YAEpBmc,QAAS,CACPz6D,cAAe,CAAC,cAChBC,iBAAkB,CAAC,gBAAiB,aACpCo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,oBAEpBoc,aAAc,CACZ16D,cAAe,CAAC,cAChBC,iBAAkB,CAAC,wBACnBo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,kBAAmB,SAEvCqc,SAAU,CACR36D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,UACtCo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,QAAS,oBAE7Bsc,MAAO,CACL56D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,UACtCo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAAW,WAAY,aAAc,UAEzDuc,eAAgB,CACd76D,cAAe,CAAC,kBAChBC,iBAAkB,CAAC,aAAc,mBACjCo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,UAAW,WAAY,OAAQ,kBAAmB,QAAS,UAE/Ewc,aAAc,CACZ96D,cAAe,CAAC,cAChBC,iBAAkB,CAAC,gBAAiB,UACpCo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,kBAAmB,SAEvCyc,gBAAiB,CACf/6D,cAAe,CAAC,mBAAoB,YAAa,cACjDC,iBAAkB,CAChB,WACA,mBACA,oBACA,kBACA,iBACA,kBACA,gCACA,mCACA,oBACA,kBACA,cAEFo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpB0c,SAAU,CACRh7D,cAAe,CACb,iBACA,aACA,kBACA,oBACA,gBACA,mBACA,gCACA,cACA,yBACA,0BACA,mBAEFC,iBAAkB,GAClBo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,eAEpB2c,cAAe,CACbj7D,cAAe,CAAC,YAChBC,iBAAkB,CAAC,oBACnBo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpB4c,cAAe,CACbl7D,cAAe,CAAC,oBAChBC,iBAAkB,CAAC,kBAAmB,mCAAoC,oBAAqB,mBAC/Fo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,UAAW,WAAY,UAE3C6c,cAAe,CACbn7D,cAAe,CAAC,cAChBC,iBAAkB,CAAC,kBAAmB,kBAAmB,UACzDo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAAW,aAE/B8c,QAAS,CACPp7D,cAAe,CAAC,iCAChBC,iBAAkB,CAAC,mCAAoC,qBACvDo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,oBAEpB+c,WAAY,CACVr7D,cAAe,CAAC,mBAAoB,yBAA0B,2BAC9DC,iBAAkB,CAChB,gBACA,cACA,cACA,aACA,kBACA,qBAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,YAEpBgd,YAAa,CACXt7D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,UACtCo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,aAAc,kBAAmB,eAErDid,MAAO,CACLv7D,cAAe,CAAC,oBAChBC,iBAAkB,CAChB,mBACA,kBACA,iBACA,WACA,YACA,wBAEFo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpBkd,WAAY,CACVx7D,cAAe,CAAC,aAAc,kBAAmB,oBACjDC,iBAAkB,CAChB,aACA,gBACA,SACA,yBACA,0BACA,yBACA,mBACA,iBACA,iBACA,gBACA,mBACA,YAEFo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,YAEpBmd,YAAa,CACXz7D,cAAe,CAAC,aAAc,kBAAmB,mBAAoB,kBAAmB,qBACxFC,iBAAkB,CAChB,aACA,gBACA,SACA,yBACA,0BACA,yBACA,mBACA,iBACA,iBACA,gBACA,mBACA,YAEFo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,YAEpBod,aAAc,CACZ17D,cAAe,CAAC,cAChBC,iBAAkB,CAAC,iBAAkB,mBACrCo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,UAAW,WAAY,QAAS,oBAEpDqd,WAAY,CACV37D,cAAe,CAAC,aAAc,mBAAoB,kBAAmB,qBACrEC,iBAAkB,CAChB,kBACA,aACA,iBACA,mBACA,WACA,kBACA,kBAEFo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,YAEpBsd,OAAQ,CACN57D,cAAe,CAAC,oBAChBC,iBAAkB,CAChB,aACA,kBACA,oBACA,gBACA,cACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,kBAAmB,aAAc,SAErDud,SAAU,CACR77D,cAAe,CAAC,oBAChBC,iBAAkB,CAChB,mCACA,gCACA,cACA,mBAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,aAE/Bwd,UAAW,CACT97D,cAAe,CAAC,oBAChBC,iBAAkB,CAChB,iBACA,aACA,kBACA,mCACA,qBAEFo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,aAAc,eAElCyd,OAAQ,CACN/7D,cAAe,CAAC,iCAChBC,iBAAkB,CAAC,mBAAoB,mCAAoC,mBAC3Eo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,aAAc,SAElC0d,cAAe,CACbh8D,cAAe,CAAC,oBAChBC,iBAAkB,CAAC,YACnBo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,aAAc,UAElC2d,YAAa,CACXj8D,cAAe,CAAC,mBAChBC,iBAAkB,CAAC,iBAAkB,cACrCo+C,UAAW,CAAC,YACZC,gBAAiB,CAAC,UAAW,QAAS,WAAY,SAEpD4d,WAAY,CACVl8D,cAAe,CAAC,qBAChBC,iBAAkB,CAChB,kBACA,gBACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,WAAY,kBAAmB,SAEnD6d,6BAA8B,CAC5Bn8D,cAAe,CAAC,aAAc,mBAC9BC,iBAAkB,CAAC,iBAAkB,iBACrCo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,aAEpB+d,mBAAoB,CAClBr8D,cAAe,CAAC,oBAChBC,iBAAkB,CAChB,aACA,kBACA,oBACA,WACA,gCACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAEpBge,aAAc,CACZt8D,cAAe,CAAC,cAChBC,iBAAkB,CAAC,kBAAmB,SAAU,mBAChDo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAAW,WAAY,aAAc,UAEzDie,iBAAkB,CAChBv8D,cAAe,CAAC,mBAChBC,iBAAkB,GAClBo+C,UAAW,CAAC,YACZC,gBAAiB,CAAC,YAEpB8d,aAAc,CACZp8D,cAAe,CAAC,kBAAmB,mBAAoB,kBACvDC,iBAAkB,CAChB,aACA,aACA,mBACA,kBACA,oBACA,kBACA,mBACA,2BAEFo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpBke,iBAAkB,CAChBx8D,cAAe,CAAC,iBAAkB,kBAAmB,cACrDC,iBAAkB,CAAC,kBAAmB,mBAAoB,WAAY,mBAAoB,UAC1Fo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,aAE/Bme,sBAAuB,CACrBz8D,cAAe,CAAC,mBAChBC,iBAAkB,CAAC,cACnBo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,OAAQ,oBAE5Boe,OAAQ,CACN18D,cAAe,CAAC,aAAc,mBAAoB,kBAClDC,iBAAkB,CAChB,aACA,kBACA,iBACA,mBACA,kBACA,oBACA,gBACA,mBACA,WACA,2BAEFo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAEpBqe,aAAc,CACZ38D,cAAe,CAAC,YAChBC,iBAAkB,CAAC,aACnBo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,aAAc,WAAY,UAE9Cse,oBAAqB,CACnB58D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,iBAAkB,aAAc,UACtEo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,YAEpBue,gBAAiB,CACf78D,cAAe,CAAC,iBAChBC,iBAAkB,CAAC,UACnBo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAAW,WAAY,oBAE3Cwe,iBAAkB,CAChB98D,cAAe,CAAC,oBAChBC,iBAAkB,CAAC,kBAAmB,mCAAoC,qBAC1Eo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,UAAW,aAE/Bye,cAAe,CACb/8D,cAAe,CAAC,cAChBC,iBAAkB,CAAC,gBAAiB,aACpCo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,oBAEpB0e,eAAgB,CACdh9D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,UACtCo+C,UAAW,CAAC,OAAQ,UACpBC,gBAAiB,CAAC,oBAEpB2e,oBAAqB,CACnBj9D,cAAe,CAAC,oBAChBC,iBAAkB,CAAC,kBAAmB,oBAAqB,mBAC3Do+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,YAEpB4e,uBAAwB,CACtBl9D,cAAe,CAAC,iBAChBC,iBAAkB,GAClBo+C,UAAW,CAAC,YACZC,gBAAiB,CAAC,aAEpB6e,UAAW,CACTn9D,cAAe,CAAC,mBAAoB,yBAA0B,2BAC9DC,iBAAkB,CAChB,gBACA,cACA,cACA,aACA,kBACA,oBACA,iCAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,QAAS,OAAQ,oBAErC8e,kBAAmB,CACjBp9D,cAAe,CAAC,mBAAoB,yBAA0B,2BAC9DC,iBAAkB,CAChB,gBACA,cACA,cACA,aACA,kBACA,qBAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAEpB+e,cAAe,CACbr9D,cAAe,CAAC,oBAChBC,iBAAkB,CAAC,kBAAmB,mCAAoC,oBAAqB,mBAC/Fo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,QAAS,WAAY,kBAAmB,OAAQ,UAEpEgf,0BAA2B,CACzBt9D,cAAe,CAAC,oBAChBC,iBAAkB,CAAC,kBAAmB,mCAAoC,oBAAqB,mBAC/Fo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,aAEpBif,MAAO,CACLv9D,cAAe,CAAC,0BAChBC,iBAAkB,CAAC,2BACnBo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,QAAS,WAAY,kBAAmB,OAAQ,UAE/Ekf,SAAU,CACRx9D,cAAe,CAAC,YAChBC,iBAAkB,CAAC,aACnBo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,QAAS,WAAY,SAEzCmf,WAAY,CACVz9D,cAAe,CAAC,YAChBC,iBAAkB,CAAC,aACnBo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,aAAc,OAAQ,UAE1Cof,gBAAiB,CACf19D,cAAe,CAAC,iBAAkB,wBAClCC,iBAAkB,GAClBo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,aAAc,UAAW,oBAE7Cqf,cAAe,CACb39D,cAAe,CAAC,kBAChBC,iBAAkB,CAAC,wBACnBo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,eAEpBsf,UAAW,CACT59D,cAAe,CAAC,YAChBC,iBAAkB,GAClBo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpBuf,gBAAiB,CACf79D,cAAe,CAAC,kBAAmB,oBACnCC,iBAAkB,CAAC,mBAAoB,aAAc,WAAY,oBAAqB,wBACtFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,eAEpBwf,mBAAoB,CAClB99D,cAAe,CAAC,iBAChBC,iBAAkB,CAAC,UACnBo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAAW,WAAY,kBAAmB,aAAc,UAE5Eyf,kBAAmB,CACjB/9D,cAAe,CAAC,iBAAkB,mBAClCC,iBAAkB,CAAC,cACnBo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,WAAY,eAEhC0f,0BAA2B,CACzBh+D,cAAe,CAAC,mBAChBC,iBAAkB,GAClBo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,eAEpB2f,6BAA8B,CAC5Bj+D,cAAe,CAAC,mBAChBC,iBAAkB,GAClBo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,eAEpB4f,6BAA8B,CAC5Bl+D,cAAe,CAAC,mBAChBC,iBAAkB,GAClBo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,eAEpB6f,mBAAoB,CAClBn+D,cAAe,CAAC,mBAChBC,iBAAkB,CAAC,aAAc,cACjCo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,aAAc,oBAE7C8f,WAAY,CACVp+D,cAAe,CAAC,cAChBC,iBAAkB,CAAC,mBACnBo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,eAEpB+f,MAAO,CACLr+D,cAAe,CAAC,oBAChBC,iBAAkB,CAAC,YAAa,YAChCo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,aAAc,eAElCigB,oBAAqB,CACnBv+D,cAAe,CAAC,iCAChBC,iBAAkB,CAAC,mBACnBo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,YAEpBggB,aAAc,CACZt+D,cAAe,CAAC,mBAChBC,iBAAkB,GAClBo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,UAAW,QAAS,WAAY,UAEpDkgB,OAAQ,CACNx+D,cAAe,CAAC,mBAAoB,iBAAkB,kBAAmB,cACzEC,iBAAkB,CAChB,kBACA,kBACA,gBACA,oBACA,SACA,mBAEFo+C,UAAW,CAAC,OAAQ,YAAa,UACjCC,gBAAiB,CAAC,aAEpBmgB,WAAY,CACVz+D,cAAe,CACb,iBACA,kBACA,aACA,aACA,mBACA,yBACA,0BACA,0BAEFC,iBAAkB,CAChB,kBACA,mBACA,oBACA,kBACA,iBACA,aACA,kBACA,kBACA,gBACA,mBAEFo+C,UAAW,CAAC,OAAQ,OAAQ,UAC5BC,gBAAiB,CAAC,YAEpBogB,WAAY,CACV1+D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,UACtCo+C,UAAW,CAAC,OAAQ,UACpBC,gBAAiB,CAAC,aAEpBqgB,UAAW,CACT3+D,cAAe,CACb,mBACA,oBACA,kBACA,kBACA,aACA,kBACA,kBAEFC,iBAAkB,CAChB,gCACA,mCACA,mBACA,aACA,WACA,mBACA,yBACA,0BACA,yBACA,kBACA,uBACA,kBACA,iBAEFo+C,UAAW,CAAC,OAAQ,YAAa,UACjCC,gBAAiB,CAAC,YAEpBxyC,MAAO,CACL9L,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAChB,kBACA,SACA,aACA,iBACA,WACA,mBACA,iBACA,iBAEFo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAAW,WAAY,aAAc,QAAS,oBAElEsgB,SAAU,CACR5+D,cAAe,CAAC,kBAAmB,mBAAoB,yBAA0B,2BACjFC,iBAAkB,CAChB,gBACA,cACA,cACA,kBACA,oBACA,gCACA,aACA,UAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,SAEpBugB,kBAAmB,CACjB7+D,cAAe,CAAC,iBAChBC,iBAAkB,CAAC,UACnBo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAAW,WAAY,kBAAmB,aAAc,UAE5EwgB,YAAa,CACX9+D,cAAe,CAAC,mBAAoB,yBAA0B,2BAC9DC,iBAAkB,CAChB,gBACA,cACA,cACA,aACA,kBACA,qBAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAEpBygB,qBAAsB,CACpB/+D,cAAe,CAAC,mBAAoB,yBAA0B,2BAC9DC,iBAAkB,CAChB,gBACA,cACA,cACA,aACA,kBACA,qBAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAEpB0gB,4BAA6B,CAC3Bh/D,cAAe,CAAC,qBAChBC,iBAAkB,CAChB,aACA,kBACA,kBACA,gBACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,UAEpB2gB,sCAAuC,CACrCj/D,cAAe,CAAC,qBAChBC,iBAAkB,CAAC,gBAAiB,cAAe,yBAA0B,2BAC7Eo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,UAEpB4gB,gBAAiB,CACfl/D,cAAe,CAAC,mBAAoB,yBAA0B,2BAC9DC,iBAAkB,CAChB,gBACA,cACA,cACA,aACA,kBACA,oBACA,iCAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAEpB6gB,OAAQ,CACNn/D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,UACtCo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAAW,WAAY,aAAc,SAEzD8gB,iBAAkB,CAChBp/D,cAAe,CAAC,iBAAkB,kBAAmB,cACrDC,iBAAkB,CAAC,kBAAmB,aAAc,mBAAoB,WAAY,oBACpFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,UAAW,WAAY,SAE3C+gB,oBAAqB,CACnBr/D,cAAe,CAAC,iBAAkB,cAClCC,iBAAkB,CAAC,kBAAmB,mBACtCo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,UAAW,WAAY,OAAQ,eAEnDghB,aAAc,CACZt/D,cAAe,CAAC,kBAAmB,aAAc,kBAAmB,kBACpEC,iBAAkB,CAChB,aACA,mBACA,WACA,mBACA,yBACA,aACA,mBAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,YAEpBihB,qBAAsB,CACpBv/D,cAAe,CAAC,kBAAmB,kBAAmB,cACtDC,iBAAkB,CAChB,kBACA,iBACA,aACA,kBACA,mBACA,gBACA,gBACA,SACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,YAEpBkhB,SAAU,CACRx/D,cAAe,CAAC,kBAChBC,iBAAkB,CAAC,kBAAmB,cACtCo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,aAAc,aAElCmhB,QAAS,CACPz/D,cAAe,CAAC,mBAAoB,yBAA0B,2BAC9DC,iBAAkB,CAChB,gBACA,cACA,cACA,aACA,kBACA,oBACA,iCAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,oBAEpBohB,SAAU,CACR1/D,cAAe,CAAC,mBAAoB,kBAAmB,cACvDC,iBAAkB,CAChB,kBACA,kBACA,mCACA,oBACA,SACA,mBAEFo+C,UAAW,CAAC,YAAa,UACzBC,gBAAiB,CAAC,YAEpBqhB,UAAW,CACT3/D,cAAe,CAAC,YAAa,oBAC7BC,iBAAkB,CAAC,WAAY,aAAc,YAAa,wBAC1Do+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,eAEpBshB,cAAe,CACb5/D,cAAe,CAAC,WAAY,oBAC5BC,iBAAkB,CAAC,iBAAkB,mBAAoB,qBACzDo+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,UAEpBuhB,gBAAiB,CACf7/D,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,UACtCo+C,UAAW,CAAC,UACZC,gBAAiB,CAAC,YAEpBwhB,WAAY,CACV9/D,cAAe,CAAC,mBAChBC,iBAAkB,CAAC,mBAAoB,gCAAiC,eACxEo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,aAAc,oBAElCyhB,iBAAkB,CAChB//D,cAAe,CAAC,mBAChBC,iBAAkB,GAClBo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,UAAW,QAAS,OAAQ,aAEhD0hB,gBAAiB,CACfhgE,cAAe,CAAC,mBAChBC,iBAAkB,GAClBo+C,UAAW,CAAC,cACZC,gBAAiB,CAAC,UAEpB2hB,WAAY,CACVjgE,cAAe,CAAC,mBAChBC,iBAAkB,CAChB,iBACA,aACA,kBACA,mBACA,gBACA,oBACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,aACZC,gBAAiB,CAAC,UAAW,QAAS,WAAY,SAEpD4hB,IAAK,CACHlgE,cAAe,CAAC,YAAa,oBAC7BC,iBAAkB,CAAC,WAAY,aAAc,aAC7Co+C,UAAW,CAAC,SACZC,gBAAiB,CAAC,aAAc,OAAQ,aAE1C6hB,WAAY,CACVngE,cAAe,CAAC,oBAChBC,iBAAkB,CAChB,iBACA,aACA,kBACA,cACA,yBACA,2BAEFo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,eAEpB8hB,UAAW,CACTpgE,cAAe,CAAC,iBAChBC,iBAAkB,GAClBo+C,UAAW,CAAC,YACZC,gBAAiB,CAAC,YAEpB+hB,YAAa,CACXrgE,cAAe,CAAC,kBAAmB,iBACnCC,iBAAkB,GAClBo+C,UAAW,CAAC,YACZC,gBAAiB,CAAC,eAEpBgiB,aAAc,CACZtgE,cAAe,CAAC,kBAAmB,cACnCC,iBAAkB,CAAC,kBAAmB,UACtCo+C,UAAW,CAAC,QACZC,gBAAiB,CAAC,aA2MtB,SAAiBrpH,GACf,SAAgB+rI,EAAYlyI,GAC1B,OAAOxD,EAAAy1I,SAASjyI,IAAO,EACzB,CAuDA,SAASmyI,EAAmBjyI,EAA2B8M,SACrD,OAAsB,QAAf/K,EAAA+K,aAAI,EAAJA,EAAM/M,iBAAS,IAAAgC,EAAAA,EAAIw2C,EAAAM,wBAAwBijF,iBAAiB97H,GAAUD,SAC/E,CAIA,SAAgBmyI,EACdlyI,EACAD,EACA+M,GAEA,MAAMqlI,EAAcF,EAAmBjyI,EAAU8M,GACjD,OAAOqlI,EAAc,GAAGnyI,EAAS2G,SAAS4hE,EAAc4pE,EAAapyI,KAAeC,EAAS2G,IAC/F,CAqBA,SAAgByrI,EACdzrI,EACA5G,EACAC,EACA6F,GAEA,MAAM65B,EAAeV,EAAAO,UAAUC,iBAAiB35B,GAC1C+rI,EAAqB,MAAZ5xI,EAAmB6F,EAASM,UAAUnG,EAASF,SAAMuJ,EAC9D8oI,EAAwB,MAAVP,EAAiBK,EAAmBL,EAAQ,CAAE7xI,cAAeA,EAGjF,OADY,MAAV6xI,EAAgC,MAAfO,EAAqC,MAAfA,GAAuBA,KAAgBnyI,aAAQ,EAARA,EAAUwyE,mBAC5E,GAAG7rE,MAAS4hE,EAAc4pE,EAAazyG,KAAkB/4B,CACzE,CAEA,SAAS0rI,EAAcjgG,GACrB,OAAOA,EACJ5yB,OACApO,cACA1K,QAAQ,WAAY,IACzB,CAEA,SAAgB4rI,EAAWl0I,EAAW6D,GACpC,OAAOowI,EAAcj0I,KAAOi0I,EAAcpwI,EAC5C,CAmBA,SAASswI,EAAevyI,EAA2BD,GACjD,OAAOw4C,EAAAM,wBAAwBgjF,KAAK77H,GAAUG,IAAK0E,GAAMwtI,EAAcH,EAAelyI,EAAUD,EAAW8E,IAC7G,CAkDA,SAAgB20E,EACd15E,EACA2N,EACA1N,GAEA,OAAO4xI,EAAiB7xI,EAAI2N,EAA8B,MAAb1N,EAAoB,CAAED,KAAIC,kBAAcsJ,EACvF,CAKA,SAASmpI,EACP7rI,EACA8G,EACA1N,GAEA,MAAM+P,EAASuiI,EAAc1rI,GACvB8rI,EAAUnuI,EAAAwC,YAAYD,OAAO4G,GAAiB/K,OAAQs9F,GAAoC,MAANA,GAC1F,IAAK,MAAM2vB,IAAa,EAAC,GAAO,GAAO,CACrC,MAAM+iB,EAAOD,EAAQ/vI,OAAQs9F,KAASA,EAAG2vB,YAAcA,GACjDgjB,EAAOD,EAAKhwI,OAAQs9F,GAAOqyC,EAAcryC,EAAGr5F,MAAQ,MAAQmJ,GAC5D8iI,EAAYD,EAAKpgH,KAAMytE,GAAiE,MAA1DznD,EAAAM,wBAAwBijF,iBAAiB97B,GAAIjgG,YAAsB4yI,EAAK,GAC5G,GAAIC,EACF,MAAO,CAAE5yI,SAAU4yI,EAAW7yI,UAAWw4C,EAAAM,wBAAwBijF,iBAAiB8W,GAAW7yI,WAE/F,IAAK,MAAMigG,KAAM0yC,EAAM,CACrB,MAAM1gH,EAAYumB,EAAAM,wBAAwBgjF,KAAK77B,GAAIztE,KAChD1tB,GAAqB,MAAfA,EAAE9E,WAAqBsyI,EAAcH,EAAelyC,EAAIjgG,EAAW8E,MAAQiL,GAEpF,GAAIkiB,EACF,MAAO,CAAEhyB,SAAUggG,EAAIjgG,UAAWiyB,EAAUjyB,UAEhD,CACF,CAEF,CAEA,SAAgB8yI,EACdlsI,EACA8G,EACA1N,SAGA,OADgBwxI,EAAgB5qI,EAAKyK,iBAImB,QAAjDrP,EAAAywI,EAAgB7rI,EAAM8G,EAAiB1N,UAAU,IAAAgC,OAAA,EAAAA,EAAE/B,SAASF,GACrE,CAGA,SAAgBo3E,EAAYpqE,EAAqBW,GAC/C,MAAMmkI,EAASnkI,EAAgBX,EAAKhN,IACpC,OAAiB,MAAV8xI,EAAiBr5F,EAAAM,wBAAwB/V,QAAQ8uG,EAAQ9kI,GAAQA,CAC1E,CAEA,SAAgB5G,EAAI4G,EAAqBW,GACvC,MAAMzN,EAAW8xI,EAAYhlI,EAAKhN,GAAI2N,EAAiBX,GACvD,OAAA1Q,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYpE,GAAQ,CAAED,UAAWm3E,EAAYpqE,EAAMW,GAAiB1N,WACtE,CAuBA,SAAgB+yI,EAAkB9yI,EAAqByN,GACrD,MAAMmkI,EAASnkI,EAAgBzN,EAASF,IACxC,OAAiB,MAAV8xI,EAAiBr5F,EAAAM,wBAAwBijF,iBAAiB8V,GAAQ7xI,UAAYC,EAASwyE,gBAChG,CAEA,SAAgBugE,EAAQjzI,EAAiB2N,GACvC,MAAMzN,EAAW8xI,EAAYhyI,EAAI2N,GACjC,OAAArR,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYpE,GAAQ,CAAED,UAAW+yI,EAAkB9yI,EAAUyN,IAC/D,CA+IA,SAASulI,EAAiBvlI,GACxB,OAAOnJ,EAAAwC,YAAYzG,KAAKoN,GAAiBrO,QAASU,IAChD,MAAME,EAAW8xI,EAAYhyI,EAAI2N,GACjC,OAAO8qC,EAAAM,wBAAwBgjF,KAAKpuH,EAAgB3N,IAAMK,IAAK0E,GAAMzI,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAMpE,GAAQ,CAAED,UAAW8E,EAAE9E,cAEtG,CAWA,SAAgBkzI,EAAYxlI,GAC1B,OAAOulI,EAAiBvlI,GAAiBtR,OACvCmI,EAAAwC,YAAYzG,KAAK/D,EAAAugF,kBAAkBz9E,QAAS8J,GACnCjC,EAAAC,gBAAgB+B,QACrBxJ,EAAA4uH,WAAWluH,IAAKJ,IACd,MAAM4vB,EAAe,CAAE7vB,GAAIoJ,EAAGnJ,aAC9B,OAAO8jB,EAAAc,mBAAmB+zB,OAAO/oB,EAAc,SAAUvzB,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAM9H,EAAAugF,iBAAiB3zE,IAAE,CAAEnJ,mBAAcsJ,MAK5G,CAkDA,SAAgB6pI,EAAqBpmI,EAAqBjH,GACxD,MAAM+yC,EAAiB/yC,EAASM,UAAU2G,EAAKhN,IAC/C,GAAI84C,EACF,OAAOi5F,EAAcj5F,EAAgB9rC,GAAMkkE,cACtC,CACL,MAAM7zD,EAAO60H,EAAYllI,EAAKhN,IAC9B,OAA8B,OAAvBqd,aAAI,EAAJA,EAAM6zD,eAAwB7zD,EAAK6zD,cAAgB,EAC5D,CACF,CAEA,SAAgBA,EAAclkE,EAAqBjH,SACjD,MAAMgyH,EAA+D,QAA3C91H,EAAA8D,EAAShE,aAAaoE,EAASw5B,MAAM3yB,WAAM,IAAA/K,OAAA,EAAAA,EAAE81H,kBACvE,OAAIA,EACcA,EAAkBn1H,OAAQmM,GAAuB,IAAjBA,EAAE0lC,YACnCp0C,IAAK0O,GAAMA,EAAE2yE,QAErB0xD,EAAqBpmI,EAAMjH,EAEtC,CA0BA,SAAgBstI,EAAkCrmI,EAAqBjH,GACrE,MAAM+yC,EAAiB/yC,EAASM,UAAU2G,EAAKhN,IAC/C,GAAI84C,EACF,OAAOi5F,EAAcj5F,EAAgB9rC,GAAMmkE,iBAAiB9wE,IAAK0O,IAAM,CACrE2yE,OAAQ3yE,EACR0lC,WAAY1uC,EAASlF,QAAQ6sE,uBAE1B,CACL,MAAMrwD,EAAO60H,EAAYllI,EAAKhN,IAC9B,OAAiC,OAA1Bqd,aAAI,EAAJA,EAAM8zD,kBACT9zD,EAAK8zD,iBAAiB9wE,IAAK0O,IAClB,CAAE2yE,OAAQ3yE,EAAG0lC,WAAY1uC,EAASlF,QAAQ6sE,uBAEnD,EACN,CACF,CAEA,SAAgB4lE,EAAwBtmI,EAAqBjH,GAC3D,OAAOstI,EAAkCrmI,EAAMjH,GAAU1F,IAAK0O,GAAMA,EAAE2yE,OACxE,CAEA,SAAgB6xD,EAA2BvmI,EAAqBjH,SAC9D,MAAMgyH,EAA+D,QAA3C91H,EAAA8D,EAAShE,aAAaoE,EAASw5B,MAAM3yB,WAAM,IAAA/K,OAAA,EAAAA,EAAE81H,kBACvE,OAAIA,EACcA,EAAkBn1H,OAAQmM,GAAMA,EAAE0lC,WAAa,GAGxD4+F,EAAkCrmI,EAAMjH,EAEnD,CAEA,SAAgBorE,EAAiBnkE,EAAqBjH,SACpD,MAAMgyH,EAA+D,QAA3C91H,EAAA8D,EAAShE,aAAaoE,EAASw5B,MAAM3yB,WAAM,IAAA/K,OAAA,EAAAA,EAAE81H,kBACvE,OAAIA,EACcA,EAAkBn1H,OAAQmM,GAAMA,EAAE0lC,WAAa,GAChDp0C,IAAK0O,GAAMA,EAAE2yE,QAErB4xD,EAAwBtmI,EAAMjH,EAEzC,CAyEA,SAAgBytI,EAAcnlI,EAAwB7P,EAAcuH,GAClE,MAAM0tI,EAAKttI,EAAS+qE,cAAc7iE,EAAStI,GACrC+7E,EAAK37E,EAASgrE,iBAAiB9iE,EAAStI,GACxC2tI,EAAMvtI,EAAS+qE,cAAc1yE,EAAGuH,GAChC4tI,EAAMxtI,EAASgrE,iBAAiB3yE,EAAGuH,GACzC,IAAI6tI,EAAS,EACb,GAAIp1I,EAAEwB,KAAOqO,EAAQrO,IAAsB,IAAf0zI,EAAI73I,QAA+B,IAAf83I,EAAI93I,OAClD+3I,GAAS,QACJ,CACL,IAAK,MAAMlyD,KAAUgyD,GACS,IAAxBD,EAAGjhI,QAAQkvE,GACbkyD,GAAU,GAEVA,GAAU,IAEgB,IAAxB9xD,EAAGtvE,QAAQkvE,KACbkyD,GAAU,IAGd,IAAK,MAAMlyD,KAAU+xD,GACU,IAAzBC,EAAIlhI,QAAQkvE,KACdkyD,GAAU,IAGd,IAAK,MAAMlyD,KAAUiyD,GACS,IAAxB7xD,EAAGtvE,QAAQkvE,GACbkyD,GAAU,GAEVA,GAAU,IAEgB,IAAxBH,EAAGjhI,QAAQkvE,KACbkyD,GAAU,IAGd,IAAK,MAAMlyD,KAAUI,GACU,IAAzB6xD,EAAInhI,QAAQkvE,KACdkyD,GAAU,IAGa,UAAvBp1I,EAAEk0E,kBAAuD,oBAAvBl0E,EAAEk0E,mBACtCkhE,GAAU,GAEd,CACA,OAAOA,CACT,CAtrBgBztI,EAAA+rI,YAAWA,EAIX/rI,EAAAyyC,OAAhB,SAAuB/xC,EAAc8G,GACnC,IAAIzN,EAAWsE,EAAAwC,YAAYzG,KAAK/D,EAAAugF,kBAAkBn6E,OAAQwG,GAAM5M,EAAAugF,iBAAiB3zE,GAAGvC,OAASA,GAAM,GAMnG,OALgB,MAAZ3G,IACFA,EAAWsE,EAAAwC,YAAYzG,KAAKoN,GAAiB/K,OAC1CwG,IAAOuE,EAAgBvE,GAAIymH,WAAaliH,EAAgBvE,GAAIvC,OAASA,GACtE,MAEK3G,CACX,EAEgBiG,EAAA0tI,SAAhB,SAAyB7zI,EAAY2N,GACnC,OAA8B,MAAvBA,EAAgB3N,EACzB,EAEgBmG,EAAAqf,SAAhB,SAAyBtlB,EAAqB6F,EAAqB0K,GACjE,IAAI6hC,EACJ,MAAMw/F,EAAS/rI,EAASM,UAAUnG,EAASF,IAC3C,GAAc,MAAV8xI,EACFx/F,EAAM8/F,EAAeN,EAAQ5yG,EAAAO,UAAUC,iBAAiB35B,GAAW7F,QAC9D,GAAIA,EAASD,WAAaC,EAASwyE,mBAAqBxyE,EAASD,UAAW,CACjF,MAAM2/B,EAAeV,EAAAO,UAAUC,iBAAiB35B,GAC1C9F,EAAYwoE,EAAcvoE,EAASD,UAAW2/B,GACpD0S,EAAM,GAAGpyC,EAAS2G,SAAS5G,GAC7B,MACEqyC,EAAMpyC,EAAS2G,KAKjB,OAHI4J,IACF6hC,EAAM,GAAG7hC,MAAU6hC,KAEdA,CACT,EAEgBnsC,EAAA2tI,YAAhB,SAA4B5zI,EAAqB6F,GAC/C,GAAI7F,EAASD,UAAW,CACtB,MAAM2/B,EAAe75B,EAAWm5B,EAAAO,UAAUC,iBAAiB35B,GAAY,GAEvE,MAAO,GADW0iE,EAAcvoE,EAASD,UAAW2/B,MAC7B1/B,EAAS2G,MAClC,CACE,OAAO3G,EAAS2G,IAEpB,EAEgBV,EAAA4tI,kBAAhB,SAAkC7zI,EAAqB6F,GACrD,GAAI7F,EAASD,UAAW,CACtB,MAAM2/B,EAAe75B,EAAWm5B,EAAAO,UAAUC,iBAAiB35B,GAAY,GACjE9F,EAAYwoE,EAAcvoE,EAASD,UAAW2/B,GACpD,MAAO,GAAG1/B,EAAS2G,SAAS5G,GAC9B,CACE,OAAOC,EAAS2G,IAEpB,EASgBV,EAAAisI,eAAcA,EAUdjsI,EAAA6tI,YAAhB,SACE9zI,EACAD,EACA+M,GAEA,MAAMqlI,EAAcF,EAAmBjyI,EAAU8M,GACjD,OAAOqlI,EAAc,GAAGnyI,EAAS2G,SAAS4hE,EAAc4pE,EAAapyI,MAAgBC,EAAS2G,IAChG,EAGgBV,EAAA8tI,YAAhB,SAA4BptI,EAAcmG,EAAiCjH,GACzE,MAAM7F,EAAmB,MAAR8M,EAAejH,EAASM,UAAU2G,EAAKhN,SAAMuJ,EAC9D,OAAe,MAARyD,GAA4B,MAAZ9M,EAAmBoyI,EAAezrI,EAAMmG,EAAK/M,UAAWC,EAAU6F,GAAYc,CACvG,EAKgBV,EAAAmsI,eAAcA,EAqBdnsI,EAAAqsI,WAAUA,EAMVrsI,EAAA+tI,aAAhB,SACEh0I,EACAyN,GAEA,OAAOnJ,EAAAwC,YAAYD,OAAO4G,GAAiB8kB,KACxCytE,GACO,MAANA,IAAeA,EAAG2vB,WAAa3vB,EAAGlgG,KAAOE,EAASF,IAAMwyI,EAAWtyC,EAAGr5F,KAAM3G,EAAS2G,MAE3F,EAEgBV,EAAAguI,cAAhB,SAA8BttI,GAC5B,MAAO,sBAAsBA,EAAK6Y,4EACpC,EAUgBvZ,EAAAiuI,cAAhB,SACEl0I,EACAyN,EACA1N,GAEA,MAAMo0I,EAAU5B,EAAevyI,EAAUD,GACnC6xI,EAASttI,EAAAwC,YAAYD,OAAO4G,GAAiB8kB,KAAMytE,IACvD,GAAU,MAANA,GAAcA,EAAG2vB,WAAa3vB,EAAGlgG,KAAOE,EAASF,GACnD,OAAO,EAET,MAAMmd,EAAQs1H,EAAevyC,EAAIjgG,GAIjC,OAHIigG,EAAGr5F,KAAKuG,SAAS,MACnB+P,EAAM7P,KAAKilI,EAAcryC,EAAGr5F,OAEvBwtI,EAAQv2I,KAAMwkB,GAAMnF,EAAM/P,SAASkV,MAE5C,OAAIwvH,EACKA,EAAO9xI,GAETq0I,EAAQh0I,IAAKiiB,GAAMmvH,EAAgBnvH,IAAImQ,KAAMzyB,GAAa,MAANA,EAC7D,EAEgBmG,EAAAmuI,YAAhB,SACEv9H,EACApJ,EACA1N,GAEA,MAaMs0I,EAAQ,IAbOpB,EAAY,IAE9BvwI,OAAQpE,GACPuR,EAAAmB,YAAYsjI,YACVz9H,EAAMzF,cACN,GAAG9S,EAAEqI,OAAOrI,EAAEyB,UAAY,KAAKwoE,EAAcjqE,EAAEyB,aAAe,KAAKqR,gBAGtEjR,IAAK7B,GAAM,GAAGA,EAAEqI,OAAOrI,EAAEyB,UAAY,KAAKwoE,EAAcjqE,EAAEyB,aAAe,SAChDuE,EAAAwC,YAAYD,OAAO4G,GAC5C/K,OAAQs9F,GAAoC,MAANA,GACtC5gG,QAAS4gG,GAAOznD,EAAAM,wBAAwBgjF,KAAK77B,GAAI7/F,IAAK0E,GAAMqtI,EAAelyC,EAAIjgG,EAAW8E,KAC1FnC,OAAQzB,GAAS4O,EAAAmB,YAAYsjI,YAAYz9H,EAAMzF,cAAenQ,EAAKmQ,iBAGtE,OADAijI,EAAM/zI,OACC+zI,CACT,EAEgBpuI,EAAAuzE,SAAQA,EAqCRvzE,EAAA4sI,aAAYA,EAaZ5sI,EAAAixE,YAAWA,EAKXjxE,EAAAC,IAAGA,EAKHD,EAAAypB,MAAhB,SAAsB5iB,EAAqBjH,SACzC,MAAM0uI,EAAgD,QAA3CxyI,EAAA8D,EAAShE,aAAaoE,EAASw5B,MAAM3yB,WAAM,IAAA/K,OAAA,EAAAA,EAAElB,IACxD,GAAI0zI,EACF,OAAO/vI,EAAAS,OAAOytC,UAAU6hG,EAAI1uI,EAASS,OAEvC,MAAMtG,EAAWiG,EAASC,IAAI4G,EAAMjH,EAASM,WAC7C,MAA0B,OAAnBN,EAASS,MAAiBtG,EAASuG,iBAAmBvG,EAASwG,gBACxE,EAEgBP,EAAA2uC,gBAAhB,SAAgC9nC,EAAqBjH,WACnD,MAAMS,EAAQ04B,EAAAO,UAAU4T,gCAAgCttC,EAAUiH,GAClE,OAAOxL,KAAKmqC,IAAI,GAA0D,QAArD3pC,EAA2C,QAA3CC,EAAA8D,EAAShE,aAAaoE,EAASw5B,MAAM3yB,WAAM,IAAA/K,OAAA,EAAAA,EAAE4yC,gBAAQ,IAAA7yC,EAAAA,EAAe,OAAVwE,EAAiB,IAAM,EACxG,EAEgBL,EAAAssB,KAAhB,SAAqBzlB,EAAqBW,GACxC,MAAMzN,EAAW2xI,EAAiB7kI,EAAKhN,GAAI2N,EAAiBX,GAC5D,OAAO9M,EAAU5D,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAMpE,GAAQ,CAAED,UAAWm3E,EAAYpqE,EAAMW,GAAiB1N,iBAAcsJ,CAC/F,EAIgBpD,EAAA6sI,kBAAiBA,EAKjB7sI,EAAA8sI,QAAOA,EAKP9sI,EAAA85B,oBAAhB,SACEtyB,EACA9G,EACA5G,EACA2/B,GAEA,MAAM80G,EAAYjD,EAAgB5qI,EAAKyK,eACvC,GAAIojI,EAAW,CACb,MAAMC,EAAUj7D,EAASg7D,EAAW/mI,GACpC,OAAOgnI,EAASr4I,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAMqwI,GAAO,CAAE10I,mBAAcsJ,CAC/C,CACA,MAAMgpC,EAAQmgG,EAAgB7rI,EAAM8G,EAAiBiyB,GACrD,GAAa,MAAT2S,EACF,OAEF,MAAMu5C,EAAW7rF,QAAAA,EAAasyC,EAAMtyC,UAC9BC,EAAWw5E,EAASnnC,EAAMryC,SAASF,GAAI2N,EAAiBm+E,GAC9D,OAAO5rF,EAAU5D,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAMpE,GAAQ,CAAED,UAAW6rF,SAAaviF,CAC3D,EAEgBpD,EAAAogE,uBAAhB,SACEquE,EACAjnI,EACAiyB,GAEA,MAAMpyB,EAAQonI,EAAiBr1H,MAAM,KAAKlf,IAAKsF,GAAMA,EAAE+Z,QACvD,IAAI7Y,EACA5G,EACJ,GAAIuN,EAAM3R,OAAS,EAAG,CACpB,MAAMg5I,EAAiBl1I,EAAA4uH,WAAW3rH,OAC/BpE,GAAMiqE,EAAcjqE,GAAG8S,gBAAkB9D,EAAMA,EAAM3R,OAAS,GAAGyV,eAClE,GACoB,MAAlBujI,GACF50I,EAAY40I,EACZhuI,EAAO2G,EAAMrR,MAAM,EAAGqR,EAAM3R,OAAS,GAAGmO,KAAK,OAE7C/J,EAAY,IAEhB,CACY,MAAR4G,IACFA,EAAO+tI,GAET,MAAMl5H,EAAaq3H,EAAalsI,EAAM,IACtC,GAAkB,MAAd6U,GAAoC,OAAdzb,EAAoB,CAC5C,MAAMC,EAAWw5E,EAASh+D,EAAY,IACtC,GAAgB,MAAZxb,EACF,OAAA5D,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYpE,GAAQ,CAAED,UAAWA,GAAaC,EAASwyE,kBAE3D,KAAO,CACL,MAAMgiE,EAAYjD,EAAgBmD,EAAiBtjI,eAC7CihC,EAAQmiG,OAAYnrI,EAAYmpI,EAAgBkC,EAAkBjnI,EAAiBiyB,GACnF5/B,EAAK00I,IAAaniG,aAAK,EAALA,EAAOryC,SAASF,IACxC,GAAU,MAANA,EAAY,CACd,MAAME,EAAWw5E,EAAS15E,EAAI2N,EAAiB4kC,aAAK,EAALA,EAAOtyC,WACtD,GAAgB,MAAZC,EACF,OAAgB,MAATqyC,EAAej2C,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAMpE,GAAQ,CAAED,UAAWsyC,EAAMtyC,YAAa3D,OAAAgI,OAAA,GAAMpE,EAE9E,CACF,CAEF,EAEgBiG,EAAAgf,gBAAhB,SAAgC0K,EAA6B9pB,GAC3D,MAAMpF,EAAMwF,EAASw5B,MAAM9P,GACrB9tB,EAAegE,EAAShE,aAAapB,GAC3C,QAAmC4I,KAA/BxH,aAAY,EAAZA,EAAc0M,cAChB,OAAO1M,EAAa0M,aAGtB,OAAQohB,EAAa7vB,IACnB,IAAK,sBACL,IAAK,oBACL,IAAK,+BACL,IAAK,oBACL,IAAK,gBACL,IAAK,aACL,IAAK,eACL,IAAK,QACL,IAAK,eACL,IAAK,aACL,IAAK,SACL,IAAK,cACL,IAAK,kBACL,IAAK,oBACL,IAAK,WACL,IAAK,aACL,IAAK,kBACL,IAAK,gBACL,IAAK,YACL,IAAK,kBACL,IAAK,qBACL,IAAK,oBACL,IAAK,4BACL,IAAK,+BACL,IAAK,+BACL,IAAK,qBACH,OAAO,EACT,IAAK,YACL,IAAK,YACL,IAAK,mBACL,IAAK,yBACL,IAAK,aACL,IAAK,eACL,IAAK,cACL,IAAK,iBACL,IAAK,cACH,MAAkC,aAA3B6vB,EAAa5vB,UACtB,QACE,OAAO,EAEb,EAEgBkG,EAAA2uI,WAAhB,SACEjuI,EACA8G,EACAiyB,GAEA,MAAMm1G,EAAUluI,EAAK6Y,OACfg1H,EAAYjD,EAAgBsD,EAAQzjI,eACpCihC,EAAQmiG,OAAYnrI,EAAYmpI,EAAgBqC,EAASpnI,EAAiBiyB,GAC1ElkB,EAAag5H,IAAaniG,aAAK,EAALA,EAAOryC,SAASF,IAChD,GAAkB,MAAd0b,EAAoB,CACtB,MAAMxb,EAAWw5E,EAASh+D,EAAY/N,EAAiB4kC,aAAK,EAALA,EAAOtyC,WAC9D,GAAgB,MAAZC,EACF,OAAA5D,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKpE,GAAQ,CACXD,UAAoB,MAATsyC,EAAgBA,EAAMtyC,UAAY+yI,EAAkB9yI,EAAUyN,IAG/E,CAEF,EAEgBxH,EAAA6uI,SAAhB,SAAyBC,EAAoBtnI,GAC3C,OAAOsnI,EAAI50I,IAAKL,IACd,MAAME,EAAW8xI,EAAYhyI,EAAI2N,GACjC,OAAArR,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYpE,GAAQ,CAAED,UAAW+yI,EAAkB9yI,EAAUyN,MAEjE,EAUgBxH,EAAA8wF,IAAhB,SAAoBtpF,GAClB,OAAOulI,EAAiBvlI,GAAiBtR,OACvCmI,EAAAwC,YAAYzG,KAAK/D,EAAAugF,kBAAkB18E,IAAK+I,GAAM9M,OAAAgI,OAAAhI,OAAAgI,OAAA,GACzC9H,EAAAugF,iBAAiB3zE,IAAE,CACtBnJ,UAAWzD,EAAAugF,iBAAiB3zE,GAAGspE,oBAGrC,EAEgBvsE,EAAAgtI,YAAWA,EAaXhtI,EAAAyuC,GAAhB,SAAmBt2C,EAAkB6D,GACnC,OAAO7D,EAAE0B,KAAOmC,EAAEnC,IAAM1B,EAAE2B,YAAckC,EAAElC,SAC5C,EAEgBkG,EAAA+uI,6BAAhB,SACEnvI,EACAnD,EACAuyI,EACAC,EACAvlH,EACAh0B,GAEA,IAAIgmG,EAAe17F,EAASgtI,YAAY,IAWxC,OAVIvwI,IACFi/F,EAAe17F,EAASkvI,gBAAgBxzC,EAAcj/F,IAEpDuyI,GAAeA,EAAYt5I,OAAS,IACtCgmG,EAAe17F,EAASmvI,sBAAsBzzC,EAAcszC,EAAapvI,IAE3E87F,EAAe17F,EAASovI,cAAc1zC,EAAcuzC,EAAcrvI,EAAUovI,EAAatlH,GAC3E,MAAVh0B,IACFgmG,EAAeA,EAAa1lG,MAAM,EAAGN,IAEhCgmG,CACT,EAEgB17F,EAAA8xD,cAAhB,SACE/3D,EACAqG,EACAR,EACAu1G,GAEA,MAAM7Z,EAAKr7F,EAAIlG,EAAU6F,EAASM,WAClC,GAAiC,MAA7Bi1G,EACF,OAAO4Z,EAAO5Z,GAA2B,EAAlC4Z,CAAwC3uH,EAAQR,EAAU7F,GAC5D,CACL,IAAIskB,EAvgBD,GA+gBH,OAPyB,KAArBi9E,EAAG5kB,cACLr4D,EA1iBR,SAAkBje,EAA6BR,EAAqB8pB,GAClE,OAAOqlG,EAAOp4C,EAAa/2E,EAASS,OAAO,KAAO,GAA3C0uH,CAA+C3uH,EAAQR,EAAU8pB,EAC1E,CAwiBqB2lH,CAASjvI,EAAQR,EAAU7F,GACV,KAArBuhG,EAAG5kB,cACZr4D,EApjBR,SAAkBje,EAA6BR,EAAqB8pB,GAClE,OAAOqlG,EAAOp4C,EAAa/2E,EAASS,OAAO,KAAO,GAA3C0uH,CAA+C3uH,EAAQR,EAAU8pB,EAC1E,CAkjBqB4lH,CAASlvI,EAAQR,EAAU7F,GACV,KAArBuhG,EAAG5kB,gBACZr4D,EAljBR,SAAkBje,EAA6BR,EAAqB8pB,GAClE,OAAOqlG,EAAOp4C,EAAa/2E,EAASS,OAAO,KAAO,GAA3C0uH,CAA+C3uH,EAAQR,EAAU8pB,EAC1E,CAgjBqB6lH,CAASnvI,EAAQR,EAAU7F,IAEnCskB,CACT,CACF,EAEgBre,EAAAitI,qBAAoBA,EAUpBjtI,EAAA+qE,cAAaA,EAUb/qE,EAAAwvI,2BAAhB,SAA2C3oI,EAAqBjH,GAC9D,MAAM07E,EAAU2xD,EAAqBpmI,EAAMjH,GACrC6vI,EAAkB,IAAIjzI,IAC5B,IAAK,MAAM++E,KAAUD,EAAS,CAC5B,MAAMpO,EAAelJ,EAAAqD,OAAOkW,2BAA2BhC,EAAQ37E,GAC/D,IAAK,MAAMwnE,KAAe8F,EACxBuiE,EAAgBzjI,IAAIo7D,EAExB,CACA,OAAOtxE,MAAMP,KAAKk6I,EACpB,EAEgBzvI,EAAA+mE,oBAAhB,SAAoClgE,EAAqBjH,GACvD,MAAM07E,EAAUvQ,EAAclkE,EAAMjH,GAC9B6vI,EAAkB,IAAIjzI,IAC5B,IAAK,MAAM++E,KAAUD,EAAS,CAC5B,MAAMpO,EAAelJ,EAAAqD,OAAOkW,2BAA2BhC,EAAQ37E,GAC/D,IAAK,MAAMwnE,KAAe8F,EACxBuiE,EAAgBzjI,IAAIo7D,EAExB,CACA,OAAOtxE,MAAMP,KAAKk6I,EACpB,EAEgBzvI,EAAAktI,kCAAiCA,EAiBjCltI,EAAAmtI,wBAAuBA,EAIvBntI,EAAAotI,2BAA0BA,EAU1BptI,EAAAgrE,iBAAgBA,EAUhBhrE,EAAA0vI,8BAAhB,SAA8C7oI,EAAqBjH,GACjE,MAAM07E,EAAU6xD,EAAwBtmI,EAAMjH,GACxC6vI,EAAkB,IAAIjzI,IAC5B,IAAK,MAAM++E,KAAUD,EAAS,CAC5B,MAAMpO,EAAelJ,EAAAqD,OAAOkW,2BAA2BhC,EAAQ37E,GAC/D,IAAK,MAAMwnE,KAAe8F,EACxBuiE,EAAgBzjI,IAAIo7D,EAExB,CACA,OAAOtxE,MAAMP,KAAKk6I,EACpB,EAEgBzvI,EAAAmnE,iCAAhB,SACEtgE,EACAjH,GAEA,OAAOwtI,EAA2BvmI,EAAMjH,GAAUtF,OAA+C,CAACC,EAAMqO,KACtG,IAAK,MAAMw+D,KAAepD,EAAAqD,OAAOkW,2BAA2B30E,EAAE2yE,OAAQ37E,IAC3C,MAArBrF,EAAK6sE,IAAwB7sE,EAAK6sE,GAAex+D,EAAE0lC,cACrD/zC,EAAK6sE,GAAex+D,EAAE0lC,YAG1B,OAAO/zC,GACN,GACL,EAEgByF,EAAAinE,uBAAhB,SAAuCpgE,EAAqBjH,GAC1D,MAAM07E,EAAUtQ,EAAiBnkE,EAAMjH,GACjC6vI,EAAkB,IAAIjzI,IAC5B,IAAK,MAAM++E,KAAUD,EAAS,CAC5B,MAAMpO,EAAelJ,EAAAqD,OAAOkW,2BAA2BhC,EAAQ37E,GAC/D,IAAK,MAAMwnE,KAAe8F,EACxBuiE,EAAgBzjI,IAAIo7D,EAExB,CACA,OAAOtxE,MAAMP,KAAKk6I,EACpB,EAEgBzvI,EAAAw5B,MAAhB,SAAsB3yB,GACpB,MAAO,GAAGA,EAAKhN,KAAKgN,EAAK/M,UAAY,IAAI+M,EAAK/M,YAAc,IAC9D,EAEgBkG,EAAA2vI,QAAhB,SAAwB9oI,GACtB,MAAOhN,EAAIC,GAAa+M,EAAKuS,MAAM,KACnC,MAAO,CAAEvf,GAAIA,EAAmBC,UAAWA,EAC7C,EAEgBkG,EAAAusE,iBAAhB,SAAiC1lE,EAAmBW,GAClD,MAeM2yB,EADW2yG,EAAQjmI,EAAMW,GACV+kE,kBAAoB,aACnC88C,EAAkB0iB,EAAYllI,GAAMwiH,iBAAmB,GAC7D,IAAIvvH,EAAoCuvH,EAAgB/8F,KAAMtwB,GAAMA,IAAMm+B,GAG1E,OAFArgC,EAAYA,IAlByC,CACnDuzE,QAAS,CAAC,QAAS,UAAW,WAAY,cAC1CC,MAAO,CAAC,OAAQ,mBAChBC,SAAU,CAAC,UAAW,aAAc,cACpCC,MAAO,CAAC,kBAAmB,WAAY,UAAW,aAAc,SAChEC,KAAM,CAAC,QAAS,aAAc,kBAAmB,SACjDC,WAAY,CAAC,WAAY,UAAW,SACpCC,WAAY,CAAC,QAAS,WAAY,UAAW,QAC7CC,gBAAiB,CAAC,QAAS,QAAS,WAAY,UAAW,cAC3DC,aAAc,CAAC,aAAc,SAC7BC,MAAO,CAAC,UAAW,WAAY,SAC/BC,QAAS,CAAC,UAAW,WAAY,UAOE5zC,IAAQ,IAAI7N,KAAMsjH,IAA0C,IAAlCvmB,EAAgBh9G,QAAQujI,IACvF91I,EAAYA,GAAauvH,EAAgB,GAClCvvH,CACT,EAEgBkG,EAAAqtI,cAAaA,EA8CbrtI,EAAA6vI,QAAhB,SAAwBhpI,EAAqBjH,GAC3C,MAAM0tI,EAAKttI,EAAS+qE,cAAclkE,EAAMjH,GAClC+7E,EAAK37E,EAASgrE,iBAAiBnkE,EAAMjH,GAC3C,GAAkB,IAAd0tI,EAAG53I,QAA8B,IAAdimF,EAAGjmF,OACxB,MAAO,GAET,MAAMo6I,EAAQ9vI,EAAS8wF,IAAIlxF,EAASM,WAAWhG,IAA0B7B,GAEhE,CAACA,EADOg1I,EAAcxmI,EAAMxO,EAAGuH,KAIxC,OADAkwI,EAAMz1I,KAAK,CAAClC,EAAG6D,IAAMA,EAAE,GAAK7D,EAAE,IACvB23I,EAAMrzI,OAAO,EAAE,CAAE4f,KAAOA,EAAI,EACrC,EAEgBrc,EAAA+vI,qBAAhB,SAAqCx0D,EAAuB37E,GAC1D,MAAM07E,EAAUtX,EAAAqD,OAAO4W,2BAA2B1C,EAAQ37E,GAEpDkwI,EAAQ9vI,EAAS8wF,IAAIlxF,EAASM,WAAWhG,IAA0B7B,IACvE,IAAIo1I,EAAS,EACb,MAAMH,EAAKttI,EAAS+qE,cAAc1yE,EAAGuH,GAC/B+7E,EAAK37E,EAASgrE,iBAAiB3yE,EAAGuH,GACxC,IAAK,MAAMgJ,KAAK0kI,GACc,IAAxBhyD,EAAQjvE,QAAQzD,KAClB6kI,GAAU,KAGd,IAAK,MAAM7kI,KAAK+yE,GACc,IAAxBL,EAAQjvE,QAAQzD,KAClB6kI,GAAU,IAGd,MAAO,CAACp1I,EAAGo1I,KAGb,OADAqC,EAAMz1I,KAAK,CAAClC,EAAG6D,IAAMA,EAAE,GAAK7D,EAAE,IACvB23I,EAAMrzI,OAAO,EAAE,CAAE4f,KAAOA,EAAI,EACrC,EAEgBrc,EAAAgwI,qBAAhB,SACEtvI,EACAuvI,EACAC,EACAxvD,EACA5tC,EACAC,EACAj5C,GAEA,MAAMD,EAAK8P,EAAAsB,WAAWC,YAAY,GAC5B6gB,EAAsC,GAC3B,MAAbjyB,IACFiyB,EAAUjyB,UAAYA,GAEH,MAAjBg5C,IACF/mB,EAAU+mB,cAAgBA,GAEP,MAAjBC,IACFhnB,EAAUgnB,cAAgBA,GAExB2tC,EAAMhrF,OAAS,IACjBq2B,EAAU20D,MAAQA,GAEpB,MAAM9mC,EAA+B,CACnCuY,MAAO,kBACPt4D,KACA6G,OACAgpH,WAAW,EACXxyG,KAAM,CACJ6zD,cAAeklE,EACfjlE,iBAAkBklE,EAClB9mB,UAAW,GACXC,gBAAiB,IAEnBl4D,WAAY,CAACplC,IAKf,OAHiB,MAAbjyB,IACF8/C,EAAY2yB,iBAAmBzyE,GAE1B8/C,CACT,EAEgB55C,EAAAmwI,qBAAhB,SACEz0C,EACAnmF,GAEA,MAAM66H,EAAmB10C,EAAanmF,GACtC,OAAI66H,EACFj6I,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYu9F,GAAY,CAAEnmF,CAACA,GAAWpf,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAOiyI,GAAgB,CAAE1mB,WAAW,MAErEhuB,CACT,EAEgB17F,EAAAqwI,qBAAhB,SACE30C,EACA3hG,GAGA,MAAMq2I,EAAmB10C,GADzB3hG,EAAQ5D,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAQpE,GAAQ,CAAE2G,KAAM3G,EAAS2G,KAAK6Y,UACC1f,IAC/C,GAAIu2I,EAAkB,CACpB,MAAMl6G,EAAOn8B,EAASo3D,WAAa,GAAKi/E,EACxC,OAAAj6I,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYu9F,GAAY,CAAE,CAAC3hG,EAASF,IAAG1D,OAAAgI,OAAAhI,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAO+3B,GAASn8B,GAAQ,CAAE2vH,WAAW,KAC9E,CAAO,CACL,MAAM4mB,EAA0BjyI,EAAAwC,YAAYD,OAAO86F,GAAcpvE,KAC9Dj0B,IAAMA,aAAC,EAADA,EAAGqI,QAAS3G,EAAS2G,MAAQrI,EAAEqxH,WAExC,OAAI4mB,EACFn6I,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKu9F,GAAY,CACf,CAAC40C,EAAwBz2I,IAAG1D,OAAAgI,OAAAhI,OAAAgI,OAAAhI,OAAAgI,OAAA,GACtBpE,EAASo3D,WAAa,GAAKm/E,GAC5Bv2I,GAAQ,CACXF,GAAIy2I,EAAwBz2I,GAC5B6vH,WAAW,MAIfvzH,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYu9F,GAAY,CAAE,CAAC3hG,EAASF,IAAKE,GAE7C,CACF,EAEgBiG,EAAAuwI,2BAAhB,SACE5zG,EACA8B,EACA1kC,EACA6F,EACArC,GAEA,MAAMwC,EAAcH,EAASM,UAAUnG,EAASF,IAC1CyhG,EACO,WAAX78D,EACIz+B,EAASqwI,qBAAqBzwI,EAASM,UAAWnG,GAClDiG,EAASmwI,qBAAqBvwI,EAASM,UAAWnG,EAASF,IAEjE,IADA,EAAAuhC,EAAAmM,gBAAe5K,GAAU,EAAAxB,EAAA+B,MAAgB19B,EAAE,aAAa3C,OAAOy+F,GAAK,0BAChE/9F,GAAWwC,GAAeA,EAAYW,OAAS3G,EAAS2G,KAAM,CAChE,MAAM8pC,EAAa3hB,EAAAta,QAAQ6zD,mBAAmBriE,EAAYW,KAAM3G,EAAS2G,KAAMnD,EAAOpH,OAAAgI,OAAAhI,OAAAgI,OAAA,GACjFyB,GAAQ,CACXM,UAAWo7F,KAEbn/D,EAAAkN,YAAYmnG,cAAc7zG,EAAU6N,EACtC,CACF,EAEgBxqC,EAAAywI,mBAAhB,SACE/0C,EACAg1C,EACAnzI,EACAqC,GAGA,MAAMgvI,EAAU8B,EAAQhwI,KAAK6Y,OACZlb,EAAAwC,YAAYD,OAAO86F,GAAc/jG,KAAMU,IAAMA,aAAC,EAADA,EAAGqI,QAASkuI,GAAWv2I,EAAEqxH,aAErFgnB,EAAUzQ,EAAA3F,WAAWO,OAAO6V,EAASh1C,IAEvC,MAAM37F,EAAc27F,EAAag1C,EAAQ72I,IACnCqG,EAAYF,EAASqwI,qBAAqB30C,EAAcg1C,GACxDC,EAAcD,EAAQhwI,KAAK6Y,OACjC,OAAIxZ,GAAeA,EAAYW,OAASiwI,EAK/B,CAAEzwI,YAAWsqC,WAJD3hB,EAAAta,QAAQ6zD,mBAAmBriE,EAAYW,KAAMiwI,EAAapzI,EAAOpH,OAAAgI,OAAAhI,OAAAgI,OAAA,GAC/EyB,GAAQ,CACXM,gBAIG,CAAEA,YACX,EAEgBF,EAAAkvI,gBAAhB,SAA4DxzC,EAAmBj/F,GAC7E,OAAOi/F,EAAaj/F,OAAQpE,GAAMuR,EAAAmB,YAAYsjI,YAAY5xI,EAAO0O,cAAe9S,EAAEqI,KAAKyK,eACzF,EAEgBnL,EAAAovI,cAAhB,SACE1zC,EACAuzC,EACArvI,EACAovI,EACA4B,GAEA,OAAO5vI,EAAAC,gBAAgB5G,KAAKqhG,EAAc,CAACvjG,EAAG6D,KAC5C,MAAM0tB,EAAeknH,EACrB,GAAI3B,GAAgBvlH,EAAc,CAChC,MAAMmnH,EAAU7wI,EAASqtI,cAAc3jH,EAAcvxB,EAAGyH,GAExD,OADgBI,EAASqtI,cAAc3jH,EAAc1tB,EAAG4D,GACvCixI,CACnB,CAAO,GACL7B,GACAhrE,EAAAqD,OAAOC,yBAAyB1nE,GAC7B1F,IAAK0O,GAAMA,EAAEuC,eACbxT,KAAMwkB,IAAgE,IAA1D6yH,EAAY90I,IAAK42I,GAAOA,EAAG3lI,eAAekB,QAAQ8P,IACjE,CACA,MAAM40H,EAAuB/B,EAAY90I,IAAKiiB,GAAMA,EAAEhR,eAChD6lI,EAAsBhxI,EAAS+mE,oBAAoB5uE,EAAGyH,GACtDqxI,EAAsBjxI,EAAS+mE,oBAAoB/qE,EAAG4D,GAC5D,OACEoxI,EAAoBr5I,KAAMiR,IAA2C,IAArCmoI,EAAqB1kI,QAAQzD,KAC7DqoI,EAAoB9zI,MAAOyL,IAA2C,IAArCmoI,EAAqB1kI,QAAQzD,KAEtD,EAERqoI,EAAoBt5I,KAAMiR,IAA2C,IAArCmoI,EAAqB1kI,QAAQzD,KAC7DooI,EAAoB7zI,MAAOyL,IAA2C,IAArCmoI,EAAqB1kI,QAAQzD,IAEvD,EAEAzQ,EAAEuI,KAAKwwI,cAAcl1I,EAAE0E,KAElC,CACE,OAAOvI,EAAEuI,KAAKwwI,cAAcl1I,EAAE0E,OAGpC,EAEgBV,EAAAmvI,sBAAhB,SACEzzC,EACAszC,EACApvI,GAEA,OAAO87F,EAAaj/F,OAAQpE,IAC1B,MAAM0B,EAAWkG,EAAI5H,EAAGuH,EAASM,WAC3B4mE,EAAqB9mE,EAAS+mE,oBAAoB1uE,EAAGuH,GAAU1F,IAAK0O,GAAMA,EAAEuC,eAC5E67D,EAAwBhnE,EAASinE,uBAAuB5uE,EAAGuH,GAAU1F,IAAK0O,GAAMA,EAAEuC,eACxF,OAAO6jI,EACJ90I,IAAK42I,GAAOA,EAAG3lI,eACfhO,MAAO2zI,IAEgC,IAApChqE,EAAmBz6D,QAAQykI,KACY,IAAvC9pE,EAAsB36D,QAAQykI,KAC8B,IAA5D/2I,EAAS2mF,MAAMxmF,IAAKiiB,GAAMA,EAAEhR,eAAekB,QAAQykI,IACnDxuE,EAAcjqE,EAAEyB,WAAWqR,gBAAkB2lI,IAIvD,EAEgB9wI,EAAAmxI,sBAAhB,SAAsC3pI,EAAsC/K,GAC1E,OAAO4B,EAAAwC,YAAYpE,OAAO+K,EAAiB,CAACnP,EAAGuG,KAC7CA,GAAIgL,EAAAmB,YAAYsjI,YAAY5xI,EAAO0O,cAAevM,EAAE8B,KAAKyK,eAE7D,EAEgBnL,EAAAoxI,4BAAhB,SAA4CpC,EAAuBpvI,GACjE,OAAOvB,EAAAwC,YAAYpE,OAAOmD,EAASM,UAAW,CAACk+F,EAAKrkG,WAClD,IAAKA,EACH,OAAO,EAET,MAAMgyB,EAAYumB,EAAAM,wBAAwBijF,iBAAiB97H,GACrDmd,EAAqB,QAAdpb,EAAAiwB,EAAU7U,YAAI,IAAApb,EAAAA,EAAI/B,EAASmd,KAClC4vD,EAAqBhxE,MAAMP,KAC/B,IAAIiH,IAAIwE,EAAAC,gBAAgBkgE,KAAKjqD,EAAK6zD,cAAc7wE,IAAK0O,GAAMo7D,EAAAqD,OAAOkW,2BAA2B30E,EAAGhJ,OAChG1F,IAAK0O,GAAMgB,EAAAmB,YAAY2yE,WAAW90E,IAC9Bo+D,EAAwBlxE,MAAMP,KAClC,IAAIiH,IAAIwE,EAAAC,gBAAgBkgE,KAAKjqD,EAAK8zD,iBAAiB9wE,IAAK0O,GAAMo7D,EAAAqD,OAAOkW,2BAA2B30E,EAAGhJ,OACnG1F,IAAK0O,GAAMgB,EAAAmB,YAAY2yE,WAAW90E,IACpC,OAAOomI,EAAY7xI,MAAO2zI,IAEc,IAApChqE,EAAmBz6D,QAAQykI,KACY,IAAvC9pE,EAAsB36D,QAAQykI,KACuC,KAApE/kH,EAAU20D,OAAS,IAAIxmF,IAAI0P,EAAAmB,YAAY2yE,YAAYrxE,QAAQykI,KAIpE,CACD,CA97BD,CAAiB9wI,IAAQ3J,EAAA2J,SAARA,EAAQ,2FC9gHzB3J,EAAAo1B,GAAA,MACS,eAAOC,CACZitB,EACAt0C,GAQA,IAAIsoB,EAAW,EACf,IAAK,IAAIC,EAAY,EAAGA,EAAY+rB,EAAejjD,OAAQk3B,IAAa,CACtE,MAAMH,EAAOksB,EAAe/rB,GAC5B,IAAK,IAAIE,EAAiB,EAAGA,EAAiBL,EAAKM,KAAKr3B,OAAQo3B,IAAkB,CAChF,MAAMJ,EAAMD,EAAKM,KAAKD,GACtB,IAAK,IAAIqrB,EAAgB,EAAGA,EAAgBzrB,EAAIxsB,UAAUxK,OAAQyiD,IAGhE,GADqB9zC,EADJqoB,EAAIxsB,UAAUi4C,GACGvrB,EAAWE,EAAgBH,EAAUwrB,GAErE,OAGJxrB,GAAY,CACd,CACF,CACF,CAEO,cAAO6lD,CACZ75B,EACAt0C,GAQA,IAAIsoB,EAAW,EACf,IAAK,IAAIC,EAAY,EAAGA,EAAY+rB,EAAejjD,OAAQk3B,IAAa,CACtE,MAAMH,EAAOksB,EAAe/rB,GAC5B,IAAK,IAAIE,EAAiB,EAAGA,EAAiBL,EAAK/2B,OAAQo3B,IAAkB,CAC3E,MAAMJ,EAAMD,EAAKK,GACjB,GAAIJ,EAAI5lB,QACN,IAAK,IAAIqxC,EAAgB,EAAGA,EAAgBzrB,EAAIxnB,KAAKxP,OAAQyiD,IAG3D,GADqB9zC,EADJqoB,EAAIxnB,KAAKizC,GACQvrB,EAAWE,EAAgBH,EAAUwrB,GAErE,OAINxrB,GAAY,CACd,CACF,CACF,2YCpDFt2B,EAAAolI,gBAAAA,EAWAplI,EAAA0xD,cAAA,SACEziD,EACAmS,EACA45H,2CAEA,MAAMC,EAAc7V,EAAgBhkH,EAAS45H,GAC7C,IAAInzI,EAASq9B,EAAAqC,QAAQ0nE,wBAAwB7tF,GAC7C,IAAK,MAAM7J,KAAW0jI,EACpB,IACEpzI,QAAe0Q,EAAAm9D,WAAWn+D,GAAStI,EAAQpH,EAC7C,CAAE,MAAOgO,GACP,MAAM7T,EAAI6T,EACV+vB,EAAAmB,cAAc7zB,OAAO,2BAA2BqE,MAAYvV,IAAKA,EACnE,CAGF,OADA6F,EAAM/H,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAQD,GAAM,CAAE0P,SAAS,EAAAgB,EAAAiI,+BACxB3Y,CACT,IAlCA,MAAA0Q,EAAA5W,EAAA,OACAqG,EAAArG,EAAA,OAEAujC,EAAAvjC,EAAA,OACAikC,EAAAjkC,EAAA,OAEA,SAAgByjI,EAAgBhkH,EAA8B45H,GAC5D,MAAME,EAAoC,MAAnB95H,EAAQ7J,QAAkBysD,SAAS5iD,EAAQ7J,QAAQrS,WAAY,IAAM,EACtFnB,EAAOiE,EAAAwC,YAAYzG,KAAKwU,EAAAm9D,YAC9B3xE,EAAKC,KAAK,CAAClC,EAAG6D,IAAMq+D,SAASliE,EAAG,IAAMkiE,SAASr+D,EAAG,KAClD,MAAMw1I,EAA8B,MAAdH,EAAqBh3E,SAASg3E,EAAY,SAAMjuI,EACtE,OAAOhJ,EAAKqC,OAAQg1I,IAClB,MAAM7jI,EAAUysD,SAASo3E,EAAY,IACrC,OAAO7jI,EAAU2jI,IAAoC,MAAjBC,GAAwB5jI,GAAW4jI,IAE3E,6BCdA,IACA//C,EADAC,EAAAr8F,MAAAA,KAAAq8F,YACAD,EAAA,SAAA1jE,EAAA/xB,GAIA,OAHAy1F,EAAAt7F,OAAAw7F,gBACA,CAAenkF,UAAA,cAAgB1X,OAAA,SAAAi4B,EAAA/xB,GAAsC+xB,EAAAvgB,UAAAxR,CAAA,GACrE,SAAA+xB,EAAA/xB,GAA8B,QAAAwD,KAAAxD,EAAA7F,OAAAJ,UAAAwC,eAAAtC,KAAA+F,EAAAwD,KAAAuuB,EAAAvuB,GAAAxD,EAAAwD,GAAA,EAC9BiyF,EAAA1jE,EAAA/xB,EACA,EACA,SAAA+xB,EAAA/xB,GAEA,SAAA0gB,IAAwBrnB,KAAAyZ,YAAAif,CAAA,CADxB0jE,EAAA1jE,EAAA/xB,GAEA+xB,EAAAh4B,UAAA,OAAAiG,EAAA7F,OAAAugD,OAAA16C,IAAA0gB,EAAA3mB,UAAAiG,EAAAjG,UAAA,IAAA2mB,EACA,GAEAk1E,EAAAv8F,MAAAA,KAAAu8F,UAAA,WASA,OARAA,EAAAz7F,OAAAgI,QAAA,SAAAge,GACA,QAAAwB,EAAA/nB,EAAA,EAAAwmB,EAAA3mB,UAAAC,OAAiDE,EAAAwmB,EAAOxmB,IAExD,QAAA4J,KADAme,EAAAloB,UAAAG,GACAO,OAAAJ,UAAAwC,eAAAtC,KAAA0nB,EAAAne,KACA2c,EAAA3c,GAAAme,EAAAne,IAEA,OAAA2c,CACA,EACAy1E,EAAA/4F,MAAAxD,KAAAI,UACA,EACAi8I,EAAAr8I,MAAAA,KAAAq8I,gBAAA,WACA,QAAA/zH,EAAA,EAAA/nB,EAAA,EAAA+7I,EAAAl8I,UAAAC,OAAkDE,EAAA+7I,EAAQ/7I,IAAA+nB,GAAAloB,UAAAG,GAAAF,OAC1D,IAAA2mB,EAAAvmB,MAAA6nB,GAAA1a,EAAA,MAAArN,EAAA,EAAyCA,EAAA+7I,EAAQ/7I,IACjD,QAAAuC,EAAA1C,UAAAG,GAAAg7B,EAAA,EAAAghH,EAAAz5I,EAAAzC,OAAyDk7B,EAAAghH,EAAQhhH,IAAA3tB,IACjEoZ,EAAApZ,GAAA9K,EAAAy4B,GACA,OAAAvU,CACA,EACAlmB,OAAAC,eAAAC,EAAA,cAA+CC,OAAA,IAC/CD,EAAAw7I,KAAex7I,EAAAo+G,GAAap+G,EAAAs1E,IAAct1E,EAAA6mC,GAAa7mC,EAAAy7I,YAAsBz7I,EAAA07I,sBAAgC17I,EAAA27I,eAAiB,EAC9H,IAAA3zI,EAAerG,EAAQ,OACvBg6I,EAAA,SAAAv8C,GAEA,SAAAu8C,EAAAppI,EAAAqpI,EAAAprI,EAAAoD,EAAA3T,GACA,IAAAu7F,EAAA4D,EAAAx/F,KAAAZ,KAAAuT,IAAAvT,KAOA,OANAw8F,EAAAogD,KAAAA,EACApgD,EAAAhrF,KAAAA,EACAgrF,EAAA5nF,IAAAA,EACA4nF,EAAAv7F,MAAAA,EAEAH,OAAAw7F,eAAAE,EAAAmgD,EAAAj8I,WACA87F,CACA,CACA,OAXAH,EAAAsgD,EAAAv8C,GAWAu8C,CACA,CAbA,CAaC7hI,OACD9Z,EAAA27I,UAAiBA,EACjB,IAAAE,EAAA,WACA,SAAAA,EAAAD,GACA58I,KAAA48I,KAAAA,CACA,CAIA,OAHAC,EAAAn8I,UAAAkK,IAAA,WACA,OAAA5K,KAAA48I,IACA,EACAC,CACA,CARA,GASAH,EAAA,SAAAt8C,GAEA,SAAAs8C,EAAAE,EAAAz2D,GACA,IAAAqW,EAAA4D,EAAAx/F,KAAAZ,KAAA48I,IAAA58I,KAEA,OADAw8F,EAAArW,IAAAA,EACAqW,CACA,CAwDA,OA7DAH,EAAAqgD,EAAAt8C,GAMAs8C,EAAAnyD,MAAA,SAAAuyD,EAAA32D,GACA,OACAh8E,EAAA,SAAAhF,GACA,WAAAu3I,EAAAI,EAAA33I,GAAAghF,EACA,EACAj8E,GAAA,SAAA/E,GACA,WAAAu3I,EAAAI,EAAA33I,GAAAghF,EACA,EACA5lF,EAAA,SAAA+Q,GAEA,WAAAorI,EAAAI,EAAAxrI,GAAA60E,EACA,EACAlvD,KAAA,SAAAjoB,GAEA,WAAA0tI,EAAAI,EAAA9tI,GAAAm3E,EACA,EACAnM,OAAA,SAAA70E,EAAAlE,EAAA87I,GAEA,WAAAL,EAAAI,EAAA33I,EAAAlE,EAAA87I,GAAA52D,EACA,EACAv7E,IAAA,WACA,WAAA4xI,EAAA,SAAAl0H,GAA+C,OAAAA,CAAA,EAAW,SAAAA,EAAA/e,GAAoB,OAAAA,CAAA,EAAW,CAAIrJ,KAAA,MAAAD,GAAA,OAC7F,EACAuH,OAAA,SAAAvG,EAAAoK,GACA,OAAAmxI,EAAAQ,mBAAA,IAAAR,EAAA,SAAAl0H,GAAuE,OAAAA,CAAA,EAAW,SAAAA,EAAA/e,GAAoB,OAAAA,CAAA,EAAW,CAAIrJ,KAAA,MAAAD,GAAA,QAAwBgB,EAAAoK,EAC7I,EACAjB,aAAA,SAAAy0B,EAAAxzB,GACA,OAAAmxI,EAAAS,yBAAA,IAAAT,EAAA,SAAAl0H,GAA6E,OAAAA,CAAA,EAAW,SAAAA,EAAA/e,GAAoB,OAAAA,CAAA,EAAW,CAAIrJ,KAAA,MAAAD,GAAA,QAAwB4+B,EAAA,GAASxzB,EAC5J,EAEA,EACAqxI,EAAAh8I,UAAAyJ,EAAA,SAAAhF,GACA,WAAAu3I,EAAA18I,KAAA48I,KAAA7hH,KAAAyhH,EAAAvoD,MAAAuoD,CAAAr3I,IAAAnF,KAAAmmF,IACA,EACAu2D,EAAAh8I,UAAAwJ,GAAA,SAAA/E,GACA,WAAAu3I,EAAA18I,KAAA48I,KAAA7hH,KAAAyhH,EAAAvoD,MAAAuoD,CAAAr3I,IAAAnF,KAAAmmF,IACA,EACAu2D,EAAAh8I,UAAAH,EAAA,SAAA+Q,GAEA,WAAAorI,EAAA18I,KAAA48I,KAAA7hH,KAAAyhH,EAAAlrI,OAAAkrI,CAAAlrI,IAAAtR,KAAAmmF,IACA,EACAu2D,EAAAh8I,UAAAu2B,KAAA,SAAAjoB,GAEA,WAAA0tI,EAAA18I,KAAA48I,KAAA7hH,KAAAyhH,EAAAvlH,MAAAulH,CAAAxtI,IAAAhP,KAAAmmF,IACA,EACAu2D,EAAAh8I,UAAAs5E,OAAA,SAAA70E,EAAAlE,EAAA87I,GAEA,WAAAL,EAAA18I,KAAA48I,KAAA7hH,KAAAyhH,EAAAxiE,QAAAwiE,CAAAr3I,EAAAlE,EAAA87I,IAAA/8I,KAAAmmF,IACA,EACAu2D,EAAAh8I,UAAAqL,IAAA,SAAA9K,GACA,OAAAjB,KAAA48I,KAAA7wI,IAAA/L,KAAAmmF,IAAAllF,EACA,EACAy7I,EAAAh8I,UAAA2+G,OAAA,SAAAxgF,GACA,OAAA7+B,KAAA48I,KAAAv9B,OAAAr/G,KAAAmmF,IAAAtnD,EACA,EACA69G,CACA,CA/DA,CA+DCG,GACD77I,EAAA07I,sBAA6BA,EAC7B,IAAAD,EAAA,SAAAr8C,GAEA,SAAAq8C,EAAAG,EAAAvmE,GACA,IAAAmmB,EAAA4D,EAAAx/F,KAAAZ,KAAA48I,IAAA58I,KAEA,OADAw8F,EAAAnmB,YAAAA,EACAmmB,CACA,CA+DA,OApEAH,EAAAogD,EAAAr8C,GAMAq8C,EAAAlyD,MAAA,SAAAuyD,EAAAzmE,GACA,IAAAmmB,EAAAx8F,KACA,OACAmK,EAAA,SAAAhF,GACA,WAAAs3I,EAAAK,EAAA33I,GAAAkxE,EACA,EACAnsE,GAAA,SAAA/E,GACA,WAAAs3I,EAAAK,EAAA33I,GAAAkxE,EACA,EACA91E,EAAA,SAAA+Q,GAEA,WAAAmrI,EAAAK,EAAAxrI,GAAA+kE,EACA,EACAp/C,KAAA,SAAAjoB,GAEA,WAAAytI,EAAAK,EAAA9tI,GAAAwtF,EAAAnmB,YACA,EACA2D,OAAA,SAAA70E,EAAAlE,EAAA87I,GAEA,WAAAN,EAAAK,EAAA33I,EAAAlE,EAAA87I,GAAAvgD,EAAAnmB,YACA,EACAzrE,IAAA,WACA,WAAA4xI,EAAA,SAAAl0H,GAA+C,OAAAA,CAAA,EAAW,SAAAA,EAAA/e,GAAoB,OAAAA,CAAA,EAAW,CAAIrJ,KAAA,MAAAD,GAAA,OAC7F,EACAuH,OAAA,SAAAvG,EAAAoK,GACA,OAAAmxI,EAAAQ,mBAAA,IAAAR,EAAA,SAAAl0H,GAAuE,OAAAA,CAAA,EAAW,SAAAA,EAAA/e,GAAoB,OAAAA,CAAA,EAAW,CAAIrJ,KAAA,MAAAD,GAAA,QAAwBgB,EAAAoK,EAC7I,EACAjB,aAAA,SAAAy0B,EAAAxzB,GACA,OAAAmxI,EAAAS,yBAAA,IAAAT,EAAA,SAAAl0H,GAA6E,OAAAA,CAAA,EAAW,SAAAA,EAAA/e,GAAoB,OAAAA,CAAA,EAAW,CAAIrJ,KAAA,MAAAD,GAAA,QAAwB4+B,EAAA,GAASxzB,EAC5J,EAEA,EACAoxI,EAAA/7I,UAAAyJ,EAAA,SAAAhF,GACA,WAAAs3I,EAAAz8I,KAAA48I,KAAA7hH,KAAAyhH,EAAAvoD,MAAAuoD,CAAAr3I,IAAAnF,KAAAq2E,YACA,EACAomE,EAAA/7I,UAAAH,EAAA,SAAA+Q,GAEA,WAAAmrI,EAAAz8I,KAAA48I,KAAA7hH,KAAAyhH,EAAAlrI,OAAAkrI,CAAAlrI,IAAAtR,KAAAq2E,YACA,EACAomE,EAAA/7I,UAAAwJ,GAAA,SAAA/E,GACA,WAAAs3I,EAAAz8I,KAAA48I,KAAA7hH,KAAAyhH,EAAAvoD,MAAAuoD,CAAAr3I,IAAAnF,KAAAq2E,YACA,EACAomE,EAAA/7I,UAAAu2B,KAAA,SAAAjoB,GAEA,WAAAytI,EAAAz8I,KAAA48I,KAAA7hH,KAAAyhH,EAAAvlH,MAAAulH,CAAAxtI,IAAAhP,KAAAq2E,YACA,EACAomE,EAAA/7I,UAAAs5E,OAAA,SAAA70E,EAAAlE,EAAA87I,GAEA,WAAAN,EAAAz8I,KAAA48I,KAAA7hH,KAAAyhH,EAAAxiE,QAAAwiE,CAAAr3I,EAAAlE,EAAA87I,IAAA/8I,KAAAq2E,YACA,EACAomE,EAAA/7I,UAAAqL,IAAA,SAAAo6E,EAAAllF,GACA,OAAAjB,KAAA48I,KAAA7wI,IAAAo6E,EAAAllF,EACA,EACAw7I,EAAA/7I,UAAA2+G,OAAA,SAAAl5B,EAAAtnD,GACA,OAAA7+B,KAAA48I,KAAAv9B,OAAAl5B,EAAAtnD,EACA,EACA49G,EAAA/7I,UAAA8G,OAAA,SAAAvG,EAAAoK,GACA,OAAAmxI,EAAAQ,mBAAAh9I,KAAA48I,KAAA37I,EAAAoK,EACA,EACAoxI,EAAA/7I,UAAA0J,aAAA,SAAAy0B,EAAAxzB,GACA,OAAAmxI,EAAAS,yBAAAj9I,KAAA48I,KAAA/9G,EAAA7+B,KAAAq2E,YAAAhrE,EACA,EACAoxI,CACA,CAtEA,CAsECI,GACD77I,EAAAy7I,YAAmBA,EAInBz7I,EAAA6mC,GAHA,WACA,OAAA20G,EAAA3yI,MAAA,GACA,EAKA7I,EAAAs1E,IAHA,SAAAsmE,GACA,OAAAJ,EAAA3yI,MAAA+yI,EACA,EAKA57I,EAAAo+G,GAHA,SAAAj5B,GACA,OAAAq2D,EAAAt8I,KAAAimF,EACA,EAEA,IAAAq2D,EAAA,WACA,SAAAA,EAAAU,EAAAC,EAAAhsI,GACA,IAAAqrF,EAAAx8F,KACAA,KAAA4K,IAAA,SAAAu7E,GACA,IACA,OAAA+2D,EAAA/2D,EACA,CACA,MAAAnjF,GACA,IAAAo6I,EAAAp6I,aAAA25I,EAAA35I,EAAA4R,IAAA5R,EACA,UAAA25I,EAAA,iCAAAxrI,EAAAjR,KAAA,OAAAiR,EAAAlR,GAAA,KAAAm9I,EAAAzrI,QAAA,IAAA6qF,EAAA,MAAA4gD,EACA,CACA,EACAp9I,KAAA+L,IAAA,SAAAo6E,EAAAllF,GACA,IACA,OAAAk8I,EAAAh3D,EAAAllF,EACA,CACA,MAAA+B,GACA,IAAAo6I,EAAAp6I,aAAA25I,EAAA35I,EAAA4R,IAAA5R,EACA,UAAA25I,EAAA,iCAAAxrI,EAAAjR,KAAA,OAAAiR,EAAAlR,GAAA,MAAAgB,EAAA,KAAAm8I,EAAAzrI,QAAA,IAAA6qF,EAAA,MAAA4gD,EAAAn8I,EACA,CACA,EACAjB,KAAAE,KAAAO,MAAAmE,QAAAuM,EAAAjR,MAAAiR,EAAAjR,KAAA,CAAAiR,EAAAjR,MACAF,KAAAC,GAAAkR,EAAAlR,EACA,CAkLA,OAjLAu8I,EAAAS,yBAAA,SAAAI,EAAAC,EAAAjnE,EAAAhrE,GACA,IAAAmxF,EAAAx8F,KACA48I,EAAAS,aAAAb,EAAAa,EAAAA,EAAAzyI,MACA3J,EAAA,CAAsBsI,OAAAwE,GACtB8wB,EAAA,SAAAsnD,GACA,IAAA5P,EAAAvtE,EAAAwC,YAAAzG,KAAAsxE,GAAApxE,OAAA,SAAAC,EAAAC,GAGA,OADAD,EAAAC,GAAAkxE,EAAAlxE,GAAAyF,IAAAu7E,GACAjhF,CACA,EAAa,IACb,OAAA03I,EAAAv9B,OAAAl5B,EAAA,SAAA58E,GACA,IAAAD,EAAAg0I,EAAA/zI,EAAAgtE,GAEA,OADAt1E,EAAAsI,EAAAD,EACAA,CACA,EACA,EAiBA,OAfAu1B,EAAA34B,SAAA,WACA,OAAA02I,EAAA12I,WAAA,aACA,EAaA,CACA24B,GAAAA,EACAiY,IAAAjY,EAAA34B,WACA02I,KAAAA,EACAvmE,YAAAA,EACAp1E,MAAAA,EACA4nC,IAlBA,SAAA00G,GACA,QAAAj6I,EAAA,EAAAmD,EAAA3F,OAAAiE,KAAAsxE,GAA4D/yE,EAAAmD,EAAApG,OAAgBiD,IAAA,CAC5E,IAAAmJ,EAAAhG,EAAAnD,GACA9C,EAAA61E,EAAA5pE,GACA+wI,EAAAnB,EAAA,CAAAkB,GAAA/8I,EAAAN,KAAAS,MAAA,IAAAH,EAAAP,KAAAuO,KAAA,QACA2V,QAAA0kB,IAAA,WAAA20G,EACA,CACA,MAAAnyI,GACA8Y,QAAA0kB,IAAAx9B,EAAA,MAEA8Y,QAAA0kB,IAAAwzG,EAAA,CAAAkB,GAAAX,EAAA18I,KAAAS,MAAA,IAAAi8I,EAAA38I,KAAAuO,KAAA,uBACA,EAQAgD,KAAA,SACAisI,QAAA,SAAAC,GACA,IAAAC,EAAAD,aAAAlB,EAAAkB,EAAAA,EAAA9yI,MACAgzI,EAAAD,EAAA5iH,KAAA6hH,GACAiB,EAAA70I,EAAAwC,YAAAzG,KAAAsxE,GAAApxE,OAAA,SAAAC,EAAAC,GACA,IAAA24I,EAAAH,EAAA5iH,KAAAs7C,EAAAlxE,IAEA,OADAD,EAAAC,GAAA24I,EACA54I,CACA,EAAiB,IACjB,OAAAs3F,EAAAygD,yBAAAW,EAAAN,EAAAO,EAAAxyI,EACA,EAEA,EACAmxI,EAAAQ,mBAAA,SAAAK,EAAAp8I,EAAAoK,GACA,IAAAmxF,EAAAx8F,KACA48I,EAAAS,aAAAb,EAAAa,EAAAA,EAAAzyI,MACAi0B,EAAA,SAAAsnD,GACA,OAAAy2D,EAAA7wI,IAAAo6E,EAAAllF,EACA,EAWA,OATA49B,EAAA34B,SAAA,WACA,OAAA02I,EAAA12I,WAAA,MAAAjF,CACA,EAOA,CACA49B,GAAAA,EACAiY,IAAAjY,EAAA34B,WACA02I,KAAAA,EACA37I,MAAA,CAAqBsI,EAAAtI,GACrB4nC,IAXA,SAAA00G,GACA,MAAAlyI,GACA8Y,QAAA0kB,IAAAx9B,EAAA,MAEA8Y,QAAA0kB,IAAAwzG,EAAA,CAAAkB,GAAAX,EAAA18I,KAAAS,MAAA,IAAAi8I,EAAA38I,KAAAuO,KAAA,YAAAvN,EACA,EAOAuQ,KAAA,MACAisI,QAAA,SAAAC,GACA,IACAE,GADAF,aAAAlB,EAAAkB,EAAAA,EAAA9yI,OACAmwB,KAAA6hH,GACA,OAAApgD,EAAAwgD,mBAAAY,EAAA38I,EAAAoK,EACA,EAEA,EACAmxI,EAAA3yI,MAAA,SAAA+yI,GACA,OAAAH,EAAAlyD,MAAAiyD,EAAAvoD,OAAA2oD,EACA,EACAJ,EAAAt8I,KAAA,SAAAimF,GACA,OAAAu2D,EAAAnyD,MAAAiyD,EAAAvoD,OAAA9N,EACA,EACAq2D,EAAAuB,QAAA,SAAA54I,GACA,WAAAq3I,EAAA,SAAAl0H,GAAuC,OAAAA,EAAAnjB,EAAA,EAAgB,SAAAmjB,EAAA/e,GACvD,IAAA9C,EACA,OAAAhG,MAAAmE,QAAA0jB,GAEAA,EAAAzjB,IAAA,SAAA7B,EAAAzC,GAA+C,OAAAA,IAAA4E,EAAAoE,EAAAvG,CAAA,GAG/Cu5F,EAAAA,EAAA,GAA2Cj0E,KAAA7hB,EAAA,IAActB,GAAAoE,EAAA9C,GAEzD,EAAS,CAAIvG,KAAA,MAAAD,GAAA,GAAAkF,GACb,EACAq3I,EAAAvoD,KAAA,WACA,gBAAA9uF,GAAgC,OAAAq3I,EAAAuB,QAAA54I,EAAA,CAChC,EAEAq3I,EAAAlrI,MAAA,WACA,gBAAAA,GACA,WAAAkrI,EAAA,SAAA15I,GAA2C,OAAAA,EAAAwO,EAAA,EAAkB,SAAAxO,EAAAyG,GAAoB,OAAAzG,EAAA+B,IAAA,SAAA7B,EAAAzC,GAA+B,OAAAA,IAAA+Q,EAAA/H,EAAAvG,CAAA,EAA+B,EAAI,CAAI9C,KAAA,MAAAD,GAAA,GAAAqR,GACvJ,CACA,EACAkrI,EAAAvlH,KAAA,WACA,gBAAAjoB,GACA,WAAAwtI,EAAA,SAAA15I,GAA2C,OAAAA,EAAAsE,OAAA4H,GAAA,IAAyB,SAAAlM,EAAAyG,GAAoB,OAAAzG,EAAA+B,IAAA,SAAA7B,GAA4B,OAAAgM,EAAAhM,GAAAuG,EAAAvG,CAAA,EAAyB,EAAI,CAAI9C,KAAA,MAAAD,GAAA,UACrJ,CACA,EACAu8I,EAAAxiE,OAAA,WACA,gBAAA70E,EAAAlE,EAAA87I,GACA,WAAAP,EAAA,SAAA15I,GACA,OAAAi6I,EACAj6I,EAAAsE,OAAA,SAAApE,GAAmD,OAAAA,EAAAmC,KAAAlE,CAAA,GAA0Bi8B,UAAA,GAG7Ep6B,EAAAsE,OAAA,SAAApE,GAAmD,OAAAA,EAAAmC,KAAAlE,CAAA,GAA0B,EAE7E,EAAa,SAAA6B,EAAAyG,GACb,IAAA+H,GAAA,EACA,GAAAyrI,GACA,QAAAx8I,EAAAuC,EAAAzC,OAAA,EAA+CE,GAAA,EAAQA,IACvD,GAAAuC,EAAAvC,GAAA4E,KAAAlE,EAAA,CACAqQ,EAAA/Q,EACA,KACA,OAIA,IAAAA,EAAA,EAAoCA,EAAAuC,EAAAzC,OAAcE,IAClD,GAAAuC,EAAAvC,GAAA4E,KAAAlE,EAAA,CACAqQ,EAAA/Q,EACA,KACA,CAGA,OAAAuC,EAAA+B,IAAA,SAAA7B,EAAAzC,GAA+C,OAAAA,IAAA+Q,EAAA/H,EAAAvG,CAAA,EAC/C,EAAa,CAAI9C,KAAA,MAAAD,GAAAkF,EAAA,OAAAlE,GACjB,CACA,EACAu7I,EAAA97I,UAAA2+G,OAAA,SAAAl5B,EAAA/iF,GACA,OAAApD,KAAA+L,IAAAo6E,EAAA/iF,EAAApD,KAAA4K,IAAAu7E,IACA,EACAq2D,EAAA97I,UAAAq6B,KAAA,SAAA6hH,GACA,IAAApgD,EAAAx8F,KACA,WAAAw8I,EAAA,SAAAr2D,GACA,IAAA63D,EAAAxhD,EAAA5xF,IAAAu7E,GACA,OAAAy2D,EAAAhyI,IAAAozI,EACA,EAAS,SAAA73D,EAAAllF,GACT,IAAAqmD,EAAAk1C,EAAA5xF,IAAAu7E,GACA83D,EAAArB,EAAA7wI,IAAAu7C,EAAArmD,GAEA,OADAu7F,EAAAzwF,IAAAo6E,EAAA83D,EAEA,EAAS,CACT/9I,KAAAm8I,EAAAr8I,KAAAE,KAAA,CAAAF,KAAAC,KACAA,GAAA28I,EAAA38I,IAEA,EACAu8I,EAAA97I,UAAAwF,SAAA,WACA,aAAAlG,KAAAE,MAAA,MAAAF,KAAAC,GACAD,KAAAE,KAAAsO,KAAA,eAAAxO,KAAAC,GAGA,MAEA,EACAu8I,EAAA97I,UAAA8G,OAAA,SAAAvG,EAAAoK,GACA,OAAAmxI,EAAAQ,mBAAAh9I,KAAAiB,EAAAoK,EACA,EACAmxI,EAAA97I,UAAA0J,aAAA,SAAAy0B,EAAAxzB,GACA,OAAAmxI,EAAAS,yBAAAj9I,KAAA6+B,EAAA,GAAyDxzB,EACzD,EACAmxI,CACA,CA1MA,GA2MAx7I,EAAAw7I,KAAYA,6BCzZZ,IAAAzyD,EAAapnF,EAAQ,OAErB,IAAAu7I,EAAA,EAoBA,MAAAC,EAIA,WAAA1kI,CAIApO,EAKAU,EAKA80B,EAIAu9G,GACAp+I,KAAAqL,KAAAA,EACArL,KAAA+L,IAAAA,EACA/L,KAAA6gC,KAAAA,EACA7gC,KAAAo+I,SAAAA,EAIAp+I,KAAAwE,GAAA05I,GACA,CACA,QAAAh4I,GACA,IAAAmF,KAAcA,GAAOrL,KACrB,QAAA6hE,KAAA7hE,KAAAo+I,SACAv8E,EAAAx2D,OACAA,EAAA,GAA0Bw2D,EAAAx2D,QAAYA,MACtC,OAAAA,CACA,CACA,aAAAitF,CAAA+lD,EAAA/2F,GACA,IAAAj8C,EAAA,iBAAAgzI,EAAAA,EAAA,IAGA,GAFAA,aAAAF,IACA72F,EAAA+2F,GACA/2F,aAAA,EAAAA,EAAAzmB,KACA,UAAA/lB,MAAA,sCACA,IAAAsiE,EAAA,IAAA+gE,EAAA9yI,EAAA,YAEA,GADA+xE,EAAArxE,IAAA+F,KAAAsrE,GACA91B,EACA,QAAAxgC,KAAAwgC,EAAAv7C,IACAqxE,EAAArxE,IAAA+F,KAAAgV,GACA,OAAAs2D,CACA,CAaA,qBAAAkhE,CAAAjzI,GACA,IAAAw2D,EAAA,IAAA08E,EAAAlzI,GACA,OAAA+xE,GACAA,EAAAghE,SAAApnI,QAAA6qD,IAAA,EACAub,EACAmhE,EAAA3zI,IAAAwyE,EAAAv8C,MAAAu8C,EAAAA,EAAAghE,SAAAv9I,OAAAghE,GAAA78D,KAAA,CAAAlC,EAAA6D,IAAA7D,EAAA0B,GAAAmC,EAAAnC,IAEA,EAEA,IAAAg6I,EAAA,EACA,MAAAD,EACA,WAAA9kI,CAAApO,GACArL,KAAAqL,KAAAA,EACArL,KAAAy+I,UAAA,GACAz+I,KAAAwE,GAAAg6I,GACA,CACA,UAAA5zI,CAAAi2B,EAAA69G,GACA,IAAAA,EAAAr+I,OACA,OAAAwgC,EACA,IAAAuc,EAAAshG,EAAA,GAAAD,UAAAxnH,KAAAnQ,IAAAA,SAAA+Z,MAAAA,IAcA/9B,EAdA47I,EAcA/3I,EAdAmgB,EAAAs3H,SAeAt7I,EAAAzC,QAAAsG,EAAAtG,QAAAyC,EAAAgF,MAAA,CAAA4qB,EAAAnyB,IAAAmyB,GAAA/rB,EAAApG,KADA,IAAAuC,EAAA6D,IAbA,GAAAy2C,EACA,OAAAA,EACA,IAAArxC,EAAA,GAAAqxE,EAAA,IAAA+gE,EAAAt9G,EAAAx1B,KAAAU,EAAA80B,EAAA69G,GACA,QAAAnrI,KAAAmrI,EACAnrI,EAAAkrI,UAAA3sI,KAAAsrE,GACA,IAAAuhE,EAWA,SAAA1vD,GACA,IAAA9iF,EAAA,KACA,QAAA5L,EAAA,EAAoBA,EAAA0uF,EAAA5uF,OAAkBE,IACtC,QAAAg7B,EAAA,EAAAv4B,EAAAmJ,EAAA9L,OAAyCk7B,EAAAv4B,EAAOu4B,IAChDpvB,EAAA2F,KAAA3F,EAAAovB,GAAA16B,OAAAouF,EAAA1uF,KAGA,OAAA4L,EAAAnH,KAAA,CAAAlC,EAAA6D,IAAAA,EAAAtG,OAAAyC,EAAAzC,OACA,CAnBAu+I,CAAAF,GACA,QAAAp3F,KAAAzmB,EAAA90B,IACA,IAAAu7C,EAAA82F,SAAA/9I,OACA,QAAAq5F,KAAAilD,EACA5yI,EAAA+F,KAAAysI,EAAA3zI,IAAA08C,EAAAoyC,IACA,OAAAtc,CACA,EAwGA,MAAAyhE,EAAA,IAAA90D,EAAAmK,SAAA,CACA,OAAA0d,CAAA9uG,EAAA6D,GACA,IAAAq5C,EAAAuzD,EAAAljD,EACA,KAAAvtD,GAAA6D,GAAA,CASA,IARA7D,GAAA6D,GAAA7D,EAAA6nF,OAAAhkF,EAAAgkF,OACAt6B,EAAA1pD,EACAA,EAAAA,EAAA6iC,OAGA6mB,EAAAvtD,EACAA,EAAAA,EAAA0mC,MAEAwW,GAAAA,EAAAt0B,MAAA2kC,EAAA3kC,OAAA2kC,EAAAr8C,UAAAgsC,EAAAhsC,QACA,SACA,IAAA2/C,EAAA,IAAAmrF,EAAAzuF,EAAAtvC,KAAAsvC,EAAA3kC,KAAA2kC,EAAAr8C,SACAgsC,EACAA,EAAAxW,KAAAmqB,EAEA4/C,EAAA5/C,EACA3T,EAAA2T,CACA,CACA,OAAA4/C,CACA,IAEA,MAAAurC,EACA,WAAArlI,CAAAsH,EAAA2K,EAAA1X,EAAAw1B,GACAxpC,KAAA+gB,KAAAA,EACA/gB,KAAA0rB,KAAAA,EACA1rB,KAAAgU,QAAAA,EACAhU,KAAAwpC,KAAAA,CACA,CACA,UAAAu1G,GAAmB,UAAA/+I,KAAA0rB,IAAA,CACnB,WAAAszH,GAAoB,UAAAh/I,KAAA0rB,IAAA,CACpB,IAAA1mB,CAAAiqD,GACA,OAAAA,GAAAA,EAAA07B,MAAA3qF,KAAA2qF,OACA3qF,KAAAwpC,KAAAylB,EACAjvD,OAEAivD,EAAAzlB,KAAAxpC,KAAAgF,KAAAiqD,EAAAzlB,MACAylB,EACA,CACA,SAAA07B,GAAkB,OAAA3qF,KAAAgU,QAAAhU,KAAAgU,QAAA3T,OAAA,GAQlB,SAAA4+I,EAAAl+H,EAAAiH,GACA,IAAAnjB,EAAA/D,OAAAugD,OAAA,MACA,QAAAjqC,KAAA2J,EACA,GAAAtgB,MAAAmE,QAAAwS,EAAAgmE,KAGA,QAAAA,KAAAhmE,EAAAgmE,IACAv4E,EAAAu4E,EAAA54E,IAAA4S,EAAAwnB,WAHA/5B,EAAAuS,EAAAgmE,IAAA54E,IAAA4S,EAAAwnB,MAKA,IAAAm0E,MAAUA,EAAAtX,IAAAA,EAAA,MAAoBzzE,GAAA,GAC9B,OACA5Q,MAAA2J,IACA,IAAAm+H,EAAAzjD,EACA,QAAAre,KAAAr8D,EACA,QAAAqS,KAAAgqD,EAAArxE,IAAA,CACA,IAAAozI,EAAAt6I,EAAAuuB,EAAA5uB,IACA,GAAA26I,EAAA,CACAD,EAAAA,EAAAA,EAAA,IAAAC,EAAAA,EACA,KACA,CACA,CAEA,OAAAD,GAEAnsC,QAEA,CAgBA,SAAAqsC,EAAAxsD,EAAAysD,EAMAC,EAIAp/I,EAAA,EAIAD,EAAA2yF,EAAAvyF,QACA,IAAAk/I,EAAA,IAAAC,EAAAt/I,EAAAO,MAAAmE,QAAAy6I,GAAAA,EAAA,CAAAA,GAAAC,GACAC,EAAAE,eAAA7sD,EAAA3yC,SAAA//C,EAAAD,EAAA,GAAAs/I,EAAAG,cACAH,EAAArc,MAAAjjI,EACA,CAlEA6+I,EAAA7rH,MAAA,IAAA6rH,EAAA,WAgGA,MAAAU,EACA,WAAA/lI,CAAAg4B,EAAAiuG,EAAAC,GACA3/I,KAAAyxC,GAAAA,EACAzxC,KAAA0/I,aAAAA,EACA1/I,KAAA2/I,KAAAA,EACA3/I,KAAA4+B,MAAA,EACA,CACA,SAAAghH,CAAAnuG,EAAAytG,GACAA,GAAAl/I,KAAA4+B,QACA5+B,KAAAkjI,MAAAzxF,GACAA,EAAAzxC,KAAAyxC,KACAzxC,KAAAyxC,GAAAA,GACAzxC,KAAA4+B,MAAAsgH,EAEA,CACA,KAAAhc,CAAAjjI,GACAA,EAAAD,KAAAyxC,IAAAzxC,KAAA4+B,OACA5+B,KAAA2/I,KAAA3/I,KAAAyxC,GAAAxxC,EAAAD,KAAA4+B,MACA,CACA,cAAA6gH,CAAAx/F,EAAA//C,EAAAD,EAAA4/I,EAAAH,GACA,IAAAluI,KAAcA,EAAAtR,KAAAqqF,EAAAtqF,GAAA2rF,GAA6B3rC,EAC3C,GAAAsqC,GAAAtqF,GAAA2rF,GAAA1rF,EACA,OACAsR,EAAA8gG,QACAotC,EAAA1/I,KAAA0/I,aAAAt4I,OAAAk1B,IAAAA,EAAAy2E,OAAAz2E,EAAAy2E,MAAAvhG,KACA,IAAA0tI,EAAAW,EACAluF,EAAAmuF,EAAA7/F,IAAA6+F,EAAA7rH,MACA8sH,EA1FA,SAAAL,EAAA3+H,GACA,IAAAlY,EAAA,KACA,QAAAw2I,KAAAK,EAAA,CACA,IAAAz+I,EAAAo+I,EAAAjoI,MAAA2J,GACA9f,IACA4H,EAAAA,EAAAA,EAAA,IAAA5H,EAAAA,EACA,CACA,OAAA4H,CACA,CAkFAm3I,CAAAN,EAAA/tF,EAAA5wC,MASA,GARAg/H,IACAb,IACAA,GAAA,KACAA,GAAAa,EACA,GAAApuF,EAAAjmC,OACAm0H,IAAAA,EAAA,QAAAE,IAEA//I,KAAA4/I,UAAA55I,KAAAmqC,IAAAjwC,EAAAqqF,GAAA20D,GACAvtF,EAAAotF,OACA,OACA,IAAA/sC,EAAA/xD,EAAA2yC,MAAA3yC,EAAA2yC,KAAAqB,KAAAlK,EAAAmK,SAAA8d,SACA,GAAAA,GAAAA,EAAAE,QAAA,CACA,IAAApb,EAAA72C,EAAAhB,KAAAy0D,MAAA1B,EAAAE,QAAA,GAAAhyG,KAAAqqF,EAAA,GACA01D,EAAAjgJ,KAAA0/I,aAAAt4I,OAAAk1B,IAAAA,EAAAy2E,OAAAz2E,EAAAy2E,MAAAf,EAAApf,KAAAphF,OACA2lG,EAAAl3D,EAAAC,aACA,QAAA3/C,EAAA,EAAA2pF,EAAAK,GAA0ChqF,IAAA,CAC1C,IAAAipC,EAAAjpC,EAAAyxG,EAAAE,QAAA7xG,OAAA2xG,EAAAE,QAAA3xG,GAAA,KACAmxF,EAAAloD,EAAAA,EAAAtpC,KAAAqqF,EAAAqB,EACAs0D,EAAAl6I,KAAAmqC,IAAAjwC,EAAAgqF,GAAAi2D,EAAAn6I,KAAA22C,IAAA18C,EAAAyxF,GACA,GAAAwuD,EAAAC,GAAAhpC,EACA,KAAAl3D,EAAA//C,KAAAigJ,IACAngJ,KAAAy/I,eAAAx/F,EAAAigG,EAAAC,EAAAN,EAAAH,GACA1/I,KAAA4/I,UAAA55I,KAAA22C,IAAAwjG,EAAAlgG,EAAAhgD,IAAAi/I,KACAj/F,EAAAhgD,IAAAyxF,IAAAzxC,EAAAE,iBAIA,IAAA3W,GAAAkoD,EAAAzxF,EACA,MACAiqF,EAAA1gD,EAAAvpC,GAAAsqF,EACAL,EAAAhqF,IACAF,KAAAy/I,eAAA3oD,EAAA72C,SAAAj6C,KAAAmqC,IAAAjwC,EAAAspC,EAAAtpC,KAAAqqF,GAAAvkF,KAAA22C,IAAA18C,EAAAiqF,GAAA,GAAA+1D,GACAjgJ,KAAA4/I,UAAA55I,KAAA22C,IAAA18C,EAAAiqF,GAAAg1D,GAEA,CACA/nC,GACAl3D,EAAAqH,QACA,MACA,GAAArH,EAAAC,aAAA,CACA8xD,IACA6tC,EAAA,IACA,GACA,KAAA5/F,EAAAhgD,IAAAC,GAAA,CAEA,GAAA+/C,EAAA//C,MAAAD,EACA,MACAD,KAAAy/I,eAAAx/F,EAAA//C,EAAAD,EAAA4/I,EAAAH,GACA1/I,KAAA4/I,UAAA55I,KAAA22C,IAAA18C,EAAAggD,EAAAhgD,IAAAi/I,EAJA,QAKcj/F,EAAAE,eACdF,EAAAqH,QACA,CACA,EAOA,SAAAw4F,EAAA7gG,GACA,IAAA0S,EAAA1S,EAAAztC,KAAAyiF,KAAA4qD,GACA,KAAAltF,GAAAA,EAAA39C,UAAAirC,EAAAw3D,aAAA9kD,EAAA39C,UACA29C,EAAAA,EAAAnoB,KACA,OAAAmoB,GAAA,IACA,CACA,MAAA7qC,EAAAq3H,EAAA7lD,OACA8nD,EAAAt5H,IAAAzb,EAAAyb,IAAAu5H,EAAAv5H,EAAAzb,GAAAi1I,EAAAx5H,EAAAzb,GAAAg2F,EAAAv6E,IAAA82E,EAAA92E,EAAAu6E,GAAAh8E,EAAAyB,EAAAu6E,GAAA7yD,EAAA1nB,IAAAm3B,EAAAn3B,EAAA0nB,GAAAjpB,EAAAuB,IAAA6/B,EAAA7/B,IAAAy5H,EAAAz5H,IAAA05H,EAAA15H,EAAAy5H,GAAA1+H,EAAAiF,IAqBA/F,EAAA,CAIAq/H,UAIAx6H,YAAAkB,EAAAs5H,GAIAt6H,aAAAgB,EAAAs5H,GAIAz5H,WAAAG,EAAAs5H,GAIA/0I,OAIAo1I,aAAA35H,EAAAzb,GAIAg1I,SAAAA,EAIAK,QAAA55H,EAAAu5H,GAIAC,aAAAA,EAIAn6H,cAAAW,EAAAw5H,GAIAxzI,UAAAga,EAAAzb,GAIAs1I,UAAA75H,EAAAzb,GAIAu1I,UAAA95H,EAAAzb,GAIAw1I,UAAA/5H,EAAAzb,GAIAg2F,UAIAzD,SAIAkjD,UAAAh6H,EAAA82E,GAIAmjD,UAAAj6H,EAAA82E,GAIAv3E,eAAAS,EAAA82E,GAIAv4E,SAIA27H,QAAAl6H,EAAAzB,GAIA47H,MAAAn6H,EAAAzB,GAIA67H,KAAAp6H,EAAAu6E,GAIA8/C,OAAAr6H,EAAAu6E,GAKA+/C,OAAAt6H,EAAAu6E,GAIAzoE,MAAA9R,EAAAu6E,GAIAhnF,IAAAyM,EAAAu6E,GAIA97E,UAKA1hB,KAAAijB,EAAAvB,GAIAq0G,KAAA9yG,EAAAvB,GAIAL,KAAA4B,EAAAvB,GAIA3e,KAAAkgB,EAAAvB,GAIA87H,SAAAv6H,EAAAvB,GAIA+7H,gBAAAx6H,EAAAvB,GAIAg8H,eAAAz6H,EAAAvB,GAIAi8H,kBAAA16H,EAAAvB,GAKAk8H,cAAA36H,EAAAvB,GAIAohC,WAIA+6F,cAAA56H,EAAA6/B,GAIAg7F,mBAAA76H,EAAA6/B,GAIAi7F,cAAA96H,EAAA6/B,GAIAk7F,gBAAA/6H,EAAA6/B,GAIAm7F,gBAAAh7H,EAAA6/B,GAIAo7F,eAAAj7H,EAAA6/B,GAIAq7F,mBAAAl7H,EAAA6/B,GAIAs7F,aAAAn7H,EAAA6/B,GAIAu7F,gBAAAp7H,EAAA6/B,GAIA45F,cAKA4B,UAAAr7H,EAAAy5H,GAIAC,UAKA4B,aAAAt7H,EAAA05H,GAKA6B,cAAAv7H,EAAA05H,GAKA8B,MAAAx7H,EAAA05H,GAKA+B,MAAAz7H,EAAA05H,GAIAhyG,UAIAyP,UAIAukG,SAAA17H,EAAAm3B,GAIAwkG,SAAA37H,EAAAm3B,GAIAykG,SAAA57H,EAAAm3B,GAIA0kG,SAAA77H,EAAAm3B,GAIA2kG,SAAA97H,EAAAm3B,GAIA4kG,SAAA/7H,EAAAm3B,GAIA6kG,iBAAAh8H,EAAA0nB,GAIA+xF,KAAAz5G,EAAA0nB,GAIAu0G,MAAAj8H,EAAA0nB,GAIAw0G,SAAAl8H,EAAA0nB,GAIAy0G,OAAAn8H,EAAA0nB,GAIA26E,KAAAriG,EAAA0nB,GAKA00G,UAAAp8H,EAAA0nB,GAKA20G,cAAAr8H,EAAA0nB,GAIA40G,SAAAt8H,IAIAu8H,QAAAv8H,IAIAg8E,QAAAh8E,IAIAw8H,QAAAx8H,IAIAjF,OAKA0hI,aAAAz8H,EAAAjF,GAKA2E,WAAAM,EAAAjF,GAKA2hI,sBAAA18H,EAAAjF,GAMAtB,WAAA49H,EAAAG,eAAA,cAMAnuH,SAAAguH,EAAAG,eAAA,YAOAppB,SAAAipB,EAAAG,eAAA,YAMAmF,SAAAtF,EAAAG,eAAA,YAKA51G,MAAAy1G,EAAAG,eAAA,SASAoF,QAAAvF,EAAAG,eAAA,YAEA,QAAAjzI,KAAA0V,EAAA,CACA,IAAAy2F,EAAAz2F,EAAA1V,GACAmsG,aAAA2mC,IACA3mC,EAAAnsG,KAAAA,EACA,CAiDA,MAAAs4I,EAAA1E,EAAA,CACA,CAAM7hE,IAAAr8D,EAAAooG,KAAAvqF,MAAA,YACN,CAAMw+C,IAAAr8D,EAAAk9B,QAAArf,MAAA,eACN,CAAMw+C,IAAAr8D,EAAAiiI,SAAApkH,MAAA,gBACN,CAAMw+C,IAAAr8D,EAAAkiI,OAAArkH,MAAA,cACN,CAAMw+C,IAAAr8D,EAAAwE,QAAAqZ,MAAA,eACN,CAAMw+C,IAAAr8D,EAAAmE,KAAA0Z,MAAA,YACN,CAAMw+C,IAAAr8D,EAAAmgI,KAAAtiH,MAAA,YACN,CAAMw+C,IAAAr8D,EAAA1G,IAAAukB,MAAA,WACN,CAAMw+C,IAAAr8D,EAAA4/H,UAAA/hH,MAAA,iBACN,CAAMw+C,IAAAr8D,EAAAqiI,SAAAxkH,MAAA,gBACN,CAAMw+C,IAAAr8D,EAAAsiI,QAAAzkH,MAAA,eACN,CAAMw+C,IAAAr8D,EAAAsgF,QAAAziE,MAAA,eACN,CAAMw+C,IAAAr8D,EAAA68E,OAAAh/D,MAAA,cACN,CAAMw+C,IAAAr8D,EAAAsE,OAAAuZ,MAAA,cACN,CAAMw+C,IAAA,CAAAr8D,EAAAogI,OAAApgI,EAAAqgI,OAAArgI,EAAA2iI,QAAA3iI,EAAA68E,SAAAh/D,MAAA,eACN,CAAMw+C,IAAAr8D,EAAA0/H,aAAA7hH,MAAA,oBACN,CAAMw+C,IAAAr8D,EAAA2nB,MAAA3nB,EAAA0/H,cAAA7hH,MAAA,8BACN,CAAMw+C,IAAAr8D,EAAAR,WAAAQ,EAAA0/H,cAAA7hH,MAAA,mCACN,CAAMw+C,IAAAr8D,EAAA2iI,QAAA3iI,EAAA0/H,cAAA7hH,MAAA,qBACN,CAAMw+C,IAAAr8D,EAAAR,WAAAQ,EAAAu/H,cAAA1hH,MAAA,mCACN,CAAMw+C,IAAAr8D,EAAAs/H,SAAAzhH,MAAA,gBACN,CAAMw+C,IAAAr8D,EAAA6/H,UAAAhiH,MAAA,iBACN,CAAMw+C,IAAAr8D,EAAAjU,UAAA8xB,MAAA,iBACN,CAAMw+C,IAAAr8D,EAAA8/H,UAAAjiH,MAAA,iBACN,CAAMw+C,IAAAr8D,EAAAu/H,aAAA1hH,MAAA,oBACN,CAAMw+C,IAAAr8D,EAAA4lC,SAAA/nB,MAAA,gBACN,CAAMw+C,IAAAr8D,EAAAq/H,QAAAxhH,MAAA,eACN,CAAMw+C,IAAAr8D,EAAAc,KAAA+c,MAAA,YACN,CAAMw+C,IAAAr8D,EAAAuiI,QAAA1kH,MAAA,eACN,CAAMw+C,IAAAr8D,EAAAw/H,YAAA3hH,MAAA,qBAGN59B,EAAAm9I,IAAWA,EACXn9I,EAAA2iJ,iBAAwBA,EACxB3iJ,EAAA8+I,aAAoBA,EACpB9+I,EAAA4iJ,cAhlBA,SAAA99I,EAAA8sF,EAAAysD,EAAAwE,EAAAC,EAAA5jJ,EAAA,EAAAD,EAAA6F,EAAAzF,QACA,IAAA6pF,EAAAhqF,EACA,SAAA6jJ,EAAA55I,EAAA65I,GACA,KAAA75I,GAAA+/E,GAAA,CAEA,QAAAvkF,EAAAG,EAAAnF,MAAAupF,EAAA//E,GAAA5J,EAAA,IAAmD,CACnD,IAAA0jJ,EAAAt+I,EAAAqR,QAAA,KAAAzW,GACA2jJ,EAAAD,EAAA,EAAAt+I,EAAAtF,OAAA4jJ,EAGA,GAFAC,EAAA3jJ,GACAsjJ,EAAAl+I,EAAAhF,MAAAJ,EAAA2jJ,GAAAF,GACAC,EAAA,EACA,MACAH,IACAvjJ,EAAA0jJ,EAAA,CACA,CACA/5D,EAAA//E,CAXA,CAYA,CACAi1I,EAAAxsD,EAAAysD,EAAA,CAAAn/I,EAAAD,EAAA+jJ,KACAD,EAAA7jJ,EAAA,IACA6jJ,EAAA9jJ,EAAA+jJ,IACK9jJ,EAAAD,GACL8jJ,EAAA9jJ,EAAA,GACA,EA2jBAe,EAAAo+I,cAAqBA,EACrBp+I,EAAAmjJ,UA7uBA,SAAAr7E,GACA,IAAAs7E,EAAAtjJ,OAAAugD,OAAA,MACA,QAAA4yC,KAAAnrB,EAAA,CACA,IAAA/nD,EAAA+nD,EAAAmrB,GACAxzF,MAAAmE,QAAAmc,KACAA,EAAA,CAAAA,IACA,QAAAs5C,KAAA45B,EAAAlwE,MAAA,KACA,GAAAs2C,EAAA,CACA,IAAAgqF,EAAA,GAAA34H,EAAA,EAAA20B,EAAAga,EACA,QAAA6vB,EAAA,IAAkC,CAClC,UAAA7pC,GAAA6pC,EAAA,GAAAA,EAAA,GAAA7vB,EAAAh6D,OAAA,CACAqrB,EAAA,EACA,KACA,CACA,IAAAnY,EAAA,8BAAA+wI,KAAAjkG,GACA,IAAA9sC,EACA,UAAAk9E,WAAA,iBAAAp2B,GAGA,GAFAgqF,EAAAvyI,KAAA,KAAAyB,EAAA,WAAAA,EAAA,MAAAnN,KAAA0J,MAAAyD,EAAA,IAAAA,EAAA,IACA22E,GAAA32E,EAAA,GAAAlT,OACA6pF,GAAA7vB,EAAAh6D,OACA,MACA,IAAAmpC,EAAA6wB,EAAA6vB,KACA,GAAAA,GAAA7vB,EAAAh6D,QAAA,KAAAmpC,EAAA,CACA9d,EAAA,EACA,KACA,CACA,QAAA8d,EACA,UAAAinD,WAAA,iBAAAp2B,GACAha,EAAAga,EAAA15D,MAAAupF,EACA,CACA,IAAAp+E,EAAAu4I,EAAAhkJ,OAAA,EAAAy2F,EAAAutD,EAAAv4I,GACA,IAAAgrF,EACA,UAAArG,WAAA,iBAAAp2B,GACA,IAAA1I,EAAA,IAAAmtF,EAAA/9H,EAAA2K,EAAA5f,EAAA,EAAAu4I,EAAA1jJ,MAAA,EAAAmL,GAAA,MACAs4I,EAAAttD,GAAAnlC,EAAA3sD,KAAAo/I,EAAAttD,GACA,CACA,CACA,OAAA+nD,EAAAloI,IAAAytI,EACA,EAwsBApjJ,EAAAi+I,eAAsBA,EACtBj+I,EAAA+f,KAAYA,0YC15BZ/f,EAAAi3D,sBAAA,SAAsC/rD,SACpC,MAAO8Q,EAAO0Q,IAAY,EAAAvB,EAAAlW,UAA2B,QAAlBxP,EAAAyF,EAAMyhB,oBAAY,IAAAlnB,EAAAA,EAAI,KAClD8W,EAAUqQ,IAAe,EAAAzB,EAAAlW,UAAS,KAClCsuI,EAAmBC,IAAwB,EAAAr4H,EAAAlW,WAAS,IACpDwuI,EAAoBC,IAAyB,EAAAv4H,EAAAlW,WAAS,IACtDyzE,EAAei7D,IAAoB,EAAAx4H,EAAAlW,eAA6BlI,IAChE62I,EAAgBC,IAAqB,EAAA14H,EAAAlW,eAA6BlI,IAClEq1B,EAAgBC,IAAqB,EAAAlX,EAAAlW,eAA6BlI,IAClE+2I,EAASC,IAAc,EAAA54H,EAAAlW,WAAS,IAChC+uI,EAAWC,IAAgB,EAAA94H,EAAAlW,UAAS,GA+C3C,OA7CA,EAAAkW,EAAAC,WAAU,KACR,GAAI44H,GAAa,EACf,OAEF,MAAMz3I,EAAQy6B,WAAW,KACvBi9G,EAAchkJ,GAAUA,EAAQ,IAC/B,KACH,MAAO,IAAMyoG,aAAan8F,IACzB,CAACy3I,KAsCF,EAAAp4I,EAAA2B,MAAA,OAAAxB,SAAA,EACE,EAAAH,EAAAC,KAAA,MAAIC,UAAU,qCAAoCC,SAAA,yBAClD,EAAAH,EAAA2B,MAAA,QAAM6f,SAtCkBprB,GAA2BqrB,EAAAruB,UAAA,qBACrDgD,EAAEsrB,iBACFq2H,OAAiB52I,GACjBy2I,GAAqB,GACrB,UACQt4I,EAAMqiB,QAAQvR,EAAOO,EAC7B,CAAE,MAAO3I,GACP+vI,EAAiB/vI,aAAekG,MAAQlG,EAAIjD,QAAU,oBACxD,SACE6yI,GAAqB,EACvB,CACF,GA2BgCz3I,SAAA,EAC1B,EAAAH,EAAAC,KAAA,OAAKC,UAAU,OAAMC,UACnB,EAAAH,EAAAC,KAAC2hB,EAAAzW,MAAK,CACJ9C,MAAM,QACNzD,KAAK,QACLiE,WAAW,4BACX0B,gBAAgB,EAChBsX,UAAU,EACVpZ,gBAAgB,oBAChBpU,MAAO+b,EACPxH,WAAW,UACXN,cAAgBrM,IACd,GAAIA,EAAO4I,QAAS,CAClB,MAAMyzI,EAAYr8I,EAAOgH,KACrBq1I,IAAcloI,IAChB+nI,GAAW,GACXE,EAAa,GACb5hH,OAAkBt1B,GAClB82I,OAAkB92I,IAEpB2f,EAASw3H,EACX,GAEFx2H,YAAY,sBAGfxiB,EAAM6iB,kBACL,EAAAniB,EAAAC,KAAA,OAAKC,UAAU,mBAAkBC,UAC/B,EAAAH,EAAAC,KAAC8hB,EAAAC,OAAM,CACLvjB,KAAK,iCACLsH,KAAK,SACLnB,KAAK,SAAQ,UACL,iCACRqd,UAAW7R,GAASgoI,EAAY,GAAKP,EACrC13H,QA3DgB,IAA0BsB,EAAAruB,UAAA,qBACpD,GAAKkM,EAAM6iB,iBAAoB/R,IAASynI,EAAxC,CAGAI,OAAkB92I,GAClBs1B,OAAkBt1B,GAClB22I,GAAsB,GACtB,UACQx4I,EAAM6iB,gBAAgB/R,GAI5BqmB,EAAkB,oBAClB0hH,GAAW,GACXE,EAAa,GACf,CAAE,MAAOrwI,GACPiwI,EAAkBjwI,aAAekG,MAAQlG,EAAIjD,QAAU,4BACzD,SACE+yI,GAAsB,EACxB,CAhBA,CAiBF,GAuCwC33I,SAE3B03I,EACG,wBACAK,EACEE,EAAY,EACV,aAAaA,KACb,oBACF,sBASXJ,IACC,EAAAh4I,EAAAC,KAAA,OAAKC,UAAU,2CAA0C,UAAS,uCAAsCC,SACrG63I,IAGJxhH,IACC,EAAAx2B,EAAAC,KAAA,OAAKC,UAAU,4CAA2C,UAAS,yCAAwCC,SACxGq2B,KAQL,EAAAx2B,EAAAC,KAAA,OAAKC,UAAU,YAAWC,UACxB,EAAAH,EAAAC,KAAC2hB,EAAAzW,MAAK,CACJ9C,MAAM,WACNzD,KAAK,WACLiE,WAAW,+BACX0B,gBAAgB,EAChBsX,UAAU,EACVpZ,gBAAgB,uBAChBpU,MAAOsc,EACP/H,WAAW,UACXN,cAAgBrM,IACVA,EAAO4I,SACTmc,EAAY/kB,EAAOgH,OAGvB6e,YAAY,0BAGfg7D,IACC,EAAA98E,EAAAC,KAAA,OAAKC,UAAU,2CAA0C,UAAS,4BAA2BC,SAC1F28E,KAGL,EAAA98E,EAAAC,KAAA,OAAKC,UAAU,mBAAkBC,UAC/B,EAAAH,EAAAC,KAAC8hB,EAAAC,OAAM,CACLvjB,KAAK,6BACLsH,KAAK,cACLnB,KAAK,SAAQ,UACL,6BACRqd,UAAW7R,IAAUO,GAAYgnI,EAAiBx3I,SAEjDw3I,EAAoB,gBAAkB,4BAG1Cr4I,EAAM4iB,mBACL,EAAAliB,EAAAC,KAAA,OAAKC,UAAU,mBAAkBC,UAC/B,EAAAH,EAAAC,KAAA,UACE2E,KAAK,SACL1E,UAAU,mCACVigB,QAAS,KAAK,IAAAtmB,EAAC,OAAsB,QAAtBA,EAAAyF,EAAM4iB,wBAAgB,IAAAroB,OAAA,EAAAA,EAAA7F,KAAAsL,EAAG8Q,IAAM,UACtC,sCAAqCjQ,SAAA,wBAMnD,EAAAH,EAAAC,KAAA,OAAKC,UAAU,mBAAkBC,UAC/B,EAAAH,EAAAC,KAAC8hB,EAAAC,OAAM,CACLvjB,KAAK,2BACLsH,KAAK,SACLqc,WAAW,KACXjC,QAAS7gB,EAAM+iB,OAAM,UACb,2BAA0BliB,SAAA,gBAQ9C,mBArMAof,EAAAxpB,EAAA,OACAgsB,EAAAhsB,EAAA,OACA6rB,EAAA7rB,EAAA,iCCFA,IAAA4+D,EAAAvhE,MAAAA,KAAAuhE,kBAAAzgE,OAAAugD,OAAA,SAAA99C,EAAAgQ,EAAA3F,EAAA4zD,QACAzzD,IAAAyzD,IAAAA,EAAA5zD,GACA,IAAA2nC,EAAAz0C,OAAA2gE,yBAAAluD,EAAA3F,GACA2nC,KAAA,QAAAA,GAAAhiC,EAAAmuD,WAAAnsB,EAAAzX,UAAAyX,EAAA1X,gBACA0X,EAAA,CAAe5W,YAAA,EAAA/zB,IAAA,WAAoC,OAAA2I,EAAA3F,EAAA,IAEnD9M,OAAAC,eAAAwC,EAAAi+D,EAAAjsB,EACC,WAAAhyC,EAAAgQ,EAAA3F,EAAA4zD,QACDzzD,IAAAyzD,IAAAA,EAAA5zD,GACArK,EAAAi+D,GAAAjuD,EAAA3F,EACC,GACD+zD,EAAA3hE,MAAAA,KAAA2hE,qBAAA7gE,OAAAugD,OAAA,SAAA99C,EAAAgG,GACAzI,OAAAC,eAAAwC,EAAA,WAA0Co7B,YAAA,EAAA19B,MAAAsI,GACzC,WAAAhG,EAAAgG,GACDhG,EAAA,QAAAgG,CACA,GACAq4D,EAAA5hE,MAAAA,KAAA4hE,cAAA,SAAAC,GACA,GAAAA,GAAAA,EAAAH,WAAA,OAAAG,EACA,IAAAh5D,EAAA,GACA,SAAAg5D,EAAA,QAAAj0D,KAAAi0D,EAAA,YAAAj0D,GAAA9M,OAAAJ,UAAAwC,eAAAtC,KAAAihE,EAAAj0D,IAAA2zD,EAAA14D,EAAAg5D,EAAAj0D,GAEA,OADA+zD,EAAA94D,EAAAg5D,GACAh5D,CACA,EACA/H,OAAAC,eAAAC,EAAA,cAA+CC,OAAA,IAC/CD,EAAAkxH,YAIA,SAAAj4F,EAAAX,GACA,gBAAAn2B,GACA,IAAA2tH,EAAA72F,EAAA0xF,SAAAxoH,GACA,gBAAA+tH,EAAA9tH,GAAkC,OAAAD,EAAA0B,IAAAisH,EAAAI,EAAA9tH,GAAAk2B,EAAAk4F,SAAA,CAClC,CACA,EARAxwH,EAAAgxH,cASA,SAAA/3F,EAAAX,GACA,gBAAAn2B,GACA,IAAA2tH,EAAA72F,EAAA0xF,SAAAxoH,GACA,gBAAA+tH,EAAA9tH,GAAkC,OAAAD,EAAA0B,IAAAisH,EAAAI,EAAA9tH,GAAAk2B,EAAA3rB,QAAA,CAClC,CACA,EAbA3M,EAAAmkJ,QAcA,SAAA/pH,GACA,gBAAAj4B,GACA,IAAAiiJ,EAAAhqH,EAAA22F,OAAA5uH,GACA,gBAAAovB,GAAsC,gBAAAuuB,GAAuB,OAAAskG,EAAAtkG,EAAA,SAAAh+C,GAAkC,OAAAK,EAAA0B,IAAA0tB,EAAAzvB,GAAA,SAAA6D,GAA0C,OAAAA,EAAAoqB,EAAAzuB,KAAAQ,GAAAiuB,EAAAxuB,IAAA,EAAkC,EAAI,EAC/K,CACA,EAlBA,IAAAwuB,EAAA6wC,EAAqBj/D,EAAQ,gGC5B7B,MAAAgJ,EAAAhJ,EAAA,OACAuG,EAAAvG,EAAA,OAEAqG,EAAArG,EAAA,OACA2R,EAAA3R,EAAA,OACAyhB,EAAAzhB,EAAA,OACA8lB,EAAA9lB,EAAA,OAyBA,IAAiB4J,GAAjB,SAAiBA,GAwHf,SAAgB84I,EAAYt5I,GAC1B,MAAMqB,EAAsB,MAAfrB,EAAI+nB,QAAkB,GAAG/nB,EAAI+nB,WAAW/nB,EAAIqB,OAAS,GAAGrB,EAAIqB,OACzE,OAAOrB,EAAIwe,QAAU,GAAGnd,KAAU,GAAGA,GACvC,CAEA,SAAgBk4I,EAAqBv5I,GACnC,OAA4B,MAArBA,EAAI+G,cACP,GAA4B,MAAzB/G,EAAIiH,kBAA4B,GAAGjH,EAAIiH,qBAAuB,KAAKjH,EAAI+G,gBAC1E,GACN,CAEA,SAAgByyI,EAAYp5I,EAAcC,SACxC,MAAMo5I,EAAkB,QAAP/+I,EAAA0F,EAAK,UAAE,IAAA1F,OAAA,EAAAA,EAAE2G,KAC1B,OAAIjB,EAAK9L,OAAS,GACT8L,EAAKrE,MACTwgB,GAA6C,OAAtClc,EAASkc,EAAElb,KAAOkb,EAAExV,iBAA2B1G,EAASkc,EAAElb,KAAOkb,EAAExV,iBAAmB0yI,EAKpG,CAMA,SAAgBh/B,EAAOvzG,GACrB,MAAO,CACLzO,GAAI8P,EAAAsB,WAAWC,YAAY,GAC3B8gB,oBAAgB5oB,EAChBhD,YAAQgD,EACRkF,eACA7F,UAAMW,EACNwc,SAAS,EACTjd,WAAW,EACX+oH,kBAAkB,EAClBnoH,aAAa,EAEjB,CA2EA,SAAgBqhE,EAAcjnD,GAC5B,QAASA,EAAEpa,WACb,CAyEA,SAAgBu3I,EAAYlhJ,GAC1B,MAAO,IAAIA,EAAMykB,cAAezkB,EAAM4H,MAAM/E,OAAQkhB,IAAOA,EAAEpa,aAAa,EAC5E,CAEA,SAAgB8d,EAAiBznB,GAC/B,MAAO,IAAIA,EAAMykB,cAAezkB,EAAM4H,MAAMkyC,UAAW/1B,IAAOA,EAAEpa,YAClE,CAzTgB3B,EAAA+qC,QAAhB,SAAwBnrC,EAAcC,GAAkB,GACtD,GAAIm5I,EAAYp5I,EAAMC,GACpB,MAAO,GAAGD,EAAK9L,UAAU8L,EAAK,GAAG2G,eAAiB3G,EAAK,GAAGiB,OACrD,CACL,MAAMitC,EAAMluC,EAAKtH,IAAKyjB,GAAOlc,EAASi5I,EAAY/8H,GAAKg9H,EAAqBh9H,IAE5E,OADe3c,EAAAC,gBAAgB85I,WAAW,EAAGrrG,GAC/Bx1C,IAAK4H,GAAMA,EAAE+B,KAAK,MAAMA,KAAK,KAC7C,CACF,EAEgBjC,EAAAG,gBAAhB,SACEX,EACAK,EACA7B,EACAoC,GAAsB,iBAEtB,MAAMg5I,EAA+C,QAAnBl/I,EAAAsF,EAAIge,uBAAe,IAAAtjB,EAAAA,EAAIsF,EAAIhB,OAC7D,MAAO,CACLqC,KAAMhB,EAASG,EAAK84I,YAAYt5I,GAAOQ,EAAK+4I,qBAAqBv5I,GACjEsB,IAAiC,QAA5BmG,EAAgB,QAAhBhN,EAAAuF,EAAI4jC,oBAAY,IAAAnpC,OAAA,EAAAA,EAAEN,kBAAU,IAAAsN,EAAAA,EAAW,QAAPC,EAAA1H,EAAIsB,WAAG,IAAAoG,OAAA,EAAAA,EAAEvN,WAC9C6E,OAAQqB,EACJL,EAAIhB,QAAUgB,EAAI4qB,eAChBztB,EAAAS,OAAO2tC,QAAQvrC,EAAIhB,QAAQ,QAC3BgD,EACF43I,EACEz8I,EAAAS,OAAO2tC,QAAQquG,GAA2B,QAC1C53I,EACNnH,KAAqC,QAA/BgjB,EAAA+7H,aAAyB,EAAzBA,EAA2B/+I,YAAI,IAAAgjB,EAAAA,EAAIrf,EAASS,MAClDsC,UAAWvB,EAAIuB,UACfY,YAAa3B,EAAK2xG,eAAenyG,EAAKY,GACtC0B,YAAwB,MAAXtC,EAAIsB,KAAmC,MAApBtB,EAAI4jC,cAAwB5jC,EAAI4jC,aAAe5jC,EAAIsB,IACnFc,UAA0B,MAAfpC,EAAI+nB,QAAuC,MAArB/nB,EAAI+G,eAAyB/G,EAAI+G,eAAiB/G,EAAI+nB,aAAU/lB,EACjGR,MAAOxB,EAAIwB,MACXC,SAAUzB,EAAIyB,SACdC,mBAAoB1B,EAAI0B,mBACxBiB,kBAAmB3C,EAAI2C,kBAE3B,EAEgBnC,EAAAq5I,eAAhB,SAA+B75I,GAC7B,OAAuB,MAAhBA,EAAIyB,QACb,EAEgBjB,EAAAs5I,gBAAhB,SAAgC95I,GAQ9B,OAA6B,MAAtBA,EAAI4qB,kBAA4B5qB,EAAIuB,aAAevB,EAAIsqH,gBAChE,EAIgB9pH,EAAAu5I,wBAAhB,SAAwC/5I,GACtC,OAAqB,MAAdA,EAAIhB,QAAwC,MAAtBgB,EAAI4qB,kBAA4B5qB,EAAIuB,SACnE,EASgBf,EAAAw5I,gBAAhB,SAAgCh6I,GAC9B,GAAoB,MAAhBA,EAAIyB,SAGR,MAAO,CACLw4I,eAAe,EAAAv9H,EAAA1B,GAAE/gB,KAAKmqC,IAAI,EAAGpkC,EAAIyB,WACjCy4I,eAAgBl6I,EAAI0B,mBAAqB,KAAO,IAChDy4I,WAAyB,MAAbn6I,EAAIwB,OAAgB,EAAAkb,EAAA1B,GAAE/gB,KAAKmqC,IAAI,EAAGpkC,EAAIwB,QAAU,IAC5D44I,YAA0B,MAAbp6I,EAAIwB,MAAgB,IAAM,GAE3C,EAGgBhB,EAAA65I,OAAhB,SAAuBj6I,EAAc8G,EAAuBglB,EAAgB5N,mBA2B1E,OAxBE4N,EADa,OADfA,EAAU9rB,EAAKA,EAAK9L,OAAS,IAAM43B,GAEvBuuF,EAAOvzG,GAEboX,EACKvpB,OAAAgI,OAAAhI,OAAAgI,OAAA,GACFE,EAAAwC,YAAY2sB,MAAMF,IAAQ,CAC7B7qB,KAA2B,QAArB3G,EAAAwxB,EAAQnlB,qBAAa,IAAArM,EAAAA,EAAIwxB,EAAQ7qB,KACvCrC,OAA+B,QAAvBvE,EAAAyxB,EAAQlO,uBAAe,IAAAvjB,EAAAA,EAAIyxB,EAAQltB,SAGtCjK,OAAAgI,OAAAhI,OAAAgI,OAAA,GACFE,EAAAwC,YAAY2sB,MAAMF,IAAQ,CAC7B7qB,KAAkB,QAAZoG,EAAAykB,EAAQ7qB,YAAI,IAAAoG,EAAAA,EAAIykB,EAAQnlB,cAC9B/H,OAAsB,QAAd0I,EAAAwkB,EAAQltB,cAAM,IAAA0I,EAAAA,EAAIwkB,EAAQlO,gBAClC4M,eAAwD,QAAxC7M,EAAsB,QAAtBF,EAAAqO,EAAQtB,sBAAc,IAAA/M,EAAAA,EAAIqO,EAAQltB,cAAM,IAAA+e,EAAAA,EAAImO,EAAQlO,gBACpEjX,mBAAe/E,EACfiF,uBAAmBjF,EACnBgc,qBAAiBhc,EACjB4hC,kBAAc5hC,IAOb,IACF5B,iCACEnD,EAAAwC,YAAY2sB,MAAMF,IAAQ,CAAEzzB,GAAI8P,EAAAsB,WAAWC,YAAY,GAAI3H,aAAa,EAAOoE,QAAQ,IAEhG,EAEgB/F,EAAA85I,UAAhB,SAA0BC,EAAYC,GACpC,OACEr9I,EAAAS,OAAOkyC,OAAOyqG,EAAKv7I,OAAQw7I,EAAKx7I,SAAWu7I,EAAKxzI,gBAAkByzI,EAAKzzI,eAAiBwzI,EAAKj5I,MAAQk5I,EAAKl5I,GAE9G,EAEgBd,EAAA84I,YAAWA,EAKX94I,EAAA+4I,qBAAoBA,EAMpB/4I,EAAAg5I,YAAWA,EAWXh5I,EAAA8mC,QAAhB,SAAwBlnC,GACtB,OAAOA,EAAKrE,MAAOwgB,IAAOA,EAAEpa,YAC9B,EAEgB3B,EAAAi6G,OAAMA,EAcNj6G,EAAA2B,YAAhB,SAA4B/B,EAAcQ,GAAsB,GAC9D,OAAOR,EAAK9L,OAAS,GAAK8L,EAAKrE,MAAOiE,GAAQQ,EAAK2xG,eAAenyG,EAAKY,GACzE,EAEgBJ,EAAA6d,WAAhB,SAA2Bje,EAAcQ,GAAsB,GAC7D,OAAIJ,EAAK2B,YAAY/B,EAAMQ,GAClB,UACEJ,EAAKi6I,mBAAmBr6I,GAC1B,WACGI,EAAK4xG,WAAWhyG,GAGnB,SAFA,cAIX,EAEgBI,EAAA2xG,eAAhB,SAA+BnyG,EAAWY,GAAsB,GAG9D,OAAIA,GAAmC,MAArBZ,EAAI+G,gBACX/G,EAAImC,YAEU,MAArBnC,EAAI+G,iBAQevG,EAAKu5I,wBAAwB/5I,IACP,MAAvBA,EAAIge,oBAItBhe,EAAImC,cACO,MAAZnC,EAAIqB,MAAgBrB,EAAI+G,eAAiB/G,EAAIqB,QAC/B,MAAdrB,EAAIhB,QAA0C,MAAvBgB,EAAIge,iBAA2B7gB,EAAAS,OAAO+xC,IAAI3vC,EAAIge,gBAAiBhe,EAAIhB,QAE/F,EAEgBwB,EAAAk6I,sBAAhB,SAAsC16I,GACpC,GAAyB,MAArBA,EAAI+G,cACN,OAAO,EAGT,GADuBvG,EAAKu5I,wBAAwB/5I,IAElD,GAA2B,MAAvBA,EAAIge,gBACN,OAAO,OAEJ,IAAKhe,EAAImC,YAGd,OAAO,EAET,OACiB,MAAdnC,EAAIhB,QAA0C,MAAvBgB,EAAIge,iBAA2B7gB,EAAAS,OAAO+xC,IAAI3vC,EAAIge,gBAAiBhe,EAAIhB,WAC3E,MAAfgB,EAAI+nB,QAAkB/nB,EAAI+G,eAAiB/G,EAAI+nB,QAAsB,MAAZ/nB,EAAIqB,MAAgBrB,EAAI+G,eAAiB/G,EAAIqB,KAE3G,EAEgBb,EAAAqmE,UAAhB,SAA0BzmE,GACxB,OAAOA,EAAK9L,OAAS,GAAK8L,EAAK7J,KAAMgmB,GAAMinD,EAAcjnD,GAC3D,EAEgB/b,EAAA4xG,WAAhB,SAA2BhyG,GACzB,OAAOA,EAAK9L,OAAS,GAAK8L,EAAKrE,MAAOwgB,GAAMinD,EAAcjnD,GAC5D,EAEgB/b,EAAAuxG,kBAAhB,SAAkC3xG,GAChC,OAAuB,IAAhBA,EAAK9L,QAAgBkM,EAAK4xG,WAAWhyG,EAC9C,EAEgBI,EAAAgjE,cAAaA,EAIbhjE,EAAA43B,MAAhB,SAAsBp4B,GACpB,MAAO,GAAG7C,EAAAS,OAAOsuC,UAAUlsC,EAAIhB,WAAW7B,EAAAS,OAAOsuC,UAAUlsC,EAAIge,oBAAoBhe,EAAIqB,QAAQrB,EAAI+nB,WAAW/nB,EAAIwe,WAAWxe,EAAIsB,OAAOtB,EAAIuB,aAAavB,EAAI+G,iBAAiB/G,EAAIiH,qBAAqBjH,EAAI4jC,gBAAgB5jC,EAAImC,aACjO,EAEgB3B,EAAAi6I,mBAAhB,SAAmCr6I,GACjC,OAAOA,EAAK7J,KAAMgmB,GAAmB,MAAbA,EAAEwL,UAAoB3nB,EAAKrE,MAAOwgB,GAAM/b,EAAKk6I,sBAAsBn+H,GAC7F,EAEgB/b,EAAAm6I,oBAAhB,SAAoC36I,GAClC,MAAM46I,EAAiBp6I,EAAKu5I,wBAAwB/5I,GAC9C66I,EAAuC,MAArB76I,EAAI+G,iBAA2B6zI,GAAyC,MAAvB56I,EAAIge,iBAC7E,OAAAjpB,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKiD,GAAG,CACNmC,cAAa04I,KAAoB76I,EAAImC,aAEzC,EAEgB3B,EAAAs6I,2BAAhB,SAA2C96I,WACzC,OAAIA,EAAIkH,aACCjN,KAAKmqC,IAAqB,QAAjB1pC,EAAAsF,EAAI+G,qBAAa,IAAArM,EAAAA,EAAI,EAAwB,QAArBD,EAAAuF,EAAIiH,yBAAiB,IAAAxM,EAAAA,EAAI,GAE1DuF,EAAI+G,aAEf,EAEgBvG,EAAA0iE,2BAAhB,SAA2CljE,WACzC,OAAIA,EAAIkH,aACCjN,KAAKoqC,QAAyB,QAAjB3pC,EAAAsF,EAAI+G,qBAAa,IAAArM,EAAAA,EAAI,IAA2B,QAArBD,EAAAuF,EAAIiH,yBAAiB,IAAAxM,EAAAA,EAAI,IAAM,GAEvEuF,EAAI+G,aAEf,EAEgBvG,EAAA4iE,UAAhB,SAA0BpjE,EAAWnF,iBACnC,MAAMkgJ,EACJ/6I,EAAIkH,cAAyC,MAAzBlH,EAAIiH,mBACF,QAAjBvM,EAAAsF,EAAI+G,qBAAa,IAAArM,EAAAA,EAAI,IAA2B,QAArBD,EAAAuF,EAAIiH,yBAAiB,IAAAxM,EAAAA,EAAI,GACnC,QAAjBgN,EAAAzH,EAAI+G,qBAAa,IAAAU,EAAAA,EAAI,EAC5B,OAAOtK,EAAAS,OAAOiuC,SAA0C,QAAjChuB,EAAmB,QAAnBnW,EAAA1H,EAAIge,uBAAe,IAAAtW,EAAAA,EAAI1H,EAAIhB,cAAM,IAAA6e,EAAAA,EAAI1gB,EAAAS,OAAOE,MAAM,EAAGjD,GAAOkgJ,EACrF,EAEgBv6I,EAAAC,MAAhB,SAAsBL,EAAcC,GAClC,OAAOD,EAAKlH,OACV,CAACC,EAAM6G,KACL,IAAI69E,EAAY1kF,EAAKA,EAAK7E,OAAS,GACnC,MAAMyL,EAAO89E,EAAUA,EAAUvpF,OAAS,GAoB1C,OAlBU,MAARyL,GACE5C,EAAAS,OAAOkyC,OAAO/vC,EAAKf,OAAQgB,EAAIhB,SAC/Be,EAAKsB,OAASrB,EAAIqB,MAClBtB,EAAKgoB,UAAY/nB,EAAI+nB,SACrBhoB,EAAKgH,gBAAkB/G,EAAI+G,eAC3BhH,EAAKkH,oBAAsBjH,EAAIiH,mBAC9B9J,EAAAS,OAAOkyC,OAAO/vC,EAAKie,gBAAiBhe,EAAIge,kBACzCje,EAAKwB,YAAcvB,EAAIuB,aACtBlB,GAAUN,EAAKye,UAAYxe,EAAIwe,UAChCze,EAAKuB,MAAQtB,EAAIsB,KACjBvB,EAAK6jC,eAAiB5jC,EAAI4jC,cAC1B7jC,EAAK0B,WAAazB,EAAIyB,UACtB1B,EAAK2B,qBAAuB1B,EAAI0B,qBAElCvI,EAAK4M,KAAK,IACV83E,EAAY1kF,EAAKA,EAAK7E,OAAS,IAEjCupF,EAAU93E,KAAK/F,GACR7G,GAET,CAAC,IAEL,EAEgBqH,EAAAk5I,YAAWA,EAIXl5I,EAAAyf,iBAAgBA,EAIhBzf,EAAA40G,oBAAhB,SACExzE,EACAv7B,EACAsZ,GAOA,MAAMnnB,EAAQopC,EAAc1mC,QAAQmL,GACpC,GAAa,MAAT7N,EACF,OAEF,MAAMqnB,EAAYxH,EAAAK,SAASoH,aAAa8hB,EAAeppC,EAAOmnB,GAAM,GACpE,GAAiB,MAAbE,EACF,OAGF,MAAM4pD,EAAUiwE,EAAY75H,GAC5B,OAAe,MAAX4pD,EACK,CAAEjxE,MAAOqnB,EAAW7f,IAAKypE,QADlC,CAKF,EAEgBjpE,EAAAi2G,yBAAhB,SACE70E,EACAv7B,EACAsZ,GAOA,MAAMnnB,EAAQopC,EAAc1mC,QAAQmL,GACpC,GAAa,MAAT7N,EACF,OAEF,MAAMqnB,EAAYxH,EAAAK,SAASoH,aAAa8hB,EAAeppC,EAAOmnB,GAAM,GACpE,GAAiB,MAAbE,EACF,OAQF,MAAM4pD,EACe,MAAnB5pD,EAAUvZ,MAAgBuZ,EAAUzf,KAAKkyC,UAAW/1B,IAAOA,EAAEpa,aAAe8d,EAAiBJ,GAE/F,MAAO,CAAExZ,WAAYu7B,EAAc1mC,QAAQ+P,QAAQ4U,GAAYhZ,SAAU4iE,EAC3E,EAEgBjpE,EAAAumC,OAAhB,SAAuB3mC,EAAcvF,GACnC,OAAOsC,EAAAS,OAAOytC,UACZjrC,EAAKlH,OAAO,CAACC,EAAM6G,IAAQ7C,EAAAS,OAAOgN,IAAIzR,EAAMqH,EAAK4iE,UAAUpjE,EAAKnF,IAAQsC,EAAAS,OAAOE,MAAM,EAAGjD,IACxFA,EAEJ,CACD,CA3XD,CAAiB2F,IAAIvL,EAAAuL,KAAJA,EAAI,ucC/BrB,MAAApI,EAAAxB,EAAA,OAaAgJ,EAAAhJ,EAAA,OACAqG,EAAArG,EAAA,OACA2R,EAAA3R,EAAA,OACAsG,EAAAtG,EAAA,OACAuG,EAAAvG,EAAA,OACAi0E,EAAAj0E,EAAA,OACA6wB,EAAA7wB,EAAA,OAEA,IAAiBshC,GAAjB,SAAiBA,GACf,SAAgBp6B,EAAMwB,GACpB,MAAO,CACLyxD,MAAO,iBACPzxD,OACA4tC,WAAY,EACZnU,IAAK,CACH+C,GAAI3+B,EAAAS,OAAOE,MAAM,EAAG,MACpBoyH,GAAI/yH,EAAAS,OAAOE,MAAM,EAAG,OAEtBqf,OAAQ,CACN,CAAEne,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,GACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,EAAG,MAAOqwC,IAAK,IAExCtB,MAAO,GACPF,SAAS,EAEb,CAEA,SAASquG,EAAS17I,EAAc4tC,EAAoB+tG,EAAeC,GACjE,MAAO,CACLnqF,MAAO,iBACPzxD,OACA4tC,aACAnU,IAAK,CAAE+C,GAAI3+B,EAAAS,OAAOE,MAAMm9I,EAAO,MAAO/qB,GAAI/yH,EAAAS,OAAOE,MAAMo9I,EAAO,OAC9D/9H,OAAQ,CACN,CAAEne,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,GACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,GACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,GACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,EAAG,MAAOqwC,IAAK,GACtC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,IAAK,MAAOqwC,IAAK,GACxC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,KAAM,MAAOqwC,IAAK,GACzC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,GACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,GACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,EAAG,MAAOqwC,IAAK,GACtC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,IAAK,MAAOqwC,IAAK,GACxC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,KAAM,MAAOqwC,IAAK,GACzC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,GAAK,MAAOqwC,IAAK,IAE1CtB,MAAO,GACPF,SAAS,EAEb,CAEA,SAASwuG,EAAS77I,EAAcw8B,EAAco0F,GAC5C,MAAO,CACLn/D,MAAO,iBACPzxD,OACA4tC,WAAY,EACZnU,IAAK,CAAE+C,GAAI3+B,EAAAS,OAAOE,MAAM,EAAG,MAAOoyH,GAAI/yH,EAAAS,OAAOE,MAAM,EAAG,OACtDqf,OAAQ,GACR0vB,MAAO,IAAI/Q,EAAGhjC,IAAKqyB,GAAMhuB,EAAAS,OAAOE,MAAMqtB,EAAG,UAAW+kG,EAAGp3H,IAAKqyB,GAAMhuB,EAAAS,OAAOE,MAAMqtB,EAAG,QAClFwhB,SAAS,EAEb,CAGA,SAAgByuG,EAAgBp7I,GAC9B,MAAMlD,EAAiC,GACvC,IAAK,MAAMrE,KAAM1D,OAAOiE,KAAKgH,GAAM,CACjC,MAAMxH,EAAQwH,EAAIvH,GACL,MAATD,GAAkBA,EAAM8vH,YAC1BxrH,EAAOrE,GAAMD,EAAM8G,OAAQ,EAAApC,EAAAgkE,eAAczoE,GAE7C,CACA,OAAOqE,CACT,CAGA,SAAgBu+I,EAAmBr7I,EAAoB8G,SACrD,MAAMhK,EAASs+I,EAAgBp7I,GAI/B,OAHe,MAAX8G,GAAsC,MAAnBhK,EAAOgK,KAC5BhK,EAAOgK,IAAuB,QAAZpM,EAAAsF,EAAI8G,UAAQ,IAAApM,OAAA,EAAAA,EAAE4E,QAAQ,EAAApC,EAAAgkE,eAAcp6D,IAEjDhK,CACT,CAcA,SAAgBw+I,IACd,OAAAvmJ,OAAAgI,OAAAhI,OAAAgI,OAAA,GACK8tE,EAAAgB,SAASV,oBAAkB,CAC9BwB,QAASquE,EAAS,WAAY,EAAG,GAAI,IACrCxuE,gBAAiBwuE,EAAS,mBAAoB,EAAG,EAAG,GACpD5uE,MAAO4uE,EAAS,gBAAiB,EAAG,GAAI,IACxCtuE,MAAOsuE,EAAS,SAAU,EAAG,GAAI,IACjC9uE,MAAO,CACLnb,MAAO,iBACPzxD,KAAM,QACN4tC,WAAY,EACZnU,IAAK,CAAE+C,GAAI3+B,EAAAS,OAAOE,MAAM,EAAG,MAAOoyH,GAAI/yH,EAAAS,OAAOE,MAAM,EAAG,OACtDqf,OAAQ,CACN,CAAEne,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,IACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,EAAG,MAAOqwC,IAAK,IACtC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,EAAG,MAAOqwC,IAAK,IACtC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,IAAK,MAAOqwC,IAAK,KAE1CtB,MAAO,GACPF,SAAS,GAEX0/B,KAAM8uE,EAAS,OAAQ,CAAC,GAAI,GAAI,GAAI,GAAI,IAAK,CAAC,EAAG,GAAI,GAAI,GAAI,KAC7D1uE,aAAc0uE,EAAS,gBAAiB,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,IAAK,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,MAE1F,CAGA,SAAgBI,EAAav7I,GAC3B,MAAMlD,EAAqC,GAC3C,IAAK,MAAO1D,EAAKlE,KAAUH,OAAOmG,QAAQ8E,GAC3B,MAAT9K,GAAkBA,EAAMozH,WAC1BxrH,EAAOiJ,KAAK,CAAC3M,EAAKlE,IAGtB,OAAO4H,CACT,CAoCA,SAASmgG,EACP9gG,EACAqC,SAEA,IAAIyxE,EACJ,IACEA,EAAYxoD,EAAAta,QAAQszB,SAAStkC,EAASqC,EACxC,CAAE,MAAOvH,GACP,MAAO,CAAE6T,MAAO,CAAE6gB,KAAM,IAC1B,CACA,GAAIskD,EAAUxlE,OAAOnW,OAAS,EAC5B,MAAO,CAAEwW,MAAO,CAAE6gB,KAAMskD,EAAUxlE,OAAO3R,IAAK7B,GAAMA,EAAEkwC,QAAQ7b,OAEhE,MAAM+vE,EAAO,IAAInqE,IACjB,IAAK,MAAMnU,KAAmB0K,EAAAta,QAAQ0jE,uBAAuBZ,GAAY,CACvE,MAAMx3E,EAAKwjI,EAA8Bz9H,EAAUue,EAAgBuL,cACnE,GAAU,MAAN7vB,GAAqB,KAAPA,GAAoB,eAAPA,EAC7B,SAEF,MAAMu0I,EAAoB,QAAZtyI,EAAA2gG,EAAKx8F,IAAIpG,UAAG,IAAAiC,EAAAA,EAAI,GACxB4E,EAAOpC,EAAA0B,SAAS8tI,YAAY3vH,EAAgBzd,KAAMyd,EAAgBuL,aAAc9pB,GACjFwuI,EAAMnnI,SAASvG,IAClB0tI,EAAMjnI,KAAKzG,GAEb+7F,EAAKr7F,IAAIvH,EAAIu0I,EACf,CACA,MAAO,CAAE3xC,OACX,CAmCA,SAAgBmgD,EAAY/iJ,EAAYgjJ,GACtC,MAAMjjJ,EAAQzD,OAAO2mJ,OAAOD,EAAYhjJ,GAAMgjJ,EAAWhjJ,QAAMuJ,EAC/D,GAAa,MAATxJ,EAAe,CACjB,MAAMkC,EAAyBuC,EAAAwC,YAAY2sB,MAAM5zB,IAA3C8vH,UAAEA,GAAS5tH,EACjB,OAD0B8O,EAAA9O,EAApB,cAER,CACA,MAAMihJ,EAAU5mJ,OAAO2mJ,OAAOJ,IAAc7iJ,GAAM6iJ,IAAa7iJ,QAAMuJ,EACrE,OAAkB,MAAX25I,EAAkBA,EAAU79I,GAAM,EAAAZ,EAAAgkE,eAAczoE,GACzD,CAyBA,SAAgBojI,EAAcr9H,GAC5B,OAAOA,EAASktE,KAAK,EACvB,CAEA,SAAgBuwD,EAA8Bz9H,EAAqB8pB,WACjE,GAAoB,MAAhBA,EACF,OAGF,MAAMszH,EAAuE,QAAnDlhJ,EAAA8D,EAAShE,aAAa0C,EAAA0B,SAASw5B,MAAM9P,WAAc,IAAA5tB,OAAA,EAAAA,EAAEhC,UAC/E,OAAyB,MAArBkjJ,EAEKA,EAAkB/f,EAAcr9H,GAAU/F,IAG5CyE,EAAA0B,SAASixE,YAAYvnD,EAAgC,QAAlB7tB,EAAA+D,EAASM,iBAAS,IAAArE,EAAAA,EAAI,IAAI/B,SACtE,CAmBA,SAAgB+zC,EACdjuC,EACA8pB,GAEA,MAAM5vB,EAAYujI,EAA8Bz9H,EAAU8pB,GACpDuzH,EAAahgB,EAAcr9H,GACjC,OAAO9F,EAAYmjJ,EAAWnjJ,UAAUA,QAAasJ,CACvD,CAsBA,SAAgBm2B,EAAiB35B,SAC/B,OAA8B,QAAvB9D,EAAAmhI,EAAcr9H,UAAS,IAAA9D,OAAA,EAAAA,EAAEhC,SAClC,CAhUgBw/B,EAAAp6B,MAAKA,EAwDLo6B,EAAAkjH,gBAAeA,EAYfljH,EAAAmjH,mBAAkBA,EAUlBnjH,EAAA4jH,oBAAhB,SACE97I,EACArH,EACAojJ,GAEA,OAAsC,MAA/BA,EAAepjJ,EAASF,IAAc4iJ,EAAmBr7I,EAAKrH,EAASwyE,uBAAoBnpE,CACpG,EAIgBk2B,EAAAojH,WAAUA,EA2BVpjH,EAAAqjH,aAAYA,EAWZrjH,EAAA8jH,aAAhB,SAA6Bh8I,EAAoBV,GAC/C,IAAI7G,EAAK8P,EAAAsB,WAAWC,YAAY,GAChC,KAAO/U,OAAO2mJ,OAAO17I,EAAKvH,IAAOA,KAAM1D,OAAOJ,WAC5C8D,EAAK8P,EAAAsB,WAAWC,YAAY,GAE9B,MAAO,CAAE9J,IAAGjL,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAOiD,GAAG,CAAEvH,CAACA,GAAKqF,EAAMwB,KAAS7G,KAC/C,EAGgBy/B,EAAA+jH,WAAhB,SAA2BxwE,EAAWzrE,GACpC,MAAMtH,EAA2B,GACjC,IAAK,MAAOU,EAAKlE,KAAUqmJ,EAAav7I,GACtCtH,EAAUU,GAAO6D,EAAAwC,YAAY2sB,MAAMl3B,GAErC,OAAAH,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAY0uE,GAAG,CAAE/yE,aACnB,EAGgBw/B,EAAAgkH,kBAAhB,SAAkCl8I,EAAoBvH,GACpD,MAAMD,EAAQwH,EAAIvH,GAClB,OAAa,MAATD,EACKwH,EAETjL,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYiD,GAAG,CAAEvH,CAACA,GAAG1D,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAOvE,GAAK,CAAE8vH,WAAW,KAChD,EAyCgBpwF,EAAAikH,YAAhB,SACEhgJ,EACAqC,EACA49I,GAEA,MAAMt/I,EAASmgG,EAAc9gG,EAASqC,GACtC,GAAI,UAAW1B,EACb,OAAOA,EAET,MAAMu/I,EAA4B,MAAfD,EAAsBn/C,EAAcm/C,EAAa59I,QAAYwD,EAC1Es6I,EAAwB,MAAdD,GAAsB,SAAUA,EAAaA,EAAWhhD,KAAO,IAAInqE,IAC7EqrH,EAAe1gB,EAAcr9H,GAAU9F,UACvC8jJ,EAA2B,GAC3BC,EAA0B,GAChC,IAAK,MAAOhkJ,EAAIqG,KAAchC,EAAOu+F,KAAM,CACzC,GAAIihD,EAAQ1mJ,IAAI6C,GACd,SAEF,MAAMD,EAAQzD,OAAO2mJ,OAAOa,EAAc9jJ,GAAM8jJ,EAAa9jJ,QAAMuJ,EACtD,MAATxJ,EACFgkJ,EAAQz2I,KAAK,CAAEtN,KAAIqG,cACVtG,EAAM8vH,WACfm0B,EAAO12I,KAAK,CAAEtN,KAAIqG,aAEtB,CACA,MAAO,CAAE09I,UAASC,SACpB,EAIgBvkH,EAAAsjH,YAAWA,EAoBXtjH,EAAAwkH,eAAhB,SAA+BjB,EAA2Bc,GACxD,MAAMz/I,EAAyB,GAC/B,IAAK,MAAOrE,KAAO8iJ,EAAaE,GAAa,CAC3C,MAAMjjJ,EAAQzD,OAAO2mJ,OAAOa,EAAc9jJ,GAAM8jJ,EAAa9jJ,QAAMuJ,EACnE,GAAa,MAATxJ,IAAkBA,EAAM8vH,UAC1B,SAEF,MAAM9oH,EAASg8I,EAAY/iJ,EAAIgjJ,GAC/B3+I,EAAOiJ,KAAK,CAAEtN,KAAI6G,KAAME,EAAOF,OAAQ,EAAApC,EAAAgkE,eAAczoE,GAAK+G,SAAQi9I,OAAiB,MAATjkJ,GAC5E,CACA,OAAOsE,CACT,EAEgBo7B,EAAA2jG,cAAaA,EAIb3jG,EAAA+jG,8BAA6BA,EAc7B/jG,EAAAykH,gCAAhB,SACEn+I,EACA8pB,GAEA,MAAM5vB,EAAYujI,EAA8Bz9H,EAAU8pB,GAC1D,GAAiB,MAAb5vB,EACF,OAEF,MACM6jJ,EADa1gB,EAAcr9H,GACD9F,UAAUA,GAC1C,OAAoB,MAAhB6jJ,GAAwBA,EAAaj0B,eAAzC,EAGai0B,EAAaj9I,OACX,EAAApC,EAAAgkE,eAAcxoE,EAC/B,EAEgBw/B,EAAAuU,gCAA+BA,EAU/BvU,EAAAo9E,iBAAhB,SAAiC92G,EAAqB8pB,WACpD,QAAyE,QAAhE7tB,EAAuD,QAAvDC,EAAA+xC,EAAgCjuC,EAAU8pB,UAAa,IAAA5tB,OAAA,EAAAA,EAAEiyC,eAAO,IAAAlyC,GAAAA,EAC3E,EAEgBy9B,EAAA4T,gCAAhB,SAAgDttC,EAAqB8pB,SACnE,MAAM5vB,EAAY+zC,EAAgCjuC,EAAU8pB,GAC5D,OAAsB,QAAf5tB,EAAAhC,aAAS,EAATA,EAAWmC,YAAI,IAAAH,EAAAA,EAAI8D,EAASS,KACrC,EAEgBi5B,EAAAi8E,uBAAhB,SAAuC31G,EAAqB8pB,GAC1D,MAAM5vB,EAAY+zC,EAAgCjuC,EAAU8pB,GACtDs0H,EAAgBlkJ,aAAS,EAATA,EAAWmC,KACjC,OAAwB,MAAjB+hJ,GAAyBA,IAAkBp+I,EAASS,WAAQ+C,EAAY46I,CACjF,EAEgB1kH,EAAA2kH,iBAAhB,SAAiCr+I,EAAqBpF,SACpD,OAAiC,QAA1BsB,EAAAy9B,EAAiB35B,UAAS,IAAA9D,OAAA,EAAAA,EAAGtB,EACtC,EAEgB8+B,EAAAC,iBAAgBA,EAIhBD,EAAA+U,cAAhB,SAA8BT,EAA+B3xC,SAC3D,OAIM,QAHJH,EAAAkF,EAAAC,gBAAgB5G,KACduzC,EAAcrvB,OAAO9hB,OAAQ+C,GAAMA,EAAEY,OAAOnE,OAASA,GACrD,CAAC9D,EAAG6D,IAAMuC,EAAAS,OAAOkvC,QAAQ/1C,EAAEiI,OAAQpE,EAAEoE,SACrC,UAAE,IAAAtE,OAAA,EAAAA,EAAEsE,SAAU7B,EAAAS,OAAOE,MAAM,EAAGjD,EAEpC,EAEgBq9B,EAAA4kH,eAAhB,SACElhB,EACAE,GAGA,OADgBpnI,MAAMP,KAAK,IAAIiH,IAAI,IAAI6B,EAAAwC,YAAYzG,KAAK8iI,MAAkB7+H,EAAAwC,YAAYzG,KAAK4iI,MAC5E1iI,OAAiD,CAACgsE,EAAK5lE,KACpE,MAAMy9I,EAAmBjhB,EAAax8H,GAChC09I,EAAmBphB,EAAat8H,GAuBtC,OAtBwB,MAApBy9I,GAAgD,MAApBC,EAC9B93E,EAAI5lE,GAAQy9I,EACiB,MAApBA,GAAgD,MAApBC,EACrC93E,EAAI5lE,GAAQ09I,EACiB,MAApBD,GAAgD,MAApBC,IACrC93E,EAAI5lE,GAAKvK,OAAAgI,OAAAhI,OAAAgI,OAAA,GACJigJ,GAAgB,CACnBjkH,IAAKgkH,EAAiBhkH,IACtB4T,QAASowG,EAAiBpwG,QAC1BxvB,OAAQvd,EAAAC,gBAAgBo9I,SACtBD,EAAiB7/H,OACjB4/H,EAAiB5/H,OAChB+/H,GAAO,GAAGA,EAAGl+I,OAAO9J,QAAQgoJ,EAAGl+I,OAAOnE,QAEzCqyC,WAAY6vG,EAAiB7vG,WAC7BL,MAAOjtC,EAAAC,gBAAgBo9I,SACrBD,EAAiBnwG,MACjBkwG,EAAiBlwG,MAChBqwG,GAAO,GAAGA,EAAGhoJ,QAAQgoJ,EAAGriJ,WAIxBqqE,GACN,GACL,EAEgBhtC,EAAAilH,mBAAhB,SAAmC79I,EAAc+uC,GAC/C,MAAM+uG,EAAsBhlJ,EAAA4uH,WAAW97F,KAAMmiB,GAAOA,IAAO/tC,EAAKyK,eAChE,GAAIqzI,EACF,OAAOA,EAIT,OAD6BhlJ,EAAA4uH,WAAW97F,KAAMmiB,IAAO,EAAAnwC,EAAAgkE,eAAc7zB,GAAItjC,gBAAkBzK,EAAKyK,gBAKnE9M,EAAAwC,YAAYzG,KAAKq1C,GAAqB,IAAInjB,KAAMmiB,IAClE,EAAAnwC,EAAAgkE,eAAc7zB,GAAItjC,gBAAkBzK,EAAKyK,cAGpD,CACD,CA9XD,CAAiBmuB,IAASjjC,EAAAijC,UAATA,EAAS,yGCpB1B,MAAAqC,EAAA3jC,EAAA,OACA0jC,EAAA1jC,EAAA,OAEA,IAAiB8yC,GAAjB,SAAiBA,GACCA,EAAAD,cAAhB,SAA8BpzB,GAC5BikB,EAAA2P,SAASC,OAAO,aAAa3P,EAAA4P,UAAUC,eAAepmB,KAAK+X,cAAe1hC,KAAKC,UAAU+b,EAAS,KAAM,GAC1G,CACD,CAJD,CAAiBqzB,IAAcz0C,EAAAy0C,eAAdA,EAAc,6YCU/Bz0C,EAAA42D,cAAA,SAA8B1rD,SAC5B,MAAO8Q,EAAO0Q,IAAY,EAAAvB,EAAAlW,UAA2B,QAAlBxP,EAAAyF,EAAMyhB,oBAAY,IAAAlnB,EAAAA,EAAI,KAClDonB,EAAWC,IAAgB,EAAA3B,EAAAlW,WAAS,IACpCY,EAAOkX,IAAY,EAAA5B,EAAAlW,eAA6BlI,IAChD+2I,EAASC,IAAc,EAAA54H,EAAAlW,WAAS,IAChC+uI,EAAWC,IAAgB,EAAA94H,EAAAlW,UAAS,GA8B3C,OA5BA,EAAAkW,EAAAC,WAAU,KACR,GAAI44H,GAAa,EACf,OAEF,MAAMz3I,EAAQy6B,WAAW,KACvBi9G,EAAaD,EAAY,IACxB,KACH,MAAO,IAAMt7C,aAAan8F,IACzB,CAACy3I,KAqBF,EAAAp4I,EAAA2B,MAAA,OAAAxB,SAAA,EACE,EAAAH,EAAAC,KAAA,MAAIC,UAAU,qCAAoCC,SAAA,4BACjD8gB,GACC,EAAAjhB,EAAAC,KAAA,OAAKC,UAAU,mBAAkBC,UAC/B,EAAAH,EAAAC,KAACohB,EAAAC,YAAW,CAACC,MAAO,GAAIrW,OAAQ,QAGlC,EAAAlL,EAAA2B,MAAA,QAAM6f,SA1BgBprB,GAA2BqrB,EAAAruB,UAAA,qBACrDgD,EAAEsrB,iBACFP,OAAShgB,GACT+f,GAAa,GACb,UACQ5hB,EAAM6iB,gBAAgB/R,GAI5B+nI,GAAW,GACXE,EAAa,IACbn3H,GAAa,EACf,CAAE,MAAOlZ,GACPmZ,EAASnZ,aAAekG,MAAQlG,EAAIjD,QAAU,6BAC9Cmc,GAAa,EACf,CACF,GAUkC/gB,SAAA,EAC1B,EAAAH,EAAAC,KAAA,OAAKC,UAAU,OAAMC,UACnB,EAAAH,EAAAC,KAAC2hB,EAAAzW,MAAK,CACJ9C,MAAM,QACNzD,KAAK,QACLiE,WAAW,mBACX0B,gBAAgB,EAChBsX,UAAU,EACVpZ,gBAAgB,oBAChBpU,MAAO+b,EACPxH,WAAW,UACXN,cAAgBrM,IACVA,EAAO4I,SACTic,EAAS7kB,EAAOgH,OAGpB6e,YAAY,qBAaf7X,IACC,EAAAjK,EAAAC,KAAA,OAAKC,UAAU,2CAA0C,UAAS,mBAAkBC,SACjF8J,KAGL,EAAAjK,EAAAC,KAAA,OAAKC,UAAU,mBAAkBC,UAC/B,EAAAH,EAAAC,KAAC8hB,EAAAC,OAAM,CACLvjB,KAAK,oBACLsH,KAAK,SACLnB,KAAK,SAAQ,UACL,oBACRqd,UAAW7R,GAASgoI,EAAY,EAACj4I,SAEhC+3I,EAAWE,EAAY,EAAI,aAAaA,KAAe,oBAAuB,sBAQlF94I,EAAM2rD,kBACL,EAAAjrD,EAAAC,KAAA,OAAKC,UAAU,mBAAkBC,UAC/B,EAAAH,EAAAC,KAAA,UACE2E,KAAK,SACL1E,UAAU,2CACVigB,QAAS,IAAM7gB,EAAM2rD,gBAAiB76C,GAAM,UACpC,6BAA4BjQ,SAAA,qCAM1C,EAAAH,EAAAC,KAAA,OAAKC,UAAU,mBAAkBC,UAC/B,EAAAH,EAAAC,KAAC8hB,EAAAC,OAAM,CACLvjB,KAAK,kBACLsH,KAAK,SACLqc,WAAW,KACXjC,QAAS7gB,EAAM+iB,OAAM,UACb,kBAAiBliB,SAAA,gBASvC,mBArIAof,EAAAxpB,EAAA,OACAgsB,EAAAhsB,EAAA,OACA6rB,EAAA7rB,EAAA,MACAsrB,EAAAtrB,EAAA,gCCYA,IAAIymJ,EAEJ,IAAiB79H,wEAAjB,SAAiBA,GAyBf,SAAgB6iD,IACd,MACoB,oBAAXl+D,WACJA,OAAOm5I,QAAUn5I,OAAOm5I,OAAOC,iBAAmBp5I,OAAOm5I,OAAOC,gBAAgBC,iBAEvF,CAEA,SAAgBC,EAAmBrjE,GACjC,OAAK56D,EAAY6iD,QAGV,IAAI7mC,QAASC,IAClBuN,EAAMoxC,GACgB,MAAlBijE,GACFl5I,OAAOqgG,oBAAoB,UAAW64C,GAExCA,EAAkB9mI,UACS,iBAAX,QAAV7b,EAAA6b,EAAMzS,YAAI,IAAApJ,OAAA,EAAAA,EAAE+K,QACQ,MAAlB43I,IACFl5I,OAAOqgG,oBAAoB,UAAW64C,GACtCA,OAAiBr7I,GAEnBy5B,EAAQllB,EAAMzS,QAGlBK,OAAOyqF,iBAAiB,UAAWyuD,KAhB5B7hH,QAAQC,aAAQz5B,EAkB3B,CAEA,SAAgB07I,EAAuBtjE,GACrC,OAAK56D,EAAY8iD,YAGV,IAAI9mC,QAASC,IAClBwN,EAAUmxC,GACY,MAAlBijE,GACFl5I,OAAOqgG,oBAAoB,UAAW64C,GAExCA,EAAkB9mI,UACS,qBAAX,QAAV7b,EAAA6b,EAAMzS,YAAI,IAAApJ,OAAA,EAAAA,EAAE+K,QACQ,MAAlB43I,IACFl5I,OAAOqgG,oBAAoB,UAAW64C,GACtCA,OAAiBr7I,GAEnBy5B,EAAQllB,EAAMzS,QAGlBK,OAAOyqF,iBAAiB,UAAWyuD,KAhB5B7hH,QAAQC,aAAQz5B,EAkB3B,CAEA,SAAgByd,EAAgB26D,GAC9B,MAAMujE,EAAc30G,EAAMoxC,GACpBwjE,EAAkB30G,EAAUmxC,GAClC,OAAOujE,GAAeC,CACxB,CAYA,SAAgB50G,EAAMoxC,GACpB,SACoB,oBAAXj2E,QACPA,OAAOm5I,QACPn5I,OAAOm5I,OAAOC,iBACdp5I,OAAOm5I,OAAOC,gBAAgBC,oBAE9Br5I,OAAOm5I,OAAOC,gBAAgBC,iBAAiB9tI,YAAY0qE,IACpD,EAIX,CAEA,SAAgBnxC,EAAUmxC,GACxB,QAAsB,oBAAXj2E,SAA0BA,OAAO05I,kBAC1C15I,OAAO05I,gBAAgBC,YAAYzjJ,KAAKC,UAAU8/E,IAC3C,GAIX,CAEA,SAAgB9X,IACd,MAAyB,oBAAXn+D,UAA4BA,OAAO05I,eACnD,CApHgBr+H,EAAAijD,cAAhB,WACE,OAAOxJ,SAAS90D,OAAO25G,kBAAoB,IAAK,GAClD,EAEgBt+F,EAAAu+H,WAAhB,WACE,OAAO9kF,SAAS90D,OAAOy5G,eAAiB,IAAK,GAC/C,EAEgBp+F,EAAAmjD,kBAAhB,WACE,OAAO1J,SAAS90D,OAAO05G,sBAAwB,IAAK,GACtD,EAEgBr+F,EAAAd,MAAhB,SAAsB9Y,GACpB6Z,EAAgB,CAAEha,KAAM,QAASvQ,MAAO0Q,GAC1C,EAEgB4Z,EAAAkjD,eAAhB,iBACE,OAAOzJ,UAAiC,QAAxBv+D,EAAAyJ,OAAOw5G,yBAAiB,IAAAjjH,OAAA,EAAAA,EAAEP,aAAc,IAAK,GAC/D,EAEgBqlB,EAAAonB,eAAhB,WACE,OAAOy7B,KAAWC,GACpB,EAEgB9iD,EAAA6iD,MAAKA,EAOL7iD,EAAAi+H,gBAAeA,EAsBfj+H,EAAAk+H,oBAAmBA,EAsBnBl+H,EAAAC,gBAAeA,EAMfD,EAAAw+H,0BAAhB,SAA6C5jE,GAC3C,OAAI56D,EAAY6iD,QACPo7E,EAAgBrjE,GACd56D,EAAY8iD,YACdo7E,EAAoBtjE,GAEpB5+C,QAAQC,aAAQz5B,EAE3B,EAEgBwd,EAAAwpB,MAAKA,EAcLxpB,EAAAypB,UAASA,EASTzpB,EAAA8iD,UAASA,CAG1B,CAtHD,CAAiB9iD,IAAWvqB,EAAAuqB,YAAXA,EAAW,iFCP5BvqB,EAAA0rB,WAAA,SAA2BxgB,GAUzB,MAAO89I,EAAYC,IAAiB,EAAA99H,EAAAlW,WAAS,IACtCi0I,EAAoBC,IAAyB,EAAAh+H,EAAAlW,WAAS,GACvDoyB,EAAU,IAAIxC,EAAArsB,QAAQtN,EAAM+D,QAElC,OACE,EAAArD,EAAA2B,MAAA,OAAKqwB,MAAM,4BAA4BxnB,MAAO,CAAEoV,SAAU,GAAGtgB,EAAMsgB,cAAczf,SAAA,EAC/E,EAAAH,EAAA2B,MAAA,OAAKqwB,MAAM,oBAAmB7xB,SAAA,EAC5B,EAAAH,EAAA2B,MAAA,OAAKzB,UAAU,0CAAyCC,SAAA,EACtD,EAAAH,EAAAC,KAAA,OAAAE,UACE,EAAAH,EAAAC,KAAA,UAAQC,UAAU,uCAAuCigB,QAAS,IAAMk9H,GAAc,GAAKl9I,UACzF,EAAAH,EAAAC,KAACu9I,EAAAznH,cAAa,SAGlB,EAAA/1B,EAAAC,KAAA,OAAAE,UACE,EAAAH,EAAAC,KAAA,KAAG2V,KAAK,IAAIoc,MAAM,mDAAkD7xB,UAClE,EAAAH,EAAAC,KAAA,OACEC,UAAU,sBACVsK,MAAO,CAAE+W,MAAO,QAASrW,OAAQ,SACjCu6F,IAAI,wBACJ+Y,IAAI,8BAIV,EAAAx+G,EAAAC,KAAA,OAAKC,UAAU,0DAAyDC,SAAA,uBACxE,EAAAH,EAAAC,KAAA,UAAQkgB,QAAS,IAAMo9H,GAAsB,GAAOr9I,UAAU,cAAaC,UACzE,EAAAH,EAAAC,KAACw9I,EAAA1xH,SAAQ,CACPziB,KAAM,GACN0iB,MAAO1sB,EAAMygB,SAAWzgB,EAAM2gB,UAAY,0BAA4B,4BAGzE3gB,EAAMo+I,cAAe,EAAA19I,EAAAC,KAAA,OAAKC,UAAU,OAAMC,SAAEb,EAAMo+I,iBAEpDN,IACC,EAAAp9I,EAAAC,KAAC09I,EAAAC,YAAW,CAACjkE,UAAWyjE,EAAYS,QAAS,IAAMR,GAAc,GAAMl9I,UACrE,EAAAH,EAAA2B,MAAA,OAAKzB,UAAU,MAAKC,SAAA,EAClB,EAAAH,EAAAC,KAAC69I,EAAAC,gBAAe,CACdt/I,KAAK,UACL0hB,QAAS,KACPk9H,GAAc,GACdE,GAAsB,IACvBp9I,UAED,EAAAH,EAAAC,KAAA,QACEC,UAAW,sBAAqBZ,EAAMygB,SAAWzgB,EAAM2gB,UAAY,oBAAsB,mBAAmB9f,SAAA,cAK/G69I,EAAmB1+I,EAAMygB,QAASzgB,EAAM0gB,QAAQ/nB,IAAI,EAAEc,EAAMwjH,MAEzD,EAAAv8G,EAAAC,KAAC69I,EAAAC,gBAAe,CAACt/I,KAAM1F,EAAIoH,SACxBb,EAAM2G,UAAYs2G,GACjB,EAAAv8G,EAAAC,KAAA,QAAMC,UAAU,8BAA6BC,SAAEpH,KAE/C,EAAAiH,EAAAC,KAAA,KAAGC,UAAU,oBAAoB0V,KAAM2mG,EAAIp8G,SACxCpH,QAMX,EAAAiH,EAAAC,KAAA,MAAIC,UAAU,0CAAyCC,UACrD,EAAAH,EAAAC,KAACg+I,EAAW,YAKpB,EAAAj+I,EAAA2B,MAAA,OAAKzB,UAAU,qCAAoCC,SAAA,EACjD,EAAAH,EAAAC,KAAA,OAAAE,UACE,EAAAH,EAAAC,KAAA,KAAG2V,KAAK,IAAIoc,MAAM,iCAAgC7xB,UAChD,EAAAH,EAAAC,KAAA,OACEC,UAAU,sBACVsK,MAAO,CAAE+W,MAAO,MAAOrW,OAAQ,OAC/Bu6F,IAAI,wBACJ+Y,IAAI,8BAIV,EAAAx+G,EAAA2B,MAAA,OAAKzB,UAAU,2BAA0BC,SAAA,EACvC,EAAAH,EAAAC,KAAA,MAAIC,UAAU,8DAA6DC,SACxE69I,EAAmB1+I,EAAMygB,QAASzgB,EAAM0gB,QAAQ/nB,IAAI,EAAEc,EAAMwjH,MAEzD,EAAAv8G,EAAAC,KAAA,MAAIC,UAAU,gDAA+CC,SAC1Db,EAAM2G,UAAYs2G,GACjB,EAAAv8G,EAAAC,KAAA,UAAQC,UAAU,mBAAkBC,SAAEpH,KAEtC,EAAAiH,EAAAC,KAAA,KAAGC,UAAU,iBAAiB0V,KAAM2mG,EAAIp8G,SACrCpH,UAOb,EAAAiH,EAAA2B,MAAA,OAAKzB,UAAU,wCAAuCC,SAAA,EACpD,EAAAH,EAAAC,KAAA,MAAIC,UAAU,iBAAgBC,UAC5B,EAAAH,EAAAC,KAACg+I,EAAW,OAEd,EAAAj+I,EAAAC,KAAA,OAAKC,UAAU,8BAA8BsK,MAAO,CAAE+W,MAAO,MAAOrW,OAAQ,WAC5E,EAAAlL,EAAAC,KAAA,OAAKC,UAAU,gDAA+CC,UAC5D,EAAAH,EAAAC,KAAA,UAAQkgB,QAAS,IAAMo9H,GAAsB,GAAOr9I,UAAU,MAAKC,UACjE,EAAAH,EAAAC,KAACw9I,EAAA1xH,SAAQ,CACPziB,KAAM,GACN0iB,MAAO1sB,EAAMygB,SAAWzgB,EAAM2gB,UAAY,0BAA4B,0CAQnFq9H,IACC,EAAAt9I,EAAAC,KAACi+I,EAAY,CACXn+H,QAASzgB,EAAMygB,QACfG,aAAc5gB,EAAM4gB,aACpBub,QAASA,EACToiH,QAAS,IAAMN,GAAsB,OAK/C,mBA7IAh+H,EAAAxpB,EAAA,OACAynJ,EAAAznJ,EAAA,OACAooJ,EAAApoJ,EAAA,OACA+nJ,EAAA/nJ,EAAA,OACA4nJ,EAAA5nJ,EAAA,OACA0nJ,EAAA1nJ,EAAA,OAEAqoJ,EAAAroJ,EAAA,OACAkjC,EAAAljC,EAAA,MAuIA,SAASioJ,EAAiBK,EAAqBr+H,GAC7C,MAAM+rB,EAAuC,CAAC,CAAC,QAAS,MAIxD,OAHc,MAAV/rB,GACF+rB,EAAM7mC,KAAK,CAAC,MAAO8a,IAEd+rB,CACT,CAEA,SAASkyG,IACP,OACE,EAAAj+I,EAAAC,KAAA,MAAIC,UAAU,kCAAiCC,UAC7C,EAAAH,EAAAC,KAAA,KACE2V,KAAK,qCACLpL,MAAO,CACLgyG,WAAY,SACZC,mBAAoB,MACpBL,eAAgB,MAChBC,gBAAiB,+BAEnBn8G,UAAU,6EAA4EC,UAEtF,EAAAH,EAAAC,KAAA,QAAAE,SAAA,aAIR,CASA,SAAS+9I,EAAa5+I,GACpB,OACE,EAAAU,EAAAC,KAACm+I,EAAAE,MAAK,CAACT,QAASv+I,EAAMu+I,QAASU,iBAAiB,EAAIp+I,UAClD,EAAAH,EAAAC,KAACk+I,EAAAh3F,QAAO,CAACpnC,QAASzgB,EAAMygB,QAASG,aAAc5gB,EAAM4gB,aAAc7c,OAAQ/D,EAAMm8B,QAAQp4B,UAG/F,6BC3KAnP,OAAAC,eAAAC,EAAA,cAA+CC,OAAA,IAC/CD,EAAAkB,MAAgBlB,EAAAmB,KAAenB,EAAAs/C,KAAet/C,EAAAk7F,QAAkBl7F,EAAAsqH,UAAoBtqH,EAAAi7F,IAAcj7F,EAAAwqH,MAAgBxqH,EAAAuqH,QAAkBvqH,EAAA6D,IAAc7D,EAAAywH,eAAiB,EACnK,IAAA/uH,EAAiBC,EAAQ,OACzB8tH,EAAgB9tH,EAAQ,OASxB3B,EAAAywH,UADA,SAAAtvH,EAAAD,GAAyC,OAAUC,KAAAA,EAAAD,MAAAA,EAA0B,EAiB7ElB,EAAA6D,IALA,SAAAzB,GACA,gBAAAR,GACA,SAAA5B,EAAAywH,YAAA,EAAAzwH,EAAAmB,MAAAS,GAAAQ,GAAA,EAAApC,EAAAkB,OAAAU,IACA,CACA,EAaA5B,EAAAuqH,QALA,SAAAnoH,GACA,gBAAAR,GACA,SAAA5B,EAAAywH,WAAAruH,GAAA,EAAApC,EAAAmB,MAAAS,KAAA,EAAA5B,EAAAkB,OAAAU,GACA,CACA,EAaA5B,EAAAwqH,MALA,SAAApoH,EAAAqJ,GACA,gBAAA7J,GACA,SAAA5B,EAAAywH,WAAAruH,GAAA,EAAApC,EAAAmB,MAAAS,IAAA6J,GAAA,EAAAzL,EAAAkB,OAAAU,IACA,CACA,EAMA5B,EAAAi7F,IAAW,YAKXj7F,EAAAsqH,UAAiB,CACjBrvB,IAAAj7F,EAAAi7F,IACAsvB,QAlDA,SAAA3oH,EAAAQ,GAAkC,SAAAV,EAAA0vB,MAAAxvB,GAAA,EAAA5B,EAAAuqH,SAAAnoH,GAAA,EAmDlCooH,MAlDA,SAAA5oH,EAAA6J,EAAArJ,GAAmC,SAAAV,EAAA0vB,MAAAxvB,GAAA,EAAA5B,EAAAwqH,OAAA/+G,EAAArJ,GAAA,GAwDnCpC,EAAAk7F,QAAe,CACfD,IAAAj7F,EAAAi7F,IACAp3F,IA5DA,SAAAjC,EAAAQ,GAA8B,SAAAV,EAAA0vB,MAAAxvB,GAAA,EAAA5B,EAAA6D,KAAAzB,GAAA,GAkE9BpC,EAAAs/C,MAAY,EAAAmwE,EAAAnwE,MAAAt/C,EAAAk7F,SAQZl7F,EAAAmB,KADA,SAAAmmB,GAA0B,OAAAA,EAAAnmB,IAAA,EAM1BnB,EAAAkB,MADA,SAAAomB,GAA2B,OAAAA,EAAApmB,KAAA,0YCjF3BlB,EAAAs2D,kBAAA,SAAkCprD,GAChC,MAAO8Q,EAAO0Q,IAAY,EAAAvB,EAAAlW,UAAS/J,EAAMgqD,cAAgB,KAClDz4C,EAAU2tI,IAAe,EAAAj/H,EAAAlW,UAAS/J,EAAMkqD,iBAAmB,KAC3D74C,EAAUqQ,IAAe,EAAAzB,EAAAlW,UAAS,KAClCuzE,EAAiBC,IAAsB,EAAAt9D,EAAAlW,UAAS,KAChDuH,EAAe6tI,IAAoB,EAAAl/H,EAAAlW,WAAS,IAC5Cq1I,EAAaC,IAAkB,EAAAp/H,EAAAlW,WAAS,IACxC4X,EAAWC,IAAgB,EAAA3B,EAAAlW,WAAS,IACpCY,EAAOkX,IAAY,EAAA5B,EAAAlW,eAA6BlI,GACjDy9I,GAAU,EAAAr/H,EAAA8T,QAAuB,MACjCwrH,GAAa,EAAAt/H,EAAA8T,UAAS/zB,EAAMsrD,WAC5Bk0F,GAAmB,EAAAv/H,EAAA8T,aAAkClyB,GACrD49I,GAAa,EAAAx/H,EAAA8T,QAAO/zB,EAAMurD,SAChCk0F,EAAW94I,QAAU3G,EAAMurD,QAG3B,MAAMm0F,EAAgB,IAA0Bv9H,EAAAruB,UAAA,qBAC9C,MAAM6rJ,EAAQF,EAAW94I,SACrB44I,EAAW54I,SAAYg5I,IAGtBH,EAAiB74I,UACpB64I,EAAiB74I,QAAUg5I,IACxB9wH,KAAK,KACJ0wH,EAAW54I,SAAU,IAEtBi5I,QAAQ,KACPJ,EAAiB74I,aAAU9E,WAG3B29I,EAAiB74I,QACzB,GAsEA,OApEA,EAAAsZ,EAAAC,WAAU,KACR,MAAMmnF,EAAOi4C,EAAQ34I,QACrB,IAAK0gG,IAASrnG,EAAMurD,SAAWg0F,EAAW54I,QACxC,OAGF,MAAMyoF,EAAWh5E,IACVA,EAAMypI,YAAaN,EAAW54I,SAGnC+4I,IACG7wH,KAAK,KACJixH,EAAa1zH,QAASjtB,GAASkoG,EAAKhD,oBAAoBllG,EAAMiwF,GAAS,MAExE96E,MAAM,SAGX,OADAwrI,EAAa1zH,QAASjtB,GAASkoG,EAAK5Y,iBAAiBtvF,EAAMiwF,GAAS,IAC7D,KACL0wD,EAAa1zH,QAASjtB,GAASkoG,EAAKhD,oBAAoBllG,EAAMiwF,GAAS,MAExE,KAiDD,EAAA1uF,EAAA2B,MAAA,OAAK2D,IAAKs5I,EAAOz+I,SAAA,EACf,EAAAH,EAAAC,KAAA,MAAIC,UAAU,qCAAoCC,SAC/Cb,EAAMurD,SAAWvrD,EAAMsrD,UAAY,sBAAwB,mBAE7DtrD,EAAMgqD,eACL,EAAAtpD,EAAAC,KAAA,OAAKC,UAAU,oHAAmHC,SAAA,2FAInI8gB,GACC,EAAAjhB,EAAAC,KAAA,OAAKC,UAAU,mBAAkBC,UAC/B,EAAAH,EAAAC,KAACohB,EAAAC,YAAW,CAACC,MAAO,GAAIrW,OAAQ,QAGlC,EAAAlL,EAAA2B,MAAA,QAAM6f,SAhDgBprB,GAA2BqrB,EAAAruB,UAAA,qBAKrD,GAJAgD,EAAEsrB,iBACFP,OAAShgB,IAGJ0P,EAASyG,OAEZ,YADA6J,EAAS,wBAKX,MAAM27D,GAxBkBC,EAwBepsE,GAvB/Bld,OAAS,EACR,yCAEJ,KAAK4mB,KAAK0iE,IAGX,IAAIx6B,aAAcC,OAAOu6B,GAAKtpF,OAAS,GAClC,8CADT,EAFS,4CALc,IAACspF,EAyBxB,GAAID,EACF37D,EAAS27D,QAKX,GAAInsE,IAAaisE,EAAjB,CAKA17D,GAAa,GACb,UACQ89H,UACA1/I,EAAMwrD,WAAW16C,EAAOO,EAAUE,EAASyG,OAAQ1G,EAC3D,CAAE,MAAO5I,GACPmZ,EAASnZ,aAAekG,MAAQlG,EAAIjD,QAAU,4BAC9Cmc,GAAa,EACf,CATA,MAFEC,EAAS,yBAYb,GAiBkChhB,SAAA,CACzBb,EAAMgqD,cACL,EAAAtpD,EAAA2B,MAAA,OAAKzB,UAAU,OAAMC,SAAA,EACnB,EAAAH,EAAAC,KAAA,OAAKC,UAAU,wBAAuBC,SAAA,WACtC,EAAAH,EAAAC,KAAA,OAAKC,UAAU,UAAS,UAAS,4BAA2BC,SACzDb,EAAMgqD,gBAET,EAAAtpD,EAAAC,KAAA,OAAKC,UAAU,mCAAkCC,SAAA,oGAKnD,EAAAH,EAAAC,KAAA,OAAKC,UAAU,OAAMC,UACnB,EAAAH,EAAAC,KAAC2hB,EAAAzW,MAAK,CACJ9C,MAAM,QACNzD,KAAK,QACLiE,WAAW,uBACX0B,gBAAgB,EAChBsX,UAAU,EACVpZ,gBAAgB,oBAChBpU,MAAO+b,EACPxH,WAAW,UACXN,cAAgBrM,IACVA,EAAO4I,SACTic,EAAS7kB,EAAOgH,OAGpB6e,YAAY,sBAIlB,EAAA9hB,EAAAC,KAAA,OAAKC,UAAU,OAAMC,UACnB,EAAAH,EAAAC,KAAC2hB,EAAAzW,MAAK,CACJ9C,MAAM,aACNzD,KAAK,OACLiE,WAAW,0BACX0B,gBAAgB,EAChBsX,UAAU,EACVpZ,gBAAgB,uBAChBpU,MAAOwc,EACPjI,WAAW,UACXN,cAAgBrM,IACVA,EAAO4I,UACT25I,EAAYviJ,EAAOgH,MACnBke,OAAShgB,KAGb2gB,YAAY,iBAGhB,EAAA9hB,EAAAC,KAAA,OAAKC,UAAU,OAAMC,UACnB,EAAAH,EAAAC,KAAC2hB,EAAAzW,MAAK,CACJ9C,MAAM,aACNzD,KAAK,WACLiE,WAAW,0BACX0B,gBAAgB,EAChBsX,UAAU,EACVpZ,gBAAgB,uBAChBpU,MAAOsc,EACP/H,WAAW,UACXN,cAAgBrM,IACVA,EAAO4I,UACTmc,EAAY/kB,EAAOgH,MACnBke,OAAShgB,KAGb2gB,YAAY,sBAGhB,EAAA9hB,EAAAC,KAAA,OAAKC,UAAU,OAAMC,UACnB,EAAAH,EAAAC,KAAC2hB,EAAAzW,MAAK,CACJ9C,MAAM,qBACNzD,KAAK,WACLiE,WAAW,kCACX0B,gBAAgB,EAChBsX,UAAU,EACVpZ,gBAAgB,+BAChBpU,MAAOuoF,EACPh0E,WAAW,UACXN,cAAgBrM,IACVA,EAAO4I,UACTg4E,EAAmB5gF,EAAOgH,MAC1Bke,OAAShgB,KAGb2gB,YAAY,wBAGhB,EAAA9hB,EAAA2B,MAAA,OAAKzB,UAAU,mCAAkCC,SAAA,2BAE/C,EAAAH,EAAA2B,MAAA,MAAIzB,UAAU,iBAAgBC,SAAA,EAC5B,EAAAH,EAAAC,KAAA,MAAAE,SAAA,2BACA,EAAAH,EAAAC,KAAA,MAAAE,SAAA,8BAGHb,EAAMqrD,YACL,EAAA3qD,EAAAC,KAAA,OAAKC,UAAU,wDAAuDC,UACpE,EAAAH,EAAA2B,MAAA,SAAOzB,UAAU,mBAAkBC,SAAA,EACjC,EAAAH,EAAAC,KAAA,SACE2E,KAAK,WACL1E,UAAU,6CAA4C,UAC9C,uBAAsB,cAClB,uBACZsK,MAAO,CAAE60I,aAAc,MAAOC,YAAa,QAC3Cz9H,UAAU,EACV09H,QAAS3uI,EACT4uI,SAAWppJ,GAAMqoJ,EAAkBroJ,EAAEwR,OAA4B23I,YAEnE,EAAAv/I,EAAA2B,MAAA,QAAAxB,SAAA,gBACe,KACb,EAAAH,EAAAC,KAAA,UACE2E,KAAK,SACL1E,UAAU,2BAA0B,UAC5B,4BACRigB,QAAU/pB,IACRA,EAAEsrB,iBACFi9H,GAAe,IAChBx+I,SAAA,yBAGO,KACV,EAAAH,EAAAC,KAAA,QAAMC,UAAU,gCAA+BC,SAAA,uBAKtDu+I,IACC,EAAA1+I,EAAAC,KAACm+I,EAAAE,MAAK,CACJ7/I,KAAK,QACL8/I,iBAAiB,EACjBkB,aAAa,EACbC,cAAc,EACdC,YAAY,EACZC,gBAAgB,EAChBhgI,SAAS,QACTi+H,QAAS,IAAMc,GAAe,GAAMx+I,UAEpC,EAAAH,EAAAC,KAAA,UACE8zG,MAAM,uBACNtO,IAAI,cACJvlG,UAAU,2BAA0B,UAC5B,iCAIb+J,IACC,EAAAjK,EAAAC,KAAA,OAAKC,UAAU,2CAA0C,UAAS,uBAAsBC,SACrF8J,KAGL,EAAAjK,EAAAC,KAAA,OAAKC,UAAU,mBAAkBC,UAC/B,EAAAH,EAAAC,KAAC8hB,EAAAC,OAAM,CACLvjB,KAAK,wBACLsH,KAAK,SACLnB,KAAK,SAAQ,UACL,wBACRqd,WAAW7R,GAAUS,GAAaF,GAAaisE,KAAsBt9E,EAAMqrD,WAAc/5C,IAAczQ,SAAA,sBAK3G,EAAAH,EAAAC,KAAA,OAAKC,UAAU,mBAAkBC,UAC/B,EAAAH,EAAAC,KAAC8hB,EAAAC,OAAM,CACLvjB,KAAK,sBACLsH,KAAK,SACLqc,WAAW,KACXjC,QAAS7gB,EAAM+iB,OAAM,UACb,sBAAqBliB,SAAA,gBAS3C,mBA1TAof,EAAAxpB,EAAA,OACAgsB,EAAAhsB,EAAA,OACA6rB,EAAA7rB,EAAA,MACAsrB,EAAAtrB,EAAA,OACAqoJ,EAAAroJ,EAAA,OAgBMqpJ,EAAe,CAAC,cAAe,aAAc,mHCnBtChrJ,EAAA+1E,qBAAiC,CAC5Cja,MAAO,UACPxmC,MAAO,GACP4e,OAAQ,aACRwiC,SAAU,cACV92D,YACE,8QACFvG,IAAK,qEACL0G,KAAM,GACNlW,UAAW,GACXQ,KAAM,yBACNqsB,KAAM,GACNlzB,GAAI,gBACJa,QAAS,CACPy3D,MAAO,UACPzxD,KAAM,yBACNirB,MAAO,CACL,CACEjrB,KAAM,SACNqsB,KAAM,CACJ,CACErsB,KAAM,YACNgwD,aACE,iNAEJ,CACEhwD,KAAM,YACNgwD,aACE,gNAEJ,CACEhwD,KAAM,YACNgwD,aAAc,gGAIpB,CACEhwD,KAAM,SACNqsB,KAAM,CACJ,CACErsB,KAAM,YACNgwD,aAAc,6FAEhB,CACEhwD,KAAM,YACNgwD,aAAc,8FAEhB,CACEhwD,KAAM,YACNgwD,aAAc,iGAMxB/1D,QAAS,EACTg3E,aAAa,+LCzDf,MAAAzZ,EAAAlgE,EAAA,MACA6gC,EAAAC,EAAA9gC,EAAA,QACAghC,EAAAhhC,EAAA,OAcAq+C,EAAAr+C,EAAA,OACAqG,EAAArG,EAAA,OACAuG,EAAAvG,EAAA,OACAkkC,EAAAlkC,EAAA,OACA+wB,EAAA/wB,EAAA,OACAyhB,EAAAzhB,EAAA,OACAogE,EAAApgE,EAAA,OACAgxB,EAAAhxB,EAAA,OACA+gC,EAAA/gC,EAAA,OA2BA,MAAa4gD,EACJ,oBAAOU,CAAcX,GAC1B,IAAIzsC,EACJ,IAAK,MAAMugB,KAAQksB,EACjB,IAAK,MAAMjsB,KAAOD,EACXC,EAAI5lB,UACPoF,EAAQwgB,EAAIxgB,OAIlB,OAAOA,CACT,CAEQ,qBAAO41I,CACb/nJ,EACA+xI,EACAvjG,WAEA,GAA6F,OAApB,QAArE1/B,EAA4C,QAA5ChN,EAAAiwI,EAASiW,kBAAkBx5G,EAAQ9b,KAAO,UAAE,IAAA5wB,OAAA,EAAAA,EAAG0sC,EAAQ8P,UAAY,UAAE,IAAAxvC,OAAA,EAAAA,EAAG9O,EAASS,MACnF,MAAMw+B,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,YAAYtlB,EAASS,0FACrBT,EAAS8gD,OAAOx7B,UAGpB,MAAM2iI,EAAWjoJ,EAASqc,KAC1B,GAAgB,MAAZ4rI,GAAoBA,EAAStsJ,OAAS,EAAG,CAC3C,MAAMusJ,EAAenW,EAAS9rE,WAAWnmE,GAAGE,EAASS,KACrD,GAAoB,MAAhBynJ,IAAyB5jJ,EAAAwC,YAAY2uD,QAAQyyF,EAAahjF,SAAU+iF,GAAW,CACjF,MAAMzpF,EAAQx+D,EAAS8gD,OAAO2mB,SAAWznE,EAAS8gD,OAAOx7B,SACzD,MAAM2Z,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,iGAAiGtlB,EAAS2G,uBAChGuhJ,EAAa15G,QAAQ9b,KAAO,UAAUw1H,EAAa15G,QAAQ8P,UAAY,cACnE9P,EAAQ9b,aAAa8b,EAAQ8P,YAC3CkgB,EAEJ,CACAuzE,EAAS9rE,WAAWnmE,GAAGE,EAASS,KAAO,CACrCykE,SAAU+iF,EACVz5G,UAEJ,CAEA,MAAM25G,EAAenoJ,EAASmkB,SAC9B,GAAoB,MAAhBgkI,GAA8C,SAAtBA,EAAar7I,KAAiB,CACxD,MAAMs7I,EAAmBrW,EAAS9rE,WAAW9hD,SAASnkB,EAASS,KAC/D,GACsB,MAApB2nJ,IACCnpH,EAAAU,yBAAyBq/B,gBAAgBmpF,EAAcC,EAAiBljF,UACzE,CACA,MAAM1G,EAAQx+D,EAAS8gD,OAAOumB,eAAiBrnE,EAAS8gD,OAAOx7B,SAC/D,MAAM2Z,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,uGAAuGtlB,EAAS2G,uBACtGyhJ,EAAiB55G,QAAQ9b,KAAO,UAAU01H,EAAiB55G,QAAQ8P,UAAY,cAC3E9P,EAAQ9b,aAAa8b,EAAQ8P,YAC3CkgB,EAEJ,CACAuzE,EAAS9rE,WAAW9hD,SAASnkB,EAASS,KAAO,CAC3CykE,SAAUijF,EACV35G,UAEJ,CAEA,MAAM65G,EAAaroJ,EAASyyB,OAC5B,GAAkB,MAAd41H,EAAoB,CACtB,MAAMC,EAAiBvW,EAAS9rE,WAAWxzC,OAAOzyB,EAASS,KAC3D,GAAsB,MAAlB6nJ,IAA2BrpH,EAAAU,yBAAyBy/B,cAAcipF,EAAYC,EAAepjF,UAAW,CAC1G,MAAM1G,EAAQx+D,EAAS8gD,OAAOymB,aAAevnE,EAAS8gD,OAAOx7B,SAC7D,MAAM2Z,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,qGAAqGtlB,EAAS2G,uBACpG2hJ,EAAe95G,QAAQ9b,KAAO,UAAU41H,EAAe95G,QAAQ8P,UAAY,cACvE9P,EAAQ9b,aAAa8b,EAAQ8P,YAC3CkgB,EAEJ,CACAuzE,EAAS9rE,WAAWxzC,OAAOzyB,EAASS,KAAO,CACzCykE,SAAUmjF,EACV75G,UAEJ,CAIA,GAHIxuC,EAAS+/C,SACXgyF,EAAShyF,QAAQ9tC,IAAIjS,EAASS,KAEL,MAAvBT,EAASskB,WAAoB,CAC/B,MAAMikI,EAAS7mJ,KAAKC,UAAU3B,EAASskB,YACjCkkI,EAAKzW,EAAS9rE,WAAW+uD,OAAOh1H,EAASS,KAC/C,GAAU,MAAN+nJ,GAAc9mJ,KAAKC,UAAU6mJ,EAAGlkI,cAAgBikI,EAClD,MAAMtpH,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,4EAA4EtlB,EAAS2G,uBAC3E6hJ,EAAGh6G,QAAQ9b,KAAO,UAAU81H,EAAGh6G,QAAQ8P,UAAY,cAC/C9P,EAAQ9b,aAAa8b,EAAQ8P,YAC3Ct+C,EAAS8gD,OAAO6mB,aAAe3nE,EAAS8gD,OAAOx7B,UAGnDysH,EAAS9rE,WAAW+uD,OAAOh1H,EAASS,KAAO,CACzC6jB,WAAYtkB,EAASskB,WACrBkqB,UAEJ,CACAlzC,KAAKmtJ,qBACH1W,EAASiW,kBACThoJ,EAASS,IACT+tC,EAAQ9b,KAAO,EACf8b,EAAQ8P,UAAY,EACpBt+C,GAEF1E,KAAKotJ,qBACH3W,EAAS4W,kBACT3oJ,EAASS,IACT+tC,EAAQ9b,KAAO,EACf8b,EAAQ8P,UAAY,EACpBt+C,GAEF+xI,EAAS6W,UAAU32I,IAAIjS,EAASslB,SAClC,CAEO,kBAAOujI,CACZl2H,EACA6b,EACA3oC,WAEA,MAAMqoF,EAAO/vB,EAAAvzD,OAAsBQ,MAAMunB,EAAIgkC,cAEvCxyD,EADY,IAAI86B,EAAAU,yBAAyBhN,EAAIgkC,aAAc9wD,EAAU,SAAU2oC,GAC5D1G,SAASomD,EAAKoH,SACvC,OAAInxF,EAAO4I,QAEF,CAAEA,SAAS,EAAM5B,MADiB,QAAvB2D,EAAc,QAAdhN,EAAAqC,EAAOgH,KAAK,UAAE,IAAArJ,OAAA,EAAAA,EAAEkxB,KAAK,UAAE,IAAAlkB,OAAA,EAAAA,EAAE3I,YAAa,IAGjDhC,CAEX,CAEO,8BAAO2kJ,CACZ/yF,EACAlwD,GAKA,IAAI+sB,EAAW,EACf,MAAMm/G,EAAiC,CACrC4W,kBAAmB,GACnBX,kBAAmB,GACnBY,UAAW,IAAInmJ,IACfs9C,QAAS,IAAIt9C,IACbwjE,WAAY,CAAE9hD,SAAU,GAAIsO,OAAQ,GAAIuiG,OAAQ,GAAIl1H,GAAI,KAkC1D,MAAO,CAAE8+C,eAhCsCmX,EAAenkC,MAAMzxB,IAAI,CAACuyB,EAAMG,IACtEH,EAAKM,KAAK7yB,IAAI,CAACwyB,EAAKI,KACzB,MAAMyb,EAAU,CACd9b,KAAMG,EAAY,EAClByrB,UAAWvrB,EAAiB,EAC5BJ,IAAKC,EAAW,GAEZzuB,EAAS7I,KAAKutJ,YAClBl2H,EACA,CAAED,KAAMG,EAAY,EAAGyrB,UAAWvrB,EAAiB,EAAGJ,IAAKC,EAAW,GACtE/sB,GAGF,GADA+sB,GAAY,EACRzuB,EAAO4I,QAAS,CAClB,MAAM5G,EAAYhC,EAAOgH,KACzB,IAAK,MAAMnL,KAAYmG,EACrB,IACE7K,KAAKysJ,eAAe/nJ,EAAU+xI,EAAUvjG,EAC1C,CAAE,MAAOlwC,GACP,GAAIA,aAAa2gC,EAAAq/B,mBACf,MAAO,CAAEvxD,SAAS,EAAOoF,MAAO7T,GAEhC,MAAMA,CAEV,CAEF,MAAO,CAAEyO,SAAS,EAAM5B,KAAMhF,EAChC,CACE,OAAOhC,KAIY4tI,WAC3B,CAEO,yBAAO1pE,CAAmBpnE,EAAczF,EAAcD,EAAYsK,GACvE,MAAM08F,EAAY,IAAItjE,EAAAU,yBAAyB1+B,EAAM4E,EAAU,UACzDqoF,EAAO/vB,EAAAvzD,OAAsBQ,MAAMnK,GAEzC,OADeshG,EAAUl6B,mBAAmB6lB,EAAKoH,QAAS95F,EAAMD,EAElE,CAEQ,4BAAOwtJ,CACbnlD,EACA/9F,GAKA,IAAI+sB,EAAW,EACf,MAAMm/G,EAAiC,CACrC4W,kBAAmB,GACnBX,kBAAmB,GACnBY,UAAW,IAAInmJ,IACfs9C,QAAS,IAAIt9C,IACbwjE,WAAY,CAAE9hD,SAAU,GAAIsO,OAAQ,GAAIuiG,OAAQ,GAAIl1H,GAAI,KAEpDyiG,EAAY,IAAItjE,EAAAU,yBAAyBikE,EAAiB/9F,EAAU,QACpEqoF,EAAO/vB,EAAAvzD,OAAsBQ,MAAMw4F,GACnCz/F,EAASo+F,EAAUz6D,SAASomD,EAAKoH,SACvC,GAAInxF,EAAO4I,QAAS,CAClB,IACE,IAAK,IAAI8lB,EAAY,EAAGA,EAAY1uB,EAAOgH,KAAKxP,OAAQk3B,GAAa,EAAG,CACtE,MAAMH,EAAOvuB,EAAOgH,KAAK0nB,GACzB,IAAK,IAAIE,EAAiB,EAAGA,EAAiBL,EAAKM,KAAKr3B,OAAQo3B,GAAkB,EAAG,CACnF,MACM5sB,EADMusB,EAAKM,KAAKD,GACA5sB,UACtB,IAAK,MAAMnG,KAAYmG,EAAW,CAChC,MAAMqoC,EAAU,CAAE9b,KAAMG,EAAY,EAAGyrB,UAAWvrB,EAAiB,EAAGJ,IAAKC,EAAW,GACtFt3B,KAAKysJ,eAAe/nJ,EAAU+xI,EAAUvjG,EAC1C,CACA5b,GAAY,CACd,CACF,CACF,CAAE,MAAOt0B,GACP,GAAIA,aAAa2gC,EAAAq/B,mBACf,MAAO,CAAE1f,eAAgB,CAAE7xC,SAAS,EAAOoF,MAAO7T,GAAKyzI,YAEvD,MAAMzzI,CAEV,CACA,MAAO,CAAEsgD,eAAgBz6C,EAAQ4tI,WACnC,CACE,MAAO,CAAEnzF,eAAgBz6C,EAAQ4tI,WAErC,CAEQ,2CAAOiX,CACbpqG,EACA/rB,EACAE,GAEA,IAAIH,EAAW,EACf,IAAK,IAAI/2B,EAAI,EAAGA,EAAI+iD,EAAejjD,OAAQE,GAAK,EAAG,CACjD,MAAM62B,EAAOksB,EAAe/iD,GAC5B,IAAK,IAAIg7B,EAAI,EAAGA,EAAInE,EAAK/2B,OAAQk7B,GAAK,EAAG,CACvC,GAAIh7B,IAAMg3B,GAAagE,IAAM9D,EAC3B,OAAOH,EAETA,GAAY,CACd,CACF,CAEF,CAEQ,kBAAOq2H,CACbjpJ,EACA4+C,EACA7rB,EACA41H,iBAEA,IAAK,MAAMO,KAA6B,QAAfpnJ,EAAA9B,EAASogD,cAAM,IAAAt+C,EAAAA,EAAI,GAAI,CAC9C,MAAMkhG,EAAkBkmD,EAAa,EACrC,GAA4E,OAAtB,QAAlDn6I,EAA+B,QAA/BD,EAAA65I,EAAkB3oJ,EAASS,YAAI,IAAAqO,OAAA,EAAAA,EAAGk0F,UAAgB,IAAAj0F,OAAA,EAAAA,EAAGgkB,IAAyB,CAChF,MAAMyb,EAAU,CACd9b,KAAMw2H,EACN5qG,UAAWvrB,EAAiB,EAC5BJ,KAAgG,QAA1FzN,EAAA5pB,KAAK0tJ,qCAAqCpqG,EAAgBokD,EAAiBjwE,UAAe,IAAA7N,EAAAA,EAAI,GAAK,GAErGikI,EAAgB/sJ,OAAAgI,OAAAhI,OAAAgI,OAAA,GACjBE,EAAAwC,YAAY2sB,MAAMzzB,IAAS,CAC9BogD,OAAQ,GACR5R,UACAiQ,UAAU,IAEZnjD,KAAKotJ,qBAAqBC,EAAmB3oJ,EAASS,IAAKuiG,EAAiBjwE,EAAgBo2H,GAC5F,MAAMx2H,EAAqC,QAA/BvN,EAAAw5B,EAAeokD,UAAgB,IAAA59E,OAAA,EAAAA,EAAG2N,IAC1CJ,aAAG,EAAHA,EAAK5lB,UACP4lB,EAAIxnB,KAAKiC,KAAK+7I,EAElB,CACF,CACF,CAEQ,oBAAOC,CACbppJ,EACA4+C,EACA/rB,EACAhtB,iBAEA,GAAI7F,EAASg0D,OAASh0D,EAAS8gD,OAAOomB,cAAe,CACnD,MAAMlT,EAAQh0D,EAASg0D,MACjBq1F,EAAoB/tJ,KAAKguJ,+BAC7BzjJ,EACAmuD,EAAM1uC,SACNs5B,EACU,QAAV98C,EAAAkyD,EAAMthC,YAAI,IAAA5wB,EAAAA,EAAI+wB,EAAY,EAC1BmhC,EAAMrhC,KAER,GAAI02H,EAAkB1tJ,OAAS,EAC7B,MAAMsjC,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,sFACAtlB,EAAS8gD,OAAOomB,eAGpB,MAAMqiF,EAAmBF,EAAkB,GAC3C,IAAKE,EACH,MAAMtqH,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,oBAAoB0uC,EAAM1uC,qBAA+B,QAAVxW,EAAAklD,EAAMthC,YAAI,IAAA5jB,EAAAA,EAAI+jB,EAAY,IAC1D,MAAbmhC,EAAMrhC,IAAc,UAAUqhC,EAAMrhC,MAAQ,KAE9C3yB,EAAS8gD,OAAOomB,eAGpB,GAAiD,OAAd,QAA/Bn4D,EAAAw6I,EAAiBvpJ,SAASg0D,aAAK,IAAAjlD,OAAA,EAAAA,EAAEuW,UACnC,MAAM2Z,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,gEACAtlB,EAAS8gD,OAAOomB,eAGpB,GAC+C,OAAX,QAAlChiD,EAAAqkI,EAAiBvpJ,SAASmkB,gBAAQ,IAAAe,OAAA,EAAAA,EAAE8uC,QACf,MAArBh0D,EAASmkB,WACRolI,EAAiBvpJ,SAAS+/C,QAE3B,MAAM9gB,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,6HACAtlB,EAAS8gD,OAAOomB,eAGpB,GAC6C,OAAX,QAAhC9hD,EAAAmkI,EAAiBvpJ,SAASyyB,cAAM,IAAArN,OAAA,EAAAA,EAAE4uC,QACf,MAAnBh0D,EAASyyB,SACR82H,EAAiBvpJ,SAAS+/C,QAE3B,MAAM9gB,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,wHACAtlB,EAAS8gD,OAAOomB,eAGsB,MAAtCqiF,EAAiBvpJ,SAASmkB,UAAyC,MAArBnkB,EAASmkB,WACzDnkB,EAASmkB,SAAW,CAClBrX,KAAMy8I,EAAiBvpJ,SAASmkB,SAASrX,KACzCpI,MAAOJ,EAAAwC,YAAY2sB,MAAM81H,EAAiBvpJ,SAASmkB,SAASzf,OAC5DurB,cAAe3rB,EAAAwC,YAAY2sB,MAAM81H,EAAiBvpJ,SAASmkB,SAAS8L,eACpE+jC,MAAO,CAAE1uC,SAAUikI,EAAiBvpJ,SAASslB,SAAUllB,OAAQ,aAG3B,MAApCmpJ,EAAiBvpJ,SAASyyB,QAAqC,MAAnBzyB,EAASyyB,SACvDzyB,EAASyyB,OAAS,CAChB3lB,KAAMy8I,EAAiBvpJ,SAASyyB,OAAO3lB,KACvCknD,MAAO,CAAE1uC,SAAUikI,EAAiBvpJ,SAASslB,SAAUllB,OAAQ,aAInEJ,EAASg0D,MAAMh0D,SAAWupJ,EAAiBvpJ,QAC7C,CACF,CAEQ,iCAAOwpJ,CAA2BxpJ,GACxC,MAAM2gD,EAAgB1xB,EAAAiB,uBAAuBywB,cAAc3gD,GACrDgxB,EAAyB/B,EAAAiB,uBAAuBu5H,sBAAsBzpJ,EAAU2gD,GACtF3gD,EAASgxB,uBAAyBA,CACpC,CAEQ,uBAAO04H,CACb1pJ,EACA4+C,EACA/rB,EACAD,GAEA,GAA6B,MAAzB5yB,EAAS+zB,cAAgE,IAAxC/zB,EAAS+zB,aAAaltB,OAAOlL,OAAc,CAC9E,MAAMguJ,EAAmBruJ,KAAKsuJ,qBAC5BhrG,EACA/rB,EACAD,EACA5yB,EACCuhG,GAA0B,MAAnBA,EAAGxtE,cAET41H,GAAoBA,EAAiB51H,eACvC/zB,EAAS+zB,aAAezvB,EAAAwC,YAAY2sB,MAAMk2H,EAAiB51H,cAE/D,CACF,CAEQ,4BAAO81H,CACb7pJ,EACA6yB,EACA81H,EACA9iJ,SAEA,GAC2B,MAAzB7F,EAAS+zB,cAC+B,IAAxC/zB,EAAS+zB,aAAaltB,OAAOlL,SACQ,QAArCmG,EAAA9B,EAAS+zB,aAAaltB,OAAO,GAAGtK,aAAK,IAAAuF,OAAA,EAAAA,EAAEoT,WAAW,QAClD,CACA,MAAM40I,EAAc9pJ,EAAS+zB,aAAaltB,OAAO,GAAGtK,MAAMN,MAAM,GAAGujB,OAC7Drb,EAAS7I,KAAKyuJ,uBAAuBD,EAAaj3H,EAAW81H,EAAmB9iJ,GACtF,GAAc,MAAV1B,EAAgB,CAClB,MAAM4vB,aAAEA,EAAc/zB,SAAUupJ,GAAqBplJ,EACrDnE,EAAS+zB,aAAe,CACtBltB,OAAQ,IAAIvC,EAAAwC,YAAY2sB,MAAMM,EAAaltB,SAC3CmtD,MAAO,CAAE1uC,SAAUikI,EAAiBjkI,SAAUtlB,SAAUupJ,EAAkBnpJ,OAAQ,YAEtF,CACF,CACF,CAEQ,2BAAO4pJ,CAAqBhqJ,EAAmC+xI,GACjEA,EAAShyF,QAAQ9iD,IAAI+C,EAASS,OAChCT,EAAS+/C,SAAU,GAG6B,MAA9CgyF,EAAS9rE,WAAW9hD,SAASnkB,EAASS,OACfT,EAASmkB,WAEhCnkB,EAASmkB,SAAW4tH,EAAS9rE,WAAW9hD,SAASnkB,EAASS,KAAKykE,WAInB,MAA5C6sE,EAAS9rE,WAAWxzC,OAAOzyB,EAASS,MAAiBT,EAASyyB,SAChEzyB,EAASyyB,OAASs/G,EAAS9rE,WAAWxzC,OAAOzyB,EAASS,KAAKykE,UAGb,MAA5C6sE,EAAS9rE,WAAW+uD,OAAOh1H,EAASS,OACtCT,EAASskB,WAAaytH,EAAS9rE,WAAW+uD,OAAOh1H,EAASS,KAAK6jB,WAEnE,CAEQ,yBAAO2lI,CACbrrG,EACA5+C,EACA6F,EACAksI,iBAEA,MAAM5tH,EAAWnkB,EAASmkB,SAC1B,GAAuB,YAAnBA,aAAQ,EAARA,EAAUrX,MAAmB,CAC/B,MAAMwY,EAAyB,QAAdxjB,EAAAqiB,EAAS6vC,aAAK,IAAAlyD,OAAA,EAAAA,EAAEwjB,SACjC,GAAInB,EAAS6vC,OAAS1uC,EAAU,CAC9B,MAAM7kB,EAAM67C,EAAApd,WAAWI,aAAaha,EAAUzf,EAASM,UAAW64B,EAAAO,UAAUC,iBAAiB35B,IACvF24D,EAAQx+D,EAAS8gD,OAAOumB,eAAiBrnE,EAAS8gD,OAAOx7B,SAC/D,GAAuC,MAAnCysH,EAAS4W,kBAAkBloJ,GAC7B,MAAMw+B,EAAAq/B,mBAAmBC,UAAUv+D,EAASslB,SAAU,oBAAoBA,IAAYk5C,GAExF,MAAM0rF,EAAmBnY,EAAS9rE,WAAW9hD,SAAS1jB,GAChD+tC,EAAU07G,aAAgB,EAAhBA,EAAkB17G,QAC5B27G,EAAmBD,aAAgB,EAAhBA,EAAkBhlF,SAC3C,IAAKilF,IAAqB37G,EACxB,MAAMvP,EAAAq/B,mBAAmBC,UAAUv+D,EAASslB,SAAU,4CAA6Ck5C,GAErG,GAAwC,OAAd,QAAtB1vD,EAAAq7I,EAAiBn2F,aAAK,IAAAllD,OAAA,EAAAA,EAAEwW,aAAqD,QAAhCJ,EAAsB,QAAtBnW,EAAAo7I,EAAiBn2F,aAAK,IAAAjlD,OAAA,EAAAA,EAAE/O,gBAAQ,IAAAklB,OAAA,EAAAA,EAAE66B,SACjF,MAAM9gB,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,kDACAk5C,GAGJ,GAA8B,WAA1B2rF,EAAiBr9I,KACnB,MAAMmyB,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,mDACAk5C,GAGJ,MAAM4rF,EAAgBD,EAAiBzlJ,MACjCA,EAAQyf,EAASzf,MACvB,IAAK,MAAMC,KAAYL,EAAAwC,YAAYzG,KAAK+pJ,GAAgB,CACtD,MAAM7tJ,EAAQ6tJ,EAAczlJ,GAC5B,GAAkB,MAAdD,EAAMjE,IAAgB+D,EAAAS,OAAO6H,KAAKvQ,KAAWiI,EAAAS,OAAO6H,KAAKpI,EAAMC,IACjE,MAAMs6B,EAAAq/B,mBAAmBC,UAAUv+D,EAASslB,SAAU,gCAAgC3gB,IAAY65D,EAEtG,CACA,MAOM+qF,EAAuC,QAApBnkI,EAPC9pB,KAAKguJ,+BAC7BzjJ,EACAyf,EACAs5B,EACApQ,EAAQ9b,KACR8b,EAAQ8P,WAEiC,UAAE,IAAAl5B,OAAA,EAAAA,EAAEplB,SAC/C,GAC6B,OAA3BupJ,aAAgB,EAAhBA,EAAkBv1F,SACY,MAA7Bu1F,EAAiBplI,UAAuD,MAAnColI,EAAiBplI,SAAS6vC,OAEhE,MAAM/0B,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,sBAAsBikI,EAAiBjkI,4CACvCk5C,GAGJr6C,EAAS6vC,MAAMh0D,SAAWupJ,CAC5B,CACF,CACF,CAEQ,wBAAOc,CAAkBrqJ,EAAmC6F,EAAqB2oC,GACvF,MAAM/b,EAASzyB,EAASyyB,OACxB,GAAqB,YAAjBA,aAAM,EAANA,EAAQ3lB,MAAmB,CAC7B,MAAMutC,OAAEA,EAAMmoB,gBAAEA,GAAoB/vC,EACpC,GAAI4nB,GAAUmoB,EAAiB,CAC7B,MAAM7yC,EAAeV,EAAAiB,uBAAuB4hH,YAAY9xI,EAAU6F,GAC5DnB,EAAQuqB,EAAAiB,uBAAuBsT,SAASxjC,GACxCqjE,EAAuB,IAAIr0C,EAAAqC,aAC/BgpB,EACA31C,EACA,GACAgb,EAAAK,SAAS+iD,0BAA0Bt0B,EAAS3oC,GAC5C6Z,EAAAK,SAASgjD,sBAAsBl9D,GAC/BA,EAASS,MACT,CAAEqpB,eAAcztB,KAAM2D,EAASS,MAAO08D,OAAQ,IAC9C,UAEF,IACEK,EAAqBj4D,OACvB,CAAE,MAAO9M,GACP,GAAIA,aAAa+/D,EAAAxc,wBAA0B2gB,EAAiB,CAC1D,MAAOjjD,GAAQ0f,EAAAU,yBAAyB+iB,iBAAiBrI,EAAQmoB,GACjE,MAAM,IAAIvjC,EAAAq/B,mBACRhgE,EAAE2O,QACFsS,EAAOjhB,EAAEihB,KACTjhB,EAAEyiD,OACFyhB,EAAgBhnE,KAAO8C,EAAE9C,KACzBgnE,EAAgBhnE,KAAO8C,EAAE/C,GAE7B,CACE,MAAM+C,CAEV,CACF,CACF,CACF,CAEQ,uBAAOgsJ,CACb1rG,EACA5+C,EACA6F,EACAksI,mBAEA,MAAMt/G,EAASzyB,EAASyyB,OACxB,GAAqB,YAAjBA,aAAM,EAANA,EAAQ3lB,MAAmB,CAC7B,MAAMwY,EAAuB,QAAZxjB,EAAA2wB,EAAOuhC,aAAK,IAAAlyD,OAAA,EAAAA,EAAEwjB,SAC/B,GAAImN,EAAOuhC,OAAS1uC,EAAU,CAC5B,MAAM7kB,EAAM67C,EAAApd,WAAWI,aAAaha,EAAUzf,EAASM,UAAW64B,EAAAO,UAAUC,iBAAiB35B,IACvF24D,EAAQx+D,EAAS8gD,OAAOymB,aAAevnE,EAAS8gD,OAAOx7B,SAE7D,GAAuC,MAAnCysH,EAAS4W,kBAAkBloJ,GAC7B,MAAMw+B,EAAAq/B,mBAAmBC,UAAUv+D,EAASslB,SAAU,oBAAoBA,IAAYk5C,GAExF,MAAM0rF,EAAmBnY,EAAS9rE,WAAWxzC,OAAOhyB,GAC9C8pJ,EAAiBL,aAAgB,EAAhBA,EAAkBhlF,SACnC12B,EAAU07G,aAAgB,EAAhBA,EAAkB17G,QAClC,IAAK+7G,IAAmB/7G,EACtB,MAAMvP,EAAAq/B,mBAAmBC,UAAUv+D,EAASslB,SAAU,0CAA2Ck5C,GAEnG,GAAsC,OAAd,QAApB1vD,EAAAy7I,EAAev2F,aAAK,IAAAllD,OAAA,EAAAA,EAAEwW,aAAmD,QAA9BJ,EAAoB,QAApBnW,EAAAw7I,EAAev2F,aAAK,IAAAjlD,OAAA,EAAAA,EAAE/O,gBAAQ,IAAAklB,OAAA,EAAAA,EAAE66B,SAC7E,MAAM9gB,EAAAq/B,mBAAmBC,UAAUv+D,EAASslB,SAAU,gDAAiDk5C,GAEzG,GAA4B,WAAxB+rF,EAAez9I,KACjB,MAAMmyB,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,iDACAk5C,GAGJ,MAAMxa,GAA+B,QAAnB5+B,EAAAmlI,EAAeptI,YAAI,IAAAiI,OAAA,EAAAA,EAAE4+B,YAAa,IAAIvhD,IACxD,GAAuB,IAAnBuhD,EAAUxyC,KAAY,CAExB,GAAgB,MADCxR,EAASmkB,SAExB,MAAM8a,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,0FACAk5C,GAGJ,MAAM95D,EAAQuqB,EAAAiB,uBAAuBsT,SAASxjC,GAC9C,IAAK,MAAM2E,KAAYq/C,EACrB,GAAuB,MAAnBt/C,EAAMC,GACR,MAAMs6B,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,0BAA0B3gB,6CAC1B65D,EAIR,CACA,MAOM+qF,EAAuC,QAApB9iG,EAPCnrD,KAAKguJ,+BAC7BzjJ,EACAyf,EACAs5B,EACApQ,EAAQ9b,KACR8b,EAAQ8P,WAEiC,UAAE,IAAAmI,OAAA,EAAAA,EAAEzmD,SAC/C,GAC6B,OAA3BupJ,aAAgB,EAAhBA,EAAkBv1F,SACU,MAA3Bu1F,EAAiB92H,QAAmD,MAAjC82H,EAAiB92H,OAAOuhC,OAE5D,MAAM/0B,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,sBAAsBikI,EAAiBjkI,4CACvCk5C,GAGJ/rC,EAAOuhC,MAAMh0D,SAAWupJ,CAC1B,CACF,CACF,CAEO,kBAAOiB,CACZ5rG,EACA/4C,EACAksI,GAEAz2I,KAAKmvJ,qBAAqB7rG,EAAgB,CAAC/rB,EAAWE,EAAgBH,EAAUwrB,EAAep+C,KAC7F1E,KAAKouJ,iBAAiB1pJ,EAAU4+C,EAAgB/rB,EAAWE,GAC3Dz3B,KAAK2tJ,YAAYjpJ,EAAU4+C,EAAgB7rB,EAAgBg/G,EAAS4W,mBACpErtJ,KAAK0uJ,qBAAqBhqJ,EAAU+xI,GACpCz2I,KAAKovJ,sBAAsB1qJ,EAAU+xI,KAGvCz2I,KAAKmvJ,qBAAqB7rG,EAAgB,CAAC/rB,EAAWE,EAAgBH,EAAUwrB,EAAep+C,KAC7F1E,KAAK8tJ,cAAcppJ,EAAU4+C,EAAgB/rB,EAAWhtB,GACxDvK,KAAKuuJ,sBAAsB7pJ,EAAU6yB,EAAWk/G,EAAS4W,kBAAmB9iJ,GAC5EvK,KAAK2uJ,mBAAmBrrG,EAAgB5+C,EAAU6F,EAAUksI,GAC5Dz2I,KAAKgvJ,iBAAiB1rG,EAAgB5+C,EAAU6F,EAAUksI,GAC1Dz2I,KAAK+uJ,kBAAkBrqJ,EAAU6F,EAAU,CACzC6sB,KAAMG,EAAY,EAClByrB,UAAWvrB,EAAiB,EAC5BJ,IAAKI,EAAiB,MAG1B,IAAK,MAAML,KAAQksB,EACjB,IAAK,MAAMjsB,KAAOD,EACZC,EAAI5lB,SACN4lB,EAAIxnB,KAAK7K,KAAK,CAACijG,EAAKC,aAClB,OAAID,EAAInlD,gBAAkBolD,EAAIplD,eACJ,QAAhBt8C,EAAAyhG,EAAI9jD,UAAU,UAAE,IAAA39C,EAAAA,EAAI,IAAsB,QAAhBgN,EAAA00F,EAAI/jD,UAAU,UAAE,IAAA3wC,EAAAA,EAAI,GAE/Cy0F,EAAInlD,cAAgBolD,EAAIplD,gBAOzC9iD,KAAKmvJ,qBAAqB7rG,EAAgB,CAAC/rB,EAAWE,EAAgBH,EAAUwrB,EAAep+C,KAC7F1E,KAAKkuJ,2BAA2BxpJ,KAGlC1E,KAAKmvJ,qBAAqB7rG,EAAgB,CAAC/rB,EAAWE,EAAgBH,EAAUwrB,EAAep+C,KAC7F,GAAsB,IAAlBo+C,EAAqB,CACvB,MAAMzrB,EAAMisB,EAAe/rB,GAAWE,GAClCJ,EAAI5lB,SACNzR,KAAKqvJ,YAAYh4H,EAAIxnB,KAAMtF,EAE/B,GAEJ,CAEO,kBAAO8kJ,CAAYz3H,EAAyCrtB,WACjE,MAAM8qB,EAAS,IAAI4H,IACnB,IAAK,MAAMv4B,KAAYkzB,EAAc,CACnC,MAAM03H,EAA6B,QAAjB9oJ,EAAA9B,EAASgrC,gBAAQ,IAAAlpC,OAAA,EAAAA,EAAE6E,KACrC,GAAiB,MAAbikJ,EAAmB,CACrB,GAAsB,MAAlB5qJ,EAAS2N,MAAe,CAC1B,MAAMa,EAAQlT,KAAKuvJ,uBAAuB7qJ,GAAU,GACpD,GAAa,MAATwO,EACF,MAAMywB,EAAAq/B,mBAAmBC,UAAU/vD,EAAM8W,SAAU9W,EAAMvB,QAASuB,EAAMgwD,MAE5E,CACA,QACF,CACA,MAAM9vD,EAA+B,QAArBI,EAAA6hB,EAAOzqB,IAAI0kJ,UAAU,IAAA97I,EAAAA,EAAI,GACzCJ,EAAQtB,KAAKpN,GACb2wB,EAAOtpB,IAAIujJ,EAAWl8I,EACxB,CACA,IAAK,MAAOk8I,EAAWl8I,KAAYiiB,EAC7BjiB,EAAQ9Q,KAAMiR,GAAiB,MAAXA,EAAElB,QACxBrS,KAAKwvJ,gBAAgBF,EAAWl8I,EAAS7I,EAG/C,CAEO,6BAAOglJ,CAAuB7qJ,aACnC,MAAMqkE,EAA4B,GAC5Bt5B,EAAgC,QAApBj8B,EAAc,QAAdhN,EAAA9B,EAAS2N,aAAK,IAAA7L,OAAA,EAAAA,EAAE6E,YAAI,IAAAmI,EAAAA,EAAI,UACpC0vD,EAAkC,QAA1BzvD,EAAA/O,EAAS8gD,OAAOgnB,kBAAU,IAAA/4D,EAAAA,EAAI/O,EAAS8gD,OAAOx7B,UAExDtlB,EAAS+/C,SAAoC,MAAzB//C,EAAS2vB,eAC/B00C,EAASj3D,KAAK,CACZ6/C,KAAM,EACN3nC,SAAUtlB,EAASslB,SACnBrY,QAAS,aAAajN,EAASslB,oBAAoBylB,mFACnDyzB,UAIJusF,EAAsB,IAAK,MAAM/4H,KAAahyB,EAASgxB,uBACrD,IAAK,IAAI9iB,EAAW,EAAGA,EAAW8jB,EAAUvqB,KAAK9L,OAAQuS,GAAY,EACnE,GAAyC,MAArC8jB,EAAUvqB,KAAKyG,GAAUpF,SAAkB,CAC7Cu7D,EAASj3D,KAAK,CACZ6/C,KAAM,EACN3nC,SAAUtlB,EAASslB,SACnBrY,QAAS,mBAAmB89B,iDAAyD78B,EAAW,SAASlO,EAASslB,sBAClHk5C,UAEF,MAAMusF,CACR,CAIJC,EAAiB,IAAK,MAAMh5H,KAAahyB,EAASgxB,uBAChD,GAAIgB,EAAUvqB,KAAK7J,KAAMgmB,GAAMA,EAAE2M,eAAgB,CAC/C8zC,EAASj3D,KAAK,CACZ6/C,KAAM,EACN3nC,SAAUtlB,EAASslB,SACnBrY,QAAS,aAAajN,EAASslB,oBAAoBylB,0EACnDyzB,UAEF,MAAMwsF,CACR,CAGF,OAAO3mF,CACT,CAEQ,sBAAOymF,CAAgBF,EAAmBl8I,EAAoC7I,GACpF,MACM2I,EADWlT,KAAK2vJ,iBAAiBv8I,EAAS7I,GACzB,GACvB,GAAa,MAAT2I,EACF,MAAMywB,EAAAq/B,mBAAmBC,UAAU/vD,EAAM8W,SAAU9W,EAAMvB,QAASuB,EAAMgwD,MAE5E,CAEO,uBAAOysF,CAAiBv8I,EAAoC7I,mBACjE,MAAM+kJ,EAAsC,QAA1B77I,EAAoB,QAApBD,EAAU,QAAVhN,EAAA4M,EAAQ,UAAE,IAAA5M,OAAA,EAAAA,EAAEkpC,gBAAQ,IAAAl8B,OAAA,EAAAA,EAAEnI,YAAI,IAAAoI,EAAAA,EAAI,GAC1Cs1D,EAA4B,GAE5B6mF,EAAYx8I,EAAQhM,OAAQmM,GAAiB,MAAXA,EAAElB,OAC1C,GAAIu9I,EAAUvvJ,OAAS,EAAG,CACxB,MAAMwvJ,EAAYD,EAAU,GAC5B7mF,EAASj3D,KAAK,CACZ6/C,KAAM,EACN3nC,SAAU6lI,EAAU7lI,SACpBrY,QAAS,mBAAmB29I,kEAC5BpsF,MAAO2sF,EAAUrqG,OAAOx7B,UAE5B,CAEA,GAAI5W,EAAQ/S,OAAS,EAAG,CACtB,MAAMwvJ,EAAYz8I,EAAQ,GAC1B21D,EAASj3D,KAAK,CACZ6/C,KAAM,EACN3nC,SAAU6lI,EAAU7lI,SACpBrY,QAAS,mBAAmB29I,8FAC5BpsF,MAAO2sF,EAAUrqG,OAAOx7B,UAE5B,CAGA,MAAM8lI,EAAiBF,EAAU34H,KAC9B1jB,IAAK,IAAA/M,EAAAgN,EAAAC,EAAAmW,EAAC,MAA2B,UAAX,QAAhBpW,EAAO,QAAPhN,EAAA+M,EAAElB,aAAK,IAAA7L,OAAA,EAAAA,EAAEwK,eAAO,IAAAwC,OAAA,EAAAA,EAAEpG,OAA8C,WAAX,QAAhBwc,EAAO,QAAPnW,EAAAF,EAAElB,aAAK,IAAAoB,OAAA,EAAAA,EAAEzC,eAAO,IAAA4Y,OAAA,EAAAA,EAAExc,QAE1C,MAAlB0iJ,GACF/mF,EAASj3D,KAAK,CACZ6/C,KAAM,GACN3nC,SAAU8lI,EAAe9lI,SACzBrY,QAAS,mBAAmB29I,kBAAuD,QAA7BxlI,EAAoB,QAApBF,EAAAkmI,EAAez9I,aAAK,IAAAuX,OAAA,EAAAA,EAAE5Y,eAAO,IAAA8Y,OAAA,EAAAA,EAAE1c,wFACrF81D,MAAuC,QAAhC/X,EAAA2kG,EAAetqG,OAAOgnB,kBAAU,IAAArhB,EAAAA,EAAI2kG,EAAetqG,OAAOx7B,WAIrEylI,EAAsB,IAAK,MAAMM,KAAU38I,EACzC,IAAK,MAAMsjB,KAAaq5H,EAAOr6H,uBAC7B,IAAK,IAAI9iB,EAAW,EAAGA,EAAW8jB,EAAUvqB,KAAK9L,OAAQuS,GAAY,EACnE,GAAyC,MAArC8jB,EAAUvqB,KAAKyG,GAAUpF,SAAkB,CAC7Cu7D,EAASj3D,KAAK,CACZ6/C,KAAM,EACN3nC,SAAU+lI,EAAO/lI,SACjBrY,QAAS,aAAao+I,EAAO/lI,0BAA0BslI,cAAsB18I,EAAW,uCACxFswD,MAAO6sF,EAAOvqG,OAAOx7B,WAEvB,MAAMylI,CACR,CAKN,MAAMO,EAAY58I,EAAQ,GAC1B68I,EAAmB,IAAK,IAAI1mJ,EAAI,EAAGA,EAAIymJ,EAAUt6H,uBAAuBr1B,OAAQkJ,GAAK,EAAG,CACtF,MAAM2mJ,EAAWF,EAAUt6H,uBAAuBnsB,GAAG4C,KAAK9L,OAC1D,IAAK,MAAM0vJ,KAAU38I,EAAQzS,MAAM,GAAI,CACrC,GAAI4I,GAAKwmJ,EAAOr6H,uBAAuBr1B,OACrC,SAEF,MAAMs6B,EAAQo1H,EAAOr6H,uBAAuBnsB,GAAG4C,KAAK9L,OACpD,GAAIs6B,IAAUu1H,EAAU,CACtBnnF,EAASj3D,KAAK,CACZ6/C,KAAM,EACN3nC,SAAU+lI,EAAO/lI,SACjBrY,QAAS,uBAAuB29I,yCAAiDU,EAAUhmI,iBAAiBkmI,OAAcH,EAAO/lI,iBAAiB2Q,IAClJuoC,MAAO6sF,EAAOvqG,OAAOx7B,WAEvB,MAAMimI,CACR,CACF,CACF,CAEA,IAAK,MAAMF,KAAU38I,EAAQzS,MAAM,GACjC,GAAIovJ,EAAOr6H,uBAAuBr1B,SAAW2vJ,EAAUt6H,uBAAuBr1B,OAAQ,CACpF0oE,EAASj3D,KAAK,CACZ6/C,KAAM,EACN3nC,SAAU+lI,EAAO/lI,SACjBrY,QAAS,uBAAuB29I,8CAChCpsF,MAAO6sF,EAAOvqG,OAAOx7B,WAEvB,KACF,CAGF0lI,EAAiB,IAAK,MAAMK,KAAU38I,EACpC,IAAK,MAAMsjB,KAAaq5H,EAAOr6H,uBAC7B,GAAIgB,EAAUvqB,KAAK7J,KAAMgmB,GAAMA,EAAE2M,eAAgB,CAC/C8zC,EAASj3D,KAAK,CACZ6/C,KAAM,EACN3nC,SAAU+lI,EAAO/lI,SACjBrY,QAAS,aAAao+I,EAAO/lI,0BAA0BslI,oEACvDpsF,MAAO6sF,EAAOvqG,OAAOx7B,WAEvB,MAAM0lI,CACR,CAIJ,IAAK,MAAMK,KAAU38I,EACnB,GAAI28I,EAAOtrG,SAAkC,MAAvBsrG,EAAO17H,aAAsB,CACjD00C,EAASj3D,KAAK,CACZ6/C,KAAM,EACN3nC,SAAU+lI,EAAO/lI,SACjBrY,QAAS,aAAao+I,EAAO/lI,0BAA0BslI,6EACvDpsF,MAAO6sF,EAAOvqG,OAAOx7B,WAEvB,KACF,CAGFmmI,EAAY,IAAK,MAAMJ,KAAU38I,EAAS,CACxC,GAAIpT,KAAKspB,oBAAoBymI,GAAS,CACpChnF,EAASj3D,KAAK,CACZ6/C,KAAM,EACN3nC,SAAU+lI,EAAO/lI,SACjBrY,QAAS,aAAao+I,EAAO/lI,0BAA0BslI,6EACvDpsF,MAAO6sF,EAAOvqG,OAAOx7B,WAEvB,MAAMmmI,CACR,CACA,IAAK,MAAMz5H,KAAaq5H,EAAOr6H,uBAC7B,IAAK,IAAI9iB,EAAW,EAAGA,EAAW8jB,EAAUvqB,KAAK9L,OAAQuS,GAAY,EAAG,CACtE,MAAM7G,EAAM2qB,EAAUvqB,KAAKyG,GAC3B,GAAI7G,EAAIuG,QAAUvG,EAAIwe,SAAWxe,EAAIuB,UAAW,CAC9Cy7D,EAASj3D,KAAK,CACZ6/C,KAAM,EACN3nC,SAAU+lI,EAAO/lI,SACjBrY,QAAS,aAAao+I,EAAO/lI,0BAA0BslI,cAAsB18I,EAAW,kEACxFswD,MAAO6sF,EAAOvqG,OAAOx7B,WAEvB,MAAMmmI,CACR,CACF,CAEJ,CAEAC,EAAiB,IAAK,MAAML,KAAU38I,EACpC,IAAK,MAAMsjB,KAAaq5H,EAAOr6H,uBAC7B,IAAK,IAAI9iB,EAAW,EAAGA,EAAW8jB,EAAUvqB,KAAK9L,OAAQuS,GAAY,EAGnE,KAFY8jB,EAAUvqB,KAAKyG,GACVrF,OAAShD,EAASigD,OAAO9a,UAAYnlC,EAASigD,OAAOgV,SAC3D,CACTuJ,EAASj3D,KAAK,CACZ6/C,KAAM,GACN3nC,SAAU+lI,EAAO/lI,SACjBrY,QAAS,aAAao+I,EAAO/lI,0BAA0BslI,cAAsB18I,EAAW,6CACxFswD,MAAO6sF,EAAOvqG,OAAOx7B,WAEvB,MAAMomI,CACR,CAKN,MAAMC,EAAW18H,EAAAiB,uBAAuB4B,kCAAkCw5H,GAC1E,IAAK,MAAMD,KAAU38I,EAAQzS,MAAM,GACjC,GAAIgzB,EAAAiB,uBAAuB4B,kCAAkCu5H,KAAYM,EAAU,CACjFtnF,EAASj3D,KAAK,CACZ6/C,KAAM,GACN3nC,SAAU+lI,EAAO/lI,SACjBrY,QAAS,uBAAuB29I,2CAChCpsF,MAAO6sF,EAAOvqG,OAAOx7B,WAEvB,KACF,CAGF,OAAO++C,CACT,CAEQ,0BAAOz/C,CAAoB5kB,GACjC,MAAMiwB,EAAgBhB,EAAAiB,uBAAuBC,iBAAiBnwB,GAC9D,OAAOsE,EAAAwC,YAAYzG,KAAK4vB,GAAeryB,KAAM6C,IAAO,IAAAqB,EAAC,OAAkB,QAAlBA,EAAAmuB,EAAcxvB,UAAI,IAAAqB,OAAA,EAAAA,EAAEsuB,cAC3E,CAEO,4BAAOs6H,CAAsB1qJ,EAAmC+xI,GACrE,GAA6B,MAAzB/xI,EAAS2vB,eAAyBoiH,EAAShyF,QAAQ9iD,IAAI+C,EAASS,KAClE,MAAMw+B,EAAAq/B,mBAAmBC,UACvBv+D,EAASslB,SACT,oBAAoBtlB,EAAS2G,OAC7B3G,EAAS8gD,OAAOx7B,SAGtB,CAEO,6BAAOykI,CACZD,EACA8B,EACAjD,EACA9iJ,SAEA,MAAMgmJ,EAAe/B,EAAYz3G,MAAM,cACvC,IAAIxf,EACAD,EACJ,GAAoB,MAAhBi5H,EAAsB,CACxB,MAAOC,EAAcC,GAAUF,EAAa,GAAGxsI,MAAM,KACvC,MAAV0sI,GACFl5H,EAAYytC,SAASwrF,EAAc,IACnCj5H,EAAY9tB,MAAM8tB,QAAaxpB,EAAYwpB,EAAY,EACvDD,EAAW0tC,SAASyrF,EAAQ,IAC5Bn5H,EAAW7tB,MAAM6tB,QAAYvpB,EAAYupB,EAAW,IAEpDA,EAAW0tC,SAASwrF,EAAc,IAClCl5H,EAAW7tB,MAAM6tB,QAAYvpB,EAAYupB,EAAW,EAExD,CACAk3H,EAAcA,EAAYpjJ,QAAQ,aAAc,IAAI8Y,OACpD,MAAM/e,EAAM67C,EAAApd,WAAWI,aAAawqH,EAAajkJ,EAASM,UAAW64B,EAAAO,UAAUC,iBAAiB35B,IAC1FmmJ,EAAgB1nJ,EAAAwC,YAAYD,QAA6B,QAAtB/E,EAAA6mJ,EAAkBloJ,UAAI,IAAAqB,OAAA,EAAAA,EAAG+wB,QAAAA,EAAa+4H,KAAqB,IAC9FK,EAAmBD,EAAc7rJ,IAAK6zB,GAAMA,EAAED,cAC9CnnB,EAAQgmB,QAAAA,EAAY,EAC1B,OAAIq5H,EAAiBr/I,GACZ,CAAEmnB,aAAck4H,EAAiBr/I,GAAQ5M,SAAUgsJ,EAAcp/I,SAExE,CAEJ,CAEO,qCAAO08I,CACZzjJ,EACAyf,EACA9hB,EACA0oJ,EACAC,GAEA,MAAM9C,EAA0F,GAC1F32H,EAAOlvB,EAAQ0oJ,EAAS,GACxBE,EAAyB,MAATD,EAAgB,CAACz5H,EAAKy5H,EAAQ,IAAMz5H,EAC1D,IAAK,IAAIK,EAAiB,EAAGA,EAAiBq5H,EAAczwJ,OAAQo3B,GAAkB,EAAG,CACvF,MAAMJ,EAAMy5H,EAAcr5H,GAC1B,GAAW,MAAPJ,GAAgBA,EAAI5lB,QAGxB,IAAK,MAAM/M,KAAY2yB,EAAIxnB,KACNmxC,EAAApd,WAAWC,oBAAoBn/B,EAAU6F,KACxCy2C,EAAApd,WAAWI,aAAaha,EAAUzf,EAASM,UAAW64B,EAAAO,UAAUC,iBAAiB35B,KAEnGwjJ,EAAkBj8I,KAAK,CACrBpN,WACAwuC,QAAS,CACP9b,KAAMw5H,EACN5tG,UAAWvrB,EAAiB,EAC5BJ,IAAK,IAKf,CACA,OAAO02H,CACT,CA2BO,mBAAO1lD,CACZC,EACA/9F,GAEA,MAAM+4C,eAAEA,EAAcmzF,SAAEA,GAAaz2I,KAAKytJ,sBAAsBnlD,EAAiB/9F,GACjF,GAAI+4C,EAAe7xC,QAAS,CAC1B,MAAMs/I,EAAuBlqH,EAAAwP,eAAemyD,qBAAqBllD,GACjEtjD,KAAKkvJ,YAAY6B,EAAsBxmJ,EAAUksI,GACjD,IAAK,MAAMr/G,KAAQ25H,EACjB,IAAK,MAAM15H,KAAOD,EAChB,IAAKC,EAAI5lB,QACP,MAAO,CACL6xC,eAAgB,CAAE7xC,SAAS,EAAOoF,MAAOwgB,EAAIxgB,OAC7Cm6I,kBAAmBvwJ,MAAMP,KAAKu2I,EAAS6W,WAKjD,CACA,MAAO,CAAEhqG,iBAAgB0tG,kBAAmBvwJ,MAAMP,KAAKu2I,EAAS6W,WAClE,CAEQ,2BAAOgB,CACbpmJ,EACAqvB,EACAD,EACA5yB,EACAusJ,WAEA,IACE,IAAI1wJ,EAAIg3B,EAAY,EAAG25H,EAAwB,QAAV1qJ,EAAA0B,EAAQ3H,UAAE,IAAAiG,OAAA,EAAAA,EAAG8wB,GAClD/2B,GAAK,GAAoB,MAAf2wJ,EACV3wJ,GAAK,EAAG2wJ,EAAwB,QAAV19I,EAAAtL,EAAQ3H,UAAE,IAAAiT,OAAA,EAAAA,EAAG8jB,GAEnC,GAAI45H,EAAYz/I,QAAS,CACvB,MAAM48I,EAAmB6C,EAAYrhJ,KAAKonB,KAAMgvE,GAAOA,EAAG9gG,MAAQT,EAASS,KAC3E,GAAwB,MAApBkpJ,IAAqC,MAAR4C,GAAgBA,EAAK5C,IACpD,OAAOA,CAEX,CAGJ,CAEQ,2BAAOjB,CACb+D,EACAzsJ,EACA6yB,EACAD,EACAkgF,GAEA25C,EAAKzsJ,GAAuBysJ,EAAKzsJ,IAAwB,GACzDysJ,EAAKzsJ,GAAqB6yB,GAAa45H,EAAKzsJ,GAAqB6yB,IAAc,GAC/E45H,EAAKzsJ,GAAqB6yB,GAAWD,GAAYkgF,CACnD,CAEQ,2BAAO21C,CACbgE,EACAzsJ,EACA6yB,EACAD,EACAkgF,GAEA25C,EAAK55H,GAAa45H,EAAK55H,IAAc,GACrC45H,EAAK55H,GAAWD,GAAY65H,EAAK55H,GAAWD,IAAa,GACzD65H,EAAK55H,GAAWD,GAAU5yB,GAAY8yG,CACxC,CAEQ,2BAAO23C,CACbjnJ,EACA8G,GAQA,IAAIsoB,EAAW,EACf,IAAK,IAAIC,EAAY,EAAGA,EAAYrvB,EAAQ7H,OAAQk3B,GAAa,EAAG,CAClE,MAAMH,EAAOlvB,EAAQqvB,GACrB,IAAK,IAAIE,EAAiB,EAAGA,EAAiBL,EAAK/2B,OAAQo3B,GAAkB,EAAG,CAC9E,MAAMJ,EAAMD,EAAKK,GACjB,IACE,GAAIJ,aAAG,EAAHA,EAAK5lB,QAAS,CAChB,MAAM5G,EAAYwsB,EAAIxnB,KACtB,IAAK,IAAIizC,EAAgB,EAAGA,EAAgBj4C,EAAUxK,OAAQyiD,GAAiB,EAC7E9zC,EAAGuoB,EAAWE,EAAgBH,EAAUwrB,EAAej4C,EAAUi4C,GAErE,CACF,CAAE,MAAO9/C,GACP,KAAIA,aAAa2gC,EAAAq/B,oBAGf,MAAMhgE,EAFNo0B,EAAKK,GAAkB,CAAEhmB,SAAS,EAAOoF,MAAO7T,EAIpD,CACAs0B,GAAY,CACd,CACF,CACF,EA/lCFt2B,EAAAuiD,iBAAAA,MAk+BgBA,EAAAs5B,cAAgB,CAC5BpiB,EACAlwD,KAKA,MAAM+4C,eAAEA,EAAcmzF,SAAEA,GAAahwI,EAAiB+mJ,wBAAwB/yF,EAAgBlwD,GAE9F,OADA9D,EAAiByoJ,YAAY5rG,EAAgB/4C,EAAUksI,GAChD,CAAEnzF,iBAAgB0tG,kBAAmBvwJ,MAAMP,KAAKu2I,EAAS6W,aAGpD/pG,EAAA/W,UAAW,EAAAhJ,EAAA9H,SAAQj1B,EAAKo2E,cAAe,CACnDr4C,QAAS,GACT21B,QAAS,CAACr3D,EAAgC6D,IACpC,UAAW7D,GAAK,UAAW6D,EACfkgC,EAAAwP,eAAeC,iBAAiBxzC,EAAEwzB,SAClCuQ,EAAAwP,eAAeC,iBAAiB3vC,EAAE2vB,OAGzCxzB,IAAM6D,6BCziCrB7F,OAAAC,eAAAC,EAAA,cAA+CC,OAAA,IAC/CD,EAAAmwH,aAAe,EAWfnwH,EAAAmwH,QAPA,SAAAigC,EAAAhuJ,GAEA,IADA,IAAAitB,EAAAjtB,EAAAguJ,GACA,SAAA/gI,EAAAxtB,MACAwtB,EAAAjtB,EAAAitB,EAAAluB,MAEA,OAAAkuB,EAAAnuB,KACA,8FCTA,MAAA+V,EAAAtV,EAAA,OACMuV,EAAoB,CAAEC,UAAW,KAAMk5I,GAAI,IAAKC,KAAM,IAAKl3H,IAAK,KACzDp5B,EAAAsO,OAAS2I,EAAAI,SAASC,YAAY,CACzCC,QAAS,GACTC,OACE,s5BACFC,UACE,2hCACFC,KAAM,qWACNC,UACE,kaACFC,QAAS,GACTC,aAAc,CAAC,EAAG,GAClBC,gBAAiB,EACjBC,UACE,owCACFC,WAAY,CAAC,EAAG,EAAG,GACnBC,SAAU,CAAEC,QAAS,CAAC,EAAG,IACzBC,YAAa,CAAC,CAAEC,KAAM,GAAIxO,IAAM3J,GAAeiX,EAAajX,KAAW,IACvEoY,UAAW,kFCJbrY,EAAA2pJ,gBAAAA,EAiBA3pJ,EAAAuwJ,SAAA,SAAyBrlJ,GACvB,OACE,EAAAU,EAAAC,KAAC89I,EAAe,CAACt/I,KAAMa,EAAMb,KAAM0hB,QAAS7gB,EAAM6gB,QAASykI,aAActlJ,EAAMslJ,aAAYzkJ,UACzF,EAAAH,EAAA2B,MAAA,WAASzB,UAAU,oBAAmBC,SAAA,CACnCb,EAAMulJ,mBACL,EAAA7kJ,EAAAC,KAAA,OAAKC,UAAU,kBAAkBsK,MAAO,CAAEs6I,WAAY,QAASC,YAAa,QAAQ5kJ,UAClF,EAAAH,EAAAC,KAAA,QAAM+kJ,YAAa1lJ,EAAMulJ,iBAAkBI,aAAc3lJ,EAAMulJ,iBAAgB1kJ,UAC7E,EAAAH,EAAAC,KAACilJ,EAAAznC,WAAU,SAIjB,EAAAz9G,EAAAC,KAAA,OAAKC,UAAU,mCAAkCC,SAAEb,EAAMjC,UACzD,EAAA2C,EAAA2B,MAAA,OAAKzB,UAAcZ,EAAM6lJ,YAAc,GAAK,SAAUhlJ,SAAA,EACpD,EAAAH,EAAAC,KAAA,OAAKC,UAAU,wCAAuCC,SAAEb,EAAMb,QAC9D,EAAAuB,EAAAC,KAAA,OAAKC,UAAU,OAAMC,SAAEb,EAAM8lJ,aAE/B,EAAAplJ,EAAAC,KAAA,OAAKC,WAAcZ,EAAM+lJ,WAAa,GAAK,UAA3B,6BAA+DllJ,SAAGb,EAAMjL,QACvFiL,EAAMgmJ,uBACL,EAAAtlJ,EAAAC,KAAA,OAAKC,UAAU,8BAA6BC,UAC1C,EAAAH,EAAAC,KAACslJ,EAAAvvH,eAAc,CAACxrB,MAAO,CAAEwhB,MAAO,mBAM5C,mBA3DAu5H,EAAAxvJ,EAAA,OACAmvJ,EAAAnvJ,EAAA,OACA4R,EAAA5R,EAAA,OAeA,SAAgBgoJ,EAAgBz+I,GAM9B,OACE,EAAAU,EAAAC,KAAA,qBACW,aAAa0H,EAAAmB,YAAYC,SAASzJ,EAAMb,QACjDyB,UAAU,6BACVigB,QAAS7gB,EAAM6gB,QAAOhgB,UAEtB,EAAAH,EAAAC,KAAA,OAAKC,UAAYZ,EAAMslJ,aAAkD,GAAnC,iCAAqCzkJ,SAAGb,EAAMa,YAG1F,8ECxBA/L,EAAAktB,YAAA,SAA4BhiB,GAC1B,MAAM0sB,EAAQ1sB,EAAM0sB,OAASC,EAAAC,SAASC,WAAWC,KAAKC,QACtD,OACE,EAAArsB,EAAA2B,MAAA,OACE2qB,QAAQ,cACRpsB,UAAU,SACVsK,MAAO,CAAE+W,MAAOjiB,EAAMiiB,MAAOrW,OAAQ5L,EAAM4L,OAAQs6I,UAAW,+BAA+BrlJ,SAAA,EAE7F,EAAAH,EAAAC,KAAA,QACEssB,KAAMP,EACNF,EAAE,2HAEJ,EAAA9rB,EAAAC,KAAA,QACEssB,KAAMP,EACNF,EAAE,sIAGJ,EAAA9rB,EAAAC,KAAA,QACEssB,KAAMP,EACNF,EAAE,6LAGJ,EAAA9rB,EAAAC,KAAA,QACEssB,KAAMP,EACNF,EAAE,yMAGJ,EAAA9rB,EAAAC,KAAA,QACEssB,KAAMP,EACNF,EAAE,2LAGJ,EAAA9rB,EAAAC,KAAA,QACEssB,KAAMP,EACNF,EAAE,kMAGJ,EAAA9rB,EAAAC,KAAA,QACEssB,KAAMP,EACNF,EAAE,uIAGJ,EAAA9rB,EAAAC,KAAA,QACEssB,KAAMP,EACNF,EAAE,sIAGJ,EAAA9rB,EAAAC,KAAA,QACEssB,KAAMP,EACNF,EAAE,oMAGJ,EAAA9rB,EAAAC,KAAA,QACEssB,KAAMP,EACNF,EAAE,uMAGJ,EAAA9rB,EAAAC,KAAA,QACEssB,KAAMP,EACNF,EAAE,+LAGJ,EAAA9rB,EAAAC,KAAA,QACEssB,KAAMP,EACNF,EAAE,6LAKV,mBA7EAG,EAAAl2B,EAAA,mHCDA,MAAA+gC,EAAA/gC,EAAA,OAaAghC,EAAAhhC,EAAA,OACAqG,EAAArG,EAAA,OACA0vJ,EAAA1vJ,EAAA,MACAuG,EAAAvG,EAAA,OAWAsG,EAAAtG,EAAA,OACA6lB,EAAA7lB,EAAA,OACA8lB,EAAA9lB,EAAA,OACA2R,EAAA3R,EAAA,OACAq+C,EAAAr+C,EAAA,OACAgJ,EAAAhJ,EAAA,OAiCA,MAAaiyB,EACJ,mBAAO0wB,CAAa5gD,GACzB,OAAOkwB,EAAuBzoB,KAAKzH,GAAUO,OAAO,CAACgsE,EAAKllE,KAAO,IAAAtF,EAAC,OAAAwqE,IAAmB,QAAZxqE,EAAAsF,EAAIipB,gBAAQ,IAAAvuB,OAAA,EAAAA,EAAE6+C,eAAgB,IAAI,EAC7G,CAEO,kBAAOkxF,CAAY1yG,EAA0Cv5B,GAClE,MAAM7F,EAAWuE,EAAA0B,SAAS2uI,WACxBx1G,EAAgBz4B,KAChBd,EAASM,UACT64B,EAAAO,UAAUC,iBAAiB35B,IAE7B,GAAgB,MAAZ7F,EAKJ,OAFAA,EAASD,UACPq/B,EAAgBr/B,WAAaC,EAASD,WAAawE,EAAA0B,SAAS6sI,kBAAkB9yI,EAAU6F,EAASM,WAC5FnG,CACT,CAEO,oBAAO2gD,CAAc3gD,WAC1B,MAAM4tJ,EAAwB5tJ,EAAS2gD,cACjCktG,EAA6C,QAAxB/rJ,EAAc,QAAdC,EAAA/B,EAASg0D,aAAK,IAAAjyD,OAAA,EAAAA,EAAE/B,gBAAQ,IAAA8B,OAAA,EAAAA,EAAE6+C,cAC/CA,IAAiBitG,aAAqB,EAArBA,EAAuBjyJ,QAAS,EAAIiyJ,EAAwBC,IAAuB,GAC1G,OAAgC,IAAzBltG,EAAchlD,OACjB,CAAC,CAAE8L,KAAMyoB,EAAuBzoB,KAAKzH,GAAWggB,WAAW,IAC3D2gC,CACN,CAEO,cAAOmtG,CAAQ9tJ,WACpB,OAAOA,EAASskB,aAAsC,QAAxBxiB,EAAc,QAAdC,EAAA/B,EAASg0D,aAAK,IAAAjyD,OAAA,EAAAA,EAAE/B,gBAAQ,IAAA8B,OAAA,EAAAA,EAAEwiB,WAC1D,CAEO,qBAAO4xD,CAAel2E,EAAmC6F,SAG9D,MAAMkoJ,EAA0D,QAAxChsJ,EAAAmuB,EAAuB49H,QAAQ9tJ,UAAS,IAAA+B,EAAAA,EAAI,GAC9D0F,EAAoC,GAC1C,IAAK,MAAM+gJ,KAAMuF,EACf,IAAK,IAAIlyJ,EAAI,EAAGA,EAAI2sJ,EAAG5nG,aAAc/kD,GAAK,EAAG,CAC3C,IAAIU,EAAsCisJ,EAAGruF,WAAaquF,EAAGruF,WAAa,SAAM9wD,EACnE,MAAT9M,IACFA,EAAQisJ,EAAGniJ,QAEA,MAAT9J,IACFA,EAAQwnB,EAAAqP,UAAU46H,YAAYxpJ,EAAAS,OAAO+tC,cAAcw1G,EAAG9/I,KAAM,KAE9DjB,EAAK2F,KAAK,CACR1E,KAAM8/I,EAAG9/I,KACT0mB,QAASo5H,EAAGp5H,QACZ7yB,QACA8yB,UAAW7qB,EAAAS,OAAOE,MAAM,EAAGU,EAASS,QAExC,CAEF,OAAOmB,CACT,CAEO,aAAOwmJ,CAAOjuJ,GACnB,OAA8B,OAA1BA,aAAQ,EAARA,EAAU2vB,cACL3vB,OAEP,CAEJ,CAEO,4BAAOypJ,CACZzpJ,EACA2gD,GAEA,MAAM3vB,EAAyE,GAC/E,IAAK,IAAIn1B,EAAI,EAAGA,EAAI8kD,EAAchlD,OAAQE,IAAK,CAC7C,MAAM4L,EAAOyoB,EAAuBzoB,KAAKzH,EAAUnE,GAC7CqyJ,EAAuD,GAC7D,IAAK,MAAMxxC,KAAQj1G,EACjB,GAAqB,MAAjBi1G,EAAKpsF,SAGT,IAAK,IAAIuG,EAAI,EAAGA,EAAI6lF,EAAKpsF,SAASswB,aAAc/pB,IAC9Cq3H,EAAc9gJ,KAAK,CACjBkmB,OAAQopF,EAAKpsF,SAASgD,OACtBqhC,OAAQ+nD,EAAKpsF,SAASqkC,OACtBtuD,OAAQq2G,EAAKr2G,OAASq2G,EAAKr2G,OAASq2G,EAAKviD,WAAa31D,EAAAS,OAAOI,SAASq3G,EAAKviD,iBAAc9wD,EACzFR,MAAO6zG,EAAK7zG,MACZC,SAAU4zG,EAAK5zG,SACfC,mBAAoB2zG,EAAK3zG,mBACzBJ,IAAK+zG,EAAK/zG,IACViF,SAAU8uG,EAAK9uG,OACf2C,MAAOmsG,EAAKnsG,MACZsV,UAAW62F,EAAKpsF,SAASzK,QACzB0K,gBAAiBmsF,EAAKpsF,SAASC,cAC/B3nB,YAAa8zG,EAAK9zG,UAClB4xD,OAAQkiD,EAAKliD,SAInBxpC,EAAuB5jB,KAAK,CAAE3F,KAAMymJ,EAAeluI,UAAW2gC,EAAc9kD,GAAGmkB,WACjF,CACA,OAAOgR,CACT,CAEO,WAAOvpB,CAAKzH,EAAmC+xB,uBACpD,MAAMo8H,GAA2B,QAAdpsJ,EAAA/B,EAASg0D,aAAK,IAAAjyD,OAAA,EAAAA,EAAE/B,UAG9B,QAFDklB,EAAwB,QAAxBpW,EAAc,QAAdhN,EAAA9B,EAASg0D,aAAK,IAAAlyD,OAAA,EAAAA,EAAE9B,gBAAQ,IAAA8O,OAAA,EAAAA,EAAE6xC,cACxB5uB,QAAAA,EAAkBz2B,KAAKq4B,yBAAuC,QAAd5kB,EAAA/O,EAASg0D,aAAK,IAAAjlD,OAAA,EAAAA,EAAE/O,kBACjE,IAAAklB,OAAA,EAAAA,EAAEzd,UACH4B,EACEgrD,GAAwC,QAAxB5N,EAAc,QAAdrhC,EAAAplB,EAASg0D,aAAK,IAAA5uC,OAAA,EAAAA,EAAEplB,gBAAQ,IAAAymD,OAAA,EAAAA,EAAE5F,UAAW,GAC3D9uB,EAAiBA,QAAAA,EAAkBz2B,KAAKq4B,yBAAyB3zB,GACjE,MAAMouJ,EAAoD,QAAtCn1F,EAAAj5D,EAAS2gD,cAAc5uB,UAAe,IAAAknC,OAAA,EAAAA,EAAExxD,KACtD4mJ,EAAiBruJ,EAAS6gD,QAEhC,OADautG,GAAeD,GAAc,IAC9BhuJ,IAAKu8G,sBACf,MAAMr1G,EAAkC/C,EAAAwC,YAAY2sB,MAAMipF,GAC1Dr1G,EAAIsB,IAA4B,MAAtB0lJ,EAAe1lJ,IAAc0lJ,EAAe1lJ,IAAc,QAAP5G,EAAAsF,EAAIsB,WAAG,IAAA5G,EAAAA,EAAIsyD,EAAc1rD,IACtFtB,EAAIwB,MAAgC,MAAxBwlJ,EAAexlJ,MAAgBwlJ,EAAexlJ,MAAkB,QAAT/G,EAAAuF,EAAIwB,aAAK,IAAA/G,EAAAA,EAAIuyD,EAAcxrD,MAC9F,MAAMylJ,EAA4C,MAA3BD,EAAevlJ,SAAmBulJ,EAAiBh6F,EA2B1E,OA1B+B,MAA3Bi6F,EAAexlJ,UAAqC,MAAjB4zG,EAAK5zG,UAAkC,MAAd4zG,EAAK7zG,QACnExB,EAAIyB,SAAWwlJ,EAAexlJ,SAC9BzB,EAAI0B,mBAAqBulJ,EAAevlJ,mBACxC1B,EAAIwB,MAAQylJ,EAAez1F,cAEA,MAAzBw1F,EAAehoJ,QAA+C,MAA7BgoJ,EAAel0F,WACrB,MAAzBk0F,EAAehoJ,QACjBgB,EAAIhB,OAASgoJ,EAAehoJ,OAC5BgB,EAAI8yD,gBAAa9wD,IAEjBhC,EAAI8yD,WAAak0F,EAAel0F,WAChC9yD,EAAIhB,YAASgD,IAGfhC,EAAIhB,OAAmB,QAAVyI,EAAAzH,EAAIhB,cAAM,IAAAyI,EAAAA,EAAIulD,EAAchuD,OACzCgB,EAAI8yD,WAA2B,QAAdprD,EAAA1H,EAAI8yD,kBAAU,IAAAprD,EAAAA,EAAIslD,EAAc8F,YAGnD9yD,EAAIuG,UAAkC,MAAtBygJ,EAAe1lJ,KAAwC,MAAzB0lJ,EAAezgJ,OACzDygJ,EAAezgJ,OACJ,QAAVsX,EAAA7d,EAAIuG,cAAM,IAAAsX,EAAAA,EAAImvC,EAAczmD,QACjCvG,EAAIuB,aAAyC,MAAzBylJ,EAAehoJ,QAA+C,MAA7BgoJ,EAAel0F,YACxC,MAA5Bk0F,EAAezlJ,UAEG,QAAbwc,EAAA/d,EAAIuB,iBAAS,IAAAwc,EAAAA,EAAIivC,EAAczrD,UADhCylJ,EAAezlJ,WAEnBvB,EAAImzD,OAAkC,MAAzB6zF,EAAe7zF,OAAiB6zF,EAAe7zF,OAAoB,QAAV/T,EAAAp/C,EAAImzD,cAAM,IAAA/T,EAAAA,EAAI4N,EAAcmG,OAC3FnzD,GAEX,CAEO,qBAAOknJ,CAAevuJ,EAAqB6F,GAChD,MAAMye,GAActkB,aAAQ,EAARA,EAAU28E,iBAAiB,EAAAp4E,EAAAq4E,cAAa/2E,EAASS,OAAOtG,EAAS28E,gBAAmB,GAClGx4E,EAA6C,GACnD,GAAImgB,EAAY,CACd,MAAMqM,EAAS7M,EAAAe,gBAAgB4L,iBAAiBnM,GAChD,IAAK,MAAMxc,KAAS6oB,EAAQ,CAC1B,MAAMniB,EAAQ1G,EAAM,GACdnM,EAASmM,EAAM,GACrB3D,EAAOiJ,KAAK,CACVN,KAAM,SACN8zC,aAAcjlD,EACd+M,KAAM8F,EAAM9F,KACZyxD,WAAmC,iBAAhB3rD,EAAMjS,MAAmC,IAAdiS,EAAMjS,MAAciS,EAAMjS,MAAMA,OAElF,CACF,CACA,OAAO4H,CACT,CAEO,uBAAOqqJ,CAAiBpvH,GAC7B,MAAMghB,EAAShhB,EAAgBqgB,UACzBmf,EAA6B,GACnC,IAAK,MAAM6vF,KAAOruG,EACM,IAAlBwe,EAAOjjE,QACTijE,EAAOxxD,KAAK,CAACqhJ,EAAKA,IAGhBA,GADY7vF,EAAOA,EAAOjjE,OAAS,GAAG,GACrB,EACnBijE,EAAOA,EAAOjjE,OAAS,GAAG,GAAK8yJ,EAE/B7vF,EAAOxxD,KAAK,CAACqhJ,EAAKA,IAGtB,OAAO7vF,EAAOz+D,IAAKmiB,GAAM,GAAGA,EAAE,MAAMA,EAAE,MAAMxY,KAAK,KACnD,CAEO,8BAAO4kJ,CAAwBjnJ,SACpC,MAAMT,EAA6B,GACnC,IAAK,MAAMK,KAAOI,EAChB,IAAK,IAAIyG,EAAW,EAAGA,GAAY7G,EAAIu5C,cAAgB,GAAI1yC,IAAY,CACrE,MAAM7H,EACc,MAAlBgB,EAAI8yD,WACA,GAAG9yD,EAAI8yD,cACc,OAAX,QAAVp4D,EAAAsF,EAAIhB,cAAM,IAAAtE,OAAA,EAAAA,EAAExF,OACV8K,EAAIhB,OAAO9J,MAAMiF,WACjB,GAAGF,KAAKoqC,MAA2C,IAArClnC,EAAAS,OAAO+tC,cAAc3rC,EAAIqB,KAAM,QACrD1B,EAAYoG,KAAK,CACf1E,KAAqB,MAAfrB,EAAI+nB,QAAkB,GAAG/nB,EAAI+nB,WAAW/nB,EAAIqB,OAAS,GAAGrB,EAAIqB,OAClErC,OAAQA,GAEZ,CAGF,OAAO,EAAAsnJ,EAAA5mJ,kBAAiBC,EAC1B,CAEO,gBAAO2nJ,CAAU3uJ,GACtB,MAAO,GAAGA,EAASS,OAAOT,EAASwuC,QAAQ9b,QAAQ1yB,EAASwuC,QAAQ8P,WACtE,CAEO,mBAAOswG,CAAavnJ,WACzB,MAAO,GAAGA,EAAIstD,UAAUttD,EAAIisB,UAAUjsB,EAAIwe,WAAqB,QAAV9jB,EAAAsF,EAAIhB,cAAM,IAAAtE,OAAA,EAAAA,EAAExF,QAAkB,QAAVuF,EAAAuF,EAAIhB,cAAM,IAAAvE,OAAA,EAAAA,EAAEI,OAAOmF,EAAIuB,aAAavB,EAAIsB,MAAMtB,EAAIuG,UAAUvG,EAAIwB,OAC3I,CAEO,iCAAOgmJ,CACZpnJ,EACA5B,WAEA,MAAMmB,EAA6B,GACnC,IAAK,MAAMK,KAAOI,EAAM,CACtB,MAAMpB,EAASgB,EAAIhB,OAAS7B,EAAAS,OAAO2tC,QAAQvrC,EAAIhB,QAAQ,QAASgD,EAC1DnH,GAAiB,QAAVH,EAAAsF,EAAIhB,cAAM,IAAAtE,OAAA,EAAAA,EAAEG,OAAQ2D,EAASS,MAC1CU,EAAYoG,KAAK,CACf0hJ,SAAS,EACTC,QAAS1nJ,EAAIuG,OACbohJ,WAAY3nJ,EAAIhB,OAChB4oJ,SAAuB,MAAb5nJ,EAAIwB,MACdH,KAAM,GAAiB,MAAdrB,EAAIstD,OAAiB,GAAGttD,EAAIstD,UAAUttD,EAAIisB,SAAW,GAAGjsB,EAAIisB,WAAWjsB,EAAIwe,QAAU,IAAM,KACpGld,IAAY,QAAP7G,EAAAuF,EAAIsB,WAAG,IAAA7G,OAAA,EAAAA,EAAEN,WACd6E,SACAnE,OACA0G,UAAWvB,EAAIuB,UACfC,MAAOxB,EAAIwB,OAEf,CACA,OAAO,EAAA8kJ,EAAA5mJ,kBAAiBC,EAC1B,CAEO,wBAAOkoJ,CACZznJ,EACA0nJ,EACAtuG,EACAh7C,qBAEA,MAAMmB,EAA6B,GACnC,IAAK,MAAMK,KAAOI,EAChB,IAAK,IAAIyG,EAAW,EAAGA,IAAwB,QAAZnM,EAAAsF,EAAIipB,gBAAQ,IAAAvuB,OAAA,EAAAA,EAAE6+C,eAAgB,GAAI1yC,IAAY,CAC/E,MAAMkhB,EAAsB,QAAZttB,EAAAuF,EAAIipB,gBAAQ,IAAAxuB,OAAA,EAAAA,EAAE6yD,OACxBiE,GAAsB,QAAZ9pD,EAAAzH,EAAIipB,gBAAQ,IAAAxhB,OAAA,EAAAA,EAAEwkB,SAAU,EAClCjtB,EACc,MAAlBgB,EAAI8yD,WACA,GAAG9yD,EAAI8yD,cACc,OAAX,QAAVprD,EAAA1H,EAAIhB,cAAM,IAAA0I,OAAA,EAAAA,EAAExS,OACV8K,EAAIhB,OAAO9J,MAAMiF,gBACjB6H,EACFnH,EAAyB,MAAlBmF,EAAI8yD,YAA+B,QAAVj1C,EAAA7d,EAAIhB,cAAM,IAAA6e,OAAA,EAAAA,EAAEhjB,OAAQ2D,EAASS,WAAQ+C,EAC3ErC,EAAYoG,KAAK,CACf0hJ,SAAUK,EACVJ,QAASI,GAAiC,MAAftuG,EAAQl4C,IACnCqmJ,WAAYG,GAAoC,MAAlBtuG,EAAQx6C,QAAwC,MAAtBw6C,EAAQsZ,WAChE80F,UAAWE,GAAmC,MAAjBtuG,EAAQh4C,MACrCH,KAAM,GAAc,MAAX0mB,EAAkB,GAAGA,KAAa,KAAKwpC,KAAsB,QAAZxzC,EAAA/d,EAAIipB,gBAAQ,IAAAlL,OAAA,EAAAA,EAAES,SAAU,IAAM,KACxFld,IAAY,QAAP89C,EAAAp/C,EAAIsB,WAAG,IAAA89C,OAAA,EAAAA,EAAEjlD,WACd6E,OAAQA,EACRnE,OACA0G,UAAWvB,EAAIuB,UACfC,MAAOxB,EAAIwB,OAEf,CAGF,OAAO,EAAA8kJ,EAAA5mJ,kBAAiBC,EAC1B,CAEO,wBAAOooJ,CAAkB9qI,GAC9B,OAAOA,EAAW/jB,OAA2C,CAACgsE,EAAKllE,KACjE,IAAK,IAAIxL,EAAI,EAAGA,EAAIwL,EAAIu5C,aAAc/kD,IACpC0wE,EAAIn/D,KAAIhR,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAMiD,GAAG,CAAEu5C,aAAc,KAEnC,OAAO2rB,GACN,GACL,CAEO,+BAAO54C,CAAyB3zB,GACrC,MAAM4M,EAAQ5M,EAAS2gD,cAAchH,UAAW9lB,GAAOA,EAAG7T,WAC1D,OAAkB,IAAXpT,EAAe,EAAIA,CAC5B,CAEO,wCAAOklB,CAAkC9xB,GAC9C,MAAM4M,EAAQ5M,EAASgxB,uBAAuB2oB,UAAW9lB,GAAOA,EAAG7T,WACnE,OAAkB,IAAXpT,EAAe,EAAIA,CAC5B,CAEO,mCAAOikB,CACZ7wB,GAEA,MAAM4M,EAAQtR,KAAKw2B,kCAAkC9xB,GACrD,OAAOA,EAASgxB,uBAAuBpkB,EACzC,CAEO,yBAAOyiJ,CAAmBrvJ,SAC/B,MAAM4M,EAAQtR,KAAKw4B,wBAAwB9zB,GAC3C,OAA0C,QAAnC+B,EAAA/B,EAAS+zB,aAAaltB,OAAO+F,UAAM,IAAA7K,OAAA,EAAAA,EAAExF,KAC9C,CAEO,aAAOmlJ,CACZngD,EACAhjD,EACA14C,eAEA,MAAMypJ,EAAwB/tD,EAAGvwE,uBAAuButB,GACxD,IAAIgxG,EAAmBD,EAAsB7nJ,KAAK6nJ,EAAsB7nJ,KAAK9L,OAAS,GACtF,GAAI4zJ,EACFD,EAAsB7nJ,KAAO,IAAI6nJ,EAAsB7nJ,KAAMnD,EAAAwC,YAAY2sB,MAAM87H,QAC1E,CACL,MAAMv1F,EAAe9pC,EAAuBzoB,KAAK85F,EAAIhjD,GAC/ChrB,EAAUymC,EAAaA,EAAar+D,OAAS,GAC/C43B,GACFg8H,EAAmB,CACjBj8H,QAAwB,QAAhBvxB,EAAAwxB,EAAQjD,gBAAQ,IAAAvuB,OAAA,EAAAA,EAAEuxB,SAAU,EACpCqhC,OAAwB,QAAhB7yD,EAAAyxB,EAAQjD,gBAAQ,IAAAxuB,OAAA,EAAAA,EAAE6yD,OAC1BtuD,OAAQktB,EAAQltB,QAAU7B,EAAAS,OAAOipB,KACjCtgB,OAAQ2lB,EAAQ3lB,SAAU,EAC1BiY,SAAyB,QAAhB/W,EAAAykB,EAAQjD,gBAAQ,IAAAxhB,OAAA,EAAAA,EAAE+W,WAAW,EACtC0K,eAA+B,QAAhBxhB,EAAAwkB,EAAQjD,gBAAQ,IAAAvhB,OAAA,EAAAA,EAAEwhB,iBAAiB,EAClD3nB,UAAW2qB,EAAQ3qB,YAAa,EAChCD,IAAK4qB,EAAQ5qB,IACbE,MAAO0qB,EAAQ1qB,MACf0H,MAAOgjB,EAAQhjB,OAEjB++I,EAAsB7nJ,KAAO,IAAI6nJ,EAAsB7nJ,KAAMnD,EAAAwC,YAAY2sB,MAAM87H,KAE/ED,EAAsB7nJ,KAAO,IACxB6nJ,EAAsB7nJ,KACzB,CACE6rB,OAAQ,EACRjtB,OAAQ7B,EAAAS,OAAOE,MAAM,IAAKU,EAASS,OACnCuf,SAAS,EACTjY,QAAQ,EACRhF,WAAW,EACX2nB,eAAe,GAIvB,CACA,OAAOgxE,CACT,CAEO,8BAAOztE,CAAwB9zB,GACpC,MAAM4M,EAAQ5M,EAAS+zB,aAAaltB,OAAO8yC,UAAW3lB,GAAMA,EAAEhU,WAC9D,OAAkB,IAAXpT,EAAe,EAAIA,CAC5B,CAEO,2BAAO4iJ,CAAqB3hJ,EAAsB6kB,GACvD,OAAOA,EAAKnyB,OAAO,CAACgsE,EAAKv5C,IACnBA,EAAKjmB,QAIAw/D,EAHqBv5C,EAAK7nB,KAC9BzI,OAAQpE,GAAMA,EAAEqI,OAASkH,GACzBtN,OAAO,CAACkvJ,EAAMnxJ,IAAMmxJ,EAAOv/H,EAAuB0wB,aAAatiD,GAAI,GAG/DiuE,EAER,EACL,CAEO,wBAAOp7C,CAAkBnxB,yDAC9B,OAI4C,QAH1CkxE,EAE+E,QAF/EzX,EACoD,QADpDhT,EAAyB,QAAzB3kD,EAAiB,QAAjBC,EAAA/B,EAASmkB,gBAAQ,IAAApiB,OAAA,EAAAA,EAAEs4C,cAAM,IAAAv4C,EAAAA,EACmB,QAA5CsjB,EAAkC,QAAlCF,EAAwB,QAAxBnW,EAAiB,QAAjBD,EAAA9O,EAASmkB,gBAAQ,IAAArV,OAAA,EAAAA,EAAEklD,aAAK,IAAAjlD,OAAA,EAAAA,EAAE/O,gBAAQ,IAAAklB,OAAA,EAAAA,EAAEf,gBAAQ,IAAAiB,OAAA,EAAAA,EAAEi1B,cAAM,IAAAoM,EAAAA,EACmB,QAAvEiT,EAA6D,QAA7DJ,EAAmD,QAAnDC,EAA4C,QAA5CJ,EAAkC,QAAlCC,EAAwB,QAAxBJ,EAAiB,QAAjBC,EAAAj5D,EAASmkB,gBAAQ,IAAA80C,OAAA,EAAAA,EAAEjF,aAAK,IAAAgF,OAAA,EAAAA,EAAEh5D,gBAAQ,IAAAo5D,OAAA,EAAAA,EAAEj1C,gBAAQ,IAAAg1C,OAAA,EAAAA,EAAEnF,aAAK,IAAAuF,OAAA,EAAAA,EAAEv5D,gBAAQ,IAAAs5D,OAAA,EAAAA,EAAEn1C,gBAAQ,IAAAu1C,OAAA,EAAAA,EAAErf,cAAM,IAAAof,EAAAA,EAC7C,QAAlC0X,EAAwB,QAAxBvX,EAAc,QAAdC,EAAA75D,EAASg0D,aAAK,IAAA6F,OAAA,EAAAA,EAAE75D,gBAAQ,IAAA45D,OAAA,EAAAA,EAAEz1C,gBAAQ,IAAAgtD,OAAA,EAAAA,EAAE92B,cAAM,IAAA62B,EAAAA,EACmB,QAA7DM,EAAmD,QAAnDC,EAAyC,QAAzCH,EAAkC,QAAlCC,EAAwB,QAAxBH,EAAc,QAAdC,EAAArxE,EAASg0D,aAAK,IAAAqd,OAAA,EAAAA,EAAErxE,gBAAQ,IAAAoxE,OAAA,EAAAA,EAAEjtD,gBAAQ,IAAAotD,OAAA,EAAAA,EAAEvd,aAAK,IAAAsd,OAAA,EAAAA,EAAEtxE,gBAAQ,IAAAyxE,OAAA,EAAAA,EAAEttD,gBAAQ,IAAAqtD,OAAA,EAAAA,EAAEn3B,MAEnE,CAEO,4BAAOq1G,CAAsB1vJ,aAClC,MAAMm0D,EAA8B,QAAdpyD,EAAA/B,EAASg0D,aAAK,IAAAjyD,OAAA,EAAAA,EAAE/B,SACtC,OAC6B,OAA3Bm0D,aAAa,EAAbA,EAAehwC,WACM,MAArBnkB,EAASmkB,UACTnkB,EAASmkB,SAASrX,QAA+B,QAAtBhL,EAAAqyD,EAAchwC,gBAAQ,IAAAriB,OAAA,EAAAA,EAAEgL,SAC3B,QAAvBgC,EAAA9O,EAASmkB,SAAS6vC,aAAK,IAAAllD,OAAA,EAAAA,EAAEwW,YAAa6uC,EAAc7uC,UACnDtlB,EAASmkB,SAASk2B,SAAW8Z,EAAchwC,SAASk2B,SACuB,IAA7Ej+C,OAAOiE,KAAK6vB,EAAuBokC,oBAAoBt0D,IAAWrE,MAEtE,CAEO,eAAO6nC,CAASxjC,iBACrB,IAAqB,QAAjB+B,EAAA/B,EAASmkB,gBAAQ,IAAApiB,OAAA,EAAAA,EAAE2C,SAAU1E,EAASmkB,SAAS6vC,MACjD,OAAOh0D,EAASmkB,SAASzf,MACpB,CACL,MAAM0lJ,GAAwC,QAAxBt7I,EAAiB,QAAjBhN,EAAA9B,EAASmkB,gBAAQ,IAAAriB,OAAA,EAAAA,EAAEkyD,aAAK,IAAAllD,OAAA,EAAAA,EAAE9O,UAC5C1E,KAAKkoC,SAASxjC,EAASmkB,SAAS6vC,MAAMh0D,WACxB,QAAd+O,EAAA/O,EAASg0D,aAAK,IAAAjlD,OAAA,EAAAA,EAAE/O,UACd1E,KAAKkoC,SAASxjC,EAASg0D,MAAMh0D,UAC7B,GAEN,OAAA5D,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYgmJ,GAAmC,QAAjBllI,EAAAllB,EAASmkB,gBAAQ,IAAAe,OAAA,EAAAA,EAAExgB,MACnD,CACF,CAEO,0BAAO4vD,CAAoBt0D,+BAChC,MAAMoqJ,GAAwC,QAAxBtoJ,EAAiB,QAAjBC,EAAA/B,EAASmkB,gBAAQ,IAAApiB,OAAA,EAAAA,EAAEiyD,aAAK,IAAAlyD,OAAA,EAAAA,EAAE9B,WACH,QAAzC8O,EAAA9O,EAASmkB,SAAS6vC,MAAMh0D,SAASmkB,gBAAQ,IAAArV,OAAA,EAAAA,EAAEpK,QAAS,IACtC,QAAdqK,EAAA/O,EAASg0D,aAAK,IAAAjlD,OAAA,EAAAA,EAAE/O,YACkB,QAAhCklB,EAAAllB,EAASg0D,MAAMh0D,SAASmkB,gBAAQ,IAAAe,OAAA,EAAAA,EAAExgB,QAClC,GACAirJ,GAAgD,QAAxBlpG,EAAiB,QAAjBrhC,EAAAplB,EAASmkB,gBAAQ,IAAAiB,OAAA,EAAAA,EAAE4uC,aAAK,IAAAvN,OAAA,EAAAA,EAAEzmD,WACX,QAAzCi5D,EAAAj5D,EAASmkB,SAAS6vC,MAAMh0D,SAASmkB,gBAAQ,IAAA80C,OAAA,EAAAA,EAAEhpC,gBAAiB,IAC9C,QAAd+oC,EAAAh5D,EAASg0D,aAAK,IAAAgF,OAAA,EAAAA,EAAEh5D,YACkB,QAAhCo5D,EAAAp5D,EAASg0D,MAAMh0D,SAASmkB,gBAAQ,IAAAi1C,OAAA,EAAAA,EAAEnpC,gBAClC,GACAvrB,GAAyB,QAAjBy0D,EAAAn5D,EAASmkB,gBAAQ,IAAAg1C,OAAA,EAAAA,EAAEz0D,QAAS,GACpCurB,GAAiC,QAAjBspC,EAAAv5D,EAASmkB,gBAAQ,IAAAo1C,OAAA,EAAAA,EAAEtpC,gBAAiB,GAC1D,OAAO3rB,EAAAwC,YAAYpE,OACjBgC,EACA,CAACjE,EAAKlE,aACJ,OAAsB,MAAtB6tJ,EAAc3pJ,KACb+D,EAAAS,OAAOyvC,GAAG01G,EAAc3pJ,GAAMlE,KACL,QAA1BwF,EAAA4tJ,EAAsBlvJ,UAAI,IAAAsB,OAAA,EAAAA,EAAEquB,iBAAmC,QAAlBtuB,EAAAmuB,EAAcxvB,UAAI,IAAAqB,OAAA,EAAAA,EAAEsuB,eAEvE,CAEO,uBAAOD,CAAiBnwB,iBAC7B,IAAqB,QAAjB+B,EAAA/B,EAASmkB,gBAAQ,IAAApiB,OAAA,EAAAA,EAAEkuB,iBAAkBjwB,EAASmkB,SAAS6vC,MACzD,OAAOh0D,EAASmkB,SAAS8L,cACpB,CACL,MAAMm6H,GAAwC,QAAxBt7I,EAAiB,QAAjBhN,EAAA9B,EAASmkB,gBAAQ,IAAAriB,OAAA,EAAAA,EAAEkyD,aAAK,IAAAllD,OAAA,EAAAA,EAAE9O,UAC5C1E,KAAK60B,iBAAiBnwB,EAASmkB,SAAS6vC,MAAMh0D,WAChC,QAAd+O,EAAA/O,EAASg0D,aAAK,IAAAjlD,OAAA,EAAAA,EAAE/O,UACd1E,KAAK60B,iBAAiBnwB,EAASg0D,MAAMh0D,UACrC,GAEN,OAAA5D,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYgmJ,GAAmC,QAAjBllI,EAAAllB,EAASmkB,gBAAQ,IAAAe,OAAA,EAAAA,EAAE+K,cACnD,CACF,CAEO,sBAAOmB,CAAgBpxB,yDAC5B,OAI0C,QAHxCkxE,EAEyE,QAFzEzX,EACgD,QADhDhT,EAAuB,QAAvB3kD,EAAe,QAAfC,EAAA/B,EAASyyB,cAAM,IAAA1wB,OAAA,EAAAA,EAAEs4C,cAAM,IAAAv4C,EAAAA,EACiB,QAAxCsjB,EAAgC,QAAhCF,EAAsB,QAAtBnW,EAAe,QAAfD,EAAA9O,EAASyyB,cAAM,IAAA3jB,OAAA,EAAAA,EAAEklD,aAAK,IAAAjlD,OAAA,EAAAA,EAAE/O,gBAAQ,IAAAklB,OAAA,EAAAA,EAAEuN,cAAM,IAAArN,OAAA,EAAAA,EAAEi1B,cAAM,IAAAoM,EAAAA,EACiB,QAAjEiT,EAAyD,QAAzDJ,EAA+C,QAA/CC,EAAwC,QAAxCJ,EAAgC,QAAhCC,EAAsB,QAAtBJ,EAAe,QAAfC,EAAAj5D,EAASyyB,cAAM,IAAAwmC,OAAA,EAAAA,EAAEjF,aAAK,IAAAgF,OAAA,EAAAA,EAAEh5D,gBAAQ,IAAAo5D,OAAA,EAAAA,EAAE3mC,cAAM,IAAA0mC,OAAA,EAAAA,EAAEnF,aAAK,IAAAuF,OAAA,EAAAA,EAAEv5D,gBAAQ,IAAAs5D,OAAA,EAAAA,EAAE7mC,cAAM,IAAAinC,OAAA,EAAAA,EAAErf,cAAM,IAAAof,EAAAA,EACzC,QAAhC0X,EAAwB,QAAxBvX,EAAc,QAAdC,EAAA75D,EAASg0D,aAAK,IAAA6F,OAAA,EAAAA,EAAE75D,gBAAQ,IAAA45D,OAAA,EAAAA,EAAEnnC,cAAM,IAAA0+C,OAAA,EAAAA,EAAE92B,cAAM,IAAA62B,EAAAA,EACiB,QAAzDM,EAAiD,QAAjDC,EAAuC,QAAvCH,EAAgC,QAAhCC,EAAwB,QAAxBH,EAAc,QAAdC,EAAArxE,EAASg0D,aAAK,IAAAqd,OAAA,EAAAA,EAAErxE,gBAAQ,IAAAoxE,OAAA,EAAAA,EAAE3+C,cAAM,IAAA8+C,OAAA,EAAAA,EAAEvd,aAAK,IAAAsd,OAAA,EAAAA,EAAEtxE,gBAAQ,IAAAyxE,OAAA,EAAAA,EAAEh/C,cAAM,IAAA++C,OAAA,EAAAA,EAAEn3B,MAE/D,CAEO,mBAAO7pB,CAAaxwB,GACzB,OAAOA,EAAS2gD,cAAc/iD,KAAK,CAACi2B,EAAIh4B,IAAMP,KAAKmM,KAAKzH,EAAUnE,GAAG+B,KAAMgmB,GAAe,MAATA,EAAEjb,KACrF,CAEO,yBAAOinJ,CAAmB5vJ,GAC/B,OAAOA,EAAS2gD,cAAc/iD,KAAK,CAACi2B,EAAIh4B,IACtCP,KAAKmM,KAAKzH,EAAUnE,GAAG+B,KAAMgmB,GAAoB,MAAdA,EAAE0M,UAAoB1M,EAAE0M,SAASqkC,SAAW/wC,EAAE0M,SAASgD,QAE9F,CAEO,6BAAOu8H,CAAuB/iJ,GACnC,OAAQA,GACN,IAAK,OAQL,IAAK,SACH,MAAO,GAPT,IAAK,KACH,MAAO,CAAC,OACV,IAAK,KACH,MAAO,CAAC,MAAO,IAAK,MACtB,IAAK,MACH,MAAO,CAAC,KAAM,OAIpB,CAEO,oBAAOs2D,CACZt2D,EACAL,EACA2oD,EAGI,UAEJ,OAAQtoD,GACN,IAAK,OACH,MAAO,CACLC,SAAS,EACT5B,KAAM,CACJ2B,KAAM,OACNpI,MAAO,GACPurB,cAAe,KAIrB,IAAK,KAAM,CACT,MAAM3C,EAAY7gB,EAAK,GAAKjI,EAAAS,OAAOuuC,SAAS/mC,EAAK,IAAMjI,EAAAS,OAAOE,MAAM,EAAG,MACjEooB,EAAY9gB,EAAK,GAAKjI,EAAAS,OAAOuuC,SAAS/mC,EAAK,IAAMjI,EAAAS,OAAOE,MAAM,EAAG,MA2BvE,MAAO,CACL4H,SAAS,EACT5B,KAAM,CACJ2B,KAAM,KACNpI,MA9ByB,CAC3B4oB,UAAWA,QAAAA,EAAa9oB,EAAAS,OAAOE,MAAM,EAAG,MACxCqzD,UAAW/rD,EAAK,GAAK6zD,SAAS7zD,EAAK,GAAI,IAAM,EAC7CgsD,eAAgBhsD,EAAK,GAAK6zD,SAAS7zD,EAAK,GAAI,IAAM,EAClD8gB,UAAWA,QAAAA,EAAa/oB,EAAAS,OAAOE,MAAM,EAAG,MACxCuzD,SAAUjsD,EAAK,GAAK6zD,SAAS7zD,EAAK,GAAI,KAAuB,QAAhB1K,EAAAwrB,aAAS,EAATA,EAAWhxB,aAAK,IAAAwF,EAAAA,EAAI,GAAK,EAAI,EAAI,EAC9E42D,eAAgBlsD,EAAK,GAAK6zD,SAAS7zD,EAAK,GAAI,IAAM,GAyBhDwjB,cAAe,GACfoqB,OAxBW,8jBA2BjB,CACA,IAAK,KAAM,CACT,MAAM/sB,EAAY7gB,EAAK,GAAKjI,EAAAS,OAAOuuC,SAAS/mC,EAAK,IAAMjI,EAAAS,OAAOE,MAAM,EAAG,MAevE,MAAO,CACL4H,SAAS,EACT5B,KAAM,CACJ2B,KAAM,KACNpI,MAlByB,CAC3B4oB,UAAWA,QAAAA,EAAa9oB,EAAAS,OAAOE,MAAM,EAAG,MACxCiqB,QAAS3iB,EAAK,GAAK6zD,SAAS7zD,EAAK,GAAI,IAAM,EAC3CmsD,QAASnsD,EAAK,GAAK6zD,SAAS7zD,EAAK,GAAI,IAAM,GAgBzCwjB,cAAe,GACfoqB,OAfW,yLAkBjB,CACA,IAAK,MAAO,CACV,MAAM/sB,EAAY7gB,EAAK,GAAKjI,EAAAS,OAAOuuC,SAAS/mC,EAAK,IAAMjI,EAAAS,OAAOE,MAAM,EAAG,MAQvE,MAAO,CACL4H,SAAS,EACT5B,KAAM,CACJ2B,KAAM,MACNpI,MAXyB,CAC3BgE,KAAM+D,EAAK,GAAK6zD,SAAS7zD,EAAK,GAAI,IAAM,EACxC6gB,UAAWA,QAAAA,EAAa9oB,EAAAS,OAAOE,MAAM,EAAG,OAUtC8qB,cAAe,GACfoqB,OATW,wFAYjB,CACA,IAAK,SAAU,CACb,MAAMA,EAAS+a,EAAK/a,OACpB,IAAI5pC,EACJ,MAAM/L,MAAEA,EAAKurB,cAAEA,GAAkBgP,EAAAU,yBAAyByhC,kBAAkB30D,EAAOQ,IACjFwD,EAAexD,IAEjB,OAAIwD,EACK,CACL1D,SAAS,EACToF,MAAO1B,GAGJ,CACL1D,SAAS,EACT5B,KAAM,CACJ2B,KAAM,SACNpI,QACAurB,gBACAoqB,SACA2Z,MAAOoB,EAAKkO,cAAgB,CAAEh+C,SAAU8vC,EAAKkO,cAAeljE,OAAQ,iBAAeiJ,GAGzF,EAEJ,CAEO,sBAAOymJ,CAAgB9vJ,GAC5B,MAAMmkB,EAAWnkB,EAASmkB,SAC1B,IAAKA,EACH,OAEF,MAAMxd,EAAOwd,EAASrX,KAChBpI,EAAQwrB,EAAuBsT,SAASxjC,GAC9C,MAAa,OAAT2G,EACK,CACLmG,KAAM,SACNijJ,SAAUrrJ,EAAM4oB,UAChB0iI,kBAAmBtrJ,EAAM8zD,UACzBy3F,iBAAkBvrJ,EAAM+zD,eACxBy3F,SAAUxrJ,EAAM6oB,UAChB4iI,iBAAkBzrJ,EAAMg0D,SACxB03F,gBAAiB1rJ,EAAMi0D,gBAEP,OAAThyD,EACF,CACLmG,KAAM,SACNijJ,SAAUrrJ,EAAM4oB,UAChB8B,QAAS1qB,EAAM0qB,QACfwpC,QAASl0D,EAAMk0D,SAEC,QAATjyD,EACF,CACLmG,KAAM,UACNijJ,SAAUrrJ,EAAM4oB,UAChB5kB,KAAMhE,EAAMgE,MAEI,WAAT/B,EACF,CAAEmG,KAAM,eADV,CAIT,CAEO,4BAAOs5D,CAAsB9gD,EAAkBzf,GACpD,MAAM65B,EAAeV,EAAAO,UAAUC,iBAAiB35B,IAC1Cc,KAAEA,EAAI5G,UAAEA,GAAck/B,EAAAU,yBAAyBC,iBAAiBta,EAAUzf,EAASM,UAAWu5B,GAC9F1/B,EAAWuE,EAAA0B,SAAS2uI,WAAWjuI,EAAMd,EAASM,UAAWu5B,GAC/D,OAAgB,MAAZ1/B,GAAoBuE,EAAA0B,SAAS0tI,SAAS3zI,EAASF,GAAI+F,EAASM,WACvD5B,EAAA0B,SAASmsI,eAAezrI,EAAM5G,EAAWC,EAAU6F,GAErD,GAAGc,IAAO5G,EAAY,MAAK,EAAAwE,EAAAgkE,eAAcxoE,KAAe,IACjE,CAEO,8BAAOggF,CACZlgF,EACA2uC,EACA3oC,EACA+G,GAEA,MAAM+iB,EAAe9vB,EAAMG,SACrBA,EAAWuE,EAAA0B,SAASC,IAAIypB,EAAc9pB,EAASM,WAC/Cmf,EAAW/gB,EAAA0B,SAASqf,SAAStlB,EAAU6F,GACvCi6C,EAAYxkD,KAAK8qE,sBAAsB9gD,EAAUzf,IACjDc,KAAEA,EAAI5G,UAAEA,GAAck/B,EAAAU,yBAAyBC,iBACnDta,EACAzf,EAASM,UACT64B,EAAAO,UAAUC,iBAAiB35B,IAEvB86C,EAAuD,CAC3D,CACE3gC,WAAW,EACXvY,KAAM5H,EAAM4H,KAAKtH,IAAKkH,YAAQ,OAC5BipB,SAAU,CACRswB,aAAc,EACdttB,OAAyB,QAAjBvxB,EAAAsF,EAAI+G,qBAAa,IAAArM,EAAAA,EAAIsF,EAAIqB,KACjCisD,OAAQttD,EAAI+nB,QACZvJ,UAAWxe,EAAIwe,QACf0K,eAAe,GAEjB1nB,MAAOxB,EAAIwB,MACXF,IAAKtB,EAAIsB,IACTiF,OAAQvG,EAAIuG,OACZusD,WAAY31D,EAAAS,OAAOG,MAAMiC,EAAI4qB,gBAAkB5qB,EAAI4qB,eAAe11B,WAAQ8M,EAC1EhD,OAAS7B,EAAAS,OAAOG,MAAMiC,EAAI4qB,qBAAwD5oB,EAAlB,QAAnBvH,EAAAuF,EAAIge,uBAAe,IAAAvjB,EAAAA,EAAIuF,EAAIhB,OACxEuC,UAAWvB,EAAIuB,eAIfynJ,EAAoBppJ,EAAAC,gBAAgB+B,QACxC3E,EAAAwC,YAAYD,OACVI,EAAAC,gBAAgBopJ,YAAYzwJ,EAAMykB,WAAajd,cAC7C,MAAO,GAAoB,QAAjBtF,EAAAsF,EAAI+G,qBAAa,IAAArM,EAAAA,EAAIsF,EAAIqB,SAA0C,QAAjCoG,EAAmB,QAAnBhN,EAAAuF,EAAIge,uBAAe,IAAAvjB,EAAAA,EAAIuF,EAAIhB,cAAM,IAAAyI,EAAAA,EAAI,CAAEvS,MAAO,KAAMA,YAIhG6iC,EAA2C,CAC/Ct/B,GAAI8P,EAAAsB,WAAWC,YAAY,GAC3B1Q,IAAK67C,EAAApd,WAAWG,iBAAiBr/B,GACjCslB,WACAw6B,YACAtR,UACA7e,eACAywB,OAAQ,GACRX,UAAW,GACXrB,cAAexxC,EACf8zC,MAAO,EACPz/C,KAAM,GACNob,KAAM,GACNtc,YACA4G,OACA4Y,KAAM,EACNyR,uBAAwB,GACxB2vB,cAAeA,EACfr8B,WAAY+rI,EAAkBlwJ,IAAK2H,sBAAU,OAC3CgF,KAAM,SACN8zC,aAAc94C,EAAMnM,OACpB+M,KAA+C,QAAzCqG,EAAuB,QAAvBjN,EAAQ,QAARC,EAAA+F,EAAM,UAAE,IAAA/F,OAAA,EAAAA,EAAEqM,qBAAa,IAAAtM,EAAAA,EAAY,QAARgN,EAAAhH,EAAM,UAAE,IAAAgH,OAAA,EAAAA,EAAEpG,YAAI,IAAAqG,EAAAA,EAAI,EACnD1I,OAAiC,QAAzB+e,EAAQ,QAARF,EAAApd,EAAM,UAAE,IAAAod,OAAA,EAAAA,EAAEG,uBAAe,IAAAD,EAAAA,EAAY,QAARqhC,EAAA3+C,EAAM,UAAE,IAAA2+C,OAAA,EAAAA,EAAEpgD,UAEjD0tB,aAAc,CAAEltB,OAAQ,IACxBg6C,QAAS,GACTC,OAAQ,CACNx7B,SAAU,CAAE/F,KAAM,EAAGwhC,OAAQ,EAAGvlD,KAAM,EAAGD,GAAI,KAG3Cy1B,EAAyB11B,KAAKmuJ,sBAAsBrqH,EAAiBuhB,GAE3E,OADAvhB,EAAgBpO,uBAAyBA,EAClCoO,CACT,EA/sBF9iC,EAAA4zB,uBAAAA,2BCjEA,IAAiBshB,sEAAjB,SAAiBA,GACf,SAAgB0uF,EAAOtmB,EAAiC22C,EAAuBC,GAC7E,IAAIplI,EAQJ,OANEA,EADqB,iBAAZwuF,EACF,IAAIvuF,KAAKA,KAAKjgB,MAAMwuG,IACC,iBAAZA,EACT,IAAIvuF,KAAKuuF,GAETA,EAEFxuF,EAAKqlI,wBAAmBpnJ,EAAW,CACxCkyH,QAAUg1B,OAAwBlnJ,EAAV,QACxBqnJ,KAAOF,OAAuBnnJ,EAAZ,UAClBsnJ,MAAO,QACPh+H,IAAK,WAET,CAqLA,SAAgBwsF,EAAgBvF,EAAiB6jC,EAAoB,KACnE,OAAOjsG,EAAUsoE,aAAaF,EAAS6jC,GAAWjyE,aACpD,CAtMgBh6B,EAAA0uF,OAAMA,EAiBN1uF,EAAAo/G,eAAhB,SAA+Bh3C,GAC7B,IAAIxuF,EAQJ,OANEA,EADqB,iBAAZwuF,EACF,IAAIvuF,KAAKA,KAAKjgB,MAAMwuG,IACC,iBAAZA,EACT,IAAIvuF,KAAKuuF,GAETA,EAEFxuF,EAAKqlI,wBAAmBpnJ,EAAW,CACxCkyH,QAAS,QACTm1B,KAAM,UACNC,MAAO,QACPh+H,IAAK,UACLk+H,KAAM,UACNC,OAAQ,WAEZ,EAEgBt/G,EAAAC,eAAhB,SAA+BrmB,EAA8BqyH,EAAoB,KAC/E,MAAMzpH,EAAI,IAAI3I,KAAKD,GACnB,IAAIulI,EAAQ,GAAG38H,EAAEgmF,WAAa,IAC1BrnF,EAAM,GAAGqB,EAAEimF,YACf,MAAMy2C,EAAO,GAAG18H,EAAE+lF,gBASlB,OAPI42C,EAAMh1J,OAAS,IACjBg1J,EAAQ,IAAIA,KAEVh+H,EAAIh3B,OAAS,IACfg3B,EAAM,IAAIA,KAGL,CAAC+9H,EAAMC,EAAOh+H,GAAK7oB,KAAK2zI,EACjC,EAEgBjsG,EAAAu/G,kBAAhB,SAAkC3lI,GAChC,MAAM4I,EAAI,IAAI3I,KAAKD,GACnB,IAAIulI,EAAQ,GAAG38H,EAAEg9H,cAAgB,IAC7Br+H,EAAM,GAAGqB,EAAEi9H,eACf,MAAMP,EAAO,GAAG18H,EAAEk9H,mBASlB,OAPIP,EAAMh1J,OAAS,IACjBg1J,EAAQ,IAAIA,KAEVh+H,EAAIh3B,OAAS,IACfg3B,EAAM,IAAIA,KAGL,CAAC+9H,EAAMC,EAAOh+H,GAAK7oB,KAAK,IACjC,EAEgB0nC,EAAA2/G,sBAAhB,SAAsC/lI,GACpC,MAAM4I,EAAI,IAAI3I,KAAKD,GACnB,IAAIV,EAAU,GAAGsJ,EAAEzI,kBACfX,EAAQ,GAAGoJ,EAAE1I,gBACbqH,EAAM,GAAGqB,EAAEi9H,eACXN,EAAQ,GAAG38H,EAAEg9H,cAAgB,IACjC,MAAMN,EAAO,GAAG18H,EAAEk9H,mBAelB,OAbIxmI,EAAQ/uB,OAAS,IACnB+uB,EAAU,IAAIA,KAEZE,EAAMjvB,OAAS,IACjBivB,EAAQ,IAAIA,KAEV+lI,EAAMh1J,OAAS,IACjBg1J,EAAQ,IAAIA,KAEVh+H,EAAIh3B,OAAS,IACfg3B,EAAM,IAAIA,KAGL,GAAG,CAAC+9H,EAAMC,EAAOh+H,GAAK7oB,KAAK,QAAQ8gB,KAASF,GACrD,EAEgB8mB,EAAA4/G,kBAAhB,SAAkCx3C,GAChC,MAAMvnE,EAAQunE,EAAQvnE,MAAM,gDAC5B,GAAa,MAATA,EAAe,CACjB,MAAO,CAAEq+G,EAAMC,EAAOh+H,EAAK/H,EAAOF,EAASQ,GAAWmnB,EACtD,OAAO,IAAIhnB,KACT,IAAIA,KACFi1C,SAASowF,EAAM,IACfpwF,SAASqwF,EAAO,IAAM,EACtBrwF,SAAS3tC,EAAK,IACd2tC,SAAS11C,EAAO,IAChB01C,SAAS51C,EAAS,IAClB41C,SAASp1C,EAAS,KAGxB,CAEF,EAEgBsmB,EAAA6/G,mBAAhB,SAAmCjmI,EAA8BqyH,EAAoB,IACnF,MAAMzpH,EAAI,IAAI3I,KAAKD,GACnB,IAAIF,EAAU,GAAG8I,EAAEomF,eACf1vF,EAAU,GAAGsJ,EAAEmmF,eACfvvF,EAAQ,GAAGoJ,EAAEkmF,aACbvnF,EAAM,GAAGqB,EAAEimF,YACX02C,EAAQ,GAAG38H,EAAEgmF,WAAa,IAC9B,MAAM02C,EAAO,GAAG18H,EAAE+lF,gBAkBlB,OAhBI7uF,EAAQvvB,OAAS,IACnBuvB,EAAU,IAAIA,KAEZR,EAAQ/uB,OAAS,IACnB+uB,EAAU,IAAIA,KAEZE,EAAMjvB,OAAS,IACjBivB,EAAQ,IAAIA,KAEV+lI,EAAMh1J,OAAS,IACjBg1J,EAAQ,IAAIA,KAEVh+H,EAAIh3B,OAAS,IACfg3B,EAAM,IAAIA,KAGL,CAAC+9H,EAAMC,EAAOh+H,EAAK/H,EAAOF,EAASQ,GAASphB,KAAK2zI,EAC1D,EAEgBjsG,EAAAq8B,wBAAhB,SAAwCziD,EAAqB0iD,GAC3D,MAAM95C,EAAI,IAAI3I,KAAKD,GACnB,IAAIkmI,EAAUt9H,EAAEu9H,SACZzjF,GAAmC,IAAZwjF,IACzBA,EAAU,GAEZ,MACME,EADax9H,EAAEimF,UACmBq3C,GAAWxjF,EAAsB,EAAI,GAE7E,OADgB,IAAIziD,KAAK2I,EAAE+lF,cAAe/lF,EAAEgmF,WAAYw3C,GACzChxH,SACjB,EAEgBgR,EAAAigH,uBAAhB,SAAuCrmI,EAAqB0iD,GAC1D,MAAM95C,EAAI,IAAI3I,KAAKD,GACnB,IAAIkmI,EAAUt9H,EAAEu9H,SACZzjF,GAAmC,IAAZwjF,IACzBA,EAAU,GAEZ,MACMI,EADa19H,EAAEimF,WACc,EAAIq3C,IAAYxjF,EAAsB,EAAI,GAE7E,OADgB,IAAIziD,KAAK2I,EAAE+lF,cAAe/lF,EAAEgmF,WAAY03C,EAAc,GAAI,GAAI,IAC/DlxH,SACjB,EAEgBgR,EAAAmzF,aAAhB,SAA6Bv5G,EAA8BumI,GAAkB,GAC3E,MAAM39H,EAAI,IAAI3I,KAAKD,GACnB,IAAIF,EAAU,GAAG8I,EAAEomF,eACf1vF,EAAU,GAAGsJ,EAAEmmF,eACfvvF,EAAQ,GAAGoJ,EAAEkmF,aAEbhvF,EAAQvvB,OAAS,IACnBuvB,EAAU,IAAIA,KAEZR,EAAQ/uB,OAAS,IACnB+uB,EAAU,IAAIA,KAEZE,EAAMjvB,OAAS,IACjBivB,EAAQ,IAAIA,KAEd,IAAIzmB,EAAS,CAACymB,EAAOF,EAASQ,GAASphB,KAAK,KAI5C,OAHI6nJ,IACFxtJ,GAAU,IAAI6vB,EAAE49H,qBAEXztJ,CACT,EAEgBqtC,EAAAsoE,aAAhB,SAA6BF,EAAiB6jC,EAAoB,KAChE,MAAMhB,EAAS,IAAIh8G,OAAO,YAAYg9G,YAAoBA,cACpDoU,EAAmBj4C,EAAQvnE,MAAMoqG,GACvC,GAAIoV,EAAkB,CACpB,MAAO,CAAEnB,EAAMC,EAAOh+H,GAAOk/H,EAE7B,OADa,IAAIxmI,KAAKi1C,SAASowF,EAAM,IAAKpwF,SAASqwF,EAAO,IAAM,EAAGrwF,SAAS3tC,EAAK,IAEnF,CACE,OAAO,IAAItH,KAAKA,KAAKymI,IAAI,KAAM,EAAG,GAEtC,EAEgBtgH,EAAA2tE,gBAAeA,EAIf3tE,EAAAugH,aAAhB,SAA6B3mI,GAC3B,MAAM4I,EAAI,IAAI3I,KAAKD,GACnB,MAAO,CAAC4I,EAAEk9H,iBAAkBl9H,EAAEg9H,cAChC,EAEgBx/G,EAAAwgH,aAAhB,SAA6B5mI,GAE3B,OADU,IAAIC,KAAK8zF,EAAgB/zF,IAC1BqlI,wBAAmBpnJ,EAAW,CAAEkyH,QAAS,QACpD,EAEgB/pF,EAAAygH,YAAhB,SAA4BpsE,EAA+BqB,GACzD,MAAMgrE,EAAY,IAAI7mI,KAAKw6D,GACrBssE,EAAU,IAAI9mI,KAAK67D,GACzB,OAAIgrE,EAAUn4C,gBAAkBo4C,EAAQp4C,cAC/B,GAAGmmB,EAAOgyB,GAAW,QAAWhyB,EAAOiyB,GAAS,KAEnDD,EAAUl4C,aAAem4C,EAAQn4C,WAG5B,GAFgBk4C,EAAUzB,wBAAmBpnJ,EAAW,CAAEsnJ,MAAO,QAASh+H,IAAK,iBACjEw/H,EAAQ1B,wBAAmBpnJ,EAAW,CAAEsnJ,MAAO,QAASh+H,IAAK,gBACnCu/H,EAAUn4C,gBAGlD,GADOm4C,EAAUzB,wBAAmBpnJ,EAAW,CAAEsnJ,MAAO,aAC5CuB,EAAUj4C,aAAak4C,EAAQl4C,cAAci4C,EAAUn4C,eAGhF,CACD,CAnOD,CAAiBvoE,IAASl1C,EAAAk1C,UAATA,EAAS,sGCA1B,MAAApQ,EAAAnjC,EAAA,OACA6wB,EAAA7wB,EAAA,OAEAqG,EAAArG,EAAA,OACAojC,EAAApjC,EAAA,OAEAm0J,EAAAn0J,EAAA,MAEAixB,EAAAjxB,EAAA,OACAgxB,EAAAhxB,EAAA,OACAs+C,EAAAt+C,EAAA,OACAgyD,EAAAhyD,EAAA,OAEA,IAAiBqxC,GAAjB,SAAiBA,GACCA,EAAA+iH,mCAAhB,SACE7uJ,EACA4gB,EACAvd,GAEA,MAAMnC,EAAQuqB,EAAAiB,uBAAuBsT,SAASpf,GAE9C,GADAvd,EAASvC,EAAAwC,YAAYw0E,KAAK52E,EAAOmC,GACO,IAApCvC,EAAAwC,YAAYzG,KAAKwG,GAAQlL,OAC3B,OAAO6H,EAET,IAAK4gB,EAAgBD,SACnB,OAAO3gB,EAET,MAAM89F,EAAqBh9F,EAAAwC,YAAY2sB,MAAMjwB,GAkB7C,OAjBA0rB,EAAAwC,GAAGC,SAAS2vE,EAAmB1vE,MAAQ2vE,UACrC,GAAIA,EAAG9gG,MAAQ2jB,EAAgB3jB,IAAK,CAClC,MAAM0jB,EAAWo9E,EAAGp9E,SACpB,GAAIA,EACF,IAAK,MAAOxf,EAAUC,KAAaN,EAAAwC,YAAYvE,QAAQsE,GACrC,MAAZjC,IAC2B,QAAtB7C,EAAAoiB,EAAS8L,qBAAa,IAAAluB,UAAAA,EAAG4C,IAGhCwf,EAASzf,MADK,MAAZE,GAAwC,iBAAbA,GACZ,EAAAwtJ,EAAA/tJ,qBAAoBK,EAAOC,EAAUC,GAExCxI,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAQ+f,EAASzf,OAAK,CAAEC,CAACA,GAAWC,GAI1D,IAEK08F,CACT,EAEgBhyD,EAAAgjH,cAAhB,SAA8B1vH,EAAqBp/B,EAAmB+uJ,IACpE,EAAAlxH,EAAA6B,aACEN,EACA,EACE,EAAAxB,EAAA+B,MACG19B,EAAE,WACFA,EAAE,YACFC,aAAc8sJ,GAASA,EAAK9vJ,OAAQ+C,GAAMA,EAAE3F,KAAO0D,EAAQ1D,MAC9D,EAAAshC,EAAA+B,MACG19B,EAAE,WACFA,EAAE,oBACFC,aAAc5F,IAAM,IAAAiC,EAAAD,EACnB,OAAAhC,IAAO0D,EAAQ1D,GAA8D,QAAxDgC,EAAoD,QAApDC,EAAAwwJ,EAAe7vJ,OAAQ+C,GAAMA,EAAE3F,KAAO0D,EAAQ1D,IAAI,UAAE,IAAAiC,OAAA,EAAAA,EAAEjC,UAAE,IAAAgC,EAAAA,EAAIgtB,EAAAgnD,eAAkBh2E,KAGzG,iBAEJ,EAEgBwvC,EAAAmjH,QAAhB,SAAwB7vH,EAAqBp/B,EAAmBmD,IAC9D,EAAA06B,EAAA6B,aACEN,EACA,EACE,EAAAxB,EAAA+B,MAAa19B,EAAE,WAAWA,EAAE,YAAY6vE,OAAO,KAAM9xE,EAAQ1D,IAAI2F,EAAE,QAAQ3C,OAAO6D,IAClF,EAAAy6B,EAAA+B,MAAa19B,EAAE,WAAWA,EAAE,YAAY6vE,OAAO,KAAM9xE,EAAQ1D,IAAI0F,GAAG,WAAWC,EAAE,QAAQ3C,OAAO6D,IAElG,sBAEJ,EAEgB2oC,EAAA0vC,iBAAhB,SAAiCl/E,EAAY0D,EAAmBkvJ,EAAuBjyJ,GACrF,MAAO,CACLX,KACAqO,QAAS,CAAE3K,QAAOpH,OAAAgI,OAAA,GAAOZ,IACzBo6C,GAAI,CACF/qB,UAA+B,OAApB6/H,aAAU,EAAVA,EAAYhgI,MAAeggI,EAAWhgI,KAAO,EAAI,EAC5DggI,WAAYA,EAAYt2J,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAMsuJ,GAAU,CAAEjyJ,aAAQ4I,EAClD2d,KAAM,KACN2rI,WAAY,CAAEhnF,KAAM,IAAIlpE,IAAOu7C,UAAW,IAAIv7C,KAC9Cs7C,MAAO,CAAEC,UAAW,IAAIv7C,KACxBmwJ,OAAQ,CAAE50G,UAAW,IAAIv7C,MAE3B4S,QAAS,CAAEw9I,KAAM,GAAIC,OAAQ,IAEjC,EAEgBxjH,EAAAC,gCAAhB,SACE/rC,EACAqC,EACApF,EACA+tC,EACAukH,GAEA,MAAMlrH,EAAmB/Y,EAAAta,QAAQszB,SAAStkC,EAASqC,GAC7Cue,EAAkB0K,EAAAta,QAAQgsC,wBAAwB3Y,EAAkBpnC,GAC1E,MAAO,CACL0N,QAAS,CAAE3K,QAASc,EAAAwC,YAAY2sB,MAAMjwB,IACtC6R,QAAS,CAAEw9I,KAAM,GAAIC,OAAQ,IAC7Bl1G,GAAI,CACF/qB,UAAW2b,EAAQ9b,KAAO,EAC1BsgI,qBAAqB5uI,aAAe,EAAfA,EAAiBD,UACtC8uI,mBAAmB7uI,aAAe,EAAfA,EAAiBqO,QACpCygI,aAAcH,EAAc,EAAI,EAChCI,oBAAqBJ,EAAc,OAAI1pJ,GAG7C,EAEgBimC,EAAAqN,OAAhB,SAAuB/Z,EAAqBj8B,GAC1C,MAAM8pC,EAAUr0C,OAAAgI,OAAAhI,OAAAgI,OAAA,GACX0qB,EAAAta,QAAQmoC,OAAOh2C,IAAK,CACvBhG,QAAS,CACPy3D,MAAO,UACPzxD,OACAirB,MAAO,CAAC,CAAEjrB,KAAM,SAAUqsB,KAAM,CAAC,CAAErsB,KAAM,QAASgwD,aAAc,WAIpE,EAAAt1B,EAAA6B,aACEN,EACA,EACE,EAAAxB,EAAA+B,MACG19B,EAAE,WACFA,EAAE,YACFC,aAAc8sJ,GAAS,IAAIA,EAAM/hH,KACpC,EAAArP,EAAA+B,MAAa19B,EAAE,WAAWA,EAAE,oBAAoB3C,OAAO2tC,EAAW3wC,KAEpE,kBAEF8iC,EAASqtB,EAAAvtB,MAAM6L,oBACjB,EAEgBe,EAAAmnG,cAAhB,SAA8B7zG,EAAqBp/B,IACjD,EAAA69B,EAAA6B,aACEN,EACA,EAAC,EAAAxB,EAAA+B,MAAa19B,EAAE,WAAWA,EAAE,YAAY6vE,OAAO,KAAM9xE,EAAQ1D,IAAIgD,OAAOU,IACzE,iBAEJ,EAEgB8rC,EAAA8jH,kBAAhB,SACE5vJ,EACAqkC,EACAhiC,GAEA,MAAMs5C,EAAa,IAAI5C,EAAAM,iBAAiBhV,EAAkBhiC,GAAUi3C,mBACpE,OAAA1gD,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYZ,GAAO,CAAE7C,QAASw+C,GAChC,CACD,CA/ID,CAAiB7P,IAAWhzC,EAAAgzC,YAAXA,EAAW,8BCb5B,IAAiBlc,sEAyEjB92B,EAAA+lB,EAAA,SAAkB9lB,EAAe82J,EAAoB,GACnD,MAAO,GAAGjgI,EAAUkf,WAAW/1C,EAAO82J,IACxC,EA3EA,SAAiBjgI,GACf,SAAgBsY,EAAMnvC,EAAehB,GACnC,OAAO+2C,EAAWhxC,KAAKoqC,MAAMnvC,EAAQhB,GAAMA,EAAI,EACjD,CAsBA,SAAgB+2C,EAAW/1C,EAAe82J,GACxC,OAAQ92J,EAAMu2C,QAAQugH,EACxB,CA1BgBjgI,EAAAsY,MAAKA,EAILtY,EAAAkgI,UAAhB,SAA0B/2J,GACxB,OAAOmvC,EAAMnvC,EAAO,GACtB,EAEgB62B,EAAAof,WAAhB,SAA2Bj2C,GACzB,OAAOmvC,EAAMnvC,EAAO,IACtB,EAEgB62B,EAAA46H,YAAhB,SAA4BzxJ,GAC1B,OAAOmvC,EAAMnvC,EAAO,KACtB,EAEgB62B,EAAAmgI,aAAhB,SAA6Bh3J,GAC3B,OAAOmvC,EAAMnvC,EAAO,KACtB,EAEgB62B,EAAAyiB,cAAhB,SAA8Bt5C,GAC5B,OAAOmvC,EAAMnvC,EAAO,KACtB,EAEgB62B,EAAAkf,WAAUA,EAIVlf,EAAApD,QAAhB,SAAwB5xB,EAAW6D,EAAWs1C,GAC5C,MAAY,MAARA,EACKt1C,EACU,OAARs1C,EACFn5C,EAAI6D,EACM,OAARs1C,EACFn5C,EAAI6D,EACM,OAARs1C,EACFnkB,EAAUof,WAAWp0C,EAAI6D,GAEzBmxB,EAAUof,WAAWp0C,EAAI6D,EAEpC,EAEgBmxB,EAAAk0B,MAAhB,SAAsB/qD,EAAe07C,EAAcxM,GACjD,OAAW,MAAPwM,GAAsB,MAAPxM,EACVnqC,KAAKmqC,IAAIwM,EAAK32C,KAAK22C,IAAIxM,EAAKlvC,IACnB,MAAP07C,EACF32C,KAAKmqC,IAAIwM,EAAK17C,GACL,MAAPkvC,EACFnqC,KAAK22C,IAAIxM,EAAKlvC,GAEdA,CAEX,EAEgB62B,EAAAogI,OAAhB,SAAuBh+G,GACrB,GAAW,MAAPA,EAGJ,MAAO,CAAC,OAAQ,MAAO,MAAO,QAAS,OAAQ,OAAQ,MAAO,QAAS,QAAS,OAAQ,MAAO,SAAU,UACvGA,EAEJ,EAEgBpiB,EAAAhoB,MAAhB,SAAsB7O,GACpB,GAAa,MAATA,EACF,OAEF,MAAMi5C,EAAMoR,OAAOrqD,GACnB,OAAOwI,MAAMywC,QAAOnsC,EAAYmsC,CAClC,CACD,CAvED,CAAiBpiB,IAAS92B,EAAA82B,UAATA,EAAS,8BCC1B,IAAiBpiB,wEAAjB,SAAiBA,GAsGf,SAAgBiiE,EAAS7gC,GACvB,IAAI1xC,EAAO,EACX,IAAK,IAAI7E,EAAI,EAAGA,EAAIu2C,EAAIz2C,OAAQE,IAC9B6E,GAAQA,GAAQ,GAAKA,EAAO0xC,EAAI/wC,WAAWxF,GAC3C6E,GAAQ,EAEV,OAAOA,CACT,CA5GgBsQ,EAAA6Z,IAAhB,SAAoBunB,EAAa3oB,EAAegL,EAAe,KAC7D,OAAO2d,EAAIz2C,QAAU8tB,EAAQ2oB,EAAM,IAAIr2C,MAAM0tB,EAAQ2oB,EAAIz2C,OAAS,GAAGmO,KAAK2qB,GAAQ2d,CACpF,EAEgBphC,EAAA2yE,WAAhB,SAA2BuV,GACzB,OAAOA,EAAO,GAAGynC,cAAgBznC,EAAOj9F,MAAM,EAChD,EAEgB+U,EAAA+nE,UAAhB,SAA0BmgB,EAAgBjjE,GACxC,MAAO,GAAGijE,IAAmB,IAAVjjE,EAAc,IAAM,IACzC,EAEgBjlB,EAAAC,SAAhB,SAAyBioF,GACvB,OAAOA,EAAOxyF,QAAQ,QAAS,IAAIA,QAAQ,OAAQ,KAAK0K,aAC1D,EAEgBJ,EAAAyiJ,WAAhB,SAA2Bv6D,GACzB,OAAOA,EAAOxyF,QAAQ,KAAM,IAC9B,EAEgBsK,EAAA0iJ,YAAhB,SAA4Bx6D,GAC1B,OAAOA,EAAOxyF,QAAQ,kBAAmB,QAC3C,EAEgBsK,EAAA2iJ,UAAhB,SAA0Bz6D,GACxB,OAAOA,EACJxyF,QAAQ,sBAAuB,CAACktJ,EAAQhnJ,IAAqB,IAAVA,EAAcgnJ,EAAOxiJ,cAAgBwiJ,EAAOjzB,eAC/Fj6H,QAAQ,OAAQ,GACrB,EAEgBsK,EAAA6iJ,UAAhB,SAA0B36D,GACxB,OAAOA,EAAOxyF,QAAQ,QAAS,IAAIA,QAAQ,OAAQ,KAAK0K,aAC1D,EAEgBJ,EAAA8iJ,SAAhB,SAAyB56D,EAAgBv9F,GACvC,OAAIu9F,EAAOv9F,OAASA,EACX,GAAGu9F,EAAOj9F,MAAM,EAAGN,EAAS,QAE5Bu9F,CAEX,EAEgBloF,EAAA+iJ,SAAhB,SAAyB76D,GACvB,MAAM86D,EAAU96D,EAAO75E,MAAM,MAAM9e,OAA2B,CAACC,EAAM+e,KACnE,MAAM8yB,EAAQ9yB,EAAK8yB,MAAM,YACzB,GAAa,MAATA,EAAe,CACjB,MAAM4hH,EAAS5hH,EAAM,GACrB,GAAY,MAAR7xC,GAAgBA,EAAOyzJ,EAAOt4J,OAChC,OAAOs4J,EAAOt4J,MAElB,CACA,OAAO6E,QACN6I,GACH,OAAe,MAAX2qJ,EACK96D,EACJ75E,MAAM,MACN3c,OAAQkhB,GAAmB,KAAbA,EAAEpE,QAChBrf,IAAKyjB,GAAMA,EAAE3nB,MAAM+3J,EAASpwI,EAAEjoB,QAAQ++C,WACtC5wC,KAAK,MAEDovF,CAEX,EAEgBloF,EAAAkjJ,OAAhB,SAAuBh7D,EAAgB+6D,GACrC,MAAMD,EAAU,IAAIj4J,MAAMk4J,EAAS,GAAGnqJ,KAAK,KAC3C,OAAOovF,EACJ75E,MAAM,MACNlf,IAAKyjB,GAAoB,KAAbA,EAAEpE,OAAgB,GAAGw0I,IAAUpwI,IAAMA,GACjD9Z,KAAK,KACV,EAEgBkH,EAAAsjI,YAAhB,SAA4B6f,EAAgBC,GAC1C,GAAID,EAAOx4J,OAASy4J,EAASz4J,OAC3B,OAAO,EACF,GAAIw4J,IAAWC,EACpB,OAAO,EAEPtiE,EAAO,IAAK,IAAIj2F,EAAI,EAAGg7B,EAAI,EAAGh7B,EAAIs4J,EAAOx4J,OAAQE,IAAK,CACpD,MAAMw4J,EAAMF,EAAO9yJ,WAAWxF,GAC9B,KAAOg7B,EAAIu9H,EAASz4J,QAElB,GAAIy4J,EAAS/yJ,WAAWw1B,OAASw9H,EAC/B,SAASviE,EAGb,OAAO,CACT,CACA,OAAO,CAEX,EAEgB9gF,EAAAsjJ,SAAhB,SAAyB3tJ,GACvB,MAAM0rC,EAAQ1rC,EAAK0rC,MAAM,UACzB,GAAIA,EAAO,CACT,MAAM1xB,EAAS2/C,SAASjuB,EAAM,GAAI,IAClC,OAAO1rC,EAAKD,QAAQ,QAASia,EAAS,GAAGnf,WAC3C,CACA,OAAOmF,EAAO,IAChB,EAEgBqK,EAAAiiE,SAAQA,EASRjiE,EAAAujJ,WAAhB,SAA2BniH,GACzB,OAAO,IAAI8hD,YAAY,CAACjhB,EAAS7gC,KAAO,GAAG5wC,SAAS,GACtD,EAEgBwP,EAAAwjJ,aAAhB,SAA6BpiH,GAE3B,OADa9wC,KAAK00C,IAAIi9B,EAAS7gC,IAChB,IAAS,GAC1B,EAEgBphC,EAAAyjJ,UAAhB,SAA0BriH,GACxB,OAAOA,EAAI5yB,OAAO9Y,QAAQ,kCAAmC,KAC/D,CACD,CA3HD,CAAiBsK,IAAW1U,EAAA0U,YAAXA,EAAW,gCCA5B,IAAA6rD,EAAAvhE,MAAAA,KAAAuhE,kBAAAzgE,OAAAugD,OAAA,SAAA99C,EAAAgQ,EAAA3F,EAAA4zD,QACAzzD,IAAAyzD,IAAAA,EAAA5zD,GACA,IAAA2nC,EAAAz0C,OAAA2gE,yBAAAluD,EAAA3F,GACA2nC,KAAA,QAAAA,GAAAhiC,EAAAmuD,WAAAnsB,EAAAzX,UAAAyX,EAAA1X,gBACA0X,EAAA,CAAe5W,YAAA,EAAA/zB,IAAA,WAAoC,OAAA2I,EAAA3F,EAAA,IAEnD9M,OAAAC,eAAAwC,EAAAi+D,EAAAjsB,EACC,WAAAhyC,EAAAgQ,EAAA3F,EAAA4zD,QACDzzD,IAAAyzD,IAAAA,EAAA5zD,GACArK,EAAAi+D,GAAAjuD,EAAA3F,EACC,GACD+zD,EAAA3hE,MAAAA,KAAA2hE,qBAAA7gE,OAAAugD,OAAA,SAAA99C,EAAAgG,GACAzI,OAAAC,eAAAwC,EAAA,WAA0Co7B,YAAA,EAAA19B,MAAAsI,GACzC,WAAAhG,EAAAgG,GACDhG,EAAA,QAAAgG,CACA,GACAq4D,EAAA5hE,MAAAA,KAAA4hE,cAAA,SAAAC,GACA,GAAAA,GAAAA,EAAAH,WAAA,OAAAG,EACA,IAAAh5D,EAAA,GACA,SAAAg5D,EAAA,QAAAj0D,KAAAi0D,EAAA,YAAAj0D,GAAA9M,OAAAJ,UAAAwC,eAAAtC,KAAAihE,EAAAj0D,IAAA2zD,EAAA14D,EAAAg5D,EAAAj0D,GAEA,OADA+zD,EAAA94D,EAAAg5D,GACAh5D,CACA,EACA/H,OAAAC,eAAAC,EAAA,cAA+CC,OAAA,IAC/CD,EAAAm7F,GA8CA,SAAAh5F,EAAAm6B,GACA,gBAAA16B,GACA,gBAAA29C,GACA,OAAAp9C,EAAAg5F,GAAAh5F,EAAA0B,IAAA07C,EAAA,SAAA64G,GAAoD,gBAAAt4G,GAAuB,OAAAxjB,EAAA6+D,GAAAi9D,EAAAt4G,EAAA,IAA0Bl+C,EACrG,CACA,CACA,EAnDA5B,EAAA4tH,QAoDA,SAAA10F,GACA,gBAAA7G,GAA+B,gBAAAngB,GAC/B,OAAAgnB,EAAAiiE,GAAAjiE,EAAAr1B,IAAAqO,EAAA,SAAApQ,GAAgD,kBAAqB,OAAAA,CAAA,IAAcuwB,EACnF,EACA,EAvDAryB,EAAA0tH,SAwDA,SAAAx0F,GACA,gBAAA7G,GACA,gBAAAngB,GACA,OAAAgnB,EAAAiiE,GAAAjiE,EAAAr1B,IAAAqO,EAAA,WAAmD,gBAAAvM,GAAsB,OAAAA,CAAA,IAAc0sB,EACvF,CACA,CACA,EA7DAryB,EAAAwsH,IA8DA,SAAArqH,GACA,gBAAAkI,EAAAguJ,GACA,gBAAAz2J,GACA,OAAAO,EAAAg5F,GAAAh5F,EAAA0B,IAAAjC,EAAA,SAAAE,GAAiD,gBAAA6D,GACjD,IAAAF,EACA,OAAA3F,OAAAgI,OAAA,GAAuChG,IAAA2D,EAAA,IAAa4E,GAAA1E,EAAAF,GACpD,IAAgB4yJ,EAChB,CACA,CACA,EAtEAr4J,EAAAkuH,kBAuEA,SAAA/rH,GACA,gBAAA4vB,GAA0B,OAC1BlyB,OAAA,SAAAqS,EAAAmgB,GACA,OAAAlwB,EAAAg5F,GAAAh5F,EAAA0B,IAAAqO,EAAA,SAAAwf,GAAoD,gBAAAC,GAAsB,OAAAI,EAAAlyB,OAAA6xB,EAAAC,EAAA,IAA2BU,EACrG,EACK,CACL,EA5EAryB,EAAAs4J,UAoGA,SAAAn2J,GACA,kBAEA,IADA,IAAAgO,EAAA,GACA7N,EAAA,EAAyBA,EAAAlD,UAAAC,OAAuBiD,IAChD6N,EAAA7N,GAAAlD,UAAAkD,GAKA,IAHA,IAAA0hC,EAAA7zB,EAAA9Q,OACA+C,EAbA,SAAA4hC,GAIA,OAHAjU,EAAApvB,IAAAf,KAAA24J,EAAAv0H,KACAu0H,EAAAv0H,GAAAw0H,EAAA92J,EAAAqvB,MAAAiT,EAAA,OAEAu0H,EAAAv0H,EACA,CAQAy0H,CAAAz0H,GACA00H,EAAAv2J,EAAA0B,IAAAsM,EAAA,GAAA/N,GACA7C,EAAA,EAAwBA,EAAAykC,EAASzkC,IACjCm5J,EAAAv2J,EAAAg5F,GAAAu9D,EAAAvoJ,EAAA5Q,IAEA,OAAAm5J,CACA,CACA,EAjHA14J,EAAA24J,UAuKA,SAAAx2J,GACA,gBAAA6jB,GAKA,IAJA,IAAAjiB,EAAAjE,OAAAiE,KAAAiiB,GACAge,EAAAjgC,EAAA1E,OACA+C,EAzDA,SAAA2B,GACA,IAAAigC,EAAAjgC,EAAA1E,OACA,OAAA2kC,GACA,OACA,gBAAAliC,GACA,IAAA2D,EACA,OAAAA,EAAA,IAA+B1B,EAAA,IAAAjC,EAAA2D,CAC/B,EACA,OACA,gBAAA3D,GAAkC,gBAAA6D,GAClC,IAAAF,EACA,OAAAA,EAAA,IAA+B1B,EAAA,IAAAjC,EAAA2D,EAAA1B,EAAA,IAAA4B,EAAAF,CAC/B,GACA,OACA,gBAAA3D,GAAkC,gBAAA6D,GAAsB,gBAAAwgB,GACxD,IAAA1gB,EACA,OAAAA,EAAA,IAA+B1B,EAAA,IAAAjC,EAAA2D,EAAA1B,EAAA,IAAA4B,EAAAF,EAAA1B,EAAA,IAAAoiB,EAAA1gB,CAC/B,IACA,OACA,gBAAA3D,GAAkC,gBAAA6D,GAAsB,gBAAAwgB,GAAsB,gBAAAuR,GAC9E,IAAAjyB,EACA,OAAAA,EAAA,IACA1B,EAAA,IAAAjC,EACA2D,EAAA1B,EAAA,IAAA4B,EACAF,EAAA1B,EAAA,IAAAoiB,EACA1gB,EAAA1B,EAAA,IAAA2zB,EACAjyB,CACA,KACA,OACA,gBAAA3D,GAAkC,gBAAA6D,GAAsB,gBAAAwgB,GAAsB,gBAAAuR,GAAsB,gBAAA11B,GACpG,IAAAyD,EACA,OAAAA,EAAA,IACA1B,EAAA,IAAAjC,EACA2D,EAAA1B,EAAA,IAAA4B,EACAF,EAAA1B,EAAA,IAAAoiB,EACA1gB,EAAA1B,EAAA,IAAA2zB,EACAjyB,EAAA1B,EAAA,IAAA/B,EACAyD,CACA,MACA,QACA,OAAA+yJ,EAAA,WAEA,IADA,IAAAroJ,EAAA,GACA7N,EAAA,EAAiCA,EAAAlD,UAAAC,OAAuBiD,IACxD6N,EAAA7N,GAAAlD,UAAAkD,GAGA,IADA,IAAA0jB,EAAA,GACAzmB,EAAA,EAAgCA,EAAAykC,EAASzkC,IACzCymB,EAAAjiB,EAAAxE,IAAA4Q,EAAA5Q,GAEA,OAAAymB,CACA,EAAage,EAAA,MAEb,CAKA40H,CAAA70J,GACA4uF,EAAAxwF,EAAA0B,IAAAmiB,EAAAjiB,EAAA,IAAA3B,GACA7C,EAAA,EAAwBA,EAAAykC,EAASzkC,IACjCozF,EAAAxwF,EAAAg5F,GAAAxI,EAAA3sE,EAAAjiB,EAAAxE,KAEA,OAAAozF,CACA,CACA,EA5IA,IAAAjxF,EAAiBC,EAAQ,OACzBouB,EAAA6wC,EAAqBj/D,EAAQ,MAqC7B,SAAA62J,EAAAp2J,EAAA2jB,EAAAkqD,GACA,gBAAAv+C,GAEA,IADA,IAAAmnI,EAAAp5J,MAAAwwE,EAAA5wE,OAAA,GACAE,EAAA,EAAwBA,EAAA0wE,EAAA5wE,OAAgBE,IACxCs5J,EAAAt5J,GAAA0wE,EAAA1wE,GAGA,OADAs5J,EAAA5oF,EAAA5wE,QAAAqyB,EACA,IAAA3L,EAAA3jB,EAAAI,MAAA,KAAAq2J,GAAAL,EAAAp2J,EAAA2jB,EAAA,EAAA8yI,EACA,CACA,CACA,IAAAN,EAAA,CACA,WAAAz2J,GAAsB,OAAAA,EAAA,EACtB,WAAAA,GAAsB,gBAAA6D,GAAsB,OAAA7D,EAAA6D,EAAA,GAC5C,WAAA7D,GAAsB,gBAAA6D,GAAsB,gBAAAwgB,GAAsB,OAAArkB,EAAA6D,EAAAwgB,EAAA,IAClE,WAAArkB,GAAsB,gBAAA6D,GAAsB,gBAAAwgB,GAAsB,gBAAAuR,GAAsB,OAAA51B,EAAA6D,EAAAwgB,EAAAuR,EAAA,KACxF,WAAA51B,GAAsB,gBAAA6D,GAAsB,gBAAAwgB,GAAsB,gBAAAuR,GAAsB,gBAAA11B,GAAsB,OAAAF,EAAA6D,EAAAwgB,EAAAuR,EAAA11B,EAAA,qGC1H9G,MAAAmB,EAAAxB,EAAA,OAWAuG,EAAAvG,EAAA,OACA6wB,EAAA7wB,EAAA,OACAqG,EAAArG,EAAA,OACAmjC,EAAAnjC,EAAA,OACAojC,EAAApjC,EAAA,OAEAsG,EAAAtG,EAAA,OACAgJ,EAAAhJ,EAAA,OACA6lB,EAAA7lB,EAAA,OAEA+lB,EAAA/lB,EAAA,OAEA,IAAiBi1E,GAAjB,SAAiBA,GAaf,SAAgBV,IACd,MAAO,CACLc,QAAS,CACPlb,MAAO,iBACPzxD,KAAM,UACN4tC,WAAY,EACZnU,IAAK,CACH+C,GAAI3+B,EAAAS,OAAOE,MAAM,GAAI,MACrBoyH,GAAI/yH,EAAAS,OAAOE,MAAM,GAAI,OAEvBqf,OAAQ,CACN,CAAEne,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,GACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,GACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,GACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,EAAG,MAAOqwC,IAAK,GACtC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,IAAK,MAAOqwC,IAAK,GACxC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,KAAM,MAAOqwC,IAAK,GACzC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,GACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,GACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,EAAG,MAAOqwC,IAAK,GACtC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,IAAK,MAAOqwC,IAAK,GACxC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,KAAM,MAAOqwC,IAAK,GACzC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,GAAK,MAAOqwC,IAAK,IAE1CtB,MAAO,GACPF,SAAS,GAEXw/B,SAAU,CACRpb,MAAO,iBACPzxD,KAAM,WACN4tC,WAAY,EACZnU,IAAK,CACH+C,GAAI3+B,EAAAS,OAAOE,MAAM,GAAI,MACrBoyH,GAAI/yH,EAAAS,OAAOE,MAAM,EAAG,OAEtBqf,OAAQ,CACN,CAAEne,OAAQ7B,EAAAS,OAAOE,MAAM,GAAI,MAAOqwC,IAAK,GACvC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,EAAG,MAAOqwC,IAAK,GACtC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,IAAK,MAAOqwC,IAAK,GACxC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,KAAM,MAAOqwC,IAAK,GACzC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,EAAG,MAAOqwC,IAAK,GACtC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,IAAK,MAAOqwC,IAAK,GACxC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,KAAM,MAAOqwC,IAAK,GACzC,CAAEnvC,OAAQ7B,EAAAS,OAAOE,MAAM,GAAK,MAAOqwC,IAAK,IAE1CtB,MAAO,CACL1vC,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,EAAG,MAChBX,EAAAS,OAAOE,MAAM,EAAG,MAChBX,EAAAS,OAAOE,MAAM,EAAG,MAChBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,OAEnB6uC,SAAS,GAEX2/B,WAAY,CACVvb,MAAO,iBACPzxD,KAAM,aACN4tC,WAAY,EACZnU,IAAK,CACH+C,GAAI3+B,EAAAS,OAAOE,MAAM,EAAG,MACpBoyH,GAAI/yH,EAAAS,OAAOE,MAAM,EAAG,OAEtBqf,OAAQ,GACR0vB,MAAO,CACL1vC,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,EAAG,MAChBX,EAAAS,OAAOE,MAAM,EAAG,MAChBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,MACjBX,EAAAS,OAAOE,MAAM,GAAI,OAEnB6uC,SAAS,GAGf,CAuJA,SAAgBohH,EAA0B5xJ,EAAmBqC,GAC3D,MAAMg1E,EAAkB/rD,EAAAta,QAAQszB,SAAStkC,EAASqC,GAC5CwvJ,EAAmBvmI,EAAAta,QAAQylE,2BAA2BY,GAAiBn4E,OAAQ1C,GAC5E8jB,EAAAe,gBAAgBiM,WAAW9wB,IAU9BmG,EARgBc,EAAAC,gBAAgBouJ,WACpCD,EACG3yJ,OAAQ1C,UACP,OAA4E,OAAT,QAA5D+B,EAAA8D,EAAShE,aAAa0C,EAAA0B,SAASw5B,MAAMz/B,EAAS2vB,sBAAc,IAAA5tB,OAAA,EAAAA,EAAElB,OAEtEV,IAAKH,GAAaA,EAAS2vB,cAC7BrxB,GAAMiG,EAAA0B,SAASw5B,MAAMnhC,IAEQ6B,IAAK7B,GAAMiG,EAAA0B,SAASC,IAAI5H,EAAGuH,EAASM,YACpE,OAAOc,EAAAC,gBAAgB5G,KAAK6F,EAAW,CAAC/H,EAAG6D,IAClCsC,EAAA0B,SAAS4tI,kBAAkBz1I,EAAGyH,GAAUsxI,cAAc5yI,EAAA0B,SAAS4tI,kBAAkB5xI,EAAG4D,IAE/F,CA7QgBqtE,EAAAqiF,oBAAhB,WACE,MAAO,CACLzvG,OAAQ,CACNkvE,OAAQ,GACRl6D,QAAS,IACTqQ,SAAU,KAEZ7kE,MAAO,KACP3F,QA0IK,CACLq3H,gBAAiB,GACjBC,mBAAoB,GACpBC,gBAAiB,CACfv3C,UAAW,CAAC,GAAI,IAChBC,QAAS,CAAC,GAAI,IACdC,KAAM,CAAC,GAAI,IACX7qC,IAAK,CAAC,GAAI,IACV8qC,OAAQ,CAAC,GAAI,IACbC,WAAY,CAAC,GAAI,IACjBC,WAAY,CAAC,GAAI,IACjBC,MAAO,CAAC,GAAI,IACZC,OAAQ,CAAC,GAAI,IACbC,OAAQ,CAAC,GAAI,IACbC,SAAU,CAAC,GAAI,KAEjB+2C,gBAAiB,CACfx3C,UAAW,EACXC,QAAS,EACTC,KAAM,EACN7qC,IAAK,EACL8qC,OAAQ,EACRC,WAAY,EACZC,WAAY,EACZC,MAAO,EACPC,OAAQ,EACRC,OAAQ,EACRC,SAAU,GAEZ5T,oBAAqB,IArKzB,EAEgB0F,EAAAV,iBAAgBA,EA2FhBU,EAAA/tE,MAAhB,WACE,OAAA/I,OAAAgI,OAAAhI,OAAAgI,OAAA,GAvGO,CACL0hD,OAAQ,CACNkvE,OAAQ,GACRl6D,QAAS,IACTqQ,SAAU,KAEZ7kE,MAAO,KACP3F,QA0IK,CACLq3H,gBAAiB,GACjBC,mBAAoB,GACpBC,gBAAiB,CACfv3C,UAAW,CAAC,GAAI,IAChBC,QAAS,CAAC,GAAI,IACdC,KAAM,CAAC,GAAI,IACX7qC,IAAK,CAAC,GAAI,IACV8qC,OAAQ,CAAC,GAAI,IACbC,WAAY,CAAC,GAAI,IACjBC,WAAY,CAAC,GAAI,IACjBC,MAAO,CAAC,GAAI,IACZC,OAAQ,CAAC,GAAI,IACbC,OAAQ,CAAC,GAAI,IACbC,SAAU,CAAC,GAAI,KAEjB+2C,gBAAiB,CACfx3C,UAAW,EACXC,QAAS,EACTC,KAAM,EACN7qC,IAAK,EACL8qC,OAAQ,EACRC,WAAY,EACZC,WAAY,EACZC,MAAO,EACPC,OAAQ,EACRC,OAAQ,EACRC,SAAU,GAEZ5T,oBAAqB,MAtEG,CACxBqrD,eAAgB,CACdC,aAAa,EACbC,kBAAkB,EAClBC,aAAa,GAEfn3H,aAAc,GACdi5H,kBAAmB,GACnBlC,aAAc,GACdQ,sBAAuB,CACrBC,eAAe,GAEjBtmD,KAAM,CACJ,CACE3a,MAAO,MACPt4D,GAAI,UACJ6G,KAAM,OACN5G,UAAWyyE,MAGfJ,YAAa,GACbhkC,OAAQ,EACRJ,WAAW,EACX8/B,qBAAqB,EACrBsoD,YAAa,KACbzjD,gBAAiB,CACfC,WAAY,SACZ4lD,kBAAkB,GAEpBgB,aAAc,CAAEnzH,OAAQ,CAAEA,QAAQ,GAAQ1K,OAAQ,GAAIw+D,WAAY,IAClEh0D,UAAW,GACXssE,OAAQ,CAAEA,OAAQ,GAAIra,MAAO,UAC7Bz3D,QASK,CACLq3H,gBAAiB,GACjBC,mBAAoB,GACpBC,gBAAiB,CACfv3C,UAAW,CAAC,GAAI,IAChBC,QAAS,CAAC,GAAI,IACdC,KAAM,CAAC,GAAI,IACX7qC,IAAK,CAAC,GAAI,IACV8qC,OAAQ,CAAC,GAAI,IACbC,WAAY,CAAC,GAAI,IACjBC,WAAY,CAAC,GAAI,IACjBC,MAAO,CAAC,GAAI,IACZC,OAAQ,CAAC,GAAI,IACbC,OAAQ,CAAC,GAAI,IACbC,SAAU,CAAC,GAAI,KAEjB+2C,gBAAiB,CACfx3C,UAAW,EACXC,QAAS,EACTC,KAAM,EACN7qC,IAAK,EACL8qC,OAAQ,EACRC,WAAY,EACZC,WAAY,EACZC,MAAO,EACPC,OAAQ,EACRC,OAAQ,EACRC,SAAU,GAEZ5T,oBAAqB,IArCrB2F,aAAc,CACZ/a,MAAO,yBACPjtD,KAAM,KAGZ,EAEgB+nE,EAAAsiF,qBAAhB,WACE,MAAO,CACLx9B,gBAAiB,GACjBC,mBAAoB,GACpBC,gBAAiB,CACfv3C,UAAW,CAAC,GAAI,IAChBC,QAAS,CAAC,GAAI,IACdC,KAAM,CAAC,GAAI,IACX7qC,IAAK,CAAC,GAAI,IACV8qC,OAAQ,CAAC,GAAI,IACbC,WAAY,CAAC,GAAI,IACjBC,WAAY,CAAC,GAAI,IACjBC,MAAO,CAAC,GAAI,IACZC,OAAQ,CAAC,GAAI,IACbC,OAAQ,CAAC,GAAI,IACbC,SAAU,CAAC,GAAI,KAEjB+2C,gBAAiB,CACfx3C,UAAW,EACXC,QAAS,EACTC,KAAM,EACN7qC,IAAK,EACL8qC,OAAQ,EACRC,WAAY,EACZC,WAAY,EACZC,MAAO,EACPC,OAAQ,EACRC,OAAQ,EACRC,SAAU,GAEZ5T,oBAAqB,GAEzB,EAEgB0F,EAAAuiF,qBAAhB,SAAqC5vJ,EAAqB6vJ,WACxD,OAAAt5J,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKyB,GAAQ,CACXM,UAAS/J,OAAAgI,OAAAhI,OAAAgI,OAAA,GACJyB,EAASM,WACTuvJ,EAAgBjoJ,iBAErBnH,MAAOovJ,EAAgB7vJ,SAASS,OAAST,EAASS,MAClDw/C,OAAM1pD,OAAAgI,OAAAhI,OAAAgI,OAAA,GACDyB,EAASigD,QAAM,CAClBgV,SAAwC,QAA/B/4D,EAAA2zJ,EAAgB7vJ,SAASigD,cAAM,IAAA/jD,OAAA,EAAAA,EAAE+4D,UAAWj1D,EAASigD,OAAOgV,QACrEk6D,QAAuC,QAA/BlzH,EAAA4zJ,EAAgB7vJ,SAASigD,cAAM,IAAAhkD,OAAA,EAAAA,EAAEkzH,SAAUnvH,EAASigD,OAAOkvE,SAErEr0H,QAAS+0J,EAAgB7vJ,SAASlF,SAAWkF,EAASlF,QACtDwyE,aAAcuiF,EAAgB7vJ,SAASstE,cAAgBttE,EAASstE,aAChEtxE,aAAYzF,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAOsxJ,EAAgB7vJ,SAAShE,cAAiBgE,EAAShE,eAE1E,EAEgBqxE,EAAAyiF,sBAAhB,SAAsC9vJ,GACpC,OAAOvB,EAAAwC,YAAYpE,OAAOmD,EAASM,UAAW,CAAC+C,EAAGrE,MAAOA,aAAC,EAADA,EAAG8qH,WAC9D,EAEgBz8C,EAAA0iF,kBAAhB,SAAgBA,EAAkB9oJ,EAAmB+oJ,GACnD,MAAMjpJ,EAAQnN,EAAA44H,YAAY/lH,QAAQxF,GAClC,IAAIgpJ,EAWJ,OATEA,GADa,IAAXlpJ,GAEOA,IAAUnN,EAAA44H,YAAY18H,OAAS,EADvB8D,EAAA44H,YAAY,GAIZ54H,EAAA44H,YAAYzrH,EAAQ,GAEhB,qBAAnBkpJ,GAAyCD,IAC3CC,EAAiBF,EAAkB,mBAAoBC,IAElDC,CACT,EAEgB5iF,EAAA6iF,sBAAhB,SAAsCnzH,EAAqBniC,IACzD,EAAA4gC,EAAAmM,gBACE5K,GACA,EAAAxB,EAAA+B,MACG19B,EAAE,oBACFC,aAAcswJ,KACTA,aAAO,EAAPA,EAAUv1J,WACLu1J,EAAQv1J,IAEfu1J,EAAUA,GAAW,IACbv1J,IAAO,EAEVu1J,IAEX,2BAA2Bv1J,IAE/B,EAEgByyE,EAAA+iF,qBAAhB,SAAqCrzH,EAAqB/8B,IACxD,EAAAw7B,EAAAmM,gBACE5K,GACA,EAAAxB,EAAA+B,MACG19B,EAAE,mBACFC,aAAcitE,GACbv2E,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYuuE,GAAe,CAAE2vC,8BAA+Bz8G,EAASy8G,+BAEzE,yBAEJ,EAEgBpvC,EAAAgjF,yBAAhB,SAAyC1yJ,EAAmBqC,GAC1D,OAAOuvJ,EAA0B5xJ,EAASqC,GAAUlK,OAAS,CAC/D,EAEgBu3E,EAAAkiF,0BAAyBA,EAmBzBliF,EAAAijF,SAAhB,SACEvzH,EACAjT,EACApzB,EACAsJ,IAEA,EAAAw7B,EAAAmM,gBACE5K,GACA,EAAAxB,EAAA+B,MACG19B,EAAE,gBACFC,aAAcyF,IACb,MAAM1K,EAAM8D,EAAA0B,SAASw5B,MAAM9P,GAC3B,OAAAvzB,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAY+G,GAAI,CAAE1K,CAACA,GAAIrE,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAO+G,EAAK1K,IAAI,CAAEI,IAAKtE,QAElD,eAAegI,EAAA0B,SAAS4tI,kBAAkBtvI,EAAA0B,SAASC,IAAIypB,EAAc9pB,EAASM,WAAYN,SAAgBrB,EAAAS,OAAO8gB,MAAMxpB,KAE3H,EAEgB22E,EAAAkjF,SAAhB,SAAyBvwJ,GACvB,OAAOA,EAASwyC,MAAQxyC,EAASwyC,MAAQ7sC,OAAO6qJ,kBAAoB,OAAS,OAC/E,EAEgBnjF,EAAAojF,WAAhB,SAA2Bj+G,GACX,SAAVA,GACF7tC,SAASiM,KAAK6hC,UAAUrmC,IAAI,QAC5B+R,EAAA6C,YAAYC,gBAAgB,CAAEha,KAAM,QAASvQ,MAAO,WAEpDiO,SAASiM,KAAK6hC,UAAUvG,OAAO,QAC/B/tB,EAAA6C,YAAYC,gBAAgB,CAAEha,KAAM,QAASvQ,MAAO,UAExD,CACD,CA/SD,CAAiB22E,IAAQ52E,EAAA42E,SAARA,EAAQ,8BChBzB,IAAiBhqC,EAQA/oB,0FARjB,SAAiB+oB,GACFA,EAAAC,OACX,4GACWD,EAAAG,UACX,6IACWH,EAAA4pH,OAAS,qCACvB,CAND,CAAiB5pH,IAAe5sC,EAAA4sC,gBAAfA,EAAe,KAQhC,SAAiB/oB,GAGf,SAAgBo2I,EAAYzzJ,EAAuBgd,EAAc02I,SAC/D,OAAO12I,GAAsB,QAAd/d,EAAAe,EAAOuoE,eAAO,IAAAtpE,EAAAA,EAAIe,EAAO2jB,WAAa+vI,CACvD,CAJar2I,EAAAs2I,UAAY,GAETt2I,EAAAo2I,YAAWA,EAIXp2I,EAAAN,SAAhB,SAAyB62I,EAA6B52I,GACpD,OAAOy2I,EAAYG,EAAc52I,EAvBxB,KAuB8BK,EAAAs2I,UACzC,CACD,CAVD,CAAiBt2I,IAAW7jB,EAAA6jB,YAAXA,EAAW,iFCK5B7jB,EAAAq6J,eAAA,SACEC,EACAC,EACAC,GAEA,MAAMC,GAAc,EAAAtvI,EAAA8T,QAAOu7H,GAC3BC,EAAY5oJ,QAAU2oJ,GAEtB,EAAArvI,EAAAC,WAAU,KACR,MAAMsvI,EAASJ,EAAUzoJ,QACzB,IAAK0oJ,GAAoB,MAAVG,EACb,OAEF,MAAMC,EAAoBzsJ,SAAS0sJ,cACnCC,EAAY/pJ,KAAK4pJ,GACZA,EAAO/+H,SAASztB,SAAS0sJ,gBAC5BF,EAAOI,MAAM,CAAEC,eAAe,IAGhC,MAAMC,EAAkB15I,IA9B5B,IAAqB25I,EA+Bf,GAAIJ,EAAYA,EAAYx7J,OAAS,KAAOq7J,EAG5C,GAAkB,WAAdp5I,EAAMnd,IAAkB,CAE1B,MAAM+2J,EAAShtJ,SAAS0sJ,cACpBH,EAAY5oJ,WAAYqpJ,aAAM,EAANA,EAAQC,QAAQ,oBAC1C75I,EAAMgM,iBACNmtI,EAAY5oJ,UAEhB,MAAO,GAAkB,QAAdyP,EAAMnd,IAAe,CAC9B,MAAMi3J,GA1COH,EA0CiBP,EAzC7Bj7J,MAAMP,KAAK+7J,EAAUI,iBAA8BC,IAAoBl1J,OAC3E6hJ,GAAOA,EAAGsT,iBAAiBl8J,OAAS,IAyCjC,GAAyB,IAArB+7J,EAAU/7J,OAGZ,OAFAiiB,EAAMgM,sBACNotI,EAAOI,QAGT,MAAM5oJ,EAAQkpJ,EAAU,GAClBtwJ,EAAOswJ,EAAUA,EAAU/7J,OAAS,GACpC67J,EAAShtJ,SAAS0sJ,cACnBF,EAAO/+H,SAASu/H,IAGV55I,EAAMk6I,UAAaN,IAAWhpJ,GAASgpJ,IAAWR,EAGjDp5I,EAAMk6I,UAAYN,IAAWpwJ,IACvCwW,EAAMgM,iBACNpb,EAAM4oJ,UAJNx5I,EAAMgM,iBACNxiB,EAAKgwJ,UAJLx5I,EAAMgM,iBACNpb,EAAM4oJ,QAQV,GAIF,OAFA5sJ,SAASyrF,iBAAiB,UAAWqhE,GAE9B,KACL9sJ,SAASqhG,oBAAoB,UAAWyrD,GACxC,MAAM1qJ,EAAQuqJ,EAAY7kJ,QAAQ0kJ,IACnB,IAAXpqJ,GACFuqJ,EAAY3jI,OAAO5mB,EAAO,GAE5B,MAAM4qJ,EAAShtJ,SAAS0sJ,eACM,MAAVM,GAAkBA,IAAWhtJ,SAASiM,MAAQugJ,EAAO/+H,SAASu/H,KAG3D,MAArBP,GACAA,IAAsBzsJ,SAASiM,MAC/BwgJ,EAAkBc,aAElBd,EAAkBG,MAAM,CAAEC,eAAe,MAG5C,CAACR,GACN,EA3FA,MAAApvI,EAAAxpB,EAAA,OAEM25J,EACJ,4IAGIT,EAA6B,4BCNnC,IAAiBjwJ,4EAAjB,SAAiBA,GAOf,SAAgB85I,EAAcrlJ,EAAgBq8J,GAC5C,GAAIA,EAAWr8J,OAAS,EAAG,CACzB,MAAMwI,EAAgB,CAAC,IAUvB,OATA6zJ,EAAWpkI,QAASwgB,IAClB,IAAI6jH,EAAW9zJ,EAAOA,EAAOxI,OAAS,GAClCs8J,EAASt8J,QAAUA,IACrBs8J,EAAW,GACX9zJ,EAAOiJ,KAAK6qJ,IAEdA,EAAS7qJ,KAAKgnC,KAGTjwC,CACT,CACE,MAAO,EAEX,CA4PA,SAAgB+zJ,EAAuD18J,EAAWiF,EAAQlE,EAAU47J,GAClG,OAAO38J,EAAK2E,IAAK7B,GAAOA,EAAEmC,KAASlE,EAAQ47J,EAAU75J,EACvD,CA9QgB4I,EAAA85I,WAAUA,EAkBV95I,EAAAkxJ,iBAAhB,SAAoC3L,EAAW4L,GAC7C,MAAMl0J,EAAgB,GACtB,IAAK,IAAItI,EAAI,EAAGA,EAAIw8J,EAAgBx8J,GAAK,EACvCsI,EAAOiJ,KAAK,IAEd,IAAIR,EAAQ,EACZ,IAAK,MAAMwnC,KAAQq4G,EACjBtoJ,EAAOyI,GAAOQ,KAAKgnC,GACnBxnC,GAAS,EACLA,GAASyrJ,IACXzrJ,EAAQ,GAGZ,OAAOzI,CACT,EAEgB+C,EAAAoxJ,iBAAhB,SAAoC38J,EAAgBq8J,EAAiBO,SACnE,MAAMp0J,EAAS68I,EAAWrlJ,EAAQq8J,GAClC,GAAI7zJ,EAAOxI,OAAS,EAAG,CACrB,MAAMs8J,EAAW9zJ,EAAOA,EAAOxI,OAAS,GACxC,GAAgB,MAAZs8J,EACF,IAAK,IAAIp8J,EAAI,EAAGA,EAAIF,EAAQE,GAAK,EAC/Bo8J,EAASp8J,GAAgB,QAAXkG,EAAAk2J,EAASp8J,UAAE,IAAAkG,EAAAA,OAAIsH,CAGnC,CACA,OAAOlF,CACT,EAEgB+C,EAAAC,QAAhB,SAA2B8sC,EAAYs4G,GACrC,OAAOt4G,EAAM1zC,OACX,CAACC,EAAM6G,KACL,IAAI69E,EAAY1kF,EAAKA,EAAK7E,OAAS,GACnC,MAAMyL,EAAO89E,EAAUA,EAAUvpF,OAAS,GAM1C,OALY,MAARyL,GAAgBmlJ,EAAKnlJ,EAAMC,KAC7B7G,EAAK4M,KAAK,IACV83E,EAAY1kF,EAAKA,EAAK7E,OAAS,IAEjCupF,EAAU93E,KAAK/F,GACR7G,GAET,CAAC,IAEL,EAEgB0G,EAAAk5C,OAAhB,SAA0BmkG,EAAO5oJ,GAC/B,MAAMg6C,EAAW,GACjB,IAAK,IAAI95C,EAAI,EAAGA,EAAIF,EAAQE,GAAK,EAC/B85C,EAAIvoC,KAAKm3I,GAEX,OAAO5uG,CACT,EAEgBzuC,EAAAo9I,SAAhB,SAA4B9oJ,EAAWD,EAAS+sD,GAC9C,MAAMnoD,EAAM,IAAI3E,KAASD,GAAIgF,OAA0B,CAACC,EAAM4zC,KAC5D5zC,EAAK8nD,EAAUlU,IAASA,EACjB5zC,GACN,IACH,OAAOpE,OAAOiE,KAAKF,GAAKA,IAAKM,GAAQN,EAAIM,GAC3C,EAEgByG,EAAAsxJ,SAAhB,SAA4B7iH,EAAU2S,GACpC,MAAMnoD,EAAMw1C,EAAIp1C,OAA0B,CAACC,EAAM4zC,KAC/C5zC,EAAK8nD,EAAUlU,IAASA,EACjB5zC,GACN,IACH,OAAOpE,OAAOiE,KAAKF,GAAKA,IAAKM,GAAQN,EAAIM,GAC3C,EAEgByG,EAAA+B,QAAhB,SAA2B0sC,GACzB,OAAOA,EAAIjzC,OAAQ7G,GAAMA,EAC3B,EAEgBqL,EAAAuxJ,WAAhB,SAIE9iH,EAAUl1C,GACV,OAAOk1C,EAAIp1C,OAAgC,CAACC,EAAM4zC,KAChD,MAAM73C,EAAQ63C,EAAK3zC,GAGnB,OAFAD,EAAKjE,GAASiE,EAAKjE,IAAU,GAC7BiE,EAAKjE,GAAQ6Q,KAAKgnC,GACX5zC,GACN,GACL,EAEgB0G,EAAAopJ,YAAhB,SAA+B36G,EAAUqF,GACvC,OAAOrF,EAAIp1C,OAAqC,CAACC,EAAM4zC,KACrD,MAAM73C,EAAQy+C,EAAK5G,GAGnB,OAFA5zC,EAAKjE,GAASiE,EAAKjE,IAAU,GAC7BiE,EAAKjE,GAAQ6Q,KAAKgnC,GACX5zC,GACN,GACL,EAEgB0G,EAAAwxJ,eAAhB,SAIE/iH,EAAUl1C,GACV,OAAOk1C,EAAIp1C,OAA8B,CAACC,EAAM4zC,KAE9C5zC,EADc4zC,EAAK3zC,IACL2zC,EACP5zC,GACN,GACL,EAEgB0G,EAAAyxJ,gBAAhB,SAAmChjH,EAAUqF,GAC3C,OAAOrF,EAAIp1C,OAAmC,CAACC,EAAM4zC,KAEnD5zC,EADcw6C,EAAK5G,IACLA,EACP5zC,GACN,GACL,EAEgB0G,EAAA0xJ,aAAhB,SAAmDjjH,EAAUl1C,GAC3D,MAAM4G,EAAM,IAAI5E,IAChB,IAAK,MAAM8hJ,KAAM5uG,EACftuC,EAAI4K,IAAIsyI,EAAG9jJ,IAEb,OAAO4G,CACT,EAEgBH,EAAA2xJ,sBAAhB,SACEljH,EACAl1C,EACAq4J,GAEA,MAAMzxJ,EAAM,IAAI5E,IAChB,IAAK,MAAM8hJ,KAAM5uG,EACftuC,EAAI4K,IAAI6mJ,EAAYvU,EAAG9jJ,KAEzB,OAAO4G,CACT,EAEgBH,EAAAkgE,KAAhB,SAAwB5rE,GACtB,OAAOA,EAAK+E,OAAO,CAACgsE,EAAKumC,IAAQvmC,EAAIpwE,OAAO22G,GAAM,GACpD,EAEgB5rG,EAAA5G,KAAhB,SAAwBq1C,EAAUojH,GAChC,MAAMC,EAAU,IAAIrjH,GAEpB,OADAqjH,EAAQ14J,KAAKy4J,GACNC,CACT,EAEgB9xJ,EAAAi6C,QAAhB,SAA2BxL,EAAUkwC,EAAeqB,GAClD,MAAM+xE,EAAU,IAAItjH,IACbujH,GAAcD,EAAQzlI,OAAOqyD,EAAO,GAE3C,OADAozE,EAAQzlI,OAAO0zD,EAAK,EAAGgyE,GAChBD,CACT,EAEgB/xJ,EAAAiyJ,YAAhB,SAA6DxjH,EAAUl1C,EAAQigD,GAC7E,MAAMs4G,EAAU,IAAIrjH,GAYpB,OAXAqjH,EAAQ14J,KAAK,CAAClC,EAAG6D,KACf,MAAMm3J,EAAS14G,EAAMpuC,QAAQlU,EAAEqC,IACzB44J,EAAS34G,EAAMpuC,QAAQrQ,EAAExB,IAC/B,OAAgB,IAAZ24J,EACK,GACc,IAAZC,GACD,EAEDD,EAASC,IAGbL,CACT,EAEgB9xJ,EAAAoyJ,eAAhB,SAAgE3jH,EAAUt1C,EAAWg4I,GACnF,MAAM2gB,EAAU,IAAIrjH,GAsBpB,OArBAqjH,EAAQ14J,KAAK,CAAClC,EAAG6D,KACf,IAAK,MAAMxB,KAAOJ,EAAM,CACtB,MAAMs4G,EAAOv6G,EAAEqC,GACTm4G,EAAO32G,EAAExB,GACf,GAAIk4G,IAASC,EAAb,CAGE,GAAoB,iBAATD,GAAqC,iBAATC,EACrC,OAAOy/B,EAAYz/B,EAAOD,EAAOA,EAAOC,EACnC,GAAoB,iBAATD,GAAqC,iBAATC,EAC5C,OAAOy/B,EAAYz/B,EAAKu+B,cAAcx+B,GAAQA,EAAKw+B,cAAcv+B,GAC5D,GAAoB,kBAATD,GAAsC,kBAATC,EAC7C,OAAOy/B,EAAaz/B,GAAQ,EAAI,EAAKD,GAAQ,EAAI,EAC5C,GAAY,MAARA,GAAwB,MAARC,EACzB,OAAOy/B,EAAqB,MAARz/B,GAAgB,EAAI,EAAa,MAARD,GAAgB,EAAI,CAErE,CACF,CACA,OAAO,IAGFqgD,CACT,EAEgB9xJ,EAAAgrB,OAAhB,SACEyjB,EACAl1C,EACA43I,GAEA,MAAM2gB,EAAU,IAAIrjH,GAQpB,OAPAqjH,EAAQ14J,KAAK,CAAClC,EAAG6D,KACf,MAAM02G,EAAOv6G,EAAEqC,GAETm4G,EAAO32G,EAAExB,GACf,OAAO43I,EAAYz/B,EAAOD,EAAOA,EAAOC,IAGnCogD,CACT,EAEgB9xJ,EAAAqyJ,WAAhB,SAAyC5jH,EAAUxb,EAAyBk+G,GAC1E,MAAM2gB,EAAU,IAAIrjH,GAQpB,OAPAqjH,EAAQ14J,KAAK,CAAClC,EAAG6D,KACf,MAAM02G,EAAOx+E,EAAG/7B,GAEVw6G,EAAOz+E,EAAGl4B,GAChB,OAAOo2I,EAAYz/B,EAAOD,EAAOA,EAAOC,IAGnCogD,CACT,EAEgB9xJ,EAAAo0E,KAAhB,SAAwB9/E,EAAWD,GACjC,OAAOC,EAAKkH,OAAQsrB,IAAOzyB,EAAG2R,SAAS8gB,IAAI7xB,OAAOZ,EAAGmH,OAAQsrB,IAAOxyB,EAAK0R,SAAS8gB,IACpF,EAEgB9mB,EAAAsyJ,OAAhB,SAAqCh+J,EAAWD,EAASkF,GACvD,OAAOjF,EACJkH,OAAQsrB,IAAOzyB,EAAGqC,KAAMqwB,GAAMD,EAAEvtB,KAASwtB,EAAExtB,KAC3CtE,OAAOZ,EAAGmH,OAAQsrB,IAAOxyB,EAAKoC,KAAMqwB,GAAMD,EAAEvtB,KAASwtB,EAAExtB,KAC5D,EAEgByG,EAAA6qC,OAAhB,SAA0Bv2C,EAAW44C,GACnC,OAAO54C,EAAKkH,OAAQ0f,GAAMA,IAAMgyB,EAClC,EAEgBltC,EAAAuyJ,UAAhB,SAA6Bj+J,EAAW44C,GACtC,OAAO54C,EAAKkH,OAAQ0f,IAAOgyB,EAAKlnC,SAASkV,GAC3C,EAEgBlb,EAAAwyJ,SAAhB,SAA4Bl+J,EAAWoR,GACrC,MAAMzI,EAAS,IAAI3I,GAEnB,OADA2I,EAAOqvB,OAAO5mB,EAAO,GACdzI,CACT,EAEgB+C,EAAAyyJ,MAAhB,SAAyBn+J,EAAWoR,EAAewnC,GACjD,OAAO54C,EAAK2E,IAAI,CAAC7B,EAAGzC,IAAOA,IAAM+Q,EAAQwnC,EAAO91C,EAClD,EAEgB4I,EAAAgxJ,MAAKA,EAILhxJ,EAAA0yJ,WAAhB,SACEp+J,EACAiF,EACAlE,EACA47J,GAGA,OADoB38J,EAAKoC,KAAMU,GAAMA,EAAEmC,KAASlE,GAEvC27J,EAAM18J,EAAMiF,EAAKlE,EAAO47J,GAExB,IAAI38J,EAAM28J,EAErB,EAEgBjxJ,EAAA2yJ,SAAhB,SAA0Er+J,EAAWiF,EAAQlE,GAC3F,OAAOf,EAAKkH,OAAQ0f,GAAMA,EAAE3hB,KAASlE,EACvC,EAEgB2K,EAAA4yJ,QAAhB,SAA2Bt+J,GACzB,OAAOA,EAAKkH,OAAQ0f,GAAW,MAALA,EAC5B,EAEgBlb,EAAAwO,OAAhB,SAAqCla,EAAWiF,GAC9C,MAAM4G,EAAM,IAAI5E,IACV0B,EAAS,GACf,IAAK,MAAMogJ,KAAM/oJ,EAAM,CACrB,MAAMsE,EAAKykJ,EAAG9jJ,GACT4G,EAAIpK,IAAI6C,KACXqE,EAAOiJ,KAAKm3I,GACZl9I,EAAI4K,IAAInS,GAEZ,CACA,OAAOqE,CACT,EAEgB+C,EAAAouJ,WAAhB,SAA4C95J,EAAW2+B,GACrD,MAAM9yB,EAAM,IAAI5E,IACV0B,EAAS,GACf,IAAK,MAAMogJ,KAAM/oJ,EAAM,CACrB,MAAMsE,EAAKq6B,EAAGoqH,GACTl9I,EAAIpK,IAAI6C,KACXqE,EAAOiJ,KAAKm3I,GACZl9I,EAAI4K,IAAInS,GAEZ,CACA,OAAOqE,CACT,EAEgB+C,EAAAouE,OAAhB,SAAwD95E,EAAWiF,EAAQlE,GACzE,IAAI4H,EACJ,IAAK,MAAMogJ,KAAM/oJ,EACf,GAAI+oJ,EAAG9jJ,KAASlE,EAAO,CACrB4H,EAASogJ,EACT,KACF,CAEF,OAAOpgJ,CACT,EAEgB+C,EAAA04G,iBAAhB,SAAoCpkH,EAAW8O,GAC7C,IAAK,IAAIzO,EAAIL,EAAKG,OAAS,EAAGE,GAAK,EAAGA,GAAK,EACzC,GAAIyO,EAAG9O,EAAKK,IACV,OAAOA,EAGX,OAAQ,CACV,EAEgBqL,EAAA6yJ,MAAhB,SAAyBv+J,EAAWD,GAClC,OAAOQ,MAAMP,KAAK,IAAIiH,IAAI,IAAIjH,KAASD,IACzC,EAEgB2L,EAAA0uC,cAAhB,SAA8BD,EAAetmB,GAC3C,MAAMlrB,EAAmB,GACzB,IAAI8xB,EAAQ,EAEZ,IAAK,IAAIp6B,EAAI,EAAGA,GAAK85C,EAAIh6C,OAAQE,IAC/B,GAAI85C,EAAI95C,KAAO85C,EAAI95C,EAAI,GACrBo6B,GAAS,MACJ,CACL,GAAIA,GAAS5G,EACXlrB,EAAOiJ,KAAK,GAAG6oB,KAAS0f,EAAI95C,EAAI,WAEhC,KAAOo6B,EAAQ,GACb9xB,EAAOiJ,KAAK,GAAGuoC,EAAI95C,EAAI,MACvBo6B,GAAS,EAGbA,EAAQ,CACV,CAGF,OAAO9xB,CACT,EAEgB+C,EAAA8yJ,qBAAhB,SAA2CC,EAAYC,EAAYn2E,GACjE,GAAIk2E,EAAMt+J,SAAWu+J,EAAMv+J,OACzB,OAAO,EAET,IAAK,IAAIE,EAAI,EAAGA,EAAIo+J,EAAMt+J,OAAQE,GAAK,EACrC,IAAKkoF,EAASk2E,EAAMp+J,GAAIq+J,EAAMr+J,IAC5B,OAAO,EAGX,OAAO,CACT,CACD,CAjYD,CAAiBqL,IAAe5K,EAAA4K,gBAAfA,EAAe,+gECAhC,MAAAqxC,EAAAt6C,EAAA,OACAsG,EAAAtG,EAAA,OAcA,IAAiB+4E,GAAjB,SAAiBA,GACf,SAASmjF,EAAWr6J,EAAY+F,GAC9B,MAAM+rI,EAAS/rI,EAASM,UAAUrG,GAClC,OAAiB,MAAV8xI,GAAmBA,EAAOjiB,eAAqBtmH,EAATuoI,CAC/C,CAGA,SAAShmD,EAAS9+E,EAAqBjH,GACrC,MAAM+rI,EAAS/rI,EAASM,UAAU2G,EAAKhN,IACjCC,EAAsB,MAAV6xI,EAAiBr5F,EAAAM,wBAAwB/V,QAAQ8uG,EAAQ9kI,GAAM/M,UAAY+M,EAAK/M,UAClG,OAAOq6J,EAASttJ,EAAKhN,GAAIC,EAC3B,CAEA,SAASq6J,EAASt6J,EAAYC,GAC5B,OAAoB,MAAbA,EAAoB,CAAED,KAAIC,aAAc,CAAED,KACnD,CAEA,SAASW,EAAIqM,SACX,MAAO,GAAGA,EAAKhN,OAAyB,QAAdiC,EAAA+K,EAAK/M,iBAAS,IAAAgC,EAAAA,EAAI,IAC9C,CAGA,SAASs4J,EAASx0J,GAChB,MAAM1B,EAA0B,GAChC,IAAK,MAAMytI,KAAUx1I,OAAOyK,OAAOhB,EAASM,WAC1C,GAAc,MAAVyrI,EACF,IAAK,MAAM5/G,KAAaumB,EAAAM,wBAAwBgjF,KAAK+V,GACnDztI,EAAOiJ,KAAKgtJ,EAASxoB,EAAO9xI,GAAIkyB,EAAUjyB,YAIhD,OAAOoE,CACT,CAIA,SAAgB2gC,EAAKnV,EAA6B9pB,SAChD,MAAM+rI,EAASuoB,EAAWxqI,EAAa7vB,GAAI+F,GACrC4+G,EAAiB,MAAVmtB,EAAmE,QAAlD7vI,EAAAw2C,EAAAM,wBAAwBtmB,KAAKq/G,EAAQjiH,UAAa,IAAA5tB,OAAA,EAAAA,EAAE0tH,eAAYpmH,EAC9F,GAAY,MAARo7G,EACF,OAEF,MAAM30G,EAASqqJ,EAAW11C,EAAK3kH,GAAI+F,GACnC,OAAc,MAAViK,GAAgE,MAA9CyoC,EAAAM,wBAAwBtmB,KAAKziB,EAAQ20G,GAGpD74B,EAAS64B,EAAM5+G,QAHtB,CAIF,CAEA,SAAgB4uE,EAAS9kD,EAA6B9pB,GACpD,MAAMiH,EAAO8+E,EAASj8D,EAAc9pB,GACpC,IAAK,MAAMy0J,KAAaD,EAASx0J,GAAW,CAC1C,GAAItB,EAAA0B,SAASyuC,GAAG4lH,EAAWxtJ,GACzB,SAEF,MAAMytJ,EAAQz1H,EAAKw1H,EAAWz0J,GAC9B,GAAa,MAAT00J,GAAiBh2J,EAAA0B,SAASyuC,GAAG6lH,EAAOztJ,GACtC,OAAOwtJ,CAEX,CAEF,CAiEA,SAASE,EAAOC,EAAmBj/J,EAAqBipH,GACtD,MAAMzkH,EAAWy6J,EAAQj/J,EAAKsE,IACd,MAAZE,IACFy6J,EAAQj/J,EAAKsE,IAAMy4C,EAAAM,wBAAwBpmB,OAAOzyB,EAAUxE,EAAKuE,UAAW,CAAE0vH,UAAWhL,IAE7F,CAEA,SAASi2C,EAAc70J,EAAqBM,GAC1C,OAAA/J,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAYyB,GAAQ,CAAEM,UAAWA,GACnC,CAEA,SAASw0J,EAAW36J,GAClB,MAAQyvH,UAAWmrC,GAAsB56J,EAAT27C,EAAI9qC,EAAK7Q,EAAnC,eACN,OAAuB,MAAnB27C,EAAKyb,WACAzb,EAETv/C,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKu3C,GAAI,CACPyb,WAAYzb,EAAKyb,WAAWj3D,IAAK0E,IAC/B,MAAQ4qH,UAAWorC,GAAwBh2J,EAC3C,OADsCgM,EAAKhM,EAArC,kBAIZ,CA8DA,SAAgB2yE,EACdh8E,EACAD,EACAmgF,EACA5E,EACAjxE,GAEA,MAAMuxE,EAAavxE,EAASM,UAAU3K,EAAKsE,IACrCu3E,EAAWxxE,EAASM,UAAU5K,EAAGuE,IACvC,GAAkB,MAAds3E,GAAkC,MAAZC,EACxB,OAEF,MAAMJ,EAAW2U,EAASpwF,EAAMqK,GAC1Bi1J,EAASlvE,EAASrwF,EAAIsK,GAC5B,MAAO,CACLrK,KAAMy7E,EACN17E,GAAIu/J,EACJ5oC,SAAU3tH,EAAA0B,SAASmsI,eAAeh7D,EAAWzwE,KAAMswE,EAASl3E,UAAWq3E,EAAYvxE,GACnFssH,OAAQ5tH,EAAA0B,SAASmsI,eAAe/6D,EAAS1wE,KAAMm0J,EAAO/6J,UAAWs3E,EAAUxxE,GAC3E61E,YACA5E,QAEJ,CArMgBE,EAAAlyC,KAAIA,EAaJkyC,EAAAvC,SAAQA,EAcRuC,EAAAl5C,MAAhB,SAAsBnO,EAA6B9pB,GACjD,GAA6C,MAAzCs0J,EAAWxqI,EAAa7vB,GAAI+F,GAC9B,MAAO,GAET,IAAIk1J,EAASnvE,EAASj8D,EAAc9pB,GACpC,MAAMkjF,EAAO,IAAItmF,IAAY,CAAChC,EAAIs6J,KAClC,IAAK,IAAIvlF,EAAOf,EAASsmF,EAAQl1J,GAAmB,MAAR2vE,IAAiBuT,EAAK9rF,IAAIwD,EAAI+0E,IAAQA,EAAOf,EAASe,EAAM3vE,GACtGkjF,EAAK92E,IAAIxR,EAAI+0E,IACbulF,EAASvlF,EAEX,MAAMrxE,EAA0B,CAAC42J,GAC3BC,EAAU,IAAIv4J,IAAY,CAAChC,EAAIs6J,KACrC,IAAK,IAAI14I,EAAIyiB,EAAKi2H,EAAQl1J,GAAgB,MAALwc,IAAc24I,EAAQ/9J,IAAIwD,EAAI4hB,IAAKA,EAAIyiB,EAAKziB,EAAGxc,GAClFm1J,EAAQ/oJ,IAAIxR,EAAI4hB,IAChBle,EAAOiJ,KAAKiV,GAEd,OAAOle,CACT,EAEgB6yE,EAAAikF,aAAhB,SACEhkF,EACA6jF,EACAj1J,GAEA,MAAMrK,EAAOowF,EAAS3U,EAAUpxE,GAC1BtK,EAAKqwF,EAASkvE,EAAQj1J,GAC5B,GAAItB,EAAA0B,SAASyuC,GAAGl5C,EAAMD,GACpB,MAAO,OAET,MAAM87E,EAAWxxE,EAASM,UAAU5K,EAAGuE,IACvC,GAAmC,MAA/B+F,EAASM,UAAU3K,EAAKsE,KAA2B,MAAZu3E,EACzC,MAAO,WAET,GAAIA,EAASs4C,UACX,MAAO,UAET,GAAkD,MAA9Cp3E,EAAAM,wBAAwBtmB,KAAK8kD,EAAU97E,GACzC,MAAO,oBAET,MAAMwtF,EAAO,IAAItmF,IAAY,CAAChC,EAAIjF,KAClC,IAAK,IAAI6mB,EAA+B9mB,EAAS,MAAL8mB,EAAWA,EAAIyiB,EAAKziB,EAAGxc,GAAW,CAC5E,GAAItB,EAAA0B,SAASyuC,GAAGryB,EAAG7mB,GACjB,MAAO,OAET,GAAIutF,EAAK9rF,IAAIwD,EAAI4hB,IACf,MAEF0mE,EAAK92E,IAAIxR,EAAI4hB,GACf,CACA,IAAK,MAAMi4I,KAAaD,EAASx0J,GAC/B,IAAKtB,EAAA0B,SAASyuC,GAAG4lH,EAAW9+J,GAAO,CACjC,MAAM++J,EAAQz1H,EAAKw1H,EAAWz0J,GAC9B,GAAa,MAAT00J,GAAiBh2J,EAAA0B,SAASyuC,GAAG6lH,EAAOh/J,GACtC,MAAO,iBAEX,CAGJ,EAiCgBy7E,EAAAxjD,OAAhB,SAAuBmrH,EAA0B94I,GAC/C,MAAM1B,EAA4B,CAAA/H,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAMu2J,EAAWhc,IAAQ,CAAEhvB,WAAW,KAClEurC,EAASr1J,EAASM,UAAUw4I,EAAQ7+I,IAC1C,GAAc,MAAVo7J,GAAkBA,EAAOvrC,UAC3B,OAAOxrH,EAET,MAAMs2J,EAAOr+J,OAAAgI,OAAA,GAAkByB,EAASM,WAClCi4F,EAAoB,GAC1B,IAAK,MAAMpsE,KAAaumB,EAAAM,wBAAwBgjF,KAAKq/B,GAAS,CAC5D,MAAMpuJ,EAAOstJ,EAASc,EAAOp7J,GAAIkyB,EAAUjyB,WACrCoO,EAAUusJ,EAAc70J,EAAU40J,GAClC3pC,EAAQr8C,EAAS3nE,EAAMqB,GAChB,MAAT2iH,IAGJ0pC,EAAOC,EAAS3pC,EAAOhsF,EAAKh4B,EAAMqB,IAC9B2iH,EAAMhxH,KAAO6+I,EAAQ7+I,IAAOs+F,EAAQlxF,SAAS4jH,EAAMhxH,KACrDs+F,EAAQhxF,KAAK0jH,EAAMhxH,IAEvB,CACA,IAAK,MAAMA,KAAMs+F,EAAS,CACxB,MAAM+8D,EAAUV,EAAQ36J,GACT,MAAXq7J,GACFh3J,EAAOiJ,KAAK+tJ,EAEhB,CACA,OAAOh3J,CACT,EAKgB6yE,EAAAokF,gBAAhB,SACEp7J,EACAD,EACA8F,GAEA,MAAMw1J,EAAUzvE,EAASwuE,EAASp6J,EAASF,GAAIC,GAAY8F,GACrD80H,EAAM71F,EAAKu2H,EAASx1J,GACpB40J,EAAOr+J,OAAAgI,OAAA,GAAkByB,EAASM,WAClCi4F,EAAoB,GAC1B,IAAK,MAAMk8D,KAAaD,EAASx0J,GAAW,CAC1C,GAAItB,EAAA0B,SAASyuC,GAAG4lH,EAAWe,GACzB,SAEF,MAAMd,EAAQz1H,EAAKw1H,EAAWz0J,GACjB,MAAT00J,GAAiBh2J,EAAA0B,SAASyuC,GAAG6lH,EAAOc,KACtCb,EAAOC,EAASH,EAAW3/B,GACtBv8B,EAAQlxF,SAASotJ,EAAUx6J,KAC9Bs+F,EAAQhxF,KAAKktJ,EAAUx6J,IAG7B,CACA,OAAOs+F,EAAQj+F,IAAKL,GAAO26J,EAAQ36J,GACrC,EAGgBk3E,EAAAQ,YAAWA,EA2BXR,EAAAskF,cAAhB,SACEz7J,EACA07J,EACA11J,GAEA,GAA+B,MAA3BhG,EAAMmoC,mBAA6BnoC,EAAMy8E,aAC3C,MAAO,GAET,MAAMk/E,EAAY5vE,EAAS/rF,EAAMG,SAAU6F,GACrCq5C,EAAUr/C,EAAM27E,YACtB,GAAuB,YAAnBt8B,aAAO,EAAPA,EAAS43B,OAAoB,CAC/B,IAAKvyE,EAAA0B,SAASyuC,GAAG8mH,EAAW5vE,EAAS1sC,EAAQ3jD,GAAIsK,IAC/C,MAAO,GAET,MAAM61E,EAAkC,OAAtBx8B,EAAQw8B,UAAqB,OAAS,KACxD,MAAO,CACL,CACEA,YACAnrE,MAAO,GAAiB,OAAdmrE,EAAqB,cAAgB,iBAAiBx8B,EAAQgzE,WACxEviG,aAAcuvB,EAAQ1jD,KACtBigK,QAAQ,GAGd,CACA,GAA2B,MAAvBF,IAAgCh3J,EAAA0B,SAASyuC,GAAG8mH,EAAW5vE,EAAS2vE,EAAqB11J,IACvF,MAAO,GAET,MAAMyd,EAAgC,GAChCo4I,EAA2D,CAC/D,CAAC,KAAM52H,EAAKjlC,EAAMG,SAAU6F,IAC5B,CAAC,OAAQ4uE,EAAS50E,EAAMG,SAAU6F,KAEpC,IAAK,MAAO61E,EAAW5rE,KAAW4rJ,EAAY,CAC5C,MAAM50H,EAAmB,MAAVh3B,EAAiB0nE,EAAY33E,EAAMG,SAAU8P,EAAQ4rE,EAAW,SAAU71E,QAAYwD,EACvF,MAAVy9B,GACFxjB,EAAQlW,KAAK,CACXsuE,YACAnrE,MAAO,GAAiB,OAAdmrE,EAAqB,cAAgB,iBAAiB50C,EAAOqrF,SACvExiG,aAAcmX,EAAOvrC,GACrBurC,SACA20H,QAAQ,GAGd,CACA,OAAOn4I,CACT,CACD,CA5RD,CAAiB0zD,IAAa16E,EAAA06E,cAAbA,EAAa,8BChB9B,IAAiB7lC,gEAAjB,SAAiBA,GACCA,EAAA3vC,SAAhB,SAAyB2J,GACvB,OAAOA,EACJhL,IAAKof,GACGA,EACJpf,IAAK5D,IACJ,IAAIo/J,GAAuB,EAgB3B,MAfqB,iBAAVp/J,KACmB,IAAxBA,EAAM+V,QAAQ,OAChBqpJ,GAAuB,IAEG,IAAxBp/J,EAAM+V,QAAQ,OAChBqpJ,GAAuB,EACvBp/J,EAAQA,EAAMmK,QAAQ,KAAM,QAE1Bi1J,IACFp/J,EAAQ,IAAIA,OAGF,OAAVA,IACFA,EAAQ,IAEHA,IAERuN,KAAK,MAETA,KAAK,KACV,CACD,CA5BD,CAAiBqnC,IAAG70C,EAAA60C,IAAHA,EAAG,ucCApB,MAAA1xC,EAAAxB,EAAA,OAkBM29J,EAAkB,CACtB,KACA,aACA,UACA,YACA,UACA,QACA,WACA,WACA,iBACA,eACA,mBAIIC,EAAsB,CAAC,OAAQ,cAAe,SAAU,YAAa,eAAgB,qBAErFC,EAAqB,CAAC,mBAAoB,SAC1CC,EAAoB,CAAC,QAAS,iBAAkB,iBAAkB,WAAY,eAC9EC,EAAsB,CAC1B,UACA,eACA,gBACA,oBACA,UACA,iBACA,cACA,cACA,qBAEIC,EAAqB,CACzB,QACA,WACA,YACA,kBACA,qBACA,sBACA,mBACA,eACA,kBACA,sBACA,qBACA,qBACA,2BACA,sBACA,cAEIC,EAAiB,CACrB,WACA,oBACA,SACA,QACA,cACA,SACA,eACA,iBACA,wBACA,eACA,cAIIC,EAAa,QAEbC,EAAqF,CACzF,CAAEC,SAAU,SAAUh8J,KAAMjE,OAAOiE,KAAKZ,EAAA+2H,iBACxC,CAAE6lC,SAAU,SAAUh8J,KAAMjE,OAAOiE,KAAKZ,EAAAk3H,iBACxC,CAAE0lC,SAAU,aAAch8J,KAAMjE,OAAOiE,KAAKZ,EAAAq3H,sBAG9C,SAASjoE,EAActyD,GACrB,MAAwB,iBAAVA,GAA+B,MAATA,IAAkBR,MAAMmE,QAAQ3D,EACtE,CAEA,SAAS+/J,EAAU//J,GACjB,OAAgB,MAATA,CACT,CAEA,SAASggK,EAAUn+J,EAAY6D,GAC7B,GAAI7D,IAAM6D,EACR,OAAO,EAET,GAAIlG,MAAMmE,QAAQ9B,IAAMrC,MAAMmE,QAAQ+B,GACpC,SAAKlG,MAAMmE,QAAQ9B,KAAOrC,MAAMmE,QAAQ+B,IAAM7D,EAAEzC,SAAWsG,EAAEtG,SAGtDyC,EAAEgF,MAAM,CAACgxC,EAAMv4C,IAAM0gK,EAAUnoH,EAAMnyC,EAAEpG,KAEhD,GAAIgzD,EAAczwD,IAAMywD,EAAc5sD,GAAI,CACxC,MAAMu6J,EAAQpgK,OAAOiE,KAAKjC,GACpBq+J,EAAQrgK,OAAOiE,KAAK4B,GAC1B,OAAIu6J,EAAM7gK,SAAW8gK,EAAM9gK,QAGpB6gK,EAAMp5J,MAAO3C,GAAQA,KAAOwB,GAAKs6J,EAAUn+J,EAAEqC,GAAMwB,EAAExB,IAC9D,CACA,OAAO,CACT,CAEA,IAAiBM,GAAjB,SAAiBA,GAEf,SAAgBytD,EAAmBzoB,GACjC,MAAO,oCAAoCxjB,KAAKwjB,EAClD,CAGA,SAAgB/kC,EAAiBL,GAC/B,MAAQgG,KAAMi0E,GAAmBj6E,EAATg7C,EAAI9qC,EAAKlQ,EAA3B,UACN,OAAAvE,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKu3C,GAAI,CACP/pB,MAAOjxB,EAAQixB,MAAMzxB,IAAKuyB,IACxB,MAAQ5yB,GAAI48J,GAAyBhqI,EAAbiqI,EAAQ9rJ,EAAK6hB,EAA/B,QACN,OAAAt2B,OAAAgI,OAAAhI,OAAAgI,OAAA,GACKu4J,GAAQ,CACX3pI,KAAMN,EAAKM,KAAK7yB,IAAKwyB,IACnB,MAAQ7yB,GAAI88J,GAAuBjqI,EACnC,OAD8B9hB,EAAK8hB,EAA7B,eAMhB,CAMA,SAASkqI,EAAWC,EAAevgK,GACjC,MAAc,YAAVugK,GALN,SAAmBvgK,GACjB,OAAOsyD,EAActyD,IAA0B,YAAhBA,EAAM67D,OAAuBr8D,MAAMmE,QAAQ3D,EAAMq1B,MAClF,CAG6BmrI,CAAUxgK,GAC5ByE,EAAiBzE,GAEnBA,CACT,CAEA,SAASygK,EAASzgK,GAChB,OAAI+/J,EAAU//J,GACL,GAEFsyD,EAActyD,GAASA,EAAQ,CAAE4/J,CAACA,GAAa5/J,EACxD,CAqBA,SAAgB0gK,EAAanwJ,SAC3B,OAA8D,QAAvD/K,EAAAq6J,EAAU15J,OAAQsxB,IAAgC,IAA1BA,EAAE3zB,KAAKiS,QAAQxF,IAAc,UAAE,IAAA/K,OAAA,EAAAA,EAAEs6J,QAClE,CA4EA,SAASa,EAAWjpH,EAA2ByM,GAC7C,GAAa,MAATA,EACF,OAAOzM,EAAM9zC,IAAI,EAAE,CAAEi0C,KAAUA,GAEjC,MAAM+oH,EAAO,IAAI5kI,IAAI0b,GACf9vC,EAAc,GACpB,IAAK,MAAMrE,KAAM4gD,EACXy8G,EAAKlgK,IAAI6C,KACXqE,EAAOiJ,KAAK+vJ,EAAKj3J,IAAIpG,IACrBq9J,EAAK50I,OAAOzoB,IAIhB,OADAq9J,EAAKvpI,QAASwgB,GAASjwC,EAAOiJ,KAAKgnC,IAC5BjwC,CACT,CA8GA,SAAgB0pD,EAAU9nB,GACxB,IAAIl3B,EACJ,GAAKA,EAAIk3B,EAAQsM,MAAM,mBAAqB,CAC1C,IAA0C,IAAtCypH,EAAmBxpJ,QAAQzD,EAAE,IAC/B,MAAO,cAET,IAAyC,IAArCktJ,EAAkBzpJ,QAAQzD,EAAE,IAC9B,MAAO,YAEX,KAAO,IAAKA,EAAIk3B,EAAQsM,MAAM,2CAC5B,MAAgB,SAATxjC,EAAE,GAAgB,cAAgB,cACpC,GAAIk3B,EAAQsM,MAAM,mBAAqBtM,EAAQsM,MAAM,kBAC1D,MAAO,gBACF,GAAImc,EAAmBzoB,GAC5B,MAAO,gBACF,GAAIA,EAAQsM,MAAM,0BACvB,MAAO,cACF,GAAItM,EAAQsM,MAAM,4CAEvB,MAAO,SACF,GAAItM,EAAQsM,MAAM,qBAEvB,MAAO,cACF,GAAItM,EAAQsM,MAAM,sCACvB,MAAO,SACF,GAAKxjC,EAAIk3B,EAAQsM,MAAM,oBAAsB,CAClD,IAA2C,IAAvC2pH,EAAoB1pJ,QAAQzD,EAAE,IAChC,MAAO,cAET,IAA0C,IAAtCotJ,EAAmB3pJ,QAAQzD,EAAE,IAC/B,MAAO,aAET,IAAsC,IAAlCqtJ,EAAe5pJ,QAAQzD,EAAE,IAC3B,MAAO,QAEX,EACA,MAAM,IAAIuH,MAAM,qBAAqB2vB,IACvC,CA1SgBhlC,EAAAytD,mBAAkBA,EAKlBztD,EAAAC,iBAAgBA,EAoChBD,EAAAwqD,cAAhB,SAA8BpvB,EAAe2I,GAC3C,MAAMs4H,EAAaJ,EAAS7gI,GACtBkhI,EAAaL,EAASl4H,GAE5B,OADc/oC,MAAMP,KAAK,IAAIiH,IAAI,IAAIrG,OAAOiE,KAAK+8J,MAAgBhhK,OAAOiE,KAAKg9J,MAChE36J,OAAQiE,IACnB,MAAMvI,EAAIg/J,EAAWz2J,GACf1E,EAAIo7J,EAAW12J,GACrB,QAAI21J,EAAUl+J,IAAMk+J,EAAUr6J,IAGtBs6J,EAAUM,EAAWl2J,EAAMvI,GAAIy+J,EAAWl2J,EAAM1E,MAE5D,EAEgBlB,EAAAsqD,cAAhB,SAA8BtlB,GAC5B,OAAgF,IAAzE,CAAC,aAAc,kBAAmB,iBAAiBzzB,QAAQyzB,EACpE,EAEgBhlC,EAAAk8J,aAAYA,EAIZl8J,EAAA2qD,QAAhB,SAAwBhuC,WACtB,MAAMpX,EAAmC,GACnC0wF,EAAM,CAACv2F,EAAelE,UACZ8M,IAAV9M,IACF+J,EAAM7F,GAAOlE,IAIX+gK,EAAgB5/I,EACtB,IAAK,MAAMjd,KAAOrE,OAAOiE,KAAKi9J,IACU,IAAlC1B,EAAgBtpJ,QAAQ7R,IAC1Bu2F,EAAI,WAAWv2F,IAAO68J,EAAc78J,IAIxC,MAAMoF,EAAW6X,EAAQ7X,SACnB03J,EAAiB13J,EACvB,IAAK,MAAMpF,KAAOrE,OAAOiE,KAAKk9J,IACc,IAAtC1B,EAAoBvpJ,QAAQ7R,IAC9Bu2F,EAAI,YAAYv2F,IAAO88J,EAAe98J,IAG1C,IAAK,MAAMqyE,KAAOjtE,EAASktE,KAAM,CAC/B,MAAMhzE,UAAEA,GAA0B+yE,EAAZ0qF,EAAO3sJ,EAAKiiE,EAA5B,eACNkkB,EAAI,iBAAiBlkB,EAAIhzE,KAAM09J,GAC/B,IAAK,MAAMC,KAAgBrhK,OAAOiE,KAAKN,GACrCi3F,EAAI,iBAAiBlkB,EAAIhzE,gBAAgB29J,IAAiB19J,EAAsB09J,GAEpF,CACAzmE,EACE,sBACAnxF,EAASktE,KAAK5yE,IAAK4H,GAAMA,EAAEjI,KAE7B,IAAK,MAAMW,KAAOrE,OAAOiE,KAAKwF,EAAShE,cACrCm1F,EAAI,yBAAyBv2F,IAAOoF,EAAShE,aAAapB,IAE5D,IAAK,MAAMA,KAAOrE,OAAOiE,KAA+B,QAA1B0B,EAAA8D,EAASi1H,yBAAiB,IAAA/4H,EAAAA,EAAI,IAC1Di1F,EAAI,8BAA8Bv2F,KAAkC,QAA1BqB,EAAA+D,EAASi1H,yBAAiB,IAAAh5H,EAAAA,EAAI,IAAIrB,IAE9E,IAAK,MAAMA,KAAOrE,OAAOiE,KAAKwF,EAASM,WACrC6wF,EAAI,sBAAsBv2F,IAAOoF,EAASM,UAAU1F,IAEtD,IAAK,MAAMiyE,KAAS7sE,EAAS4sE,OAAOA,OAClCukB,EAAI,mBAAmBtkB,EAAM5yE,KAAM4yE,GAErCskB,EACE,wBACAnxF,EAAS4sE,OAAOA,OAAOtyE,IAAK4H,GAAMA,EAAEjI,KAGtC,IAAK,MAAM0D,KAAWka,EAAQvD,SAAU,CACtC,MAAMxZ,QAAEA,EAAOC,QAAEA,GAAqB4C,EAATiT,EAAI5F,EAAKrN,EAAhC,uBACNwzF,EAAI,WAAWxzF,EAAQ1D,UAAW2W,GACnB,MAAX9V,GACFq2F,EAAI,WAAWxzF,EAAQ1D,aAAc,CAAEa,YAEzCq2F,EAAI,WAAWxzF,EAAQ1D,aAAc,CAAEc,WACzC,CAEA,IAAK,MAAMkC,KAAU4a,EAAQrI,QAC3B2hF,EAAI,WAAWl0F,EAAOhD,KAAMgD,GAG9B,MAAMksC,EAAQtxB,EAAQsxB,MACtB,IAAK,MAAMqtH,KAAYjgK,OAAOiE,KAAK2uC,GACjC,IAAK,MAAMliC,KAAQ1Q,OAAOiE,KAAK2uC,EAAMqtH,IACnC,IAAK,MAAMqB,KAAQ1uH,EAAMqtH,GAAUvvJ,IAAS,GAC1CkqF,EAAI,QAAQ0mE,EAAKjzH,aAAa39B,IAAQ4wJ,GAI5C,OAAOp3J,CACT,EAmBgBvF,EAAAirD,UAAhB,SAA0B1lD,EAAkC6W,GAC1D,MAAMwgJ,EAAoB,GACpB93J,EAAoB,GACpBktE,EAA8B,GAC9Bs7C,EAAsC,GAC5C,IAAIuvC,EACJ,MAAM/7J,EAAwB,GACxBsE,EAAqB,GACrB20H,EAA6B,GAC7BroD,EAAkC,GACxC,IAAIorF,EACJ,MAAMC,EAA0C,GAC1CC,EAA2C,GAC3CC,EAA2C,GAC3C3oJ,EAA4B,GAE5B25B,EAAmD,GACzD,IAAK,MAAMmtF,KAAOigC,EAAW,CAC3BptH,EAAMmtF,EAAIkgC,UAAY,GACtB,IAAK,MAAMvvJ,KAAQqvH,EAAI97H,KACrB2uC,EAAMmtF,EAAIkgC,UAAUvvJ,GAAQ,EAEhC,CAEA,IAAK,MAAMrM,KAAOrE,OAAOiE,KAAKiG,GAAQ,CACpC,MAAM/J,EAAQ+J,EAAM7F,GACpB,IAAIoO,EACJ,GAAY,wBAARpO,EACFm9J,EAAWrhK,OACN,GAAY,0BAARkE,EACTo9J,EAAathK,OACR,GAAKsS,EAAIpO,EAAI4xC,MAAM,4CACxBg8E,EAAWx/G,EAAE,IAAGzS,OAAAgI,OAAAhI,OAAAgI,OAAA,GAASiqH,EAAWx/G,EAAE,KAAO,IAAG,CAAE,CAACA,EAAE,IAAKtS,SACrD,GAAKsS,EAAIpO,EAAI4xC,MAAM,0BACxB0gC,EAAK3lE,KAAK,CAACyB,EAAE,GAAItS,SACZ,GAAKsS,EAAIpO,EAAI4xC,MAAM,kCACxBxwC,EAAagN,EAAE,IAAMtS,OAChB,GAAKsS,EAAIpO,EAAI4xC,MAAM,uCACxByoF,EAAkBjsH,EAAE,IAAMtS,OACrB,GAAKsS,EAAIpO,EAAI4xC,MAAM,+BACxBlsC,EAAU0I,EAAE,IAAMtS,OACb,GAAKsS,EAAIpO,EAAI4xC,MAAM,4BACxBogC,EAAOrlE,KAAK,CAACyB,EAAE,GAAItS,SACd,GAAKsS,EAAIpO,EAAI4xC,MAAM,oBACxBxsC,EAASgJ,EAAE,IAAMtS,OACZ,GAAKsS,EAAIpO,EAAI4xC,MAAM,mBACxBsrH,EAAS9uJ,EAAE,IAAMtS,OACZ,GAAKsS,EAAIpO,EAAI4xC,MAAM,2CACX,SAATxjC,EAAE,GACJivJ,EAAc1wJ,KAAK,CAACyB,EAAE,GAAItS,IACR,YAATsS,EAAE,GACXkvJ,EAAgBlvJ,EAAE,IAAOtS,EAAkBoE,QAE3Cq9J,EAAgBnvJ,EAAE,IAAOtS,EAAkBqE,aAExC,GAAIH,EAAI4xC,MAAM,kBACnBh9B,EAAQjI,KAAK7Q,OACR,MAAKsS,EAAIpO,EAAI4xC,MAAM,uBAMxB,MAAM,IAAIj8B,MAAM,qBAAqB3V,KANW,CAChD,MAAM47J,EAAWY,EAAapuJ,EAAE,IAChB,MAAZwtJ,GACFrtH,EAAMqtH,GAAUxtJ,EAAE,IAAIzB,KAAK7Q,EAE/B,CAEA,CACF,CAEA,MAAM4d,EAAW2jJ,EAAc39J,IAAI,EAAEL,EAAI2W,MACvC,MAAMjT,EAAOpH,OAAAgI,OAAA,GAAiBqS,GAO9B,OANI3W,KAAMi+J,IACRv6J,EAAQ7C,QAAUo9J,EAAgBj+J,IAEhCA,KAAMk+J,IACRx6J,EAAQ5C,QAAUo9J,EAAgBl+J,IAE7B0D,IAGHy6J,EAAgB7hK,OAAAgI,OAAAhI,OAAAgI,OAAA,GACjByB,GAAQ,CACXktE,KAAMmqF,EAAQnqF,EAAM6qF,GAAUz9J,IAAK2yE,GAAQ12E,OAAAgI,OAAAhI,OAAAgI,OAAA,GAAM0uE,GAAG,CAAE/yE,UAAWsuH,EAAWv7C,EAAIhzE,KAAO,MACvFsyE,YAAa,GACbK,OAAQ,CAAEra,MAAO,SAAUqa,OAAQyqF,EAAQzqF,EAAQorF,IACnD13J,YACAtE,eACAi5H,sBAGF,OAAO1+H,OAAAgI,OAAAhI,OAAAgI,OAAAhI,OAAAgI,OAAA,CACLsqC,sBAAkBrlC,EAClBiP,WAAOjP,EACP8mC,eAAgB,GAChBy5D,eAAgB,GAChBgB,MAAO,IACJ+yD,GACY,MAAXxgJ,EAAKrd,GAAa,CAAEA,GAAIqd,EAAKrd,IAAO,IAAG,CAC3C+T,QAASsJ,EAAKtJ,QACdwB,UACA25B,MAAOA,EACP70B,WACAtU,SAAUo4J,EACVp0D,eAAgB,GAChBE,aAAc,GACdD,gBAAiB,IAErB,EAEgB/oG,EAAA8sD,UAASA,EAwCT9sD,EAAAm9J,eAAhB,SAA+Bn4H,EAAmB+2H,GAChD,OAAI/2H,EAAQsM,MAAM,8BAA0C,sBAAVyqH,EACzC,eAGP/2H,EAAQsM,MAAM,6CACH,wBAAVyqH,GAA6C,gBAAVA,EAI/BjvG,EAAU9nB,GAFR,aAGX,CACD,CA3TD,CAAiBhlC,IAASzE,EAAAyE,UAATA,EAAS,gCCpH1B,IACA22F,EADAC,EAAAr8F,MAAAA,KAAAq8F,YACAD,EAAA,SAAA1jE,EAAA/xB,GAIA,OAHAy1F,EAAAt7F,OAAAw7F,gBACA,CAAenkF,UAAA,cAAgB1X,OAAA,SAAAi4B,EAAA/xB,GAAsC+xB,EAAAvgB,UAAAxR,CAAA,GACrE,SAAA+xB,EAAA/xB,GAA8B,QAAAwD,KAAAxD,EAAA7F,OAAAJ,UAAAwC,eAAAtC,KAAA+F,EAAAwD,KAAAuuB,EAAAvuB,GAAAxD,EAAAwD,GAAA,EAC9BiyF,EAAA1jE,EAAA/xB,EACA,EACA,SAAA+xB,EAAA/xB,GACA,sBAAAA,GAAA,OAAAA,EACA,UAAAqnE,UAAA,uBAAAtsD,OAAA/a,GAAA,iCAEA,SAAA0gB,IAAwBrnB,KAAAyZ,YAAAif,CAAA,CADxB0jE,EAAA1jE,EAAA/xB,GAEA+xB,EAAAh4B,UAAA,OAAAiG,EAAA7F,OAAAugD,OAAA16C,IAAA0gB,EAAA3mB,UAAAiG,EAAAjG,UAAA,IAAA2mB,EACA,GAEAk1E,EAAAv8F,MAAAA,KAAAu8F,UAAA,WASA,OARAA,EAAAz7F,OAAAgI,QAAA,SAAAge,GACA,QAAAwB,EAAA/nB,EAAA,EAAAwmB,EAAA3mB,UAAAC,OAAiDE,EAAAwmB,EAAOxmB,IAExD,QAAA4J,KADAme,EAAAloB,UAAAG,GACAO,OAAAJ,UAAAwC,eAAAtC,KAAA0nB,EAAAne,KACA2c,EAAA3c,GAAAme,EAAAne,IAEA,OAAA2c,CACA,EACAy1E,EAAA/4F,MAAAxD,KAAAI,UACA,EACAL,EAAAC,MAAAA,KAAAD,eAAA,SAAAE,EAAAC,EAAAC,GACA,GAAAA,GAAA,IAAAC,UAAAC,OAAA,QAAAC,EAAAC,EAAA,EAAAC,EAAAN,EAAAG,OAA6EE,EAAAC,EAAOD,KACpFD,GAAAC,KAAAL,IACAI,IAAAA,EAAAG,MAAAC,UAAAC,MAAAC,KAAAV,EAAA,EAAAK,IACAD,EAAAC,GAAAL,EAAAK,IAGA,OAAAN,EAAAY,OAAAP,GAAAG,MAAAC,UAAAC,MAAAC,KAAAV,GACA,EACAY,OAAAC,eAAAC,EAAA,cAA+CC,OAAA,IAC/CD,EAAAwhG,QAAkBxhG,EAAAuhG,YAAsBvhG,EAAAwQ,KAAexQ,EAAAkhG,cAAwBlhG,EAAAiuF,MAAgBjuF,EAAAghG,UAAoBhhG,EAAA6gG,UAAoB7gG,EAAA2gG,cAAwB3gG,EAAAqoE,IAAcroE,EAAAygG,MAAgBzgG,EAAAwgG,eAAyBxgG,EAAAugG,MAAgBvgG,EAAAsgG,UAAoBtgG,EAAAqgG,QAAkBrgG,EAAAogG,YAAsBpgG,EAAA,KAAeA,EAAA+M,UAAoB/M,EAAA,KAAeA,EAAAw9F,cAAwBx9F,EAAAmgG,kBAA4BngG,EAAAkgG,aAAuBlgG,EAAAigG,aAAuBjgG,EAAAszH,QAAkBtzH,EAAA+/F,YAAsB//F,EAAA8/F,OAAiB9/F,EAAA6/F,WAAqB7/F,EAAAqkB,OAAiBrkB,EAAA4/F,WAAqB5/F,EAAA48F,OAAiB58F,EAAA2/F,WAAqB3/F,EAAA0/F,QAAkB1/F,EAAAy/F,YAAsBz/F,EAAAw/F,SAAmBx/F,EAAAu/F,SAAmBv/F,EAAAs/F,cAAwBt/F,EAAAq/F,SAAmBr/F,EAAAm/F,SAAmBn/F,EAAAg/F,SAAmBh/F,EAAAs+F,QAAkBt+F,EAAAg+F,UAAoBh+F,EAAAm9F,SAAmBn9F,EAAAw8F,cAAwBx8F,EAAA87F,cAAwB97F,EAAA67F,gBAA0B77F,EAAA8S,gBAA0B9S,EAAAkvB,SAAmBlvB,EAAA+tF,KAAe/tF,EAAAyQ,QAAkBzQ,EAAA2S,QAAkB3S,EAAAo8D,cAAgB,EACl+Bp8D,EAAA2kG,MAAgB3kG,EAAA0kG,MAAgB1kG,EAAAykG,WAAqBzkG,EAAAwkG,WAAqBxkG,EAAAq3C,OAAiBr3C,EAAAukG,WAAqBvkG,EAAAskG,WAAqBtkG,EAAAqkG,kBAA4BrkG,EAAAokG,mBAA6BpkG,EAAA,UAAoBA,EAAAP,MAAgBO,EAAAkkG,YAAsBlkG,EAAA0iG,gBAA0B1iG,EAAAikG,QAAkBjkG,EAAA0gG,WAAqB1gG,EAAAgkG,IAAchkG,EAAA+jG,QAAkB/jG,EAAA8jG,MAAgB9jG,EAAA6jG,UAAoB7jG,EAAA4jG,SAAmB5jG,EAAA2jG,aAAuB3jG,EAAAsjG,MAAgBtjG,EAAAujG,UAAoBvjG,EAAA0tF,OAAiB1tF,EAAAqjG,cAAwBrjG,EAAAojG,kBAA4BpjG,EAAAmjG,SAAmBnjG,EAAAkjG,aAAuBljG,EAAA+wB,MAAgB/wB,EAAA8iG,UAAoB9iG,EAAA6iG,aAAuB7iG,EAAA4iG,iBAA2B5iG,EAAAqiG,MAAgBriG,EAAAoiG,UAAoBpiG,EAAAwG,OAAiBxG,EAAA0hG,oBAAsB,EAI3tB,IAAAx+F,EAAevB,EAAQ,OAKvB3B,EAAAo8D,SAAgBl5D,EAAA/B,KAQhBnB,EAAA2S,QAHA,SAAA1S,EAAA+S,EAAArC,GACA,SAAA3Q,EAAAo8D,UAAA,EAAoCn8D,MAAAA,EAAA+S,QAAAA,EAAArC,QAAAA,IACpC,EAMA3Q,EAAAyQ,QAAevN,EAAAhC,MAKf,IAAA6sF,EAAA,WACA,SAAAA,EAEA1jF,EAEAzB,EAEAtC,EAEA8nD,GACApvD,KAAAqL,KAAAA,EACArL,KAAA4J,GAAAA,EACA5J,KAAAsH,SAAAA,EACAtH,KAAAovD,OAAAA,EACApvD,KAAA0H,OAAA1H,KAAA0H,OAAA0I,KAAApQ,KACA,CAkCA,OA9BA+uF,EAAAruF,UAAA0xB,KAAA,SAAA/B,EAAAhlB,GACA,IAAAmxF,EAAAx8F,KAEA,YADA,IAAAqL,IAA+BA,EAAA,QAAAxK,OAAAb,KAAAqL,KAAA,MAAAxK,OAAAwvB,EAAAhlB,KAAA,MAC/B,IAAA0jF,EAAA1jF,EAAAglB,EAAAzmB,GAAA,SAAArJ,EAAA4mB,GACA,IAAAnkB,EAAAw5F,EAAAl1F,SAAA/G,EAAA4mB,GACA,SAAAjjB,EAAA7B,QAAAW,GACAA,EAEAqtB,EAAA/oB,SAAAtE,EAAAd,MAAAilB,EACA,EAASnnB,KAAAovD,SAAApuD,EAAAkvB,UAAAG,EAAA++B,SAAApuD,EAAAkvB,SAAAlvB,EAAAkvB,SAAA,SAAAvpB,GAAyG,OAAA61F,EAAAptC,OAAA/+B,EAAA++B,OAAAzoD,GAAA,EAClH,EAIAooF,EAAAruF,UAAAg8F,UAAA,WACA,OAAA18F,IACA,EAIA+uF,EAAAruF,UAAAi8F,UAAA,WACA,OAAA38F,IACA,EAKA+uF,EAAAruF,UAAAgH,OAAA,SAAAnH,GACA,OAAAP,KAAAsH,SAAA/G,EAAA,EAAmC4E,IAAA,GAAAqM,KAAAxR,KAAA48F,OAAAr8F,IACnC,EACAwuF,CACA,CAlDA,GA+DA,SAAAj7E,EAAA1Q,GACA,OAAAA,EAAA4U,aAAA5U,EAAAiI,MAAA,YAAAxK,OAAAuC,EAAA/C,OAAA,IACA,CAYA,SAAAy8F,EAAA31E,EAAAhiB,EAAAqe,EAAAo5E,GAGA,IAFA,IAAA53D,EAAA7d,EAAA9mB,OACA2mB,EAAAvmB,MAAAukC,EAAA,GACAzkC,EAAA,EAAoBA,EAAAykC,EAASzkC,IAC7BymB,EAAAzmB,GAAA4mB,EAAA5mB,GAGA,OADAymB,EAAAge,GAAA,CAAe7/B,IAAAA,EAAAqM,KAAAgS,EAAAo5E,OAAAA,GACf51E,CACA,CAEA,SAAA+1E,EAAAC,EAAAC,GAEA,IADA,IAAAz8F,EAAAy8F,EAAA58F,OACAE,EAAA,EAAoBA,EAAAC,EAAOD,IAC3By8F,EAAAlrF,KAAAmrF,EAAA18F,GAEA,CAzCAS,EAAA+tF,KAAYA,EAQZ/tF,EAAAkvB,SADA,SAAAptB,GAA8B,OAAAA,CAAA,EAQ9B9B,EAAA8S,gBAAuBA,EAOvB9S,EAAA67F,gBAHA,SAAA13F,EAAAqe,GACA,OAAare,IAAAA,EAAAqM,KAAAgS,EACb,EAcAxiB,EAAA87F,cAAqBA,EAOrB,IAAA55F,EAAApC,OAAAJ,UAAAwC,eACA,SAAAi6F,EAAAjxF,GACA,OAAApL,OAAAiE,KAAAmH,GACArH,IAAA,SAAA+I,GAA4B,SAAA/M,OAAA+M,EAAA,MAAA/M,OAAAqL,EAAA0B,GAAAvC,KAAA,GAC5BmD,KAAA,KACA,CACA,SAAA4uF,EAAAC,GACA,QAAA98F,EAAA,EAAoBA,EAAA88F,EAAAh9F,OAAmBE,IACvC,GAAA88F,EAAA98F,GAAA6uD,SAAApuD,EAAAkvB,SACA,SAGA,QACA,CACA,SAAAotE,EAAApxF,GACA,WAAcrL,OAAAs8F,EAAAjxF,GAAA,KACd,CACA,SAAAqxF,EAAAzG,GACA,iBAAAj2F,OAAAi2F,EAAA,IACA,CAcA,SAAA0G,EAAAC,GACA,IAAAh3F,EACA,GAAAi3F,EAAAD,GAAA,CACA,IAAAE,EAAAF,EAAAx8F,MACA,GAAAD,EAAA48F,OAAAh0F,GAAA+zF,GACA,OAAAl3F,EAAA,IAA0Bk3F,GAAA,KAAAl3F,CAE1B,KACA,IAgOA,cAhOAg3F,EAgOA56F,KA/NA,OAAA46F,EAAA14F,KAEA,GAAA84F,EAAAJ,GAAA,CACA,IAAA14F,EAAA04F,EAAApS,MAAAxmF,IAAA,SAAA2M,GAAsD,OAAAgsF,EAAAhsF,EAAA,GACtD,OAAAzM,EAAAzC,KAAAw7F,EAAAl0F,SAAAmE,EAAAjN,OAAAgI,OAAAtF,MAAA1C,OAAAf,EAAA,KAAsGgF,GAAA,GACtG,EAEA,CAEA,SAAAi5F,EAAAz6F,EAAAk6F,GAKA,IAJA,IAAA14F,EAAAjE,OAAAiE,KAAAxB,GACAyhC,EAAAjgC,EAAA1E,OACA49F,GAAA,EACAj3E,EAAA,GACAzmB,EAAA,EAAoBA,EAAAykC,EAASzkC,IAAA,CAC7B,IAAAqN,EAAA7I,EAAAxE,GACAk9F,EAAA7zF,GAAAgE,GACAoZ,EAAApZ,GAAArK,EAAAqK,GAGAqwF,GAAA,CAEA,CACA,OAAAA,EAAAj3E,EAAAzjB,CACA,CAwDA,SAAA26F,EAAAb,GACA,UAAAA,EAAAx4F,IAAA,SAAA2M,GAA8C,OAAAA,EAAAnG,IAAA,GAAmBmD,KAAA,UACjE,CAKA,SAAA2vF,EAAAt9D,EAAAu9D,GAIA,IAHA,IAAAC,GAAA,EACAC,GAAA,EACAC,GAAAv9F,EAAAw9F,cAAA50F,GAAAi3B,GACAv9B,EAAA,EAAAm7F,EAAAL,EAAgC96F,EAAAm7F,EAAAp+F,OAAkBiD,KAClD4jB,EAAAu3E,EAAAn7F,MACAu9B,IACAw9D,GAAA,GAEAr9F,EAAAw9F,cAAA50F,GAAAsd,KACAo3E,GAAA,GAGA,GAAAD,EACA,OAAAx9D,EAEA,GAAAy9D,EACA,OAAAF,EAAAA,EAAA/9F,OAAA,GAGA,IADA,IAAA2mB,EAAA,GACAvgB,EAAA,EAAAi4F,EAAAN,EAAgC33F,EAAAi4F,EAAAr+F,OAAkBoG,IAAA,CAClD,IAAAygB,EAAAw3E,EAAAj4F,GACA,QAAAmH,KAAAsZ,EACAhkB,EAAAtC,KAAAomB,EAAApZ,KAAA2wF,GAAAr3E,EAAAtZ,KAAAizB,EAAAjzB,KACAoZ,EAAApZ,GAAAsZ,EAAAtZ,GAGA,CACA,OAAAoZ,CACA,CAEA,SAAA23E,EAAAC,GACA,OAAAA,EAAA/7F,MACA,qBACA,mBACA,OAAA87F,EAAAC,EAAAptF,MACA,oBACA,iBACA,kBACA,OAAAotF,EAAA1yF,MACA,uBACA,OAAA0yF,EAAAvT,MAAApmF,OAAA,SAAAiH,EAAAsF,GAA+D,OAAA1Q,OAAAgI,OAAAoD,EAAAyyF,EAAAntF,GAAA,EAA8C,IAE7G,CACA,SAAAqtF,EAAAt7F,EAAA2I,GAIA,IAHA,IAAAnH,EAAAjE,OAAAg+F,oBAAAv7F,GACA06F,GAAA,EACAj3E,EAAA,GACAzmB,EAAA,EAAoBA,EAAAwE,EAAA1E,OAAiBE,IAAA,CACrC,IAAA4E,EAAAJ,EAAAxE,GACA2C,EAAAtC,KAAAsL,EAAA/G,GAIA6hB,EAAA7hB,GAAA5B,EAAA4B,GAHA84F,GAAA,CAKA,CACA,OAAAA,EAAAj3E,EAAAzjB,CACA,CAUA,SAAAvB,EAAAiB,GACA,OAAAA,EAAA5C,OAAA,CACA,CAKA,SAAA4+F,EAAAn8F,EAAA6D,GAEA,IADA,IAAAqgB,EAAA,GACA1jB,EAAA,EAAA47F,EAAAp8F,EAA8BQ,EAAA47F,EAAA7+F,OAAiBiD,IAAA,CAC/C,IAAAiG,EAAA21F,EAAA57F,IACA,IAAAqD,EAAAqQ,QAAAzN,IACAyd,EAAAlV,KAAAvI,EAEA,CACA,OAAAyd,CACA,CA6CA,SAAAm4E,EAAAP,GACA,kBAAAA,EAAA/7F,IACA,CACA,SAAA66F,EAAAkB,GACA,sBAAAA,EAAA/7F,IACA,CAIA,SAAAu8F,EAAAR,GACA,wBAAAA,EAAA/7F,IACA,CAkBA,SAAAg7F,EAAAe,GACA,oBAAAA,EAAA/7F,IACA,CA/OA7B,EAAAw8F,cAAqBA,EA6GrBx8F,EAAAm9F,SAAgBA,EA4ChBn9F,EAAAg+F,UAAiB,GA6FjB,IAAAK,EAAA,GAIA,SAAAC,EAAAV,GACA,QAAAS,EAAAroF,QAAA4nF,GACA,OAAA59F,EAAAg+F,UAEA,GAAAI,EAAAR,IA9BA,SAAAA,GACA,qBAAAA,EAAA/7F,IACA,CA4BA08F,CAAAX,GAAA,CACA,IAAAttF,EAAAtQ,EAAAg+F,UAEA,QAAApxF,KAAAgxF,EAAA1yF,MAAA,CACA,IAAA+nF,EAAA2K,EAAA1yF,MAAA0B,GACA8vF,EAAAzJ,KACA3iF,IAAAtQ,EAAAg+F,YACA1tF,EAAA,IAEAA,EAAA1D,GAAA,CAAAqmF,EAAAhzF,OAEA,CACA,OAAAqQ,CACA,CACA,GAzCA,SAAAstF,GACA,oBAAAA,EAAA/7F,IACA,CAuCA28F,CAAAZ,IArCA,SAAAA,GACA,yBAAAA,EAAA/7F,IACA,CAmCA48F,CAAAb,IAzBA,SAAAA,GACA,uBAAAA,EAAA/7F,IACA,CAuBA68F,CAAAd,GACA,OAAAU,EAAAV,EAAAptF,MAEA,GArCA,SAAAotF,GACA,2BAAAA,EAAA/7F,IACA,CAmCA88F,CAAAf,GACA,OAAAA,EAAAvT,MAAApmF,OAAA,SAAA8b,EAAA69E,GAA2D,OA5G3D,SAAA97F,EAAA6D,GACA,GAAA7D,IAAA9B,EAAAg+F,UACA,OAAAr4F,EAEA,GAAAA,IAAA3F,EAAAg+F,UACA,OAAAl8F,EAEA,IAAAkkB,EAAAlmB,OAAAgI,OAAA,GAA4BhG,GAC5B,QAAA8K,KAAAjH,EACA,GAAAzD,EAAAtC,KAAAkC,EAAA8K,GAAA,CACA,IAAAgyF,EAAAX,EAAAn8F,EAAA8K,GAAAjH,EAAAiH,IACA,IAAA5L,EAAA49F,GAGA,CACA54E,EAAAhmB,EAAAg+F,UACA,KACA,CALAh4E,EAAApZ,GAAAgyF,CAMA,MAEA54E,EAAApZ,GAAAjH,EAAAiH,GAGA,OAAAoZ,CACA,CAoF2D64E,CAAA9+E,EAAAu+E,EAAAV,GAAA,EAAyC59F,EAAAg+F,WAEpG,GAAAnB,EAAAe,GACA,OAAAA,EAAAvT,MAAA1qF,MAAA,GAAAsE,OAAA,SAAA8b,EAAA69E,GAAoE,OAtFpE,SAAA97F,EAAA6D,GACA,GAAA7D,IAAA9B,EAAAg+F,WAAAr4F,IAAA3F,EAAAg+F,UACA,OAAAh+F,EAAAg+F,UAEA,IAAAh4E,EAAAhmB,EAAAg+F,UACA,QAAApxF,KAAA9K,EACAI,EAAAtC,KAAA+F,EAAAiH,IAEA,IADAqxF,EAAAn8F,EAAA8K,GAAAjH,EAAAiH,IACAvN,SACA2mB,IAAAhmB,EAAAg+F,YACAh4E,EAAA,IAEAA,EAAApZ,GAAA9K,EAAA8K,GAAA/M,OAAA8F,EAAAiH,KAIA,OAAAoZ,CACA,CAqEoE84E,CAAA/+E,EAAAu+E,EAAAV,GAAA,EAA6CU,EAAAV,EAAAvT,MAAA,KAEjH,GArCA,SAAAuT,GACA,wBAAAA,EAAA/7F,IACA,CAmCAk9F,CAAAnB,GAAA,CACAS,EAAAvtF,KAAA8sF,GACA,IAAA79E,EAAAu+E,EAAAV,EAAAptF,MAEA,OADA6tF,EAAAr7E,MACAjD,CACA,CACA,OAAA/f,EAAAg+F,SACA,CAKA,SAAAgB,EAAA3C,GA2BA,IA1BA,IAAAt8E,EAAAu+E,EAAAjC,EAAA,IACAt4F,EAAAjE,OAAAiE,KAAAgc,GACAikB,EAAAq4D,EAAAh9F,OACA4/F,EAAA,SAAAryF,GAGA,IAFA,IAAA6tF,EAAA16E,EAAAnT,GAAAjN,QACA2Q,EAAA,CAAAyP,EAAAnT,IACArN,EAAA,EAAwBA,EAAAykC,EAASzkC,IAAA,CACjC,IAEAgL,EADA+zF,EADAjC,EAAA98F,IAEAqN,GAEA,QAAAG,IAAAxC,EACA,sBAGA,GAAAA,EAAAjJ,KAAA,SAAAiH,GAA+C,WAAAkyF,EAAAzkF,QAAAzN,EAAA,GAC/C,sBAGAkyF,EAAA3pF,KAAAtO,MAAAi4F,EAAAlwF,GACA+F,EAAAQ,KAAAvG,EAGA,CACA,OAAiBtK,MAAA,CAAA2M,EAAA0D,GACjB,EACAhO,EAAA,EAAA48F,EAAAn7F,EAA0CzB,EAAA48F,EAAA7/F,OAAoBiD,IAAA,CAC9D,IACAyiC,EAAAk6D,EADAC,EAAA58F,IAEA,oBAAAyiC,EACA,OAAAA,EAAA9kC,KAIA,CAEA,CAzCAD,EAAAs+F,QAAeA,EA0Cft+F,EAAAg/F,SAAgBA,EAOhB,IAAAG,EAAA,SAAAC,GAEA,SAAAD,IACA,IAAA3D,EAAA4D,EAAAx/F,KAAAZ,KAAA,gBAAAknB,GAA6D,cAAAA,CAAA,EAAoB,SAAAA,EAAAC,GAAoB,OAAAq1E,EAAA5yF,GAAAsd,IAAA,EAAAlmB,EAAAyQ,SAAAyV,IAAA,EAAAlmB,EAAA2S,SAAAuT,EAAAC,EAAA,EAA8EnmB,EAAAkvB,WAAAlwB,KAKnL,OADAw8F,EAAA35F,KAAA,WACA25F,CACA,CACA,OATAH,EAAA8D,EAAAC,GASAD,CACA,CAXA,CAWCpR,GACD/tF,EAAAm/F,SAAgBA,EAKhBn/F,EAAAq/F,SAAgB,IAAAF,EAChBn/F,EAAA,KAAYA,EAAAq/F,SAIZ,IAAAC,EAAA,SAAAF,GAEA,SAAAE,IACA,IAAA9D,EAAA4D,EAAAx/F,KAAAZ,KAAA,qBAAAknB,GAAkE,gBAAAA,CAAA,EAAsB,SAAAA,EAAAC,GAAoB,OAAAq1E,EAAA5yF,GAAAsd,IAAA,EAAAlmB,EAAAyQ,SAAAyV,IAAA,EAAAlmB,EAAA2S,SAAAuT,EAAAC,EAAA,EAA8EnmB,EAAAkvB,WAAAlwB,KAK1L,OADAw8F,EAAA35F,KAAA,gBACA25F,CACA,CACA,OATAH,EAAAiE,EAAAF,GASAE,CACA,CAXA,CAWCvR,GACD/tF,EAAAs/F,cAAqBA,EACrB,IAAAxC,EAAA,IAAAwC,EACAt/F,EAAA+M,UAAiB+vF,EAIjB,IAAAyC,EAAA,SAAAH,GAEA,SAAAG,IACA,IAAA/D,EAAA4D,EAAAx/F,KAAAZ,KAAA,OAAA89F,EAAAl0F,GAAAk0F,EAAAx2F,SAAAtG,EAAAkvB,WAAAlwB,KAKA,OADAw8F,EAAA35F,KAAA,WACA25F,CACA,CACA,OATAH,EAAAkE,EAAAH,GASAG,CACA,CAXA,CAWCxR,GACD/tF,EAAAu/F,SAAgBA,EAKhBv/F,EAAAw/F,SAAgB,IAAAD,EAChBv/F,EAAA,KAAYA,EAAAw/F,SAIZ,IAAAC,EAAA,SAAAL,GAEA,SAAAK,IACA,IAAAjE,EAAA4D,EAAAx/F,KAAAZ,KAAA,mBAAA+wB,GAAgE,UAAc/vB,EAAAyQ,QAAAzQ,EAAAkvB,WAAAlwB,KAK9E,OADAw8F,EAAA35F,KAAA,cACA25F,CACA,CACA,OATAH,EAAAoE,EAAAL,GASAK,CACA,CAXA,CAWC1R,GACD/tF,EAAAy/F,YAAmBA,EAKnBz/F,EAAA0/F,QAAe,IAAAD,EAIf,IAAAE,EAAA,SAAAP,GAEA,SAAAO,IACA,IAAAnE,EAAA4D,EAAAx/F,KAAAZ,KAAA,kBAAAknB,GAA+D,uBAAAA,CAAA,EAA+B,SAAAA,EAAAC,GAAoB,OAAAq1E,EAAA5yF,GAAAsd,IAAA,EAAAlmB,EAAAyQ,SAAAyV,IAAA,EAAAlmB,EAAA2S,SAAAuT,EAAAC,EAAA,EAA8EnmB,EAAAkvB,WAAAlwB,KAKhM,OADAw8F,EAAA35F,KAAA,aACA25F,CACA,CACA,OATAH,EAAAsE,EAAAP,GASAO,CACA,CAXA,CAWC5R,GACD/tF,EAAA2/F,WAAkBA,EAKlB3/F,EAAA48F,OAAc,IAAA+C,EAId,IAAAC,EAAA,SAAAR,GAEA,SAAAQ,IACA,IAAApE,EAAA4D,EAAAx/F,KAAAZ,KAAA,kBAAAknB,GAA+D,uBAAAA,CAAA,EAA+B,SAAAA,EAAAC,GAAoB,OAAAq1E,EAAA5yF,GAAAsd,IAAA,EAAAlmB,EAAAyQ,SAAAyV,IAAA,EAAAlmB,EAAA2S,SAAAuT,EAAAC,EAAA,EAA8EnmB,EAAAkvB,WAAAlwB,KAKhM,OADAw8F,EAAA35F,KAAA,aACA25F,CACA,CACA,OATAH,EAAAuE,EAAAR,GASAQ,CACA,CAXA,CAWC7R,GACD/tF,EAAA4/F,WAAkBA,EAKlB5/F,EAAAqkB,OAAc,IAAAu7E,EAId,IAAAC,EAAA,SAAAT,GAEA,SAAAS,IACA,IAAArE,EAAA4D,EAAAx/F,KAAAZ,KAAA,SAEA,SAAAknB,GAAuB,uBAAAA,CAAA,EAA+B,SAAAA,EAAAC,GAAoB,OAAAq1E,EAAA5yF,GAAAsd,IAAA,EAAAlmB,EAAAyQ,SAAAyV,IAAA,EAAAlmB,EAAA2S,SAAAuT,EAAAC,EAAA,EAA8EnmB,EAAAkvB,WAAAlwB,KAKxJ,OADAw8F,EAAA35F,KAAA,aACA25F,CACA,CACA,OAXAH,EAAAwE,EAAAT,GAWAS,CACA,CAbA,CAaC9R,GACD/tF,EAAA6/F,WAAkBA,EAKlB7/F,EAAA8/F,OAAc,IAAAD,EAId,IAAAE,EAAA,SAAAX,GAEA,SAAAW,IACA,IAAAvE,EAAA4D,EAAAx/F,KAAAZ,KAAA,mBAAAknB,GAAgE,wBAAAA,CAAA,EAAgC,SAAAA,EAAAC,GAAoB,OAAAq1E,EAAA5yF,GAAAsd,IAAA,EAAAlmB,EAAAyQ,SAAAyV,IAAA,EAAAlmB,EAAA2S,SAAAuT,EAAAC,EAAA,EAA8EnmB,EAAAkvB,WAAAlwB,KAKlM,OADAw8F,EAAA35F,KAAA,cACA25F,CACA,CACA,OATAH,EAAA0E,EAAAX,GASAW,CACA,CAXA,CAWChS,GACD/tF,EAAA+/F,YAAmBA,EAKnB//F,EAAAszH,QAAe,IAAAvzB,EAIf,IAAAE,EAAA,SAAAb,GAEA,SAAAa,IACA,IAAAzE,EAAA4D,EAAAx/F,KAAAZ,KAAA,eAAAS,MAAAmE,QAAA,SAAAsiB,EAAAC,GAAuF,OAAAq1E,EAAA5yF,GAAAsd,IAAA,EAAAlmB,EAAAyQ,SAAAyV,IAAA,EAAAlmB,EAAA2S,SAAAuT,EAAAC,EAAA,EAA8EnmB,EAAAkvB,WAAAlwB,KAKrK,OADAw8F,EAAA35F,KAAA,eACA25F,CACA,CACA,OATAH,EAAA4E,EAAAb,GASAa,CACA,CAXA,CAWClS,GACD/tF,EAAAigG,aAAoBA,EAKpBjgG,EAAAkgG,aAAoB,IAAAD,EACpBjgG,EAAAP,MAAaO,EAAAkgG,aAIb,IAAAC,EAAA,SAAAf,GAEA,SAAAe,IACA,IAAA3E,EAAA4D,EAAAx/F,KAAAZ,KAAA,yBAAAknB,GAAsE,cAAAA,GAAA,iBAAAA,IAAAzmB,MAAAmE,QAAAsiB,EAAA,EAAkE,SAAAA,EAAAC,GAAoB,OAAAq1E,EAAA5yF,GAAAsd,IAAA,EAAAlmB,EAAAyQ,SAAAyV,IAAA,EAAAlmB,EAAA2S,SAAAuT,EAAAC,EAAA,EAA8EnmB,EAAAkvB,WAAAlwB,KAK1O,OADAw8F,EAAA35F,KAAA,oBACA25F,CACA,CACA,OATAH,EAAA8E,EAAAf,GASAe,CACA,CAXA,CAWCpS,GACD/tF,EAAAmgG,kBAAyBA,EAKzBngG,EAAAw9F,cAAqB,IAAA2C,EAIrB,IAAAC,EAAA,SAAAhB,GAEA,SAAAgB,EAAA/1F,EAAAzB,EAAAtC,EAAA8nD,EAAAnuD,GACA,IAAAu7F,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAv7F,MAAAA,EAIAu7F,EAAA35F,KAAA,cACA25F,CACA,CACA,OAVAH,EAAA+E,EAAAhB,GAUAgB,CACA,CAZA,CAYCrS,GACD/tF,EAAAogG,YAAmBA,EAUnBpgG,EAAAqgG,QALA,SAAApgG,EAAAoK,QACA,IAAAA,IAA2BA,EAAAjF,KAAAC,UAAApF,IAC3B,IAAA2I,EAAA,SAAAsd,GAA4B,OAAAA,IAAAjmB,CAAA,EAC5B,WAAAmgG,EAAA/1F,EAAAzB,EAAA,SAAAsd,EAAAC,GAAuD,OAAAvd,EAAAsd,IAAA,EAAAlmB,EAAAyQ,SAAAxQ,IAAA,EAAAD,EAAA2S,SAAAuT,EAAAC,EAAA,EAA4EnmB,EAAAkvB,SAAAjvB,EACnI,EAKA,IAAAqgG,EAAA,SAAAlB,GAEA,SAAAkB,EAAAj2F,EAAAzB,EAAAtC,EAAA8nD,EAAArqD,GACA,IAAAy3F,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAz3F,KAAAA,EAIAy3F,EAAA35F,KAAA,YACA25F,CACA,CACA,OAVAH,EAAAiF,EAAAlB,GAUAkB,CACA,CAZA,CAYCvS,GACD/tF,EAAAsgG,UAAiBA,EAYjBtgG,EAAAugG,MAPA,SAAAx8F,EAAAsG,QACA,IAAAA,IAA2BA,EAAAvK,OAAAiE,KAAAA,GAC3BF,IAAA,SAAA+I,GAA4B,OAAAxH,KAAAC,UAAAuH,EAAA,GAC5BY,KAAA,QACA,IAAA5E,EAAA,SAAAsd,GAA4B,OAAAlmB,EAAA48F,OAAAh0F,GAAAsd,IAAAhkB,EAAAtC,KAAAmE,EAAAmiB,EAAA,EAC5B,WAAAo6E,EAAAj2F,EAAAzB,EAAA,SAAAsd,EAAAC,GAAqD,OAAAvd,EAAAsd,IAAA,EAAAlmB,EAAAyQ,SAAAyV,IAAA,EAAAlmB,EAAA2S,SAAAuT,EAAAC,EAAA,EAAwEnmB,EAAAkvB,SAAAnrB,EAC7H,EAQA,IAAAy8F,EAAA,SAAApB,GAEA,SAAAoB,EAAAn2F,EAAAzB,EAAAtC,EAAA8nD,EAAA59C,EAAA+gB,GACA,IAAAiqE,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAOA,OANAw8F,EAAAhrF,KAAAA,EACAgrF,EAAAjqE,UAAAA,EAIAiqE,EAAA35F,KAAA,iBACA25F,CACA,CACA,OAXAH,EAAAmF,EAAApB,GAWAoB,CACA,CAbA,CAaCzS,GAMD,SAAA0S,EAAA7C,EAAArsE,EAAAlnB,GACA,OAAAq2F,GAAA9C,EAAArsE,EAAAlnB,EACA,CAPArK,EAAAwgG,eAAsBA,EAQtBxgG,EAAAygG,MAAaA,EAObzgG,EAAAqoE,IAAWo4B,EAAAzgG,EAAAqkB,OAAA,SAAA0B,GAAwC,OAAAukC,OAAAC,UAAAxkC,EAAA,EAA6B,OAIhF,IAAA46E,EAAA,SAAAvB,GAEA,SAAAuB,EAAAt2F,EAAAzB,EAAAtC,EAAA8nD,EAAAwyC,GACA,IAAApF,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAoF,cAAAA,EAIApF,EAAA35F,KAAA,gBACA25F,CACA,CACA,OAVAH,EAAAsF,EAAAvB,GAUAuB,CACA,CAZA,CAYC5S,GACD/tF,EAAA2gG,cAAqBA,EACrB7gG,OAAAC,eAAA4gG,EAAAjhG,UAAA,QACAkK,IAAA,WACA,OAAA5K,KAAA4hG,eACA,EACAjjE,YAAA,EACAd,cAAA,IAkBA78B,EAAA6gG,UAZA,SAAAx2F,EAAAkV,GACA,IAAAuhF,EACAF,EAAA,WAKA,OAJAE,KACAA,EAAAvhF,EAAAwhF,IACA12F,KAAAA,GAEAy2F,CACA,EACAC,EAAA,IAAAJ,EAAAt2F,EAAA,SAAA6b,GAAsD,OAAA06E,IAAAh4F,GAAAsd,EAAA,EAA+B,SAAAA,EAAAC,GAAoB,OAAAy6E,IAAAt6F,SAAA4f,EAAAC,EAAA,EAAwC,SAAArkB,GAAiB,OAAA8+F,IAAAxyC,OAAAtsD,EAAA,EAAmC8+F,GACrM,OAAAG,CACA,EAKA,IAAAC,EAAA,SAAA5B,GAEA,SAAA4B,EAAA32F,EAAAzB,EAAAtC,EAAA8nD,EAAA59C,GACA,IAAAgrF,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAhrF,KAAAA,EAIAgrF,EAAA35F,KAAA,YACA25F,CACA,CACA,OAVAH,EAAA2F,EAAA5B,GAUA4B,CACA,CAZA,CAYCjT,GAMD,SAAAE,EAAAn2C,EAAAztC,GAEA,YADA,IAAAA,IAA2BA,EAAA,SAAAxK,OAAAi4C,EAAAztC,KAAA,MAC3B,IAAA22F,EAAA32F,EAAA,SAAA6b,GAA8C,OAAAlmB,EAAAkgG,aAAAt3F,GAAAsd,IAAAA,EAAApf,MAAAgxC,EAAAlvC,GAAA,EAAwD,SAAAsd,EAAAC,GACtG,IAAAnkB,EAAAhC,EAAAkgG,aAAA55F,SAAA4f,EAAAC,GACA,MAAAjjB,EAAA7B,QAAAW,GACA,OAAAA,EAMA,IAJA,IAAAo7F,EAAAp7F,EAAAd,MACA8iC,EAAAo5D,EAAA/9F,OACA4C,EAAAm7F,EACA5nF,EAAA,GACAjW,EAAA,EAAwBA,EAAAykC,EAASzkC,IAAA,CACjC,IAAA+hD,EAAA87C,EAAA79F,GACAsI,EAAAiwC,EAAAxxC,SAAAg7C,EAAAw6C,EAAA31E,EAAAzF,OAAAnhB,GAAAu4C,EAAAwJ,IACA,MAAAp+C,EAAA7B,QAAAwG,GACAk0F,EAAAvmF,EAAA3N,EAAA1G,UAEA,CACA,IAAA8/F,EAAAp5F,EAAA3G,MACA+/F,IAAA3/C,IACAr/C,IAAAm7F,IACAn7F,EAAAm7F,EAAAz9F,SAEAsC,EAAA1C,GAAA0hG,EAEA,CACA,CACA,OAAAzrF,EAAAnW,OAAA,KAAAW,EAAAo8D,UAAA5mD,IAAA,EAAAxV,EAAAyQ,SAAAxO,EACA,EAAK61C,EAAAsW,SAAApuD,EAAAkvB,SAAAlvB,EAAAkvB,SAAA,SAAAptB,GAAuE,OAAAA,EAAA+B,IAAAi0C,EAAAsW,OAAA,EAA4BtW,EACxG,CAlCA93C,EAAAghG,UAAiBA,EAmCjBhhG,EAAAiuF,MAAaA,EAIb,IAAAiT,EAAA,SAAA9B,GAEA,SAAA8B,EAAA72F,EAAAzB,EAAAtC,EAAA8nD,EAAAljD,GACA,IAAAswF,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAtwF,MAAAA,EAIAswF,EAAA35F,KAAA,gBACA25F,CACA,CACA,OAVAH,EAAA6F,EAAA9B,GAUA8B,CACA,CAZA,CAYCnT,GAMD,SAAAv9E,EAAAtF,EAAAb,QACA,IAAAA,IAA2BA,EAAAiyF,EAAApxF,IAC3B,IAAAnH,EAAAjE,OAAAiE,KAAAmH,GACAm/E,EAAAtmF,EAAAF,IAAA,SAAAM,GAA0C,OAAA+G,EAAA/G,EAAA,GAC1C6/B,EAAAjgC,EAAA1E,OACA,WAAA6hG,EAAA72F,EAAA,SAAA6b,GACA,GAAAlmB,EAAAw9F,cAAA50F,GAAAsd,GAAA,CACA,QAAA3mB,EAAA,EAA4BA,EAAAykC,EAASzkC,IAAA,CACrC,IAAAqN,EAAA7I,EAAAxE,GACA4hG,EAAAj7E,EAAAtZ,GACA,QAAAG,IAAAo0F,IAAAj/F,EAAAtC,KAAAsmB,EAAAtZ,KAAAy9E,EAAA9qF,GAAAqJ,GAAAu4F,GACA,QAEA,CACA,QACA,CACA,QACA,EAAK,SAAAj7E,EAAAC,GACL,IAAAnkB,EAAAhC,EAAAw9F,cAAAl3F,SAAA4f,EAAAC,GACA,MAAAjjB,EAAA7B,QAAAW,GACA,OAAAA,EAKA,IAHA,IAAAO,EAAAP,EAAAd,MACAY,EAAAS,EACAiT,EAAA,GACAjW,EAAA,EAAwBA,EAAAykC,EAASzkC,IAAA,CACjC,IAAAqN,EAAA7I,EAAAxE,GACA6hG,EAAAt/F,EAAA8K,GACAy0F,EAAAhX,EAAA9qF,GACAsI,EAAAw5F,EAAA/6F,SAAA86F,EAAAtF,EAAA31E,EAAAvZ,EAAAy0F,EAAAD,IACA,MAAAl+F,EAAA7B,QAAAwG,GACAk0F,EAAAvmF,EAAA3N,EAAA1G,UAEA,CACA,IAAAmgG,EAAAz5F,EAAA3G,OACAogG,IAAAF,QAAAr0F,IAAAu0F,IAAAp/F,EAAAtC,KAAAkC,EAAA8K,MAEA9K,IAAAS,IACAT,EAAAy5F,EAAA,GAAuCh5F,IAEvCT,EAAA8K,GAAA00F,EAEA,CACA,CACA,OAAA9rF,EAAAnW,OAAA,KAAAW,EAAAo8D,UAAA5mD,IAAA,EAAAxV,EAAAyQ,SAAA3O,EACA,EAAKs6F,EAAA/R,GACLrqF,EAAAkvB,SACA,SAAAptB,GAEA,IADA,IAAAwlB,EAAAi0E,EAAA,GAA+Bz5F,GAC/BvC,EAAA,EAA4BA,EAAAykC,EAASzkC,IAAA,CACrC,IAAAqN,EAAA7I,EAAAxE,GACA6uD,EAAAi8B,EAAA9qF,GAAA6uD,OACAA,IAAApuD,EAAAkvB,WACA5H,EAAA1a,GAAAwhD,EAAAtsD,EAAA8K,IAEA,CACA,OAAA0a,CACA,EAASpc,EACT,CA/DAlL,EAAAkhG,cAAqBA,EAgErBlhG,EAAAwQ,KAAYA,EACZxQ,EAAA,UAAiBwQ,EAIjB,IAAA+wF,EAAA,SAAAnC,GAEA,SAAAmC,EAAAl3F,EAAAzB,EAAAtC,EAAA8nD,EAAAljD,GACA,IAAAswF,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAtwF,MAAAA,EAIAswF,EAAA35F,KAAA,cACA25F,CACA,CACA,OAVAH,EAAAkG,EAAAnC,GAUAmC,CACA,CAZA,CAYCxT,GACD/tF,EAAAuhG,YAAmBA,EAkEnBvhG,EAAAwhG,QA7DA,SAAAt2F,EAAAb,QACA,IAAAA,IAA2BA,EAAAkyF,EAAAD,EAAApxF,KAC3B,IAAAnH,EAAAjE,OAAAiE,KAAAmH,GACAm/E,EAAAtmF,EAAAF,IAAA,SAAAM,GAA0C,OAAA+G,EAAA/G,EAAA,GAC1C6/B,EAAAjgC,EAAA1E,OACA,WAAAkiG,EAAAl3F,EAAA,SAAA6b,GACA,GAAAlmB,EAAAw9F,cAAA50F,GAAAsd,GAAA,CACA,QAAA3mB,EAAA,EAA4BA,EAAAykC,EAASzkC,IAAA,CACrC,IAAAqN,EAAA7I,EAAAxE,GACA4hG,EAAAj7E,EAAAtZ,GACA,QAAAG,IAAAo0F,IAAAj2F,EAAA0B,GAAAhE,GAAAu4F,GACA,QAEA,CACA,QACA,CACA,QACA,EAAK,SAAAj7E,EAAAC,GACL,IAAAnkB,EAAAhC,EAAAw9F,cAAAl3F,SAAA4f,EAAAC,GACA,MAAAjjB,EAAA7B,QAAAW,GACA,OAAAA,EAKA,IAHA,IAAAO,EAAAP,EAAAd,MACAY,EAAAS,EACAiT,EAAA,GACAjW,EAAA,EAAwBA,EAAAykC,EAASzkC,IAAA,CACjC,IAAAqN,EAAA7I,EAAAxE,GACA6hG,EAAAt/F,EAAA8K,GACA60F,EAAAv2F,EAAA0B,GACA/E,EAAA45F,EAAAn7F,SAAA86F,EAAAtF,EAAA31E,EAAAvZ,EAAA60F,EAAAL,IACA,MAAAl+F,EAAA7B,QAAAwG,QACAkF,IAAAq0F,GACArF,EAAAvmF,EAAA3N,EAAA1G,UAGA,CACA,IAAAmgG,EAAAz5F,EAAA3G,MACAogG,IAAAF,IAEAt/F,IAAAS,IACAT,EAAAy5F,EAAA,GAAuCh5F,IAEvCT,EAAA8K,GAAA00F,EAEA,CACA,CACA,OAAA9rF,EAAAnW,OAAA,KAAAW,EAAAo8D,UAAA5mD,IAAA,EAAAxV,EAAAyQ,SAAA3O,EACA,EAAKs6F,EAAA/R,GACLrqF,EAAAkvB,SACA,SAAAptB,GAEA,IADA,IAAAwlB,EAAAi0E,EAAA,GAA+Bz5F,GAC/BvC,EAAA,EAA4BA,EAAAykC,EAASzkC,IAAA,CACrC,IAAAqN,EAAA7I,EAAAxE,GACA6hG,EAAAt/F,EAAA8K,QACAG,IAAAq0F,IACA95E,EAAA1a,GAAAy9E,EAAA9qF,GAAA6uD,OAAAgzC,GAEA,CACA,OAAA95E,CACA,EAASpc,EACT,EAKA,IAAAw2F,EAAA,SAAAtC,GAEA,SAAAsC,EAAAr3F,EAAAzB,EAAAtC,EAAA8nD,EAAAquC,EAAAkF,GACA,IAAAnG,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAOA,OANAw8F,EAAAiB,OAAAA,EACAjB,EAAAmG,SAAAA,EAIAnG,EAAA35F,KAAA,iBACA25F,CACA,CACA,OAXAH,EAAAqG,EAAAtC,GAWAsC,CACA,CAbA,CAaC3T,GAMD,SAAAvnF,GAAAi2F,EAAAkF,EAAAt3F,GACA,IAAAtG,EAAAy4F,EAAAC,GACA,OAAA14F,EAn7BA,SAAAA,EAAA04F,EAAAkF,EAAAt3F,QACA,IAAAA,IAA2BA,EAAA,WAAUxK,OAAA48F,EAAApyF,KAAA,OAAAxK,OAAA8hG,EAAAt3F,KAAA,OAGrC,IAFA,IAAA25B,EAAAjgC,EAAA1E,OACA6L,EAAA,GACA3L,EAAA,EAAoBA,EAAAykC,EAASzkC,IAC7B2L,EAAAnH,EAAAxE,IAAAoiG,EAEA,IAAAC,GAAA,EAAA5hG,EAAA0tF,QAAAxiF,EAAAb,GACA,WAAAq3F,EAAAr3F,EAAA,SAAA6b,GAAmD,OAAA07E,EAAAh5F,GAAAsd,EAAA,EAA0B07E,EAAAt7F,SAAAs7F,EAAAxzC,OAAAquC,EAAAkF,EAC7E,CA26BAE,CAAA/hG,OAAAiE,KAAAA,GAAA04F,EAAAkF,EAAAt3F,GAr4BA,SAAAoyF,EAAAkF,EAAAt3F,GAEA,YADA,IAAAA,IAA2BA,EAAA,WAAUxK,OAAA48F,EAAApyF,KAAA,OAAAxK,OAAA8hG,EAAAt3F,KAAA,OACrC,IAAAq3F,EAAAr3F,EAAA,SAAA6b,GACA,OAAAlmB,EAAAw9F,cAAA50F,GAAAsd,GACApmB,OAAAiE,KAAAmiB,GAAApf,MAAA,SAAA8F,GAAuD,OAAA6vF,EAAA7zF,GAAAgE,IAAA+0F,EAAA/4F,GAAAsd,EAAAtZ,GAAA,GAEvDuxF,EAAAwD,IAAAliG,MAAAmE,QAAAsiB,EACA,EAAK,SAAAA,EAAAC,GACL,GAAAnmB,EAAAw9F,cAAA50F,GAAAsd,GAAA,CAMA,IALA,IAAApkB,EAAA,GACA0T,EAAA,GACAzR,EAAAjE,OAAAiE,KAAAmiB,GACA8d,EAAAjgC,EAAA1E,OACAyiG,GAAA,EACAviG,EAAA,EAA4BA,EAAAykC,EAASzkC,IAAA,CACrC,IAAAqN,EAAA7I,EAAAxE,GACAoH,EAAAuf,EAAAtZ,GACAm1F,EAAAtF,EAAAn2F,SAAAsG,EAAAkvF,EAAA31E,EAAAvZ,EAAA6vF,EAAA7vF,IACA,MAAA1J,EAAA7B,QAAA0gG,GACAD,GAAA,MAEA,CACA,IAAAE,EAAAD,EAAA7gG,MACA4gG,EAAAA,GAAAE,IAAAp1F,EACAA,EAAAo1F,EACA,IAAAC,EAAAN,EAAAr7F,SAAAK,EAAAm1F,EAAA31E,EAAAvZ,EAAA+0F,EAAAh7F,IACA,MAAAzD,EAAA7B,QAAA4gG,GACAlG,EAAAvmF,EAAAysF,EAAA9gG,UAEA,CACA,IAAA+gG,EAAAD,EAAA/gG,MACA4gG,EAAAA,GAAAI,IAAAv7F,EACA7E,EAAA8K,GAAAs1F,CACA,CACA,CACA,CACA,OAAA1sF,EAAAnW,OAAA,KAAAW,EAAAo8D,UAAA5mD,IAAA,EAAAxV,EAAAyQ,SAAAqxF,EAAAhgG,EAAAokB,EACA,CACA,OAAAi4E,EAAAwD,IAAAliG,MAAAmE,QAAAsiB,IACA,EAAAlmB,EAAAyQ,SAAAyV,IAEA,EAAAlmB,EAAA2S,SAAAuT,EAAAC,EACA,EAAKs2E,EAAAruC,SAAApuD,EAAAkvB,UAAAyyE,EAAAvzC,SAAApuD,EAAAkvB,SACL,SAAAptB,GAAyB,OAAAk7F,EAAAl7F,EAAA26F,EAAA,EACzB,SAAA36F,GAIA,IAHA,IAAAwlB,EAAA,GACAvjB,EAAAjE,OAAAiE,KAAAi5F,EAAAl7F,EAAA26F,IACAz4D,EAAAjgC,EAAA1E,OACAE,EAAA,EAA4BA,EAAAykC,EAASzkC,IAAA,CACrC,IAAAqN,EAAA7I,EAAAxE,GACA+nB,EAAA5G,OAAA+7E,EAAAruC,OAAAxhD,KAAA+0F,EAAAvzC,OAAAtsD,EAAA8K,GACA,CACA,OAAA0a,CACA,EAASm1E,EAAAkF,EACT,CAg1BAQ,CAAA1F,EAAAkF,EAAAt3F,EACA,CAVArK,EAAA0hG,eAAsBA,EAWtB1hG,EAAAwG,OAAcA,GAId,IAAA47F,GAAA,SAAAhD,GAEA,SAAAgD,EAAA/3F,EAAAzB,EAAAtC,EAAA8nD,EAAAi8B,GACA,IAAAmR,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAnR,MAAAA,EAIAmR,EAAA35F,KAAA,YACA25F,CACA,CACA,OAVAH,EAAA+G,EAAAhD,GAUAgD,CACA,CAZA,CAYCrU,GAMD,SAAAsU,GAAAhG,EAAAhyF,QACA,IAAAA,IAA2BA,EAAA6yF,EAAAb,IAC3B,IAAA/rF,EAAA0uF,EAAA3C,GACA,QAAAtvF,IAAAuD,GAAA+rF,EAAAh9F,OAAA,GACA,IAAAijG,EAAAhyF,EAAA,GAAAiyF,EAAAjyF,EAAA,GACAkyF,EAAAD,EAAAljG,OACAojG,EAAA,SAAAxiG,GACA,QAAAV,EAAA,EAA4BA,EAAAijG,EAAWjjG,IACvC,QAAAgjG,EAAAhjG,GAAAyW,QAAA/V,GACA,OAAAV,CAIA,EAEA,WAAAmjG,GAAAr4F,EAAA,SAAA6b,GACA,GAAAlmB,EAAAw9F,cAAA50F,GAAAsd,GAAA,CACA,IAAA3mB,EAAAkjG,EAAAv8E,EAAAo8E,IACA,YAAAv1F,IAAAxN,GAAA88F,EAAA98F,GAAAqJ,GAAAsd,EACA,CACA,QACA,EAAS,SAAAA,EAAAC,GACT,IAAAnkB,EAAAhC,EAAAw9F,cAAAl3F,SAAA4f,EAAAC,GACA,MAAAjjB,EAAA7B,QAAAW,GACA,OAAAA,EAEA,IAAAgkB,EAAAhkB,EAAAd,MACA3B,EAAAkjG,EAAAz8E,EAAAs8E,IACA,QAAAv1F,IAAAxN,EACA,SAAAS,EAAA2S,SAAAuT,EAAAC,GAEA,IAAAy3E,EAAAvB,EAAA98F,GACA,OAAAq+F,EAAAt3F,SAAA0f,EAAA81E,EAAA31E,EAAAzF,OAAAnhB,GAAAq+F,EAAA53E,GACA,EAASo2E,EAAAC,GACTr8F,EAAAkvB,SACA,SAAAptB,GACA,IAAAvC,EAAAkjG,EAAA3gG,EAAAwgG,IACA,QAAAv1F,IAAAxN,EAEA,UAAAua,MAAA,iDAAAja,OAAAwK,IAGA,OAAAgyF,EAAA98F,GAAA6uD,OAAAtsD,EAEA,EAAau6F,EAAAiG,EACb,CAEA,WAAAF,GAAA/3F,EAAA,SAAA6b,GAAkD,OAAAm2E,EAAA/6F,KAAA,SAAAkP,GAAqC,OAAAA,EAAA5H,GAAAsd,EAAA,EAAoB,EAAI,SAAAA,EAAAC,GAE/G,IADA,IAAA3Q,EAAA,GACAjW,EAAA,EAA4BA,EAAA88F,EAAAh9F,OAAmBE,IAAA,CAC/C,IAAAq+F,EAAAvB,EAAA98F,GACAsI,EAAA+1F,EAAAt3F,SAAA4f,EAAA41E,EAAA31E,EAAAzF,OAAAnhB,GAAAq+F,EAAA13E,IACA,OAAAhjB,EAAA7B,QAAAwG,GAIA,SAAA7H,EAAAyQ,SAAA5I,EAAA3G,OAHA66F,EAAAvmF,EAAA3N,EAAA1G,KAKA,CACA,SAAAnB,EAAAo8D,UAAA5mD,EACA,EAAS4mF,EAAAC,GACTr8F,EAAAkvB,SACA,SAAAptB,GACA,QAAAQ,EAAA,EAAAqgG,EAAAtG,EAAoD/5F,EAAAqgG,EAAAtjG,OAAsBiD,IAAA,CAC1E,IAAAs7F,EAAA+E,EAAArgG,GACA,GAAAs7F,EAAAh1F,GAAA9G,GACA,OAAA87F,EAAAxvC,OAAAtsD,EAEA,CAEA,UAAAgY,MAAA,gDAAAja,OAAAwK,GACA,EAAagyF,EAEb,CA9EAr8F,EAAAoiG,UAAiBA,GA+EjBpiG,EAAAqiG,MAAaA,GAIb,IAAAO,GAAA,SAAAxD,GAEA,SAAAwD,EAAAv4F,EAAAzB,EAAAtC,EAAA8nD,EAAAi8B,GACA,IAAAmR,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAnR,MAAAA,EAIAmR,EAAA35F,KAAA,mBACA25F,CACA,CACA,OAVAH,EAAAuH,EAAAxD,GAUAwD,CACA,CAZA,CAYC7U,GACD/tF,EAAA4iG,iBAAwBA,GA0BxB5iG,EAAA6iG,aAzBA,SAAAxG,EAAAhyF,QACA,IAAAA,IAA2BA,EAAA,IAAAxK,OAAAw8F,EAAAx4F,IAAA,SAAA2M,GAA+C,OAAAA,EAAAnG,IAAA,GAAmBmD,KAAA,aAC7F,IAAAw2B,EAAAq4D,EAAAh9F,OACA,WAAAujG,GAAAv4F,EAAA,SAAA6b,GAAqD,OAAAm2E,EAAAv1F,MAAA,SAAA0J,GAAsC,OAAAA,EAAA5H,GAAAsd,EAAA,EAAoB,EAAI,IAAAm2E,EAAAh9F,OACnHW,EAAAyQ,QACA,SAAAyV,EAAAC,GAGA,IAFA,IAAAi3E,EAAA,GACA5nF,EAAA,GACAjW,EAAA,EAA4BA,EAAAykC,EAASzkC,IAAA,CACrC,IAAAq+F,EAAAvB,EAAA98F,GACAsI,EAAA+1F,EAAAt3F,SAAA4f,EAAA41E,EAAA31E,EAAAzF,OAAAnhB,GAAAq+F,EAAA13E,KACA,EAAAhjB,EAAA7B,QAAAwG,GACAk0F,EAAAvmF,EAAA3N,EAAA1G,MAGAi8F,EAAAtsF,KAAAjJ,EAAA3G,MAEA,CACA,OAAAsU,EAAAnW,OAAA,KAAAW,EAAAo8D,UAAA5mD,IAAA,EAAAxV,EAAAyQ,SAAA0sF,EAAAj3E,EAAAk3E,GACA,EAAS,IAAAf,EAAAh9F,OACTW,EAAAkvB,SACA,SAAAptB,GACA,OAAAq7F,EAAAr7F,EAAAu6F,EAAAx4F,IAAA,SAAA+5F,GAA6D,OAAAA,EAAAxvC,OAAAtsD,EAAA,GAC7D,EAASu6F,EACT,EAKA,IAAAyG,GAAA,SAAA1D,GAEA,SAAA0D,EAAAz4F,EAAAzB,EAAAtC,EAAA8nD,EAAAi8B,GACA,IAAAmR,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAnR,MAAAA,EAIAmR,EAAA35F,KAAA,YACA25F,CACA,CACA,OAVAH,EAAAyH,EAAA1D,GAUA0D,CACA,CAZA,CAYC/U,GACD/tF,EAAA8iG,UAAiBA,GAiCjB9iG,EAAA+wB,MAhCA,SAAAsrE,EAAAhyF,QACA,IAAAA,IAA2BA,EAAA,IAAAxK,OAAAw8F,EAAAx4F,IAAA,SAAA2M,GAA+C,OAAAA,EAAAnG,IAAA,GAAmBmD,KAAA,YAC7F,IAAAw2B,EAAAq4D,EAAAh9F,OACA,WAAAyjG,GAAAz4F,EAAA,SAAA6b,GAA8C,OAAAlmB,EAAAkgG,aAAAt3F,GAAAsd,IAAAA,EAAA7mB,SAAA2kC,GAAAq4D,EAAAv1F,MAAA,SAAA0J,EAAAjR,GAA2F,OAAAiR,EAAA5H,GAAAsd,EAAA3mB,GAAA,EAAuB,EAAI,SAAA2mB,EAAAC,GACpK,IAAAnkB,EAAAhC,EAAAkgG,aAAA55F,SAAA4f,EAAAC,GACA,MAAAjjB,EAAA7B,QAAAW,GACA,OAAAA,EAKA,IAHA,IAAAo7F,EAAAp7F,EAAAd,MACAe,EAAAm7F,EAAA/9F,OAAA2kC,EAAAo5D,EAAAz9F,MAAA,EAAAqkC,GAAAo5D,EACA5nF,EAAA,GACAjW,EAAA,EAAwBA,EAAAykC,EAASzkC,IAAA,CACjC,IAAAuC,EAAAs7F,EAAA79F,GACAyjG,EAAA3G,EAAA98F,GACAsI,EAAAm7F,EAAA18F,SAAAxE,EAAAg6F,EAAA31E,EAAAzF,OAAAnhB,GAAAyjG,EAAAlhG,IACA,MAAAoB,EAAA7B,QAAAwG,GACAk0F,EAAAvmF,EAAA3N,EAAA1G,UAEA,CACA,IAAA8hG,EAAAp7F,EAAA3G,MACA+hG,IAAAnhG,IAEAG,IAAAm7F,IACAn7F,EAAAm7F,EAAAz9F,SAEAsC,EAAA1C,GAAA0jG,EAEA,CACA,CACA,OAAAztF,EAAAnW,OAAA,KAAAW,EAAAo8D,UAAA5mD,IAAA,EAAAxV,EAAAyQ,SAAAxO,EACA,EAAKm6F,EAAAC,GAAAr8F,EAAAkvB,SAAA,SAAAptB,GAA0D,OAAAu6F,EAAAx4F,IAAA,SAAA2M,EAAAjR,GAAuC,OAAAiR,EAAA49C,OAAAtsD,EAAAvC,GAAA,EAA2B,EAAI88F,EACrI,EAKA,IAAA6G,GAAA,SAAA9D,GAEA,SAAA8D,EAAA74F,EAAAzB,EAAAtC,EAAA8nD,EAAA59C,GACA,IAAAgrF,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAhrF,KAAAA,EAIAgrF,EAAA35F,KAAA,eACA25F,CACA,CACA,OAVAH,EAAA6H,EAAA9D,GAUA8D,CACA,CAZA,CAYCnV,GACD/tF,EAAAkjG,aAAoBA,GASpBljG,EAAAmjG,SAJA,SAAAvF,EAAAvzF,GAEA,YADA,IAAAA,IAA2BA,EAAA,YAAAxK,OAAA+9F,EAAAvzF,KAAA,MAC3B,IAAA64F,GAAA74F,EAAAuzF,EAAAh1F,GAAAg1F,EAAAt3F,SAAAs3F,EAAAxvC,OAAAwvC,EACA,EAKA,IAAAwF,GAAA,SAAAhE,GAEA,SAAAgE,EAAA/4F,EAAAzB,EAAAtC,EAAA8nD,EAAA59C,GACA,IAAAgrF,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAhrF,KAAAA,EAIAgrF,EAAA35F,KAAA,oBACA25F,CACA,CACA,OAVAH,EAAA+H,EAAAhE,GAUAgE,CACA,CAZA,CAYCrV,GACD/tF,EAAAojG,kBAAyBA,GAUzBpjG,EAAAqjG,cALA,SAAAvrD,EAAAztC,QACA,IAAAA,IAA2BA,EAAA,iBAAAxK,OAAAi4C,EAAAztC,KAAA,MAC3B,IAAAuzF,EAAA3P,EAAAn2C,GACA,WAAAsrD,GAAA/4F,EAAAuzF,EAAAh1F,GAAAg1F,EAAAt3F,SAAAs3F,EAAAxvC,OAAAtW,EACA,EASA93C,EAAA0tF,OADA,SAAAxiF,EAAAb,GAAsC,OAAAi5F,GAAA9yF,EAAAtF,GAAAb,EAAA,EAKtC,IAAAk5F,GAAA,SAAAnE,GAEA,SAAAmE,EAAAl5F,EAAAzB,EAAAtC,EAAA8nD,EAAA59C,GACA,IAAAgrF,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAhrF,KAAAA,EAIAgrF,EAAA35F,KAAA,YACA25F,CACA,CACA,OAVAH,EAAAkI,EAAAnE,GAUAmE,CACA,CAZA,CAYCxV,GAQD,SAAAuV,GAAA1F,EAAAvzF,QACA,IAAAA,IAA2BA,EAliC3B,SAAAuzF,GACA,OAAAQ,EAAAR,GACA,MAAiB/9F,OAAAs8F,EAAAyB,EAAA1yF,OAAA,OAgFjB,SAAA0yF,GACA,sBAAAA,EAAA/7F,IACA,CAhFA2hG,CAAA5F,GACArB,EAAA,MAAoC18F,OAAAs8F,EAAAyB,EAAA1yF,OAAA,QAEpC,SAAArL,OAAA+9F,EAAAvzF,KAAA,IACA,CA0hC2Bo5F,CAAA7F,IAC3B,IAAA1yF,EAAAyyF,EAAAC,GACA,WAAA2F,GAAAl5F,EAAAuzF,EAAAh1F,GAAA,SAAAsd,EAAAC,GACA,IAAAnkB,EAAAhC,EAAAw9F,cAAAl3F,SAAA4f,EAAAC,GACA,MAAAjjB,EAAA7B,QAAAW,GACA,OAAAA,EAEA,IAAA0hG,EAAA9F,EAAAt3F,SAAA4f,EAAAC,GACA,SAAAjjB,EAAA7B,QAAAqiG,GACAA,GAEA,EAAAxgG,EAAAhC,OAAA28F,EAAA6F,EAAAxiG,MAAAgK,GACA,EAAK,SAAApJ,GAAiB,OAAA87F,EAAAxvC,OAAAyvC,EAAA/7F,EAAAoJ,GAAA,EAA2C0yF,EACjE,CArBA59F,EAAAujG,UAAiBA,GAsBjBvjG,EAAAsjG,MAAaA,GAIb,IAAAK,GAAA,SAAAvE,GAEA,SAAAuE,IACA,IAAAnI,EAAA4D,EAAAx/F,KAAAZ,KAAA,WAEA,SAAAknB,GAAuB,yBAAAA,CAAA,EAAiC,SAAAA,EAAAC,GAAoB,OAAAq1E,EAAA5yF,GAAAsd,IAAA,EAAAlmB,EAAAyQ,SAAAyV,IAAA,EAAAlmB,EAAA2S,SAAAuT,EAAAC,EAAA,EAA8EnmB,EAAAkvB,WAAAlwB,KAK1J,OADAw8F,EAAA35F,KAAA,eACA25F,CACA,CACA,OAXAH,EAAAsI,EAAAvE,GAWAuE,CACA,CAbA,CAaC5V,GACD/tF,EAAA2jG,aAAoBA,GAKpB3jG,EAAA4jG,SAAgB,IAAAD,GAIhB,IAAAE,GAAA,SAAAzE,GAEA,SAAAyE,IACA,IAAArI,EAAA4D,EAAAx/F,KAAAZ,KAAA,iBAAA+wB,GAA8D,UAAe,SAAA7J,EAAAC,GAAoB,SAAAnmB,EAAA2S,SAAAuT,EAAAC,EAAA,EAEjG,WACA,UAAArM,MAAA,sBACA,IAAS9a,KAKT,OADAw8F,EAAA35F,KAAA,YACA25F,CACA,CACA,OAbAH,EAAAwI,EAAAzE,GAaAyE,CACA,CAfA,CAeC9V,GACD/tF,EAAA6jG,UAAiBA,GAKjB7jG,EAAA8jG,MAAa,IAAAD,GAIb,IAAAE,GAAA,SAAA3E,GAEA,SAAA2E,IACA,IAAAvI,EAAA4D,EAAAx/F,KAAAZ,KAAA,eAAA+wB,GAA4D,UAAc/vB,EAAAyQ,QAAAzQ,EAAAkvB,WAAAlwB,KAK1E,OADAw8F,EAAA35F,KAAA,UACA25F,CACA,CACA,OATAH,EAAA0I,EAAA3E,GASA2E,CACA,CAXA,CAWChW,GAOD,SAAA2S,GAAA9C,EAAArsE,EAAAlnB,GAEA,YADA,IAAAA,IAA2BA,EAAA,IAAAxK,OAAA+9F,EAAAvzF,KAAA,OAAAxK,OAAAiT,EAAAye,GAAA,MAC3B,IAAAivE,EAAAn2F,EAAA,SAAA6b,GAAmD,OAAA03E,EAAAh1F,GAAAsd,IAAAqL,EAAArL,EAAA,EAAqC,SAAA3mB,EAAA4mB,GACxF,IAAAnkB,EAAA47F,EAAAt3F,SAAA/G,EAAA4mB,GACA,MAAAjjB,EAAA7B,QAAAW,GACA,OAAAA,EAEA,IAAAF,EAAAE,EAAAd,MACA,OAAAqwB,EAAAzvB,IAAA,EAAA9B,EAAAyQ,SAAA3O,IAAA,EAAA9B,EAAA2S,SAAA7Q,EAAAqkB,EACA,EAAKy3E,EAAAxvC,OAAAwvC,EAAArsE,EACL,CAhBAvxB,EAAA+jG,QAAeA,GAKf/jG,EAAAgkG,IAAW,IAAAD,GAYX/jG,EAAA0gG,WAAkBA,GAKlB1gG,EAAAikG,QAAevD,GAAA1gG,EAAAqkB,OAAAimC,OAAAC,UAAA,WAQf,IAAAm4C,GAAA,SAAAtD,GAEA,SAAAsD,EAAAr4F,EAEAzB,EAEAtC,EAEA8nD,EAAAiuC,EAAAjgB,GACA,IAAAof,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,EAAAiuC,IACAr9F,KAEA,OADAw8F,EAAApf,IAAAA,EACAof,CACA,CACA,OAbAH,EAAAqH,EAAAtD,GAaAsD,CACA,CAfA,CAeCN,IACDpiG,EAAA0iG,gBAAuBA,GAuBvB1iG,EAAAkkG,YAfA,SAAA9nB,EAAAigB,EAAAhyF,QAGA,IAAAA,IAA2BA,EAAA6yF,EAAAb,IAC3B,IAAAviE,EAAAuoE,GAAAhG,EAAAhyF,GAEA,OAAAyvB,aAAA4oE,GACA5oE,GAGA3W,QAAAghF,KAAA,2CAAAtkG,OAAAwK,EAAA,qCAEA,IAAAq4F,GAAAr4F,EAAAyvB,EAAAlxB,GAAAkxB,EAAAxzB,SAAAwzB,EAAAs0B,OAAAiuC,EAAAjgB,GAEA,EAUAp8E,EAAAokG,mBAJA,SAAAnkG,EAAA+S,GAAgF,OAChF/S,MAAAA,EACA+S,QAAAA,EACC,EASDhT,EAAAqkG,kBAHA,SAAA7hF,GAAwE,OACxE,CAAMre,IAAA,GAAAqM,KAAAgS,GACN,EASAxiB,EAAAskG,WAAkBtkG,EAAAw9F,cAKlB,IAAA+G,GAAA,SAAAnF,GAEA,SAAAmF,IACA,IAAA/I,EAAA4D,EAAAx/F,KAAAZ,KAAA,kBAAAknB,GAA+D,cAAAA,GAAA,iBAAAA,CAAA,EAA6C,SAAAA,EAAAC,GAAoB,OAAAq1E,EAAA5yF,GAAAsd,IAAA,EAAAlmB,EAAAyQ,SAAAyV,IAAA,EAAAlmB,EAAA2S,SAAAuT,EAAAC,EAAA,EAA8EnmB,EAAAkvB,WAAAlwB,KAK9M,OADAw8F,EAAA35F,KAAA,aACA25F,CACA,CACA,OATAH,EAAAkJ,EAAAnF,GASAmF,CACA,CAXA,CAWCxW,GACD/tF,EAAAukG,WAAkBA,GASlBvkG,EAAAq3C,OAAc,IAAAktD,GAQdvkG,EAAAwkG,WAAkBh+F,GAKlB,IAAAi+F,GAAA,SAAArF,GAEA,SAAAqF,EAAAp6F,EAEAzB,EAEAtC,EAEA8nD,EAAAljD,GACA,IAAAswF,EAAA4D,EAAAx/F,KAAAZ,KAAAqL,EAAAzB,EAAAtC,EAAA8nD,IAAApvD,KAMA,OALAw8F,EAAAtwF,MAAAA,EAIAswF,EAAA35F,KAAA,aACA25F,CACA,CACA,OAhBAH,EAAAoJ,EAAArF,GAgBAqF,CACA,CAlBA,CAkBC1W,GACD/tF,EAAAykG,WAAkBA,GAWlBzkG,EAAA0kG,MAHA,SAAA9G,GACA,OAAAA,CACA,EAKA59F,EAAA2kG,MAHA,SAAA/G,GACA,kBAAyB,OAAAA,CAAA,CACzB,kGChnDA,MAAArqF,EAAA5R,EAAA,OAEA,IAAiBiT,GAAjB,SAAiBA,GACCA,EAAAC,YAAhB,SAA4BxV,GAE1B,IAAI8V,EAAM,GACV,IAAK,IAAI5V,EAAI,EAAGA,EAAIF,EAAQE,GAAK,EAC/B4V,GAHa,6BAGCnQ,KAAKqpB,MAAsBouE,GAAhBz3F,KAAK68J,WAEhC,OAAO1sJ,CACT,EAGgBP,EAAAohE,YAAhB,SAA4B8rF,EAAcziK,GAExC,IAAI8V,EAAM,GACV,IAAK,IAAI5V,EAAI,EAAGA,EAAIF,EAAQE,GAAK,EAC/B4V,GAHa,6BAGCnQ,KAAK00C,IAAInmC,EAAAmB,YAAYiiE,SAAS,GAAGmrF,KAAQviK,MAAQk9F,IAEjE,OAAOtnF,CACT,CACD,CAnBD,CAAiBP,IAAU5U,EAAA4U,WAAVA,EAAU,iFCS3B5U,EAAAs0D,QAAA,SAAwBppD,GACtB,MAAM0sB,EAAQ1sB,EAAM0sB,OAASC,EAAAC,SAASC,WAAWC,KAAKC,QAChD9K,EAAQjiB,EAAMiiB,OAAS,GACvBrW,EAAS5L,EAAM4L,QAAU,GAC/B,OACE,EAAAlL,EAAA2B,MAAA,OACE6I,MAAOlL,EAAMkL,MACbtK,UAAW,gBAAgBZ,EAAMY,YACjCqhB,MAAOA,EACPrW,OAAQA,EACRohB,QAAQ,YACRC,KAAK,OACLC,MAAM,6BAA4BrsB,SAAA,EAElC,EAAAH,EAAAC,KAAA,oBACY,UAAS,YACT,UACV6rB,EAAE,2QACFmK,OAAQjK,EAAK,eACA,MAAK,iBACH,QAAO,kBACN,WAElB,EAAAhsB,EAAAC,KAAA,QACE6rB,EAAE,mFACFmK,OAAQjK,EAAK,eACA,MAAK,iBACH,QAAO,kBACN,WAElB,EAAAhsB,EAAAC,KAAA,QACE6rB,EAAE,2BACFmK,OAAQjK,EAAK,eACA,MAAK,iBACH,QAAO,kBACN,WAElB,EAAAhsB,EAAAC,KAAA,QACE6rB,EAAE,2BACFmK,OAAQjK,EAAK,eACA,MAAK,iBACH,QAAO,kBACN,YAIxB,mBAxDAC,EAAAl2B,EAAA,mFCUA3B,EAAAw0D,aAAA,SAA6BtpD,GAC3B,MAAMiiB,EAAQjiB,EAAMiiB,OAAS,GACvBrW,EAAS5L,EAAM4L,QAAU,GACzB8gB,EAAQ1sB,EAAM0sB,OAASC,EAAAC,SAASC,WAAWC,KAAKC,QACtD,OACE,EAAArsB,EAAA2B,MAAA,OACE6I,MAAOlL,EAAMkL,MACbtK,UAAW,gBAAgBZ,EAAMY,YACjCqhB,MAAOA,EACPrW,OAAQA,EACRohB,QAAQ,YACRC,KAAK,OACLC,MAAM,6BAA4BrsB,SAAA,EAElC,EAAAH,EAAAC,KAAA,QAAM6rB,EAAE,mEAAmEmK,OAAQjK,KACnF,EAAAhsB,EAAAC,KAAA,QACE6rB,EAAE,4OACFmK,OAAQjK,KAEV,EAAAhsB,EAAAC,KAAA,QACE6rB,EAAE,sPACFmK,OAAQjK,KAEV,EAAAhsB,EAAAC,KAAA,QACE6rB,EAAE,kPACFmK,OAAQjK,KAEV,EAAAhsB,EAAAC,KAAA,QACE6rB,EAAE,wOACFmK,OAAQjK,MAIhB,mBA3CAC,EAAAl2B,EAAA,mFCmBA3B,EAAAwpJ,YAAA,SAA4Bt+I,WAC1B,MAAO62J,EAAaC,IAAkB,EAAA72I,EAAAlW,UAA2B,oBAAX/F,OAAyBA,OAAO+yJ,YAAc,GAC9FC,GAAiB,EAAA/2I,EAAA8T,QAAuB,OAC9C,EAAAkjI,EAAA9H,gBAAe6H,GAAiBh3J,EAAMq6E,SAAUr6E,EAAMu+I,UAEtD,EAAAt+H,EAAAC,WAAU,KACHlgB,EAAMq6E,SAGTr2E,OAAO83B,WAAW,IAAM94B,SAASiM,KAAK6hC,UAAUvG,OAAO,+BAAgC,KAFvFvmC,OAAO83B,WAAW,IAAM94B,SAASiM,KAAK6hC,UAAUrmC,IAAI,+BAAgC,KAI/E,KACLzH,SAASiM,KAAK6hC,UAAUvG,OAAO,iCAEhC,CAACvqC,EAAMq6E,YAEV,EAAAp6D,EAAAC,WAAU,WACR,MAAMg3I,EAAcF,EAAerwJ,QAC7BiF,EAAkC,QAAzBrR,EAAA28J,aAAW,EAAXA,EAAaC,oBAAY,IAAA58J,EAAAA,EAAI,EAC5Cu8J,EAAelrJ,IACd,KAEH,EAAAqU,EAAAC,WAAU,aACR42I,EAAe92J,EAAMq6E,UAAgD,QAApC//E,EAAsB,QAAtBC,EAAAy8J,EAAerwJ,eAAO,IAAApM,OAAA,EAAAA,EAAE48J,oBAAY,IAAA78J,EAAAA,EAAS,IAC7E,CAAC0F,EAAMq6E,WACV,MAAM+8E,EAAiC,oBAAXpzJ,OAAyBA,OAAOhB,SAASmB,eAAe,oBAAiBtC,EAE/Fw1J,GACJ,EAAA32J,EAAA2B,MAAA,OACEzB,UAAW,iBAAkBZ,EAAMs3J,OAAkB,GAAT,6BAC5CpsJ,MAAO,CAAEosJ,OAAQt3J,EAAMs3J,QAAQ,UACvB,yBAAwBz2J,SAAA,EAEhC,EAAAH,EAAAC,KAAA,mBACY,UACVC,UAAW,gFACTZ,EAAMq6E,SAAW,sBAAwB,sBAE3Cx5D,QAAS7gB,EAAMu3J,0BAAuB11J,EAAY7B,EAAMu+I,WAE1D,EAAA79I,EAAA2B,MAAA,OACE2D,IAAKgxJ,EACLQ,KAAK,SAAQ,aACF,OACXC,UAAW,EACX72J,UAAW,wJACTZ,EAAMq6E,SAAW,YAAc,iCAC/B,UACM,eACRnvE,MAAO,CACLwsJ,UAAW,cAAcb,OACzB9W,aAAc,gBACd7zF,UAAW,gCACZrrD,SAAA,EAECb,EAAMi/I,iBAAsC,MAAnBj/I,EAAM23J,aAC/B,EAAAj3J,EAAAC,KAAA,oBACW,qBACTkgB,QAAS7gB,EAAMu+I,QAAO,aACM,QAAhBhkJ,EAAAyF,EAAM43J,kBAAU,IAAAr9J,EAAAA,EAAI,QAChCqG,UAAU,kMAAiMC,SAE3L,QAAfvG,EAAA0F,EAAM23J,iBAAS,IAAAr9J,EAAAA,GAAI,EAAAoG,EAAAC,KAACk3J,EAAAjhI,uBAAsB,CAAC5sB,KAAM,QAGtD,EAAAtJ,EAAA2B,MAAA,OAAKzB,UAAU,8CAA8CsK,MAAO,CAAE4sJ,UAAW,QAAQj3J,SAAA,EACvF,EAAAH,EAAAC,KAAA,OAAKC,UAAU,mEAAkEC,UAC/E,EAAAH,EAAAC,KAAA,OAAKC,UAAU,kCAAkCsK,MAAO,CAAEU,OAAQ,WAEnE5L,EAAMa,kBAMf,OAAIu2J,GACK,EAAAjvJ,EAAAitB,cAAaiiI,EAASD,GAExBC,CACT,mBAlGAp3I,EAAAxpB,EAAA,OACAohK,EAAAphK,EAAA,OACA0R,EAAA1R,EAAA,OACAwgK,EAAAxgK,EAAA,saCJA,MAAA2R,EAAA3R,EAAA,OACA+lB,EAAA/lB,EAAA,OAkDA3B,EAAA+5F,cAAA,MAGE,WAAAthF,GACEzZ,KAAKikK,gBAAkB,IAAIhnI,IAC3B/sB,OAAOyqF,iBAAiB,UAAYr4E,IAClCtiB,KAAKkkK,eAAe5hJ,EAAMzS,OAE9B,CAGa,GAAA9D,CAAa5G,EAAalE,2CACrC,MAAMkjK,EAAYnkK,KAAKokK,oBACjB9pE,EAAUt6F,KAAKqkK,cAAuBF,GAS5C,OAPAz7I,EAAA6C,YAAYC,gBAAgB,CAC1Bha,KAAM,aACNrM,IAAKA,EACLlE,MAAwB,iBAAVA,EAAqBA,EAAQmF,KAAKC,UAAUpF,GAC1DkjK,UAAWA,IAGN7pE,CACT,GAGa,GAAA1vF,CAAazF,2CACxB,MAAMg/J,EAAYnkK,KAAKokK,oBACjB9pE,EAAUt6F,KAAKqkK,cAA6BF,GAQlD,OANAz7I,EAAA6C,YAAYC,gBAAgB,CAC1Bha,KAAM,aACNrM,IAAKA,EACLg/J,UAAWA,IAGN7pE,CACT,GAEa,OAAOn1F,2CAClB,MAAMg/J,EAAYnkK,KAAKokK,oBACjB9pE,EAAUt6F,KAAKqkK,cAAuBF,GAQ5C,OANAz7I,EAAA6C,YAAYC,gBAAgB,CAC1Bha,KAAM,gBACNrM,IAAKA,EACLg/J,UAAWA,IAGN7pE,CACT,GAEa,GAAA34F,CAAIwD,2CACf,MAAMg/J,EAAYnkK,KAAKokK,oBACjB9pE,EAAUt6F,KAAKqkK,cAAuBF,GAQ5C,OANAz7I,EAAA6C,YAAYC,gBAAgB,CAC1Bha,KAAM,aACNrM,IAAKA,EACLg/J,UAAWA,IAGN7pE,CACT,GAEa,UAAAiB,2CACX,MAAM4oE,EAAYnkK,KAAKokK,oBACjB9pE,EAAUt6F,KAAKqkK,cAAwBF,GAO7C,OALAz7I,EAAA6C,YAAYC,gBAAgB,CAC1Bha,KAAM,oBACN2yJ,UAAWA,IAGN7pE,CACT,GAEa,KAAAyvB,2CACX,MAAMhlH,QAAa/E,KAAKu7F,aAExB,aADMh0D,QAAQk0D,IAAI12F,EAAKF,IAAKM,GAAQnF,KAAKitB,OAAO9nB,MACzC,CACT,GAEO,kBAAO61F,GACZ,OACGtyE,EAAA6C,YAAY6iD,SAAW1lD,EAAA6C,YAAYijD,iBAAmB,IACtD9lD,EAAA6C,YAAY8iD,aAAe3lD,EAAA6C,YAAYmjD,qBAAuB,EAEnE,CAEQ,iBAAA01F,GACN,MAAO,OAAO9vJ,EAAAsB,WAAWC,YAAY,IACvC,CAEQ,cAAAquJ,CAAer0J,aACrB,IAAKA,EAAKs0J,UACR,OAGF,MAAMG,EAAiBtkK,KAAKikK,gBAAgBr5J,IAAIiF,EAAKs0J,WACrD,GAAKG,EAOL,GAHA56D,aAAa46D,EAAeC,SAC5BvkK,KAAKikK,gBAAgBh3I,OAAOpd,EAAKs0J,WAEf,qBAAdt0J,EAAK2B,KACP8yJ,EAAe98H,QAAoB,QAAZ/gC,EAAAoJ,EAAK4B,eAAO,IAAAhL,GAAAA,QAC9B,GAAkB,qBAAdoJ,EAAK2B,KAA6B,CAC3C,MAAMvQ,EAAQ4O,EAAK5O,MACnBqjK,EAAe98H,QAAQvmC,EACzB,KAAyB,wBAAd4O,EAAK2B,KACd8yJ,EAAe98H,QAAoB,QAAZhhC,EAAAqJ,EAAK4B,eAAO,IAAAjL,GAAAA,GACZ,qBAAdqJ,EAAK2B,KACd8yJ,EAAe98H,QAAmB,QAAXh0B,EAAA3D,EAAKutC,cAAM,IAAA5pC,GAAAA,GACX,4BAAd3D,EAAK2B,MACd8yJ,EAAe98H,QAAQ33B,EAAK9K,MAAQ,GAExC,CAEQ,aAAAs/J,CAAiBF,EAAmBK,EAAoB,KAC9D,OAAO,IAAIj9H,QAAQ,CAACC,EAASC,KAC3B,MAAM88H,EAAUv8H,WAAW,KACrBhoC,KAAKikK,gBAAgBtiK,IAAIwiK,KAC3BnkK,KAAKikK,gBAAgBh3I,OAAOk3I,GAC5B18H,EAAO,IAAI3sB,MAAM,kDAAkDqpJ,SAEpEK,GAEHxkK,KAAKikK,gBAAgBl4J,IAAIo4J,EAAW,CAAE38H,UAASC,SAAQ88H,aAE3D,8BCtLFzjK,OAAAC,eAAAC,EAAA,cAA+CC,OAAA,IAC/CD,EAAA6xH,qBAwBA,SAAA1vH,GACA,IAAAC,GAAA,EAAAitH,EAAAnB,mBAAA/rH,GACA,gBAAAQ,GAA0B,OAC1B9C,OAAAuC,EAAAO,GAAA9C,OACAoyB,MAAA9vB,EAAAkpH,GAAA1oH,EAAAsvB,OACK,CACL,EA7BAjyB,EAAAyjK,0BA+BA,SAAAthK,EAAAm6B,GACA,IAAAz4B,GAAA,EAAA4rH,EAAAhwE,uBAAAt9C,EAAAm6B,GAAAz4B,IACA+rH,GAAA,EAAAP,EAAAl0B,IAAAh5F,EAAAm6B,GACA,OACAz4B,IAAAA,EACAwnH,GAAA,SAAAvpH,GAA2B,OAAAK,EAAAkpH,GAAA/uF,EAAA+uF,GAAAvpH,GAAA,EAC3Bq5F,GAAA,SAAAuoE,EAAA/jH,GAAmC,SAAAj+C,EAAA0vB,MAAAsyI,EAAA9zC,EAAAjwE,GAAA,EAEnC,EAnBA,IAAA0vE,EAAc1tH,EAAQ,OACtBD,EAAiBC,EAAQ,OACzB8tH,EAAgB9tH,EAAQ,mFCKxB3B,EAAAkqJ,MAAA,SAAsBh/I,mBACpB,MAAMy4J,GAAW,EAAAx4I,EAAA8T,QAAoB,MAC/Bq7H,GAAY,EAAAnvI,EAAA8T,QAAuB,OAClC2kI,EAAWC,IAAgB,EAAA14I,EAAAlW,WAAS,GACrC6uJ,IAAa54J,EAAMi/I,iBAAsC,MAAnBj/I,EAAM23J,WAClD,EAAAV,EAAA9H,gBAAeC,EAAWsJ,IAAc14J,EAAMq6E,SAAUu+E,EAAW54J,EAAMu+I,aAAU18I,GAEnF,IAAIjB,EAAY,gEACZZ,EAAMq6E,WACRz5E,GAAa,cAGf,MAAMi4J,GAAY,EAAA54I,EAAA8T,QAAe/zB,GAuBjC,IAtBA,EAAAigB,EAAAC,WAAU,KACR24I,EAAUlyJ,QAAU3G,KAGtB,EAAAigB,EAAAC,WAAU,KACRy4I,GAAa,IACZ,KAEH,EAAA14I,EAAAC,WAAU,KACR,GAAwB,oBAAbld,SAMT,OALKhD,EAAMq6E,SAGTr3E,SAASiM,KAAK6hC,UAAUvG,OAAO,wBAF/BvnC,SAASiM,KAAK6hC,UAAUrmC,IAAI,wBAIvB,KACLzH,SAASiM,KAAK6hC,UAAUvG,OAAO,0BAIlC,CAACvqC,EAAMq6E,WAEc,MAApBo+E,EAAS9xJ,SAAmBkyJ,EAAUlyJ,QAAQ0zE,WAAar6E,EAAMq6E,SAAU,CAC7E,IAAK,MAAOr0E,EAAK8yJ,KAA+B,QAAlBv+J,EAAAyF,EAAM+4J,oBAAY,IAAAx+J,EAAAA,EAAI,GAC/B,MAAfyL,EAAIW,SACNmyJ,EAAS9yJ,EAAIW,SAGuB,OAAb,QAAvBrM,EAAA0F,EAAMg5J,yBAAiB,IAAA1+J,OAAA,EAAAA,EAAEqM,WAC3B8xJ,EAAS9xJ,QAAQmqC,UAAUvG,OAAO,aAClCvqC,EAAMg5J,kBAAkBryJ,QAAQipJ,QAEpC,CAEA,MAAwB,oBAAb5sJ,UAA6B01J,GAIjC,EAAAvwJ,EAAAitB,eACL,EAAA10B,EAAA2B,MAAA,WAAS2D,IAAKyyJ,EAAU73J,UAAWA,EAAWsK,MAAO,CAAEosJ,OAAoB,QAAZhwJ,EAAAtH,EAAMs3J,cAAM,IAAAhwJ,EAAAA,EAAI,IAAIzG,SAAA,EACjF,EAAAH,EAAAC,KAAA,mBACY,UACVkgB,QAAS+3I,IAAa54J,EAAMu3J,qBAAuBv3J,EAAMu+I,aAAU18I,EACnEjB,UAAU,6FAEZ,EAAAF,EAAA2B,MAAA,OACE2D,IAAKopJ,EACLoI,KAAK,SAAQ,aACF,OACXC,UAAW,EAAC,YACF,QAAO,UACR,SAAQz3J,EAAMb,KAAO,IAAIa,EAAMb,OAAS,IACjDyB,UAAW,kDAAkDZ,EAAMqgJ,WAAa,GAAK,sEACrFn1I,MAAKtW,OAAAgI,OAAA,CACH0jB,SAAwB,QAAd/Y,EAAAvH,EAAMsgB,gBAAQ,IAAA/Y,EAAAA,EAAI,MAC5BuwJ,UAAW,MACX71I,MAAOjiB,EAAMmgJ,YAAc,MAAQ,OACnCv0I,OAAQ5L,EAAMogJ,aAAe,MAAQ,QAClCpgJ,EAAMkL,OAAKrK,SAAA,EAGhB,EAAAH,EAAAC,KAAA,OACEC,UAAW,mBAAmBZ,EAAMqgJ,WAAa,GAAK,UACpDrgJ,EAAMsgJ,eAAiB,kBAAoB,mBACzCtgJ,EAAMi5J,iBAAgBp4J,SAEzBb,EAAMa,WAER+3J,IACC,EAAAl4J,EAAAC,KAAA,oBACW,eAAcX,EAAMb,KAAO,IAAIa,EAAMb,OAAS,IACvD0hB,QAAS7gB,EAAMu+I,QAAO,aACM,QAAhB7gI,EAAA1d,EAAM43J,kBAAU,IAAAl6I,EAAAA,EAAI,QAChC9c,UAAU,mLACVsK,MAAO,CAAEI,IAAK,OAAQtV,MAAO,QAAQ6K,SAErB,QAAf+c,EAAA5d,EAAM23J,iBAAS,IAAA/5I,EAAAA,GAAI,EAAAld,EAAAC,KAACk3J,EAAAjhI,uBAAsB,YAKnD5zB,SAASmB,eAAe,UA9CjB,IAgDX,mBA7HA8b,EAAAxpB,EAAA,OACAohK,EAAAphK,EAAA,OACA0R,EAAA1R,EAAA,OACAwgK,EAAAxgK,EAAA,qGCJA,MAAA+lB,EAAA/lB,EAAA,OAEA,IAAiBqzC,GAAjB,SAAiBA,GACCA,EAAAC,OAAhB,SAAuBmvH,EAAkBC,GACvC,IACG38I,EAAA6C,YAAYypB,UAAU,CAAExjC,KAAM,SAAU4zJ,WAAUC,eAClD38I,EAAA6C,YAAYwpB,MAAM,CAAEvjC,KAAM,SAAU4zJ,WAAUC,aAC/C,CACA,MAAMC,EAAO,IAAIC,KAAK,CAACF,GAAW,CAAE7zJ,KAAM,eACpCg0J,EAAYx4I,IAAIy4I,gBAAgBH,GAChCxiK,EAAIoM,SAAS0qB,cAAc,KACjC92B,EAAE0f,KAAOgjJ,EACT1iK,EAAE2tG,aAAa,WAAY20D,GAC3Bl2J,SAASiM,KAAKkgB,YAAYv4B,GAC1BA,EAAE4iK,QACFx2J,SAASiM,KAAK2hB,YAAYh6B,EAC5B,CACF,CACD,CAhBD,CAAiBkzC,IAAQh1C,EAAAg1C,SAARA,EAAQ,OCDzB2vH,EAAA,GAGA,SAAAhjK,EAAAijK,GAEA,IAAAC,EAAAF,EAAAC,GACA,QAAA73J,IAAA83J,EACA,OAAAA,EAAA7kK,QAGA,IAAAspG,EAAAq7D,EAAAC,GAAA,CAGA5kK,QAAA,IAOA,OAHA8kK,EAAAF,GAAAhlK,KAAA0pG,EAAAtpG,QAAAspG,EAAAA,EAAAtpG,QAAA2B,GAGA2nG,EAAAtpG,OACA,CCrBA2B,EAAA+1B,EAAA,CAAA13B,EAAAuf,KACA,QAAApb,KAAAob,EACA5d,EAAAY,EAAAgd,EAAApb,KAAAxC,EAAAY,EAAAvC,EAAAmE,IACArE,OAAAC,eAAAC,EAAAmE,EAAA,CAAyCw5B,YAAA,EAAA/zB,IAAA2V,EAAApb,MCJzCxC,EAAAY,EAAA,CAAA4iF,EAAA8N,IAAAnzF,OAAAJ,UAAAwC,eAAAtC,KAAAulF,EAAA8N,GCCAtxF,EAAAqkB,EAAAhmB,IACA,oBAAAm5B,QAAAA,OAAA4rI,aACAjlK,OAAAC,eAAAC,EAAAm5B,OAAA4rI,YAAA,CAAuD9kK,MAAA,WAEvDH,OAAAC,eAAAC,EAAA,cAAgDC,OAAA,yCCLhD+kK,EAAArjK,EAAA,OACAA,EAAA,MAGEmM,aAAaC,YAA+B,CAACgB,EAAkBF,KAC7D,EAAAjD,EAAAC,KAACm5J,EAAA/5I,YAAWnrB,OAAAgI,OAAA,GAAK+G,EAAI,CAAEI,OAAQC,OAAOC,MAAMC,KAAKF","sources":["webpack:///./node_modules/fp-ts/lib/internal.js","webpack:///./app/shared/models/progressionSnapshot.ts","webpack:///./app/shared/models/editProgramLenses.ts","webpack:///./app/client/src/components/historyRecordSets.tsx","webpack:///./app/client/src/utils/hydrate.ts","webpack:///./app/shared/models/blockLogging.ts","webpack:///./node_modules/io-ts/lib/PathReporter.js","webpack:///./app/client/src/components/input.tsx","webpack:///./app/client/src/pages/planner/plannerExerciseParser.ts","webpack:///./app/client/src/api/service.ts","webpack:///./app/client/src/utils/recordLock.ts","webpack:///./app/client/src/pages/planner/plannerExerciseStyles.ts","webpack:///./node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","webpack:///./app/client/src/utils/liveActivityManager.ts","webpack:///./app/client/src/pages/main/mainContent.tsx","webpack:///./app/client/src/components/emailLoginForm.tsx","webpack:///./app/client/src/utils/time.ts","webpack:///./node_modules/fp-ts/lib/function.js","webpack:///./app/shared/models/programExercise.ts","webpack:///./app/client/src/components/icons/iconUser.tsx","webpack:///./node_modules/preact/compat/dist/compat.module.js","webpack:///./node_modules/fp-ts/lib/Chain.js","webpack:///./app/client/src/components/icons/iconHamburger.tsx","webpack:///./app/client/src/components/icons/iconArrowRight.tsx","webpack:///./app/client/src/components/icons/iconCloseCircleOutline.tsx","webpack:///./app/client/src/components/forgotPasswordForm.tsx","webpack:///./app/client/src/pages/planner/plannerKey.tsx","webpack:///./node_modules/dequal/dist/index.js","webpack:///./app/client/src/utils/trainerLoginEmail.ts","webpack:///./app/client/src/ducks/thunks.ts","webpack:///./app/shared/models/weight.ts","webpack:///./app/client/src/utils/tailwindConfig.ts","webpack:///./app/shared/models/exerciseImage.ts","webpack:///./app/client/src/pages/planner/plannerExerciseEvaluatorText.ts","webpack:///./node_modules/fp-ts/lib/Functor.js","webpack:///./app/client/src/components/editProgram/editProgramUi/editProgramUiHelpers.ts","webpack:///./app/shared/liftoscriptEvaluator.ts","webpack:///./app/client/src/utils/trainerTextsCache.ts","webpack:///./app/client/src/utils/sync.ts","webpack:///./app/shared/utils/deepMerge.ts","webpack:///./app/client/src/ducks/stateError.ts","webpack:///./app/client/src/components/account.tsx","webpack:///./app/shared/models/programToPlanner.ts","webpack:///./app/shared/models/block.ts","webpack:///./node_modules/fp-ts/lib/FromEither.js","webpack:///./app/client/src/pages/planner/plannerExerciseEvaluator.ts","webpack:///./app/shared/utils/url.ts","webpack:///./app/client/src/components/button.tsx","webpack:///./app/client/src/utils/posthog.ts","webpack:///./app/shared/models/history.ts","webpack:///./app/shared/migrations/migrations.ts","webpack:///./app/shared/models/screen.ts","webpack:///./app/shared/models/program.ts","webpack:///./app/shared/models/muscle.ts","webpack:///./app/client/src/components/resetPasswordForm.tsx","webpack:///./app/shared/models/programSet.ts","webpack:///./node_modules/@lezer/lr/dist/index.cjs","webpack:///./app/client/src/utils/indexeddb.ts","webpack:///./node_modules/fp-ts/es6/function.js","webpack:///./node_modules/fp-ts/es6/Functor.js","webpack:///./node_modules/fp-ts/es6/internal.js","webpack:///./node_modules/fp-ts/es6/Either.js","webpack:///./node_modules/io-ts/es6/index.js","webpack:///./app/client/src/pages/planner/models/plannerProgram.ts","webpack:///./node_modules/preact/hooks/dist/hooks.module.js","webpack:///./app/shared/parser.ts","webpack:///./node_modules/micro-memoize/dist/micro-memoize.js","webpack:///./app/shared/models/pyramid.ts","webpack:///./app/shared/models/storage.ts","webpack:///./node_modules/preact/dist/preact.module.js","webpack:///./node_modules/lens-shmens/dist/utils/object.js","webpack:///./node_modules/@lezer/common/dist/index.cjs","webpack:///./app/shared/models/progress.ts","webpack:///./app/shared/utils/object.ts","webpack:///./app/client/src/components/footerPage.tsx","webpack:///./app/client/src/utils/log.ts","webpack:///./app/shared/utils/errorReporter.ts","webpack:///./app/client/src/components/icons/iconHandle.tsx","webpack:///./app/shared/models/state.ts","webpack:///./node_modules/fp-ts/lib/Either.js","webpack:///./app/shared/types.ts","webpack:///./app/shared/models/customExerciseVariation.ts","webpack:///./app/client/src/utils/setUtils.ts","webpack:///./app/shared/models/layeredText.ts","webpack:///./app/shared/models/exerciseId.ts","webpack:///./app/client/src/ducks/reducer.ts","webpack:///./app/shared/models/stats.ts","webpack:///./app/shared/models/exercise.ts","webpack:///./app/shared/models/pp.ts","webpack:///./app/shared/migrations/runner.ts","webpack:///./node_modules/lens-shmens/dist/index.js","webpack:///./node_modules/@lezer/highlight/dist/index.cjs","webpack:///./app/client/src/components/trainerEmailLoginForm.tsx","webpack:///./node_modules/fp-ts/lib/Witherable.js","webpack:///./app/shared/models/set.ts","webpack:///./app/shared/models/equipment.ts","webpack:///./app/client/src/lib/importexporter.ts","webpack:///./app/client/src/components/magicLinkForm.tsx","webpack:///./app/client/src/utils/sendMessage.ts","webpack:///./app/client/src/components/topNavMenu.tsx","webpack:///./node_modules/fp-ts/lib/Separated.js","webpack:///./app/client/src/components/emailRegisterForm.tsx","webpack:///./app/client/src/programs/basicBeginnerProgram.ts","webpack:///./app/client/src/pages/planner/plannerEvaluator.ts","webpack:///./node_modules/fp-ts/lib/ChainRec.js","webpack:///./app/shared/liftoscript.ts","webpack:///./app/client/src/components/menuItem.tsx","webpack:///./app/client/src/components/icons/iconSpinner.tsx","webpack:///./app/client/src/pages/planner/models/plannerProgramExercise.ts","webpack:///./app/shared/utils/date.ts","webpack:///./app/shared/models/editProgram.ts","webpack:///./app/shared/utils/math.ts","webpack:///./app/shared/utils/string.ts","webpack:///./node_modules/fp-ts/lib/Apply.js","webpack:///./app/shared/models/settings.ts","webpack:///./app/shared/models/workoutLock.ts","webpack:///./app/client/src/hooks/useDialogFocus.ts","webpack:///./app/shared/utils/collection.ts","webpack:///./app/shared/models/exerciseLevel.ts","webpack:///./app/client/src/utils/csv.ts","webpack:///./app/shared/models/syncUnits.ts","webpack:///./node_modules/io-ts/lib/index.js","webpack:///./app/shared/utils/generator.ts","webpack:///./app/client/src/components/icons/iconDoc.tsx","webpack:///./app/client/src/components/icons/iconDumbbell.tsx","webpack:///./app/client/src/components/bottomSheet.tsx","webpack:///./app/client/src/utils/nativeStorage.ts","webpack:///./node_modules/fp-ts/lib/Applicative.js","webpack:///./app/client/src/components/modal.tsx","webpack:///./app/client/src/utils/exporter.ts","webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./app/client/src/main.tsx"],"sourcesContent":["\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.flatMapReader = exports.flatMapTask = exports.flatMapIO = exports.flatMapEither = exports.flatMapOption = exports.flatMapNullable = exports.liftOption = exports.liftNullable = exports.fromReadonlyNonEmptyArray = exports.has = exports.emptyRecord = exports.emptyReadonlyArray = exports.tail = exports.head = exports.isNonEmpty = exports.singleton = exports.right = exports.left = exports.isRight = exports.isLeft = exports.some = exports.none = exports.isSome = exports.isNone = void 0;\nvar function_1 = require(\"./function\");\n// -------------------------------------------------------------------------------------\n// Option\n// -------------------------------------------------------------------------------------\n/** @internal */\nvar isNone = function (fa) { return fa._tag === 'None'; };\nexports.isNone = isNone;\n/** @internal */\nvar isSome = function (fa) { return fa._tag === 'Some'; };\nexports.isSome = isSome;\n/** @internal */\nexports.none = { _tag: 'None' };\n/** @internal */\nvar some = function (a) { return ({ _tag: 'Some', value: a }); };\nexports.some = some;\n// -------------------------------------------------------------------------------------\n// Either\n// -------------------------------------------------------------------------------------\n/** @internal */\nvar isLeft = function (ma) { return ma._tag === 'Left'; };\nexports.isLeft = isLeft;\n/** @internal */\nvar isRight = function (ma) { return ma._tag === 'Right'; };\nexports.isRight = isRight;\n/** @internal */\nvar left = function (e) { return ({ _tag: 'Left', left: e }); };\nexports.left = left;\n/** @internal */\nvar right = function (a) { return ({ _tag: 'Right', right: a }); };\nexports.right = right;\n// -------------------------------------------------------------------------------------\n// ReadonlyNonEmptyArray\n// -------------------------------------------------------------------------------------\n/** @internal */\nvar singleton = function (a) { return [a]; };\nexports.singleton = singleton;\n/** @internal */\nvar isNonEmpty = function (as) { return as.length > 0; };\nexports.isNonEmpty = isNonEmpty;\n/** @internal */\nvar head = function (as) { return as[0]; };\nexports.head = head;\n/** @internal */\nvar tail = function (as) { return as.slice(1); };\nexports.tail = tail;\n// -------------------------------------------------------------------------------------\n// empty\n// -------------------------------------------------------------------------------------\n/** @internal */\nexports.emptyReadonlyArray = [];\n/** @internal */\nexports.emptyRecord = {};\n// -------------------------------------------------------------------------------------\n// Record\n// -------------------------------------------------------------------------------------\n/** @internal */\nexports.has = Object.prototype.hasOwnProperty;\n// -------------------------------------------------------------------------------------\n// NonEmptyArray\n// -------------------------------------------------------------------------------------\n/** @internal */\nvar fromReadonlyNonEmptyArray = function (as) { return __spreadArray([as[0]], as.slice(1), true); };\nexports.fromReadonlyNonEmptyArray = fromReadonlyNonEmptyArray;\n/** @internal */\nvar liftNullable = function (F) {\n    return function (f, onNullable) {\n        return function () {\n            var a = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                a[_i] = arguments[_i];\n            }\n            var o = f.apply(void 0, a);\n            return F.fromEither(o == null ? (0, exports.left)(onNullable.apply(void 0, a)) : (0, exports.right)(o));\n        };\n    };\n};\nexports.liftNullable = liftNullable;\n/** @internal */\nvar liftOption = function (F) {\n    return function (f, onNone) {\n        return function () {\n            var a = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                a[_i] = arguments[_i];\n            }\n            var o = f.apply(void 0, a);\n            return F.fromEither((0, exports.isNone)(o) ? (0, exports.left)(onNone.apply(void 0, a)) : (0, exports.right)(o.value));\n        };\n    };\n};\nexports.liftOption = liftOption;\n/** @internal */\nvar flatMapNullable = function (F, M) {\n    return /*#__PURE__*/ (0, function_1.dual)(3, function (self, f, onNullable) {\n        return M.flatMap(self, (0, exports.liftNullable)(F)(f, onNullable));\n    });\n};\nexports.flatMapNullable = flatMapNullable;\n/** @internal */\nvar flatMapOption = function (F, M) {\n    return /*#__PURE__*/ (0, function_1.dual)(3, function (self, f, onNone) { return M.flatMap(self, (0, exports.liftOption)(F)(f, onNone)); });\n};\nexports.flatMapOption = flatMapOption;\n/** @internal */\nvar flatMapEither = function (F, M) {\n    return /*#__PURE__*/ (0, function_1.dual)(2, function (self, f) {\n        return M.flatMap(self, function (a) { return F.fromEither(f(a)); });\n    });\n};\nexports.flatMapEither = flatMapEither;\n/** @internal */\nvar flatMapIO = function (F, M) {\n    return /*#__PURE__*/ (0, function_1.dual)(2, function (self, f) {\n        return M.flatMap(self, function (a) { return F.fromIO(f(a)); });\n    });\n};\nexports.flatMapIO = flatMapIO;\n/** @internal */\nvar flatMapTask = function (F, M) {\n    return /*#__PURE__*/ (0, function_1.dual)(2, function (self, f) {\n        return M.flatMap(self, function (a) { return F.fromTask(f(a)); });\n    });\n};\nexports.flatMapTask = flatMapTask;\n/** @internal */\nvar flatMapReader = function (F, M) {\n    return /*#__PURE__*/ (0, function_1.dual)(2, function (self, f) {\n        return M.flatMap(self, function (a) { return F.fromReader(f(a)); });\n    });\n};\nexports.flatMapReader = flatMapReader;\n","import { isLeft } from \"fp-ts/lib/Either\";\nimport {\n  IExerciseData,\n  IHistoryEntry,\n  IHistoryRecord,\n  IPlannerProgram,\n  IProgram,\n  IProgressionSnapshot,\n  IStoredProgressionSnapshot,\n  IWeight,\n  TProgressionSnapshot,\n} from \"../types\";\nimport { SyncUnits } from \"./syncUnits\";\n\n// A program item on the server: the program and the optional snapshot of its latest finished workout.\nexport type IServerProgram = Omit<IProgram, \"progressionSnapshot\"> & {\n  progressionSnapshot?: IStoredProgressionSnapshot;\n};\n\nexport interface IProgressionValues {\n  planner: IPlannerProgram;\n  nextDay: number;\n  exerciseData: IExerciseData;\n}\n\nexport type IRollbackReason = \"no_program\" | \"no_snapshot\" | \"not_latest\" | \"changed\";\n\nexport type IRollbackDecision = { rollback: true } | { rollback: false; reason: IRollbackReason };\n\nexport type IValidateResult = { ok: true } | { ok: false; reason: \"invalid\" };\n\ntype IRm1Map = Record<string, IWeight | null>;\n\nexport namespace ProgressionSnapshot {\n  // Same as `Exercise.toKey`. The file does not import `exercise.ts`, which pulls in client code.\n  function exerciseKey(entry: IHistoryEntry): string {\n    const { id, equipment } = entry.exercise;\n    return `${id}${equipment ? `_${equipment}` : \"\"}`;\n  }\n\n  function sortKeys(value: unknown): unknown {\n    if (Array.isArray(value)) {\n      return value.map(sortKeys);\n    }\n    if (typeof value === \"object\" && value != null) {\n      const source = value as Record<string, unknown>;\n      return Object.keys(source)\n        .sort()\n        .reduce<Record<string, unknown>>((memo, key) => {\n          memo[key] = sortKeys(source[key]);\n          return memo;\n        }, {});\n    }\n    return value;\n  }\n\n  // cyrb53, a public-domain 53-bit string hash.\n  /* eslint-disable no-bitwise */\n  function cyrb53(text: string): string {\n    let h1 = 0xdeadbeef;\n    let h2 = 0x41c6ce57;\n    for (let i = 0; i < text.length; i++) {\n      const code = text.charCodeAt(i);\n      h1 = Math.imul(h1 ^ code, 2654435761);\n      h2 = Math.imul(h2 ^ code, 1597334677);\n    }\n    h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n    h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n    return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(16);\n  }\n  /* eslint-enable no-bitwise */\n\n  export function hash(planner: IPlannerProgram, nextDay: number, rm1: IRm1Map): string {\n    const input = { planner: SyncUnits.normalizePlanner(planner), nextDay, rm1 };\n    return cyrb53(JSON.stringify(sortKeys(input)));\n  }\n\n  function rm1Of(exerciseData: IExerciseData, key: string): IWeight | null {\n    return exerciseData[key]?.rm1 ?? null;\n  }\n\n  function sameWeight(a: IWeight | null, b: IWeight | null): boolean {\n    return a == null || b == null ? a === b : a.value === b.value && a.unit === b.unit;\n  }\n\n  function rm1Map(exerciseData: IExerciseData, keys: string[]): IRm1Map {\n    return keys.reduce<IRm1Map>((memo, key) => {\n      memo[key] = rm1Of(exerciseData, key);\n      return memo;\n    }, {});\n  }\n\n  export function make(\n    before: IProgressionValues,\n    after: IProgressionValues,\n    entries: IHistoryEntry[]\n  ): IProgressionSnapshot {\n    const keys = Array.from(new Set(entries.map(exerciseKey))).sort();\n    const changedKeys = keys.filter(\n      (key) => !sameWeight(rm1Of(before.exerciseData, key), rm1Of(after.exerciseData, key))\n    );\n    return {\n      planner: before.planner,\n      nextDay: before.nextDay,\n      rm1: rm1Map(before.exerciseData, changedKeys),\n      afterHash: hash(after.planner, after.nextDay, rm1Map(after.exerciseData, changedKeys)),\n    };\n  }\n\n  export function validate(snapshot: unknown, record: IHistoryRecord): IValidateResult {\n    if (isLeft(TProgressionSnapshot.decode(snapshot))) {\n      return { ok: false, reason: \"invalid\" };\n    }\n    const decoded = snapshot as IProgressionSnapshot;\n    const keys = new Set(record.entries.map(exerciseKey));\n    if (!Object.keys(decoded.rm1).every((key) => keys.has(key))) {\n      return { ok: false, reason: \"invalid\" };\n    }\n    return { ok: true };\n  }\n\n  // True when the \"before\" values of the snapshot equal the given values: the normalised planner, the `nextDay`,\n  // and the `rm1` of each key in the snapshot (a missing entry or `rm1` equals `null`).\n  export function beforeMatches(\n    snapshot: IProgressionSnapshot,\n    planner: IPlannerProgram,\n    nextDay: number,\n    exerciseData: IExerciseData\n  ): boolean {\n    if (snapshot.nextDay !== nextDay) {\n      return false;\n    }\n    const keys = Object.keys(snapshot.rm1);\n    if (!keys.every((key) => sameWeight(snapshot.rm1[key] ?? null, rm1Of(exerciseData, key)))) {\n      return false;\n    }\n    const normalize = (value: IPlannerProgram): string => JSON.stringify(sortKeys(SyncUnits.normalizePlanner(value)));\n    return normalize(snapshot.planner) === normalize(planner);\n  }\n\n  export function rollbackDecision(\n    record: IHistoryRecord,\n    program: IServerProgram | undefined,\n    exerciseData: IExerciseData\n  ): IRollbackDecision {\n    if (program == null || program.id !== record.programId || program.planner == null) {\n      return { rollback: false, reason: \"no_program\" };\n    }\n    const snapshot = program.progressionSnapshot;\n    if (snapshot == null) {\n      return { rollback: false, reason: \"no_snapshot\" };\n    }\n    if (snapshot.historyRecordId !== record.id) {\n      return { rollback: false, reason: \"not_latest\" };\n    }\n    const current = hash(program.planner, program.nextDay, rm1Map(exerciseData, Object.keys(snapshot.rm1)));\n    if (current !== snapshot.afterHash) {\n      return { rollback: false, reason: \"changed\" };\n    }\n    return { rollback: true };\n  }\n\n  // The stored snapshot after a move of the exercise keys (migration 0010). `mapRm1` moves the keys of `rm1`. The\n  // record id, the planner and `nextDay` stay. `afterHash` is recomputed over the new keys and the new exercise data\n  // only when the snapshot was still valid before the move: the old hash matched the old values and the snapshot is\n  // of the latest history record (`latestRecordId`). Otherwise the old hash stays, and a rollback is refused as\n  // \"changed\". The program planner and `nextDay` are the same before and after the move.\n  export function remap(\n    old: IStoredProgressionSnapshot,\n    oldExerciseData: IExerciseData,\n    newExerciseData: IExerciseData,\n    program: { planner?: IPlannerProgram; nextDay: number },\n    latestRecordId: number | undefined,\n    mapRm1: (rm1: IStoredProgressionSnapshot[\"rm1\"]) => IStoredProgressionSnapshot[\"rm1\"]\n  ): IStoredProgressionSnapshot {\n    const rm1 = mapRm1(old.rm1);\n    const result = { ...old, rm1 };\n    if (program.planner == null || latestRecordId !== old.historyRecordId) {\n      return result;\n    }\n    const before = hash(program.planner, program.nextDay, rm1Map(oldExerciseData, Object.keys(old.rm1)));\n    if (before !== old.afterHash) {\n      return result;\n    }\n    return { ...result, afterHash: hash(program.planner, program.nextDay, rm1Map(newExerciseData, Object.keys(rm1))) };\n  }\n}\n","import { ILensRecordingPayload, LensBuilder } from \"lens-shmens\";\nimport { IExerciseType, IPercentage, IProgramExercise, IProgramState, ISettings, IWeight } from \"../types\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { Exercise } from \"./exercise\";\nimport { Weight } from \"./weight\";\nimport { IPlannerProgramExercise } from \"@client/pages/planner/models/types\";\n\nexport namespace EditProgramLenses {\n  export function changeExercise<T>(\n    prefix: LensBuilder<T, IProgramExercise, {}>,\n    settings: ISettings,\n    oldExerciseType: IExerciseType,\n    newExerciseType: IExerciseType\n  ): ILensRecordingPayload<T>[] {\n    const oldExercise = Exercise.get(oldExerciseType, settings.exercises);\n    const exercise = Exercise.get(newExerciseType, settings.exercises);\n    return [\n      prefix.p(\"exerciseType\").p(\"id\").record(exercise.id),\n      prefix.p(\"exerciseType\").p(\"equipment\").record(exercise.equipment),\n      prefix.p(\"state\").recordModify((oldState) => {\n        if (\"weight\" in oldState) {\n          return {\n            ...oldState,\n            weight: settings.units === \"kg\" ? exercise.startingWeightKg : exercise.startingWeightLb,\n          };\n        } else {\n          return oldState;\n        }\n      }),\n      prefix.p(\"name\").recordModify((oldName) => {\n        if (oldExercise != null) {\n          return oldName.replace(oldExercise.name, exercise.name);\n        } else {\n          return exercise.name;\n        }\n      }),\n    ];\n  }\n\n  function editStateVariable<T>(\n    prefix: LensBuilder<T, IPlannerProgramExercise, {}>,\n    stateKey: string,\n    newValue?: string | number | IWeight | IPercentage\n  ): ILensRecordingPayload<T> {\n    return prefix\n      .pi(\"progress\")\n      .p(\"state\")\n      .recordModify((state) => {\n        if (newValue == null || typeof newValue === \"string\") {\n          return updateStateVariable(state, stateKey, newValue);\n        } else {\n          return { ...state, [stateKey]: newValue };\n        }\n      });\n  }\n\n  function removeStateVariableMetadata<T>(\n    prefix: LensBuilder<T, IPlannerProgramExercise, {}>,\n    stateKey: string\n  ): ILensRecordingPayload<T> {\n    return prefix\n      .pi(\"progress\")\n      .p(\"stateMetadata\")\n      .recordModify((state) => {\n        const newState = { ...state };\n        delete newState[stateKey];\n        return newState;\n      });\n  }\n\n  export function properlyUpdateStateVariable<T>(\n    prefix: LensBuilder<T, IPlannerProgramExercise, {}>,\n    values: Partial<IProgramState>\n  ): ILensRecordingPayload<T>[] {\n    return ObjectUtils.entries(values).flatMap(([stateKey, newValue]) => {\n      if (newValue == null) {\n        return [removeStateVariableMetadata(prefix, stateKey), editStateVariable(prefix, stateKey, newValue)];\n      } else {\n        return [editStateVariable(prefix, stateKey, newValue)];\n      }\n    });\n  }\n}\n\nexport function updateStateVariable(state: IProgramState, stateKey: string, newValue?: string): IProgramState {\n  if (newValue === \"\") {\n    newValue = \"0\";\n  }\n  let v = newValue != null && newValue !== \"\" ? parseFloat(newValue) : null;\n  if (v != null && isNaN(v)) {\n    v = 0;\n  }\n  const newState = { ...state };\n  const value = state[stateKey];\n  if (Weight.is(value) && v != null && v < 0) {\n    v = 0;\n  }\n  if (v != null) {\n    newState[stateKey] = Weight.is(value)\n      ? Weight.build(v || 0, value.unit)\n      : Weight.isPct(value)\n        ? Weight.buildPct(v)\n        : v;\n  } else {\n    delete newState[stateKey];\n  }\n  return newState;\n}\n","import { JSX } from \"preact\";\nimport { IDisplaySet, Reps } from \"@shared/models/set\";\nimport { ISet, ISettings } from \"@shared/types\";\nimport { CollectionUtils } from \"@shared/utils/collection\";\nimport { ObjectUtils } from \"@shared/utils/object\";\nimport { IHistoryEntryPersonalRecords } from \"@shared/models/history\";\nimport { TimeUtils } from \"../utils/time\";\n\nfunction isSameDisplaySet(a: IDisplaySet, b: IDisplaySet): boolean {\n  return (\n    a.reps === b.reps &&\n    a.weight === b.weight &&\n    a.rpe === b.rpe &&\n    a.askWeight === b.askWeight &&\n    a.timer === b.timer &&\n    a.setTimer === b.setTimer &&\n    a.isOverflowSetTimer === b.isOverflowSetTimer\n  );\n}\n\nexport function groupDisplaySets(displaySets: IDisplaySet[]): IDisplaySet[][] {\n  return CollectionUtils.groupBy(displaySets, (last, set) => {\n    return !isSameDisplaySet(last, set);\n  });\n}\n\ninterface IHistoryRecordSetsProps {\n  showPrDetails?: boolean;\n  sets: ISet[];\n  isNext: boolean;\n  settings: ISettings;\n  prs?: IHistoryEntryPersonalRecords;\n  isBlockSet?: boolean;\n}\n\nexport function HistoryRecordSetsView(props: IHistoryRecordSetsProps): JSX.Element {\n  const { sets, isNext } = props;\n  const groups = Reps.group(sets, isNext);\n  const displayGroups = groups.map((g) => {\n    return g.map((set) => Reps.setToDisplaySet(set, isNext, props.settings, props.isBlockSet));\n  });\n  return (\n    <div className=\"text-sm text-right\">\n      {displayGroups.map((g) => (\n        <HistoryRecordSet\n          sets={g}\n          prs={props.prs}\n          isNext={props.isNext}\n          showPrDetails={props.showPrDetails}\n          settings={props.settings}\n          isBlockSet={props.isBlockSet}\n        />\n      ))}\n    </div>\n  );\n}\n\ninterface IHistoryRecordSet2Props {\n  prs?: IHistoryEntryPersonalRecords;\n  settings: ISettings;\n  showPrDetails?: boolean;\n  sets: IDisplaySet[];\n  isNext: boolean;\n  isBlockSet?: boolean;\n}\n\nexport function HistoryRecordSet(props: IHistoryRecordSet2Props): JSX.Element {\n  const { isNext } = props;\n  const group = props.sets;\n  const set = group[0];\n  if (set == null) {\n    return <div />;\n  }\n  const prTypes = CollectionUtils.compact(\n    ObjectUtils.keys(props.prs || {}).map<\"e1RM\" | \"Weight\" | undefined>((k) => {\n      const prset = (props.prs || {})[k];\n      if (!prset) {\n        return undefined;\n      }\n      const displayPrSet = Reps.setToDisplaySet(prset, isNext, props.settings, props.isBlockSet);\n      return isSameDisplaySet(set, displayPrSet)\n        ? k === \"max1RMSet\"\n          ? \"e1RM\"\n          : k === \"maxWeightSet\"\n            ? \"Weight\"\n            : undefined\n        : undefined;\n    })\n  );\n  const isPr = prTypes.length > 0;\n  const repsColor = isNext\n    ? \"text-text-secondary\"\n    : set.isCompleted\n      ? \"text-text-success\"\n      : set.isInRange\n        ? \"text-text-warning\"\n        : \"text-text-error\";\n  const rpeColor = isNext ? \"text-text-secondary\" : set.isRpeFailed ? \"text-text-error\" : \"text-text-success\";\n  const timerColor = isNext ? \"text-text-secondary\" : \"text-text-purple\";\n  return (\n    <div\n      className=\"text-sm whitespace-nowrap\"\n      data-cy={\n        isNext\n          ? \"history-entry-sets-next\"\n          : set.isCompleted\n            ? \"history-entry-sets-completed\"\n            : set.isInRange\n              ? \"history-entry-sets-in-range\"\n              : \"history-entry-sets-incompleted\"\n      }\n    >\n      {props.showPrDetails && isPr && (\n        <span className=\"mr-2 text-xs font-semibold text-text-highlight\">\n          <span>{prTypes.join(\", \")}</span> <span>🏆</span>\n        </span>\n      )}\n      <span className={`px-1 ${isPr ? \"bg-color-yellow150\" : \"\"}`}>\n        {group.length > 1 && (\n          <>\n            <span className=\"font-semibold text-text-purple\" data-cy=\"history-entry-sets\">\n              {group.length}\n            </span>\n            <span className=\"text-text-secondary\"> × </span>\n          </>\n        )}\n        <span className={`font-semibold ${repsColor}`} data-cy=\"history-entry-reps\">\n          {set.reps}\n        </span>\n        {set.weight && (\n          <>\n            <span className=\"text-text-secondary\"> × </span>\n            <span data-cy=\"history-entry-weight\">\n              <span className=\"font-semibold\">{set.weight}</span>\n              <span className=\"text-xs\">{set.askWeight ? \"+\" : \"\"}</span>\n              <span className=\"text-xs text-text-secondary\">{set.unit}</span>\n            </span>\n          </>\n        )}\n        {set.rpe != null && (\n          <span className={rpeColor} data-cy=\"history-entry-rpe\">\n            <span className=\"text-xs\"> @</span>\n            <span>{set.rpe}</span>\n          </span>\n        )}\n        {isNext && set.setTimer != null && (\n          <span className={timerColor} data-cy=\"history-entry-set-timer\">\n            <span> {set.setTimer}</span>\n            <span className=\"text-xs\">s{set.isOverflowSetTimer ? \"+\" : \"\"}</span>\n            <span>|</span>\n            <span>{set.timer != null ? set.timer : \"?\"}</span>\n            <span className=\"text-xs\">{set.timer != null ? \"s rest\" : \"\"}</span>\n          </span>\n        )}\n        {!isNext && set.completedSetTimer != null && (\n          <span className={timerColor} data-cy=\"history-entry-completed-set-timer\">\n            <span> ({TimeUtils.formatMMSS(set.completedSetTimer * 1000)})</span>\n          </span>\n        )}\n        {set.setTimer == null && set.timer != null && (\n          <span className={timerColor} data-cy=\"history-entry-timer\">\n            <span> {set.timer}</span>\n            <span className=\"text-xs\">s rest</span>\n          </span>\n        )}\n      </span>\n    </div>\n  );\n}\n","import { hydrate, JSX } from \"preact\";\nimport { IPageWrapperProps } from \"../components/pageWrapper\";\n\ndeclare let __ENV__: string;\n\nexport namespace HydrateUtils {\n  export function hydratePage<T>(cb: (pageWrapperProps: IPageWrapperProps, data: T) => JSX.Element): void {\n    const escapedRawData = document.querySelector(\"#data\")?.innerHTML || \"{}\";\n    const escapedPageWrapperProps = document.querySelector(\"#pagewrapper\")?.innerHTML || \"{}\";\n    const parser = new DOMParser();\n    const unescapedRawData = parser.parseFromString(escapedRawData, \"text/html\").documentElement.textContent || \"{}\";\n    const unescapedPageWrapperProps =\n      parser.parseFromString(escapedPageWrapperProps, \"text/html\").documentElement.textContent || \"{}\";\n    const data = JSON.parse(unescapedRawData) as T;\n    const pageWrapperProps = JSON.parse(unescapedPageWrapperProps) as IPageWrapperProps;\n    hydrate(cb({ ...pageWrapperProps, client: window.fetch.bind(window) }, data), document.getElementById(\"app\")!);\n  }\n}\n","import { IBlockLogging, IBlockName, IBlockRepsLogging } from \"@client/pages/planner/models/types\";\nimport { IAllCustomExercises, IHistoryEntry } from \"../types\";\nimport { Exercise } from \"./exercise\";\nimport { Block, IBlockRef } from \"./block\";\n\nexport type IBlockLoggingArg =\n  | { type: \"bare\"; value: string }\n  | { type: \"keyvalue\"; key: string; value: string }\n  | { type: \"other\" };\n\nexport interface IBlockLoggingProblem {\n  index: number;\n  message: string;\n}\n\nexport interface IBlockLogRepsQuestion {\n  entryId: string;\n  exerciseName: string;\n  kind: \"first\" | \"last\" | \"avg\" | \"each\";\n  // Single block only. The set index of an `each`, `first` or `last` question.\n  setIndex?: number;\n  // Single block only. The current values (right, then left) of that set, and whether it is unilateral.\n  current?: number;\n  currentLeft?: number;\n  isUnilateral?: boolean;\n}\n\nexport interface IBlockLogQuestions {\n  rpe: boolean;\n  reps: IBlockLogRepsQuestion[];\n}\n\nexport namespace BlockLogging {\n  export const DEFAULT: IBlockLogging = { rpe: false, reps: \"none\" };\n  export const PROMOTE_DEFAULT: IBlockLogging = { rpe: true, reps: \"none\" };\n  // The values the circuit sheet offers for a group.\n  export const REPS_VALUES: IBlockRepsLogging[] = [\"none\", \"last\", \"firstlast\", \"avg\"];\n  // Every value the programme text accepts.\n  export const ALL_REPS_VALUES: IBlockRepsLogging[] = [...REPS_VALUES, \"each\", \"check\"];\n  // The values the sheet offers for a single exercise (a `timed` block).\n  export const SINGLE_REPS_VALUES: IBlockRepsLogging[] = [\"none\", \"last\", \"each\", \"check\"];\n\n  // \"none\" reps with RPE off asks the client for nothing, so \"none\" needs RPE on.\n  export function repsValuesFor(rpe: boolean, isSingle: boolean = false): IBlockRepsLogging[] {\n    const values = isSingle ? SINGLE_REPS_VALUES : REPS_VALUES;\n    return rpe ? [...values] : values.filter((v) => v !== \"none\");\n  }\n\n  export function withRpe(logging: IBlockLogging, rpe: boolean): IBlockLogging {\n    return { rpe, reps: !rpe && logging.reps === \"none\" ? \"last\" : logging.reps };\n  }\n\n  // Old `circuit()` (RPE off, reps none) opens in the sheet with RPE on.\n  export function normalizeForSheet(logging: IBlockLogging): IBlockLogging {\n    return !logging.rpe && logging.reps === \"none\" ? { ...logging, rpe: true } : logging;\n  }\n\n  export function evaluateArgs(\n    args: IBlockLoggingArg[],\n    name: IBlockName = \"circuit\"\n  ): { success: true; data: IBlockLogging } | { success: false; problem: IBlockLoggingProblem } {\n    let rpe = false;\n    let reps: IBlockRepsLogging | undefined;\n    let rpeSeen = false;\n    let repsSeen = false;\n    for (let index = 0; index < args.length; index++) {\n      const arg = args[index];\n      if (arg.type === \"bare\") {\n        if (arg.value !== \"rpe\") {\n          return {\n            success: false,\n            problem: {\n              index,\n              message: `Unknown argument '${arg.value}' for '${name}'. Valid arguments are 'rpe' and 'reps: none|last|firstlast|avg|each|check'`,\n            },\n          };\n        }\n        if (rpeSeen) {\n          return { success: false, problem: { index, message: `Duplicate 'rpe' argument for '${name}'` } };\n        }\n        rpeSeen = true;\n        rpe = true;\n      } else if (arg.type === \"keyvalue\") {\n        if (arg.key !== \"reps\") {\n          return {\n            success: false,\n            problem: {\n              index,\n              message: `Unknown named argument '${arg.key}' for '${name}'. Only 'reps' is a named argument`,\n            },\n          };\n        }\n        if (repsSeen) {\n          return { success: false, problem: { index, message: `Duplicate 'reps' argument for '${name}'` } };\n        }\n        if (!(ALL_REPS_VALUES as string[]).includes(arg.value)) {\n          return {\n            success: false,\n            problem: {\n              index,\n              message: `Unknown 'reps' value '${arg.value}' for '${name}'. Valid values are ${ALL_REPS_VALUES.join(\", \")}`,\n            },\n          };\n        }\n        repsSeen = true;\n        reps = arg.value as IBlockRepsLogging;\n      } else {\n        return {\n          success: false,\n          problem: {\n            index,\n            message: `Unknown argument for '${name}'. Valid arguments are 'rpe' and 'reps: none|last|firstlast|avg|each|check'`,\n          },\n        };\n      }\n    }\n    return { success: true, data: { rpe, reps: reps ?? \"none\" } };\n  }\n\n  export function serialize(logging: IBlockLogging | undefined, name: IBlockName = \"circuit\"): string {\n    const value = logging ?? DEFAULT;\n    const args: string[] = [];\n    if (value.rpe) {\n      args.push(\"rpe\");\n    }\n    if (value.reps !== \"none\") {\n      args.push(`reps: ${value.reps}`);\n    }\n    return `${name}(${args.join(\", \")})`;\n  }\n\n  export function describe(logging: IBlockLogging | undefined): string | undefined {\n    if (logging == null || (!logging.rpe && (logging.reps === \"none\" || logging.reps === \"check\"))) {\n      return undefined;\n    }\n    const parts: string[] = [];\n    if (logging.rpe) {\n      parts.push(\"RPE\");\n    }\n    switch (logging.reps) {\n      case \"last\":\n        parts.push(\"reps from the final set\");\n        break;\n      case \"firstlast\":\n        parts.push(\"reps from the first and last set\");\n        break;\n      case \"avg\":\n        parts.push(\"average reps per set\");\n        break;\n      case \"each\":\n        parts.push(\"reps for each set\");\n        break;\n      // `check` asks nothing: all sets count as done in full.\n      case \"check\":\n      case \"none\":\n        break;\n    }\n    return `At the end you'll be asked for: ${parts.join(\" and \")}`;\n  }\n\n  export function getQuestions(\n    entries: IHistoryEntry[],\n    ref: IBlockRef,\n    customExercises: IAllCustomExercises\n  ): IBlockLogQuestions {\n    if (typeof ref !== \"string\" && ref.entryIndex != null) {\n      return getSingleQuestions(entries[ref.entryIndex], customExercises);\n    }\n    const members = Block.getBlockMembers(entries, ref)\n      .map((m) => m.entry)\n      .filter((entry) => entry.block != null);\n    const logging = members[0]?.block?.logging ?? DEFAULT;\n    const reps: IBlockLogRepsQuestion[] = [];\n    for (const entry of members) {\n      const entryId = entry.id ?? \"\";\n      const exerciseName = Exercise.get(entry.exercise, customExercises).name;\n      if (logging.reps === \"avg\") {\n        reps.push({ entryId, exerciseName, kind: \"avg\" });\n      } else if (logging.reps === \"last\") {\n        reps.push({ entryId, exerciseName, kind: \"last\" });\n      } else if (logging.reps === \"firstlast\") {\n        if (entry.sets.length <= 1) {\n          reps.push({ entryId, exerciseName, kind: \"first\" });\n        } else {\n          reps.push({ entryId, exerciseName, kind: \"first\" });\n          reps.push({ entryId, exerciseName, kind: \"last\" });\n        }\n      }\n    }\n    return { rpe: logging.rpe, reps };\n  }\n\n  function getSingleQuestions(\n    entry: IHistoryEntry | undefined,\n    customExercises: IAllCustomExercises\n  ): IBlockLogQuestions {\n    if (entry?.block == null) {\n      return { rpe: false, reps: [] };\n    }\n    const logging = entry.block.logging ?? DEFAULT;\n    const rpe = logging.rpe || entry.sets.some((set) => set.logRpe);\n    const exerciseName = Exercise.get(entry.exercise, customExercises).name;\n    const entryId = entry.id ?? \"\";\n    const doneIndexes = entry.sets.flatMap((set, index) => (set.isCompleted ? [index] : []));\n    const ask = (kind: IBlockLogRepsQuestion[\"kind\"], setIndex: number | undefined): IBlockLogRepsQuestion => {\n      const set = setIndex != null ? entry.sets[setIndex] : undefined;\n      return {\n        entryId,\n        exerciseName,\n        kind,\n        ...(setIndex != null ? { setIndex } : {}),\n        current: set?.completedReps,\n        currentLeft: set?.completedRepsLeft,\n        isUnilateral: set?.isUnilateral === true,\n      };\n    };\n    const reps: IBlockLogRepsQuestion[] = [];\n    if (doneIndexes.length > 0) {\n      const first = doneIndexes[0];\n      const last = doneIndexes[doneIndexes.length - 1];\n      if (logging.reps === \"last\") {\n        reps.push(ask(\"last\", last));\n      } else if (logging.reps === \"firstlast\") {\n        if (first === last) {\n          reps.push(ask(\"last\", last));\n        } else {\n          reps.push(ask(\"first\", first), ask(\"last\", last));\n        }\n      } else if (logging.reps === \"avg\") {\n        reps.push(ask(\"avg\", last));\n      } else if (logging.reps === \"each\") {\n        for (const index of doneIndexes) {\n          reps.push(ask(\"each\", index));\n        }\n      }\n      // `reps: check` asks no reps question: all reps on all sets count as done.\n    }\n    return { rpe, reps };\n  }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PathReporter = exports.success = exports.failure = void 0;\n/**\n * @since 1.0.0\n */\nvar Either_1 = require(\"fp-ts/lib/Either\");\nvar _1 = require(\".\");\nfunction stringify(v) {\n    if (typeof v === 'function') {\n        return (0, _1.getFunctionName)(v);\n    }\n    if (typeof v === 'number' && !isFinite(v)) {\n        if (isNaN(v)) {\n            return 'NaN';\n        }\n        return v > 0 ? 'Infinity' : '-Infinity';\n    }\n    return JSON.stringify(v);\n}\nfunction getContextPath(context) {\n    return context.map(function (_a) {\n        var key = _a.key, type = _a.type;\n        return \"\".concat(key, \": \").concat(type.name);\n    }).join('/');\n}\nfunction getMessage(e) {\n    return e.message !== undefined\n        ? e.message\n        : \"Invalid value \".concat(stringify(e.value), \" supplied to \").concat(getContextPath(e.context));\n}\n/**\n * @since 1.0.0\n */\nfunction failure(es) {\n    return es.map(getMessage);\n}\nexports.failure = failure;\n/**\n * @since 1.0.0\n */\nfunction success() {\n    return ['No errors!'];\n}\nexports.success = success;\n/**\n * @since 1.0.0\n */\nexports.PathReporter = {\n    report: (0, Either_1.fold)(failure, success)\n};\n","import { JSX, Ref } from \"preact\";\nimport { forwardRef, useState, useCallback } from \"preact/compat\";\nimport { UidFactory } from \"@shared/utils/generator\";\nimport { StringUtils } from \"@shared/utils/string\";\nimport { IEither } from \"@shared/utils/types\";\n\n/**\n * TODO: Rename this component to make function clearer (e.g., InputFlexible or InputWithInlineLabel)\n *\n * Desktop-focused input component with flexible label positioning.\n *\n * Key features:\n * - Supports flexible label positioning (inside or outside the input field via isLabelOutside)\n * - Supports multiline text areas\n * - Has sizing options (inputSize: md/sm, labelSize: xs/sm)\n * - Auto-generates identifier if not provided\n * - More complex styling with labels that can float inside the input field\n *\n * Compare with Input2:\n * - Input2 is simpler with label always outside\n * - Input2 does not support multiline\n * - Use Input when you need flexible label positioning or multiline support\n * - Use Input2 for simpler, straightforward labeled inputs\n */\n\nexport const inputClassName =\n  \"inline-block w-full px-4 text-base py-2 leading-normal bg-background-default border border-border-prominent rounded-lg appearance-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-button-primarybackground text-base\";\n\nexport type IValidationError = \"required\" | \"pattern-mismatch\";\n\nexport interface IProps extends Omit<JSX.HTMLAttributes<HTMLInputElement | HTMLTextAreaElement>, \"ref\"> {\n  label?: string;\n  identifier?: string;\n  multiline?: number;\n  changeType?: \"onblur\" | \"oninput\";\n  isLabelOutside?: boolean;\n  defaultValue?: number | string;\n  value?: number | string;\n  type?: string;\n  pattern?: string;\n  required?: boolean;\n  disabled?: boolean;\n  inputSize?: \"md\" | \"sm\";\n  labelSize?: \"xs\" | \"sm\";\n  errorMessage?: string;\n  patternMessage?: string;\n  requiredMessage?: string;\n  changeHandler?: (e: IEither<string, Set<IValidationError>>) => void;\n  placeholder?: string;\n  min?: number;\n  max?: number;\n  step?: number | string;\n  maxLength?: number;\n}\n\nexport function selectInputOnFocus(e: Event): boolean | undefined {\n  const target = e.target;\n  if (target instanceof HTMLInputElement) {\n    const handleNumber = target.type === \"number\";\n    if (handleNumber) {\n      // Force browsers to treat number inputs as text temporarily so full selection/highlighting works.\n      target.type = \"text\";\n    }\n    const value = target.value;\n    try {\n      // Highlight the entire current value for quick replacement by the user.\n      target.setSelectionRange(0, value.length);\n    } catch (err) {\n      // Some input types (e.g., email/password) may refuse selection; ignore to avoid breaking focus.\n    } finally {\n      if (handleNumber) {\n        target.type = \"number\";\n      }\n    }\n    return false;\n  }\n  return undefined;\n}\n\nconst InputInner = forwardRef<HTMLInputElement | HTMLTextAreaElement, IProps>(\n  (props, ref: Ref<HTMLInputElement | HTMLTextAreaElement>): JSX.Element => {\n    const { inputSize, label, changeHandler, errorMessage, patternMessage, requiredMessage, ...otherProps } = props;\n    const changeType = props.changeType || \"onblur\";\n    const identifier = props.identifier || StringUtils.dashcase((label || UidFactory.generateUid(8))?.toLowerCase());\n    const [validationErrors, setValidationErrors] = useState<Set<IValidationError>>(new Set());\n    const size = inputSize || \"md\";\n    // Unique per instance: `identifier` comes from the label text, so two fields can share it.\n    const [uid] = useState(() => UidFactory.generateUid(8));\n    const labelId = `input-label-${uid}`;\n    const errorId = `input-error-${uid}`;\n\n    const onInputHandler = useCallback(\n      (e: Event) => {\n        const target = e.target;\n        if (target instanceof HTMLInputElement) {\n          const errors = new Set<IValidationError>();\n          if (target.validity.patternMismatch) {\n            errors.add(\"pattern-mismatch\");\n          }\n          if (target.validity.valueMissing) {\n            errors.add(\"required\");\n          }\n          const value = target.value;\n          setValidationErrors(errors);\n          if (props.changeHandler != null) {\n            if (errors.size > 0 && value.length > 0) {\n              props.changeHandler({ success: false, error: errors });\n            } else {\n              props.changeHandler({ success: true, data: value });\n            }\n          }\n        }\n      },\n      [changeHandler]\n    );\n\n    let className =\n      \"relative block w-full text-left border rounded-lg appearance-none focus-within:outline focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-button-primarybackground \";\n    if (props.errorMessage || validationErrors.size > 0) {\n      className += \" border-text-error\";\n    } else {\n      className += \" border-form-inputstroke\";\n    }\n\n    const errorMessages = [];\n    if (props.errorMessage) {\n      errorMessages.push(props.errorMessage);\n    }\n    for (const error of validationErrors) {\n      if (error === \"required\") {\n        errorMessages.push(props.requiredMessage);\n      } else if (error === \"pattern-mismatch\") {\n        errorMessages.push(props.patternMessage);\n      }\n    }\n\n    let containerClassName = \"inline-block bg-background-default rounded-lg\";\n    if (className.indexOf(\"w-full\") !== -1) {\n      containerClassName += \" w-full\";\n    }\n    const labelSize = props.labelSize || \"sm\";\n    const a11yProps = {\n      \"aria-labelledby\": props.label && props.isLabelOutside ? labelId : undefined,\n      \"aria-describedby\": errorMessages.length > 0 ? errorId : undefined,\n      \"aria-invalid\": errorMessages.length > 0 ? true : undefined,\n    };\n    return (\n      <div className={containerClassName}>\n        {props.label && props.isLabelOutside && (\n          <div\n            id={labelId}\n            className={`leading-none ${labelSize === \"xs\" ? \"text-xs\" : \"text-sm\"} text-text-secondary pb-1`}\n          >\n            {props.label}\n          </div>\n        )}\n        <label\n          data-cy={`${identifier}-label`}\n          className={className}\n          style={{\n            minHeight:\n              size === \"md\" ? (props.isLabelOutside ? \"40px\" : \"48px\") : props.isLabelOutside ? \"32px\" : \"40px\",\n          }}\n        >\n          <div\n            className={`relative ${props.isLabelOutside ? \"mx-2\" : \"mx-4\"} ${size === \"md\" ? \"my-1\" : \"\"}`}\n            style={size !== \"md\" ? { marginTop: \"1px\", marginBottom: \"1px\" } : {}}\n          >\n            {props.label && !props.isLabelOutside && (\n              <div\n                className={`leading-none relative ${labelSize === \"xs\" ? \"text-xs\" : \"text-sm\"} text-text-secondary`}\n                style={{ top: \"2px\", left: \"0\" }}\n              >\n                {props.label}\n              </div>\n            )}\n            <div className=\"relative flex\" style={{ top: props.label ? \"3px\" : \"8px\", left: \"0\" }}>\n              {props.multiline ? (\n                <textarea\n                  data-cy={`${identifier}-input`}\n                  ref={ref as Ref<HTMLTextAreaElement>}\n                  onBlur={changeType === \"onblur\" ? onInputHandler : undefined}\n                  onInput={changeType === \"oninput\" ? onInputHandler : undefined}\n                  onFocus={selectInputOnFocus}\n                  className=\"flex-1 w-0 min-w-0 text-base border-none focus:outline-none bg-background-default\"\n                  {...a11yProps}\n                  style={{ fontSize: size === \"md\" ? \"16px\" : \"15px\", height: `${props.multiline * 25}px` }}\n                  {...otherProps}\n                />\n              ) : (\n                <input\n                  data-cy={`${identifier}-input`}\n                  ref={ref as Ref<HTMLInputElement>}\n                  onBlur={changeType === \"onblur\" ? onInputHandler : undefined}\n                  onInput={changeType === \"oninput\" ? onInputHandler : undefined}\n                  onFocus={selectInputOnFocus}\n                  className=\"flex-1 w-0 min-w-0 text-base border-none focus:outline-none bg-background-default\"\n                  {...a11yProps}\n                  style={{ height: \"1.25rem\", fontSize: size === \"md\" ? \"16px\" : \"15px\" }}\n                  {...otherProps}\n                />\n              )}\n            </div>\n          </div>\n        </label>\n        {errorMessages.length > 0 && (\n          <div id={errorId}>\n            {errorMessages.map((message) => (\n              <div className=\"text-xs text-left text-text-error\" key={message}>\n                {message}\n              </div>\n            ))}\n          </div>\n        )}\n      </div>\n    );\n  }\n);\n\nexport const Input = InputInner as ((\n  props: IProps & { ref?: Ref<HTMLInputElement | HTMLTextAreaElement> }\n) => JSX.Element) & { displayName?: string };\nInput.displayName = \"Input\";\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport { LRParser } from \"@lezer/lr\";\nconst spec_Keyword: any = { __proto__: null, none: 160, auto: 174 };\nexport const parser = LRParser.deserialize({\n  version: 14,\n  states:\n    \"3tQVQPOOOkQQO'#C`OOQO'#Df'#DfOyQSO'#CdO![QSO'#CcOOQO'#Dc'#DcOOQO'#Dq'#DqOOQO'#Dd'#DdQVQPOOOOQO'#De'#DeO!gQQO,58zOOQO,58z,58zOOQO-E7d-E7dO!uQWO'#CfO#cQWO'#DhO#yQSO,58}OOQO,58},58}O#yQSO,58}OOQO-E7b-E7bOOQO-E7c-E7cOOQO1G.f1G.fOOQO'#Cg'#CgO$RQWO,59QO$UQWO,59QO$^Q`O'#CgOOQO'#Cm'#CmO$iQWO'#CxO$tQPO'#DOO$yQWO'#ClOOQO'#DT'#DTOOQO'#DW'#DWO%OQ`O'#DXO%WQWO'#DYO&OQWO'#DZO$tQPO'#D[OOQO'#Dl'#DlO&vQWO'#DUO'WQWO'#DSO!zQWO'#DSO'fQSO'#D]O'tQWO'#DaO'yQSO'#CkOOQO,5:S,5:SOOQO-E7f-E7fOOQO1G.i1G.iO(UQSO1G.iO!uQWO,59TO!uQWO'#DgO(^QWO1G.lOOQO1G.l1G.lOOQO,59f,59fOOQO'#Ct'#CtO(fQWO,59dOOQO,59d,59dOOQO,59j,59jO)aQWO,59WO!uQWO,59sO)rQ`O,59sOOQO,59t,59tOOQO,59u,59uO)wQPO,59vOOQO-E7j-E7jO!zQWO'#DmO*PQWO,59nO*PQWO,59nO*_Q`O'#D^OOQO,59w,59wO$tQPO,59{O*gQPO,59VOOQO7+$T7+$TOOQO1G.o1G.oO*lQWO,5:ROOQO,5:R,5:ROOQO-E7e-E7eOOQO7+$W7+$WOOQO1G/O1G/OO*wQ`O'#DROOQO'#Cp'#CpOOQO'#C{'#C{O+fQSO'#CoOOQO'#DR'#DROOQO'#Dj'#DjO+zQWO'#DQO,cQWO'#DPOOQO1G.r1G.rO-iQWO1G/_O,qQWO1G/_O!uQWO1G/_OOQO1G/b1G/bOOQO,5:X,5:XOOQO-E7k-E7kO-pQWO1G/YOOQO'#D_'#D_O.OQWO,59xOOQO1G/g1G/gOOQO1G.q1G.qO!uQWO,59mO.WQWO'#C}OOQO,59Z,59ZO.wQWO,59ZOOQO-E7h-E7hO/RQWO'#DkO/^QWO,59kOOQO7+$y7+$yO0dQWO7+$yO/lQWO7+$yOOQO1G/d1G/dO*_Q`O1G/dO0kQWO1G/XOOQO1G/X1G/XO1VQPO,59iO1[QWO'#CgO1gQWO'#CiOOQO'#Cr'#CrO1lQWO'#CrO1tQWO'#CqOOQO'#Cq'#CqO.]QWO'#DiO2SQWO1G.uO2[QSO1G.uO2SQWO1G.uOOQO,5:V,5:VOOQO-E7i-E7iOOQO<<He<<HeO2mQPO7+%OO2rQPO'#CdOOQO1G/T1G/TOOQO,59^,59^O3]QWO,59eO3jQWO,59eOOQO,5:T,5:TOOQO-E7g-E7gO3oQSO7+$aOOQO7+$a7+$aO4QQWO7+$aOOQO<<Hj<<HjO4YQ`O'#CtOOQO1G/P1G/PO4eQWO1G/POOQO<<G{<<G{O4rQSO<<G{OOQO7+$k7+$kOOQOAN=gAN=gO$tQPO'#DO\",\n  stateData:\n    \"5g~O!dOS~OQUORUOUUOXQO!fPO!{TO~OTXO!gXO!hXO!iZO~OXQO^WX!iWX!jWX!zWX~O^^O!i`O!j]O~OTXO!gXO!hXO!idO~O[eO~O[hOjpOkqOysO!orO!pjO!ynO~ObiO!UxO!ukO!xmO^![X!i![X~P!zO^^O!i|O~O!k!OO!l!PO!m!RO~O!q!SOgZX!wZX~O[!TOg!VOi!TO~OXQO~O!n!XO~Og!ZO!w!YO~Og![O[|X^|Xj|Xk|Xy|X!i|X!l|X!o|X!p|X!y|X!z|X~Og!]O[}X^}Xj}Xk}Xy}X!i}X!l}X!o}X!p}X!y}X!z}X~O^xX!ixX!lxX!zxX~P!zO!l!`O^vX!ivX!zvX~O!j!cO^!PX!i!PX!z!PX~O!n!eO~O!z!fO^_X!i_X~O^^O!i!gO~O!l!PO!m!lO~Og!mO[la^lajlaklayla!ila!lla!ola!pla!yla!zla!sla~O[eOb!oOj!sOk!sO!r!pO~O!w!yO~OXQO!s!zO~O!l!`O^va!iva!zva~O[#OO!S#OO~O!{#RO~O!k!OO!l!Za!m!Za~O!k!OO!w#SO[uX^uXjuXkuX!iuX!luX!zuX~Op#UO!o#VO!t#TO^cX!icX!zcX~O[eOj!sOk!sO^tX!itX!ltX!ztX~O!l#XO^sX!isX!zsX~Og#ZO[{i^{ij{ik{iy{i!i{i!l{i!o{i!p{i!y{i!z{i~O!k!OO~P,qO!l!`O^vi!ivi!zvi~O!m#^O!n#_O~O!u$TO~O[#cOb#gOg#fOi!TOj#hOk#hO!k#fO!pjO~O!l#iO!s#kO~P.]O[eOj!sOk!sO~O!l#XO^sa!isa!zsa~Og#oO[{q^{qj{qk{qy{q!i{q!l{q!o{q!p{q!y{q!z{q~O!k!OO~P/lO!k!OO[ui^uijuikui!iui!lui!zui~O!v#rO~O!kZX!lhX!shX~O!k!OO~O[!TOi!TO~Og#uO!n#tO!leX!seX~O!l#iO!s#xO~Op#yO!t#TO^ci!ici!zci~O!m#{O~OXQO!vWX~O[#|Og#fOi!TO!k#fO!r!pO~Ob#}Oj#}Ok#}O~P2zO!n$OO~Op$PO!t#TO^cq!icq!zcq~O!l#iO!s$QO~O!q!SO!lhX!shX~Ob$ROj$ROk$RO~P2zOp$SO!t#TO^cy!icy!zcy~Oj!Ubk!z!j!mXT!hU!fRyiQ[~\",\n  goto: \"({!fPPPP!gPP!g!kP!v!yP#lP$U$X$[P$_$b$e$kP$uPPP%R$Q%]%iP%r&O$_&U&[$X&a&dP&m&m&m&m&m$X&s&vP$XP!g&|'S'Y'k'r'|(W(_(e(mPPP(wTUOWSSOWS!Wk$TR#Q!eRaSQf]Wo^tv!`Q!h!OQ!i!PU!n!X!t#XQ!w!YQ#[!yQ#`#ST#d#V#iQg]Q!j!PU!r!X!t#XQ!x!YQ#]!yQ#a#ST#h#V#iRz^Ry^Rl^R!v!XR!q!XQ#l#VR#v#iS#h#V#iQ#}#tR$R$OQ!UjW#e#V#i#t$OR#s#fWs^tv!`T#h#V#iWs^tv!`Q#}#tR$R$OQ!v!XQ#}#tR$R$OQ#U!qQ#y#kQ$P#xR$S$QQw^R#b#TQ!u!XR#m#XV!s!X!t#XRv^Qu^Q!bvR!{!`Xs^tv!`R!dwQ#P!cR#p#_QWORbWQYPRcYWROWk!eU[R!^#qQ!^rR#q$TS!QfgR!k!QQ_SS{_}R}aQ#j#VS#w#j#zR#z#lS!t!X#XR#W!tQ#Y!uR#n#YUt^v!`R!_tQ!auS!|!a!}R!}!bTVOW\",\n  nodeNames:\n    \"⚠ Program LineComment TripleLineComment Week WeekProperty Day ExerciseExpression ExerciseName NonSeparator Repeat Rep Int RepRange SectionSeparator ExerciseSection ExerciseProperty ExercisePropertyName Keyword FunctionExpression FunctionName FunctionArgument Number Plus PosNumber Float Weight Percentage Rpe KeyValue Timer None Liftoscript ReuseLiftoscript ReuseSection WarmupExerciseSets WarmupExerciseSet WarmupSetPart ExerciseSets CurrentVariation ExerciseSet SetTimer Auto SetPart WeightWithPlus PercentageWithPlus SetLabel ReuseSectionWithWeekDay WeekDay WeekOrDay Current Superset SupersetKeyword EmptyExpression\",\n  maxTerm: 89,\n  skippedNodes: [0],\n  repeatNodeCount: 10,\n  tokenData:\n    \"!Dl~R{OX#xXY&SYZ&_Z]#x]^&f^p#xpq&Sqr&prs#xst(Utx#xxy+lyz,Yz{#x{|,v|}9b}!O:v!O!P<b!P!QBm!Q![IP![!]!&P!]!b#x!b!c!'e!c!}!(y!}#O!*n#O#P!+[#P#Q!,p#Q#R#x#R#S!-^#S#T#x#T#g!(y#g#h!/T#h#l!(y#l#m!>X#m#o!(y#o#p!@O#p#q#x#q#r!Cy#r;'S#x;'S;=`%|<%l~#x~O#x~~!DgV$Pc!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xQ%aV!gQOX%[Z]%[^p%[q!P%[!Q;'S%[;'S;=`%v<%lO%[Q%yP;=`<%l%[V&PP;=`<%l#x~&XQ!d~XY&Spq&So&fO!{P!ino&mP!{P!inYZ&__&yc!xW!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xR(]X!gQ!fPOX%[Z]%[^p%[qs%[st(xt!P%[!Q;'S%[;'S;=`%v<%lO%[R(}^!gQOX(xXY)yYZ*iZ](x]^*n^p(xpq)yq!P(x!P!Q)y!Q;'S(x;'S;=`+f<%l~(x~O(x~~*iP)|XOY)yYZ*iZ])y]^*n^;'S)y;'S;=`+`<%l~)y~O)y~~*iP*nOUPP*sXUPOY)yYZ*iZ])y]^*n^;'S)y;'S;=`+`<%l~)y~O)y~~*iP+cP;=`<%l)yR+iP;=`<%l(x^+sV!o[!gQOX%[Z]%[^p%[q!P%[!Q;'S%[;'S;=`%v<%lO%[k,aV!si!gQOX%[Z]%[^p%[q!P%[!Q;'S%[;'S;=`%v<%lO%[o-Pegh!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!O#x!O!P.b!Q![7i![!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xo.id!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![/w![!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xo0Oi!gQXTOX#xZ]#x^p#xqs#xst%[tu#xuv1mvx#xxz%[z!P#x!Q![/w![!}#x!}#O%[#O#P#x#P#Q%[#Q#_#x#_#`3R#`#a6P#a#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xo1vc!gQkhXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xo3Ye!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#Z#x#Z#[4k#[#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xo4tc!gQjhXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xo6We!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#U#x#U#V4k#V#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xo7pj!gQXTOX#xZ]#x^p#xqs#xst%[tu#xuv1mvx#xxz%[z!O#x!O!P.b!Q![7i![!}#x!}#O%[#O#P#x#P#Q%[#Q#_#x#_#`3R#`#a6P#a#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xo9kc!lh!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xo;Pe!kh!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!O#x!O!P.b!Q![7i![!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xo<ie!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!O#x!O!P=z!Q![@u![!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_>Rd!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!O#x!O!P?a!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_?jc!uW!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xoAOi!gQXTiWOX#xZ]#x^p#xqs#xst%[tu#xuv1mvx#xxz%[z!P#x!Q![@u![!}#x!}#O%[#O#P#x#P#Q%[#Q#_#x#_#`3R#`#a6P#a#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xoBtS^l!hQXYCQpqCQ!P!QD}#`#aC^QCTRXYCQpqCQ#`#aC^QCaP#c#dCdQCgP#c#dCjQCmP#d#eCpQCsRXYCppqCp![!]C|QDPRXYC|pqC|#g#hDYQD]P#h#iD`QDcP#T#UDfQDiP#f#gDlQDoP#h#iDrQDwQTQXYDrpqDrPEQZOYEsYZFcZ]Es]^Fh^!PEs!P!QG`!Q;'SEs;'S;=`GY<%l~Es~OEs~~FcPEvXOYEsYZFcZ]Es]^Fh^;'SEs;'S;=`GY<%l~Es~OEs~~FcPFhOQPPFmXQPOYEsYZFcZ]Es]^Fh^;'SEs;'S;=`GY<%l~Es~OEs~~FcPG]P;=`<%lEsPGcXOYG`YZHOZ]G`]^HV^;'SG`;'S;=`Hy<%l~G`~OG`~~HOPHVORPQPPH^XRPQPOYG`YZHOZ]G`]^HV^;'SG`;'S;=`Hy<%l~G`~OG`~~HOPH|P;=`<%lG`oIYl!gQXT[hOX#xZ]#x^p#xqs#xst%[tu#xuv1mvx#xxz%[z!O#x!O!PKQ!Q![IP![!}#x!}#O%[#O#P#x#P#Q%[#Q#_#x#_#`3R#`#a6P#a#g#x#g#hLg#h#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xoKXd!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![@u![!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_Lne!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z{#x{|NP|!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q! c#q#r%[#r;'S#x;'S;=`%|<%lO#x_NWc!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q! c#q#r%[#r;'S#x;'S;=`%|<%lO#x_! jf!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!#O![!a#x!a!b!$k!b!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_!#Vf!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!#O![!}#x!}#O%[#O#P#x#P#Q%[#Q#g#x#g#h!$k#h#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_!$tc!gQXTyWOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_!&Yc!nW!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_!'nc!pW!gQXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_!)Sh!gQbWXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!(y![!c#x!c!}!(y!}#O%[#O#P#x#P#Q%[#Q#R#x#R#S!(y#S#T#x#T#o!(y#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xU!*uV!gQ!jSOX%[Z]%[^p%[q!P%[!Q;'S%[;'S;=`%v<%lO%[o!+ec!gQ!zlXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q!}#x!}#O%[#O#P#x#P#Q%[#Q#o#x#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xZ!,wV!gQ!mXOX%[Z]%[^p%[q!P%[!Q;'S%[;'S;=`%v<%lO%[o!-ih!S`!gQbWXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!(y![!c#x!c!}!(y!}#O%[#O#P#x#P#Q%[#Q#R#x#R#S!(y#S#T#x#T#o!(y#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xo!/`j!q`!gQbWXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!(y![!c#x!c!}!(y!}#O%[#O#P#x#P#Q%[#Q#R#x#R#S!(y#S#T#x#T#i!(y#i#j!1Q#j#o!(y#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_!1Zj!gQbWXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!(y![!c#x!c!}!(y!}#O%[#O#P#x#P#Q%[#Q#R#x#R#S!(y#S#T#x#T#d!(y#d#e!2{#e#o!(y#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_!3Uj!gQbWXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!(y![!c#x!c!}!(y!}#O%[#O#P#x#P#Q%[#Q#R#x#R#S!(y#S#T#x#T#X!(y#X#Y!4v#Y#o!(y#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_!5Pj!gQbWXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!(y![!c#x!c!}!(y!}#O%[#O#P#x#P#Q%[#Q#R#x#R#S!(y#S#T#x#T#f!(y#f#g!6q#g#o!(y#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_!6zj!gQbWXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!(y![!c#x!c!}!(y!}#O%[#O#P#x#P#Q%[#Q#R#x#R#S!(y#S#T#x#T#g!(y#g#h!8l#h#o!(y#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_!8uj!gQbWXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!(y![!c#x!c!}!(y!}#O%[#O#P#x#P#Q%[#Q#R#x#R#S!(y#S#T#x#T#X!(y#X#Y!:g#Y#o!(y#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_!:pj!gQbWXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!(y![!c#x!c!}!(y!}#O%[#O#P#x#P#Q%[#Q#R#x#R#S!(y#S#T#x#T#h!(y#h#i!<b#i#o!(y#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#x_!<mh!gQ!UWbWXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!(y![!c#x!c!}!(y!}#O%[#O#P#x#P#Q%[#Q#R#x#R#S!(y#S#T#x#T#o!(y#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xo!>dh!w`!gQbWXTOX#xZ]#x^p#xqs#xst%[tx#xxz%[z!P#x!Q![!(y![!c#x!c!}!(y!}#O%[#O#P#x#P#Q%[#Q#R#x#R#S!(y#S#T#x#T#o!(y#o#p%[#p#q#x#q#r%[#r;'S#x;'S;=`%|<%lO#xU!@VX!tS!gQOX%[Z]%[^p%[q!P%[!Q#r%[#r#s!@r#s;'S%[;'S;=`%v<%lO%[U!@w]!gQOX!@rXZ!ApZ]!@r]^!Ap^p!@rpq!Apq!P!@r!P!Q!Ap!Q#r!@r#r#s!Be#s;'S!@r;'S;=`!Cs<%lO!@rS!AsTO#r!Ap#r#s!BS#s;'S!Ap;'S;=`!B_<%lO!ApS!BVP#q#r!BYS!B_OpSS!BbP;=`<%l!ApU!BjX!gQOX%[Z]%[^p%[q!P%[!Q#q%[#q#r!CV#r;'S%[;'S;=`%v<%lO%[U!C^VpS!gQOX%[Z]%[^p%[q!P%[!Q;'S%[;'S;=`%v<%lO%[U!CvP;=`<%l!@rR!DQV!vP!gQOX%[Z]%[^p%[q!P%[!Q;'S%[;'S;=`%v<%lO%[n!DlO!in\",\n  tokenizers: [0, 1, 2, 3, 4],\n  topRules: { Program: [0, 1] },\n  specialized: [{ term: 18, get: (value: any) => spec_Keyword[value] || -1 }],\n  tokenPrec: 925,\n});\n","import { IStorage, IHistoryRecord, IProgram, IMuscleGeneratorResponse, ICustomExercise } from \"@shared/types\";\nimport { IEither } from \"@shared/utils/types\";\nimport { UrlUtils } from \"@shared/utils/url\";\nimport { getLatestMigrationVersion } from \"@shared/migrations/migrations\";\nimport { IPostSync3Result, ISnapshotResponse, ISync3Request, ISync3Response } from \"../utils/sync\";\nimport { CollectionUtils } from \"@shared/utils/collection\";\nimport { IGlossary, IGlossaryEntry, ITrainerTexts } from \"@shared/models/glossary\";\nimport { IExerciseDescription, IExerciseDescriptions } from \"@shared/models/exerciseDescription\";\nimport { IExerciseTags } from \"../pages/trainerExercises/trainerExerciseTags\";\nimport { ITrainerAccount } from \"@shared/models/trainerAccount\";\nimport { IGoalStatEvent, IPostGoalEventsRequest } from \"@shared/models/goalStats\";\nimport { ITrainerInvite, IClientWithStats } from \"@server/data/dao/trainerDao\";\nimport { ICheckInAnswer } from \"@shared/models/checkIn\";\nimport {\n  IClientMessagesResponse,\n  IInboxResponse,\n  IInboxUnreadResponse,\n  IMessagesUnreadResponse,\n  ITrainerMessagesResponse,\n} from \"@shared/models/messages\";\n\nexport interface IGetStorageResponse {\n  email: string;\n  storage: IStorage;\n  user_id: string;\n  is_new_user: boolean;\n  key?: string;\n}\n\n// The server answers `GET /api/storage` with this when the storage version of the client is not the latest.\nexport interface IStorageErrorResponse {\n  type: \"error\";\n  error: string;\n}\n\n// A login response. The login requests send `historylimit: 0`, so the server reads no history for it. The phone loads\n// the user's data with `GET /api/snapshot` after it.\nexport interface ILoginResponse {\n  email: string;\n  user_id: string;\n  is_new_user: boolean;\n  // The client has a pending session and has not finished the sign-up. The app shows the finish form.\n  needsFinish?: boolean;\n}\n\nexport type IPostStorageResponse =\n  | {\n      status: \"success\";\n      newOriginalId: number;\n    }\n  | {\n      status: \"request\";\n      data: (\"programs\" | \"history\" | \"stats\")[];\n    }\n  | {\n      status: \"merged\";\n      storage: IStorage;\n    };\n\nexport interface IAiConvertResponse {\n  program: string;\n}\n\nexport type IEventPayload =\n  | {\n      type: \"event\";\n      userId?: string;\n      timestamp: number;\n      name: string;\n      isMobile?: boolean;\n      iOSVersion?: number;\n      androidVersion?: number;\n      commithash: string;\n      extra?: Record<string, string | number>;\n    }\n  | {\n      type: \"error\";\n      userId?: string;\n      timestamp: number;\n      message: string;\n      stack: string;\n      commithash: string;\n      isMobile?: boolean;\n    }\n  | {\n      type: \"safesnapshot\";\n      userId?: string;\n      timestamp: number;\n      storage_id: string;\n      commithash: string;\n      isMobile?: boolean;\n      update: string;\n    }\n  | {\n      type: \"mergesnapshot\";\n      userId?: string;\n      timestamp: number;\n      storage_id: string;\n      commithash: string;\n      isMobile?: boolean;\n      update: string;\n    };\n\ndeclare let __API_HOST__: string;\ndeclare let __ENV__: string;\ndeclare let __HOST__: string;\ndeclare let __STREAMING_API_HOST__: string;\n\nexport class Service {\n  public readonly client: Window[\"fetch\"];\n\n  constructor(client: Window[\"fetch\"]) {\n    this.client = client;\n  }\n\n  private trainerApiUrl(path: string): string {\n    const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n    // TODO JULES: Probably delete this\n    // if (__ENV__ === \"development\" && typeof window !== \"undefined\") {\n    //   return normalizedPath;\n    // }\n    return `${__API_HOST__}${normalizedPath}`;\n  }\n\n  public async getAllHistoryRecords(args: {\n    alreadyFetchedHistory?: IHistoryRecord[];\n    historyLimit?: number;\n  }): Promise<IHistoryRecord[]> {\n    let history = args.alreadyFetchedHistory || [];\n    let historyResponse: IHistoryRecord[] | undefined = undefined;\n    let historyLimit = args.historyLimit || 20;\n    while ((historyResponse || history).length > historyLimit - 1) {\n      historyLimit = 200;\n      historyResponse = await this.getHistory({\n        after: history.length > 1 ? history[history.length - 2].id : undefined,\n        limit: historyLimit,\n      });\n      if (historyResponse.length > 0) {\n        history = [...history, ...historyResponse];\n      } else {\n        break;\n      }\n    }\n    history = CollectionUtils.uniqBy(history, \"id\");\n    return history;\n  }\n\n  public async getHistory(args: { after?: number; limit?: number }): Promise<IHistoryRecord[]> {\n    const url = UrlUtils.build(`${__API_HOST__}/api/history`);\n    if (args.after) {\n      url.searchParams.set(\"after\", args.after.toString());\n    }\n    if (args.limit) {\n      url.searchParams.set(\"limit\", args.limit.toString());\n    }\n    const response = await this.client(url.toString(), { credentials: \"include\" });\n    const json: { history: IHistoryRecord[] } = await response.json();\n    return json.history;\n  }\n\n  private async dateOfBirthResult(response: Response, fallback: string): Promise<string | null> {\n    if (!response.ok) {\n      let message = fallback;\n      try {\n        const errorBody = await response.json();\n        if (typeof errorBody?.error === \"string\") {\n          message = errorBody.error;\n        }\n      } catch {\n        // Ignore JSON parse errors and fall back to default message.\n      }\n      throw new Error(message);\n    }\n    const json: { dateOfBirth?: string | null } = await response.json();\n    return json.dateOfBirth ?? null;\n  }\n\n  // `POST /api/checkins`. Gives the HTTP status. A network error throws, so the outbox keeps the answer.\n  public async postCheckIn(answer: ICheckInAnswer): Promise<number> {\n    const response = await this.client(`${__API_HOST__}/api/checkins`, {\n      method: \"POST\",\n      body: JSON.stringify(answer),\n      credentials: \"include\",\n    });\n    return response.status;\n  }\n\n  // `GET /api/messages`. With `since`, an unchanged thread gives only `{ changed: false, unread }`.\n  public async getMessages(since?: number): Promise<IClientMessagesResponse> {\n    const query = since != null ? `?since=${since}` : \"\";\n    const response = await this.client(`${__API_HOST__}/api/messages${query}`, {\n      method: \"GET\",\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      throw new Error(`Failed to load messages (${response.status})`);\n    }\n    return response.json();\n  }\n\n  // `GET /api/messages/unread`. Gives undefined on any error, so the Home icon just stays as it is.\n  public async getMessagesUnread(): Promise<IMessagesUnreadResponse | undefined> {\n    try {\n      const response = await this.client(`${__API_HOST__}/api/messages/unread`, {\n        method: \"GET\",\n        credentials: \"include\",\n      });\n      return response.ok ? await response.json() : undefined;\n    } catch (e) {\n      return undefined;\n    }\n  }\n\n  // `POST /api/messages`. Gives the HTTP status. A network error throws.\n  public async postMessage(id: string, text: string): Promise<number> {\n    const response = await this.client(`${__API_HOST__}/api/messages`, {\n      method: \"POST\",\n      body: JSON.stringify({ id, text }),\n      credentials: \"include\",\n    });\n    return response.status;\n  }\n\n  // `DELETE /api/messages/:id`. Gives the HTTP status.\n  public async deleteMessage(id: string): Promise<number> {\n    const response = await this.client(`${__API_HOST__}/api/messages/${encodeURIComponent(id)}`, {\n      method: \"DELETE\",\n      credentials: \"include\",\n    });\n    return response.status;\n  }\n\n  // `POST /api/messages/seen`. Gives the HTTP status.\n  public async postMessagesSeen(): Promise<number> {\n    const response = await this.client(`${__API_HOST__}/api/messages/seen`, {\n      method: \"POST\",\n      credentials: \"include\",\n    });\n    return response.status;\n  }\n\n  // `GET /api/trainer/clients/:clientid/messages`. With `since`, an unchanged thread has `changed: false`.\n  public async getTrainerMessages(clientId: string, since?: number): Promise<ITrainerMessagesResponse> {\n    const query = since != null ? `?since=${since}` : \"\";\n    const response = await this.client(this.trainerApiUrl(`/api/trainer/clients/${clientId}/messages${query}`), {\n      method: \"GET\",\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      throw new Error(`Failed to load messages (${response.status})`);\n    }\n    return response.json();\n  }\n\n  // `GET /api/trainer/clients` (the route of the Clients screen). Gives the current clients.\n  public async getTrainerCurrentClients(): Promise<IClientWithStats[]> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/clients\"), {\n      method: \"GET\",\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      throw new Error(`Failed to load the clients (${response.status})`);\n    }\n    const data: { currentClients: IClientWithStats[] } = await response.json();\n    return data.currentClients;\n  }\n\n  // `GET /api/trainer/messages/inbox`.\n  public async getTrainerInbox(): Promise<IInboxResponse> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/messages/inbox\"), {\n      method: \"GET\",\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      throw new Error(`Failed to load the inbox (${response.status})`);\n    }\n    return response.json();\n  }\n\n  // `GET /api/trainer/messages/unread`. Gives undefined on any error.\n  public async getTrainerInboxUnread(): Promise<IInboxUnreadResponse | undefined> {\n    try {\n      const response = await this.client(this.trainerApiUrl(\"/api/trainer/messages/unread\"), {\n        method: \"GET\",\n        credentials: \"include\",\n      });\n      return response.ok ? await response.json() : undefined;\n    } catch (e) {\n      return undefined;\n    }\n  }\n\n  // `POST /api/trainer/clients/:clientid/messages`. Gives the HTTP status. A network error throws.\n  public async postTrainerMessage(clientId: string, id: string, text: string): Promise<number> {\n    const response = await this.client(this.trainerApiUrl(`/api/trainer/clients/${clientId}/messages`), {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ id, text }),\n      credentials: \"include\",\n    });\n    return response.status;\n  }\n\n  // `DELETE /api/trainer/clients/:clientid/messages/:id`. Gives the HTTP status.\n  public async deleteTrainerMessage(clientId: string, id: string): Promise<number> {\n    const url = this.trainerApiUrl(`/api/trainer/clients/${clientId}/messages/${encodeURIComponent(id)}`);\n    const response = await this.client(url, { method: \"DELETE\", credentials: \"include\" });\n    return response.status;\n  }\n\n  // `POST /api/trainer/clients/:clientid/messages/seen`. Gives the HTTP status.\n  public async postTrainerMessagesSeen(clientId: string): Promise<number> {\n    const response = await this.client(this.trainerApiUrl(`/api/trainer/clients/${clientId}/messages/seen`), {\n      method: \"POST\",\n      credentials: \"include\",\n    });\n    return response.status;\n  }\n\n  // `GET /api/user/date-of-birth`. Returns \"YYYY-MM-DD\", or null when no value is set.\n  public async getDateOfBirth(): Promise<string | null> {\n    const response = await this.client(`${__API_HOST__}/api/user/date-of-birth`, {\n      method: \"GET\",\n      credentials: \"include\",\n    });\n    return this.dateOfBirthResult(response, \"Failed to load date of birth\");\n  }\n\n  // `POST /api/user/date-of-birth`. A null value removes the D.O.B. Throws the server error text on failure.\n  public async updateDateOfBirth(value: string | null): Promise<string | null> {\n    const response = await this.client(`${__API_HOST__}/api/user/date-of-birth`, {\n      method: \"POST\",\n      body: JSON.stringify({ dateOfBirth: value }),\n      credentials: \"include\",\n    });\n    return this.dateOfBirthResult(response, \"Failed to save date of birth\");\n  }\n\n  // `POST /api/user/password/change`. Throws the server error text on failure.\n  public async changePassword(currentPassword: string, newPassword: string): Promise<void> {\n    const response = await this.client(`${__API_HOST__}/api/user/password/change`, {\n      method: \"POST\",\n      body: JSON.stringify({ currentPassword, newPassword }),\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      let message = \"Failed to change password\";\n      try {\n        const errorBody = await response.json();\n        if (typeof errorBody?.error === \"string\") {\n          message = errorBody.error;\n        }\n      } catch {\n        // Ignore JSON parse errors and fall back to default message.\n      }\n      throw new Error(message);\n    }\n  }\n\n  // `POST /api/user/email/change-request`. Throws the server error text on failure.\n  public async requestEmailChange(newEmail: string, currentPassword: string): Promise<void> {\n    const response = await this.client(`${__API_HOST__}/api/user/email/change-request`, {\n      method: \"POST\",\n      body: JSON.stringify({ newEmail, currentPassword }),\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      let message = \"Failed to request the email change\";\n      try {\n        const errorBody = await response.json();\n        if (typeof errorBody?.error === \"string\") {\n          message = errorBody.error;\n        }\n      } catch {\n        // Ignore JSON parse errors and fall back to default message.\n      }\n      throw new Error(message);\n    }\n  }\n\n  // `POST /api/user/email/change-confirm`. Public: the token is the proof. Returns the new email. Throws on failure.\n  public async confirmEmailChange(token: string): Promise<string> {\n    const response = await this.client(`${__API_HOST__}/api/user/email/change-confirm`, {\n      method: \"POST\",\n      body: JSON.stringify({ token }),\n      credentials: \"include\",\n    });\n    const json: { email?: string } | undefined = response.ok ? await response.json() : undefined;\n    if (!json || typeof json.email !== \"string\") {\n      throw new Error(\"Failed to confirm the email change\");\n    }\n    return json.email;\n  }\n\n  public async validateInvite(\n    inviteToken: string\n  ): Promise<{ valid: boolean; email?: string; nickname?: string; reason?: \"already-registered\" }> {\n    const response = await this.client(`${__API_HOST__}/api/signin/invite/validate`, {\n      method: \"POST\",\n      body: JSON.stringify({ invite_token: inviteToken }),\n      credentials: \"include\",\n    });\n    const json: { valid: boolean; email?: string; nickname?: string; reason?: \"already-registered\" } =\n      await response.json();\n    return json;\n  }\n\n  // Makes the invited person a client. The server sets a pending session cookie.\n  public async claimInvite(inviteToken: string): Promise<void> {\n    const response = await this.client(`${__API_HOST__}/api/signin/invite/claim`, {\n      method: \"POST\",\n      body: JSON.stringify({ invite_token: inviteToken }),\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      throw new Error(await this.errorText(response, \"Failed to open the invitation\"));\n    }\n  }\n\n  // Ends the sign-up. It needs the pending session from the claim or the magic link.\n  public async finishInvite(password: string, termsAccepted: boolean, nickname?: string): Promise<ILoginResponse> {\n    const response = await this.client(`${__API_HOST__}/api/signin/invite/finish`, {\n      method: \"POST\",\n      body: JSON.stringify({ password, termsAccepted, nickname }),\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      throw new Error(await this.errorText(response, \"Failed to sign up\"));\n    }\n    const json: ILoginResponse = await response.json();\n    return { email: json.email, user_id: json.user_id, is_new_user: true };\n  }\n\n  private async errorText(response: Response, fallback: string): Promise<string> {\n    try {\n      const errorBody = await response.json();\n      if (typeof errorBody?.error === \"string\") {\n        return errorBody.error;\n      }\n    } catch {\n      // Ignore JSON parse errors and fall back to default message.\n    }\n    return fallback;\n  }\n\n  public async emailSignIn(email: string, password: string): Promise<ILoginResponse> {\n    const response = await this.client(`${__API_HOST__}/api/signin/email/login`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        email,\n        password,\n        historylimit: 0,\n      }),\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      if (response.status === 401) {\n        throw new Error(\"The email or password was incorrect. Try again.\");\n      }\n      let message = \"Failed to sign in\";\n      try {\n        const errorBody = await response.json();\n        if (typeof errorBody?.message === \"string\") {\n          message = errorBody.message;\n        } else if (typeof errorBody?.error === \"string\") {\n          message = errorBody.error;\n        }\n      } catch {\n        // Ignore JSON parse errors and fall back to default message.\n      }\n      throw new Error(message);\n    }\n    const json: ILoginResponse = await response.json();\n    return { email: json.email, user_id: json.user_id, is_new_user: json.is_new_user };\n  }\n\n  public async requestMagicLink(email: string): Promise<{ success: boolean; message: string }> {\n    const response = await this.client(`${__API_HOST__}/api/signin/email/magic-link/request`, {\n      method: \"POST\",\n      body: JSON.stringify({ email }),\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      let message = \"Failed to send magic link\";\n      try {\n        const errorBody = await response.json();\n        if (typeof errorBody?.message === \"string\") {\n          message = errorBody.message;\n        } else if (typeof errorBody?.error === \"string\") {\n          message = errorBody.error;\n        }\n      } catch {\n        // Ignore JSON parse errors and fall back to default message.\n      }\n      throw new Error(message);\n    }\n    const json: { success: boolean; message: string } = await response.json();\n    return json;\n  }\n\n  public async verifyMagicLink(token: string): Promise<ILoginResponse> {\n    const response = await this.client(`${__API_HOST__}/api/signin/email/magic-link/verify`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        token,\n        historylimit: 0,\n      }),\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      if (response.status === 401) {\n        throw new Error(\"Invalid or expired magic link. Please request a new one.\");\n      }\n      let message = \"Failed to verify magic link\";\n      try {\n        const errorBody = await response.json();\n        if (typeof errorBody?.message === \"string\") {\n          message = errorBody.message;\n        } else if (typeof errorBody?.error === \"string\") {\n          message = errorBody.error;\n        }\n      } catch {\n        // Ignore JSON parse errors and fall back to default message.\n      }\n      throw new Error(message);\n    }\n    const json: ILoginResponse = await response.json();\n    if (json.needsFinish) {\n      return { email: json.email, user_id: \"\", is_new_user: false, needsFinish: true };\n    }\n    return { email: json.email, user_id: json.user_id, is_new_user: json.is_new_user };\n  }\n\n  public async requestPasswordReset(email: string): Promise<{ success: boolean; message: string }> {\n    const response = await this.client(`${__API_HOST__}/api/signin/email/forgot-password`, {\n      method: \"POST\",\n      body: JSON.stringify({ email }),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; message: string } = await response.json();\n    return json;\n  }\n\n  public async validateResetToken(token: string): Promise<{ valid: boolean; error?: string }> {\n    const response = await this.client(`${__API_HOST__}/api/signin/email/validate-reset-token`, {\n      method: \"POST\",\n      body: JSON.stringify({ token }),\n      credentials: \"include\",\n    });\n    const json: { valid: boolean; error?: string } = await response.json();\n    return json;\n  }\n\n  public async resetPassword(token: string, newPassword: string): Promise<{ success: boolean; message: string }> {\n    const response = await this.client(`${__API_HOST__}/api/signin/email/reset-password`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        token,\n        newPassword,\n      }),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; message: string } = await response.json();\n    return json;\n  }\n\n  public async signout(): Promise<void> {\n    await this.client(`${__API_HOST__}/api/signout`, {\n      method: \"POST\",\n      body: JSON.stringify({}),\n      credentials: \"include\",\n    });\n  }\n\n  public async trainerEmailRegister(email: string, password: string, nickname?: string): Promise<ITrainerAccount> {\n    const response = await this.client(`${__API_HOST__}/api/trainer/signin/email/register`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        email,\n        password,\n        nickname,\n      }),\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      let message = \"Failed to register\";\n      try {\n        const errorBody = await response.json();\n        if (typeof errorBody?.message === \"string\") {\n          message = errorBody.message;\n        } else if (typeof errorBody?.error === \"string\") {\n          message = errorBody.error;\n        }\n      } catch {\n        // Ignore JSON parse errors and fall back to default message.\n      }\n      throw new Error(message);\n    }\n    const json: ITrainerAccount = await response.json();\n    return json;\n  }\n\n  public async trainerEmailSignIn(email: string, password: string): Promise<ITrainerAccount> {\n    const response = await this.client(`${__API_HOST__}/api/trainer/signin/email/login`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        email,\n        password,\n      }),\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      if (response.status === 401) {\n        throw new Error(\"The email or password was incorrect. Try again.\");\n      }\n      let message = \"Failed to sign in\";\n      try {\n        const errorBody = await response.json();\n        if (typeof errorBody?.message === \"string\") {\n          message = errorBody.message;\n        } else if (typeof errorBody?.error === \"string\") {\n          message = errorBody.error;\n        }\n      } catch {\n        // Ignore JSON parse errors and fall back to default message.\n      }\n      throw new Error(message);\n    }\n    const json: ITrainerAccount = await response.json();\n    return json;\n  }\n\n  public async trainerRequestMagicLink(email: string): Promise<{ success: boolean; message: string }> {\n    const response = await this.client(`${__API_HOST__}/api/trainer/signin/email/magic-link/request`, {\n      method: \"POST\",\n      body: JSON.stringify({ email }),\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      let message = \"Failed to send magic link\";\n      try {\n        const errorBody = await response.json();\n        if (typeof errorBody?.message === \"string\") {\n          message = errorBody.message;\n        } else if (typeof errorBody?.error === \"string\") {\n          message = errorBody.error;\n        }\n      } catch {\n        // Ignore JSON parse errors and fall back to default message.\n      }\n      throw new Error(message);\n    }\n    const json: { success: boolean; message: string } = await response.json();\n    return json;\n  }\n\n  public async trainerVerifyMagicLink(token: string): Promise<ITrainerAccount> {\n    const response = await this.client(`${__API_HOST__}/api/trainer/signin/email/magic-link/verify`, {\n      method: \"POST\",\n      body: JSON.stringify({ token }),\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      if (response.status === 401) {\n        throw new Error(\"Invalid or expired magic link. Please request a new one.\");\n      }\n      let message = \"Failed to verify magic link\";\n      try {\n        const errorBody = await response.json();\n        if (typeof errorBody?.message === \"string\") {\n          message = errorBody.message;\n        } else if (typeof errorBody?.error === \"string\") {\n          message = errorBody.error;\n        }\n      } catch {\n        // Ignore JSON parse errors and fall back to default message.\n      }\n      throw new Error(message);\n    }\n    const json: ITrainerAccount = await response.json();\n    return json;\n  }\n\n  public async trainerRequestPasswordReset(email: string): Promise<{ success: boolean; message: string }> {\n    const response = await this.client(`${__API_HOST__}/api/trainer/signin/email/forgot-password`, {\n      method: \"POST\",\n      body: JSON.stringify({ email }),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; message: string } = await response.json();\n    return json;\n  }\n\n  public async trainerResetPassword(\n    token: string,\n    newPassword: string\n  ): Promise<{ success: boolean; message: string }> {\n    const response = await this.client(`${__API_HOST__}/api/trainer/signin/email/reset-password`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        token,\n        newPassword,\n      }),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; message: string } = await response.json();\n    return json;\n  }\n\n  public async trainerSignout(): Promise<void> {\n    await this.client(`${__API_HOST__}/api/trainer/signout`, {\n      method: \"POST\",\n      body: JSON.stringify({}),\n      credentials: \"include\",\n    });\n  }\n\n  public async trainerGetPrograms(): Promise<{ id: string; name: string; isDraft?: boolean }[]> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/programs\"), { credentials: \"include\" });\n    if (!response.ok) {\n      return [];\n    }\n    const json: { programs?: { id: string; isDraft?: boolean; program: { name: string } }[] } = await response.json();\n    return (json.programs ?? []).map((p) => ({ id: p.id, name: p.program.name, isDraft: p.isDraft }));\n  }\n\n  public async trainerSendInvite(\n    email: string,\n    details: {\n      nickname?: string;\n      deidId?: string;\n      dateOfBirth?: string;\n      programId?: string;\n      checkInEveryWeeks?: 1 | 2 | 4;\n    } = {}\n  ): Promise<{ success: boolean; error?: string; invite?: ITrainerInvite }> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/clients/invite\"), {\n      method: \"POST\",\n      body: JSON.stringify({ email, ...details }),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; error?: string; invite?: ITrainerInvite } = await response.json();\n    return json;\n  }\n\n  // A key in `changes` replaces the field. An empty value removes it. A missing key leaves it.\n  public async trainerUpdateInvite(\n    inviteToken: string,\n    changes: { email?: string; nickname?: string; deidId?: string; dateOfBirth?: string; programId?: string }\n  ): Promise<{ success: boolean; error?: string; invite?: ITrainerInvite }> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/clients/invite/update\"), {\n      method: \"POST\",\n      body: JSON.stringify({ inviteToken, ...changes }),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; error?: string; invite?: ITrainerInvite } = await response.json();\n    return json;\n  }\n\n  public async trainerResendInvite(email: string): Promise<{ success: boolean; error?: string }> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/clients/invite/resend\"), {\n      method: \"POST\",\n      body: JSON.stringify({ email }),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; error?: string } = await response.json();\n    return json;\n  }\n\n  public async trainerDeleteInvite(email: string): Promise<{ success: boolean; error?: string }> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/clients/invite\"), {\n      method: \"DELETE\",\n      body: JSON.stringify({ email }),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; error?: string } = await response.json();\n    return json;\n  }\n\n  public async trainerDeleteProgram(programId: string): Promise<{ success: boolean; error?: string }> {\n    const response = await this.client(this.trainerApiUrl(`/api/trainer/programs/${programId}/delete`), {\n      method: \"POST\",\n      credentials: \"include\",\n    });\n    const json: { success: boolean; error?: string } = await response.json();\n    return json;\n  }\n\n  public async trainerSaveProgram(program: IProgram): Promise<{ success: boolean; error?: string }> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/programs/save\"), {\n      method: \"POST\",\n      body: JSON.stringify({ program }),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; error?: string } = await response.json();\n    return json;\n  }\n\n  public async trainerSaveProgramDraft(args: {\n    program: IProgram;\n    draftOf?: string;\n    version?: number;\n  }): Promise<{ success: boolean; error?: string; status: number; version?: number; deleted?: boolean }> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/programs/draft/save\"), {\n      method: \"POST\",\n      body: JSON.stringify(args),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; error?: string; version?: number; deleted?: boolean } = await response.json();\n    return { ...json, status: response.status };\n  }\n\n  public async trainerPublishProgram(\n    programId: string,\n    force: boolean = false\n  ): Promise<{ success: boolean; error?: string; code?: string; status: number }> {\n    const response = await this.client(this.trainerApiUrl(`/api/trainer/programs/${programId}/publish`), {\n      method: \"POST\",\n      body: JSON.stringify({ force }),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; error?: string; code?: string } = await response.json();\n    return { ...json, status: response.status };\n  }\n\n  public async trainerDiscardProgramDraft(args: {\n    draftOf?: string;\n    programId?: string;\n  }): Promise<{ success: boolean; error?: string }> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/programs/draft/delete\"), {\n      method: \"POST\",\n      body: JSON.stringify(args),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; error?: string } = await response.json();\n    return json;\n  }\n\n  public async trainerSaveClientDraft(\n    clientId: string,\n    args: { program: IProgram; version?: number }\n  ): Promise<{ success: boolean; error?: string; status: number; version?: number; deleted?: boolean }> {\n    const response = await this.client(this.trainerApiUrl(`/api/trainer/clients/${clientId}/drafts/save`), {\n      method: \"POST\",\n      body: JSON.stringify(args),\n      credentials: \"include\",\n    });\n    const json: { success: boolean; error?: string; version?: number; deleted?: boolean } = await response.json();\n    return { ...json, status: response.status };\n  }\n\n  public async trainerDiscardClientDraft(\n    clientId: string,\n    draftId: string\n  ): Promise<{ success: boolean; error?: string }> {\n    const url = this.trainerApiUrl(`/api/trainer/clients/${clientId}/drafts/${encodeURIComponent(draftId)}/delete`);\n    const response = await this.client(url, { method: \"POST\", credentials: \"include\" });\n    const json: { success: boolean; error?: string } = await response.json();\n    return json;\n  }\n\n  public async trainerUpsertExercise(\n    exercise: ICustomExercise\n  ): Promise<{ success: boolean; error?: string; levelError?: string }> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/exercises\"), {\n      method: \"POST\",\n      body: JSON.stringify({ exercise }),\n      credentials: \"include\",\n    });\n    const json: { success?: boolean; error?: string; levelError?: string } = await response.json();\n    return { ...json, success: json.success === true };\n  }\n\n  public async trainerDeleteExercise(exerciseId: string): Promise<{ success: boolean; error?: string }> {\n    const response = await this.client(this.trainerApiUrl(`/api/trainer/exercises/${exerciseId}/delete`), {\n      method: \"POST\",\n      credentials: \"include\",\n    });\n    const json: { success: boolean; error?: string } = await response.json();\n    return json;\n  }\n\n  public async trainerGetGlossary(): Promise<IEither<IGlossary, string>> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/glossary\"), { credentials: \"include\" });\n    if (!response.ok) {\n      return { success: false, error: \"The glossary did not load.\" };\n    }\n    const json: { glossary?: IGlossary } = await response.json();\n    return { success: true, data: json.glossary ?? {} };\n  }\n\n  // `termKey` is the key of the term. The server answers 400 with an error text for a bad term or a full glossary.\n  public async trainerPutGlossaryTerm(\n    termKey: string,\n    term: string,\n    definition: string\n  ): Promise<IEither<IGlossaryEntry, string>> {\n    const response = await this.client(this.trainerApiUrl(`/api/trainer/glossary/${encodeURIComponent(termKey)}`), {\n      method: \"PUT\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ term, definition }),\n      credentials: \"include\",\n    });\n    const json: { entry?: IGlossaryEntry; error?: string } = await response.json().catch(() => ({}));\n    if (!response.ok || json.entry == null) {\n      return { success: false, error: json.error ?? \"The term was not saved.\" };\n    }\n    return { success: true, data: json.entry };\n  }\n\n  public async trainerDeleteGlossaryTerm(termKey: string): Promise<IEither<true, string>> {\n    const response = await this.client(this.trainerApiUrl(`/api/trainer/glossary/${encodeURIComponent(termKey)}`), {\n      method: \"DELETE\",\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      return { success: false, error: \"The term was not deleted.\" };\n    }\n    return { success: true, data: true };\n  }\n\n  public async trainerGetExerciseDescriptions(): Promise<IEither<IExerciseDescriptions, string>> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/exercise-descriptions\"), {\n      credentials: \"include\",\n    });\n    if (!response.ok) {\n      return { success: false, error: \"The exercise descriptions did not load.\" };\n    }\n    const json: { exercises?: IExerciseDescriptions } = await response.json();\n    return { success: true, data: json.exercises ?? {} };\n  }\n\n  // `exerciseKey` is `ExerciseDescription.keyOf`. The server answers 400 with an error text for a bad key or text.\n  public async trainerPutExerciseDescription(\n    exerciseKey: string,\n    description: string\n  ): Promise<IEither<IExerciseDescription, string>> {\n    const response = await this.client(\n      this.trainerApiUrl(`/api/trainer/exercise-descriptions/${encodeURIComponent(exerciseKey)}`),\n      {\n        method: \"PUT\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ description }),\n        credentials: \"include\",\n      }\n    );\n    const json: { entry?: IExerciseDescription; error?: string } = await response.json().catch(() => ({}));\n    if (!response.ok || json.entry == null) {\n      return { success: false, error: json.error ?? \"The description was not saved.\" };\n    }\n    return { success: true, data: json.entry };\n  }\n\n  public async trainerDeleteExerciseDescription(exerciseKey: string): Promise<IEither<true, string>> {\n    const response = await this.client(\n      this.trainerApiUrl(`/api/trainer/exercise-descriptions/${encodeURIComponent(exerciseKey)}`),\n      { method: \"DELETE\", credentials: \"include\" }\n    );\n    if (!response.ok) {\n      return { success: false, error: \"The description was not deleted.\" };\n    }\n    return { success: true, data: true };\n  }\n\n  public async trainerGetExerciseTags(): Promise<IEither<IExerciseTags, string>> {\n    const response = await this.client(this.trainerApiUrl(\"/api/trainer/exercise-tags\"), { credentials: \"include\" });\n    if (!response.ok) {\n      return { success: false, error: \"The exercise tags did not load.\" };\n    }\n    const json: { tags?: IExerciseTags } = await response.json();\n    return { success: true, data: json.tags ?? {} };\n  }\n\n  // `exerciseKey` is `ExerciseDescription.keyOf`. An empty list deletes the tags. The server answers 400 with an error\n  // text for a bad key or a list over the limits.\n  public async trainerPutExerciseTags(exerciseKey: string, tags: string[]): Promise<IEither<string[], string>> {\n    const response = await this.client(\n      this.trainerApiUrl(`/api/trainer/exercise-tags/${encodeURIComponent(exerciseKey)}`),\n      {\n        method: \"PUT\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ tags }),\n        credentials: \"include\",\n      }\n    );\n    const json: { entry?: { tags: string[] }; error?: string } = await response.json().catch(() => ({}));\n    if (!response.ok || json.entry == null) {\n      return { success: false, error: json.error ?? \"The tags were not saved.\" };\n    }\n    return { success: true, data: json.entry.tags };\n  }\n\n  public async getProgramRevisions(programId: string): Promise<IEither<string[], string>> {\n    const result = await this.client(`${__API_HOST__}/api/programrevisions/${programId}`, {\n      method: \"GET\",\n      credentials: \"include\",\n    });\n    if (result.ok) {\n      const json = await result.json();\n      return { success: true, data: json.data };\n    } else {\n      return { success: false, error: \"error\" };\n    }\n  }\n\n  public async getProgramRevision(programId: string, revision: string): Promise<IEither<string, string>> {\n    const result = await this.client(`${__API_HOST__}/api/programrevision/${programId}/${revision}`, {\n      method: \"GET\",\n      credentials: \"include\",\n    });\n    if (result.ok) {\n      const json = await result.json();\n      return { success: true, data: json.text };\n    } else {\n      return { success: false, error: \"error\" };\n    }\n  }\n\n  // `POST /api/sync3`. HTTP 413, and a 5xx that is not JSON (for example a CloudFront HTML page), are \"page_failed\":\n  // the phone sends a smaller page.\n  public async postSync3(request: ISync3Request, signal?: AbortSignal): Promise<IPostSync3Result> {\n    const url = UrlUtils.build(`${__API_HOST__}/api/sync3`);\n    const result = await this.client(url.toString(), {\n      method: \"POST\",\n      body: JSON.stringify(request),\n      credentials: \"include\",\n      signal,\n    });\n    const text = await result.text();\n    let json: ISync3Response | undefined;\n    try {\n      json = JSON.parse(text);\n    } catch (e) {\n      json = undefined;\n    }\n    if (result.status === 413 || (json == null && result.status >= 500)) {\n      return json?.type === \"too_big\" ? json : { type: \"page_failed\", status: result.status };\n    }\n    if (json == null) {\n      throw new Error(`Sync failed with HTTP ${result.status}`);\n    }\n    return json;\n  }\n\n  // One page of `GET /api/snapshot`. No `after`: page 1.\n  public async getSnapshot(after?: number, signal?: AbortSignal): Promise<ISnapshotResponse> {\n    const url = UrlUtils.build(`${__API_HOST__}/api/snapshot`);\n    url.searchParams.set(\"version\", getLatestMigrationVersion());\n    if (after != null) {\n      url.searchParams.set(\"after\", after.toString());\n    }\n    const result = await this.client(url.toString(), { credentials: \"include\", signal });\n    return result.json();\n  }\n\n  // Sends `version` (the last one the client has) as `If-None-Match`. The server answers 304 when it is the same.\n  public async getTrainerTexts(\n    version?: number\n  ): Promise<{ status: \"ok\"; texts: ITrainerTexts } | { status: \"notModified\" }> {\n    const headers: Record<string, string> = version != null ? { \"If-None-Match\": String(version) } : {};\n    const response = await this.client(`${__API_HOST__}/api/trainer-texts`, { credentials: \"include\", headers });\n    if (response.status === 304) {\n      return { status: \"notModified\" };\n    }\n    if (!response.ok) {\n      throw new Error(`Trainer texts failed with ${response.status}`);\n    }\n    return { status: \"ok\", texts: await response.json() };\n  }\n\n  public async postDebug(state: string, meta: Record<string, string>): Promise<string | undefined> {\n    try {\n      const response = await this.client(`${__API_HOST__}/api/debug`, {\n        method: \"POST\",\n        body: JSON.stringify({ data: { state, meta } }),\n        credentials: \"include\",\n      });\n      const json = await response.json();\n      return json?.data === \"ok\" && typeof json.id === \"string\" ? json.id : undefined;\n    } catch (e) {\n      return undefined;\n    }\n  }\n\n  public async postAddFreeUser(userid: string, adminKey: string): Promise<void> {\n    const url = UrlUtils.build(`${__API_HOST__}/api/addfreeuser/${userid}`);\n    url.searchParams.set(\"key\", adminKey);\n    await this.client(url.toString(), {\n      method: \"POST\",\n      credentials: \"include\",\n    });\n  }\n\n  public async getStorage(\n    userId?: string,\n    storageId?: string,\n    adminKey?: string\n  ): Promise<IGetStorageResponse | IStorageErrorResponse> {\n    const historylimit = 20;\n    const url = UrlUtils.build(`${__API_HOST__}/api/storage`);\n    if (userId != null && adminKey != null) {\n      url.searchParams.set(\"userid\", userId);\n      url.searchParams.set(\"key\", adminKey);\n      if (storageId) {\n        url.searchParams.set(\"storageid\", storageId);\n      }\n    }\n    url.searchParams.set(\"historylimit\", historylimit.toString());\n    url.searchParams.set(\"version\", getLatestMigrationVersion());\n    const result = await this.client(url.toString(), { credentials: \"include\" });\n    const json = await result.json();\n    if (json?.type === \"error\") {\n      return { type: \"error\", error: String(json.error) };\n    }\n    json.storage.history = await this.getAllHistoryRecords({\n      alreadyFetchedHistory: json.storage.history,\n      historyLimit: historylimit,\n    });\n    return {\n      email: json.email,\n      storage: json.storage,\n      user_id: json.user_id,\n      key: json.key,\n      is_new_user: json.is_new_user,\n    };\n  }\n\n  public async postEvent(event: IEventPayload): Promise<void> {\n    const nosync =\n      typeof window !== \"undefined\" && UrlUtils.build(window.location.href).searchParams.get(\"nosync\") === \"true\";\n    if (nosync) {\n      return;\n    }\n    const url = UrlUtils.build(`${__API_HOST__}/api/event`);\n    await this.client(url.toString(), {\n      method: \"POST\",\n      body: JSON.stringify(event),\n      credentials: \"include\",\n    });\n  }\n\n  // `POST /api/goals/events`. Gives the HTTP status code. Throws on a network error.\n  public async postGoalEvents(events: IGoalStatEvent[]): Promise<number> {\n    const request: IPostGoalEventsRequest = { events };\n    const response = await this.client(`${__API_HOST__}/api/goals/events`, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify(request),\n      credentials: \"include\",\n    });\n    return response.status;\n  }\n\n  public async getUploadedImages(): Promise<string[]> {\n    const url = UrlUtils.build(`${__API_HOST__}/api/uploadedimages`);\n    const response = await this.client(url.toString(), { credentials: \"include\" });\n    if (response.ok) {\n      const json: { data: { images: string[] } } = await response.json();\n      return json.data.images;\n    } else {\n      return [];\n    }\n  }\n\n  public async postImageUploadUrl(\n    fileName: string,\n    contentType: string\n  ): Promise<{ uploadUrl: string; imageUrl: string; key: string }> {\n    const url = UrlUtils.build(`${__API_HOST__}/api/imageuploadurl`);\n    const response = await this.client(url.toString(), {\n      method: \"POST\",\n      body: JSON.stringify({ fileName, contentType }),\n      credentials: \"include\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n    });\n\n    if (!response.ok) {\n      const error = await response.text();\n      throw new Error(`Failed to get upload URL: ${error}`);\n    }\n\n    return response.json();\n  }\n\n  public async deleteAccount(): Promise<boolean> {\n    const url = UrlUtils.build(`${__API_HOST__}/api/deleteaccount`);\n    const response = await this.client(url.toString(), { method: \"DELETE\", credentials: \"include\" });\n    const json = await response.json();\n    return json.data === \"ok\";\n  }\n\n  public async publishProgram(program: IProgram, adminKey: string): Promise<void> {\n    const url = UrlUtils.build(`${__API_HOST__}/api/publishprogram`);\n    url.searchParams.set(\"key\", adminKey);\n    await this.client(url.toString(), {\n      method: \"POST\",\n      body: JSON.stringify({ program }),\n      credentials: \"include\",\n    });\n  }\n\n  // The catalog needs a session. With no session (401) or any other error, the result is an empty list.\n  public async programs(): Promise<IProgram[]> {\n    const response = await this.client(`${__API_HOST__}/api/programs`, { credentials: \"include\" });\n    if (!response.ok) {\n      return [];\n    }\n    const json = await response.json();\n    return json.programs.map((p: { program: IProgram }) => p.program);\n  }\n\n  public async getMuscles(exercise: string): Promise<IMuscleGeneratorResponse | undefined> {\n    const url = UrlUtils.build(`${__API_HOST__}/api/muscles`);\n    url.searchParams.set(\"exercise\", exercise);\n    const response = await this.client(url.toString(), { credentials: \"include\" });\n    if (response.ok) {\n      const json: { data: IMuscleGeneratorResponse } = await response.json();\n      return json.data;\n    } else {\n      return undefined;\n    }\n  }\n\n  public async *streamAiLiftoscriptProgram(\n    input: string\n  ): AsyncGenerator<{ type: \"progress\" | \"result\" | \"error\" | \"retry\" | \"finish\"; data: string }, void, unknown> {\n    try {\n      const url = `${__STREAMING_API_HOST__}/stream/ai/liftoscript`;\n\n      const response = await this.client(url, {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ input }),\n        credentials: \"include\",\n      });\n\n      if (!response.ok && response.status !== 402) {\n        yield { type: \"error\", data: `HTTP ${response.status}: ${response.statusText}` };\n        return;\n      }\n\n      const reader = response.body?.getReader();\n      if (!reader) {\n        yield { type: \"error\", data: \"No response body\" };\n        return;\n      }\n\n      const decoder = new TextDecoder();\n      let buffer = \"\";\n\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) {\n          break;\n        }\n\n        buffer += decoder.decode(value, { stream: true });\n        const lines = buffer.split(\"\\n\");\n        buffer = lines.pop() || \"\";\n\n        for (const line of lines) {\n          if (line.trim() === \"\") {\n            continue;\n          }\n          if (line.startsWith(\"data: \")) {\n            const data = line.slice(6);\n            if (data === \"[DONE]\") {\n              return;\n            }\n            try {\n              const json = JSON.parse(data);\n              yield json;\n            } catch (e) {\n              console.error(\"Failed to parse SSE data:\", e, data);\n            }\n          }\n        }\n      }\n    } catch (error) {\n      yield { type: \"error\", data: error instanceof Error ? error.message : \"Unknown error\" };\n    }\n  }\n}\n","import { IState } from \"@shared/models/state\";\nimport { Progress } from \"@shared/models/progress\";\nimport { WorkoutLock } from \"@shared/models/workoutLock\";\nimport { IHistoryRecord } from \"@shared/types\";\n\nexport namespace RecordLock {\n  // The one lock reader for the client. It reads the snapshot (the server copy), never `state.progress`.\n  export function isLocked(\n    state: Pick<IState, \"notSynced\" | \"snapshot\">,\n    record: IHistoryRecord,\n    time: number\n  ): boolean {\n    if (Progress.isCurrent(record)) {\n      return false;\n    }\n    const key = `history.${record.id}`;\n    if (state.notSynced?.includes(key)) {\n      return false;\n    }\n    const snapshotRecord = state.snapshot?.values[key] as IHistoryRecord | undefined;\n    return WorkoutLock.isLocked(snapshotRecord ?? record, time);\n  }\n}\n","import { tags as t } from \"@lezer/highlight\";\n\nexport enum PlannerNodeName {\n  Program = \"Program\",\n  LineComment = \"LineComment\",\n  TripleLineComment = \"TripleLineComment\",\n  Week = \"Week\",\n  WeekProperty = \"WeekProperty\",\n  Day = \"Day\",\n  ExerciseExpression = \"ExerciseExpression\",\n  ExerciseName = \"ExerciseName\",\n  NonSeparator = \"NonSeparator\",\n  Repeat = \"Repeat\",\n  Rep = \"Rep\",\n  Int = \"Int\",\n  RepRange = \"RepRange\",\n  SectionSeparator = \"SectionSeparator\",\n  ExerciseSection = \"ExerciseSection\",\n  ExerciseProperty = \"ExerciseProperty\",\n  ExercisePropertyName = \"ExercisePropertyName\",\n  Keyword = \"Keyword\",\n  FunctionExpression = \"FunctionExpression\",\n  FunctionName = \"FunctionName\",\n  FunctionArgument = \"FunctionArgument\",\n  Number = \"Number\",\n  Plus = \"Plus\",\n  PosNumber = \"PosNumber\",\n  Float = \"Float\",\n  Weight = \"Weight\",\n  Percentage = \"Percentage\",\n  Rpe = \"Rpe\",\n  KeyValue = \"KeyValue\",\n  Liftoscript = \"Liftoscript\",\n  ReuseLiftoscript = \"ReuseLiftoscript\",\n  ReuseSection = \"ReuseSection\",\n  WarmupExerciseSets = \"WarmupExerciseSets\",\n  WarmupExerciseSet = \"WarmupExerciseSet\",\n  WarmupSetPart = \"WarmupSetPart\",\n  None = \"None\",\n  ExerciseSets = \"ExerciseSets\",\n  CurrentVariation = \"CurrentVariation\",\n  ExerciseSet = \"ExerciseSet\",\n  Timer = \"Timer\",\n  SetTimer = \"SetTimer\",\n  Auto = \"Auto\",\n  SetPart = \"SetPart\",\n  WeightWithPlus = \"WeightWithPlus\",\n  PercentageWithPlus = \"PercentageWithPlus\",\n  SetLabel = \"SetLabel\",\n  ReuseSectionWithWeekDay = \"ReuseSectionWithWeekDay\",\n  WeekDay = \"WeekDay\",\n  WeekOrDay = \"WeekOrDay\",\n  Current = \"Current\",\n  Superset = \"Superset\",\n  SupersetKeyword = \"SupersetKeyword\",\n  EmptyExpression = \"EmptyExpression\",\n}\n\nexport const plannerExerciseStyles = {\n  [`${[PlannerNodeName.SetPart]}/...`]: t.atom,\n  [`${[PlannerNodeName.WarmupSetPart]}/...`]: t.atom,\n  [`${[PlannerNodeName.Rpe]}/...`]: t.number,\n  [`${[PlannerNodeName.Timer]}/...`]: t.keyword,\n  [PlannerNodeName.SetTimer]: t.keyword,\n  [PlannerNodeName.Auto]: t.keyword,\n  [`${[PlannerNodeName.Weight]}/...`]: t.number,\n  [`${[PlannerNodeName.Percentage]}/...`]: t.number,\n  [PlannerNodeName.LineComment]: t.lineComment,\n  [PlannerNodeName.TripleLineComment]: t.blockComment,\n  [PlannerNodeName.SupersetKeyword]: t.keyword,\n  [PlannerNodeName.SectionSeparator]: t.lineComment,\n  [`${[PlannerNodeName.ExercisePropertyName]}/...`]: t.keyword,\n  [`${[PlannerNodeName.FunctionName]}/...`]: t.attributeName,\n  [`${[PlannerNodeName.FunctionArgument]}/...`]: t.attributeValue,\n  [PlannerNodeName.None]: t.atom,\n  [PlannerNodeName.Week]: t.annotation,\n  [PlannerNodeName.WeekProperty]: t.keyword,\n  [PlannerNodeName.Day]: t.docComment,\n  [PlannerNodeName.WeekDay]: t.atom,\n  [PlannerNodeName.Repeat]: t.atom,\n};\n","import{options as r,Fragment as e}from\"preact\";export{Fragment}from\"preact\";var t=/[\"&<]/;function n(r){if(0===r.length||!1===t.test(r))return r;for(var e=0,n=0,o=\"\",f=\"\";n<r.length;n++){switch(r.charCodeAt(n)){case 34:f=\"&quot;\";break;case 38:f=\"&amp;\";break;case 60:f=\"&lt;\";break;default:continue}n!==e&&(o+=r.slice(e,n)),o+=f,e=n+1}return n!==e&&(o+=r.slice(e,n)),o}var o=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,f=0,i=Array.isArray;function u(e,t,n,o,i,u){t||(t={});var a,c,p=t;if(\"ref\"in p)for(c in p={},t)\"ref\"==c?a=t[c]:p[c]=t[c];var l={type:e,props:p,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--f,__i:-1,__u:0,__source:i,__self:u};if(\"function\"==typeof e&&(a=e.defaultProps))for(c in a)void 0===p[c]&&(p[c]=a[c]);return r.vnode&&r.vnode(l),l}function a(r){var t=u(e,{tpl:r,exprs:[].slice.call(arguments,1)});return t.key=t.__v,t}var c={},p=/[A-Z]/g;function l(e,t){if(r.attr){var f=r.attr(e,t);if(\"string\"==typeof f)return f}if(t=function(r){return null!==r&&\"object\"==typeof r&&\"function\"==typeof r.valueOf?r.valueOf():r}(t),\"ref\"===e||\"key\"===e)return\"\";if(\"style\"===e&&\"object\"==typeof t){var i=\"\";for(var u in t){var a=t[u];if(null!=a&&\"\"!==a){var l=\"-\"==u[0]?u:c[u]||(c[u]=u.replace(p,\"-$&\").toLowerCase()),s=\";\";\"number\"!=typeof a||l.startsWith(\"--\")||o.test(l)||(s=\"px;\"),i=i+l+\":\"+a+s}}return e+'=\"'+n(i)+'\"'}return null==t||!1===t||\"function\"==typeof t||\"object\"==typeof t?\"\":!0===t?e:e+'=\"'+n(\"\"+t)+'\"'}function s(r){if(null==r||\"boolean\"==typeof r||\"function\"==typeof r)return null;if(\"object\"==typeof r){if(void 0===r.constructor)return r;if(i(r)){for(var e=0;e<r.length;e++)r[e]=s(r[e]);return r}}return n(\"\"+r)}export{u as jsx,l as jsxAttr,u as jsxDEV,s as jsxEscape,a as jsxTemplate,u as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import { Exercise } from \"@shared/models/exercise\";\nimport { ExerciseImageUtils } from \"@shared/models/exerciseImage\";\nimport { ProgramExercise } from \"@shared/models/programExercise\";\nimport { Progress } from \"@shared/models/progress\";\nimport { ISetsStatus, Reps } from \"@shared/models/set\";\nimport { Weight } from \"@shared/models/weight\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { IHistoryRecord, ISettings } from \"@shared/types\";\nimport { n } from \"@shared/utils/math\";\nimport { SendMessage } from \"./sendMessage\";\nimport { UrlUtils } from \"@shared/utils/url\";\n\ndeclare const __HOST__: string;\n\ninterface ILiveActivitySet {\n  status: ISetsStatus;\n  isWarmup: boolean;\n}\n\ninterface ILiveActivityEntry {\n  exerciseName: string;\n  currentSet: number;\n  totalSets: number;\n  completedSets: ILiveActivitySet[];\n  canCompleteFromLiveActivity: boolean;\n  isWarmup: boolean;\n  entryIndex: number;\n  setIndex: number;\n\n  exerciseImageUrl?: string;\n  targetReps?: string;\n  targetWeight?: string;\n  targetRPE?: string;\n  targetTimer?: string;\n  plates?: string;\n  currentWeight?: string;\n  currentReps?: string;\n}\n\ninterface ILiveActivityRest {\n  restTimerSince: number;\n  restTimer: number;\n}\n\ninterface ILiveActivityState {\n  restTimer?: ILiveActivityRest;\n  historyEntryState?: ILiveActivityEntry;\n  workoutStartTimestamp: number;\n  ignoreDoNotDisturb: boolean;\n}\n\nexport class LiveActivityManager {\n  private static getLiveActivityEntry(\n    progress: IHistoryRecord,\n    entryIndex: number | undefined,\n    setIndex: number | undefined,\n    programExercise: IPlannerProgramExercise | undefined,\n    settings: ISettings\n  ): ILiveActivityEntry | undefined {\n    if (entryIndex == null || setIndex == null) {\n      return undefined;\n    }\n    const entry = progress.entries[entryIndex];\n    if (!entry) {\n      return undefined;\n    }\n    const exercise = Exercise.get(entry.exercise, settings.exercises);\n    const allSets = [...entry.warmupSets, ...entry.sets];\n    const set = allSets[setIndex];\n    if (setIndex === -1 || !set) {\n      return undefined;\n    }\n    const isNextSetWarmup = setIndex < entry.warmupSets.length;\n    const plates = set.weight\n      ? Weight.calculatePlates(set.weight, settings, set.weight?.unit || settings.units, entry.exercise)\n      : undefined;\n    let exerciseImageUrl = ExerciseImageUtils.url(exercise, \"small\", settings);\n    if (exerciseImageUrl) {\n      exerciseImageUrl = UrlUtils.build(exerciseImageUrl, __HOST__)?.toString();\n    }\n    const hasUserPromptedVars = !!(programExercise && ProgramExercise.hasUserPromptedVars(programExercise));\n    const canCompleteFromLiveActivity = !Progress.shouldShowAmrapModal(\n      entry,\n      isNextSetWarmup ? setIndex : setIndex - entry.warmupSets.length,\n      isNextSetWarmup ? \"warmup\" : \"workout\",\n      hasUserPromptedVars,\n      settings\n    );\n\n    const isUnilateral = Exercise.getIsUnilateral(entry.exercise, settings);\n    const currentReps =\n      isUnilateral && set.completedRepsLeft != null\n        ? `${set.completedRepsLeft}/${set.completedReps ?? set.reps ?? 0}`\n        : (set.completedReps ?? set.reps);\n    const currentWeight = set.completedWeight ?? set.weight;\n    const state: ILiveActivityEntry = {\n      exerciseName: Exercise.fullName(exercise, settings),\n      exerciseImageUrl,\n      currentSet: setIndex + 1,\n      totalSets: allSets.length,\n      entryIndex: progress.entries.indexOf(entry),\n      setIndex,\n      completedSets: allSets.map((s, i) => ({\n        status: Reps.setsStatus([s]),\n        isWarmup: i < entry.warmupSets.length,\n      })),\n      targetReps: set.reps ? `${n(set.reps)}${set.isAmrap ? \"+\" : \"\"}` : undefined,\n      targetWeight: set.weight ? `${Weight.print(set.weight)}${set.askWeight ? \"+\" : \"\"}` : undefined,\n      targetRPE: set.rpe != null ? `${n(set.rpe)}${set.logRpe ? \"+\" : \"\"}` : undefined,\n      targetTimer: set.timer != null ? set.timer.toString() : undefined,\n      plates:\n        (plates?.plates || []).length > 0\n          ? Weight.formatOneSide(settings, plates?.plates || [], entry.exercise)\n          : \"None\",\n      currentWeight: currentWeight != null ? Weight.print(currentWeight) : undefined,\n      currentReps: currentReps != null ? currentReps.toString() : undefined,\n      isWarmup: isNextSetWarmup,\n      canCompleteFromLiveActivity,\n    };\n    return state;\n  }\n\n  public static updateLiveActivity(\n    progress: IHistoryRecord,\n    entryIndex: number | undefined,\n    setIndex: number | undefined,\n    restTimer: number | undefined,\n    restTimerSince: number | undefined,\n    programExercise: IPlannerProgramExercise | undefined,\n    settings: ISettings\n  ): void {\n    const liveActivityEntry = this.getLiveActivityEntry(progress, entryIndex, setIndex, programExercise, settings);\n    const attributes: ILiveActivityState = {\n      workoutStartTimestamp: progress.startTime,\n      historyEntryState: liveActivityEntry,\n      restTimer:\n        progress.timerSince != null && progress.timer != null\n          ? {\n              restTimerSince: restTimerSince ?? progress.timerSince,\n              restTimer: restTimer ?? progress.timer,\n            }\n          : undefined,\n      ignoreDoNotDisturb: !!settings.ignoreDoNotDisturb,\n    };\n    SendMessage.print(\n      `Main App: Updating live activity for ${liveActivityEntry?.exerciseName} (${liveActivityEntry?.entryIndex}/${liveActivityEntry?.setIndex})`\n    );\n    SendMessage.toIosAndAndroid({ type: \"updateLiveActivity\", data: JSON.stringify(attributes) });\n  }\n\n  public static updateLiveActivityForNextEntry(\n    progress: IHistoryRecord,\n    entryIndex: number,\n    mode: \"workout\" | \"warmup\",\n    programExercise: IPlannerProgramExercise | undefined,\n    settings: ISettings\n  ): void {\n    const currentEntry = progress.entries[entryIndex];\n    if (!currentEntry) {\n      return;\n    }\n    const nextEntry = Progress.getNextEntry(progress, currentEntry, mode, true);\n    const nextEntryIndex = nextEntry ? progress.entries.indexOf(nextEntry) : undefined;\n    const nextSetIndex = nextEntry ? Reps.findNextSetIndex(nextEntry) : undefined;\n    this.updateLiveActivity(\n      progress,\n      nextEntryIndex,\n      nextSetIndex,\n      progress.timer,\n      progress.timerSince,\n      programExercise,\n      settings\n    );\n  }\n}\n","import { JSX } from \"preact\";\nimport { useEffect, useState } from \"preact/hooks\";\nimport { FooterPage } from \"../../components/footerPage\";\nimport { TopNavMenu } from \"../../components/topNavMenu\";\nimport { IAccount } from \"@shared/models/account\";\n\nexport interface IMainContentProps {\n  client: Window[\"fetch\"];\n  account?: IAccount;\n  userAgent?: string;\n  appUrl?: string;\n  isTrainer?: boolean;\n  trainerEmail?: string;\n}\n\nexport function MainContent(props: IMainContentProps): JSX.Element {\n  const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n  useEffect(() => {\n    const params = new URLSearchParams(window.location.search);\n    const errorType = params.get(\"trainer_login_error\");\n\n    if (errorType === \"expired\") {\n      setErrorMessage(\"Your login link has expired. Please request a new one.\");\n    } else if (errorType === \"invalid\") {\n      setErrorMessage(\"Invalid login link. Please request a new one.\");\n    }\n  }, []);\n\n  const dismissError = (): void => {\n    setErrorMessage(null);\n    const url = new URL(window.location.href);\n    url.searchParams.delete(\"trainer_login_error\");\n    window.history.replaceState({}, \"\", url.toString());\n  };\n\n  return (\n    <div style={{ maxWidth: 1200 }} className=\"mx-auto\">\n      <div className=\"mx-4 md:mx-8\">\n        <TopNavMenu\n          client={props.client}\n          account={props.account}\n          maxWidth={1200}\n          current=\"/about\"\n          appUrl={props.appUrl}\n          isTrainer={props.isTrainer}\n          trainerEmail={props.trainerEmail}\n        />\n        {errorMessage && (\n          <div className=\"p-4 mb-6 rounded-lg bg-background-lighterror\">\n            <div className=\"flex items-start justify-between\">\n              <div className=\"flex items-start\">\n                <div className=\"text-text-error mr-3 font-bold\">⚠</div>\n                <p className=\"text-text-error\">{errorMessage}</p>\n              </div>\n              <button onClick={dismissError} className=\"text-text-error font-bold ml-4\" aria-label=\"Dismiss error\">\n                ✕\n              </button>\n            </div>\n          </div>\n        )}\n        <About />\n        <ExistingClients />\n        <div className=\"pt-8 mt-16 border-t-2 border-border-prominent\">\n          <FooterPage maxWidth={1200} withoutBg={true} withAcknowledgement={true} account={props.account} />\n        </div>\n      </div>\n    </div>\n  );\n}\n\nfunction About(): JSX.Element {\n  return (\n    <div className=\"mx-auto mt-12 mb-16\" style={{ maxWidth: \"60rem\" }}>\n      <h1 className=\"mb-6 text-5xl font-bold leading-tight\">Train with Kurtis</h1>\n      <p className=\"mb-6 text-lg leading-relaxed\">\n        Kurtis is a Sydney-based fitness consultant and coach who believes that meaningful strength training isn't about\n        following generic programs - it's about understanding your unique body, goals, and context. He specializes in\n        designing fully individualized training systems that honor each person's specific needs and constraints.\n      </p>\n      <p className=\"text-lg leading-relaxed\">\n        Built on rigorous science and informed by years of coaching experience, Kurtis's approach integrates\n        evidence-based strength methodologies with genuine attention to mobility, movement quality, and long-term\n        quality of life. He believes that inclusive, sustainable training is how people achieve lasting strength and\n        build confidence in their bodies.\n      </p>\n    </div>\n  );\n}\n\nfunction ExistingClients(): JSX.Element {\n  return (\n    <div\n      className=\"mx-auto mt-12 mb-16 p-6 bg-background-subtle rounded-lg border border-border-neutral\"\n      style={{ maxWidth: \"60rem\" }}\n    >\n      <h2 className=\"mb-4 text-2xl font-bold text-text-primary\">Existing Clients</h2>\n      <p className=\"text-text-secondary\">\n        If you're already a client, you can access your personalized training program and workout tracking app by\n        clicking the login button in the top right of this page.\n      </p>\n    </div>\n  );\n}\n\n// function HowItWorks(): JSX.Element {\n//   return (\n//     <div className=\"mx-auto mt-12 mb-16 text-center\" style={{ maxWidth: 800 }}>\n//       <h2 className=\"mb-6 text-3xl font-bold\">Simple Workout Tracking</h2>\n//       <div className=\"flex flex-col gap-6 md:flex-row md:gap-8\">\n//         <div className=\"flex-1\">\n//           <div className=\"mb-2 text-4xl\">💪</div>\n//           <h3 className=\"mb-2 text-xl font-bold\">Track Your Workouts</h3>\n//           <p className=\"text-base\">\n//             Follow your program and log your sets in the gym. The app automatically handles progressive overload.\n//           </p>\n//         </div>\n//         <div className=\"flex-1\">\n//           <div className=\"mb-2 text-4xl\">📊</div>\n//           <h3 className=\"mb-2 text-xl font-bold\">See Your Progress</h3>\n//           <p className=\"text-base\">\n//             View graphs, history, and muscle group volume to track your strength gains over time.\n//           </p>\n//         </div>\n//       </div>\n//     </div>\n//   );\n// }\n","import { JSX } from \"preact\";\nimport { useState } from \"preact/hooks\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\n\ninterface IEmailLoginFormProps {\n  onLogin: (email: string, password: string) => Promise<void>;\n  onForgotPassword: (email: string) => void;\n  onSendMagicLink: (email: string) => void;\n  onBack: () => void;\n  initialEmail?: string;\n  notice?: string;\n}\n\nexport function EmailLoginForm(props: IEmailLoginFormProps): JSX.Element {\n  const [email, setEmail] = useState(props.initialEmail ?? \"\");\n  const [password, setPassword] = useState(\"\");\n  const [isLoading, setIsLoading] = useState(false);\n  const [error, setError] = useState<string | undefined>(undefined);\n\n  const handleSubmit = async (e: Event): Promise<void> => {\n    e.preventDefault();\n    setError(undefined);\n    setIsLoading(true);\n    try {\n      await props.onLogin(email, password);\n    } catch (err) {\n      setError(err instanceof Error ? err.message : \"Failed to sign in\");\n      setIsLoading(false);\n    }\n  };\n\n  return (\n    <div>\n      <h2 className=\"mb-4 text-lg font-bold text-center\">Sign In with Email</h2>\n      {props.notice && (\n        <div\n          className=\"mb-4 p-3 text-sm text-center bg-background-cardpurple text-text-purple rounded-lg border border-border-cardpurple\"\n          data-cy=\"email-login-notice\"\n        >\n          {props.notice}\n        </div>\n      )}\n      {isLoading ? (\n        <div className=\"my-4 text-center\">\n          <IconSpinner width={48} height={48} />\n        </div>\n      ) : (\n        <form onSubmit={handleSubmit}>\n          <div className=\"mb-4\">\n            <Input\n              label=\"Email\"\n              type=\"email\"\n              identifier=\"email-login-email\"\n              isLabelOutside={true}\n              required={true}\n              requiredMessage=\"Email is required\"\n              value={email}\n              changeType=\"oninput\"\n              changeHandler={(result) => {\n                if (result.success) {\n                  setEmail(result.data);\n                }\n              }}\n              placeholder=\"your@email.com\"\n            />\n          </div>\n          <div className=\"mb-4\">\n            <Input\n              label=\"Password\"\n              type=\"password\"\n              identifier=\"email-login-password\"\n              isLabelOutside={true}\n              required={true}\n              requiredMessage=\"Password is required\"\n              value={password}\n              changeType=\"oninput\"\n              changeHandler={(result) => {\n                if (result.success) {\n                  setPassword(result.data);\n                }\n              }}\n              placeholder=\"Enter your password\"\n            />\n          </div>\n          {error && (\n            <div className=\"mb-4 text-sm text-center text-text-error\" data-cy=\"email-login-error\">\n              {error}\n            </div>\n          )}\n          <div className=\"mb-4 text-center\">\n            <Button\n              name=\"email-login-submit\"\n              kind=\"purple\"\n              type=\"submit\"\n              data-cy=\"email-login-submit\"\n              disabled={!email || !password}\n            >\n              Sign In\n            </Button>\n          </div>\n          <div className=\"mb-2 text-center\">\n            <button\n              type=\"button\"\n              className=\"text-sm text-text-link underline\"\n              onClick={() => props.onForgotPassword(email)}\n              data-cy=\"email-login-forgot-password\"\n            >\n              Forgot Password?\n            </button>\n          </div>\n          <div className=\"mb-2 text-center\">\n            <button\n              type=\"button\"\n              className=\"text-sm text-text-link underline\"\n              onClick={() => props.onSendMagicLink(email)}\n              data-cy=\"email-login-magic-link\"\n            >\n              Send Magic Link Instead\n            </button>\n          </div>\n          <div className=\"mt-4 text-center\">\n            <Button\n              name=\"email-login-back\"\n              kind=\"grayv2\"\n              buttonSize=\"md\"\n              onClick={props.onBack}\n              data-cy=\"email-login-back\"\n            >\n              Back\n            </Button>\n          </div>\n        </form>\n      )}\n    </div>\n  );\n}\n","import { StringUtils } from \"@shared/utils/string\";\n\nexport namespace TimeUtils {\n  export function formatHHMM(ms: number): string {\n    const minutes = Math.floor((ms / 1000 / 60) % 60);\n    const hours = Math.floor(ms / 1000 / 60 / 60);\n\n    const result = [StringUtils.pad(hours.toString(), 2), StringUtils.pad(minutes.toString(), 2)].join(\":\");\n\n    return result;\n  }\n\n  export function formatHOrMin(ms: number): { value: string; unit: \"h\" | \"min\" } {\n    const minutes = Math.floor((ms / 1000 / 60) % 60);\n    const hours = Math.floor(ms / 1000 / 60 / 60);\n    if (hours > 0) {\n      return { value: formatHHMM(ms), unit: \"h\" };\n    } else {\n      return { value: `${minutes}`, unit: \"min\" };\n    }\n  }\n\n  export function formatHH(ms: number): string {\n    const hours = Math.floor(ms / 1000 / 60 / 60);\n    return StringUtils.pad(hours.toString(), 2);\n  }\n\n  export function formatMM(ms: number): string {\n    const minutes = Math.floor((ms / 1000 / 60) % 60);\n    return StringUtils.pad(minutes.toString(), 2);\n  }\n\n  export function formatSS(ms: number): string {\n    const seconds = Math.floor((ms / 1000) % 60);\n    return StringUtils.pad(seconds.toString(), 2);\n  }\n\n  export function formatMMSS(ms: number): string {\n    const seconds = Math.floor((ms / 1000) % 60);\n    const minutes = Math.floor((ms / 1000 / 60) % 60);\n    return [StringUtils.pad(minutes.toString(), 2), StringUtils.pad(seconds.toString(), 2)].join(\":\");\n  }\n\n  export function formatUTCHHMM(ms: number): string {\n    const date = new Date(ms);\n    const hours = StringUtils.pad(date.getUTCHours().toString(), 2);\n    const minutes = StringUtils.pad(date.getUTCMinutes().toString(), 2);\n    return [hours, minutes].join(\":\");\n  }\n}\n","\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.dual = exports.getEndomorphismMonoid = exports.SK = exports.hole = exports.constVoid = exports.constUndefined = exports.constNull = exports.constFalse = exports.constTrue = exports.unsafeCoerce = exports.apply = exports.getRing = exports.getSemiring = exports.getMonoid = exports.getSemigroup = exports.getBooleanAlgebra = void 0;\nexports.identity = identity;\nexports.constant = constant;\nexports.flip = flip;\nexports.flow = flow;\nexports.tuple = tuple;\nexports.increment = increment;\nexports.decrement = decrement;\nexports.absurd = absurd;\nexports.tupled = tupled;\nexports.untupled = untupled;\nexports.pipe = pipe;\nexports.not = not;\n// -------------------------------------------------------------------------------------\n// instances\n// -------------------------------------------------------------------------------------\n/**\n * @category instances\n * @since 2.10.0\n */\nvar getBooleanAlgebra = function (B) {\n    return function () { return ({\n        meet: function (x, y) { return function (a) { return B.meet(x(a), y(a)); }; },\n        join: function (x, y) { return function (a) { return B.join(x(a), y(a)); }; },\n        zero: function () { return B.zero; },\n        one: function () { return B.one; },\n        implies: function (x, y) { return function (a) { return B.implies(x(a), y(a)); }; },\n        not: function (x) { return function (a) { return B.not(x(a)); }; }\n    }); };\n};\nexports.getBooleanAlgebra = getBooleanAlgebra;\n/**\n * Unary functions form a semigroup as long as you can provide a semigroup for the codomain.\n *\n * @example\n * import { Predicate, getSemigroup } from 'fp-ts/function'\n * import * as B from 'fp-ts/boolean'\n *\n * const f: Predicate<number> = (n) => n <= 2\n * const g: Predicate<number> = (n) => n >= 0\n *\n * const S1 = getSemigroup(B.SemigroupAll)<number>()\n *\n * assert.deepStrictEqual(S1.concat(f, g)(1), true)\n * assert.deepStrictEqual(S1.concat(f, g)(3), false)\n *\n * const S2 = getSemigroup(B.SemigroupAny)<number>()\n *\n * assert.deepStrictEqual(S2.concat(f, g)(1), true)\n * assert.deepStrictEqual(S2.concat(f, g)(3), true)\n *\n * @category instances\n * @since 2.10.0\n */\nvar getSemigroup = function (S) {\n    return function () { return ({\n        concat: function (f, g) { return function (a) { return S.concat(f(a), g(a)); }; }\n    }); };\n};\nexports.getSemigroup = getSemigroup;\n/**\n * Unary functions form a monoid as long as you can provide a monoid for the codomain.\n *\n * @example\n * import { Predicate } from 'fp-ts/Predicate'\n * import { getMonoid } from 'fp-ts/function'\n * import * as B from 'fp-ts/boolean'\n *\n * const f: Predicate<number> = (n) => n <= 2\n * const g: Predicate<number> = (n) => n >= 0\n *\n * const M1 = getMonoid(B.MonoidAll)<number>()\n *\n * assert.deepStrictEqual(M1.concat(f, g)(1), true)\n * assert.deepStrictEqual(M1.concat(f, g)(3), false)\n *\n * const M2 = getMonoid(B.MonoidAny)<number>()\n *\n * assert.deepStrictEqual(M2.concat(f, g)(1), true)\n * assert.deepStrictEqual(M2.concat(f, g)(3), true)\n *\n * @category instances\n * @since 2.10.0\n */\nvar getMonoid = function (M) {\n    var getSemigroupM = (0, exports.getSemigroup)(M);\n    return function () { return ({\n        concat: getSemigroupM().concat,\n        empty: function () { return M.empty; }\n    }); };\n};\nexports.getMonoid = getMonoid;\n/**\n * @category instances\n * @since 2.10.0\n */\nvar getSemiring = function (S) { return ({\n    add: function (f, g) { return function (x) { return S.add(f(x), g(x)); }; },\n    zero: function () { return S.zero; },\n    mul: function (f, g) { return function (x) { return S.mul(f(x), g(x)); }; },\n    one: function () { return S.one; }\n}); };\nexports.getSemiring = getSemiring;\n/**\n * @category instances\n * @since 2.10.0\n */\nvar getRing = function (R) {\n    var S = (0, exports.getSemiring)(R);\n    return {\n        add: S.add,\n        mul: S.mul,\n        one: S.one,\n        zero: S.zero,\n        sub: function (f, g) { return function (x) { return R.sub(f(x), g(x)); }; }\n    };\n};\nexports.getRing = getRing;\n// -------------------------------------------------------------------------------------\n// utils\n// -------------------------------------------------------------------------------------\n/**\n * @since 2.11.0\n */\nvar apply = function (a) {\n    return function (f) {\n        return f(a);\n    };\n};\nexports.apply = apply;\n/**\n * @since 2.0.0\n */\nfunction identity(a) {\n    return a;\n}\n/**\n * @since 2.0.0\n */\nexports.unsafeCoerce = identity;\n/**\n * @since 2.0.0\n */\nfunction constant(a) {\n    return function () { return a; };\n}\n/**\n * A thunk that returns always `true`.\n *\n * @since 2.0.0\n */\nexports.constTrue = constant(true);\n/**\n * A thunk that returns always `false`.\n *\n * @since 2.0.0\n */\nexports.constFalse = constant(false);\n/**\n * A thunk that returns always `null`.\n *\n * @since 2.0.0\n */\nexports.constNull = constant(null);\n/**\n * A thunk that returns always `undefined`.\n *\n * @since 2.0.0\n */\nexports.constUndefined = constant(undefined);\n/**\n * A thunk that returns always `void`.\n *\n * @since 2.0.0\n */\nexports.constVoid = exports.constUndefined;\nfunction flip(f) {\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (args.length > 1) {\n            return f(args[1], args[0]);\n        }\n        return function (a) { return f(a)(args[0]); };\n    };\n}\nfunction flow(ab, bc, cd, de, ef, fg, gh, hi, ij) {\n    switch (arguments.length) {\n        case 1:\n            return ab;\n        case 2:\n            return function () {\n                return bc(ab.apply(this, arguments));\n            };\n        case 3:\n            return function () {\n                return cd(bc(ab.apply(this, arguments)));\n            };\n        case 4:\n            return function () {\n                return de(cd(bc(ab.apply(this, arguments))));\n            };\n        case 5:\n            return function () {\n                return ef(de(cd(bc(ab.apply(this, arguments)))));\n            };\n        case 6:\n            return function () {\n                return fg(ef(de(cd(bc(ab.apply(this, arguments))))));\n            };\n        case 7:\n            return function () {\n                return gh(fg(ef(de(cd(bc(ab.apply(this, arguments)))))));\n            };\n        case 8:\n            return function () {\n                return hi(gh(fg(ef(de(cd(bc(ab.apply(this, arguments))))))));\n            };\n        case 9:\n            return function () {\n                return ij(hi(gh(fg(ef(de(cd(bc(ab.apply(this, arguments)))))))));\n            };\n    }\n    return;\n}\n/**\n * @since 2.0.0\n */\nfunction tuple() {\n    var t = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        t[_i] = arguments[_i];\n    }\n    return t;\n}\n/**\n * @since 2.0.0\n */\nfunction increment(n) {\n    return n + 1;\n}\n/**\n * @since 2.0.0\n */\nfunction decrement(n) {\n    return n - 1;\n}\n/**\n * @since 2.0.0\n */\nfunction absurd(_) {\n    throw new Error('Called `absurd` function which should be uncallable');\n}\n/**\n * Creates a tupled version of this function: instead of `n` arguments, it accepts a single tuple argument.\n *\n * @example\n * import { tupled } from 'fp-ts/function'\n *\n * const add = tupled((x: number, y: number): number => x + y)\n *\n * assert.strictEqual(add([1, 2]), 3)\n *\n * @since 2.4.0\n */\nfunction tupled(f) {\n    return function (a) { return f.apply(void 0, a); };\n}\n/**\n * Inverse function of `tupled`\n *\n * @since 2.4.0\n */\nfunction untupled(f) {\n    return function () {\n        var a = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            a[_i] = arguments[_i];\n        }\n        return f(a);\n    };\n}\nfunction pipe(a, ab, bc, cd, de, ef, fg, gh, hi) {\n    switch (arguments.length) {\n        case 1:\n            return a;\n        case 2:\n            return ab(a);\n        case 3:\n            return bc(ab(a));\n        case 4:\n            return cd(bc(ab(a)));\n        case 5:\n            return de(cd(bc(ab(a))));\n        case 6:\n            return ef(de(cd(bc(ab(a)))));\n        case 7:\n            return fg(ef(de(cd(bc(ab(a))))));\n        case 8:\n            return gh(fg(ef(de(cd(bc(ab(a)))))));\n        case 9:\n            return hi(gh(fg(ef(de(cd(bc(ab(a))))))));\n        default: {\n            var ret = arguments[0];\n            for (var i = 1; i < arguments.length; i++) {\n                ret = arguments[i](ret);\n            }\n            return ret;\n        }\n    }\n}\n/**\n * Type hole simulation\n *\n * @since 2.7.0\n */\nexports.hole = absurd;\n/**\n * @since 2.11.0\n */\nvar SK = function (_, b) { return b; };\nexports.SK = SK;\n/**\n * Use `Predicate` module instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nfunction not(predicate) {\n    return function (a) { return !predicate(a); };\n}\n/**\n * Use `Endomorphism` module instead.\n *\n * @category zone of death\n * @since 2.10.0\n * @deprecated\n */\nvar getEndomorphismMonoid = function () { return ({\n    concat: function (first, second) { return flow(first, second); },\n    empty: identity\n}); };\nexports.getEndomorphismMonoid = getEndomorphismMonoid;\n/** @internal */\nvar dual = function (arity, body) {\n    var isDataFirst = typeof arity === 'number' ? function (args) { return args.length >= arity; } : arity;\n    return function () {\n        var args = Array.from(arguments);\n        if (isDataFirst(arguments)) {\n            return body.apply(this, args);\n        }\n        return function (self) { return body.apply(void 0, __spreadArray([self], args, false)); };\n    };\n};\nexports.dual = dual;\n","import { IProgramState, IProgramExerciseWarmupSet, ISettings, IProgramSet, IPercentage } from \"../types\";\nimport { IEvaluatedProgram, Program } from \"./program\";\nimport { ProgramSet } from \"./programSet\";\nimport { IWeight } from \"../types\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { Weight } from \"./weight\";\nimport { Exercise } from \"./exercise\";\nimport { CollectionUtils } from \"../utils/collection\";\nimport { ScriptRunner } from \"../parser\";\nimport { IAssignmentOp, ILiftoscriptEvaluatorUpdate } from \"../liftoscriptEvaluator\";\nimport { MathUtils } from \"../utils/math\";\nimport {\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseEvaluatedSet,\n  IPlannerProgramExerciseWithType,\n} from \"@client/pages/planner/models/types\";\nimport { PlannerProgramExercise } from \"@client/pages/planner/models/plannerProgramExercise\";\nimport { PP } from \"./pp\";\n\nexport interface IWeightChange {\n  originalWeight: IWeight | IPercentage;\n  weight: IWeight | IPercentage;\n  current: boolean;\n}\n\nexport interface IProgramExerciseExample {\n  title: string;\n  description: string;\n  sets: IProgramSet[];\n  state: IProgramState;\n  finishDayExpr: string;\n  rules: {\n    sets: \"keep\" | \"replace\";\n    reps: \"keep\" | \"keep_if_has_vars\" | \"replace\";\n    weight: \"keep\" | \"keep_if_has_vars\" | \"replace\";\n  };\n}\n\nexport namespace ProgramExercise {\n  export function hasUserPromptedVars(programExercise: IPlannerProgramExercise): boolean {\n    const stateMetadata = PlannerProgramExercise.getStateMetadata(programExercise) || {};\n    return ObjectUtils.keys(stateMetadata).some((key) => stateMetadata[key]?.userPrompted);\n  }\n\n  export function getQuickAddSets(programExercise: IPlannerProgramExercise): boolean {\n    return PlannerProgramExercise.sets(programExercise).some((set) => !!set.repRange?.isQuickAddSet);\n  }\n\n  export function getEnableRpe(programExercise: IPlannerProgramExercise): boolean {\n    return PlannerProgramExercise.sets(programExercise).some((set) => set.rpe != null);\n  }\n\n  function warmupSetToKey(set: IProgramExerciseWarmupSet): string {\n    return `${set.minReps}-${set.reps}-${Weight.print(set.threshold)}-${Weight.printOrNumber(set.value)}`;\n  }\n\n  export function groupWarmupsSets(sets: IProgramExerciseWarmupSet[]): [IProgramExerciseWarmupSet, number][] {\n    let lastKey: string | undefined;\n    const groups: [IProgramExerciseWarmupSet, number][] = [];\n    for (const set of sets) {\n      const key = warmupSetToKey(set);\n      if (lastKey == null || lastKey !== key) {\n        groups.push([set, 0]);\n      }\n      groups[groups.length - 1][1] += 1;\n      lastKey = key;\n    }\n    return groups;\n  }\n\n  export function approxTimeMs(programExercise: IPlannerProgramExercise, settings: ISettings): number {\n    return (\n      PlannerProgramExercise.currentEvaluatedSetVariation(programExercise)?.sets.reduce(\n        (memo, set) => memo + ProgramSet.approxTimeMs(set, settings),\n        0\n      ) || 0\n    );\n  }\n\n  export function doesUse1RM(programExercise: IPlannerProgramExercise): boolean {\n    const usesPercentageWeights = programExercise.evaluatedSetVariations.some((v) => {\n      return v.sets.some((set) => {\n        return Weight.isPct(set.weight) || ProgramSet.isEligibleForInferredWeight(set);\n      });\n    });\n    const usesRM1Var = ProgramExercise.isUsingVariable(programExercise, \"rm1\");\n    return usesPercentageWeights || usesRM1Var;\n  }\n\n  export function isUsingVariable(programExercise: IPlannerProgramExercise, name: string): boolean {\n    const expressions = CollectionUtils.compact([\n      PlannerProgramExercise.getProgressScript(programExercise),\n      PlannerProgramExercise.getUpdateScript(programExercise),\n    ]);\n    return expressions.some((e) => ScriptRunner.hasKeyword(e, name));\n  }\n\n  export function weightChanges(program: IEvaluatedProgram, programExerciseKey: string): IWeightChange[] {\n    const results: Record<string, IWeightChange> = {};\n    PP.iterate2(program.weeks, (exercise) => {\n      if (exercise.key === programExerciseKey) {\n        const currentVariationIndex = PlannerProgramExercise.currentEvaluatedSetVariationIndex(exercise);\n        for (let variationIndex = 0; variationIndex < exercise.evaluatedSetVariations.length; variationIndex += 1) {\n          const variation = exercise.evaluatedSetVariations[variationIndex];\n          for (let setIndex = 0; setIndex < variation.sets.length; setIndex += 1) {\n            const set = variation.sets[setIndex];\n            if (set.weight) {\n              const key = Weight.print(set.weight);\n              results[key] = {\n                originalWeight: set.weight,\n                weight: set.weight,\n                current: results[key]?.current || variationIndex + 1 === currentVariationIndex,\n              };\n            }\n          }\n        }\n      }\n    });\n    return CollectionUtils.sortBy(ObjectUtils.values(results), \"current\", true);\n  }\n\n  export function applyVariables(\n    programExerciseKey: string,\n    program: IEvaluatedProgram,\n    updates: ILiftoscriptEvaluatorUpdate[],\n    settings: ISettings,\n    loggedWeights: (IWeight | undefined)[] = []\n  ): void {\n    // A blank set builds on the load logged for the same set, else on the first logged load\n    const firstLoggedWeight = loggedWeights.find((w) => w != null);\n    for (const update of updates) {\n      if (update.type === \"level\") {\n        continue;\n      }\n      const key = update.type;\n      const value = update.value;\n      const target = value.target;\n      const [week, day, variation, set] = target;\n      let dayIndex = 0;\n      for (let weekIndex = 0; weekIndex < program.weeks.length; weekIndex += 1) {\n        const programWeek = program.weeks[weekIndex];\n        for (let dayInWeekIndex = 0; dayInWeekIndex < programWeek.days.length; dayInWeekIndex += 1) {\n          const programDay = programWeek.days[dayInWeekIndex];\n          const dayExercises = Program.getProgramDayExercises(programDay);\n          for (const exercise of dayExercises) {\n            if (exercise.key !== programExerciseKey) {\n              continue;\n            }\n            for (let variationIndex = 0; variationIndex < exercise.evaluatedSetVariations.length; variationIndex += 1) {\n              const setVariation = exercise.evaluatedSetVariations[variationIndex];\n              const sets = setVariation.sets;\n              if (\n                (week === \"*\" || week === weekIndex + 1) &&\n                (day === \"*\" || day === dayInWeekIndex + 1) &&\n                (variation === \"*\" || variation === variationIndex + 1)\n              ) {\n                if (key === \"numberOfSets\" && typeof value.value === \"number\") {\n                  const newValue = MathUtils.applyOp(sets.length, value.value, value.op);\n                  const defaultSet: IPlannerProgramExerciseEvaluatedSet = {\n                    maxrep: 1,\n                    weight: Weight.build(100, \"lb\"),\n                    logRpe: false,\n                    isAmrap: false,\n                    isQuickAddSet: false,\n                    askWeight: false,\n                  };\n                  const lastSet = sets[sets.length - 1] || defaultSet;\n                  sets.splice(newValue);\n                  for (let i = sets.length; i < newValue; i += 1) {\n                    sets.push(ObjectUtils.clone(lastSet));\n                  }\n                }\n              }\n              for (let setIndex = 0; setIndex < sets.length; setIndex += 1) {\n                if (\n                  (week === \"*\" || week === weekIndex + 1) &&\n                  (day === \"*\" || day === dayInWeekIndex + 1) &&\n                  (variation === \"*\" || variation === variationIndex + 1) &&\n                  (set === \"*\" || set === setIndex + 1)\n                ) {\n                  if (key === \"RPE\") {\n                    operation(exercise, sets[setIndex], settings, \"rpe\", value.value, value.op);\n                  } else if (key === \"reps\") {\n                    operation(exercise, sets[setIndex], settings, \"maxrep\", value.value, value.op);\n                  } else if (key === \"minReps\") {\n                    operation(exercise, sets[setIndex], settings, \"minrep\", value.value, value.op);\n                  } else if (key === \"timers\") {\n                    operation(exercise, sets[setIndex], settings, \"timer\", value.value, value.op);\n                  } else if (key === \"setTimers\") {\n                    operation(exercise, sets[setIndex], settings, \"setTimer\", value.value, value.op);\n                  } else if (key === \"weights\") {\n                    const loggedWeight = loggedWeights[setIndex] ?? firstLoggedWeight;\n                    operation(exercise, sets[setIndex], settings, \"weight\", value.value, value.op, loggedWeight);\n                  } else if (key === \"amraps\") {\n                    operation(exercise, sets[setIndex], settings, \"isAmrap\", value.value, value.op);\n                  } else if (key === \"logrpes\") {\n                    operation(exercise, sets[setIndex], settings, \"logRpe\", value.value, value.op);\n                  } else if (key === \"askweights\") {\n                    operation(exercise, sets[setIndex], settings, \"askWeight\", value.value, value.op);\n                  }\n                }\n              }\n            }\n            if ((week === \"*\" || week === weekIndex + 1) && (day === \"*\" || day === dayInWeekIndex + 1)) {\n              if (key === \"setVariationIndex\" && typeof update.value.value === \"number\") {\n                let indexValue: number;\n                if (update.value.op === \"=\") {\n                  indexValue = update.value.value - 1;\n                } else {\n                  const currentSetVariationIndex = PlannerProgramExercise.currentEvaluatedSetVariationIndex(exercise);\n                  indexValue = Weight.applyOp(\n                    undefined,\n                    currentSetVariationIndex,\n                    update.value.value,\n                    update.value.op\n                  ) as number;\n                }\n                indexValue = indexValue % exercise.evaluatedSetVariations.length;\n                exercise.evaluatedSetVariations.forEach((s) => (s.isCurrent = false));\n                const sv = exercise.evaluatedSetVariations[indexValue];\n                if (sv != null) {\n                  sv.isCurrent = true;\n                }\n              } else if (key === \"descriptionIndex\" && typeof update.value.value === \"number\") {\n                let indexValue: number;\n                if (update.value.op === \"=\") {\n                  indexValue = update.value.value - 1;\n                } else {\n                  const currentDescriptionIndex = PlannerProgramExercise.currentDescriptionIndex(exercise);\n                  indexValue = Weight.applyOp(\n                    undefined,\n                    currentDescriptionIndex,\n                    update.value.value,\n                    update.value.op\n                  ) as number;\n                }\n                indexValue = indexValue % exercise.descriptions.values.length;\n                exercise.descriptions.values.forEach((s) => (s.isCurrent = false));\n                const d = exercise.descriptions.values[indexValue];\n                if (d != null) {\n                  d.isCurrent = true;\n                }\n              }\n            }\n          }\n          dayIndex += 1;\n        }\n      }\n    }\n  }\n\n  function operation(\n    programExercise: IPlannerProgramExerciseWithType,\n    set: IPlannerProgramExerciseEvaluatedSet,\n    settings: ISettings,\n    key: \"maxrep\" | \"minrep\" | \"weight\" | \"rpe\" | \"timer\" | \"setTimer\" | \"logRpe\" | \"isAmrap\" | \"askWeight\",\n    value: IWeight | IPercentage | number,\n    op: IAssignmentOp,\n    loggedWeight?: IWeight\n  ): void {\n    if (op === \"=\") {\n      if (key === \"weight\" && (Weight.is(value) || Weight.isPct(value))) {\n        set[key] = value;\n      } else if (\n        typeof value === \"number\" &&\n        (key === \"maxrep\" || key === \"minrep\" || key === \"timer\" || key === \"setTimer\" || key === \"rpe\")\n      ) {\n        set[key] = value;\n      } else if (typeof value === \"number\" && (key === \"askWeight\" || key === \"isAmrap\" || key === \"logRpe\")) {\n        set[key] = value !== 0;\n      }\n    } else {\n      const onerm = Exercise.onerm(programExercise.exerciseType, settings);\n      let oldValue = typeof set[key] === \"boolean\" ? (set[key] ? 1 : 0) : set[key];\n      if (oldValue == null && key === \"weight\" && loggedWeight != null) {\n        oldValue = loggedWeight;\n      } else if (oldValue == null && ProgramSet.isEligibleForInferredWeight(set)) {\n        const inferredWeight = ProgramSet.getEvaluatedWeight(set, programExercise.exerciseType, settings);\n        oldValue = inferredWeight;\n      }\n      const newValue = Weight.applyOp(onerm, oldValue ?? 0, value, op);\n      if (key === \"weight\" && (Weight.is(newValue) || Weight.isPct(newValue))) {\n        set[key] = newValue;\n      } else if (\n        typeof newValue === \"number\" &&\n        (key === \"maxrep\" || key === \"minrep\" || key === \"timer\" || key === \"setTimer\" || key === \"rpe\")\n      ) {\n        set[key] = newValue;\n      } else if (typeof newValue === \"number\" && (key === \"askWeight\" || key === \"isAmrap\" || key === \"logRpe\")) {\n        set[key] = newValue !== 0;\n      }\n    }\n  }\n}\n","import { JSX } from \"preact\";\nimport { Tailwind } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  size?: number;\n  className?: string;\n  color?: string;\n}\n\nexport function IconUser(props: IProps): JSX.Element {\n  const color = props.color || Tailwind.semantic().icon.neutral;\n  const size = props.size || 24;\n  return (\n    <svg\n      style={props.style}\n      className={`inline-block ${props.className}`}\n      width={size}\n      height={size}\n      viewBox=\"0 0 48 48\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        fill-rule=\"evenodd\"\n        clip-rule=\"evenodd\"\n        d=\"M24 4.5C13.2304 4.5 4.5 13.2304 4.5 24C4.5 28.3561 5.92835 32.3786 8.34225 35.6246C13.0342 33.2014 18.3593 31.8333 24 31.8333C29.6407 31.8333 34.9658 33.2014 39.6577 35.6246C42.0716 32.3786 43.5 28.3561 43.5 24C43.5 13.2304 34.7696 4.5 24 4.5ZM41.2135 38.4903C44.5122 34.5756 46.5 29.5199 46.5 24C46.5 11.5736 36.4264 1.5 24 1.5C11.5736 1.5 1.5 11.5736 1.5 24C1.5 29.5199 3.48773 34.5756 6.78646 38.4902C6.79811 38.5045 6.81 38.5186 6.8221 38.5324C10.9493 43.4061 17.1134 46.5 24 46.5C30.8863 46.5 37.0501 43.4064 41.1774 38.5331C41.1896 38.5191 41.2017 38.5048 41.2135 38.4903ZM37.6176 37.9574C33.5048 35.9563 28.8853 34.8333 24 34.8333C19.1147 34.8333 14.4952 35.9563 10.3824 37.9575C13.8968 41.3869 18.7016 43.5 24 43.5C29.2984 43.5 34.1032 41.3869 37.6176 37.9574ZM24 13.8333C20.9624 13.8333 18.5 16.2958 18.5 19.3333C18.5 22.3709 20.9624 24.8333 24 24.8333C27.0376 24.8333 29.5 22.3709 29.5 19.3333C29.5 16.2958 27.0376 13.8333 24 13.8333ZM15.5 19.3333C15.5 14.6389 19.3056 10.8333 24 10.8333C28.6944 10.8333 32.5 14.6389 32.5 19.3333C32.5 24.0278 28.6944 27.8333 24 27.8333C19.3056 27.8333 15.5 24.0278 15.5 19.3333Z\"\n        fill={color}\n      />\n    </svg>\n  );\n}\n","import{Component as n,createElement as t,options as e,toChildArray as r,Fragment as u,render as o,hydrate as i,createContext as l,createRef as c,cloneElement as f}from\"preact\";export{Component,Fragment,createContext,createElement,createRef}from\"preact\";import{useState as a,useLayoutEffect as s,useEffect as h,useCallback as v,useContext as d,useDebugValue as m,useId as p,useImperativeHandle as y,useMemo as _,useReducer as b,useRef as S}from\"preact/hooks\";export*from\"preact/hooks\";function g(n,t){for(var e in t)n[e]=t[e];return n}function E(n,t){for(var e in n)if(\"__source\"!==e&&!(e in t))return!0;for(var r in t)if(\"__source\"!==r&&n[r]!==t[r])return!0;return!1}function C(n,t){var e=t(),r=a({t:{__:e,u:t}}),u=r[0].t,o=r[1];return s(function(){u.__=e,u.u=t,R(u)&&o({t:u})},[n,e,t]),h(function(){return R(u)&&o({t:u}),n(function(){R(u)&&o({t:u})})},[n]),e}function R(n){try{return!((t=n.__)===(e=n.u())&&(0!==t||1/t==1/e)||t!=t&&e!=e)}catch(n){return!0}var t,e}function x(n){n()}function w(n){return n}function k(){return[!1,x]}var I=s;function N(n,t){this.props=n,this.context=t}function M(n,e){function r(n){var t=this.props.ref,r=t==n.ref;return!r&&t&&(t.call?t(null):t.current=null),e?!e(this.props,n)||!r:E(this.props,n)}function u(e){return this.shouldComponentUpdate=r,t(n,e)}return u.displayName=\"Memo(\"+(n.displayName||n.name)+\")\",u.prototype.isReactComponent=!0,u.__f=!0,u.type=n,u}(N.prototype=new n).isPureReactComponent=!0,N.prototype.shouldComponentUpdate=function(n,t){return E(this.props,n)||E(this.state,t)};var T=e.__b;e.__b=function(n){n.type&&n.type.__f&&n.ref&&(n.props.ref=n.ref,n.ref=null),T&&T(n)};var A=\"undefined\"!=typeof Symbol&&Symbol.for&&Symbol.for(\"react.forward_ref\")||3911;function D(n){function t(t){var e=g({},t);return delete e.ref,n(e,t.ref||null)}return t.$$typeof=A,t.render=n,t.prototype.isReactComponent=t.__f=!0,t.displayName=\"ForwardRef(\"+(n.displayName||n.name)+\")\",t}var L=function(n,t){return null==n?null:r(r(n).map(t))},O={map:L,forEach:L,count:function(n){return n?r(n).length:0},only:function(n){var t=r(n);if(1!==t.length)throw\"Children.only\";return t[0]},toArray:r},U=e.__e;e.__e=function(n,t,e,r){if(n.then)for(var u,o=t;o=o.__;)if((u=o.__c)&&u.__c)return null==t.__e&&(t.__e=e.__e,t.__k=e.__k),u.__c(n,t);U(n,t,e,r)};var F=e.unmount;function V(n,t,e){return n&&(n.__c&&n.__c.__H&&(n.__c.__H.__.forEach(function(n){\"function\"==typeof n.__c&&n.__c()}),n.__c.__H=null),null!=(n=g({},n)).__c&&(n.__c.__P===e&&(n.__c.__P=t),n.__c.__e=!0,n.__c=null),n.__k=n.__k&&n.__k.map(function(n){return V(n,t,e)})),n}function W(n,t,e){return n&&e&&(n.__v=null,n.__k=n.__k&&n.__k.map(function(n){return W(n,t,e)}),n.__c&&n.__c.__P===t&&(n.__e&&e.appendChild(n.__e),n.__c.__e=!0,n.__c.__P=e)),n}function P(){this.__u=0,this.o=null,this.__b=null}function j(n){if(!n.__)return null;var t=n.__.__c;return t&&t.__a&&t.__a(n)}function z(n){var e,r,u,o=null;function i(i){if(e||(e=n()).then(function(n){n&&(o=n.default||n),u=!0},function(n){r=n,u=!0}),r)throw r;if(!u)throw e;return o?t(o,i):null}return i.displayName=\"Lazy\",i.__f=!0,i}function B(){this.i=null,this.l=null}e.unmount=function(n){var t=n.__c;t&&(t.__z=!0),t&&t.__R&&t.__R(),t&&32&n.__u&&(n.type=null),F&&F(n)},(P.prototype=new n).__c=function(n,t){var e=t.__c,r=this;null==r.o&&(r.o=[]),r.o.push(e);var u=j(r.__v),o=!1,i=function(){o||r.__z||(o=!0,e.__R=null,u?u(c):c())};e.__R=i;var l=e.__P;e.__P=null;var c=function(){if(!--r.__u){if(r.state.__a){var n=r.state.__a;r.__v.__k[0]=W(n,n.__c.__P,n.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.o.pop();)t.__P=l,t.forceUpdate()}};r.__u++||32&t.__u||r.setState({__a:r.__b=r.__v.__k[0]}),n.then(i,i)},P.prototype.componentWillUnmount=function(){this.o=[]},P.prototype.render=function(n,e){if(this.__b){if(this.__v.__k){var r=document.createElement(\"div\"),o=this.__v.__k[0].__c;this.__v.__k[0]=V(this.__b,r,o.__O=o.__P)}this.__b=null}var i=e.__a&&t(u,null,n.fallback);return i&&(i.__u&=-33),[t(u,null,e.__a?null:n.children),i]};var H=function(n,t,e){if(++e[1]===e[0]&&n.l.delete(t),n.props.revealOrder&&(\"t\"!==n.props.revealOrder[0]||!n.l.size))for(e=n.i;e;){for(;e.length>3;)e.pop()();if(e[1]<e[0])break;n.i=e=e[2]}};function Z(n){return this.getChildContext=function(){return n.context},n.children}function Y(n){var e=this,r=n.h;if(e.componentWillUnmount=function(){o(null,e.v),e.v=null,e.h=null},e.h&&e.h!==r&&e.componentWillUnmount(),!e.v){for(var u=e.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;e.h=r,e.v={nodeType:1,parentNode:r,childNodes:[],__k:{__m:u.__m},contains:function(){return!0},namespaceURI:r.namespaceURI,insertBefore:function(n,t){this.childNodes.push(n),e.h.insertBefore(n,t)},removeChild:function(n){this.childNodes.splice(this.childNodes.indexOf(n)>>>1,1),e.h.removeChild(n)}}}o(t(Z,{context:e.context},n.__v),e.v)}function $(n,e){var r=t(Y,{__v:n,h:e});return r.containerInfo=e,r}(B.prototype=new n).__a=function(n){var t=this,e=j(t.__v),r=t.l.get(n);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),H(t,n,r)):u()};e?e(o):o()}},B.prototype.render=function(n){this.i=null,this.l=new Map;var t=r(n.children);n.revealOrder&&\"b\"===n.revealOrder[0]&&t.reverse();for(var e=t.length;e--;)this.l.set(t[e],this.i=[1,0,this.i]);return n.children},B.prototype.componentDidUpdate=B.prototype.componentDidMount=function(){var n=this;this.l.forEach(function(t,e){H(n,e,t)})};var q=\"undefined\"!=typeof Symbol&&Symbol.for&&Symbol.for(\"react.element\")||60103,G=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,J=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,K=/[A-Z0-9]/g,Q=\"undefined\"!=typeof document,X=function(n){return(\"undefined\"!=typeof Symbol&&\"symbol\"==typeof Symbol()?/fil|che|rad/:/fil|che|ra/).test(n)};function nn(n,t,e){return null==t.__k&&(t.textContent=\"\"),o(n,t),\"function\"==typeof e&&e(),n?n.__c:null}function tn(n,t,e){return i(n,t),\"function\"==typeof e&&e(),n?n.__c:null}n.prototype.isReactComponent={},[\"componentWillMount\",\"componentWillReceiveProps\",\"componentWillUpdate\"].forEach(function(t){Object.defineProperty(n.prototype,t,{configurable:!0,get:function(){return this[\"UNSAFE_\"+t]},set:function(n){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:n})}})});var en=e.event;function rn(){}function un(){return this.cancelBubble}function on(){return this.defaultPrevented}e.event=function(n){return en&&(n=en(n)),n.persist=rn,n.isPropagationStopped=un,n.isDefaultPrevented=on,n.nativeEvent=n};var ln,cn={enumerable:!1,configurable:!0,get:function(){return this.class}},fn=e.vnode;e.vnode=function(n){\"string\"==typeof n.type&&function(n){var t=n.props,e=n.type,u={},o=-1===e.indexOf(\"-\");for(var i in t){var l=t[i];if(!(\"value\"===i&&\"defaultValue\"in t&&null==l||Q&&\"children\"===i&&\"noscript\"===e||\"class\"===i||\"className\"===i)){var c=i.toLowerCase();\"defaultValue\"===i&&\"value\"in t&&null==t.value?i=\"value\":\"download\"===i&&!0===l?l=\"\":\"translate\"===c&&\"no\"===l?l=!1:\"o\"===c[0]&&\"n\"===c[1]?\"ondoubleclick\"===c?i=\"ondblclick\":\"onchange\"!==c||\"input\"!==e&&\"textarea\"!==e||X(t.type)?\"onfocus\"===c?i=\"onfocusin\":\"onblur\"===c?i=\"onfocusout\":J.test(i)&&(i=c):c=i=\"oninput\":o&&G.test(i)?i=i.replace(K,\"-$&\").toLowerCase():null===l&&(l=void 0),\"oninput\"===c&&u[i=c]&&(i=\"oninputCapture\"),u[i]=l}}\"select\"==e&&u.multiple&&Array.isArray(u.value)&&(u.value=r(t.children).forEach(function(n){n.props.selected=-1!=u.value.indexOf(n.props.value)})),\"select\"==e&&null!=u.defaultValue&&(u.value=r(t.children).forEach(function(n){n.props.selected=u.multiple?-1!=u.defaultValue.indexOf(n.props.value):u.defaultValue==n.props.value})),t.class&&!t.className?(u.class=t.class,Object.defineProperty(u,\"className\",cn)):t.className&&(u.class=u.className=t.className),n.props=u}(n),n.$$typeof=q,fn&&fn(n)};var an=e.__r;e.__r=function(n){an&&an(n),ln=n.__c};var sn=e.diffed;e.diffed=function(n){sn&&sn(n);var t=n.props,e=n.__e;null!=e&&\"textarea\"===n.type&&\"value\"in t&&t.value!==e.value&&(e.value=null==t.value?\"\":t.value),ln=null};var hn={ReactCurrentDispatcher:{current:{readContext:function(n){return ln.__n[n.__c].props.value},useCallback:v,useContext:d,useDebugValue:m,useDeferredValue:w,useEffect:h,useId:p,useImperativeHandle:y,useInsertionEffect:I,useLayoutEffect:s,useMemo:_,useReducer:b,useRef:S,useState:a,useSyncExternalStore:C,useTransition:k}}},vn=\"18.3.1\";function dn(n){return t.bind(null,n)}function mn(n){return!!n&&n.$$typeof===q}function pn(n){return mn(n)&&n.type===u}function yn(n){return!!n&&\"string\"==typeof n.displayName&&n.displayName.startsWith(\"Memo(\")}function _n(n){return mn(n)?f.apply(null,arguments):n}function bn(n){return!!n.__k&&(o(null,n),!0)}function Sn(n){return n&&(n.base||1===n.nodeType&&n)||null}var gn=function(n,t){return n(t)},En=function(n,t){return n(t)},Cn=u,Rn=mn,xn={useState:a,useId:p,useReducer:b,useEffect:h,useLayoutEffect:s,useInsertionEffect:I,useTransition:k,useDeferredValue:w,useSyncExternalStore:C,startTransition:x,useRef:S,useImperativeHandle:y,useMemo:_,useCallback:v,useContext:d,useDebugValue:m,version:\"18.3.1\",Children:O,render:nn,hydrate:tn,unmountComponentAtNode:bn,createPortal:$,createElement:t,createContext:l,createFactory:dn,cloneElement:_n,createRef:c,Fragment:u,isValidElement:mn,isElement:Rn,isFragment:pn,isMemo:yn,findDOMNode:Sn,Component:n,PureComponent:N,memo:M,forwardRef:D,flushSync:En,unstable_batchedUpdates:gn,StrictMode:Cn,Suspense:P,SuspenseList:B,lazy:z,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:hn};export{O as Children,N as PureComponent,Cn as StrictMode,P as Suspense,B as SuspenseList,hn as __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,_n as cloneElement,dn as createFactory,$ as createPortal,xn as default,Sn as findDOMNode,En as flushSync,D as forwardRef,tn as hydrate,Rn as isElement,pn as isFragment,yn as isMemo,mn as isValidElement,z as lazy,M as memo,nn as render,x as startTransition,bn as unmountComponentAtNode,gn as unstable_batchedUpdates,w as useDeferredValue,I as useInsertionEffect,C as useSyncExternalStore,k as useTransition,vn as version};\n//# sourceMappingURL=compat.module.js.map\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.chainFirst = chainFirst;\nexports.tap = tap;\nexports.bind = bind;\nfunction chainFirst(M) {\n    var tapM = tap(M);\n    return function (f) { return function (first) { return tapM(first, f); }; };\n}\n/** @internal */\nfunction tap(M) {\n    return function (first, f) { return M.chain(first, function (a) { return M.map(f(a), function () { return a; }); }); };\n}\nfunction bind(M) {\n    return function (name, f) { return function (ma) { return M.chain(ma, function (a) { return M.map(f(a), function (b) {\n        var _a;\n        return Object.assign({}, a, (_a = {}, _a[name] = b, _a));\n    }); }); }; };\n}\n","import { JSX } from \"preact\";\nimport { Tailwind } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  className?: string;\n  size?: number;\n  color?: string;\n}\n\nexport function IconHamburger(props: IProps): JSX.Element {\n  const color = props.color ?? Tailwind.semantic().icon.neutral;\n  const size = props.size ?? 22;\n  return (\n    <svg\n      style={props.style}\n      className={props.className}\n      width={size}\n      height={size}\n      viewBox=\"0 0 22 22\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M1.57143 6.2H20.4286C21.296 6.2 22 5.4832 22 4.6C22 3.7168 21.296 3 20.4286 3H1.57143C0.704 3 0 3.7168 0 4.6C0 5.4832 0.704 6.2 1.57143 6.2ZM20.4286 9.4H1.57143C0.704 9.4 0 10.1168 0 11C0 11.8832 0.704 12.6 1.57143 12.6H20.4286C21.296 12.6 22 11.8832 22 11C22 10.1168 21.296 9.4 20.4286 9.4ZM20.4286 15.8H1.57143C0.704 15.8 0 16.5168 0 17.4C0 18.2832 0.704 19 1.57143 19H20.4286C21.296 19 22 18.2832 22 17.4C22 16.5168 21.296 15.8 20.4286 15.8Z\"\n        fill={color}\n      />\n    </svg>\n  );\n}\n","import { JSX } from \"preact\";\nimport { Tailwind } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  className?: string;\n  color?: string;\n  width?: number;\n  height?: number;\n}\n\nexport function IconArrowRight(props: IProps): JSX.Element {\n  const width = props.width || 7;\n  const height = props.height || 12;\n  const color = props.color || Tailwind.semantic().icon.neutral;\n  return (\n    <svg\n      style={props.style}\n      className={props.className}\n      width={width}\n      height={height}\n      viewBox=\"0 0 7 12\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M1 1L6 6L1 11\" stroke={color} stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n    </svg>\n  );\n}\n","import { JSX } from \"preact\";\nimport { Tailwind } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  bgColor?: string;\n}\n\nexport function IconCloseCircleOutline(props: IProps = {}): JSX.Element {\n  const size = props.size ?? 20;\n  const color = props.color ?? Tailwind.semantic().icon.neutral;\n  const bgColor = props.bgColor ?? Tailwind.semantic().background.subtle;\n  return (\n    <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <rect width=\"32\" height=\"32\" rx=\"16\" fill={bgColor} />\n      <path\n        d=\"M21.9081 21.4999C21.4635 21.9446 20.7425 21.9446 20.2978 21.4999L16.2721 17.4742L12.2463 21.4999C11.8017 21.9446 11.0807 21.9446 10.636 21.4999C10.1914 21.0553 10.1914 20.3343 10.636 19.8896L14.6618 15.8639L10.636 11.8381C10.1914 11.3935 10.1914 10.6725 10.636 10.2278C11.0807 9.78317 11.8017 9.78317 12.2463 10.2278L16.2721 14.2536L20.2978 10.2278C20.7425 9.78317 21.4635 9.78317 21.9081 10.2278C22.3528 10.6725 22.3528 11.3935 21.9081 11.8381L17.8824 15.8639L21.9081 19.8896C22.3528 20.3343 22.3528 21.0553 21.9081 21.4999Z\"\n        fill={color}\n      />\n    </svg>\n  );\n}\n","import { JSX } from \"preact\";\nimport { useState } from \"preact/hooks\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\n\ninterface IForgotPasswordFormProps {\n  onSendResetLink: (email: string) => Promise<void>;\n  onBackToLogin: () => void;\n  initialEmail?: string;\n}\n\nexport function ForgotPasswordForm(props: IForgotPasswordFormProps): JSX.Element {\n  const [email, setEmail] = useState(props.initialEmail ?? \"\");\n  const [isLoading, setIsLoading] = useState(false);\n  const [successMessage, setSuccessMessage] = useState<string | undefined>(undefined);\n  const [error, setError] = useState<string | undefined>(undefined);\n\n  const handleSubmit = async (e: Event): Promise<void> => {\n    e.preventDefault();\n    setError(undefined);\n    setSuccessMessage(undefined);\n    setIsLoading(true);\n    try {\n      await props.onSendResetLink(email);\n      setSuccessMessage(\"Password reset link sent! Check your email.\");\n      setIsLoading(false);\n    } catch (err) {\n      setError(err instanceof Error ? err.message : \"Failed to send reset link\");\n      setIsLoading(false);\n    }\n  };\n\n  return (\n    <div>\n      <h2 className=\"mb-4 text-lg font-bold text-center\">Forgot Password</h2>\n      {isLoading ? (\n        <div className=\"my-4 text-center\">\n          <IconSpinner width={48} height={48} />\n        </div>\n      ) : (\n        <form onSubmit={handleSubmit}>\n          <div className=\"mb-4\">\n            <Input\n              label=\"Email\"\n              type=\"email\"\n              identifier=\"forgot-password-email\"\n              isLabelOutside={true}\n              required={true}\n              requiredMessage=\"Email is required\"\n              value={email}\n              changeType=\"oninput\"\n              changeHandler={(result) => {\n                if (result.success) {\n                  setEmail(result.data);\n                }\n              }}\n              placeholder=\"your@email.com\"\n            />\n          </div>\n          {successMessage && (\n            <div className=\"mb-4 text-sm text-center text-text-purple\" data-cy=\"forgot-password-success\">\n              {successMessage}\n            </div>\n          )}\n          {error && (\n            <div className=\"mb-4 text-sm text-center text-text-error\" data-cy=\"forgot-password-error\">\n              {error}\n            </div>\n          )}\n          <div className=\"mb-4 text-center\">\n            <Button\n              name=\"forgot-password-submit\"\n              kind=\"purple\"\n              type=\"submit\"\n              data-cy=\"forgot-password-submit\"\n              disabled={!email}\n            >\n              Send Reset Link\n            </Button>\n          </div>\n          <div className=\"mb-4 text-xs text-center text-text-secondary\">\n            We'll send you an email with a link to reset your password.\n          </div>\n          <div className=\"mt-4 text-center\">\n            <Button\n              name=\"forgot-password-back\"\n              kind=\"grayv2\"\n              buttonSize=\"md\"\n              onClick={props.onBackToLogin}\n              data-cy=\"forgot-password-back\"\n            >\n              Back to Login\n            </Button>\n          </div>\n        </form>\n      )}\n    </div>\n  );\n}\n","import memoize from \"micro-memoize\";\nimport { Exercise } from \"@shared/models/exercise\";\nimport { Equipment } from \"@shared/models/equipment\";\nimport { IAllCustomExercises, IAllEquipment, IExerciseType, ISettings } from \"@shared/types\";\nimport { IPlannerProgramExercise } from \"./models/types\";\nimport { PlannerExerciseEvaluator } from \"./plannerExerciseEvaluator\";\n\nexport class PlannerKey {\n  public static fromPlannerExercise(plannerExercise: IPlannerProgramExercise, settings: ISettings): string {\n    if (plannerExercise.exerciseType) {\n      return this.fromExerciseType(plannerExercise.exerciseType, plannerExercise.label);\n    } else {\n      return this.fromFullName(plannerExercise.fullName, settings.exercises, Equipment.currentEquipment(settings));\n    }\n  }\n\n  public static fromExerciseType(exerciseType: IExerciseType, label?: string): string {\n    const key = Exercise.toKey(exerciseType);\n    const plannerKey = `${label ? `${label}-` : \"\"}${key}`.toLowerCase();\n    return plannerKey;\n  }\n\n  public static fromFullName = memoize(\n    (fullName: string, exercises: IAllCustomExercises, allEquipment?: IAllEquipment): string => {\n      const { label, name, equipment } = PlannerExerciseEvaluator.extractNameParts(fullName, exercises, allEquipment);\n      return this.fromLabelNameAndEquipment(label, name, equipment, exercises, allEquipment);\n    },\n    { maxSize: 1000 }\n  );\n\n  public static fromLabelNameAndEquipment = memoize(\n    (\n      label: string | undefined,\n      name: string,\n      equipment: string | undefined,\n      exercises: IAllCustomExercises,\n      allEquipment?: IAllEquipment\n    ): string => {\n      const exercise = Exercise.findByNameEquipment(exercises, name, equipment, allEquipment);\n      const key = exercise ? Exercise.toKey(exercise) : name;\n      const plannerKey = `${label ? `${label}-` : \"\"}${key}`.toLowerCase();\n      return plannerKey;\n    },\n    {\n      maxSize: 1000,\n    }\n  );\n}\n","var has = Object.prototype.hasOwnProperty;\n\nfunction find(iter, tar, key) {\n\tfor (key of iter.keys()) {\n\t\tif (dequal(key, tar)) return key;\n\t}\n}\n\nfunction dequal(foo, bar) {\n\tvar ctor, len, tmp;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (ctor === Set) {\n\t\t\tif (foo.size !== bar.size) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (len of foo) {\n\t\t\t\ttmp = len;\n\t\t\t\tif (tmp && typeof tmp === 'object') {\n\t\t\t\t\ttmp = find(bar, tmp);\n\t\t\t\t\tif (!tmp) return false;\n\t\t\t\t}\n\t\t\t\tif (!bar.has(tmp)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ctor === Map) {\n\t\t\tif (foo.size !== bar.size) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (len of foo) {\n\t\t\t\ttmp = len[0];\n\t\t\t\tif (tmp && typeof tmp === 'object') {\n\t\t\t\t\ttmp = find(bar, tmp);\n\t\t\t\t\tif (!tmp) return false;\n\t\t\t\t}\n\t\t\t\tif (!dequal(len[1], bar.get(tmp))) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ctor === ArrayBuffer) {\n\t\t\tfoo = new Uint8Array(foo);\n\t\t\tbar = new Uint8Array(bar);\n\t\t} else if (ctor === DataView) {\n\t\t\tif ((len=foo.byteLength) === bar.byteLength) {\n\t\t\t\twhile (len-- && foo.getInt8(len) === bar.getInt8(len));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (ArrayBuffer.isView(foo)) {\n\t\t\tif ((len=foo.byteLength) === bar.byteLength) {\n\t\t\t\twhile (len-- && foo[len] === bar[len]);\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n\nexports.dequal = dequal;","const PROD_HOST = \"https://www.trainwithkurtis.com\";\n\nexport namespace TrainerLoginEmail {\n  /** The email that the trainer login form starts with. Only prod has one: Kurtis's account exists only there. */\n  export function defaultFor(host: string | undefined): string | undefined {\n    return host === PROD_HOST ? \"kurtis@trainwithkurtis.com\" : undefined;\n  }\n}\n","import { IThunk, IDispatch } from \"./types\";\nimport { IScreen, IScreenParams } from \"@shared/models/screen\";\nimport { ILoginResponse, Service } from \"../api/service\";\nimport { lb } from \"lens-shmens\";\nimport { Program } from \"@shared/models/program\";\nimport { IEnv, IState, updateSettings, updateState } from \"@shared/models/state\";\nimport { IProgram, IStorage, ISettings, IDayData, IHistoryRecord, IProgramState, IUnitKey } from \"@shared/types\";\nimport { ISyncServerUnit } from \"@shared/models/syncDecide\";\nimport { IPhoneSyncState, Sync } from \"../utils/sync\";\nimport { Block, IBlockRef } from \"@shared/models/block\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { IByExercise } from \"../pages/planner/plannerEvaluator\";\nimport { ImportExporter } from \"../lib/importexporter\";\nimport { Storage } from \"@shared/models/storage\";\nimport { History } from \"@shared/models/history\";\nimport { CSV } from \"../utils/csv\";\nimport { Exporter } from \"../utils/exporter\";\nimport { DateUtils } from \"@shared/utils/date\";\nimport { getInitialState, saveLocalStorage } from \"./reducer\";\nimport { IndexedDBUtils } from \"../utils/indexeddb\";\nimport { Screen } from \"@shared/models/screen\";\nimport { SendMessage } from \"../utils/sendMessage\";\nimport { UidFactory } from \"@shared/utils/generator\";\nimport { Progress } from \"@shared/models/progress\";\nimport { LogUtils } from \"../utils/log\";\nimport { lg } from \"../utils/posthog\";\nimport { ErrorReporter } from \"@shared/utils/errorReporter\";\nimport { UrlUtils } from \"@shared/utils/url\";\nimport { PlannerProgram } from \"../pages/planner/models/plannerProgram\";\nimport { EditProgram } from \"@shared/models/editProgram\";\nimport { LiveActivityManager } from \"../utils/liveActivityManager\";\nimport { RecordLock } from \"../utils/recordLock\";\nimport { WorkoutLockText } from \"@shared/models/workoutLock\";\nimport { TrainerTextsCache } from \"../utils/trainerTextsCache\";\n\nexport class NoRetryError extends Error {\n  public noretry = true;\n}\n\nexport namespace Thunk {\n  export function editHistoryRecord(historyRecord: IHistoryRecord): IThunk {\n    return async (dispatch, getState) => {\n      if (RecordLock.isLocked(getState(), historyRecord, Date.now())) {\n        alert(WorkoutLockText.locked);\n        return;\n      }\n      dispatch({ type: \"EditHistoryRecord\", historyRecord });\n    };\n  }\n\n  // Takes the time one time, checks the lock for a past workout, then dispatches the action with that time.\n  // A past workout that is now locked closes the editor and shows the \"now locked\" alert.\n  function isNowLocked(state: IState, time: number): boolean {\n    const progress = Progress.getProgress(state);\n    return progress != null && !Progress.isCurrent(progress) && RecordLock.isLocked(state, progress, time);\n  }\n\n  export function saveWorkout(): IThunk {\n    return async (dispatch, getState) => {\n      const time = Date.now();\n      if (isNowLocked(getState(), time)) {\n        alert(WorkoutLockText.nowLocked);\n        dispatch({ type: \"CancelProgress\" });\n        return;\n      }\n      dispatch({ type: \"FinishProgramDayAction\", time });\n    };\n  }\n\n  export function deleteWorkout(): IThunk {\n    return async (dispatch, getState) => {\n      const time = Date.now();\n      if (isNowLocked(getState(), time)) {\n        alert(WorkoutLockText.nowLocked);\n        dispatch({ type: \"CancelProgress\" });\n        return;\n      }\n      dispatch({ type: \"DeleteProgress\", time });\n    };\n  }\n\n  export function postevent(action: string, extra?: Record<string, string | number>): IThunk {\n    return async (dispatch, getState, env) => {\n      lg(action, extra, env.service, getState().user?.id);\n    };\n  }\n\n  // Ends the invite sign-up. The pending session from the claim (or the magic link) proves who the person is.\n  export function finishInvite(password: string, nickname: string, termsAccepted: boolean): IThunk {\n    return async (dispatch, getState, env) => {\n      dispatch(postevent(\"email-register\"));\n      const state = getState();\n      try {\n        const result = await load(dispatch, \"Creating account\", async () => {\n          return env.service.finishInvite(password, termsAccepted, nickname);\n        });\n        // The server picks the new user ID. With no local user, keep the local state for the new account.\n        const userId = state.user?.id || result.user_id;\n        await load(dispatch, \"Signing in\", () => {\n          return handleLogin(dispatch, getState, env, result, userId);\n        });\n\n        // Open the welcome step for new users who signed up via invite. The welcome step starts the checklist.\n        updateState(\n          dispatch,\n          [\n            lb<IState>()\n              .p(\"screenStack\")\n              .record([{ name: \"welcome\" }]),\n          ],\n          \"Open the welcome step for invite signup\"\n        );\n        dispatch(sync2());\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        throw new NoRetryError(errorMessage);\n      }\n    };\n  }\n\n  export function emailSignIn(email: string, password: string, cb?: () => void): IThunk {\n    return async (dispatch, getState, env) => {\n      dispatch(postevent(\"email-sign-in\"));\n      const state = getState();\n      const userId = state.user?.id;\n      try {\n        const result = await load(dispatch, \"Logging in\", async () => {\n          return env.service.emailSignIn(email, password);\n        });\n        await load(dispatch, \"Signing in\", () => {\n          return handleLogin(dispatch, getState, env, result, userId);\n        });\n        if (cb) {\n          cb();\n        }\n        dispatch(sync2());\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        throw new NoRetryError(errorMessage);\n      }\n    };\n  }\n\n  export function verifyMagicLink(\n    token: string,\n    cb?: () => void,\n    onError?: (message: string) => void,\n    onNeedsFinish?: (email: string) => void\n  ): IThunk {\n    return async (dispatch, getState, env) => {\n      dispatch(postevent(\"magic-link-verify\"));\n      const state = getState();\n      const userId = state.user?.id;\n      try {\n        const result = await load(dispatch, \"Logging in\", async () => {\n          return env.service.verifyMagicLink(token);\n        });\n        // The client has not finished the sign-up. The session is pending, so the app sets no user yet.\n        if (result.needsFinish) {\n          if (onNeedsFinish) {\n            onNeedsFinish(result.email);\n          }\n          return;\n        }\n        await load(dispatch, \"Signing in\", () => {\n          return handleLogin(dispatch, getState, env, result, userId);\n        });\n        if (cb) {\n          cb();\n        }\n        await new Promise<void>((resolve) => {\n          setTimeout(resolve, 0);\n        });\n        dispatch(sync2());\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        if (onError) {\n          onError(errorMessage);\n        }\n        throw new NoRetryError(errorMessage);\n      }\n    };\n  }\n\n  export function log(action: string): IThunk {\n    return async (dispatch, getState, env) => {\n      const state = getState();\n      if (!state.nosync) {\n        LogUtils.log(\n          state.user?.id,\n          action,\n          [],\n          () => {\n            // Subscription clearing removed\n          },\n          undefined,\n          state.storage.referrer\n        );\n      }\n    };\n  }\n\n  export function logOut(cb?: () => void): IThunk {\n    return async (dispatch, getState, env) => {\n      dispatch(postevent(\"log-out\"));\n      if (getState().user?.id) {\n        await env.service.signout();\n        TrainerTextsCache.clearAll();\n        dispatch({ type: \"Logout\" });\n        updateState(\n          dispatch,\n          [\n            lb<IState>().p(\"snapshot\").record(undefined),\n            lb<IState>().p(\"heldBases\").record(undefined),\n            lb<IState>().p(\"removedAt\").record(undefined),\n            lb<IState>().p(\"notSynced\").record(undefined),\n          ],\n          \"Clear last sync on logout\"\n        );\n      }\n      if (cb) {\n        cb();\n      }\n    };\n  }\n\n  export function postDebug(): IThunk {\n    return async (dispatch, getState, env) => {\n      const state = getState();\n      const key = await load(dispatch, \"Debug sync\", async () => env.service.postDebug(JSON.stringify(state), {}));\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"notification\")\n            .record(\n              key != null\n                ? { type: \"success\", content: `Debug info sent. Reference: ${key}` }\n                : { type: \"error\", content: \"Could not send the debug info.\" }\n            ),\n        ],\n        \"Debug info sent\"\n      );\n    };\n  }\n\n  function updatePhoneSync(dispatch: IDispatch, next: IPhoneSyncState, isConverted?: boolean): void {\n    updateState(\n      dispatch,\n      [\n        lb<IState>().p(\"storage\").record(next.storage),\n        lb<IState>().p(\"snapshot\").record(next.snapshot),\n        lb<IState>().p(\"heldBases\").record(next.heldBases),\n        lb<IState>().p(\"removedAt\").record(next.removedAt),\n        ...(isConverted ? [lb<IState>().p(\"lastSyncedStorage\").record(undefined)] : []),\n      ],\n      \"Merge synced storage\"\n    );\n  }\n\n  function phoneSyncState(state: IState): IPhoneSyncState {\n    return {\n      storage: state.storage,\n      snapshot: state.snapshot!,\n      heldBases: state.heldBases || {},\n      removedAt: state.removedAt || {},\n    };\n  }\n\n  // Loads all pages of `GET /api/snapshot` and applies them. Local changes stay. Returns false when nothing was applied\n  // (aborted, or \"retry\" while a storage upgrade runs).\n  export async function loadSnapshot(\n    dispatch: IDispatch,\n    getState: () => IState,\n    env: IEnv,\n    signal?: AbortSignal\n  ): Promise<boolean> {\n    const units: Record<IUnitKey, ISyncServerUnit> = {};\n    let first: { serverRev: number; syncEpoch?: string } | undefined;\n    let after: number | undefined;\n    do {\n      const page = await env.service.getSnapshot(after, signal);\n      if (signal?.aborted) {\n        return false;\n      }\n      if (page.type === \"retry\") {\n        dispatch(Thunk.postevent(\"sync3-retry\"));\n        return false;\n      }\n      if (page.type === \"error\") {\n        alertOutdatedStorage(page.error);\n        throw new NoRetryError(page.error);\n      }\n      first = first ?? { serverRev: page.serverRev ?? 0, syncEpoch: page.syncEpoch };\n      Object.assign(units, page.units);\n      after = page.next;\n    } while (after != null);\n    const state = getState();\n    const full = { ...first!, units };\n    if (state.snapshot != null) {\n      updatePhoneSync(dispatch, Sync.applySnapshot(phoneSyncState(state), full));\n      return true;\n    }\n    // No snapshot: the first-start converter. It uses the old app's `lastSyncedStorage` one time.\n    const local = { storage: state.storage, heldBases: state.heldBases || {}, removedAt: state.removedAt || {} };\n    if (state.lastSyncedStorage != null) {\n      dispatch(Thunk.postevent(\"sync3-converted\"));\n    }\n    updatePhoneSync(dispatch, Sync.applyConversion(local, state.lastSyncedStorage, full), true);\n    return true;\n  }\n\n  // Marks units \"not synced\": the phone keeps them and does not send them again. The error is logged.\n  function markNotSynced(\n    dispatch: IDispatch,\n    getState: () => IState,\n    unitKeys: IUnitKey[],\n    extra: Record<string, string | number>\n  ): void {\n    if (unitKeys.length === 0) {\n      return;\n    }\n    const notSynced = getState().notSynced || [];\n    for (const unitKey of unitKeys) {\n      dispatch(Thunk.postevent(\"sync3-not-synced\", { unitKey, ...extra }));\n    }\n    updateState(\n      dispatch,\n      [\n        lb<IState>()\n          .p(\"notSynced\")\n          .record(Array.from(new Set([...notSynced, ...unitKeys]))),\n      ],\n      \"Mark not synced\"\n    );\n  }\n\n  function handleSync3Error(dispatch: IDispatch, error: string): void {\n    if (error === \"not_authorized\") {\n      updateState(dispatch, [lb<IState>().p(\"snapshot\").record(undefined)], \"Update subscription no storage\");\n      return;\n    }\n    alertOutdatedStorage(error);\n    throw new NoRetryError(error);\n  }\n\n  function alertOutdatedStorage(error: string): void {\n    if (error === \"outdated_client_storage\" && typeof window !== \"undefined\") {\n      alert(\n        \"The version of the storage on a device is older than on the server, so sync failed. \" +\n          \"To fix it - kill/restart the app a couple times.\"\n      );\n    }\n  }\n\n  // Sends the local changes to `/api/sync3` one page at a time, and applies each response before the next page. A unit\n  // that a page sent is not sent again in the same run: a change made during its request goes at the next trigger.\n  export async function runSync3(\n    dispatch: IDispatch,\n    getState: () => IState,\n    env: IEnv,\n    signal?: AbortSignal\n  ): Promise<void> {\n    if (getState().snapshot == null && !(await loadSnapshot(dispatch, getState, env, signal))) {\n      return;\n    }\n    const sentKeys = new Set<IUnitKey>();\n    let maxChanges = Infinity;\n    let isCarrierDropped = false;\n    let snapshotLoads = 0;\n    let isFirst = true;\n    for (;;) {\n      const state = getState();\n      const snapshot = state.snapshot!;\n      const notSynced = state.notSynced || [];\n      const changes = Sync.localChanges(state.storage, snapshot, state.heldBases || {}, {\n        removedAt: state.removedAt,\n      }).filter((c) => !sentKeys.has(c.unitKey) && notSynced.indexOf(c.unitKey) === -1);\n      if (changes.length === 0 && !isFirst) {\n        return;\n      }\n      isFirst = false;\n      const page = Sync.page(changes, maxChanges, isCarrierDropped);\n      const result = await env.service.postSync3(\n        { lastRev: snapshot.lastRev, syncEpoch: snapshot.syncEpoch, version: state.storage.version, changes: page },\n        signal\n      );\n      if (signal?.aborted) {\n        return;\n      }\n\n      if (result.type === \"ok\") {\n        updatePhoneSync(dispatch, Sync.applyResponse(phoneSyncState(getState()), page, result));\n        markNotSynced(dispatch, getState, Sync.invalidNewWorkouts(page, result.decisions), { reason: \"invalid\" });\n        page.forEach((c) => sentKeys.add(c.unitKey));\n      } else if (result.type === \"full_snapshot\") {\n        dispatch(Thunk.postevent(\"sync3-full-snapshot\", { reason: result.reason }));\n        if (result.decisions != null) {\n          // The commit has run. The units have revisions only, so only the sent units apply here.\n          const units: Record<IUnitKey, ISyncServerUnit> = {};\n          for (const c of page) {\n            if (result.units?.[c.unitKey] != null) {\n              units[c.unitKey] = result.units[c.unitKey];\n            }\n          }\n          const local = phoneSyncState(getState());\n          const { lastRev, syncEpoch } = local.snapshot;\n          const next = Sync.applyResponse(local, page, {\n            serverRev: lastRev,\n            syncEpoch,\n            decisions: result.decisions,\n            units,\n          });\n          updatePhoneSync(dispatch, next);\n          markNotSynced(dispatch, getState, Sync.invalidNewWorkouts(page, result.decisions), { reason: \"invalid\" });\n          page.forEach((c) => sentKeys.add(c.unitKey));\n        }\n        snapshotLoads += 1;\n        if (snapshotLoads > 2) {\n          throw new Error(\"Sync got a full snapshot 3 times\");\n        }\n        if (!(await loadSnapshot(dispatch, getState, env, signal))) {\n          return;\n        }\n      } else if (result.type === \"too_big\" || result.type === \"page_failed\") {\n        if (page.length > 1) {\n          maxChanges = Math.floor(page.length / 2);\n          continue;\n        }\n        const change = page[0];\n        if ((change.value as { progressionSnapshot?: unknown } | undefined)?.progressionSnapshot != null) {\n          // The carrier can be the reason. The workout still syncs, and only loses its rollback.\n          isCarrierDropped = true;\n          continue;\n        }\n        const bytes = Sync.changeBytes(change);\n        if (bytes <= Sync.notSyncedBytes) {\n          throw new Error(`Sync of ${change.unitKey} failed`);\n        }\n        markNotSynced(dispatch, getState, [change.unitKey], { reason: \"too_big\", bytes });\n      } else if (result.type === \"retry\") {\n        dispatch(Thunk.postevent(\"sync3-retry\"));\n        return;\n      } else {\n        handleSync3Error(dispatch, result.error);\n        return;\n      }\n    }\n  }\n\n  export function sync2(args?: { force?: boolean; cb?: () => void; log?: boolean }): IThunk {\n    return async (dispatch, getState, env) => {\n      if (args?.log) {\n        dispatch(\n          postevent(\"sync2-enter\", {\n            isProcessing: `${env.queue.getIsProcessing()}`,\n            queueLength: env.queue.length().toString(),\n          })\n        );\n      }\n      try {\n        const state = getState();\n        if (state.errors.corruptedstorage == null && !state.nosync && (state.user != null || args?.force)) {\n          await env.queue.enqueue(\n            async (args2, signal) => {\n              await load(dispatch, \"Sync\", async () => {\n                if (args2?.log) {\n                  dispatch(postevent(\"sync2-start\"));\n                }\n                await runSync3(dispatch, getState, env, signal);\n              });\n            },\n            { force: !!args?.force, log: !!args?.log }\n          );\n        }\n      } finally {\n        if (args?.cb) {\n          args.cb();\n        }\n      }\n    };\n  }\n\n  // The \"Corrupted Storage\" screen's Reset. The save and the sync are off while the screen shows. The reset state is\n  // saved first, so a restart does not show the screen again. With no snapshot, the sync loads the server data.\n  export function resetCorruptedStorage(): IThunk {\n    return async (dispatch, getState, env) => {\n      updateState(\n        dispatch,\n        [lb<IState>().p(\"errors\").p(\"corruptedstorage\").record(undefined)],\n        \"Reset corrupted storage\"\n      );\n      await saveLocalStorage(getState());\n      try {\n        await sync2({ force: true })(dispatch, getState, env);\n      } finally {\n        await saveLocalStorage(getState());\n      }\n    };\n  }\n\n  export function updateLiveActivity(\n    entryIndex: number | undefined,\n    setIndex: number | undefined,\n    restTimer: number | undefined,\n    restTimerSince: number | undefined\n  ): IThunk {\n    return async (dispatch, getState, env) => {\n      const state = getState();\n      const progress = state.progress[0];\n      if (!progress) {\n        return;\n      }\n      const entry = entryIndex != null ? progress.entries[entryIndex] : undefined;\n      const program = Program.getProgram(state, progress.programId);\n      const evaluatedProgram = program ? Program.evaluate(program, state.storage.settings) : undefined;\n      const programExercise =\n        evaluatedProgram && entry\n          ? Program.getProgramExercise(progress.day, evaluatedProgram, entry.programExerciseId)\n          : undefined;\n      LiveActivityManager.updateLiveActivity(\n        progress,\n        entryIndex,\n        setIndex,\n        restTimer,\n        restTimerSince,\n        programExercise,\n        state.storage.settings\n      );\n    };\n  }\n\n  export function completeSetExternal(\n    entryIndex: number,\n    setIndex: number,\n    restTimer: number,\n    restTimerSince: number\n  ): IThunk {\n    return async (dispatch, getState, env) => {\n      const state = getState();\n      const progress = state.progress[0];\n      if (!progress) {\n        return;\n      }\n      const entry = progress.entries[entryIndex];\n      const isWarmup = setIndex < entry.warmupSets.length;\n      let adjustedSetIndex = setIndex;\n      if (!isWarmup) {\n        adjustedSetIndex -= entry.warmupSets.length;\n      }\n      SendMessage.print(`Main App: complete set entryIndex: ${entryIndex}, setIndex: ${setIndex}`);\n      const program = Program.getFullProgram(state, progress.programId);\n      const evaluatedProgram = program ? Program.evaluate(program, state.storage.settings) : undefined;\n      const programExercise = evaluatedProgram\n        ? Program.getProgramExercise(progress.day, evaluatedProgram, entry.programExerciseId)\n        : undefined;\n\n      const set = isWarmup ? entry.warmupSets[adjustedSetIndex] : entry.sets[adjustedSetIndex];\n      if (set.isCompleted) {\n        SendMessage.print(`Main App: Set already completed, refreshing live activity`);\n        dispatch(Thunk.updateLiveActivity(entryIndex, setIndex, restTimer, restTimerSince));\n        return;\n      }\n\n      dispatch({\n        type: \"CompleteSetAction\",\n        setIndex: adjustedSetIndex,\n        entryIndex: entryIndex,\n        programExercise: programExercise,\n        otherStates: evaluatedProgram?.states,\n        isPlayground: false,\n        mode: isWarmup ? \"warmup\" : \"workout\",\n        forceUpdateEntryIndex: true,\n        isExternal: true,\n      });\n    };\n  }\n\n  function getProgramExerciseForEntry(\n    state: IState,\n    progress: IHistoryRecord,\n    entryIndex: number\n  ): { programExercise?: IPlannerProgramExercise; otherStates?: IByExercise<IProgramState> } {\n    const entry = progress.entries[entryIndex];\n    const program = Program.getFullProgram(state, progress.programId);\n    const evaluatedProgram = program ? Program.evaluate(program, state.storage.settings) : undefined;\n    const programExercise = evaluatedProgram\n      ? Program.getProgramExercise(progress.day, evaluatedProgram, entry.programExerciseId)\n      : undefined;\n    return { programExercise, otherStates: evaluatedProgram?.states };\n  }\n\n  export function autoAdvanceSet(now: number): IThunk {\n    return async (dispatch, getState, env) => {\n      const state = getState();\n      const progress = state.progress[0];\n      if (!progress) {\n        return;\n      }\n      const target = Progress.shouldAutoAdvance(progress, now, state.storage.settings);\n      if (!target) {\n        return;\n      }\n      const entry = progress.entries[target.entryIndex];\n      if (!entry) {\n        return;\n      }\n      if (progress.blockRun != null) {\n        // In a run the rest ends and the next work step starts. Its set is not done until its work step ends.\n        const timestamp = progress.timerSince! + progress.timer! * 1000;\n        updateState(\n          dispatch,\n          [\n            lb<IState>()\n              .p(\"progress\")\n              .pi(progress.id)\n              .recordModify((aProgress) =>\n                Progress.startRunWorkStep(aProgress, timestamp, target.entryIndex, target.setIndex)\n              ),\n          ],\n          \"Start next work step\"\n        );\n        dispatch(Thunk.updateLiveActivity(target.entryIndex, target.setIndex, undefined, undefined));\n        return;\n      }\n      const { programExercise, otherStates } = getProgramExerciseForEntry(state, progress, target.entryIndex);\n\n      dispatch({\n        type: \"CompleteSetAction\",\n        setIndex: target.setIndex,\n        entryIndex: target.entryIndex,\n        programExercise: programExercise,\n        otherStates: otherStates,\n        isPlayground: false,\n        mode: progress.timerMode ?? \"workout\",\n        forceUpdateEntryIndex: false,\n        isExternal: false,\n        timestamp: progress.timerSince! + progress.timer! * 1000,\n      });\n    };\n  }\n\n  // The run that starts at the first not-done work step of `ref`. Done sets stay as they are.\n  // Returns undefined when that step is not a work step.\n  function runFromFirstNotDone(\n    progress: IHistoryRecord,\n    ref: IBlockRef,\n    settings: ISettings,\n    now: number\n  ): IHistoryRecord | undefined {\n    const steps = Block.getSteps(progress.entries, ref, settings);\n    const firstIndex = Block.firstNotDoneStep(steps, progress.entries);\n    const firstStep = firstIndex != null ? steps[firstIndex] : undefined;\n    if (!firstStep || firstStep.type !== \"work\") {\n      return undefined;\n    }\n    const name = typeof ref === \"string\" ? ref : ref.name;\n    const entryIndex = typeof ref === \"string\" ? undefined : ref.entryIndex;\n    return Progress.startRunWorkStep(\n      { ...progress, blockRun: { name, entryIndex, startedAt: now, isPaused: false, pausedAt: undefined } },\n      now,\n      firstStep.entryIndex,\n      firstStep.setIndex\n    );\n  }\n\n  // Starts a run at the first not-done work step. `ref` is a circuit name, or `{ name: \"\", entryIndex }` for the\n  // timer sets of one exercise. Done sets stay as they are. The set of the first step stays not done.\n  export function startBlock(ref: IBlockRef): IThunk {\n    return async (dispatch, getState) => {\n      const state = getState();\n      const progress = state.progress[0];\n      if (!progress) {\n        return;\n      }\n      const started = runFromFirstNotDone(progress, ref, state.storage.settings, Date.now());\n      if (!started) {\n        return;\n      }\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"progress\")\n            .pi(progress.id)\n            .recordModify(() => started),\n        ],\n        \"Start block\"\n      );\n    };\n  }\n\n  // Restart: clears a logged circuit (times, logged reps, RPE, the logged mark) and starts a run at step 1.\n  // It asks first when a member set has a result. Known limit: the update scripts of the sets that ran stay.\n  export function restartBlock(blockName: string, now: number = Date.now()): IThunk {\n    return async (dispatch, getState) => {\n      const state = getState();\n      const progress = state.progress[0];\n      if (!progress) {\n        return;\n      }\n      const members = progress.entries.filter((entry) => entry.superset === blockName && entry.block != null);\n      if (members.length === 0) {\n        return;\n      }\n      const hasResult = members.some((entry) =>\n        entry.sets.some((set) => set.isCompleted || set.completedReps != null || set.completedRpe != null)\n      );\n      if (hasResult && !confirm(\"Clear this circuit and start again? The times and the logged reps will be cleared.\")) {\n        return;\n      }\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"progress\")\n            .pi(progress.id)\n            .recordModify((aProgress) => {\n              const cleared = Progress.resetBlock(aProgress, blockName);\n              return runFromFirstNotDone(cleared, blockName, state.storage.settings, now) ?? cleared;\n            }),\n        ],\n        \"Restart block\"\n      );\n    };\n  }\n\n  // Next: the work step ends now. The set is done with the time that ran, then its rest starts.\n  // While paused, the time that ran is the time shown at the pause, and the run stays paused on the next step.\n  // It goes through `EndWorkStepAction`, like the end of the countdown, so the update script runs.\n  export function nextBlock(now: number = Date.now()): IThunk {\n    return async (dispatch, getState) => {\n      const state = getState();\n      const progress = state.progress[0];\n      if (!progress?.blockRun) {\n        return;\n      }\n      const { setTimerSince, setTimerEntryIndex, setTimerSetIndex } = progress;\n      if (setTimerSince == null || setTimerEntryIndex == null || setTimerSetIndex == null) {\n        return;\n      }\n      const { programExercise, otherStates } = getProgramExerciseForEntry(state, progress, setTimerEntryIndex);\n      dispatch({\n        type: \"EndWorkStepAction\",\n        entryIndex: setTimerEntryIndex,\n        setIndex: setTimerSetIndex,\n        isPlayground: false,\n        completedSetTimer: Math.max(0, Math.round(Progress.stepElapsedMs(progress, setTimerSince, now) / 1000)),\n        timestamp: now,\n        programExercise,\n        otherStates,\n      });\n    };\n  }\n\n  // Skip: the set stays not done. Its rest starts, then the next step.\n  export function skipBlock(now: number = Date.now()): IThunk {\n    return async (dispatch, getState) => {\n      const state = getState();\n      const progress = state.progress[0];\n      if (!progress?.blockRun) {\n        return;\n      }\n      const { setTimerSince, setTimerEntryIndex, setTimerSetIndex } = progress;\n      if (setTimerSince == null || setTimerEntryIndex == null || setTimerSetIndex == null) {\n        return;\n      }\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"progress\")\n            .pi(progress.id)\n            .recordModify((aProgress) =>\n              Progress.keepPaused(\n                aProgress,\n                Progress.skipWorkStep(aProgress, now, setTimerEntryIndex, setTimerSetIndex, state.storage.settings),\n                now\n              )\n            ),\n        ],\n        \"Skip work step\"\n      );\n    };\n  }\n\n  // Back: restarts the current step after 3 s, or goes to the previous step. Step 0 does nothing. A paused run stays paused.\n  // `Progress.backStep` starts or stops the native rest alert through `startTimer` and `stopTimer`.\n  export function backBlock(now: number = Date.now()): IThunk {\n    return async (dispatch, getState) => {\n      const state = getState();\n      const progress = state.progress[0];\n      if (!progress?.blockRun) {\n        return;\n      }\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"progress\")\n            .pi(progress.id)\n            .recordModify((aProgress) => Progress.backStep(aProgress, now, state.storage.settings)),\n        ],\n        \"Back\"\n      );\n    };\n  }\n\n  // Skip rest: the next step starts at once. No set changes its done state.\n  export function skipRest(now: number = Date.now()): IThunk {\n    return async (dispatch, getState) => {\n      const state = getState();\n      const progress = state.progress[0];\n      if (!progress?.blockRun) {\n        return;\n      }\n      if (progress.timerSince == null || progress.timerEntryIndex == null || progress.timerSetIndex == null) {\n        return;\n      }\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"progress\")\n            .pi(progress.id)\n            .recordModify((aProgress) =>\n              Progress.keepPaused(aProgress, Progress.skipRunRest(aProgress, now, state.storage.settings), now)\n            ),\n        ],\n        \"Skip rest\"\n      );\n    };\n  }\n\n  // Redo: clears a done timer set and starts a run from it. The run plays the later sets that are not done.\n  // A set with a saved time asks first. A run that is active is replaced. While paused it does nothing.\n  export function redoSet(ref: IBlockRef, entryIndex: number, setIndex: number, now: number = Date.now()): IThunk {\n    return async (dispatch, getState) => {\n      const state = getState();\n      const progress = state.progress[0];\n      if (!progress || progress.blockRun?.isPaused) {\n        return;\n      }\n      const set = progress.entries[entryIndex]?.sets[setIndex];\n      if (!set?.isCompleted) {\n        return;\n      }\n      const steps = Block.getSteps(progress.entries, ref, state.storage.settings);\n      const hasStep = steps.some(\n        (step) => step.type === \"work\" && step.entryIndex === entryIndex && step.setIndex === setIndex\n      );\n      if (!hasStep) {\n        return;\n      }\n      if (\n        set.completedSetTimer != null &&\n        !confirm(\"Redo starts the timer again from this set. The time of this set will be cleared. Redo the set?\")\n      ) {\n        return;\n      }\n      const name = typeof ref === \"string\" ? ref : ref.name;\n      const runEntryIndex = typeof ref === \"string\" ? undefined : ref.entryIndex;\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"progress\")\n            .pi(progress.id)\n            .recordModify((aProgress) =>\n              Progress.startRunWorkStep(\n                {\n                  ...Progress.clearTimerSet(aProgress, entryIndex, setIndex),\n                  blockRun: { name, entryIndex: runEntryIndex, startedAt: now, isPaused: false, pausedAt: undefined },\n                },\n                now,\n                entryIndex,\n                setIndex\n              )\n            ),\n        ],\n        \"Redo set\"\n      );\n    };\n  }\n\n  export function reconcileBlock(now: number): IThunk {\n    return async (dispatch, getState) => {\n      const initialState = getState();\n      const initialProgress = initialState.progress[0];\n      if (!initialProgress?.blockRun) {\n        return;\n      }\n      const maxIterations =\n        Block.getSteps(initialProgress.entries, initialProgress.blockRun, initialState.storage.settings).length + 1;\n\n      for (let iteration = 0; ; iteration += 1) {\n        const state = getState();\n        const progress = state.progress[0];\n        if (!progress?.blockRun) {\n          return;\n        }\n        const event = Block.nextDueEvent(progress, now, state.storage.settings);\n        if (!event) {\n          return;\n        }\n        if (iteration >= maxIterations) {\n          lg(\"block-reconcile-loop-guard-hit\", { blockName: progress.blockRun.name });\n          ErrorReporter.report(`Thunk.reconcileBlock: loop guard hit for block \"${progress.blockRun.name}\"`);\n          updateState(\n            dispatch,\n            [\n              lb<IState>().p(\"notification\").record({\n                type: \"error\",\n                content: \"Something went wrong catching up the circuit timer. Please stop and restart the circuit.\",\n              }),\n            ],\n            \"Block reconcile loop guard\"\n          );\n          return;\n        }\n\n        if (event.type === \"closeSetTimer\") {\n          const { programExercise, otherStates } = getProgramExerciseForEntry(state, progress, event.entryIndex);\n          dispatch({\n            type: \"EndWorkStepAction\",\n            entryIndex: event.entryIndex,\n            setIndex: event.setIndex,\n            isPlayground: false,\n            completedSetTimer: event.completedSetTimer,\n            timestamp: event.at,\n            programExercise,\n            otherStates,\n          });\n        } else if (event.type === \"autoAdvance\") {\n          await dispatch(Thunk.autoAdvanceSet(now));\n        } else {\n          const newProgress = Progress.endBlockRun(progress, { openLog: Progress.shouldOpenRunLog(progress) });\n          updateState(dispatch, [lb<IState>().p(\"progress\").pi(progress.id).record(newProgress)], \"Block ended\");\n          return;\n        }\n      }\n    };\n  }\n\n  // Cancel on a circuit: reverts all progress and ends the run, so the card shows \"Start circuit\" again.\n  // It asks first when a member set has a result (the same question as Restart). A single exercise has Redo for\n  // each set, so its Cancel keeps the done sets (see `stopBlock`).\n  export function cancelBlock(): IThunk {\n    return async (dispatch, getState) => {\n      const progress = getState().progress[0];\n      const blockRun = progress?.blockRun;\n      if (!progress || !blockRun) {\n        return;\n      }\n      if (blockRun.entryIndex != null) {\n        await dispatch(Thunk.stopBlock());\n        return;\n      }\n      const blockName = blockRun.name;\n      const members = progress.entries.filter((entry) => entry.superset === blockName && entry.block != null);\n      const hasResult = members.some((entry) =>\n        entry.sets.some((set) => set.isCompleted || set.completedReps != null || set.completedRpe != null)\n      );\n      if (\n        hasResult &&\n        !confirm(\n          'Clear this circuit? The times and logged exercises will be deleted. To keep partial progress, hit \"skip\" to the end.'\n        )\n      ) {\n        return;\n      }\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"progress\")\n            .pi(progress.id)\n            .recordModify((aProgress) =>\n              Progress.resetBlock(Progress.endBlockRun(aProgress, { openLog: false }), blockName)\n            ),\n        ],\n        \"Cancel block\"\n      );\n    };\n  }\n\n  // Stop: ends the run. Done sets stay done, the current set stays not done and no rest starts.\n  export function stopBlock(): IThunk {\n    return async (dispatch, getState) => {\n      const state = getState();\n      const progress = state.progress[0];\n      if (!progress?.blockRun) {\n        return;\n      }\n      const newProgress = Progress.endBlockRun(progress, { openLog: false });\n      updateState(dispatch, [lb<IState>().p(\"progress\").pi(progress.id).record(newProgress)], \"Stop block\");\n    };\n  }\n\n  // The \"Use in-app timers\" toggle. Turning it off during a run ends the run first. Done sets stay done.\n  // On is the absence of the flag, so turning it on removes the flag.\n  export function setInAppTimers(isOn: boolean): IThunk {\n    return async (dispatch, getState) => {\n      if (!isOn && getState().progress[0]?.blockRun != null) {\n        await dispatch(Thunk.stopBlock());\n      }\n      updateSettings(\n        dispatch,\n        lb<ISettings>()\n          .p(\"disableInAppTimers\")\n          .record(isOn ? undefined : true),\n        \"Use in-app timers\"\n      );\n    };\n  }\n\n  export function pauseBlock(now: number = Date.now()): IThunk {\n    return async (dispatch, getState) => {\n      const progress = getState().progress[0];\n      if (!progress?.blockRun || progress.blockRun.isPaused) {\n        return;\n      }\n      dispatch({ type: \"PauseBlockAction\", now });\n      if (progress.timerSince != null) {\n        // A paused rest must not ring from the native side.\n        Progress.sendNativeStopTimer();\n      }\n    };\n  }\n\n  export function resumeBlock(now: number = Date.now()): IThunk {\n    return async (dispatch, getState) => {\n      const before = getState().progress[0];\n      if (!before?.blockRun?.isPaused) {\n        return;\n      }\n      dispatch({ type: \"ResumeBlockAction\", now });\n      const state = getState();\n      const progress = state.progress[0];\n      const { timer, timerSince, timerMode, timerEntryIndex, timerSetIndex } = progress ?? {};\n      if (\n        !progress ||\n        timer == null ||\n        timerSince == null ||\n        timerMode == null ||\n        timerEntryIndex == null ||\n        timerSetIndex == null\n      ) {\n        return;\n      }\n      const timeLeft = timer - Math.floor((now - timerSince) / 1000);\n      if (timeLeft > 0) {\n        Progress.sendNativeTimer(progress, timerMode, timerEntryIndex, timerSetIndex, state.storage.settings, timeLeft);\n      }\n    };\n  }\n\n  // Muted plays no sound but keeps the vibration. On native the vibration goes through the sound message.\n  export function playAudioNotification(isMuted?: boolean): IThunk {\n    return async (dispatch, getState, env) => {\n      if (getState().adminKey == null) {\n        const settings = getState().storage.settings;\n        if (!isMuted) {\n          env.audio.play(settings.volume, !!settings.vibration);\n        } else if (settings.vibration && SendMessage.isIosOrAndroid()) {\n          env.audio.play(0, true);\n        }\n      }\n    };\n  }\n\n  export function fetchStorage(storageId?: string): IThunk {\n    return async (dispatch, getState, env) => {\n      if (getState().errors.corruptedstorage == null) {\n        const result = await load(dispatch, \"Loading from cloud\", async () => {\n          const state = getState();\n          const url = typeof window !== \"undefined\" ? UrlUtils.build(window.location.href) : undefined;\n          const userIdFromUrl = url != null ? url.searchParams.get(\"userid\") : undefined;\n          const userId = userIdFromUrl ?? state.user?.id;\n          const response = await env.service.getStorage(userId || undefined, storageId, state.adminKey);\n          if (\"type\" in response) {\n            alertOutdatedStorage(response.error);\n            throw new NoRetryError(response.error);\n          }\n          return response;\n        });\n        await handleLogin(dispatch, getState, env, result, getState().user?.id);\n      }\n    };\n  }\n\n  export function pushToEditProgram(dayData?: Required<IDayData>, key?: string): IThunk {\n    return async (dispatch, getState) => {\n      const state = getState();\n      const currentProgram =\n        state.storage.currentProgramId != null ? Program.getProgram(state, state.storage.currentProgramId) : undefined;\n      if (Program.isEmpty(currentProgram)) {\n        dispatch(Thunk.pushScreen(state.adminKey ? \"programs\" : \"main\"));\n      } else if (currentProgram) {\n        Program.editAction(dispatch, currentProgram, dayData, key, true);\n      }\n    };\n  }\n\n  export function startProgramDay(programId?: string): IThunk {\n    return async (dispatch, getState) => {\n      const state = getState();\n      const progress = state.progress[0];\n      if (progress != null) {\n        dispatch(Thunk.pushScreen(\"progress\", { id: progress.id }, true));\n      } else if (state.storage.currentProgramId != null) {\n        const program = Program.getProgram(state, programId ?? state.storage.currentProgramId);\n        if (program != null) {\n          const newProgress = Program.nextHistoryRecord(program, state.storage.settings, state.storage.stats);\n          updateState(\n            dispatch,\n            [\n              lb<IState>()\n                .p(\"progress\")\n                .recordModify((progresses) => {\n                  return { ...progresses, [newProgress.id]: newProgress };\n                }),\n            ],\n            \"Create new progress\"\n          );\n          dispatch(Thunk.pushScreen(\"progress\", { id: newProgress.id }, true));\n        } else {\n          alert(\"No currently selected program\");\n        }\n      }\n    };\n  }\n\n  export function pushToEditProgramExercise(key: string, dayData: Required<IDayData>): IThunk {\n    return async (dispatch, getState) => {\n      const state = getState();\n      const programScreen = [...state.screenStack].reverse().find((s) => s.name === \"editProgram\");\n      const data = programScreen?.name === \"editProgram\" ? programScreen.params?.plannerState : undefined;\n      const currentProgram =\n        data?.current.program ||\n        (state.storage.currentProgramId != null\n          ? Program.getProgram(state, state.storage.currentProgramId)\n          : undefined);\n      if (currentProgram && !Program.isEmpty(currentProgram)) {\n        const plannerState = EditProgram.initPlannerProgramExerciseState(\n          currentProgram,\n          state.storage.settings,\n          key,\n          dayData,\n          !programScreen\n        );\n        dispatch(Thunk.pushScreen(\"editProgramExercise\", { key, dayData, plannerState }));\n      } else {\n        dispatch(Thunk.pushScreen(\"main\"));\n      }\n    };\n  }\n\n  export function pushScreen<T extends IScreen>(\n    screen: T,\n    params?: IScreenParams<T>,\n    shouldResetStack?: boolean\n  ): IThunk {\n    return async (dispatch, getState) => {\n      dispatch(postevent(\"navigate-to-\" + screen));\n      if (shouldResetStack) {\n        const confirmation = Screen.shouldConfirmNavigation(getState(), true);\n        if (confirmation) {\n          if (confirm(confirmation)) {\n            cleanup(dispatch, getState());\n            dispatch({ type: \"PullScreen\" });\n          } else {\n            return;\n          }\n        }\n      }\n      if (getState().storage.currentProgramId == null && !Screen.isAllowedWithoutProgram(screen)) {\n        screen = \"main\" as T;\n      }\n      dispatch({ type: \"PushScreen\", screen, params, shouldResetStack });\n      window.scroll(0, 0);\n    };\n  }\n\n  export function updateScreenParams<T extends IScreen>(params?: IScreenParams<T>): IThunk {\n    return async (dispatch, getState) => {\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"screenStack\")\n            .recordModify((stack) => {\n              return Screen.updateParams(stack, params);\n            }),\n        ],\n        \"Update screen params\"\n      );\n    };\n  }\n\n  export function maybeRequestReview(): IThunk {\n    return async (dispatch, getState) => {\n      try {\n        const history = getState().storage.history;\n        const state = getState();\n        const now = Date.now();\n        const reviewRequests = state.storage.reviewRequests;\n        const lastReviewRequest = reviewRequests[reviewRequests.length - 1];\n        if (\n          history.length > 10 &&\n          reviewRequests.length < 3 &&\n          (!lastReviewRequest || now - lastReviewRequest > 1000 * 60 * 60 * 24 * 32)\n        ) {\n          dispatch(postevent(\"request-review\"));\n          SendMessage.toIos({ type: \"requestReview\" });\n          SendMessage.toAndroid({ type: \"requestReview\" });\n        }\n      } catch (error) {\n        const e = error as Error;\n        ErrorReporter.report(\"Request review failed\", e);\n      }\n    };\n  }\n\n  function cleanup(dispatch: IDispatch, state: IState): void {\n    const progress = Progress.getProgress(state);\n    if (progress && !Progress.isCurrent(progress)) {\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"progress\")\n            .recordModify((progresses) => Progress.stop(progresses, progress.id)),\n        ],\n        \"Stop workout progress\"\n      );\n    }\n  }\n\n  export function pullScreen(): IThunk {\n    return async (dispatch, getState) => {\n      const confirmation = Screen.shouldConfirmNavigation(getState(), false);\n      if (confirmation) {\n        if (confirm(confirmation)) {\n          cleanup(dispatch, getState());\n        } else {\n          return;\n        }\n      }\n      dispatch({ type: \"PullScreen\" });\n      window.scroll(0, 0);\n    };\n  }\n\n  export function publishProgram(\n    program: IProgram,\n    args: Pick<IProgram, \"id\" | \"author\" | \"name\" | \"description\" | \"url\">\n  ): IThunk {\n    const { id, author, name, description, url } = args;\n    return async (dispatch, getState, env) => {\n      const state = getState();\n      const newProgram = {\n        ...program,\n        id,\n        author,\n        name,\n        description,\n        url,\n      };\n      // The publish form writes an HTML description by hand, so it is never layered text.\n      delete newProgram.descriptionFormat;\n      if (state.adminKey) {\n        await env.service.publishProgram(newProgram, state.adminKey);\n        alert(\"Published\");\n      }\n    };\n  }\n\n  export function fetchPrograms(): IThunk {\n    return async (dispatch, getState, env) => {\n      const programs = await load(dispatch, \"Loading programs\", () => env.service.programs());\n      dispatch({\n        type: \"UpdateState\",\n        lensRecording: [lb<IState>().p(\"programs\").record(programs)],\n        desc: \"Set loaded Programs\",\n      });\n    };\n  }\n\n  export function exportStorage(): IThunk {\n    return async (dispatch, getState, env) => {\n      dispatch(postevent(\"export-storage-to-json\"));\n      ImportExporter.exportStorage(getState().storage);\n    };\n  }\n\n  export function exportProgramToFile(program: IProgram): IThunk {\n    return async (dispatch, getState, env) => {\n      dispatch(postevent(\"export-program-to-file\"));\n      const state = getState();\n      Program.exportProgramToFile(program, state.storage.settings, state.storage.version);\n    };\n  }\n\n  export function exportHistoryToCSV(): IThunk {\n    return async (dispatch, getState, env) => {\n      dispatch(postevent(\"export-history-to-csv\"));\n      const state = getState();\n      const csv = CSV.toString(History.exportAsCSV(state.storage.history, state.storage.settings));\n      Exporter.toFile(`liftosaur_${DateUtils.formatYYYYMMDD(Date.now())}.csv`, csv);\n    };\n  }\n\n  export function exportProgramsToText(): IThunk {\n    return async (dispatch, getState, env) => {\n      dispatch(postevent(\"export-programs-to-text\"));\n      let text = \"\";\n      for (const program of getState().storage.programs) {\n        if (!program.planner) {\n          continue;\n        }\n        text += `======= ${program.name} =======\\n\\n`;\n        text += PlannerProgram.generateFullText(program.planner.weeks);\n        text += `\\n\\n\\n`;\n      }\n      Exporter.toFile(`liftosaur_all_programs_${DateUtils.formatYYYYMMDD(Date.now())}.txt`, text);\n    };\n  }\n\n  export function createAccount(): IThunk {\n    return async (dispatch, getState, env) => {\n      dispatch(postevent(\"create-account\"));\n      dispatch(\n        Thunk.logOut(async () => {\n          const newState = await getInitialState(env.service.client);\n          dispatch({ type: \"ReplaceState\", state: newState });\n          dispatch(Thunk.fetchInitial());\n        })\n      );\n    };\n  }\n\n  export function deleteAccount(id: string, cb?: () => void): IThunk {\n    return async (dispatch, getState, env) => {\n      dispatch(postevent(\"delete-local-account\"));\n      await IndexedDBUtils.remove(`liftosaur_${id}`);\n      if (cb) {\n        cb();\n      }\n    };\n  }\n\n  export function deleteAccountRemote(cb?: (result: boolean) => void): IThunk {\n    return async (dispatch, getState, env) => {\n      await load(dispatch, \"Delete cloud account\", () => {\n        return new Promise(async (resolve) => {\n          dispatch(postevent(\"delete-remove-account\"));\n          const result = await env.service.deleteAccount();\n          dispatch(\n            Thunk.logOut(() => {\n              if (cb) {\n                cb(result);\n                resolve(result);\n              }\n            })\n          );\n        });\n      });\n    };\n  }\n\n  export function switchAccount(id: string): IThunk {\n    return async (dispatch, getState, env) => {\n      dispatch(\n        Thunk.logOut(async () => {\n          dispatch(postevent(\"switch-account\"));\n          const rawStorage = (await IndexedDBUtils.get(`liftosaur_${id}`)) as string | undefined;\n          if (rawStorage != null) {\n            const result = await Storage.get(env.service.client, JSON.parse(rawStorage)?.storage);\n            if (result.success) {\n              const newState = await getInitialState(env.service.client, { rawStorage });\n              dispatch({ type: \"ReplaceState\", state: newState });\n              dispatch(Thunk.fetchInitial());\n            } else {\n              console.error(\"Failed to switch account, error:\", result.error);\n              alert(`Error while trying to switch the account: ${result.error}`);\n            }\n          } else {\n            console.error(\"Error while trying to switch the account: missing account\", id);\n            alert(`Error while trying to switch the account: missing account ${id}`);\n          }\n        })\n      );\n    };\n  }\n\n  export function fetchInitial(): IThunk {\n    return async (dispatch, getState, env) => {\n      dispatch(Thunk.fetchPrograms());\n    };\n  }\n}\n\nasync function load<T>(dispatch: IDispatch, type: string, cb: () => Promise<T>): Promise<T> {\n  return new Promise((resolve, reject) => {\n    const name = UidFactory.generateUid(4);\n    _load(dispatch, name, type, cb, 0, resolve, reject);\n  });\n}\n\nfunction _load<T>(\n  dispatch: IDispatch,\n  name: string,\n  type: string,\n  cb: () => Promise<T>,\n  attempt: number,\n  resolve: (arg: T) => void,\n  reject: (arg: unknown) => void\n): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"loading\")\n        .p(\"items\")\n        .p(name)\n        .recordModify((i) => {\n          if (i == null) {\n            return { startTime: Date.now(), attempt, type };\n          } else {\n            return { ...i, attempt };\n          }\n        }),\n    ],\n    \"Start loading\"\n  );\n  cb()\n    .then((r) => {\n      updateState(\n        dispatch,\n        [\n          lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"endTime\").record(Date.now()),\n          lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"error\").record(undefined),\n        ],\n        \"End loading\"\n      );\n      resolve(r);\n    })\n    .catch((e) => {\n      if (e.name === \"AbortError\") {\n        updateState(\n          dispatch,\n          [\n            lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"endTime\").record(Date.now()),\n            lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"error\").record(undefined),\n          ],\n          \"Abort loading\"\n        );\n        reject(e);\n        return;\n      }\n      if (attempt >= 3 || (e instanceof NoRetryError && e.noretry)) {\n        updateState(\n          dispatch,\n          [\n            lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"error\").record(`${type} failed`),\n            lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"endTime\").record(Date.now()),\n          ],\n          `Failed loading`\n        );\n        if (type === \"Logging in\") {\n          ErrorReporter.report(\"Error while logging in\", e);\n        }\n        reject(e);\n      } else {\n        setTimeout(() => {\n          _load(dispatch, name, type, cb, attempt + 1, resolve, reject);\n        }, 1000);\n      }\n    });\n}\n\n// After a login, the phone loads `GET /api/snapshot` when it has no snapshot. A different user's local state goes\n// away first. The same user keeps the local state: with no snapshot, the first-start converter keeps the workouts\n// that the server does not have, and the old app's unsynced changes when it has `lastSyncedStorage`\n// (`Sync.applyConversion`). The admin load (`fetchStorage`) still gives a whole storage from `/api/storage`.\nasync function handleLogin(\n  dispatch: IDispatch,\n  getState: () => IState,\n  env: IEnv,\n  result: ILoginResponse & { storage?: IStorage },\n  oldUserId?: string\n): Promise<void> {\n  const client = env.service.client;\n  try {\n    if (result.email != null) {\n      dispatch(Thunk.postevent(\"login\"));\n      let storage: IStorage = Storage.getDefault();\n      const service = new Service(client);\n      if (result.storage != null) {\n        const storageResult = await Storage.get(client, result.storage, true);\n        if (storageResult.success) {\n          storage = storageResult.data;\n        } else {\n          storage = result.storage;\n          await service.postDebug(JSON.stringify(result.storage), { local: \"false\" });\n        }\n      }\n      storage.email = result.email;\n      if (result.is_new_user && oldUserId) {\n        try {\n          await service.postDebug(JSON.stringify(window.state || {}), {\n            old_userid: oldUserId,\n            new_userid: result.user_id,\n            email: result.email,\n          });\n        } catch (e) {\n          console.error(\"Failed to upload debug data for old user\", e);\n        }\n      }\n      if (oldUserId === result.user_id) {\n        console.log(\"Login - same user\");\n        dispatch(Thunk.postevent(\"login-same-user\"));\n        dispatch({ type: \"Login\", email: result.email, userId: result.user_id });\n      } else {\n        console.log(\"Login - different user\");\n        dispatch(Thunk.postevent(\"login-different-user\"));\n        const newState = await getInitialState(client, { storage });\n        newState.user = { id: result.user_id, email: result.email };\n        dispatch({ type: \"ReplaceState\", state: newState });\n      }\n      if (result.storage == null && getState().snapshot == null) {\n        await Thunk.loadSnapshot(dispatch, getState, env);\n      }\n      dispatch(Thunk.fetchInitial());\n    }\n  } catch (error) {\n    console.error(error);\n    throw error;\n  }\n}\n","import { CollectionUtils } from \"../utils/collection\";\n\nimport { IWeight, IUnit, ISettings, IPlate, IPercentage, IExerciseType } from \"../types\";\nimport { MathUtils, n } from \"../utils/math\";\nimport { Equipment } from \"./equipment\";\nimport { Exercise } from \"./exercise\";\n\nconst prebuiltWeights: Partial<Record<string, IWeight>> = {};\n\nexport namespace Weight {\n  export const zero: IWeight = { value: 0, unit: \"lb\" } as const;\n  export function display(weight: IWeight | IPercentage | number, withUnit: boolean = true): string {\n    if (typeof weight === \"number\") {\n      return `${weight}`;\n    } else if (Weight.isPct(weight)) {\n      return `${weight.value}${withUnit ? \"%\" : \"\"}`;\n    } else {\n      return `${parseFloat(weight.value.toFixed(2)).toString()}${withUnit ? ` ${weight.unit}` : \"\"}`;\n    }\n  }\n\n  export function rpePct(reps: number, rpe: number): IPercentage {\n    return Weight.buildPct(MathUtils.roundTo005(Weight.rpeMultiplier(reps, rpe) * 100));\n  }\n\n  export function evaluateWeight(\n    weight: IWeight | IPercentage,\n    exerciseType: IExerciseType,\n    settings: ISettings\n  ): IWeight {\n    if (Weight.is(weight)) {\n      return weight;\n    } else if (Weight.isPct(weight)) {\n      const exercise = Exercise.get(exerciseType, settings.exercises);\n      const onerm = Exercise.onerm(exercise, settings);\n      return Weight.multiply(onerm, weight.value / 100);\n    } else {\n      const unit = Equipment.getUnitOrDefaultForExerciseType(settings, exerciseType);\n      return Weight.build(0, unit);\n    }\n  }\n\n  export function smartConvert(weight: IWeight, toUnit: IUnit): IWeight {\n    if (weight.unit === toUnit) {\n      return weight;\n    }\n    const value = weight.value;\n    if (weight.unit === \"kg\") {\n      if (value < 15) {\n        return Weight.build(value * 2, toUnit);\n      } else {\n        return Weight.build(MathUtils.round(value * 2.25, 5), toUnit);\n      }\n    } else {\n      if (value < 15) {\n        return Weight.build(MathUtils.round(value / 2, 0.25), toUnit);\n      } else {\n        return Weight.build(MathUtils.round(value / 2.25, 2.5), toUnit);\n      }\n    }\n  }\n\n  export function oppositeUnit(unit: IUnit): IUnit {\n    return unit === \"kg\" ? \"lb\" : \"kg\";\n  }\n\n  export function print(weight: IWeight | IPercentage | number): string {\n    if (typeof weight === \"number\") {\n      return `${n(weight)}`;\n    } else {\n      return `${n(weight.value)}${weight.unit}`;\n    }\n  }\n\n  export function printNull(weight: IWeight | IPercentage | number | undefined): string {\n    if (weight == null) {\n      return \"\";\n    } else if (typeof weight === \"number\") {\n      return `${n(weight)}`;\n    } else {\n      return `${n(weight.value)}${weight.unit}`;\n    }\n  }\n\n  export function parsePct(str?: string): IPercentage | IWeight | undefined {\n    if (str == null) {\n      return undefined;\n    }\n    const match = str.match(/^([\\-+]?[0-9.]+)%$/);\n    if (match) {\n      return buildPct(MathUtils.roundFloat(parseFloat(match[1]), 2));\n    } else {\n      return parse(str);\n    }\n  }\n\n  export function parse(str: string): IWeight | undefined {\n    const match = str.match(/^([\\-+]?[0-9.]+)\\s*(kg|lb)$/);\n    if (match) {\n      return build(MathUtils.roundFloat(parseFloat(match[1]), 2), match[2] as IUnit);\n    } else {\n      return undefined;\n    }\n  }\n\n  export function printOrNumber(weight: IWeight | IPercentage | number): string {\n    return typeof weight === \"number\" ? `${weight}` : print(weight);\n  }\n\n  export function buildPct(value: number): IPercentage {\n    return { value, unit: \"%\" };\n  }\n\n  export function buildAny(value: number, unit: IUnit | \"%\"): IWeight | IPercentage {\n    if (unit === \"%\") {\n      return buildPct(value);\n    } else {\n      return build(value, unit);\n    }\n  }\n\n  export function build(value: number, unit: IUnit): IWeight {\n    const key = `${value}_${unit}`;\n    const prebuiltWeight = prebuiltWeights[key];\n    if (prebuiltWeight != null) {\n      return prebuiltWeight;\n    } else {\n      const v = { value: typeof value === \"string\" ? parseFloat(value) : value, unit };\n      prebuiltWeights[`${value}_${unit}`] = v;\n      return v;\n    }\n  }\n\n  export function clone(value: IWeight): IWeight {\n    return build(value.value, value.unit);\n  }\n\n  export function isOrPct(object: unknown): object is IWeight | IPercentage {\n    const objWeight = object as IWeight | IPercentage;\n    return (\n      objWeight &&\n      typeof objWeight === \"object\" &&\n      \"unit\" in objWeight &&\n      \"value\" in objWeight &&\n      (objWeight.unit === \"kg\" || objWeight.unit === \"lb\" || objWeight.unit === \"%\")\n    );\n  }\n\n  export function is(object: unknown): object is IWeight {\n    const objWeight = object as IWeight;\n    return (\n      objWeight &&\n      typeof objWeight === \"object\" &&\n      \"unit\" in objWeight &&\n      \"value\" in objWeight &&\n      (objWeight.unit === \"kg\" || objWeight.unit === \"lb\")\n    );\n  }\n\n  export function isPct(object: unknown): object is IPercentage {\n    const objWeight = object as IPercentage;\n    return (\n      objWeight &&\n      typeof objWeight === \"object\" &&\n      \"unit\" in objWeight &&\n      \"value\" in objWeight &&\n      objWeight.unit === \"%\"\n    );\n  }\n\n  export function round(weight: IWeight, settings: ISettings, unit: IUnit, exerciseType?: IExerciseType): IWeight {\n    if (exerciseType == null) {\n      return roundTo005(weight);\n    }\n    return Weight.calculatePlates(weight, settings, unit, exerciseType).totalWeight;\n  }\n\n  export function increment(weight: IWeight, settings: ISettings, exerciseType?: IExerciseType): IWeight {\n    const equipmentData = Equipment.getEquipmentDataForExerciseType(settings, exerciseType);\n    if (equipmentData) {\n      const unit = equipmentData.unit ?? weight.unit;\n      const roundWeight = Weight.round(weight, settings, unit, exerciseType);\n      if (equipmentData.isFixed) {\n        const items = CollectionUtils.sort(\n          equipmentData.fixed.filter((e) => e.unit === unit),\n          (a, b) => Weight.compare(a, b)\n        );\n        const item = items.find((i) => Weight.gt(i, roundWeight));\n        return item ?? items[items.length - 1] ?? roundWeight;\n      } else {\n        const smallestPlate = Weight.multiply(Equipment.smallestPlate(equipmentData, unit), equipmentData.multiplier);\n        let newWeight = roundWeight;\n        for (let attempt = 0; attempt < 20; attempt += 1) {\n          newWeight = Weight.add(newWeight, smallestPlate);\n          const rounded = Weight.round(newWeight, settings, unit, exerciseType);\n          if (!Weight.eq(rounded, roundWeight)) {\n            return rounded;\n          }\n        }\n        return roundWeight;\n      }\n    } else {\n      const roundWeight = Weight.round(weight, settings, weight.unit, exerciseType);\n      const rounding = exerciseType ? Exercise.defaultRounding(exerciseType, settings) : 1;\n      return Weight.build(roundWeight.value + rounding, roundWeight.unit);\n    }\n  }\n\n  export function decrement(weight: IWeight, settings: ISettings, exerciseType?: IExerciseType): IWeight {\n    const equipmentData = exerciseType ? Equipment.getEquipmentDataForExerciseType(settings, exerciseType) : undefined;\n    if (equipmentData) {\n      const unit = equipmentData.unit ?? weight.unit;\n      const roundWeight = Weight.round(weight, settings, unit, exerciseType);\n      if (equipmentData.isFixed) {\n        const items = CollectionUtils.sort(\n          equipmentData.fixed.filter((e) => e.unit === unit),\n          (a, b) => Weight.compareReverse(a, b)\n        );\n        const item = items.find((i) => Weight.lt(i, roundWeight));\n        return item ?? items[items.length - 1] ?? roundWeight;\n      } else {\n        const smallestPlate = Weight.multiply(Equipment.smallestPlate(equipmentData, unit), equipmentData.multiplier);\n        const subtracted = Weight.subtract(roundWeight, smallestPlate);\n        const newWeight = Weight.round(subtracted, settings, unit, exerciseType);\n        return Weight.build(newWeight.value, newWeight.unit);\n      }\n    } else {\n      const roundWeight = Weight.round(weight, settings, weight.unit, exerciseType);\n      const rounding = exerciseType ? Exercise.defaultRounding(exerciseType, settings) : 1;\n      return Weight.build(roundWeight.value - rounding, roundWeight.unit);\n    }\n  }\n\n  export function getOneRepMax(weight: IWeight, reps: number, rpe?: number): IWeight {\n    if (reps === 0) {\n      return Weight.build(0, weight.unit);\n    } else if (reps === 1) {\n      return weight;\n    } else {\n      return Weight.roundTo005(Weight.divide(weight, Weight.rpeMultiplier(reps, rpe ?? 10)));\n    }\n  }\n\n  export function getNRepMax(oneRepMax: IWeight, reps: number): IWeight {\n    if (reps === 0) {\n      return Weight.build(0, oneRepMax.unit);\n    } else if (reps === 1) {\n      return oneRepMax;\n    } else {\n      return Weight.roundTo005(Weight.multiply(oneRepMax, Weight.rpeMultiplier(reps, 10)));\n    }\n  }\n\n  export function getTrainingMax(weight: IWeight, reps: number, settings: ISettings): IWeight {\n    return Weight.round(Weight.multiply(Weight.getOneRepMax(weight, reps), 0.9), settings, weight.unit);\n  }\n\n  export function platesWeight(plates: IPlate[]): IWeight {\n    const unit = plates[0]?.weight.unit || \"lb\";\n    return plates.reduce(\n      (memo, plate) => Weight.add(memo, Weight.multiply(plate.weight, plate.num)),\n      Weight.build(0, unit)\n    );\n  }\n\n  export function formatOneSide(settings: ISettings, platesArr: IPlate[], exerciseType: IExerciseType): string {\n    const equipmentSettings = Equipment.getEquipmentDataForExerciseType(settings, exerciseType);\n    const plates: IPlate[] = JSON.parse(JSON.stringify(platesArr));\n    plates.sort((a, b) => Weight.compareReverse(a.weight, b.weight));\n    const arr: number[] = [];\n    const multiplier = equipmentSettings?.multiplier ?? 1;\n    while (true) {\n      const plate = plates.find((p) => p.num >= multiplier);\n      if (plate != null) {\n        arr.push(plate.weight.value);\n        plate.num -= multiplier;\n      } else {\n        break;\n      }\n    }\n\n    return CollectionUtils.compressArray(arr, 3).join(\"/\");\n  }\n\n  export function roundTo005(weight: IWeight): IWeight {\n    return Weight.build(MathUtils.roundTo005(weight.value), weight.unit);\n  }\n\n  export function roundTo000005(weight: IWeight): IWeight {\n    return Weight.build(MathUtils.roundTo000005(weight.value), weight.unit);\n  }\n\n  export function calculatePlates(\n    allWeight: IWeight,\n    settings: ISettings,\n    units: IUnit,\n    exerciseType: IExerciseType\n  ): { plates: IPlate[]; platesWeight: IWeight; totalWeight: IWeight } {\n    const equipmentData = Equipment.getEquipmentDataForExerciseType(settings, exerciseType);\n    if (equipmentData == null) {\n      const rounding = Exercise.defaultRounding(exerciseType, settings);\n      allWeight = Weight.build(MathUtils.round(allWeight.value, rounding), allWeight.unit);\n      return { plates: [], platesWeight: allWeight, totalWeight: allWeight };\n    }\n\n    const absAllWeight = Weight.abs(allWeight);\n    const inverted = allWeight.value < 0;\n    if (equipmentData.isFixed) {\n      const fixed = CollectionUtils.sort(\n        equipmentData.fixed.filter((w) => w.unit === (equipmentData.unit ?? units)),\n        (a, b) => b.value - a.value\n      );\n      const weight =\n        absAllWeight.value === 0\n          ? absAllWeight\n          : fixed.find((w) => Weight.lte(w, absAllWeight)) || fixed[fixed.length - 1] || absAllWeight;\n      let roundedWeight = roundTo005(weight);\n      roundedWeight = inverted ? Weight.invert(roundedWeight) : roundedWeight;\n      return { plates: [], platesWeight: roundedWeight, totalWeight: roundedWeight };\n    }\n    const availablePlatesArr = equipmentData.plates.filter((p) => p.weight.unit === units);\n    const barWeight =\n      equipmentData.useBodyweightForBar && settings.currentBodyweight\n        ? settings.currentBodyweight\n        : equipmentData.bar[units];\n    const multiplier = equipmentData.multiplier || 1;\n    const isAssisting = equipmentData.isAssisting || false;\n    const weight = Weight.roundTo000005(Weight.subtract(absAllWeight, barWeight));\n    const availablePlates: IPlate[] = JSON.parse(JSON.stringify(availablePlatesArr));\n    availablePlates.sort((a, b) => Weight.compareReverse(a.weight, b.weight));\n    const plates: IPlate[] = calculatePlatesInternalFast(weight, availablePlates, multiplier, isAssisting);\n    const total = plates.reduce(\n      (memo, plate) => {\n        const weightToAdd = Weight.multiply(plate.weight, plate.num);\n        return isAssisting ? Weight.subtract(memo, weightToAdd) : Weight.add(memo, weightToAdd);\n      },\n      Weight.build(0, allWeight.unit)\n    );\n    const totalWeight = Weight.roundTo000005(\n      inverted ? Weight.invert(Weight.add(total, barWeight)) : Weight.add(total, barWeight)\n    );\n    const thePlatesWeight = inverted ? Weight.invert(total) : total;\n    return { plates, platesWeight: thePlatesWeight, totalWeight };\n  }\n\n  export function abs(weight: IWeight): IWeight {\n    return Weight.build(Math.abs(weight.value), weight.unit);\n  }\n\n  export function invert(weight: IWeight): IWeight {\n    return Weight.build(-weight.value, weight.unit);\n  }\n\n  function calculatePlatesInternalFast(\n    weight: IWeight,\n    availablePlates: IPlate[],\n    multiplier: number,\n    isAssisting: boolean\n  ): IPlate[] {\n    let total = Weight.build(0, weight.unit);\n    const plates: IPlate[] = [];\n    while (true) {\n      const availablePlate = availablePlates.find((potentialPlate) => {\n        const multipliedWeight = Weight.multiply(potentialPlate.weight, multiplier);\n        const weightToCompare = isAssisting\n          ? Weight.subtract(total, multipliedWeight)\n          : Weight.add(total, multipliedWeight);\n        return (\n          potentialPlate.num >= multiplier &&\n          (isAssisting ? Weight.gte(weightToCompare, weight) : Weight.lte(weightToCompare, weight))\n        );\n      });\n      if (availablePlate != null) {\n        const multipliedWeight = Weight.multiply(availablePlate.weight, multiplier);\n        total = isAssisting ? Weight.subtract(total, multipliedWeight) : Weight.add(total, multipliedWeight);\n        availablePlate.num -= multiplier;\n        let plate = plates.find((p) => Weight.eq(p.weight, availablePlate!.weight));\n        if (plate == null) {\n          plate = { weight: availablePlate.weight, num: 0 };\n          plates.push(plate);\n        }\n        plate.num += multiplier;\n      } else {\n        break;\n      }\n    }\n    return plates;\n  }\n\n  export function add(weight: IWeight, value: IWeight | number): IWeight {\n    return operation(weight, value, (a, b) => a + b);\n  }\n\n  export function subtract(weight: IWeight, value: IWeight | number): IWeight {\n    return operation(weight, value, (a, b) => a - b);\n  }\n\n  export function multiply(weight: IWeight, value: IWeight | number): IWeight {\n    return operation(weight, value, (a, b) => a * b);\n  }\n\n  export function divide(weight: IWeight, value: IWeight | number): IWeight {\n    return operation(weight, value, (a, b) => a / b);\n  }\n\n  export function gt(weight: IWeight | number | IPercentage, value: IWeight | number | IPercentage): boolean {\n    return comparison(weight, value, (a, b) => a > b);\n  }\n\n  export function lt(weight: IWeight | number | IPercentage, value: IWeight | number | IPercentage): boolean {\n    return comparison(weight, value, (a, b) => a < b);\n  }\n\n  export function gte(weight: IWeight | number | IPercentage, value: IWeight | number | IPercentage): boolean {\n    return comparison(weight, value, (a, b) => a >= b);\n  }\n\n  export function lte(weight: IWeight | number | IPercentage, value: IWeight | number | IPercentage): boolean {\n    return comparison(weight, value, (a, b) => a <= b);\n  }\n\n  export function eqNull(\n    weight: IWeight | number | IPercentage | undefined,\n    value: IWeight | number | IPercentage | undefined\n  ): boolean {\n    if (weight == null && value == null) {\n      return true;\n    } else if (weight == null && value != null) {\n      return false;\n    } else if (weight != null && value == null) {\n      return false;\n    } else {\n      return comparison(weight!, value!, (a, b) => a === b);\n    }\n  }\n\n  export function eq(weight: IWeight | number | IPercentage, value: IWeight | number | IPercentage): boolean {\n    return comparison(weight, value, (a, b) => a === b);\n  }\n\n  export function eqeq(weight: IWeight, value: IWeight): boolean {\n    return weight.value === value.value && weight.unit === value.unit;\n  }\n\n  export function max(weights: IWeight[]): IWeight | undefined {\n    return CollectionUtils.sort(weights, Weight.compareReverse)[0];\n  }\n\n  export function roundConvertTo(\n    weight: IWeight,\n    settings: ISettings,\n    unit: IUnit,\n    exerciseType?: IExerciseType\n  ): IWeight {\n    return round(convertTo(weight, unit), settings, unit, exerciseType);\n  }\n\n  export function type(value: number | IWeight | IPercentage): \"weight\" | \"percentage\" | \"number\" {\n    if (typeof value === \"number\") {\n      return \"number\";\n    } else if (Weight.isPct(value)) {\n      return \"percentage\";\n    } else {\n      return \"weight\";\n    }\n  }\n\n  export function convertTo(weight: IWeight, unit: IUnit): IWeight;\n  export function convertTo(weight: IPercentage, unit: \"%\" | IUnit): IPercentage;\n  export function convertTo(weight: number, unit: IUnit): number;\n  export function convertTo(weight: IWeight | number | IPercentage, unit: IUnit | \"%\"): IWeight | number | IPercentage {\n    if (typeof weight === \"number\") {\n      return weight;\n    } else if (weight.unit === \"%\" || unit === \"%\") {\n      return weight;\n    } else {\n      if (weight.unit === unit) {\n        return weight;\n      } else if (weight.unit === \"kg\" && unit === \"lb\") {\n        return Weight.build(Math.round((weight.value * 2.205) / 0.5) * 0.5, unit);\n      } else {\n        return Weight.build(Math.round(weight.value / 2.205 / 0.5) * 0.5, unit);\n      }\n    }\n  }\n\n  export function compare(a: IWeight, b: IWeight): number {\n    return a.value - convertTo(b, a.unit).value;\n  }\n\n  export function compareReverse(a: IWeight, b: IWeight): number {\n    return convertTo(b, a.unit).value - a.value;\n  }\n\n  function comparison(\n    weight: IWeight | number | IPercentage,\n    value: IWeight | number | IPercentage,\n    o: (a: number, b: number) => boolean\n  ): boolean {\n    if (typeof weight === \"number\" && typeof value === \"number\") {\n      return o(weight, value);\n    } else if (typeof weight === \"number\" && typeof value !== \"number\") {\n      return o(weight, value.value);\n    } else if (typeof weight !== \"number\" && typeof value === \"number\") {\n      return o(weight.value, value);\n    } else if (typeof weight !== \"number\" && typeof value !== \"number\") {\n      if (weight.unit === \"%\" && value.unit === \"%\") {\n        return o(weight.value, value.value);\n      } else if (Weight.is(weight) && Weight.is(value)) {\n        return o(weight.value, convertTo(value, weight.unit).value);\n      } else {\n        return false;\n      }\n    } else {\n      return false;\n    }\n  }\n\n  export function applyOp(\n    onerm: IWeight | undefined,\n    oldValue: IWeight | number | IPercentage,\n    value: IWeight | number | IPercentage,\n    opr: \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"=\"\n  ): IWeight | number | IPercentage {\n    if (opr === \"=\") {\n      return value;\n    } else if (opr === \"+=\") {\n      return Weight.op(onerm, oldValue, value, (a, b) => a + b);\n    } else if (opr === \"-=\") {\n      return Weight.op(onerm, oldValue, value, (a, b) => a - b);\n    } else if (opr === \"*=\") {\n      return Weight.op(onerm, oldValue, value, (a, b) => MathUtils.roundTo005(a * b));\n    } else {\n      return Weight.op(onerm, oldValue, value, (a, b) => MathUtils.roundTo005(a / b));\n    }\n  }\n\n  export function op(\n    onerm: IWeight | undefined,\n    a: IWeight | number | IPercentage,\n    b: IWeight | number | IPercentage,\n    o: (x: number, y: number) => number\n  ): IWeight | number | IPercentage {\n    if (typeof a === \"number\" && typeof b === \"number\") {\n      return o(a, b);\n    }\n    if (typeof a === \"number\" && Weight.isPct(b)) {\n      return Weight.buildPct(o(a, b.value));\n    }\n    if (typeof a === \"number\" && Weight.is(b)) {\n      return Weight.operation(a, b, o);\n    }\n\n    if (Weight.isPct(a) && typeof b === \"number\") {\n      return Weight.buildPct(o(a.value, b));\n    }\n    if (Weight.isPct(a) && Weight.isPct(b)) {\n      return Weight.buildPct(o(a.value, b.value));\n    }\n    if (Weight.isPct(a) && Weight.is(b)) {\n      const aWeight = onerm ? Weight.multiply(onerm, a.value / 100) : MathUtils.roundFloat(a.value / 100, 4);\n      return Weight.operation(aWeight, b, o);\n    }\n\n    if (Weight.is(a) && typeof b === \"number\") {\n      return Weight.operation(a, b, o);\n    }\n    if (Weight.is(a) && Weight.isPct(b)) {\n      const bWeight = onerm ? Weight.multiply(onerm, b.value / 100) : MathUtils.roundFloat(b.value / 100, 4);\n      return Weight.operation(a, bWeight, o);\n    }\n    if (Weight.is(a) && Weight.is(b)) {\n      return Weight.operation(a, b, o);\n    }\n\n    throw new Error(`Can't apply operation to ${a} and ${b}`);\n  }\n\n  export function operation(weight: IWeight, value: IWeight | number, o: (a: number, b: number) => number): IWeight;\n  export function operation(weight: IWeight | number, value: IWeight, o: (a: number, b: number) => number): IWeight;\n  export function operation(\n    weight: IWeight | number,\n    value: IWeight | number,\n    o: (a: number, b: number) => number\n  ): IWeight {\n    if (typeof weight === \"number\" && typeof value !== \"number\") {\n      return Weight.build(o(weight, value.value), value.unit);\n    } else if (typeof weight !== \"number\" && typeof value === \"number\") {\n      return Weight.build(o(weight.value, value), weight.unit);\n    } else if (typeof weight !== \"number\" && typeof value !== \"number\") {\n      return Weight.build(o(weight.value, convertTo(value, weight.unit).value), weight.unit);\n    } else {\n      throw new Error(\"Weight.operation should never work with numbers only\");\n    }\n  }\n\n  export function convertToWeight(onerm: IWeight, value: IWeight | number | IPercentage, unit: IUnit): IWeight {\n    if (typeof value === \"number\") {\n      return Weight.build(value, unit);\n    } else if (Weight.isPct(value)) {\n      return Weight.convertTo(Weight.multiply(onerm, MathUtils.roundFloat(value.value / 100, 4)), unit);\n    } else {\n      return value;\n    }\n  }\n\n  export function calculateRepMax(\n    knownReps: number,\n    knownRpe: number,\n    knownWeight: number,\n    targetReps: number,\n    targetRpe: number\n  ): number {\n    const knownRpeMultiplier = Weight.rpeMultiplier(knownReps, knownRpe);\n    const onerm = knownWeight / knownRpeMultiplier;\n    const targetRpeMultiplier = Weight.rpeMultiplier(targetReps, targetRpe);\n    return Math.round(onerm * targetRpeMultiplier);\n  }\n\n  export function rpeMultiplier(reps: number, rpe: number): number {\n    if (reps === 1 && rpe === 10) {\n      return 1;\n    }\n    reps = Math.max(Math.min(reps, 24), 1);\n    rpe = Math.max(Math.min(rpe, 10), 1);\n\n    const x = 10.0 - rpe + (reps - 1);\n    if (x >= 16) {\n      return 0.5;\n    }\n    // The formula is taken from\n    // https://gitlab.com/openpowerlifting/plsource/-/blob/ba5194be6daa08d082bb1b7959d6f47b82e7802c/static/rpe-calc/index.html#L224\n    const intersection = 2.92;\n    if (x <= intersection) {\n      const a = 0.347619;\n      const b = -4.60714;\n      const c = 99.9667;\n      return (a * x * x + b * x + c) / 100;\n    } else {\n      const m = -2.64249;\n      const b = 97.0955;\n      return (m * x + b) / 100;\n    }\n  }\n}\n","import baseColors from \"../../../../config/tailwind/tailwind.colors.json\";\nimport semanticColors from \"../../../../config/tailwind/tailwind.semantic.generated.json\";\n\ntype IBaseColors = typeof baseColors;\ntype ISemanticColors = typeof semanticColors;\n\nexport class Tailwind {\n  public static colors(): IBaseColors {\n    return baseColors;\n  }\n\n  public static semantic(): ISemanticColors[\"light\"] {\n    const theme = typeof window !== \"undefined\" && window.document.body.classList.contains(\"dark\") ? \"dark\" : \"light\";\n    return semanticColors[theme];\n  }\n}\n","import { IExerciseType, ISettings } from \"../types\";\nimport { CustomExerciseVariation } from \"./customExerciseVariation\";\nconst availableSmallImages = new Set([\n  \"abwheel_bodyweight\",\n  \"arnoldpress_dumbbell\",\n  \"arnoldpress_kettlebell\",\n  \"aroundtheworld_dumbbell\",\n  \"backextension_bodyweight\",\n  \"backextension_leveragemachine\",\n  \"ballslams_medicineball\",\n  \"battleropes_bodyweight\",\n  \"behindtheneckpress_band\",\n  \"behindtheneckpress_barbell\",\n  \"behindtheneckpress_smith\",\n  \"benchdip_bodyweight\",\n  \"benchpress_band\",\n  \"benchpress_barbell\",\n  \"benchpress_cable\",\n  \"benchpress_dumbbell\",\n  \"benchpress_kettlebell\",\n  \"benchpress_smith\",\n  \"benchpressclosegrip_barbell\",\n  \"benchpressclosegrip_ezbar\",\n  \"benchpressclosegrip_smith\",\n  \"benchpresswidegrip_barbell\",\n  \"benchpresswidegrip_smith\",\n  \"bentoveronearmrow_dumbbell\",\n  \"bentoverrow_band\",\n  \"bentoverrow_barbell\",\n  \"bentoverrow_cable\",\n  \"bentoverrow_dumbbell\",\n  \"bentoverrow_leveragemachine\",\n  \"bentoverrow_smith\",\n  \"bicepcurl_band\",\n  \"bicepcurl_barbell\",\n  \"bicepcurl_cable\",\n  \"bicepcurl_dumbbell\",\n  \"bicepcurl_ezbar\",\n  \"bicepcurl_leveragemachine\",\n  \"bicyclecrunch_bodyweight\",\n  \"boxsquat_barbell\",\n  \"boxsquat_dumbbell\",\n  \"bulgariansplitsquat_dumbbell\",\n  \"cablecrossover_cable\",\n  \"cablecrunch_cable\",\n  \"cablekickback_cable\",\n  \"cablepullthrough_cable\",\n  \"cabletwist_band\",\n  \"cabletwist_barbell\",\n  \"cabletwist_bodyweight\",\n  \"cabletwist_cable\",\n  \"cabletwist_leveragemachine\",\n  \"calfpressonlegpress_leveragemachine\",\n  \"calfpressonseatedlegpress_leveragemachine\",\n  \"chestdip_bodyweight\",\n  \"chestfly_barbell\",\n  \"chestfly_cable\",\n  \"chestfly_dumbbell\",\n  \"chestfly_leveragemachine\",\n  \"chestpress_band\",\n  \"chestpress_leveragemachine\",\n  \"chinup_bodyweight\",\n  \"chinup_leveragemachine\",\n  \"clean_barbell\",\n  \"cleanandjerk_barbell\",\n  \"concentrationcurl_band\",\n  \"concentrationcurl_barbell\",\n  \"concentrationcurl_cable\",\n  \"concentrationcurl_dumbbell\",\n  \"crossbodycrunch_bodyweight\",\n  \"crunch_bodyweight\",\n  \"crunch_cable\",\n  \"crunch_leveragemachine\",\n  \"deadlift_band\",\n  \"deadlift_barbell\",\n  \"deadlift_cable\",\n  \"deadlift_dumbbell\",\n  \"deadlift_kettlebell\",\n  \"deadlift_leveragemachine\",\n  \"deadlift_smith\",\n  \"deadlifthighpull_barbell\",\n  \"declinebenchpress_dumbbell\",\n  \"declinebenchpress_smith\",\n  \"deficitdeadlift_barbell\",\n  \"deficitdeadlift_trapbar\",\n  \"ellipticalmachine_leveragemachine\",\n  \"facepull_band\",\n  \"flatkneeraise_bodyweight\",\n  \"flatlegraise_bodyweight\",\n  \"frontraise_band\",\n  \"frontraise_barbell\",\n  \"frontraise_bodyweight\",\n  \"frontraise_cable\",\n  \"frontraise_dumbbell\",\n  \"frontsquat_barbell\",\n  \"frontsquat_cable\",\n  \"frontsquat_dumbbell\",\n  \"frontsquat_kettlebell\",\n  \"frontsquat_smith\",\n  \"glutebridge_band\",\n  \"glutebridge_barbell\",\n  \"glutebridge_dumbbell\",\n  \"glutebridgemarch_bodyweight\",\n  \"glutekickback_band\",\n  \"glutekickback_cable\",\n  \"gobletsquat_dumbbell\",\n  \"gobletsquat_kettlebell\",\n  \"goodmorning_barbell\",\n  \"goodmorning_leveragemachine\",\n  \"goodmorning_smith\",\n  \"hacksquat_barbell\",\n  \"hacksquat_smith\",\n  \"hammercurl_band\",\n  \"hammercurl_cable\",\n  \"hammercurl_dumbbell\",\n  \"handstandpushup_bodyweight\",\n  \"hangclean_kettlebell\",\n  \"hanginglegraise_bodyweight\",\n  \"hanginglegraise_cable\",\n  \"highrow_cable\",\n  \"highrow_leveragemachine\",\n  \"hipabductor_band\",\n  \"hipabductor_bodyweight\",\n  \"hipabductor_cable\",\n  \"hipabductor_leveragemachine\",\n  \"hipadductor_leveragemachine\",\n  \"hipthrust_band\",\n  \"hipthrust_barbell\",\n  \"hipthrust_bodyweight\",\n  \"hipthrust_leveragemachine\",\n  \"inclinebenchpress_barbell\",\n  \"inclinebenchpress_cable\",\n  \"inclinebenchpress_dumbbell\",\n  \"inclinebenchpress_smith\",\n  \"inclinebenchpresswidegrip_barbell\",\n  \"inclinechestfly_cable\",\n  \"inclinechestfly_dumbbell\",\n  \"inclinechestpress_band\",\n  \"inclinechestpress_dumbbell\",\n  \"inclinechestpress_leveragemachine\",\n  \"inclinecurl_dumbbell\",\n  \"inclinerow_barbell\",\n  \"inclinerow_dumbbell\",\n  \"invertedrow_bodyweight\",\n  \"jackknifesitup_bodyweight\",\n  \"jumpsquat_barbell\",\n  \"jumpsquat_bodyweight\",\n  \"kettlebellswing_dumbbell\",\n  \"kettlebellswing_kettlebell\",\n  \"kneelingpulldown_band\",\n  \"kneestoelbows_bodyweight\",\n  \"lateralraise_band\",\n  \"lateralraise_cable\",\n  \"lateralraise_dumbbell\",\n  \"lateralraise_kettlebell\",\n  \"lateralraise_leveragemachine\",\n  \"latpulldown_cable\",\n  \"latpulldown_leveragemachine\",\n  \"legextension_band\",\n  \"legextension_leveragemachine\",\n  \"legpress_leveragemachine\",\n  \"legpress_smith\",\n  \"legsupbenchpress_barbell\",\n  \"lunge_barbell\",\n  \"lunge_bodyweight\",\n  \"lunge_cable\",\n  \"lunge_dumbbell\",\n  \"lyingbicepcurl_cable\",\n  \"lyingbicepcurl_dumbbell\",\n  \"lyinglegcurl_band\",\n  \"lyinglegcurl_leveragemachine\",\n  \"muscleup_bodyweight\",\n  \"obliquecrunch_bodyweight\",\n  \"overheadpress_barbell\",\n  \"overheadpress_dumbbell\",\n  \"overheadpress_ezbar\",\n  \"overheadsquat_barbell\",\n  \"overheadsquat_dumbbell\",\n  \"pecdeck_leveragemachine\",\n  \"pendlayrow_barbell\",\n  \"pistolsquat_bodyweight\",\n  \"pistolsquat_kettlebell\",\n  \"pistolsquat_leveragemachine\",\n  \"plank_bodyweight\",\n  \"preachercurl_barbell\",\n  \"preachercurl_dumbbell\",\n  \"preachercurl_ezbar\",\n  \"preachercurl_leveragemachine\",\n  \"pullover_barbell\",\n  \"pullover_dumbbell\",\n  \"pullup_band\",\n  \"pullup_bodyweight\",\n  \"pullup_leveragemachine\",\n  \"pushpress_barbell\",\n  \"pushpress_bodyweight\",\n  \"pushpress_dumbbell\",\n  \"pushpress_kettlebell\",\n  \"pushup_band\",\n  \"pushup_bodyweight\",\n  \"reversecrunch_bodyweight\",\n  \"reversecrunch_cable\",\n  \"reversecurl_band\",\n  \"reversecurl_barbell\",\n  \"reversecurl_cable\",\n  \"reversecurl_dumbbell\",\n  \"reversefly_band\",\n  \"reversefly_dumbbell\",\n  \"reversefly_leveragemachine\",\n  \"reversehyperextension_band\",\n  \"reversehyperextension_leveragemachine\",\n  \"reverselunge_barbell\",\n  \"reverselunge_bodyweight\",\n  \"reverselunge_dumbbell\",\n  \"reverselunge_kettlebell\",\n  \"reversewristcurl_barbell\",\n  \"reversewristcurl_dumbbell\",\n  \"reversewristcurl_ezbar\",\n  \"romaniandeadlift_barbell\",\n  \"romaniandeadlift_dumbbell\",\n  \"russiantwist_bodyweight\",\n  \"russiantwist_cable\",\n  \"russiantwist_dumbbell\",\n  \"safetysquatbarsquat_barbell\",\n  \"seatedcalfraise_barbell\",\n  \"seatedcalfraise_dumbbell\",\n  \"seatedcalfraise_leveragemachine\",\n  \"seatedfrontraise_barbell\",\n  \"seatedfrontraise_dumbbell\",\n  \"seatedlegcurl_leveragemachine\",\n  \"seatedlegpress_leveragemachine\",\n  \"seatedoverheadpress_barbell\",\n  \"seatedpalmsupwristcurl_dumbbell\",\n  \"seatedrow_band\",\n  \"seatedrow_cable\",\n  \"seatedrow_leveragemachine\",\n  \"seatedwidegriprow_cable\",\n  \"shoulderpress_band\",\n  \"shoulderpress_cable\",\n  \"shoulderpress_dumbbell\",\n  \"shoulderpress_leveragemachine\",\n  \"shoulderpress_smith\",\n  \"shoulderpressparallelgrip_dumbbell\",\n  \"shrug_band\",\n  \"shrug_barbell\",\n  \"shrug_cable\",\n  \"shrug_dumbbell\",\n  \"shrug_leveragemachine\",\n  \"shrug_smith\",\n  \"sidebend_band\",\n  \"sidebend_cable\",\n  \"sidebend_dumbbell\",\n  \"sidecrunch_band\",\n  \"sidecrunch_bodyweight\",\n  \"sidecrunch_cable\",\n  \"sidehipabductor_barbell\",\n  \"sidehipabductor_bodyweight\",\n  \"sidehipabductor_leveragemachine\",\n  \"sidelyingclam_bodyweight\",\n  \"sideplank_bodyweight\",\n  \"singlelegbridge_bodyweight\",\n  \"singlelegdeadlift_bodyweight\",\n  \"singlelegdeadlift_dumbbell\",\n  \"singlelegglutebridgebench_bodyweight\",\n  \"singlelegglutebridgebentknee_bodyweight\",\n  \"singlelegglutebridgestraight_bodyweight\",\n  \"singleleghipthrust_barbell\",\n  \"singleleghipthrust_bodyweight\",\n  \"singleleghipthrust_leveragemachine\",\n  \"sissysquat_bodyweight\",\n  \"situp_bodyweight\",\n  \"situp_kettlebell\",\n  \"skullcrusher_barbell\",\n  \"skullcrusher_cable\",\n  \"skullcrusher_dumbbell\",\n  \"skullcrusher_ezbar\",\n  \"snatch_dumbbell\",\n  \"splitsquat_band\",\n  \"splitsquat_barbell\",\n  \"splitsquat_bodyweight\",\n  \"splitsquat_dumbbell\",\n  \"splitsquat_kettlebell\",\n  \"squat_barbell\",\n  \"squat_bodyweight\",\n  \"squat_dumbbell\",\n  \"squat_leveragemachine\",\n  \"squat_smith\",\n  \"squatrow_band\",\n  \"standingcalfraise_barbell\",\n  \"standingcalfraise_bodyweight\",\n  \"standingcalfraise_cable\",\n  \"standingcalfraise_dumbbell\",\n  \"standingcalfraise_leveragemachine\",\n  \"standingrow_cable\",\n  \"standingrowclosegrip_cable\",\n  \"standingrowreardeltwithrope_cable\",\n  \"standingrowrearhorizontaldeltwithrope_cable\",\n  \"standingrowvbar_cable\",\n  \"stepup_band\",\n  \"stepup_barbell\",\n  \"stepup_bodyweight\",\n  \"stepup_dumbbell\",\n  \"stifflegdeadlift_band\",\n  \"stifflegdeadlift_barbell\",\n  \"stifflegdeadlift_dumbbell\",\n  \"straightlegdeadlift_band\",\n  \"straightlegdeadlift_barbell\",\n  \"straightlegdeadlift_dumbbell\",\n  \"straightlegdeadlift_kettlebell\",\n  \"sumodeadlift_barbell\",\n  \"sumodeadlifthighpull_barbell\",\n  \"superman_bodyweight\",\n  \"superman_dumbbell\",\n  \"tbarrow_leveragemachine\",\n  \"thruster_barbell\",\n  \"toestobar_bodyweight\",\n  \"trapbardeadlift_trapbar\",\n  \"tricepsdip_bodyweight\",\n  \"tricepsdip_leveragemachine\",\n  \"tricepsextension_band\",\n  \"tricepsextension_barbell\",\n  \"tricepsextension_cable\",\n  \"tricepsextension_dumbbell\",\n  \"tricepspushdown_cable\",\n  \"uprightrow_band\",\n  \"uprightrow_barbell\",\n  \"uprightrow_cable\",\n  \"uprightrow_dumbbell\",\n  \"vup_band\",\n  \"vup_bodyweight\",\n  \"vup_dumbbell\",\n  \"widepullup_bodyweight\",\n  \"wristcurl_barbell\",\n  \"wristcurl_dumbbell\",\n  \"wristcurl_ezbar\",\n  \"wristroller_bodyweight\",\n  \"zerchersquat_barbell\",\n]);\n\nconst availableLargeImages = new Set([\n  \"abwheel_bodyweight\",\n  \"arnoldpress_dumbbell\",\n  \"arnoldpress_kettlebell\",\n  \"aroundtheworld_dumbbell\",\n  \"backextension_bodyweight\",\n  \"backextension_leveragemachine\",\n  \"ballslams_medicineball\",\n  \"battleropes_bodyweight\",\n  \"behindtheneckpress_band\",\n  \"behindtheneckpress_barbell\",\n  \"behindtheneckpress_smith\",\n  \"benchdip_bodyweight\",\n  \"benchpress_band\",\n  \"benchpress_barbell\",\n  \"benchpress_cable\",\n  \"benchpress_dumbbell\",\n  \"benchpress_kettlebell\",\n  \"benchpress_smith\",\n  \"benchpressclosegrip_barbell\",\n  \"benchpressclosegrip_ezbar\",\n  \"benchpressclosegrip_smith\",\n  \"benchpresswidegrip_barbell\",\n  \"benchpresswidegrip_smith\",\n  \"bentoveronearmrow_dumbbell\",\n  \"bentoverrow_band\",\n  \"bentoverrow_barbell\",\n  \"bentoverrow_cable\",\n  \"bentoverrow_dumbbell\",\n  \"bentoverrow_leveragemachine\",\n  \"bentoverrow_smith\",\n  \"bicepcurl_band\",\n  \"bicepcurl_barbell\",\n  \"bicepcurl_cable\",\n  \"bicepcurl_dumbbell\",\n  \"bicepcurl_ezbar\",\n  \"bicepcurl_leveragemachine\",\n  \"bicyclecrunch_bodyweight\",\n  \"boxsquat_barbell\",\n  \"boxsquat_dumbbell\",\n  \"bulgariansplitsquat_dumbbell\",\n  \"cablecrossover_cable\",\n  \"cablecrunch_cable\",\n  \"cablekickback_cable\",\n  \"cablepullthrough_cable\",\n  \"cabletwist_band\",\n  \"cabletwist_barbell\",\n  \"cabletwist_bodyweight\",\n  \"cabletwist_cable\",\n  \"cabletwist_leveragemachine\",\n  \"calfpressonlegpress_leveragemachine\",\n  \"calfpressonseatedlegpress_leveragemachine\",\n  \"chestdip_bodyweight\",\n  \"chestfly_barbell\",\n  \"chestfly_cable\",\n  \"chestfly_dumbbell\",\n  \"chestfly_leveragemachine\",\n  \"chestpress_band\",\n  \"chestpress_leveragemachine\",\n  \"chinup_bodyweight\",\n  \"chinup_leveragemachine\",\n  \"clean_barbell\",\n  \"cleanandjerk_barbell\",\n  \"concentrationcurl_band\",\n  \"concentrationcurl_barbell\",\n  \"concentrationcurl_cable\",\n  \"concentrationcurl_dumbbell\",\n  \"crossbodycrunch_bodyweight\",\n  \"crunch_bodyweight\",\n  \"crunch_cable\",\n  \"crunch_leveragemachine\",\n  \"deadlift_band\",\n  \"deadlift_barbell\",\n  \"deadlift_cable\",\n  \"deadlift_dumbbell\",\n  \"deadlift_kettlebell\",\n  \"deadlift_leveragemachine\",\n  \"deadlift_smith\",\n  \"deadlifthighpull_barbell\",\n  \"declinebenchpress_dumbbell\",\n  \"declinebenchpress_smith\",\n  \"deficitdeadlift_barbell\",\n  \"deficitdeadlift_trapbar\",\n  \"ellipticalmachine_leveragemachine\",\n  \"facepull_band\",\n  \"flatkneeraise_bodyweight\",\n  \"flatlegraise_bodyweight\",\n  \"frontraise_band\",\n  \"frontraise_barbell\",\n  \"frontraise_bodyweight\",\n  \"frontraise_cable\",\n  \"frontraise_dumbbell\",\n  \"frontsquat_barbell\",\n  \"frontsquat_cable\",\n  \"frontsquat_dumbbell\",\n  \"frontsquat_kettlebell\",\n  \"frontsquat_smith\",\n  \"glutebridge_band\",\n  \"glutebridge_barbell\",\n  \"glutebridge_dumbbell\",\n  \"glutebridgemarch_bodyweight\",\n  \"glutekickback_band\",\n  \"glutekickback_cable\",\n  \"gobletsquat_dumbbell\",\n  \"gobletsquat_kettlebell\",\n  \"goodmorning_barbell\",\n  \"goodmorning_leveragemachine\",\n  \"goodmorning_smith\",\n  \"hacksquat_barbell\",\n  \"hacksquat_smith\",\n  \"hammercurl_band\",\n  \"hammercurl_cable\",\n  \"hammercurl_dumbbell\",\n  \"handstandpushup_bodyweight\",\n  \"hangclean_kettlebell\",\n  \"hanginglegraise_bodyweight\",\n  \"hanginglegraise_cable\",\n  \"highrow_cable\",\n  \"highrow_leveragemachine\",\n  \"hipabductor_band\",\n  \"hipabductor_bodyweight\",\n  \"hipabductor_cable\",\n  \"hipabductor_leveragemachine\",\n  \"hipadductor_leveragemachine\",\n  \"hipthrust_band\",\n  \"hipthrust_barbell\",\n  \"hipthrust_bodyweight\",\n  \"hipthrust_leveragemachine\",\n  \"inclinebenchpress_barbell\",\n  \"inclinebenchpress_cable\",\n  \"inclinebenchpress_dumbbell\",\n  \"inclinebenchpress_smith\",\n  \"inclinebenchpresswidegrip_barbell\",\n  \"inclinechestfly_cable\",\n  \"inclinechestfly_dumbbell\",\n  \"inclinechestpress_band\",\n  \"inclinechestpress_dumbbell\",\n  \"inclinechestpress_leveragemachine\",\n  \"inclinecurl_dumbbell\",\n  \"inclinerow_barbell\",\n  \"inclinerow_dumbbell\",\n  \"invertedrow_bodyweight\",\n  \"jackknifesitup_bodyweight\",\n  \"jumpsquat_barbell\",\n  \"jumpsquat_bodyweight\",\n  \"kettlebellswing_dumbbell\",\n  \"kettlebellswing_kettlebell\",\n  \"kneelingpulldown_band\",\n  \"kneestoelbows_bodyweight\",\n  \"lateralraise_band\",\n  \"lateralraise_cable\",\n  \"lateralraise_dumbbell\",\n  \"lateralraise_kettlebell\",\n  \"lateralraise_leveragemachine\",\n  \"latpulldown_cable\",\n  \"latpulldown_leveragemachine\",\n  \"legextension_band\",\n  \"legextension_leveragemachine\",\n  \"legpress_leveragemachine\",\n  \"legpress_smith\",\n  \"legsupbenchpress_barbell\",\n  \"lunge_barbell\",\n  \"lunge_bodyweight\",\n  \"lunge_cable\",\n  \"lunge_dumbbell\",\n  \"lyingbicepcurl_cable\",\n  \"lyingbicepcurl_dumbbell\",\n  \"lyinglegcurl_band\",\n  \"lyinglegcurl_leveragemachine\",\n  \"muscleup_bodyweight\",\n  \"obliquecrunch_bodyweight\",\n  \"overheadpress_barbell\",\n  \"overheadpress_dumbbell\",\n  \"overheadpress_ezbar\",\n  \"overheadsquat_barbell\",\n  \"overheadsquat_dumbbell\",\n  \"pecdeck_leveragemachine\",\n  \"pendlayrow_barbell\",\n  \"pistolsquat_bodyweight\",\n  \"pistolsquat_kettlebell\",\n  \"pistolsquat_leveragemachine\",\n  \"plank_bodyweight\",\n  \"preachercurl_barbell\",\n  \"preachercurl_dumbbell\",\n  \"preachercurl_ezbar\",\n  \"preachercurl_leveragemachine\",\n  \"pullover_barbell\",\n  \"pullover_dumbbell\",\n  \"pullup_band\",\n  \"pullup_bodyweight\",\n  \"pullup_leveragemachine\",\n  \"pushpress_barbell\",\n  \"pushpress_bodyweight\",\n  \"pushpress_dumbbell\",\n  \"pushpress_kettlebell\",\n  \"pushup_band\",\n  \"pushup_bodyweight\",\n  \"reversecrunch_bodyweight\",\n  \"reversecrunch_cable\",\n  \"reversecurl_band\",\n  \"reversecurl_barbell\",\n  \"reversecurl_cable\",\n  \"reversecurl_dumbbell\",\n  \"reversefly_band\",\n  \"reversefly_dumbbell\",\n  \"reversefly_leveragemachine\",\n  \"reversehyperextension_band\",\n  \"reversehyperextension_leveragemachine\",\n  \"reverselunge_barbell\",\n  \"reverselunge_bodyweight\",\n  \"reverselunge_dumbbell\",\n  \"reverselunge_kettlebell\",\n  \"reversewristcurl_barbell\",\n  \"reversewristcurl_dumbbell\",\n  \"reversewristcurl_ezbar\",\n  \"romaniandeadlift_barbell\",\n  \"romaniandeadlift_dumbbell\",\n  \"russiantwist_bodyweight\",\n  \"russiantwist_cable\",\n  \"russiantwist_dumbbell\",\n  \"safetysquatbarsquat_barbell\",\n  \"seatedcalfraise_barbell\",\n  \"seatedcalfraise_dumbbell\",\n  \"seatedcalfraise_leveragemachine\",\n  \"seatedfrontraise_barbell\",\n  \"seatedfrontraise_dumbbell\",\n  \"seatedlegcurl_leveragemachine\",\n  \"seatedlegpress_leveragemachine\",\n  \"seatedoverheadpress_barbell\",\n  \"seatedpalmsupwristcurl_dumbbell\",\n  \"seatedrow_band\",\n  \"seatedrow_cable\",\n  \"seatedrow_leveragemachine\",\n  \"seatedwidegriprow_cable\",\n  \"shoulderpress_band\",\n  \"shoulderpress_cable\",\n  \"shoulderpress_dumbbell\",\n  \"shoulderpress_leveragemachine\",\n  \"shoulderpress_smith\",\n  \"shoulderpressparallelgrip_dumbbell\",\n  \"shrug_band\",\n  \"shrug_barbell\",\n  \"shrug_cable\",\n  \"shrug_dumbbell\",\n  \"shrug_leveragemachine\",\n  \"shrug_smith\",\n  \"sidebend_band\",\n  \"sidebend_cable\",\n  \"sidebend_dumbbell\",\n  \"sidecrunch_band\",\n  \"sidecrunch_bodyweight\",\n  \"sidecrunch_cable\",\n  \"sidehipabductor_barbell\",\n  \"sidehipabductor_bodyweight\",\n  \"sidehipabductor_leveragemachine\",\n  \"sidelyingclam_bodyweight\",\n  \"sideplank_bodyweight\",\n  \"singlelegbridge_bodyweight\",\n  \"singlelegdeadlift_bodyweight\",\n  \"singlelegdeadlift_dumbbell\",\n  \"singlelegglutebridgebench_bodyweight\",\n  \"singlelegglutebridgebentknee_bodyweight\",\n  \"singlelegglutebridgestraight_bodyweight\",\n  \"singleleghipthrust_barbell\",\n  \"singleleghipthrust_bodyweight\",\n  \"singleleghipthrust_leveragemachine\",\n  \"sissysquat_bodyweight\",\n  \"situp_bodyweight\",\n  \"situp_kettlebell\",\n  \"skullcrusher_barbell\",\n  \"skullcrusher_cable\",\n  \"skullcrusher_dumbbell\",\n  \"skullcrusher_ezbar\",\n  \"snatch_dumbbell\",\n  \"splitsquat_band\",\n  \"splitsquat_barbell\",\n  \"splitsquat_bodyweight\",\n  \"splitsquat_dumbbell\",\n  \"splitsquat_kettlebell\",\n  \"squat_barbell\",\n  \"squat_bodyweight\",\n  \"squat_dumbbell\",\n  \"squat_leveragemachine\",\n  \"squat_smith\",\n  \"squatrow_band\",\n  \"standingcalfraise_barbell\",\n  \"standingcalfraise_bodyweight\",\n  \"standingcalfraise_cable\",\n  \"standingcalfraise_dumbbell\",\n  \"standingcalfraise_leveragemachine\",\n  \"standingrow_cable\",\n  \"standingrowclosegrip_cable\",\n  \"standingrowreardeltwithrope_cable\",\n  \"standingrowrearhorizontaldeltwithrope_cable\",\n  \"standingrowvbar_cable\",\n  \"stepup_band\",\n  \"stepup_barbell\",\n  \"stepup_bodyweight\",\n  \"stepup_dumbbell\",\n  \"stifflegdeadlift_band\",\n  \"stifflegdeadlift_barbell\",\n  \"stifflegdeadlift_dumbbell\",\n  \"straightlegdeadlift_band\",\n  \"straightlegdeadlift_barbell\",\n  \"straightlegdeadlift_dumbbell\",\n  \"straightlegdeadlift_kettlebell\",\n  \"sumodeadlift_barbell\",\n  \"sumodeadlifthighpull_barbell\",\n  \"superman_bodyweight\",\n  \"superman_dumbbell\",\n  \"tbarrow_leveragemachine\",\n  \"thruster_barbell\",\n  \"toestobar_bodyweight\",\n  \"trapbardeadlift_trapbar\",\n  \"tricepsdip_bodyweight\",\n  \"tricepsdip_leveragemachine\",\n  \"tricepsextension_band\",\n  \"tricepsextension_barbell\",\n  \"tricepsextension_cable\",\n  \"tricepsextension_dumbbell\",\n  \"tricepspushdown_cable\",\n  \"uprightrow_band\",\n  \"uprightrow_barbell\",\n  \"uprightrow_cable\",\n  \"uprightrow_dumbbell\",\n  \"vup_band\",\n  \"vup_bodyweight\",\n  \"vup_dumbbell\",\n  \"widepullup_bodyweight\",\n  \"wristcurl_barbell\",\n  \"wristcurl_dumbbell\",\n  \"wristcurl_ezbar\",\n  \"wristroller_bodyweight\",\n  \"zerchersquat_barbell\",\n]);\n\nexport namespace ExerciseImageUtils {\n  export function id(type: IExerciseType): string {\n    const equipment = type.equipment || \"bodyweight\";\n    return `${type.id.toLowerCase()}_${(equipment || \"bodyweight\").toLowerCase()}`;\n  }\n\n  export function exists(type: IExerciseType, size: \"small\" | \"large\"): boolean {\n    return size === \"small\" ? availableSmallImages.has(id(type)) : availableLargeImages.has(id(type));\n  }\n\n  // The image fields of the variation of the type. An exercise with no variation list reads as one variation.\n  function customImages(\n    type: IExerciseType,\n    settings?: ISettings\n  ): { smallImageUrl?: string; largeImageUrl?: string } | undefined {\n    const customExercise = settings?.exercises?.[type.id];\n    return customExercise != null ? CustomExerciseVariation.find(customExercise, type) : undefined;\n  }\n\n  export function existsCustom(type: IExerciseType, size: \"small\" | \"large\", settings?: ISettings): boolean {\n    const images = customImages(type, settings);\n    return size === \"small\" ? !!images?.smallImageUrl : !!(images?.largeImageUrl ?? images?.smallImageUrl);\n  }\n\n  export function url(type: IExerciseType, size: \"small\" | \"large\", settings?: ISettings): string | undefined {\n    if (exists(type, size)) {\n      const src =\n        size === \"large\"\n          ? `/externalimages/exercises/full/large/${id(type)}_full_large.png`\n          : `/externalimages/exercises/single/small/${id(type)}_single_small.png`;\n      return src;\n    } else if (existsCustom(type, size, settings)) {\n      const images = customImages(type, settings);\n      return size === \"large\" ? (images?.largeImageUrl ?? images?.smallImageUrl) : images?.smallImageUrl;\n    } else {\n      return undefined;\n    }\n  }\n}\n","import { SyntaxNode } from \"@lezer/common\";\nimport { CollectionUtils } from \"@shared/utils/collection\";\nimport { PlannerNodeName } from \"./plannerExerciseStyles\";\n\nfunction getChildren(node: SyntaxNode): SyntaxNode[] {\n  const cur = node.cursor();\n  const result: SyntaxNode[] = [];\n  if (!cur.firstChild()) {\n    return result;\n  }\n  do {\n    result.push(cur.node);\n  } while (cur.nextSibling());\n  return result;\n}\n\nexport interface IPlannerWeekHeading {\n  name: string;\n  loop?: \"start\";\n  error?: string;\n}\n\n// A heading has the marker only when it ends in `/ loop: <value>`. Everything else stays in the name.\nconst weekLoopMarker = /^(.*?)[ \\t]*\\/[ \\t]*loop:[ \\t]*([^/]*?)[ \\t]*$/;\n\n// Splits the text after `#` into the week name and its properties. Both evaluators use it.\nexport function parseWeekHeading(rawHeading: string): IPlannerWeekHeading {\n  const heading = rawHeading.replace(/^#+/, \"\").trim();\n  const match = heading.match(weekLoopMarker);\n  if (match == null) {\n    return { name: heading };\n  }\n  const [, name, value] = match;\n  if (value === \"start\") {\n    return { name, loop: \"start\" };\n  }\n  return { name, error: `The \"loop\" property needs the value \"start\", for example \"/ loop: start\"` };\n}\n\nexport interface IPlannerExerciseEvaluatorTextWeek {\n  name: string;\n  loop?: \"start\";\n  description?: string;\n  notes?: string;\n  days: IPlannerExerciseEvaluatorTextDay[];\n}\n\nexport interface IPlannerExerciseEvaluatorTextDay {\n  name: string;\n  description?: string;\n  notes?: string;\n  exercises: string[];\n}\n\nexport type IPlannerNonExerciseFullTextLine =\n  | { type: \"comment\"; line: string }\n  | { type: \"triplelinecomment\"; line: string }\n  | { type: \"empty\"; line: string };\n\nexport function fullTextLineToWeekdayDescription(line: IPlannerNonExerciseFullTextLine): string {\n  switch (line.type) {\n    case \"comment\":\n      return line.line.replace(/^\\s*\\/\\/\\s*/, \"\").trim();\n    case \"triplelinecomment\":\n      return line.line.replace(/^\\s*\\/\\/\\/\\s*/, \"\").trim();\n    case \"empty\":\n      return \"\";\n  }\n}\n\nexport function splitWeekDayOngoingLines(ongoingLines: IPlannerNonExerciseFullTextLine[]): {\n  linesToPreviousExercise: IPlannerNonExerciseFullTextLine[];\n  nextLines: IPlannerNonExerciseFullTextLine[];\n  noteLines: IPlannerNonExerciseFullTextLine[];\n} {\n  // `///` lines that belong to the heading: the block right above the heading (or above its `//` description),\n  // and every `///` line after the first `//` line.\n  const firstCommentIndex = ongoingLines.findIndex((l) => l.type === \"comment\");\n  const headEnd = firstCommentIndex >= 0 ? firstCommentIndex : ongoingLines.length;\n  let blockStart = headEnd;\n  while (blockStart > 0 && ongoingLines[blockStart - 1].type === \"triplelinecomment\") {\n    blockStart -= 1;\n  }\n  const noteIndexes = new Set<number>();\n  for (let i = blockStart; i < headEnd; i++) {\n    noteIndexes.add(i);\n  }\n  if (firstCommentIndex >= 0) {\n    for (let i = firstCommentIndex; i < ongoingLines.length; i++) {\n      if (ongoingLines[i].type === \"triplelinecomment\") {\n        noteIndexes.add(i);\n      }\n    }\n  }\n  const noteLines = ongoingLines.filter((_, i) => noteIndexes.has(i));\n  ongoingLines = ongoingLines.filter((_, i) => !noteIndexes.has(i));\n  let anyCommentStarted = false;\n  let commentStarted = false;\n  const linesToPreviousExercise: IPlannerNonExerciseFullTextLine[] = [];\n  const nextLines: IPlannerNonExerciseFullTextLine[] = [];\n  for (let i = 0; i < ongoingLines.length; i++) {\n    const line = ongoingLines[i];\n    if (!anyCommentStarted && line?.type === \"empty\") {\n      continue;\n    }\n    if (line?.type === \"comment\" || line?.type === \"triplelinecomment\") {\n      anyCommentStarted = true;\n    }\n    if (line?.type === \"comment\") {\n      commentStarted = true;\n    }\n    if (anyCommentStarted && !commentStarted) {\n      linesToPreviousExercise.push(line);\n    }\n    if (commentStarted && line?.type === \"comment\") {\n      nextLines.push(line);\n    }\n  }\n  for (let i = nextLines.length - 1; i >= 0; i--) {\n    const line = nextLines[i];\n    if (line.type === \"empty\") {\n      nextLines.pop();\n    } else {\n      break;\n    }\n  }\n  for (let i = linesToPreviousExercise.length - 1; i >= 0; i--) {\n    const line = linesToPreviousExercise[i];\n    if (line.type === \"empty\") {\n      linesToPreviousExercise.pop();\n    } else {\n      break;\n    }\n  }\n  return { linesToPreviousExercise, nextLines, noteLines };\n}\n\nexport class PlannerExerciseEvaluatorText {\n  private readonly script: string;\n  private weeks: IPlannerExerciseEvaluatorTextWeek[] = [];\n  private ongoingLines: IPlannerNonExerciseFullTextLine[] = [];\n\n  constructor(script: string) {\n    this.script = script;\n  }\n\n  private getValue(node: SyntaxNode): string {\n    return this.script.slice(node.from, node.to);\n  }\n\n  private getWeekDayDescriptionAndFillLastDay(): { description?: string; notes?: string } {\n    const { linesToPreviousExercise, nextLines, noteLines } = splitWeekDayOngoingLines(this.ongoingLines);\n    const notes = noteLines.map((line) => line.line.trimEnd());\n    if (linesToPreviousExercise.length > 0) {\n      const lastDay = this.getLastDay();\n      const lines = linesToPreviousExercise.map((line) => line.line);\n      if (lastDay) {\n        lastDay.exercises.push(...lines);\n      } else {\n        // No day to hold them (before `# Week 1`), so they go with the heading notes.\n        notes.unshift(...lines.filter((l) => l.trim() !== \"\").map((l) => l.trimEnd()));\n      }\n    }\n    const description =\n      nextLines.length > 0 ? nextLines.map(fullTextLineToWeekdayDescription).join(\"\\n\").trim() : undefined;\n    return { description, notes: notes.length > 0 ? notes.join(\"\\n\") : undefined };\n  }\n\n  private getLastDay(): IPlannerExerciseEvaluatorTextDay | undefined {\n    const lastWeek = this.weeks[this.weeks.length - 1];\n    return lastWeek?.days[lastWeek.days.length - 1];\n  }\n\n  private evaluateLine(expr: SyntaxNode): void {\n    if (expr.type.name === PlannerNodeName.Week) {\n      const heading = parseWeekHeading(this.getValue(expr));\n      const { description, notes } = this.getWeekDayDescriptionAndFillLastDay();\n      // This evaluator has no error channel: the first marker wins, the full evaluator reports the rest.\n      const hasLoop = this.weeks.some((w) => w.loop != null);\n      const loop = heading.loop != null && !hasLoop ? heading.loop : undefined;\n      this.weeks.push({ name: heading.name, ...(loop != null ? { loop } : {}), description, notes, days: [] });\n      this.ongoingLines = [];\n    } else if (expr.type.name === PlannerNodeName.Day) {\n      const dayName = this.getValue(expr).replace(/^#+/, \"\").trim();\n      const { description, notes } = this.getWeekDayDescriptionAndFillLastDay();\n      this.weeks[this.weeks.length - 1].days.push({ name: dayName, exercises: [], description, notes });\n      this.ongoingLines = [];\n    } else if (expr.type.name === PlannerNodeName.EmptyExpression) {\n      this.ongoingLines.push({ type: \"empty\", line: this.getValue(expr) });\n    } else if (expr.type.name === PlannerNodeName.LineComment) {\n      this.ongoingLines.push({ type: \"comment\", line: this.getValue(expr) });\n    } else if (expr.type.name === PlannerNodeName.TripleLineComment) {\n      this.ongoingLines.push({ type: \"triplelinecomment\", line: this.getValue(expr) });\n    } else if (expr.type.name === PlannerNodeName.ExerciseExpression) {\n      const lastWeek = this.weeks[this.weeks.length - 1];\n      const lastDay = lastWeek ? lastWeek.days[lastWeek.days.length - 1] : undefined;\n      const exercises = lastDay?.exercises;\n      if (exercises) {\n        for (const line of this.ongoingLines) {\n          exercises.push(line.line);\n        }\n        exercises.push(this.getValue(expr));\n        this.ongoingLines = [];\n      }\n    }\n  }\n\n  public evaluate(expr: SyntaxNode): IPlannerExerciseEvaluatorTextWeek[] {\n    if (expr.type.name === PlannerNodeName.Program) {\n      this.ongoingLines = [];\n      this.weeks = [];\n      for (const child of CollectionUtils.compact(getChildren(expr))) {\n        this.evaluateLine(child);\n      }\n      const lastDay = this.getLastDay();\n      if (lastDay) {\n        const rest = [...this.ongoingLines];\n        while (rest.length > 0 && rest[rest.length - 1].type === \"empty\") {\n          rest.pop();\n        }\n        lastDay.exercises.push(...rest.map((line) => line.line));\n      }\n      this.ongoingLines = [];\n      return this.weeks;\n    } else {\n      throw new Error(`Unexpected node type ${expr.type.name}`);\n    }\n  }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.map = map;\nexports.flap = flap;\nexports.bindTo = bindTo;\nexports.let = let_;\nexports.getFunctorComposition = getFunctorComposition;\nexports.as = as;\nexports.asUnit = asUnit;\n/**\n * A `Functor` is a type constructor which supports a mapping operation `map`.\n *\n * `map` can be used to turn functions `a -> b` into functions `f a -> f b` whose argument and return types use the type\n * constructor `f` to represent some computational context.\n *\n * Instances must satisfy the following laws:\n *\n * 1. Identity: `F.map(fa, a => a) <-> fa`\n * 2. Composition: `F.map(fa, a => bc(ab(a))) <-> F.map(F.map(fa, ab), bc)`\n *\n * @since 2.0.0\n */\nvar function_1 = require(\"./function\");\nfunction map(F, G) {\n    return function (f) { return function (fa) { return F.map(fa, function (ga) { return G.map(ga, f); }); }; };\n}\nfunction flap(F) {\n    return function (a) { return function (fab) { return F.map(fab, function (f) { return f(a); }); }; };\n}\nfunction bindTo(F) {\n    return function (name) { return function (fa) { return F.map(fa, function (a) {\n        var _a;\n        return (_a = {}, _a[name] = a, _a);\n    }); }; };\n}\nfunction let_(F) {\n    return function (name, f) { return function (fa) { return F.map(fa, function (a) {\n        var _a;\n        return Object.assign({}, a, (_a = {}, _a[name] = f(a), _a));\n    }); }; };\n}\n/** @deprecated */\nfunction getFunctorComposition(F, G) {\n    var _map = map(F, G);\n    return {\n        map: function (fga, f) { return (0, function_1.pipe)(fga, _map(f)); }\n    };\n}\n/** @internal */\nfunction as(F) {\n    return function (self, b) { return F.map(self, function () { return b; }); };\n}\n/** @internal */\nfunction asUnit(F) {\n    var asM = as(F);\n    return function (self) { return asM(self, undefined); };\n}\n","import { Equipment } from \"@shared/models/equipment\";\nimport { PP } from \"@shared/models/pp\";\nimport { PlannerProgram } from \"../../../pages/planner/models/plannerProgram\";\nimport {\n  IModalExerciseUi,\n  IPlannerExerciseState,\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseEvaluatedSet,\n  IPlannerState,\n  IPlannerUi,\n} from \"../../../pages/planner/models/types\";\nimport { PlannerEvaluator } from \"../../../pages/planner/plannerEvaluator\";\nimport { PlannerKey } from \"../../../pages/planner/plannerKey\";\nimport {\n  IPlannerProgram,\n  ISettings,\n  IDayData,\n  IExerciseType,\n  IDaySetData,\n  IPlannerProgramDay,\n  IShortDayData,\n} from \"@shared/types\";\nimport { ObjectUtils } from \"@shared/utils/object\";\nimport { PlannerExerciseEvaluator } from \"../../../pages/planner/plannerExerciseEvaluator\";\nimport { Exercise, IExercise } from \"@shared/models/exercise\";\nimport { IEvaluatedProgram, Program } from \"@shared/models/program\";\nimport { ProgramToPlanner } from \"@shared/models/programToPlanner\";\nimport { ILensDispatch } from \"../../../utils/useLensReducer\";\nimport { lb } from \"lens-shmens\";\nimport { UidFactory } from \"@shared/utils/generator\";\nimport { Weight } from \"@shared/models/weight\";\nimport { Block } from \"@shared/models/block\";\n\nexport class EditProgramUiHelpers {\n  public static changeFirstInstance(\n    planner: IPlannerProgram,\n    plannerExercise: IPlannerProgramExercise,\n    settings: ISettings,\n    shouldValidate: boolean,\n    cb: (exercise: IPlannerProgramExercise) => void\n  ): IPlannerProgram {\n    const key = PlannerKey.fromFullName(\n      plannerExercise.fullName,\n      settings.exercises,\n      Equipment.currentEquipment(settings)\n    );\n    const evaluatedProgram = ObjectUtils.clone(Program.evaluate({ ...Program.create(\"Temp\"), planner }, settings));\n    PP.iterate2(evaluatedProgram.weeks, (e) => {\n      const aKey = PlannerKey.fromFullName(e.fullName, settings.exercises, Equipment.currentEquipment(settings));\n      if (key === aKey) {\n        cb(e);\n        return true;\n      }\n      return false;\n    });\n    return this.validate(\n      shouldValidate,\n      planner,\n      new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner(),\n      settings\n    );\n  }\n\n  public static changeLabel(\n    planner: IPlannerProgram,\n    modalExerciseUi: IModalExerciseUi,\n    onProgramChange: (program: IPlannerProgram) => void,\n    onUiChange: (modalExerciseUi2?: IModalExerciseUi) => void,\n    fullName: string,\n    value: string | undefined,\n    settings: ISettings,\n    dayData: Required<IDayData>,\n    change?: \"all\" | \"one\" | \"duplicate\"\n  ): void {\n    const { name, equipment } = PlannerExerciseEvaluator.extractNameParts(\n      fullName,\n      settings.exercises,\n      Equipment.currentEquipment(settings)\n    );\n    const newKey = PlannerKey.fromLabelNameAndEquipment(\n      value,\n      name,\n      equipment,\n      settings.exercises,\n      Equipment.currentEquipment(settings)\n    );\n\n    if (change === \"all\") {\n      onProgramChange(\n        EditProgramUiHelpers.changeAllInstances(planner, fullName, settings, true, (e) => {\n          e.label = value;\n        })\n      );\n    } else {\n      onProgramChange(\n        EditProgramUiHelpers.changeCurrentInstance3(planner, fullName, dayData, false, settings, true, (e) => {\n          e.label = value;\n        })\n      );\n    }\n\n    const exercise = Exercise.findByNameEquipment(\n      settings.exercises,\n      name,\n      equipment,\n      Equipment.currentEquipment(settings)\n    );\n    let newModalExercise = modalExerciseUi;\n    if (exercise && modalExerciseUi && modalExerciseUi.fullName === fullName) {\n      const newFullName = Exercise.fullName(exercise, settings, value);\n      newModalExercise = { ...modalExerciseUi, exerciseKey: newKey, fullName: newFullName };\n      onUiChange(newModalExercise);\n    }\n  }\n\n  public static changeCurrentInstanceExercise(\n    dispatch: ILensDispatch<IPlannerExerciseState>,\n    plannerExercise: IPlannerProgramExercise,\n    settings: ISettings,\n    cb: (exercise: IPlannerProgramExercise) => void\n  ): void {\n    const lbProgram = lb<IPlannerExerciseState>().p(\"current\").p(\"program\").pi(\"planner\");\n    dispatch(\n      lbProgram.recordModify((program) => {\n        return EditProgramUiHelpers.changeCurrentInstance2(program, plannerExercise, settings, true, cb);\n      }),\n      \"Change current exercise instance\"\n    );\n  }\n\n  public static onDaysChange(\n    plannerDispatch: ILensDispatch<IPlannerState>,\n    ui: IPlannerUi,\n    weekIndex: number,\n    days: IPlannerProgramDay[],\n    cb: (order: boolean[]) => void\n  ): void {\n    const lbUi = lb<IPlannerState>().p(\"ui\");\n    const collapsedOrder = days.map((d, i) => {\n      return ui.dayUi.collapsed.has(`${weekIndex}-${i}`);\n    });\n    cb(collapsedOrder);\n    plannerDispatch(\n      [\n        lbUi\n          .p(\"dayUi\")\n          .p(\"collapsed\")\n          .recordModify((collapsed) => {\n            const newCollapsed = new Set<string>(collapsed);\n            for (let i = 0; i < collapsedOrder.length; i++) {\n              if (collapsedOrder[i]) {\n                newCollapsed.add(`${weekIndex}-${i}`);\n              } else {\n                newCollapsed.delete(`${weekIndex}-${i}`);\n              }\n            }\n            return newCollapsed;\n          }),\n      ],\n      \"Toggle week collapse state\"\n    );\n  }\n\n  public static changeSets(\n    planner: IPlannerProgram,\n    key: string,\n    daySets: IDaySetData[],\n    settings: ISettings,\n    cb: (set: IPlannerProgramExerciseEvaluatedSet) => void\n  ): IPlannerProgram {\n    const evaluatedProgram = ObjectUtils.clone(Program.evaluate({ ...Program.create(\"Temp\"), planner }, settings));\n\n    PP.iterate2(evaluatedProgram.weeks, (e, weekIndex, dayInWeekIndex, dayIndex, exerciseIndex) => {\n      if (e.key !== key) {\n        return;\n      }\n      for (const daySet of daySets) {\n        if (daySet.week === weekIndex + 1 && daySet.dayInWeek === dayInWeekIndex + 1) {\n          for (let setVariationIndex = 0; setVariationIndex < e.evaluatedSetVariations.length; setVariationIndex++) {\n            if (daySet.setVariation === setVariationIndex + 1) {\n              const sets = e.evaluatedSetVariations[setVariationIndex].sets;\n              for (let setIndex = 0; setIndex < sets.length; setIndex++) {\n                if (daySet.set === setIndex + 1) {\n                  cb(sets[setIndex]);\n                }\n              }\n            }\n          }\n        }\n      }\n    });\n\n    return this.validate(true, planner, new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner(), settings);\n  }\n\n  public static changeCurrentInstance2(\n    planner: IPlannerProgram,\n    plannerExercise: IPlannerProgramExercise,\n    settings: ISettings,\n    shouldValidate: boolean,\n    cb: (exercise: IPlannerProgramExercise) => void\n  ): IPlannerProgram {\n    const fullName = plannerExercise.fullName;\n    const dayData = plannerExercise.dayData;\n    const isRepeat = !!plannerExercise.isRepeat;\n    return this.changeCurrentInstance3(planner, fullName, dayData, isRepeat, settings, shouldValidate, cb);\n  }\n\n  public static changeCurrentInstance3(\n    planner: IPlannerProgram,\n    fullName: string,\n    dayData: IShortDayData,\n    isRepeat: boolean,\n    settings: ISettings,\n    shouldValidate: boolean,\n    cb: (exercise: IPlannerProgramExercise) => void\n  ): IPlannerProgram {\n    const evaluatedProgram = ObjectUtils.clone(Program.evaluate({ ...Program.create(\"Temp\"), planner }, settings));\n\n    const weeks = this.getWeeks2(evaluatedProgram, dayData, fullName, isRepeat);\n    for (const week of weeks) {\n      PP.iterate2(evaluatedProgram.weeks, (e, weekIndex, dayInWeekIndex, dayIndex, exerciseIndex) => {\n        const current = week === weekIndex + 1 && dayData.dayInWeek === dayInWeekIndex + 1 && e.fullName === fullName;\n        if (current) {\n          cb(e);\n        }\n      });\n    }\n\n    return this.validate(\n      shouldValidate,\n      planner,\n      new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner(),\n      settings\n    );\n  }\n\n  private static getErrorMessages(planner: IPlannerProgram, settings: ISettings): string[] {\n    const { evaluatedWeeks } = PlannerEvaluator.evaluate(planner, settings);\n    const messages: string[] = [];\n    for (const week of evaluatedWeeks) {\n      for (const day of week) {\n        if (!day.success) {\n          messages.push(day.error.message);\n        }\n      }\n    }\n    return messages;\n  }\n\n  // Puts an exercise in a superset group, or takes it out (`group` is undefined). An exercise with a single block\n  // (`timed`) that joins a group loses the block in the same change: a block of a group is a circuit, and the\n  // trainer makes it on the group. The exercise changes in place.\n  public static setSuperset(exercise: IPlannerProgramExercise, group: string | undefined): void {\n    if (group && exercise.superset == null) {\n      exercise.block = undefined;\n    }\n    exercise.superset = group ? { name: group } : undefined;\n  }\n\n  // Disables the superset of an exercise in one pass, in each repeat week, with the group members of that week.\n  // It validates the final state once. It reverts (`applied` is false) only for an error the program did not have.\n  public static disableSuperset(\n    planner: IPlannerProgram,\n    plannerExercise: IPlannerProgramExercise,\n    settings: ISettings\n  ): { planner: IPlannerProgram; applied: boolean } {\n    const unchanged = { planner, applied: false };\n    let newPlanner: IPlannerProgram;\n    try {\n      const evaluatedProgram = ObjectUtils.clone(Program.evaluate({ ...Program.create(\"Temp\"), planner }, settings));\n      const { fullName, dayData } = plannerExercise;\n      const weeks = this.getWeeks2(evaluatedProgram, dayData, fullName, !!plannerExercise.isRepeat);\n      for (const week of weeks) {\n        const day = evaluatedProgram.weeks[week - 1]?.days[dayData.dayInWeek - 1];\n        const exercise = day?.exercises.find((e) => e.fullName === fullName);\n        if (day == null || exercise == null) {\n          continue;\n        }\n        const members = exercise.superset\n          ? day.exercises.filter((e) => e.superset?.name === exercise.superset?.name)\n          : [exercise];\n        const { changes } = Block.disableSuperset(members, exercise.key);\n        for (const change of changes) {\n          const target = day.exercises.find((e) => e.key === change.key);\n          if (target == null) {\n            continue;\n          }\n          if (change.block === \"clear\") {\n            target.block = undefined;\n          } else if (change.block !== \"keep\") {\n            target.block = change.block;\n          }\n          if (change.clearSuperset) {\n            target.superset = undefined;\n          }\n        }\n      }\n      newPlanner = new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner();\n    } catch (e) {\n      // A program with an error cannot go through the UI editor. Keep the old text.\n      return unchanged;\n    }\n    const before = new Set(this.getErrorMessages(planner, settings));\n    const added = this.getErrorMessages(newPlanner, settings).filter((message) => !before.has(message));\n    if (added.length > 0) {\n      if (typeof window !== \"undefined\") {\n        alert(added[0]);\n      }\n      return unchanged;\n    }\n    return { planner: newPlanner, applied: true };\n  }\n\n  private static validate(\n    shouldValidate: boolean,\n    oldPlanner: IPlannerProgram,\n    newPlanner: IPlannerProgram,\n    settings: ISettings\n  ): IPlannerProgram {\n    if (shouldValidate) {\n      const { evaluatedWeeks } = PlannerEvaluator.evaluate(newPlanner, settings);\n      const error = PlannerEvaluator.getFirstError(evaluatedWeeks);\n      if (error) {\n        if (typeof window !== \"undefined\") {\n          alert(error.message);\n        }\n        return oldPlanner;\n      } else {\n        return newPlanner;\n      }\n    } else {\n      return newPlanner;\n    }\n  }\n\n  private static getWeeks2(\n    evaluatedProgram: IEvaluatedProgram,\n    dayData: IShortDayData,\n    fullName: string,\n    ignoreRepeats: boolean = false\n  ): number[] {\n    const day = evaluatedProgram.weeks[dayData.week - 1].days[dayData.dayInWeek - 1];\n    const weeks: Set<number> = new Set();\n    weeks.add(dayData.week);\n    const exercise = day.exercises.find((e) => e.fullName === fullName);\n    if (!ignoreRepeats && exercise != null) {\n      for (const repeating of exercise.repeating) {\n        weeks.add(repeating);\n      }\n    }\n    return Array.from(weeks);\n  }\n\n  public static duplicateCurrentInstance(\n    planner: IPlannerProgram,\n    dayData: Required<IDayData>,\n    fullName: string,\n    label: string | undefined,\n    newExerciseType: IExerciseType | string,\n    settings: ISettings\n  ): IPlannerProgram {\n    const evaluatedProgram = ObjectUtils.clone(Program.evaluate({ ...Program.create(\"Temp\"), planner }, settings));\n    const weeks = this.getWeeks2(evaluatedProgram, dayData, fullName);\n\n    const add = [];\n    for (const week of weeks) {\n      const targetDay = evaluatedProgram.weeks[week - 1]?.days[dayData.dayInWeek - 1];\n\n      let newFullName: string | undefined;\n      const index = targetDay.exercises.findIndex((e) => e.fullName === fullName);\n      const previousExercise = targetDay.exercises[index];\n      if (index !== -1 && previousExercise) {\n        let exercise: IExercise | undefined;\n        if (typeof newExerciseType === \"string\") {\n          newFullName = `${label ? `${label}: ` : \"\"}${newExerciseType}`;\n        } else {\n          exercise = Exercise.get(newExerciseType, settings.exercises);\n          newFullName = Exercise.fullName(exercise, settings, label);\n        }\n        const newExercise: IPlannerProgramExercise = {\n          ...ObjectUtils.clone(previousExercise),\n          label: label ?? previousExercise.label,\n          fullName: newFullName,\n          shortName: newFullName,\n          notused: typeof newExerciseType === \"string\" ? true : previousExercise.notused,\n          key: PlannerKey.fromFullName(newFullName, settings.exercises, Equipment.currentEquipment(settings)),\n          exerciseType: typeof newExerciseType === \"string\" ? undefined : newExerciseType,\n          name: exercise ? exercise.name : typeof newExerciseType === \"string\" ? newExerciseType : \"\",\n        };\n        targetDay.exercises.splice(index + 1, 0, newExercise);\n      }\n      if (newFullName != null && index !== -1) {\n        add.push({ dayData: { ...dayData, week }, fullName: newFullName, index: index + 1 });\n      }\n    }\n    if (add.length > 0) {\n      return new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner({ add });\n    } else {\n      return planner;\n    }\n  }\n\n  public static changeRepeating(\n    planner: IPlannerProgram,\n    dayData: Required<IDayData>,\n    repeatTo: number,\n    fullName: string,\n    settings: ISettings,\n    shouldValidate: boolean\n  ): IPlannerProgram {\n    const evaluatedProgram = ObjectUtils.clone(Program.evaluate({ ...Program.create(\"Temp\"), planner }, settings));\n\n    let repeatingExercise: IPlannerProgramExercise | undefined;\n    const newRepeating: number[] = [];\n    for (let week = dayData.week; week <= repeatTo; week += 1) {\n      newRepeating.push(week);\n    }\n    const add = [];\n    for (let week = 1; week <= planner.weeks.length; week += 1) {\n      const targetDay = evaluatedProgram.weeks[week - 1]?.days[dayData.dayInWeek - 1];\n      if (targetDay) {\n        const index = targetDay.exercises.findIndex((e) => e.fullName === fullName);\n        let exercise = targetDay.exercises[index] as IPlannerProgramExercise | undefined;\n        if (exercise && week >= dayData.week && !repeatingExercise) {\n          exercise.repeat = newRepeating;\n          exercise.repeating = newRepeating;\n          repeatingExercise = exercise;\n        }\n        if (repeatingExercise && week > dayData.week) {\n          if (week <= repeatTo && index === -1) {\n            exercise = { ...repeatingExercise, isRepeat: true };\n            targetDay.exercises.push(exercise);\n            add.push({ dayData: { ...dayData, week }, fullName, index: targetDay.exercises.length - 1 });\n          } else if (week > repeatTo) {\n            targetDay.exercises.splice(index, 1);\n          }\n        }\n        if (repeatingExercise && week > dayData.week && !exercise?.isRepeat) {\n          break;\n        }\n      }\n    }\n    return this.validate(\n      shouldValidate,\n      planner,\n      new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner({ add }),\n      settings\n    );\n  }\n\n  public static deleteCurrentInstance(\n    planner: IPlannerProgram,\n    dayData: Required<IDayData>,\n    fullName: string,\n    settings: ISettings,\n    shouldValidate: boolean,\n    allowDeleteEverywhere: boolean\n  ): IPlannerProgram {\n    const evaluatedProgram = ObjectUtils.clone(Program.evaluate({ ...Program.create(\"Temp\"), planner }, settings));\n    const weeks = this.getWeeks2(evaluatedProgram, dayData, fullName);\n\n    for (const week of weeks) {\n      const targetDay = evaluatedProgram.weeks[week - 1]?.days[dayData.dayInWeek - 1];\n\n      if (targetDay) {\n        const index = targetDay.exercises.findIndex((e) => e.fullName === fullName);\n        if (index !== -1) {\n          targetDay.exercises.splice(index, 1);\n        }\n      }\n    }\n\n    const newPlanner = this.validate(\n      shouldValidate,\n      planner,\n      new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner(),\n      settings\n    );\n    if (!allowDeleteEverywhere) {\n      const newEvaluatedProgram = Program.evaluate({ ...Program.create(\"Temp\"), planner: newPlanner }, settings);\n      const firstExercise = Program.getFirstProgramExercise(newEvaluatedProgram, fullName);\n      if (!firstExercise) {\n        alert(\"You cannot delete this exercise from all days on the screen. Do it from the Program screen.\");\n        return planner;\n      }\n    }\n    return newPlanner;\n  }\n\n  public static addInstance(\n    planner: IPlannerProgram,\n    dayData: Required<IDayData>,\n    fullName: string,\n    exerciseType: IExerciseType | undefined,\n    settings: ISettings\n  ): IPlannerProgram {\n    const evaluatedProgram = ObjectUtils.clone(Program.evaluate({ ...Program.create(\"Temp\"), planner }, settings));\n    const { week, dayInWeek } = dayData;\n    const targetDay = evaluatedProgram.weeks[week - 1]?.days[dayInWeek - 1];\n    const { label, name } = PlannerExerciseEvaluator.extractNameParts(\n      fullName,\n      settings.exercises,\n      Equipment.currentEquipment(settings)\n    );\n\n    const add = [];\n    if (targetDay) {\n      const newExercise: IPlannerProgramExercise = {\n        fullName: fullName,\n        shortName: fullName,\n        label,\n        key: PlannerKey.fromFullName(fullName, settings.exercises, Equipment.currentEquipment(settings)),\n        exerciseType: exerciseType,\n        name: name,\n        id: UidFactory.generateUid(8),\n        dayData: dayData,\n        repeat: [],\n        exerciseIndex: targetDay.exercises.length,\n        repeating: [],\n        order: 0,\n        text: \"\",\n        tags: [],\n        line: 0,\n        evaluatedSetVariations: [\n          {\n            sets: [\n              {\n                maxrep: 5,\n                weight: Weight.build(100, settings.units),\n                logRpe: false,\n                isAmrap: false,\n                isQuickAddSet: false,\n                askWeight: false,\n              },\n            ],\n            isCurrent: true,\n          },\n        ],\n        setVariations: [\n          {\n            sets: [\n              {\n                repRange: {\n                  isQuickAddSet: false,\n                  maxrep: 5,\n                  isAmrap: false,\n                  numberOfSets: 1,\n                },\n                weight: Weight.build(100, settings.units),\n                logRpe: false,\n                askWeight: false,\n              },\n            ],\n            isCurrent: true,\n          },\n        ],\n        descriptions: { values: [] },\n        globals: {},\n        points: {\n          fullName: {\n            line: 0,\n            offset: 0,\n            from: 0,\n            to: 0,\n          },\n        },\n      };\n      targetDay.exercises.push(newExercise);\n      add.push({ dayData, fullName, index: targetDay.exercises.length });\n    }\n\n    return this.validate(\n      true,\n      planner,\n      new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner({ add }),\n      settings\n    );\n  }\n\n  public static changeCurrentInstancePosition(\n    planner: IPlannerProgram,\n    dayData: Required<IDayData>,\n    fullName: string,\n    fromIndex: number,\n    toIndex: number,\n    settings: ISettings\n  ): IPlannerProgram {\n    const evaluatedProgram = ObjectUtils.clone(Program.evaluate({ ...Program.create(\"Temp\"), planner }, settings));\n    const weeks = this.getWeeks2(evaluatedProgram, dayData, fullName);\n    const reorder = weeks.map((week) => ({ dayData: { ...dayData, week }, fromIndex, toIndex }));\n    return new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner({ reorder });\n  }\n\n  public static changeAllInstances(\n    planner: IPlannerProgram,\n    fullName: string,\n    settings: ISettings,\n    shouldValidate: boolean,\n    cb: (exercise: IPlannerProgramExercise) => void\n  ): IPlannerProgram {\n    const evaluatedProgram = ObjectUtils.clone(Program.evaluate({ ...Program.create(\"Temp\"), planner }, settings));\n    PP.iterate2(evaluatedProgram.weeks, (e) => {\n      if (e.fullName === fullName) {\n        cb(e);\n      }\n    });\n    return this.validate(\n      shouldValidate,\n      planner,\n      new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner(),\n      settings\n    );\n  }\n\n  public static getChangedKeys(\n    oldPlanner: IPlannerProgram,\n    newPlanner: IPlannerProgram,\n    settings: ISettings\n  ): Partial<Record<string, string>> {\n    const { evaluatedWeeks: oldEvaluatedWeeks } = ObjectUtils.clone(PlannerProgram.evaluate(oldPlanner, settings));\n    const { evaluatedWeeks: newEvaluatedWeeks } = ObjectUtils.clone(PlannerProgram.evaluate(newPlanner, settings));\n    const changedKeys: Partial<Record<string, string>> = {};\n    for (let weekIndex = 0; weekIndex < oldEvaluatedWeeks.length; weekIndex++) {\n      const oldWeek = oldEvaluatedWeeks[weekIndex];\n      const newWeek = newEvaluatedWeeks[weekIndex];\n      if (oldWeek && newWeek) {\n        for (let dayInWeekIndex = 0; dayInWeekIndex < oldWeek.length; dayInWeekIndex++) {\n          const oldDay = oldWeek[dayInWeekIndex];\n          const newDay = newWeek[dayInWeekIndex];\n          if (oldDay && newDay) {\n            if (oldDay.success && newDay.success) {\n              for (let exerciseIndex = 0; exerciseIndex < oldDay.data.length; exerciseIndex++) {\n                const oldExercise = oldDay.data[exerciseIndex];\n                const newExercise = newDay.data[exerciseIndex];\n                if (oldExercise && newExercise && oldExercise.key !== newExercise.key) {\n                  changedKeys[oldExercise.key] = newExercise.key;\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    return changedKeys;\n  }\n}\n","// import util from \"util\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { IScriptBindings, IScriptFnContext, IScriptFunctions } from \"./models/progress\";\nimport { Weight } from \"./models/weight\";\nimport { IProgramState, IWeight, IUnit, IPercentage } from \"./types\";\nimport { CollectionUtils } from \"./utils/collection\";\nimport { MathUtils } from \"./utils/math\";\nimport { IProgramMode } from \"./models/program\";\nimport { parser as LiftoscriptParser } from \"./liftoscript\";\n\nexport enum NodeName {\n  LineComment = \"LineComment\",\n  Program = \"Program\",\n  BinaryExpression = \"BinaryExpression\",\n  Plus = \"Plus\",\n  Times = \"Times\",\n  Cmp = \"Cmp\",\n  AndOr = \"AndOr\",\n  NumberExpression = \"NumberExpression\",\n  Number = \"Number\",\n  Percentage = \"Percentage\",\n  WeightExpression = \"WeightExpression\",\n  ParenthesisExpression = \"ParenthesisExpression\",\n  BlockExpression = \"BlockExpression\",\n  Ternary = \"Ternary\",\n  IfExpression = \"IfExpression\",\n  ForExpression = \"ForExpression\",\n  ForInExpression = \"ForInExpression\",\n  If = \"If\",\n  Else = \"Else\",\n  AssignmentExpression = \"AssignmentExpression\",\n  IncAssignmentExpression = \"IncAssignmentExpression\",\n  StateVariable = \"StateVariable\",\n  StateVariableIndex = \"StateVariableIndex\",\n  Variable = \"Variable\",\n  BuiltinFunctionExpression = \"BuiltinFunctionExpression\",\n  Keyword = \"Keyword\",\n  VariableExpression = \"VariableExpression\",\n  VariableIndex = \"VariableIndex\",\n  Current = \"Current\",\n  Wildcard = \"Wildcard\",\n  UnaryExpression = \"UnaryExpression\",\n  Not = \"Not\",\n  Unit = \"Unit\",\n}\n\nexport type IAssignmentOp = \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"=\";\n\nexport class LiftoscriptSyntaxError extends SyntaxError {\n  public readonly line: number;\n  public readonly offset: number;\n  public readonly from: number;\n  public readonly to: number;\n\n  constructor(message: string, line: number, offset: number, from: number, to: number) {\n    super(message);\n    this.line = line;\n    this.offset = offset;\n    this.from = from;\n    this.to = to;\n  }\n}\n\nfunction getChildren(node: SyntaxNode): SyntaxNode[] {\n  const cur = node.cursor();\n  const result: SyntaxNode[] = [];\n  if (!cur.firstChild()) {\n    return result;\n  }\n  do {\n    result.push(cur.node);\n  } while (cur.nextSibling());\n  return result;\n}\n\nfunction comparing(\n  left: number | IWeight | IPercentage | (number | IWeight | IPercentage | undefined)[],\n  right: number | IWeight | IPercentage | (number | IWeight | IPercentage | undefined)[],\n  operator: \">\" | \"<\" | \">=\" | \"<=\" | \"==\" | \"!=\"\n): boolean {\n  function comparator(l: number | IWeight | IPercentage, r: number | IWeight | IPercentage): boolean {\n    switch (operator) {\n      case \">\":\n        return Weight.gt(l, r);\n      case \"<\":\n        return Weight.lt(l, r);\n      case \">=\":\n        return Weight.gte(l, r);\n      case \"<=\":\n        return Weight.lte(l, r);\n      case \"==\":\n        return Weight.eq(l, r);\n      case \"!=\":\n        return !Weight.eq(l, r);\n    }\n  }\n\n  if (Array.isArray(left) && Array.isArray(right)) {\n    return left.every((l, i) => comparator(l ?? 0, right[i] ?? 0));\n  } else if (Array.isArray(left) && !Array.isArray(right)) {\n    return left.every((l, i) => comparator(l ?? 0, right ?? 0));\n  } else if (!Array.isArray(left) && Array.isArray(right)) {\n    return right.every((r, i) => comparator(left ?? 0, r ?? 0));\n  } else if (!Array.isArray(left) && !Array.isArray(right)) {\n    return comparator(left ?? 0, right ?? 0);\n  } else {\n    throw new Error(\"Impossible case\");\n  }\n}\n\nfunction assert(name: string): never {\n  throw new SyntaxError(`Missing required nodes for ${name}, this should never happen`);\n}\n\nexport interface ILiftoscriptVariableValue<T> {\n  value: T;\n  op: IAssignmentOp;\n  target: (\"*\" | \"_\" | number)[];\n}\n\nexport type ILiftoscriptEvaluatorUpdate =\n  | { type: \"setVariationIndex\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"descriptionIndex\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"reps\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"minReps\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"weights\"; value: ILiftoscriptVariableValue<number | IPercentage | IWeight> }\n  | { type: \"timers\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"setTimers\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"RPE\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"logrpes\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"amraps\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"askweights\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"numberOfSets\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"level\"; value: ILiftoscriptVariableValue<number> };\n\nexport class LiftoscriptEvaluator {\n  private readonly script: string;\n  private readonly state: IProgramState;\n  private readonly otherStates: Record<number, IProgramState>;\n  private readonly bindings: IScriptBindings;\n  private readonly fns: IScriptFunctions;\n  private readonly fnContext: IScriptFnContext;\n  private readonly unit: IUnit;\n  private readonly mode: IProgramMode;\n  private readonly vars: IProgramState = {};\n  public readonly updates: ILiftoscriptEvaluatorUpdate[] = [];\n\n  constructor(\n    script: string,\n    state: IProgramState,\n    otherStates: Record<number, IProgramState>,\n    bindings: IScriptBindings,\n    fns: IScriptFunctions,\n    fnContext: IScriptFnContext,\n    unit: IUnit,\n    mode: IProgramMode\n  ) {\n    this.script = script;\n    this.state = state;\n    this.otherStates = otherStates;\n    this.bindings = bindings;\n    this.fns = fns;\n    this.fnContext = fnContext;\n    this.unit = unit;\n    this.mode = mode;\n  }\n\n  public static getValueRaw(script: string, node: SyntaxNode): string {\n    return script.slice(node.from, node.to);\n  }\n\n  public static getValue(script: string, node: SyntaxNode): string {\n    return this.getValueRaw(script, node).replace(/\\n/g, \"\\\\n\").replace(/\\t/g, \"\\\\t\");\n  }\n\n  private getValue(node: SyntaxNode): string {\n    return LiftoscriptEvaluator.getValue(this.script, node);\n  }\n\n  private error(message: string, node: SyntaxNode): never {\n    const [line, offset] = this.getLineAndOffset(node);\n    throw new LiftoscriptSyntaxError(`${message} (${line}:${offset})`, line, offset, node.from, node.to);\n  }\n\n  private isAssignmentTarget(node: SyntaxNode): boolean {\n    const parent = node.parent;\n    return (\n      parent != null &&\n      (parent.type.name === NodeName.AssignmentExpression || parent.type.name === NodeName.IncAssignmentExpression) &&\n      parent.firstChild?.from === node.from &&\n      parent.firstChild?.to === node.to\n    );\n  }\n\n  private getLineAndOffset(node: SyntaxNode): [number, number] {\n    const linesLengths = this.script.split(\"\\n\").map((l) => l.length + 1);\n    let offset = 0;\n    for (let i = 0; i < linesLengths.length; i++) {\n      const lineLength = linesLengths[i];\n      if (node.from > offset && node.from < offset + lineLength) {\n        return [i + 1, node.from - offset];\n      }\n      offset += lineLength;\n    }\n    return [linesLengths.length, linesLengths[linesLengths.length - 1]];\n  }\n\n  public hasKeyword(expr: SyntaxNode, name: string): boolean {\n    const cursor = expr.cursor();\n    do {\n      if (cursor.node.type.name === NodeName.Keyword) {\n        if (this.getValue(cursor.node) === name) {\n          return true;\n        }\n      }\n    } while (cursor.next());\n    return false;\n  }\n\n  private getWeight(expr?: SyntaxNode | null): IWeight | undefined {\n    if (expr?.type.name === NodeName.WeightExpression) {\n      const numberNode = expr.getChild(NodeName.NumberExpression);\n      const unitNode = expr.getChild(NodeName.Unit);\n      if (numberNode == null || unitNode == null) {\n        assert(NodeName.WeightExpression);\n      }\n      const num = this.evaluate(numberNode);\n      if (typeof num !== \"number\") {\n        this.error(\"WeightExpression must contain a number\", numberNode);\n      }\n      return Weight.build(num, this.getValue(unitNode) as IUnit);\n    } else {\n      return undefined;\n    }\n  }\n\n  public switchWeightsToUnit(programNode: SyntaxNode, toUnit: IUnit): string {\n    const cursor = programNode.cursor();\n    let script = this.script;\n    let shift = 0;\n    do {\n      if (cursor.node.type.name === NodeName.WeightExpression) {\n        const weight = this.getWeight(cursor.node);\n        if (weight != null) {\n          if (weight.unit !== toUnit) {\n            const from = cursor.node.from;\n            const to = cursor.node.to;\n            const oldWeightStr = Weight.print(weight);\n            const newWeightStr = Weight.print(Weight.smartConvert(weight, toUnit));\n            script = script.substring(0, from + shift) + newWeightStr + script.substring(to + shift);\n            shift = shift + newWeightStr.length - oldWeightStr.length;\n          }\n        }\n      }\n    } while (cursor.next());\n    return script;\n  }\n\n  public getStateVariableKeys(expr: SyntaxNode): Set<string> {\n    const cursor = expr.cursor();\n    const stateKeys: Set<string> = new Set();\n    do {\n      if (cursor.node.type.name === NodeName.StateVariable) {\n        const stateKey = this.getStateKey(cursor.node);\n        if (stateKey != null) {\n          stateKeys.add(stateKey);\n        }\n      }\n    } while (cursor.next());\n    return stateKeys;\n  }\n\n  private getStateKey(expr: SyntaxNode): string | undefined {\n    const index = expr.getChild(NodeName.StateVariableIndex);\n    if (index == null) {\n      const stateKeyNode = expr.getChild(NodeName.Keyword);\n      if (stateKeyNode != null) {\n        const stateKey = this.getValue(stateKeyNode);\n        return stateKey;\n      }\n    }\n    return undefined;\n  }\n\n  public parse(expr: SyntaxNode): void {\n    const cursor = expr.cursor();\n    const vars: IProgramState = {};\n    do {\n      if (cursor.node.type.isError) {\n        this.error(\"Syntax error\", cursor.node);\n      } else if (cursor.node.type.name === NodeName.BuiltinFunctionExpression) {\n        const [keyword, ...fnArgs] = getChildren(cursor.node);\n        if (keyword == null || keyword.type.name !== NodeName.Keyword) {\n          assert(NodeName.BuiltinFunctionExpression);\n        }\n        const name = this.getValue(keyword);\n        if (!(name in this.fns)) {\n          this.error(`Unknown function '${name}'`, keyword);\n        }\n        if (name === \"sets\" && fnArgs.length !== 9) {\n          this.error(`'sets' function should have 9 arguments`, keyword);\n        }\n      } else if (cursor.node.type.name === NodeName.ForExpression) {\n        const variableNode = cursor.node.getChild(NodeName.Variable);\n        if (variableNode != null) {\n          vars[this.getValue(variableNode)] = 1;\n        }\n      } else if (cursor.node.type.name === NodeName.AssignmentExpression) {\n        const [variableNode] = getChildren(cursor.node);\n        if (variableNode.type.name === NodeName.Variable) {\n          vars[this.getValue(variableNode)] = 1;\n        } else if (variableNode.type.name === NodeName.VariableExpression) {\n          const nameNode = variableNode.getChild(NodeName.Keyword);\n          if (nameNode != null) {\n            const name = this.getValue(nameNode);\n            if (this.mode === \"update\") {\n              if (\n                [\n                  \"reps\",\n                  \"weights\",\n                  \"RPE\",\n                  \"minReps\",\n                  \"numberOfSets\",\n                  \"timers\",\n                  \"setTimers\",\n                  \"askweights\",\n                  \"amraps\",\n                  \"logrpes\",\n                ].indexOf(name) === -1\n              ) {\n                if (name === \"level\") {\n                  this.error(`'level' can only be changed with '+=' or '-=' in a progress script`, variableNode);\n                }\n                this.error(`Cannot assign to '${name}'`, variableNode);\n              }\n              const indexExprs = variableNode.getChildren(NodeName.VariableIndex);\n              if (name === \"numberOfSets\" && indexExprs.length > 0) {\n                this.error(`${name} is not an array`, variableNode);\n              } else if (indexExprs.length > 1) {\n                this.error(`Can't assign to set variations, weeks or days here`, variableNode);\n              }\n            }\n          }\n        }\n      } else if (cursor.node.type.name === NodeName.StateVariable) {\n        const stateKey = this.getStateKey(cursor.node);\n        if (stateKey != null && !(stateKey in this.state)) {\n          this.error(`There's no state variable '${stateKey}'`, cursor.node);\n        }\n      } else if (cursor.node.type.name === NodeName.Variable) {\n        const variableKey = this.getValue(cursor.node);\n        if (!(variableKey in vars)) {\n          this.error(`There's no variable '${variableKey}'`, cursor.node);\n        }\n      } else if (cursor.node.type.name === NodeName.VariableExpression) {\n        const [nameNode, indexExpr] = getChildren(cursor.node);\n        if (nameNode == null) {\n          assert(NodeName.VariableExpression);\n        }\n        const name = this.getValue(nameNode);\n        if (indexExpr != null) {\n          const validNames: (keyof IScriptBindings)[] = [\n            \"originalWeights\",\n            \"weights\",\n            \"reps\",\n            \"minReps\",\n            \"completedReps\",\n            \"completedRepsLeft\",\n            \"completedWeights\",\n            \"timers\",\n            \"setTimers\",\n            \"completedSetTimers\",\n            \"w\",\n            \"r\",\n            \"cr\",\n            \"cw\",\n            \"mr\",\n            \"completedRPE\",\n            \"bodyweight\",\n            \"RPE\",\n            \"setVariationIndex\",\n            \"descriptionIndex\",\n            \"numberOfSets\",\n            \"programNumberOfSets\",\n            \"completedNumberOfSets\",\n            \"amraps\",\n            \"logrpes\",\n            \"askweights\",\n          ];\n          if (validNames.indexOf(name as keyof IScriptBindings) === -1) {\n            this.error(`${name} is not an array variable`, nameNode);\n          }\n        } else if (name === \"level\") {\n          if (!this.isAssignmentTarget(cursor.node)) {\n            this.error(`'level' can't be read, only changed with '+=' or '-='`, nameNode);\n          }\n        } else if (!(name in this.bindings)) {\n          this.error(`${name} is not a valid variable`, nameNode);\n        }\n      }\n    } while (cursor.next());\n  }\n\n  public static changeWeightsToCompleteWeights(oldScript: string): string {\n    const node = LiftoscriptParser.parse(oldScript);\n    const cursor = node.cursor();\n    let script = oldScript;\n    let shift = 0;\n    do {\n      if (cursor.node.type.name === NodeName.VariableExpression) {\n        const keywordNode = cursor.node.getChild(NodeName.Keyword);\n        if (keywordNode) {\n          const keyword = LiftoscriptEvaluator.getValue(oldScript, keywordNode);\n          if (keyword === \"weights\") {\n            const parent = cursor.node.parent;\n            if (\n              parent != null &&\n              !(\n                (parent.type.name === NodeName.AssignmentExpression ||\n                  parent.type.name === NodeName.IncAssignmentExpression) &&\n                parent.firstChild?.from === cursor.node.from &&\n                parent.firstChild?.to === cursor.node.to\n              )\n            ) {\n              const from = keywordNode.from;\n              const to = keywordNode.to;\n              const oldWeightStr = keyword;\n              const newWeightStr = \"completedWeights\";\n              script = script.substring(0, from + shift) + newWeightStr + script.substring(to + shift);\n              shift = shift + newWeightStr.length - oldWeightStr.length;\n            }\n          }\n        }\n      }\n    } while (cursor.next());\n    return script;\n  }\n\n  private evaluateToNumber(expr: SyntaxNode): number {\n    const v = this.evaluate(expr);\n    const v1 = Array.isArray(v) ? v[0] : v;\n    return Weight.is(v1) ? v1.value : typeof v1 === \"number\" ? v1 : v1 ? 1 : 0;\n  }\n\n  private evaluateToNumberOrWeightOrPercentage(expr: SyntaxNode): number | IWeight | IPercentage {\n    const v = this.evaluate(expr);\n    const v1 = Array.isArray(v) ? v[0] : v;\n    return Weight.is(v1) || Weight.isPct(v1) ? v1 : typeof v1 === \"number\" ? v1 : v1 ? 1 : 0;\n  }\n\n  private changeNumberOfSets(expression: SyntaxNode, op: IAssignmentOp): number | IWeight | IPercentage {\n    const oldNumberOfSets = this.bindings.weights.length;\n    const evaluatedValue = MathUtils.applyOp(this.bindings.numberOfSets, this.evaluateToNumber(expression), op);\n\n    this.bindings.weights = this.bindings.weights.slice(0, evaluatedValue);\n    this.bindings.originalWeights = this.bindings.originalWeights.slice(0, evaluatedValue);\n    this.bindings.reps = this.bindings.reps.slice(0, evaluatedValue);\n    this.bindings.minReps = this.bindings.minReps.slice(0, evaluatedValue);\n    this.bindings.RPE = this.bindings.RPE.slice(0, evaluatedValue);\n    this.bindings.w = this.bindings.weights.slice(0, evaluatedValue);\n    this.bindings.r = this.bindings.reps.slice(0, evaluatedValue);\n    this.bindings.mr = this.bindings.minReps.slice(0, evaluatedValue);\n    this.bindings.timers = this.bindings.timers.slice(0, evaluatedValue);\n    this.bindings.setTimers = this.bindings.setTimers.slice(0, evaluatedValue);\n    this.bindings.completedSetTimers = this.bindings.completedSetTimers.slice(0, evaluatedValue);\n    this.bindings.amraps = this.bindings.amraps.slice(0, evaluatedValue);\n    this.bindings.logrpes = this.bindings.logrpes.slice(0, evaluatedValue);\n    this.bindings.askweights = this.bindings.askweights.slice(0, evaluatedValue);\n    this.bindings.completedReps = this.bindings.completedReps.slice(0, evaluatedValue);\n    this.bindings.completedRepsLeft = this.bindings.completedRepsLeft.slice(0, evaluatedValue);\n    this.bindings.cr = this.bindings.cr.slice(0, evaluatedValue);\n    this.bindings.cw = this.bindings.cw.slice(0, evaluatedValue);\n    this.bindings.completedWeights = this.bindings.completedWeights.slice(0, evaluatedValue);\n    this.bindings.completedRPE = this.bindings.completedRPE.slice(0, evaluatedValue);\n    this.bindings.isCompleted = this.bindings.isCompleted.slice(0, evaluatedValue);\n\n    const ns = oldNumberOfSets - 1;\n    for (let i = 0; i < evaluatedValue; i += 1) {\n      if (this.bindings.weights[i] == null) {\n        this.bindings.weights[i] = Weight.build(\n          this.bindings.weights[ns]?.value ?? 0,\n          this.bindings.weights[ns]?.unit || \"lb\"\n        );\n        this.bindings.originalWeights[i] = Weight.buildAny(\n          this.bindings.originalWeights[ns]?.value ?? 0,\n          this.bindings.originalWeights[ns]?.unit || \"lb\"\n        );\n        this.bindings.reps[i] = this.bindings.reps[ns] ?? 0;\n        this.bindings.timers[i] = this.bindings.timers[ns];\n        this.bindings.setTimers[i] = this.bindings.setTimers[ns];\n        this.bindings.completedSetTimers[i] = undefined;\n        this.bindings.amraps[i] = this.bindings.amraps[ns];\n        this.bindings.logrpes[i] = this.bindings.logrpes[ns];\n        this.bindings.askweights[i] = this.bindings.askweights[ns];\n        this.bindings.minReps[i] = this.bindings.minReps[ns];\n        this.bindings.RPE[i] = this.bindings.RPE[ns];\n        this.bindings.w[i] = this.bindings.weights[i];\n        this.bindings.r[i] = this.bindings.reps[i];\n        this.bindings.mr[i] = this.bindings.minReps[i];\n        this.bindings.completedReps[i] = undefined;\n        this.bindings.completedRepsLeft[i] = undefined;\n        this.bindings.completedWeights[i] = undefined;\n        this.bindings.completedRPE[i] = undefined;\n        this.bindings.cr[i] = undefined;\n        this.bindings.cw[i] = undefined;\n        this.bindings.isCompleted[i] = 0;\n      }\n    }\n\n    this.bindings.numberOfSets = evaluatedValue;\n    this.bindings.ns = evaluatedValue;\n\n    return evaluatedValue;\n  }\n\n  private recordLevelUpdate(\n    variableNode: SyntaxNode,\n    opNode: SyntaxNode,\n    expression: SyntaxNode,\n    indexExprs: SyntaxNode[]\n  ): number {\n    if (this.mode !== \"planner\") {\n      this.error(`'level' can only be changed in a progress script`, variableNode);\n    }\n    if (indexExprs.length > 0) {\n      this.error(`'level' is not an array`, variableNode);\n    }\n    const op = this.getValue(opNode);\n    if (op !== \"+=\" && op !== \"-=\") {\n      this.error(`'level' can only be changed with '+=' or '-='`, opNode);\n    }\n    const value = this.evaluateToNumber(expression);\n    if (!Number.isInteger(value) || value < 0) {\n      this.error(`'level' must change by a whole number of 0 or more`, expression);\n    }\n    this.updates.push({ type: \"level\", value: { value, op, target: [] } });\n    return value;\n  }\n\n  private changeBinding(\n    key: \"reps\" | \"weights\" | \"RPE\" | \"minReps\" | \"timers\" | \"setTimers\" | \"logrpes\" | \"amraps\" | \"askweights\",\n    expression: SyntaxNode,\n    indexExprs: SyntaxNode[],\n    op: IAssignmentOp\n  ): number | IWeight | IPercentage {\n    const indexes = indexExprs.map((ie) => getChildren(ie)[0]);\n    const maxTargetLength = 1;\n    if (indexes.length > maxTargetLength) {\n      this.error(`${key} can only have 1 value inside []`, expression);\n    }\n    const indexValues = this.calculateIndexValues(indexes);\n    const normalizedIndexValues = this.normalizeTarget(indexValues, maxTargetLength);\n    const [setIndex] = normalizedIndexValues;\n    let value: number | IWeight | IPercentage = 0;\n    if (key === \"weights\") {\n      for (let i = 0; i < this.bindings.weights.length; i += 1) {\n        if (!this.bindings.isCompleted[i] && (setIndex === \"*\" || setIndex === i + 1)) {\n          const evalutedValue = this.evaluateToNumberOrWeightOrPercentage(expression);\n          const newValue = Weight.applyOp(\n            this.bindings.rm1,\n            this.bindings.weights[i] ?? Weight.build(0, this.unit),\n            evalutedValue,\n            op\n          );\n          value = Weight.convertToWeight(this.bindings.rm1, newValue, this.unit);\n          this.bindings.originalWeights[i] = value;\n          this.bindings.weights[i] = this.fns.roundWeight(value, this.fnContext);\n        }\n      }\n    } else {\n      for (let i = 0; i < this.bindings[key].length; i += 1) {\n        if (!this.bindings.isCompleted[i] && (setIndex === \"*\" || setIndex === i + 1)) {\n          const evaluatedValue = this.evaluateToNumber(expression);\n          value = MathUtils.applyOp(this.bindings[key][i] ?? 0, evaluatedValue, op);\n          if (key === \"RPE\") {\n            value = MathUtils.round(MathUtils.clamp(value, 0, 10), 0.5);\n          }\n          if (key === \"amraps\" || key === \"logrpes\" || key === \"askweights\") {\n            value = Math.round(MathUtils.clamp(value, 0, 1));\n          }\n          this.bindings[key][i] = value;\n        }\n      }\n    }\n    return value;\n  }\n\n  private recordVariableUpdate(\n    key:\n      | \"reps\"\n      | \"weights\"\n      | \"timers\"\n      | \"setTimers\"\n      | \"RPE\"\n      | \"minReps\"\n      | \"setVariationIndex\"\n      | \"descriptionIndex\"\n      | \"numberOfSets\"\n      | \"logrpes\"\n      | \"amraps\"\n      | \"askweights\",\n    expression: SyntaxNode,\n    indexExprs: SyntaxNode[],\n    op: IAssignmentOp\n  ): number | IWeight | IPercentage {\n    const indexes = indexExprs.map((ie) => getChildren(ie)[0]);\n    const maxTargetLength =\n      key === \"setVariationIndex\" || key === \"descriptionIndex\" ? 2 : key === \"numberOfSets\" ? 3 : 4;\n    if (key === \"setVariationIndex\") {\n      if (indexes.length > maxTargetLength) {\n        this.error(`setVariationIndex can only have 2 values inside [*:*]`, expression);\n      }\n    } else if (key === \"descriptionIndex\") {\n      if (indexes.length > maxTargetLength) {\n        this.error(`descriptionIndex can only have 2 values inside [*:*]`, expression);\n      }\n    } else if (key === \"numberOfSets\") {\n      if (indexes.length > maxTargetLength) {\n        this.error(`numberOfSets can only have 3 values inside [*:*:*]`, expression);\n      }\n    } else if (indexes.length > maxTargetLength) {\n      this.error(`${key} can only have 4 values inside [*:*:*:*]`, expression);\n    }\n    const indexValues = this.calculateIndexValues(indexes);\n    const normalizedIndexValues = this.normalizeTarget(indexValues, maxTargetLength);\n    let result: number | IWeight | IPercentage;\n    if (key === \"weights\") {\n      result = this.evaluateToNumberOrWeightOrPercentage(expression);\n      this.updates.push({ type: key, value: { value: result, op, target: normalizedIndexValues } });\n    } else {\n      result = this.evaluateToNumber(expression);\n      this.updates.push({ type: key, value: { value: result, op, target: normalizedIndexValues } });\n      if (key === \"setVariationIndex\") {\n        const [week, day] = normalizedIndexValues;\n        if ((week === \"*\" || week === this.bindings.week) && (day === \"*\" || day === this.bindings.day)) {\n          this.bindings.setVariationIndex = result;\n        }\n      } else if (key === \"descriptionIndex\") {\n        const [week, day] = normalizedIndexValues;\n        if ((week === \"*\" || week === this.bindings.week) && (day === \"*\" || day === this.bindings.day)) {\n          this.bindings.descriptionIndex = result;\n        }\n      } else if (key === \"numberOfSets\") {\n        const [week, day, setVariationIndex] = normalizedIndexValues;\n        if (\n          (week === \"*\" || week === this.bindings.week) &&\n          (day === \"*\" || day === this.bindings.day) &&\n          (setVariationIndex === \"*\" || setVariationIndex === this.bindings.setVariationIndex)\n        ) {\n          this.bindings.numberOfSets = result;\n          this.bindings.ns = result;\n        }\n      }\n    }\n\n    return result;\n  }\n\n  private calculateIndexValues(indexes: SyntaxNode[]): (number | \"*\")[] {\n    return CollectionUtils.compact(indexes).map((ie) => {\n      if (ie.type.name === NodeName.Wildcard) {\n        return \"*\" as const;\n      } else {\n        const v = this.evaluate(ie);\n        const v1 = Array.isArray(v) ? v[0] : v;\n        return Weight.is(v1) ? v1.value : typeof v1 === \"number\" ? v1 : v1 ? 1 : 0;\n      }\n    });\n  }\n\n  private normalizeTarget(target: (number | \"*\")[], length: number): (number | \"*\")[] {\n    const newTarget = [...target];\n    for (let i = 0; i < length - target.length; i += 1) {\n      newTarget.unshift(\"*\");\n    }\n    return newTarget;\n  }\n\n  private toNumber(\n    value: number | boolean | IWeight | IPercentage | (IWeight | IPercentage | number | undefined)[]\n  ): number {\n    if (typeof value === \"number\") {\n      return value;\n    } else if (typeof value === \"boolean\") {\n      return 0;\n    } else if (Weight.is(value)) {\n      return value.value;\n    } else if (Weight.isPct(value)) {\n      return value.value;\n    } else if (Array.isArray(value)) {\n      return this.toNumber(value[0] ?? 0);\n    } else {\n      return 0;\n    }\n  }\n\n  public evaluate(\n    expr: SyntaxNode\n  ): number | boolean | IWeight | IPercentage | (IWeight | IPercentage | number | undefined)[] {\n    if (expr.type.name === NodeName.Program || expr.type.name === NodeName.BlockExpression) {\n      let result: number | boolean | IWeight | (IWeight | IPercentage | number | undefined)[] | IPercentage = 0;\n      for (const child of getChildren(expr)) {\n        if (!child.type.isSkipped) {\n          result = this.evaluate(child);\n        }\n      }\n      return result;\n    } else if (expr.type.name === NodeName.BinaryExpression) {\n      const [left, operator, right] = getChildren(expr);\n      const evalLeft = this.evaluate(left);\n      const evalRight = this.evaluate(right);\n      const op = this.getValue(operator);\n      if (typeof evalLeft === \"boolean\" || typeof evalRight === \"boolean\") {\n        if (op === \"&&\") {\n          return evalLeft && evalRight;\n        } else if (op === \"||\") {\n          return evalLeft || evalRight;\n        } else {\n          this.error(`Unknown operator ${op}`, operator);\n        }\n      } else {\n        if (op === \">\") {\n          return comparing(evalLeft, evalRight, op);\n        } else if (op === \"<\") {\n          return comparing(evalLeft, evalRight, op);\n        } else if (op === \">=\") {\n          return comparing(evalLeft, evalRight, op);\n        } else if (op === \"<=\") {\n          return comparing(evalLeft, evalRight, op);\n        } else if (op === \"==\") {\n          return comparing(evalLeft, evalRight, op);\n        } else if (op === \"!=\") {\n          return comparing(evalLeft, evalRight, op);\n        } else {\n          if (Array.isArray(evalLeft) || Array.isArray(evalRight)) {\n            this.error(`You cannot apply ${op} to arrays`, operator);\n          }\n          if (op === \"+\") {\n            return this.add(evalLeft, evalRight);\n          } else if (op === \"-\") {\n            return this.subtract(evalLeft, evalRight);\n          } else if (op === \"*\") {\n            return this.multiply(evalLeft, evalRight);\n          } else if (op === \"/\") {\n            return this.divide(evalLeft, evalRight);\n          } else if (op === \"%\") {\n            return this.modulo(evalLeft, evalRight);\n          } else {\n            this.error(`Unknown operator ${op} between ${evalLeft} and ${evalRight}`, operator);\n          }\n        }\n      }\n    } else if (expr.type.name === NodeName.NumberExpression) {\n      const numberNode = expr.getChild(NodeName.Number);\n      if (numberNode == null) {\n        assert(NodeName.NumberExpression);\n      }\n      const value = parseFloat(this.getValue(numberNode));\n      const plusNode = expr.getChild(NodeName.Plus);\n      const sign = plusNode ? this.getValue(plusNode) : undefined;\n      return sign === \"-\" ? -value : value;\n    } else if (expr.type.name === NodeName.Percentage) {\n      const value = MathUtils.roundFloat(parseFloat(this.getValue(expr)), 2);\n      return Weight.buildPct(value);\n    } else if (expr.type.name === NodeName.Ternary) {\n      const [condition, then, or] = getChildren(expr);\n      return this.evaluate(condition) ? this.evaluate(then) : this.evaluate(or);\n    } else if (expr.type.name === NodeName.ForExpression) {\n      const variableNode = expr.getChild(NodeName.Variable);\n      const forInExpression = expr.getChild(NodeName.ForInExpression);\n      const blockNode = expr.getChild(NodeName.BlockExpression);\n      if (variableNode == null) {\n        assert(NodeName.ForExpression);\n      }\n      if (forInExpression == null) {\n        assert(NodeName.ForInExpression);\n      }\n      if (blockNode == null) {\n        assert(NodeName.BlockExpression);\n      }\n      const forIn = this.evaluate(forInExpression);\n      if (!Array.isArray(forIn)) {\n        this.error(`for in expression should return an array`, forInExpression);\n      }\n      const varKey = this.getValue(variableNode).replace(\"var.\", \"\");\n      for (let i = 1; i <= forIn.length; i += 1) {\n        this.vars[varKey] = i;\n        this.evaluate(blockNode);\n      }\n      return forIn.length;\n    } else if (expr.type.name === NodeName.IfExpression) {\n      const parenthesisNodes = expr.getChildren(NodeName.ParenthesisExpression);\n      const blockNodes = expr.getChildren(NodeName.BlockExpression);\n      while (parenthesisNodes.length > 0) {\n        const parenthesisNode = parenthesisNodes.shift()!;\n        const blockNode = blockNodes.shift()!;\n        const condition = this.evaluate(parenthesisNode);\n        if (condition) {\n          return this.evaluate(blockNode);\n        }\n      }\n      const lastBlock = blockNodes.shift();\n      if (lastBlock != null) {\n        return this.evaluate(lastBlock);\n      } else {\n        return 0;\n      }\n    } else if (expr.type.name === NodeName.ParenthesisExpression) {\n      const [node] = getChildren(expr);\n      if (node == null) {\n        assert(NodeName.ParenthesisExpression);\n      }\n      return this.evaluate(node);\n    } else if (expr.type.name === NodeName.StateVariableIndex) {\n      const [expression] = getChildren(expr);\n      return this.evaluate(expression);\n    } else if (expr.type.name === NodeName.AssignmentExpression) {\n      const [variableNode, expression] = getChildren(expr);\n      if (\n        variableNode == null ||\n        (variableNode.type.name !== NodeName.StateVariable &&\n          variableNode.type.name !== NodeName.VariableExpression &&\n          variableNode.type.name !== NodeName.Variable) ||\n        expression == null\n      ) {\n        assert(NodeName.AssignmentExpression);\n      }\n      if (variableNode.type.name === NodeName.VariableExpression) {\n        const nameNode = variableNode.getChild(NodeName.Keyword);\n        if (nameNode == null) {\n          this.error(`Missing variable name`, variableNode);\n        }\n        const indexExprs = variableNode.getChildren(NodeName.VariableIndex);\n        const variable = this.getValue(nameNode);\n        if (variable === \"level\") {\n          this.error(`'level' can only be changed with '+=' or '-=' in a progress script`, variableNode);\n        } else if (variable === \"manualLevel\") {\n          this.error(`'manualLevel' is read-only`, variableNode);\n        } else if (variable === \"rm1\") {\n          if (indexExprs.length > 0) {\n            this.error(`rm1 is not an array`, expr);\n          }\n          const evaluatedValue = this.evaluate(expression);\n          let value = Array.isArray(evaluatedValue) ? evaluatedValue[0] : evaluatedValue;\n          value = value ?? 0;\n          value = value === true ? 1 : value === false ? 0 : value;\n          value = Weight.convertToWeight(this.bindings.rm1, value, this.unit);\n          this.bindings.rm1 = value;\n          return value;\n        } else if (\n          this.mode === \"planner\" &&\n          (variable === \"reps\" ||\n            variable === \"weights\" ||\n            variable === \"RPE\" ||\n            variable === \"minReps\" ||\n            variable === \"timers\" ||\n            variable === \"setTimers\" ||\n            variable === \"logrpes\" ||\n            variable === \"amraps\" ||\n            variable === \"askweights\" ||\n            variable === \"setVariationIndex\" ||\n            variable === \"descriptionIndex\" ||\n            variable === \"numberOfSets\")\n        ) {\n          return this.recordVariableUpdate(variable, expression, indexExprs, \"=\");\n        } else if (this.mode === \"update\" && variable === \"numberOfSets\") {\n          return this.changeNumberOfSets(expression, \"=\");\n        } else if (\n          this.mode === \"update\" &&\n          (variable === \"reps\" ||\n            variable === \"weights\" ||\n            variable === \"RPE\" ||\n            variable === \"amraps\" ||\n            variable === \"logrpes\" ||\n            variable === \"askweights\" ||\n            variable === \"minReps\" ||\n            variable === \"timers\" ||\n            variable === \"setTimers\")\n        ) {\n          return this.changeBinding(variable, expression, indexExprs, \"=\");\n        } else {\n          this.error(`Unknown variable '${variable}'`, variableNode);\n        }\n      } else if (variableNode.type.name === NodeName.Variable) {\n        const varKey = this.getValue(variableNode).replace(\"var.\", \"\");\n        const value = this.evaluate(expression);\n        if (Weight.is(value) || Weight.isPct(value) || typeof value === \"number\") {\n          this.vars[varKey] = value;\n        } else {\n          this.vars[varKey] = value ? 1 : 0;\n        }\n        return this.vars[varKey];\n      } else {\n        const indexNode = variableNode.getChild(NodeName.StateVariableIndex);\n        const stateKeyNode = variableNode.getChild(NodeName.Keyword);\n        if (stateKeyNode != null) {\n          const stateKey = this.getValue(stateKeyNode);\n          let state: IProgramState | undefined;\n          if (indexNode == null) {\n            if (stateKey in this.state) {\n              state = this.state;\n            } else {\n              this.error(`There's no state variable '${stateKey}'`, variableNode);\n            }\n          } else {\n            const indexEval = this.evaluate(indexNode);\n            const index = this.toNumber(indexEval);\n            state = this.otherStates[index];\n          }\n          const value = this.evaluate(expression);\n          if (state != null) {\n            if (Weight.is(value) || Weight.isPct(value) || typeof value === \"number\") {\n              state[stateKey] = value;\n            } else {\n              state[stateKey] = value ? 1 : 0;\n            }\n          }\n          return value;\n        } else {\n          return 0;\n        }\n      }\n    } else if (expr.type.name === NodeName.IncAssignmentExpression) {\n      const [stateVar, incAssignmentExpr, expression] = getChildren(expr);\n      if (\n        stateVar == null ||\n        (stateVar.type.name !== NodeName.StateVariable &&\n          stateVar.type.name !== NodeName.VariableExpression &&\n          stateVar.type.name !== NodeName.Variable) ||\n        expression == null ||\n        incAssignmentExpr == null\n      ) {\n        assert(NodeName.IncAssignmentExpression);\n      }\n      if (stateVar.type.name === NodeName.VariableExpression) {\n        const nameNode = stateVar.getChild(NodeName.Keyword);\n        if (nameNode == null) {\n          this.error(`Missing variable name`, stateVar);\n        }\n        const indexExprs = stateVar.getChildren(NodeName.VariableIndex);\n        const variable = this.getValue(nameNode);\n        if (variable === \"level\") {\n          return this.recordLevelUpdate(stateVar, incAssignmentExpr, expression, indexExprs);\n        } else if (variable === \"manualLevel\") {\n          this.error(`'manualLevel' is read-only`, stateVar);\n        } else if (variable === \"rm1\") {\n          if (indexExprs.length > 0) {\n            this.error(`rm1 is not an array`, expr);\n          }\n          const evaluatedValue = this.evaluate(expression);\n          let value = Array.isArray(evaluatedValue) ? evaluatedValue[0] : evaluatedValue;\n          value = value ?? 0;\n          value = value === true ? 1 : value === false ? 0 : value;\n\n          const op = this.getValue(incAssignmentExpr);\n          if (op === \"+=\") {\n            this.bindings.rm1 = Weight.convertToWeight(\n              this.bindings.rm1,\n              this.add(this.bindings.rm1, value),\n              this.unit\n            );\n          } else if (op === \"-=\") {\n            this.bindings.rm1 = Weight.convertToWeight(\n              this.bindings.rm1,\n              this.subtract(this.bindings.rm1, value),\n              this.unit\n            );\n          } else if (op === \"*=\") {\n            this.bindings.rm1 = Weight.convertToWeight(\n              this.bindings.rm1,\n              this.multiply(this.bindings.rm1, value),\n              this.unit\n            );\n          } else if (op === \"/=\") {\n            this.bindings.rm1 = Weight.convertToWeight(\n              this.bindings.rm1,\n              this.divide(this.bindings.rm1, value),\n              this.unit\n            );\n          } else {\n            this.error(`Unknown operator ${op} after ${variable}`, incAssignmentExpr);\n          }\n          return this.bindings.rm1;\n        } else if (\n          this.mode === \"planner\" &&\n          (variable === \"reps\" ||\n            variable === \"weights\" ||\n            variable === \"RPE\" ||\n            variable === \"minReps\" ||\n            variable === \"timers\" ||\n            variable === \"setTimers\" ||\n            variable === \"setVariationIndex\" ||\n            variable === \"descriptionIndex\" ||\n            variable === \"numberOfSets\")\n        ) {\n          const op = this.getValue(incAssignmentExpr);\n          if (op !== \"=\" && op !== \"+=\" && op !== \"-=\" && op !== \"*=\" && op !== \"/=\") {\n            this.error(`Unknown operator ${op} after ${variable}`, incAssignmentExpr);\n          }\n          return this.recordVariableUpdate(variable, expression, indexExprs, op);\n        } else if (this.mode === \"update\" && variable === \"numberOfSets\") {\n          const op = this.getValue(incAssignmentExpr);\n          if (op !== \"=\" && op !== \"+=\" && op !== \"-=\" && op !== \"*=\" && op !== \"/=\") {\n            this.error(`Unknown operator ${op} after ${variable}`, incAssignmentExpr);\n          }\n          return this.changeNumberOfSets(expression, op);\n        } else if (\n          this.mode === \"update\" &&\n          (variable === \"reps\" ||\n            variable === \"weights\" ||\n            variable === \"RPE\" ||\n            variable === \"minReps\" ||\n            variable === \"timers\" ||\n            variable === \"setTimers\")\n        ) {\n          const op = this.getValue(incAssignmentExpr);\n          if (op !== \"=\" && op !== \"+=\" && op !== \"-=\" && op !== \"*=\" && op !== \"/=\") {\n            this.error(`Unknown operator ${op} after ${variable}`, incAssignmentExpr);\n          }\n          return this.changeBinding(variable, expression, indexExprs, op);\n        } else {\n          this.error(`Unknown variable '${variable}'`, stateVar);\n        }\n      } else if (stateVar.type.name === NodeName.Variable) {\n        const varKey = this.getValue(stateVar).replace(\"var.\", \"\");\n        let value = this.evaluate(expression);\n        if (!(Weight.is(value) || Weight.isPct(value) || typeof value === \"number\")) {\n          value = value ? 1 : 0;\n        }\n        const op = this.getValue(incAssignmentExpr);\n        if (op !== \"=\" && op !== \"+=\" && op !== \"-=\" && op !== \"*=\" && op !== \"/=\") {\n          this.error(`Unknown operator ${op} after ${varKey}`, incAssignmentExpr);\n        }\n        const currentValue = this.vars[varKey];\n        if (op === \"+=\") {\n          this.vars[varKey] = this.add(currentValue, value);\n        } else if (op === \"-=\") {\n          this.vars[varKey] = this.subtract(currentValue, value);\n        } else if (op === \"*=\") {\n          this.vars[varKey] = this.multiply(currentValue, value);\n        } else if (op === \"/=\") {\n          this.vars[varKey] = this.divide(currentValue, value);\n        } else {\n          this.error(`Unknown operator ${op} after ${varKey}`, incAssignmentExpr);\n        }\n        return this.vars[varKey];\n      } else {\n        const indexNode = stateVar.getChild(NodeName.StateVariableIndex);\n        const stateKeyNode = stateVar.getChild(NodeName.Keyword);\n        if (stateKeyNode != null) {\n          const stateKey = this.getValue(stateKeyNode);\n          let state: IProgramState | undefined;\n          if (indexNode == null) {\n            if (stateKey in this.state) {\n              state = this.state;\n            } else {\n              this.error(`There's no state variable '${stateKey}'`, stateVar);\n            }\n          } else {\n            const indexEval = this.evaluate(indexNode);\n            const index = this.toNumber(indexEval);\n            state = this.otherStates[index];\n          }\n\n          let value = this.evaluate(expression);\n          if (state != null) {\n            if (!(Weight.is(value) || Weight.isPct(value) || typeof value === \"number\")) {\n              value = value ? 1 : 0;\n            }\n            const op = this.getValue(incAssignmentExpr);\n            const currentValue = state[stateKey] ?? 0;\n            if (op === \"+=\") {\n              state[stateKey] = this.add(currentValue, value);\n            } else if (op === \"-=\") {\n              state[stateKey] = this.subtract(currentValue, value);\n            } else if (op === \"*=\") {\n              state[stateKey] = this.multiply(currentValue, value);\n            } else if (op === \"/=\") {\n              state[stateKey] = this.divide(currentValue, value);\n            } else {\n              this.error(`Unknown operator ${op} after state.${stateKey}`, incAssignmentExpr);\n            }\n            return state[stateKey];\n          } else {\n            return value;\n          }\n        } else {\n          return 0;\n        }\n      }\n    } else if (expr.type.name === NodeName.BuiltinFunctionExpression) {\n      const fns = this.fns;\n      const [keyword, ...args] = getChildren(expr);\n      if (keyword == null || keyword.type.name !== NodeName.Keyword) {\n        assert(NodeName.BuiltinFunctionExpression);\n      }\n      const name = this.getValue(keyword) as keyof typeof fns;\n      if (name != null && this.fns[name] != null) {\n        const argValues = args.map((a) => this.evaluate(a));\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        const fn = this.fns[name];\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        return (fn as any).apply(undefined, [...argValues, this.fnContext, this.bindings]);\n      } else {\n        this.error(`Unknown function '${name}'`, keyword);\n      }\n    } else if (expr.type.name === NodeName.UnaryExpression) {\n      const [, expression] = getChildren(expr);\n      if (expression == null) {\n        assert(NodeName.UnaryExpression);\n      }\n      const evaluated = this.evaluate(expression);\n      return !evaluated;\n    } else if (expr.type.name === NodeName.WeightExpression) {\n      return this.getWeight(expr) ?? Weight.build(0, this.unit);\n    } else if (expr.type.name === NodeName.VariableExpression) {\n      const [nameNode, ...indexExprs] = getChildren(expr);\n      if (nameNode == null) {\n        assert(NodeName.VariableExpression);\n      }\n      const name = this.getValue(nameNode) as keyof IScriptBindings;\n      if (indexExprs.some((e) => e.type.name !== NodeName.VariableIndex)) {\n        assert(NodeName.VariableIndex);\n      }\n      if (indexExprs.length === 0) {\n        let value = this.bindings[name];\n        if (Array.isArray(value) && name === \"minReps\") {\n          value = value.map((v, i) => (v as number) ?? this.bindings.reps[i]);\n        }\n        return value;\n      } else if (indexExprs.length === 1) {\n        const indexExpr = indexExprs[0];\n        const indexNode = getChildren(indexExpr)[0];\n        if (indexNode.type.name === NodeName.Wildcard || indexNode.type.name === NodeName.Current) {\n          this.error(`Can't use '*' or '_' as an index when reading from variables`, indexNode);\n        }\n        const indexEval = this.evaluate(indexNode);\n        let index: number;\n        if (Weight.is(indexEval) || Weight.isPct(indexEval)) {\n          index = indexEval.value;\n        } else if (typeof indexEval === \"number\") {\n          index = indexEval;\n        } else {\n          index = indexEval ? 1 : 0;\n        }\n        index -= 1;\n        const binding = this.bindings[name];\n        if (!Array.isArray(binding)) {\n          this.error(`Variable ${name} should be an array`, nameNode);\n        }\n        if (index >= binding.length) {\n          this.error(`Out of bounds index ${index + 1} for array ${name}`, nameNode);\n        }\n        let value = binding[index];\n        if (value == null) {\n          value = name === \"minReps\" ? (this.bindings.reps[index] ?? 0) : 0;\n        }\n        return value;\n      } else {\n        this.error(`Can't use [1:1] syntax when reading from the ${name} variable`, expr);\n      }\n    } else if (expr.type.name === NodeName.StateVariable) {\n      const stateKey = this.getStateKey(expr);\n      if (stateKey == null) {\n        this.error(`You cannot read from other exercises states, you can only write to them`, expr);\n      }\n      if (stateKey in this.state) {\n        return this.state[stateKey];\n      } else {\n        this.error(`There's no state variable '${stateKey}'`, expr);\n      }\n    } else if (expr.type.name === NodeName.Variable) {\n      const varKey = this.getValue(expr).replace(\"var.\", \"\");\n      if (varKey in this.vars) {\n        return this.vars[varKey];\n      } else {\n        this.error(`There's no variable '${varKey}'`, expr);\n      }\n    } else if (expr.type.name === NodeName.ForInExpression) {\n      const child = getChildren(expr)[0];\n      return this.evaluate(child);\n    } else {\n      this.error(`Unknown node type ${expr.node.type.name}`, expr);\n    }\n  }\n\n  private add(\n    one: IWeight | number | IPercentage,\n    two: IWeight | number | IPercentage\n  ): IWeight | number | IPercentage {\n    return this.operation(this.bindings.rm1, one, two, (a, b) => a + b);\n  }\n\n  private subtract(\n    one: IWeight | number | IPercentage,\n    two: IWeight | number | IPercentage\n  ): IWeight | number | IPercentage {\n    return this.operation(this.bindings.rm1, one, two, (a, b) => a - b);\n  }\n\n  private multiply(\n    one: IWeight | number | IPercentage,\n    two: IWeight | number | IPercentage\n  ): IWeight | number | IPercentage {\n    return this.operation(this.bindings.rm1, one, two, (a, b) => a * b);\n  }\n\n  private divide(\n    one: IWeight | number | IPercentage,\n    two: IWeight | number | IPercentage\n  ): IWeight | number | IPercentage {\n    return this.operation(this.bindings.rm1, one, two, (a, b) => a / b);\n  }\n\n  private modulo(\n    one: IWeight | number | IPercentage,\n    two: IWeight | number | IPercentage\n  ): IWeight | number | IPercentage {\n    return this.operation(undefined, one, two, (a, b) => a % b);\n  }\n\n  private operation(\n    onerm: IWeight | undefined,\n    a: IWeight | number | IPercentage,\n    b: IWeight | number | IPercentage,\n    op: (x: number, y: number) => number\n  ): IWeight | number | IPercentage {\n    try {\n      return Weight.op(onerm, a, b, op);\n    } catch (error) {\n      const e = error as Error;\n      throw new LiftoscriptSyntaxError(e.message, 0, 0, 0, 0);\n    }\n  }\n}\n","import { ITrainerTexts } from \"@shared/models/glossary\";\n\nconst keyPrefix = \"trainerTexts:\";\nconst maxStoredBytes = 2 * 1024 * 1024;\n\n// A part of `Storage` that the cache uses.\nexport interface ITextsStorage {\n  readonly length: number;\n  key(index: number): string | null;\n  getItem(key: string): string | null;\n  setItem(key: string, value: string): void;\n  removeItem(key: string): void;\n}\n\nfunction getStorage(): ITextsStorage | undefined {\n  try {\n    return typeof localStorage !== \"undefined\" ? localStorage : undefined;\n  } catch (e) {\n    return undefined;\n  }\n}\n\nfunction keysOf(storage: ITextsStorage): string[] {\n  const keys: string[] = [];\n  for (let i = 0; i < storage.length; i += 1) {\n    const key = storage.key(i);\n    if (key != null && key.startsWith(keyPrefix)) {\n      keys.push(key);\n    }\n  }\n  return keys;\n}\n\n// A copy with no `exercises` (from before exercise descriptions) is no copy: the next load asks with no version.\nfunction isTexts(value: unknown): value is ITrainerTexts {\n  const texts = value as ITrainerTexts | null;\n  return (\n    texts != null &&\n    typeof texts === \"object\" &&\n    typeof texts.version === \"number\" &&\n    texts.glossary != null &&\n    texts.exercises != null\n  );\n}\n\n/**\n * The last answer of `GET /api/trainer-texts`, in `localStorage` under `trainerTexts:<userId>:<trainerId>`. One copy\n * is kept for each user. A copy over 2 MB, or a write that fails, stays in memory only. No storage is fine.\n */\nexport class TrainerTextsCache {\n  // The copies that did not go to storage, for each user id.\n  private static memory: Record<string, ITrainerTexts | undefined> = {};\n\n  public static key(userId: string, trainerId?: string): string {\n    return `${keyPrefix}${userId}:${trainerId ?? \"none\"}`;\n  }\n\n  public static read(userId: string, storage: ITextsStorage | undefined = getStorage()): ITrainerTexts | undefined {\n    // A copy in memory is newer than a copy in storage: it is there only when the last write did not reach storage.\n    if (TrainerTextsCache.memory[userId] != null) {\n      return TrainerTextsCache.memory[userId];\n    }\n    const prefix = `${keyPrefix}${userId}:`;\n    try {\n      for (const key of storage ? keysOf(storage) : []) {\n        if (key.startsWith(prefix)) {\n          const parsed: unknown = JSON.parse(storage?.getItem(key) ?? \"null\");\n          if (isTexts(parsed)) {\n            return parsed;\n          }\n        }\n      }\n    } catch (e) {\n      // A broken copy is the same as no copy.\n    }\n    return undefined;\n  }\n\n  // Keeps the new copy and removes every other `trainerTexts:*` key (another trainer, another user).\n  public static write(userId: string, texts: ITrainerTexts, storage: ITextsStorage | undefined = getStorage()): void {\n    const key = TrainerTextsCache.key(userId, texts.trainerId);\n    TrainerTextsCache.memory = {};\n    try {\n      for (const other of storage ? keysOf(storage) : []) {\n        if (other !== key) {\n          storage?.removeItem(other);\n        }\n      }\n      const json = JSON.stringify(texts);\n      if (storage != null && new TextEncoder().encode(json).length <= maxStoredBytes) {\n        storage.setItem(key, json);\n        return;\n      }\n      storage?.removeItem(key);\n    } catch (e) {\n      // The quota is full, or the storage is blocked. The copy stays in memory.\n      try {\n        storage?.removeItem(key);\n      } catch (removeError) {\n        // The old copy stays. The copy in memory is newer, so `read` gives that one.\n      }\n    }\n    TrainerTextsCache.memory[userId] = texts;\n  }\n\n  // Removes every `trainerTexts:*` key that is not of this user.\n  public static clearOthers(userId: string, storage: ITextsStorage | undefined = getStorage()): void {\n    const prefix = `${keyPrefix}${userId}:`;\n    for (const id of Object.keys(TrainerTextsCache.memory)) {\n      if (id !== userId) {\n        delete TrainerTextsCache.memory[id];\n      }\n    }\n    try {\n      for (const key of storage ? keysOf(storage) : []) {\n        if (!key.startsWith(prefix)) {\n          storage?.removeItem(key);\n        }\n      }\n    } catch (e) {\n      // The storage is blocked. There is nothing to remove.\n    }\n  }\n\n  public static clearAll(storage: ITextsStorage | undefined = getStorage()): void {\n    TrainerTextsCache.memory = {};\n    try {\n      for (const key of storage ? keysOf(storage) : []) {\n        storage?.removeItem(key);\n      }\n    } catch (e) {\n      // The storage is blocked. There is nothing to remove.\n    }\n  }\n}\n","import { IStorage, IUnitKey, IHistoryRecord } from \"@shared/types\";\nimport type { ISyncChange, ISyncDecision, ISyncReason, ISyncServerUnit } from \"@shared/models/syncDecide\";\nimport { SyncUnits } from \"@shared/models/syncUnits\";\nimport { runMigrations } from \"@shared/migrations/runner\";\nimport type { IHeldBase, IPhoneSnapshot } from \"@shared/models/state\";\n\n// The wire types of `POST /api/sync3`.\nexport interface ISync3Request {\n  lastRev: number;\n  // The `syncEpoch` that the phone got with its last response. Missing before the first sync.\n  syncEpoch?: string;\n  version: IStorage[\"version\"];\n  changes: ISyncChange[];\n}\n\nexport interface ISync3Decision {\n  status: ISyncDecision[\"status\"];\n  rule: number;\n  reason?: ISyncReason;\n  fields: ISyncDecision[\"fields\"];\n  removed: boolean;\n}\n\nexport type ISync3Response =\n  | {\n      type: \"ok\";\n      serverRev: number;\n      syncEpoch?: string;\n      decisions: Record<IUnitKey, ISync3Decision>;\n      // The server value and revisions of each unit that the sync sent or that changed since `lastRev`.\n      // A unit whose value equals what the phone sent has the revisions only.\n      units: Record<IUnitKey, ISyncServerUnit>;\n    }\n  | {\n      // The phone loads `GET /api/snapshot`. With `response_size`, the commit has run: the phone applies\n      // `decisions` and `units` (revisions only) first.\n      type: \"full_snapshot\";\n      reason: \"epoch\" | \"last_rev\" | \"tombstones\" | \"history_floor\" | \"history_size\" | \"response_size\";\n      serverRev: number;\n      syncEpoch?: string;\n      decisions?: Record<IUnitKey, ISync3Decision>;\n      units?: Record<IUnitKey, ISyncServerUnit>;\n    }\n  | { type: \"retry\" }\n  | { type: \"too_big\" }\n  | { type: \"error\"; error: string };\n\n// The wire type of `GET /api/snapshot`. Page 1 has `serverRev` (the snapshot's `lastRev`) and `syncEpoch`.\n// A page with `next` has older history: the phone asks again with `?after=<next>`. \"retry\": a storage upgrade of the\n// user runs; the phone loads the snapshot at the next trigger.\nexport type ISnapshotResponse =\n  | {\n      type: \"ok\";\n      serverRev?: number;\n      syncEpoch?: string;\n      units: Record<IUnitKey, ISyncServerUnit>;\n      next?: number;\n    }\n  | { type: \"retry\" }\n  | { type: \"error\"; error: string };\n\n// What `postSync3` gives back: the server response, or a page that failed with HTTP 413 or a 5xx that is not JSON.\nexport type IPostSync3Result = ISync3Response | { type: \"page_failed\"; status: number };\n\n// The parts of the phone state that a sync changes.\nexport interface IPhoneSyncState {\n  storage: IStorage;\n  snapshot: IPhoneSnapshot;\n  heldBases: Record<IUnitKey, IHeldBase>;\n  removedAt: Record<IUnitKey, number>;\n}\n\nexport interface ISync3Applied {\n  serverRev: number;\n  syncEpoch?: string;\n  decisions: Record<IUnitKey, ISync3Decision>;\n  units: Record<IUnitKey, ISyncServerUnit>;\n}\n\n// Page sizes (see tasks/plan.md \"Page sizes\"). The items count one event item for each record, nickname and planner,\n// so a page with its events, the user item and the programs stays at or under the 100 items of a transaction.\nconst maxPageRecords = 25;\nconst maxPageItems = 90;\nconst maxPageBytes = 3 * 1024 * 1024;\nconst requestOverheadBytes = 1024;\n\nfunction isHistory(unitKey: IUnitKey): boolean {\n  return /^history\\.\\d+$/.test(unitKey);\n}\n\nfunction hasEvent(unitKey: IUnitKey): boolean {\n  return isHistory(unitKey) || unitKey === \"settings.nickname\" || /^program\\..+\\.planner$/.test(unitKey);\n}\n\n// The module 4 carrier field `progressionSnapshot` is not part of the server value.\nfunction withoutCarrier(value: unknown): unknown {\n  if (typeof value === \"object\" && value != null && !Array.isArray(value) && \"progressionSnapshot\" in value) {\n    const { progressionSnapshot: _carrier, ...rest } = value as Record<string, unknown>;\n    return rest;\n  }\n  return value;\n}\n\n// A new workout that carries a progression snapshot.\nfunction hasCarrier(change: ISyncChange): boolean {\n  const value = change.value as { progressionSnapshot?: unknown } | undefined;\n  return isHistory(change.unitKey) && change.kind === \"new\" && value?.progressionSnapshot != null;\n}\n\nfunction isLocalChange(unitKey: IUnitKey, value: unknown, snapshot: IPhoneSnapshot): boolean {\n  if (!SyncUnits.isSentByPhone(unitKey)) {\n    return false;\n  }\n  if (value === undefined) {\n    return unitKey in snapshot.values;\n  }\n  if (isHistory(unitKey) && !(unitKey in snapshot.revs)) {\n    return true;\n  }\n  return !(unitKey in snapshot.values) || SyncUnits.changedFields(snapshot.values[unitKey], value).length > 0;\n}\n\n// Applies server values to the phone units, the snapshot and the held bases. `storage` changes only through `take`.\nclass PhoneUnits {\n  public readonly units: Record<IUnitKey, unknown>;\n  public readonly snapshot: IPhoneSnapshot;\n  public readonly heldBases: Record<IUnitKey, IHeldBase>;\n  public readonly removedAt: Record<IUnitKey, number>;\n  private isStorageChanged = false;\n\n  constructor(\n    private readonly local: Omit<IPhoneSyncState, \"snapshot\">,\n    snapshot: IPhoneSnapshot\n  ) {\n    this.units = SyncUnits.toUnits(local.storage);\n    this.snapshot = { ...snapshot, values: { ...snapshot.values }, revs: { ...snapshot.revs } };\n    this.heldBases = { ...local.heldBases };\n    this.removedAt = { ...local.removedAt };\n  }\n\n  public take(unitKey: IUnitKey, value: unknown): void {\n    if (value === undefined) {\n      if (unitKey in this.units) {\n        delete this.units[unitKey];\n        this.isStorageChanged = true;\n      }\n    } else {\n      this.units[unitKey] = value;\n      this.isStorageChanged = true;\n    }\n  }\n\n  public setSnapshot(unitKey: IUnitKey, value: unknown, rev: number | undefined): void {\n    if (value === undefined) {\n      delete this.snapshot.values[unitKey];\n    } else {\n      this.snapshot.values[unitKey] = value;\n    }\n    if (rev === undefined) {\n      delete this.snapshot.revs[unitKey];\n    } else {\n      this.snapshot.revs[unitKey] = rev;\n    }\n  }\n\n  // A server value of a unit that the phone did not send. A local change stays, with its original base.\n  public applyServer(unitKey: IUnitKey, value: unknown, rev: number | undefined, base: IPhoneSnapshot): void {\n    if (isLocalChange(unitKey, this.units[unitKey], base)) {\n      if (this.heldBases[unitKey] == null) {\n        this.heldBases[unitKey] = { rev: base.revs[unitKey] ?? 0, value: base.values[unitKey] };\n      }\n    } else {\n      this.take(unitKey, value);\n    }\n    this.setSnapshot(unitKey, value, rev);\n  }\n\n  public result(serverRev: number, syncEpoch: string | undefined): IPhoneSyncState {\n    for (const unitKey of Object.keys(this.heldBases)) {\n      if (!isLocalChange(unitKey, this.units[unitKey], this.snapshot)) {\n        delete this.heldBases[unitKey];\n      }\n    }\n    const storage = this.isStorageChanged ? this.rebuild() : this.local.storage;\n    return {\n      storage,\n      snapshot: { ...this.snapshot, lastRev: serverRev, syncEpoch },\n      heldBases: this.heldBases,\n      removedAt: this.removedAt,\n    };\n  }\n\n  private rebuild(): IStorage {\n    const { storage } = this.local;\n    return {\n      ...SyncUnits.fromUnits(this.units, { id: storage.id, version: storage.version }),\n      ...(storage.originalId != null ? { originalId: storage.originalId } : {}),\n      ...(storage._versions != null ? { _versions: storage._versions } : {}),\n    };\n  }\n}\n\nexport class Sync {\n  public static readonly notSyncedBytes = 350 * 1024;\n\n  public static utf8Bytes(value: unknown): number {\n    return new TextEncoder().encode(JSON.stringify(value)).length;\n  }\n\n  // The size of one change for the \"too big for DynamoDB\" check. The server does not store the carrier on the\n  // history item, so the size leaves it out.\n  public static changeBytes(change: ISyncChange): number {\n    return Sync.utf8Bytes(Sync.withoutCarrierChange(change));\n  }\n\n  public static withoutCarrierChange(change: ISyncChange): ISyncChange {\n    return hasCarrier(change) ? { ...change, value: withoutCarrier(change.value) } : change;\n  }\n\n  // The units that a new workout with a carrier needs in the same page: the planner and next day of its program and\n  // the exercise data of the exercises in its snapshot. Only the units that changed on the phone are in `changes`.\n  private static companions(change: ISyncChange, changes: ISyncChange[]): ISyncChange[] {\n    const record = change.value as IHistoryRecord;\n    const keys = new Set([\n      `program.${record.programId}.planner`,\n      `program.${record.programId}.nextDay`,\n      ...Object.keys(record.progressionSnapshot?.rm1 || {}).map((k) => `settings.exerciseData.${k}`),\n    ]);\n    return changes.filter((c) => keys.has(c.unitKey));\n  }\n\n  // The next page of changes: at most 25 history records, 90 items with their events and 3 MB of UTF-8. A page has\n  // at least one change. `maxChanges` makes the page smaller after a page failed.\n  // A new workout with a carrier goes first, in the page of its program units (spec \"Paging\"). When they do not\n  // fit, or `maxChanges` splits them, or `isCarrierDropped`, the workout goes without the carrier.\n  public static page(\n    changes: ISyncChange[],\n    maxChanges: number = Infinity,\n    isCarrierDropped: boolean = false\n  ): ISyncChange[] {\n    const ordered = [...changes.filter(hasCarrier), ...changes.filter((c) => !hasCarrier(c))];\n    const page: ISyncChange[] = [];\n    const inPage = new Set<IUnitKey>();\n    let records = 0;\n    let items = 0;\n    let bytes = requestOverheadBytes;\n    const fitsGroup = (group: ISyncChange[]): boolean => {\n      const groupRecords = group.filter((c) => isHistory(c.unitKey)).length;\n      const groupItems = group.reduce((sum, c) => sum + (hasEvent(c.unitKey) ? 2 : 1), 0);\n      const groupBytes = group.reduce((sum, c) => sum + Sync.utf8Bytes(c) + 1, 0);\n      return (\n        page.length + group.length <= maxChanges &&\n        records + groupRecords <= maxPageRecords &&\n        items + groupItems <= maxPageItems &&\n        bytes + groupBytes <= maxPageBytes\n      );\n    };\n    const add = (group: ISyncChange[]): void => {\n      for (const c of group) {\n        page.push(c);\n        inPage.add(c.unitKey);\n        records += isHistory(c.unitKey) ? 1 : 0;\n        items += hasEvent(c.unitKey) ? 2 : 1;\n        bytes += Sync.utf8Bytes(c) + 1;\n      }\n    };\n    for (const change of ordered) {\n      if (page.length >= maxChanges) {\n        break;\n      }\n      if (inPage.has(change.unitKey)) {\n        continue;\n      }\n      if (hasCarrier(change) && !isCarrierDropped) {\n        const group = [change, ...Sync.companions(change, ordered).filter((c) => !inPage.has(c.unitKey))];\n        if (fitsGroup(group)) {\n          add(group);\n          continue;\n        }\n      }\n      const single = Sync.withoutCarrierChange(change);\n      if (fitsGroup([single]) || page.length === 0) {\n        add([single]);\n      }\n    }\n    return page;\n  }\n\n  // The new workouts in `sent` that rule 8 refused as not valid. They stay on the phone, marked \"not synced\" (spec\n  // \"The response\").\n  public static invalidNewWorkouts(sent: ISyncChange[], decisions: Record<IUnitKey, ISync3Decision>): IUnitKey[] {\n    return sent\n      .filter((c) => {\n        const decision = decisions[c.unitKey];\n        return isHistory(c.unitKey) && c.kind === \"new\" && decision?.status === \"refused\" && decision.rule === 8;\n      })\n      .map((c) => c.unitKey);\n  }\n\n  // Applies a `/api/sync3` response (spec \"The response\"). A decided change leaves the local changes, unless the\n  // user changed the unit again during the request: then it stays, with the sent value as its base when the server\n  // took the sent value, else with its original base. A refused change goes back to the server value, but a refusal\n  // never removes a finished workout (only a binned or removed id does). Other server values go to the units with\n  // no local change; a local change keeps its original base.\n  public static applyResponse(local: IPhoneSyncState, sent: ISyncChange[], response: ISync3Applied): IPhoneSyncState {\n    const phone = new PhoneUnits(local, local.snapshot);\n    const sentByKey = new Map(sent.map((c) => [c.unitKey, c]));\n    const keys = Array.from(new Set([...Object.keys(response.units), ...Array.from(sentByKey.keys())]));\n    for (const unitKey of keys) {\n      const unit = response.units[unitKey] as ISyncServerUnit | undefined;\n      const change = sentByKey.get(unitKey);\n      const decision = response.decisions[unitKey];\n      if (change == null || decision == null) {\n        if (unit != null) {\n          phone.applyServer(unitKey, unit.tombstone != null ? undefined : unit.value, unit.rev, local.snapshot);\n        }\n        continue;\n      }\n\n      const hasTombstone = unit?.tombstone != null;\n      const isAsSent = unit != null && unit.value === undefined && !hasTombstone;\n      const value = isAsSent ? withoutCarrier(change.value) : hasTombstone ? undefined : unit?.value;\n      const current = phone.units[unitKey];\n      const isEditedDuring =\n        change.kind === \"remove\"\n          ? current !== undefined\n          : current === undefined ||\n            SyncUnits.changedFields(withoutCarrier(change.value), withoutCarrier(current)).length > 0;\n\n      if (isEditedDuring) {\n        const isTakenAsSent = isAsSent && (decision.status === \"accepted\" || decision.status === \"unchanged\");\n        if (isTakenAsSent) {\n          delete phone.heldBases[unitKey];\n        } else {\n          // Accepted risk (user decision 2026-10-13): when the server takes this unit only in part, the edit is held\n          // with the original base. At the next sync, rule 6 can then refuse an edit of a field that the server had\n          // accepted. It needs an edit during the request and a part accept, so it is rare.\n          phone.heldBases[unitKey] = {\n            rev: change.baseRev ?? 0,\n            value: change.baseValue,\n            ...(change.converted ? { converted: true } : {}),\n          };\n        }\n        phone.setSnapshot(unitKey, value, unit?.rev);\n        continue;\n      }\n\n      delete phone.heldBases[unitKey];\n      delete phone.removedAt[unitKey];\n      const keepsWorkout = isHistory(unitKey) && change.kind !== \"remove\" && value === undefined && !hasTombstone;\n      if (keepsWorkout) {\n        // The server has no record and no tombstone: the workout stays, and goes again as new.\n        phone.setSnapshot(unitKey, undefined, undefined);\n        continue;\n      }\n      // The phone drops the carrier from the workout that the server decided (spec \"Writers\").\n      if (!isAsSent || withoutCarrier(current) !== current) {\n        phone.take(unitKey, value);\n      }\n      phone.setSnapshot(unitKey, value, unit?.rev);\n    }\n    return phone.result(response.serverRev, response.syncEpoch);\n  }\n\n  // Applies the full snapshot from `/api/snapshot` (all pages). Local changes stay, with their original base. A\n  // workout that the phone has and the server does not stays, with no rev, so it goes again as new. A tombstone does\n  // not give a rev to a workout that the phone has not synced: it goes as new, and rule 4 refuses it. With no snapshot\n  // on the phone, the phone uses `applyConversion`.\n  public static applySnapshot(\n    local: IPhoneSyncState,\n    full: { serverRev: number; syncEpoch?: string; units: Record<IUnitKey, ISyncServerUnit> }\n  ): IPhoneSyncState {\n    const base = local.snapshot;\n    const phone = new PhoneUnits(local, { values: {}, revs: {}, lastRev: 0 });\n    const keys = new Set([\n      ...Object.keys(full.units),\n      ...Object.keys(base.values),\n      ...Object.keys(base.revs),\n      ...Object.keys(phone.units),\n    ]);\n    keys.forEach((unitKey) => {\n      const unit = full.units[unitKey] as ISyncServerUnit | undefined;\n      if (isHistory(unitKey)) {\n        const isUnsynced = phone.units[unitKey] !== undefined && !(unitKey in base.revs);\n        if (unit == null || (unit.tombstone != null && isUnsynced)) {\n          return;\n        }\n      }\n      phone.applyServer(unitKey, unit?.tombstone != null ? undefined : unit?.value, unit?.rev, base);\n    });\n    return phone.result(full.serverRev, full.syncEpoch);\n  }\n\n  // The first-start converter (spec \"Migration\", \"Phones\"): applies the full snapshot to a phone with no snapshot, for\n  // example the old app's state. With the old app's `lastSyncedStorage` (migrated), each unit where `storage` differs\n  // from it stays as a converted change with the `lastSyncedStorage` value as its base (rule 7). With no\n  // `lastSyncedStorage`, only workouts stay. A workout that the server does not have stays and goes as new, also when\n  // the phone had not synced it and it has a tombstone (rule 4 refuses it). A custom exercise that such a workout uses\n  // and that the server does not have stays, and goes as a converted change (the only exception to rule 1). Other\n  // units, and trainer only units, take the server value. The converter never removes a workout that the server\n  // does not have.\n  public static applyConversion(\n    local: Omit<IPhoneSyncState, \"snapshot\">,\n    lastSyncedStorage: IStorage | undefined,\n    full: { serverRev: number; syncEpoch?: string; units: Record<IUnitKey, ISyncServerUnit> }\n  ): IPhoneSyncState {\n    const old = lastSyncedStorage != null ? SyncUnits.toUnits(lastSyncedStorage) : undefined;\n    const phone = new PhoneUnits(local, { values: {}, revs: {}, lastRev: 0 });\n    const original = { ...phone.units };\n    const newWorkouts: IHistoryRecord[] = [];\n    const keys = new Set([...Object.keys(full.units), ...Object.keys(original), ...Object.keys(old || {})]);\n    keys.forEach((unitKey) => {\n      const unit = full.units[unitKey] as ISyncServerUnit | undefined;\n      const value = unit?.tombstone != null ? undefined : unit?.value;\n      const current = original[unitKey];\n      if (isHistory(unitKey) && current !== undefined) {\n        const isUnsynced = old == null || !(unitKey in old);\n        if (unit == null || (unit.tombstone != null && isUnsynced)) {\n          newWorkouts.push(current as IHistoryRecord);\n          return;\n        }\n      }\n      const isConverted =\n        old != null &&\n        SyncUnits.isSentByPhone(unitKey) &&\n        SyncUnits.ownership(unitKey) !== \"trainerOnly\" &&\n        (current === undefined\n          ? unitKey in old\n          : !(unitKey in old) || SyncUnits.changedFields(old[unitKey], current).length > 0);\n      if (isConverted) {\n        phone.heldBases[unitKey] = { rev: 0, value: old[unitKey], converted: true };\n      } else {\n        phone.take(unitKey, value);\n      }\n      phone.setSnapshot(unitKey, value, unit?.rev);\n    });\n\n    const exerciseIds = new Set(newWorkouts.flatMap((w) => (w.entries || []).map((e) => e.exercise?.id)));\n    exerciseIds.forEach((id) => {\n      const unitKey = `settings.exercises.${id}`;\n      if (original[unitKey] !== undefined && full.units[unitKey] == null) {\n        phone.take(unitKey, original[unitKey]);\n        phone.heldBases[unitKey] = { rev: 0, converted: true };\n      }\n    });\n    return phone.result(full.serverRev, full.syncEpoch);\n  }\n\n  // Runs the storage migrations from `version` on the snapshot and on the held bases (spec \"Storage versions\"). The\n  // phone migrates its storage with the same migrations, so a value that a migration changed is not a local change.\n  public static async migrateSnapshot(\n    client: Window[\"fetch\"],\n    version: string,\n    snapshot: IPhoneSnapshot,\n    heldBases: Record<IUnitKey, IHeldBase>\n  ): Promise<{ snapshot: IPhoneSnapshot; heldBases: Record<IUnitKey, IHeldBase> }> {\n    const migrate = async (values: Record<IUnitKey, unknown>): Promise<Record<IUnitKey, unknown>> =>\n      SyncUnits.toUnits(await runMigrations(client, SyncUnits.fromUnits(values, { version })));\n    const values = await migrate(snapshot.values);\n    const heldKeys = Object.keys(heldBases);\n    if (heldKeys.length === 0) {\n      return { snapshot: { ...snapshot, values }, heldBases };\n    }\n    const baseValues = { ...snapshot.values };\n    for (const unitKey of heldKeys) {\n      if (heldBases[unitKey].value === undefined) {\n        delete baseValues[unitKey];\n      } else {\n        baseValues[unitKey] = heldBases[unitKey].value;\n      }\n    }\n    const migratedBases = await migrate(baseValues);\n    const migratedHeld: Record<IUnitKey, IHeldBase> = {};\n    for (const unitKey of heldKeys) {\n      migratedHeld[unitKey] = { ...heldBases[unitKey], value: migratedBases[unitKey] };\n    }\n    return { snapshot: { ...snapshot, values }, heldBases: migratedHeld };\n  }\n\n  // Each unit where `storage` differs from the snapshot, with its base (spec \"The phone\"). The base is the held base\n  // of the unit, else the snapshot. A converted held base gives a converted change with no base rev (rule 7). A\n  // workout with no rev is \"new\" with its full record. The time of a workout edit\n  // is its `updatedAt`, of a removal its time in `removedAt`; else, and for other units, the sync time `now`.\n  public static localChanges(\n    storage: IStorage,\n    snapshot: IPhoneSnapshot,\n    heldBases: Record<IUnitKey, IHeldBase>,\n    options: { now?: number; removedAt?: Record<IUnitKey, number> } = {}\n  ): ISyncChange[] {\n    const now = options.now ?? Date.now();\n    const removedAt = options.removedAt || {};\n    const units = SyncUnits.toUnits(storage);\n    const keys = Array.from(new Set([...Object.keys(units), ...Object.keys(snapshot.values)]));\n    const changes: ISyncChange[] = [];\n    for (const unitKey of keys) {\n      if (!SyncUnits.isSentByPhone(unitKey)) {\n        continue;\n      }\n      const value = units[unitKey];\n      const hasRev = unitKey in snapshot.revs;\n      if (isHistory(unitKey) && value !== undefined && !hasRev) {\n        changes.push({ unitKey, kind: \"new\", value, time: (value as { updatedAt?: number }).updatedAt ?? now });\n        continue;\n      }\n      const inSnapshot = unitKey in snapshot.values;\n      if (value === undefined && !inSnapshot) {\n        continue;\n      }\n      if (value !== undefined && SyncUnits.changedFields(snapshot.values[unitKey], value).length === 0) {\n        continue;\n      }\n      // The phone only adds an assessment result (server rule 1): a result with no snapshot value is \"new\".\n      if (SyncUnits.isAssessmentResult(unitKey) && value !== undefined && !inSnapshot && !(unitKey in heldBases)) {\n        changes.push({ unitKey, kind: \"new\", value, time: now });\n        continue;\n      }\n      const held = heldBases[unitKey];\n      const baseValue = held != null ? held.value : snapshot.values[unitKey];\n      const base = held?.converted\n        ? { baseValue, converted: true }\n        : { baseRev: held != null ? held.rev : (snapshot.revs[unitKey] ?? 0), baseValue };\n      if (value === undefined) {\n        changes.push({ unitKey, kind: \"remove\", ...base, time: removedAt[unitKey] ?? now });\n      } else {\n        const time = isHistory(unitKey) ? ((value as { updatedAt?: number }).updatedAt ?? now) : now;\n        changes.push({ unitKey, kind: \"edit\", value, ...base, time });\n      }\n    }\n    return changes;\n  }\n}\n","const blockedMergeKeys = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n  if (value == null || typeof value !== \"object\") {\n    return false;\n  }\n  const proto = Object.getPrototypeOf(value);\n  return proto === Object.prototype || proto === null;\n}\n\nfunction cloneValue<T>(value: T): T {\n  if (Array.isArray(value)) {\n    return value.map((item) => cloneValue(item)) as T;\n  }\n  if (isPlainObject(value)) {\n    const copy: Record<string, unknown> = {};\n    for (const key of Object.keys(value)) {\n      if (blockedMergeKeys.has(key)) {\n        continue;\n      }\n      copy[key] = cloneValue(value[key]);\n    }\n    return copy as T;\n  }\n  return value;\n}\n\nfunction mergeInternal(target: unknown, source: unknown): unknown {\n  if (Array.isArray(target) && Array.isArray(source)) {\n    return [...target.map((v) => cloneValue(v)), ...source.map((v) => cloneValue(v))];\n  }\n\n  if (isPlainObject(target) && isPlainObject(source)) {\n    const result: Record<string, unknown> = {};\n\n    for (const key of Object.keys(target)) {\n      if (blockedMergeKeys.has(key)) {\n        continue;\n      }\n      result[key] = cloneValue(target[key]);\n    }\n\n    for (const key of Object.keys(source)) {\n      if (blockedMergeKeys.has(key)) {\n        continue;\n      }\n      const sourceValue = source[key];\n      const targetValue = result[key];\n      result[key] = mergeInternal(targetValue, sourceValue);\n    }\n\n    return result;\n  }\n\n  return cloneValue(source);\n}\n\nexport function deepMerge<T, U>(target: T, source: U): T & U {\n  return mergeInternal(target, source) as T & U;\n}\n","export class StateError extends Error {\n  constructor(message: string) {\n    super(message);\n  }\n}\n","import { JSX } from \"preact\";\nimport { useState, useEffect, useRef } from \"preact/hooks\";\nimport { Service } from \"../api/service\";\nimport { IAccount } from \"@shared/models/account\";\nimport { Button } from \"./button\";\nimport { IconDoc } from \"./icons/iconDoc\";\nimport { IconDumbbell } from \"./icons/iconDumbbell\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk } from \"../ducks/thunks\";\nimport { EmailLoginForm } from \"./emailLoginForm\";\nimport { EmailRegisterForm } from \"./emailRegisterForm\";\nimport { MagicLinkForm } from \"./magicLinkForm\";\nimport { ForgotPasswordForm } from \"./forgotPasswordForm\";\nimport { ResetPasswordForm } from \"./resetPasswordForm\";\nimport { TrainerEmailLoginForm } from \"./trainerEmailLoginForm\";\nimport { TrainerLoginEmail } from \"../utils/trainerLoginEmail\";\n\ninterface IAccountProps {\n  account?: IAccount;\n  trainerEmail?: string;\n  redirectUrl?: string;\n  dispatch?: IDispatch;\n  client: Window[\"fetch\"];\n}\n\ndeclare let __HOST__: string;\n\n// `__HOST__` comes from webpack. The server also renders this file, and there it is not defined.\nconst trainerDefaultEmail = TrainerLoginEmail.defaultFor(typeof __HOST__ !== \"undefined\" ? __HOST__ : undefined);\n\nfunction removeQueryParam(key: string): void {\n  const currentUrl = new URL(window.location.href);\n  if (!currentUrl.searchParams.has(key)) {\n    return;\n  }\n  currentUrl.searchParams.delete(key);\n  window.history.replaceState(null, \"\", `${currentUrl.pathname}${currentUrl.search}${currentUrl.hash}`);\n}\n\ntype IEmailChangeConfirm = { kind: \"loading\" } | { kind: \"done\"; email: string } | { kind: \"error\" };\n\n// Reads `email_change_token` from the URL, removes it from the URL, and only then calls the confirm route.\nfunction useEmailChangeConfirm(service: Service): IEmailChangeConfirm | undefined {\n  const [state, setState] = useState<IEmailChangeConfirm | undefined>(undefined);\n  useEffect(() => {\n    const token = new URLSearchParams(window.location.search).get(\"email_change_token\");\n    if (!token) {\n      return;\n    }\n    removeQueryParam(\"email_change_token\");\n    setState({ kind: \"loading\" });\n    service\n      .confirmEmailChange(token)\n      .then((email) => setState({ kind: \"done\", email }))\n      .catch(() => setState({ kind: \"error\" }));\n  }, []);\n  return state;\n}\n\nexport function Account(props: IAccountProps): JSX.Element {\n  const service = new Service(props.client);\n  const confirm = useEmailChangeConfirm(service);\n  if (confirm) {\n    return (\n      <div style={{ minWidth: \"16rem\", maxWidth: \"26rem\" }}>\n        <EmailChangeConfirmView confirm={confirm} hasSession={!!props.account} />\n      </div>\n    );\n  }\n  return (\n    <div style={{ minWidth: \"16rem\", maxWidth: \"26rem\" }}>\n      {props.account ? (\n        <AccountLoggedInView service={service} account={props.account} />\n      ) : props.trainerEmail ? (\n        <TrainerLoggedInView service={service} trainerEmail={props.trainerEmail} />\n      ) : (\n        <AccountLoggedOutView service={service} redirectUrl={props.redirectUrl} dispatch={props.dispatch} />\n      )}\n    </div>\n  );\n}\n\ninterface IEmailChangeConfirmViewProps {\n  confirm: IEmailChangeConfirm;\n  hasSession: boolean;\n}\n\nfunction EmailChangeConfirmView(props: IEmailChangeConfirmViewProps): JSX.Element {\n  const { confirm } = props;\n  if (confirm.kind === \"loading\") {\n    return (\n      <div className=\"my-4 text-center\">\n        <IconSpinner width={48} height={48} />\n      </div>\n    );\n  }\n  if (confirm.kind === \"error\") {\n    return (\n      <div>\n        <h2 className=\"mb-4 text-lg font-bold text-center\">Email Link Not Valid</h2>\n        <div className=\"p-4 mb-4 text-center bg-background-lighterror border border-border-error rounded text-text-error\">\n          <p>This link has expired or was already used. Request a new link in Settings.</p>\n        </div>\n      </div>\n    );\n  }\n  return (\n    <div>\n      <h2 className=\"mb-4 text-lg font-bold text-center\">Email Changed</h2>\n      <div className=\"p-4 mb-4 text-center\">\n        <p>\n          Your email is now <span className=\"font-bold\">{confirm.email}</span>.\n        </p>\n      </div>\n      {props.hasSession && (\n        <div className=\"text-center\">\n          <Button\n            name=\"email-change-go-to-app\"\n            kind=\"orange\"\n            onClick={() => {\n              window.location.href = \"/app\";\n            }}\n          >\n            Go to App\n          </Button>\n        </div>\n      )}\n    </div>\n  );\n}\n\ninterface IAccountLoggedInViewProps {\n  service: Service;\n  account: IAccount;\n}\n\nfunction AccountLoggedInView(props: IAccountLoggedInViewProps): JSX.Element {\n  const [isLoading, setIsLoading] = useState(false);\n  const { account, service } = props;\n  return (\n    <div>\n      <h2 className=\"mb-4 text-lg font-bold text-center\">Current Account</h2>\n      {isLoading ? (\n        <div className=\"my-4 text-center\">\n          <IconSpinner width={48} height={48} />\n        </div>\n      ) : (\n        <>\n          <div className=\"flex\">\n            <div className=\"flex-1 mr-2 text-lg\">{account.name || `id: ${account.id}`}</div>\n            <div>\n              {account.numberOfPrograms != null && (\n                <>\n                  <span className=\"pr-2 align-middle\">{account.numberOfPrograms}</span>\n                  <span className=\"pr-4 align-middle\">\n                    <IconDoc width={12} height={16} />\n                  </span>\n                </>\n              )}\n              {account.numberOfWorkouts != null && (\n                <>\n                  <span className=\"pr-2 align-middle\">{account.numberOfWorkouts}</span>\n                  <span className=\"align-middle\">\n                    <IconDumbbell width={28} height={19} />\n                  </span>\n                </>\n              )}\n            </div>\n          </div>\n          {account.name && <div className=\"text-xs text-text-secondary\">id: {account.id}</div>}\n          <div className=\"text-xs text-text-secondary\">\n            {account.email === \"noemail@example.com\" ? (\n              <></>\n            ) : (\n              <>\n                Signed in as <span className=\"font-bold\">{account.email}</span>\n              </>\n            )}\n          </div>\n          <div className=\"mt-4 flex flex-col items-center gap-2\">\n            <Button\n              name=\"account-go-to-app\"\n              kind=\"orange\"\n              onClick={() => {\n                window.location.href = \"/app\";\n              }}\n            >\n              Go to App\n            </Button>\n            <Button\n              name=\"account-sign-out\"\n              kind=\"purple\"\n              data-cy=\"menu-item-logout\"\n              className=\"ls-logout\"\n              onClick={async () => {\n                setIsLoading(true);\n                await service.signout();\n                window.location.href = \"/\";\n              }}\n            >\n              Sign Out\n            </Button>\n          </div>\n        </>\n      )}\n    </div>\n  );\n}\n\ninterface ITrainerLoggedInViewProps {\n  service: Service;\n  trainerEmail: string;\n}\n\nfunction TrainerLoggedInView(props: ITrainerLoggedInViewProps): JSX.Element {\n  const [isLoading, setIsLoading] = useState(false);\n  const { trainerEmail, service } = props;\n  return (\n    <div>\n      <h2 className=\"mb-4 text-lg font-bold text-center\">Trainer Account</h2>\n      {isLoading ? (\n        <div className=\"my-4 text-center\">\n          <IconSpinner width={48} height={48} />\n        </div>\n      ) : (\n        <>\n          <div className=\"text-xs text-text-secondary mb-4\">\n            Signed in as <span className=\"font-bold\">{trainerEmail}</span>\n          </div>\n          <div className=\"mt-4 flex flex-col items-center gap-2\">\n            <Button\n              name=\"trainer-account-go-to-dashboard\"\n              kind=\"orange\"\n              onClick={() => {\n                window.location.href = \"/trainer\";\n              }}\n            >\n              Go to Trainer Dashboard\n            </Button>\n            <Button\n              name=\"trainer-account-sign-out\"\n              kind=\"purple\"\n              data-cy=\"trainer-menu-item-logout\"\n              className=\"ls-trainer-logout\"\n              onClick={async () => {\n                setIsLoading(true);\n                await service.trainerSignout();\n                window.location.reload();\n              }}\n            >\n              Sign Out\n            </Button>\n          </div>\n        </>\n      )}\n    </div>\n  );\n}\n\ninterface IAccountLoggedOutViewProps {\n  service: Service;\n  redirectUrl?: string;\n  dispatch?: IDispatch;\n}\n\ntype IAuthMode =\n  | \"buttons\"\n  | \"email-login\"\n  | \"email-register\"\n  | \"magic-link\"\n  | \"forgot-password\"\n  | \"reset-password\"\n  | \"invalid-token\"\n  | \"invalid-invite\"\n  | \"invalid-magic-link\"\n  | \"trainer-email-login\"\n  | \"trainer-email-register\"\n  | \"trainer-magic-link\"\n  | \"trainer-forgot-password\"\n  | \"trainer-reset-password\"\n  | \"trainer-invalid-token\";\n\nfunction AccountLoggedOutView(props: IAccountLoggedOutViewProps): JSX.Element {\n  const [isLoading, setIsLoading] = useState(false);\n  const [mode, setMode] = useState<IAuthMode>(\"buttons\");\n  const [prefillEmail, setPrefillEmail] = useState<string | undefined>(undefined);\n  const [resetToken, setResetToken] = useState<string | undefined>(undefined);\n  const [trainerResetToken, setTrainerResetToken] = useState<string | undefined>(undefined);\n  const [inviteToken, setInviteToken] = useState<string | undefined>(undefined);\n  const [invitedEmail, setInvitedEmail] = useState<string | undefined>(undefined);\n  const [invitedNickname, setInvitedNickname] = useState<string | undefined>(undefined);\n  const [alreadyRegistered, setAlreadyRegistered] = useState(false);\n  // A magic link for a client who has not finished. The session is pending, so there is nothing to claim.\n  const [pendingFinishEmail, setPendingFinishEmail] = useState<string | undefined>(undefined);\n  const isMountedRef = useRef(true);\n\n  useEffect(() => {\n    // Check for password reset token in URL\n    const urlParams = new URLSearchParams(window.location.search);\n    const token = urlParams.get(\"reset_password_token\");\n    if (token) {\n      handleResetTokenValidation(token).catch(() => undefined);\n    }\n\n    // The app sends the browser here when a magic link did not work.\n    if (urlParams.get(\"magic_link_error\")) {\n      removeQueryParam(\"magic_link_error\");\n      setMode(\"invalid-magic-link\");\n    }\n\n    // Check for magic link token in URL - will be handled separately\n    const magicLinkToken = urlParams.get(\"magic_link_token\");\n    if (magicLinkToken) {\n      handleMagicLinkVerification(magicLinkToken).catch(() => undefined);\n    }\n\n    const trainerResetTokenParam = urlParams.get(\"reset_password_token_trainer\");\n    if (trainerResetTokenParam) {\n      handleTrainerResetToken(trainerResetTokenParam).catch(() => undefined);\n    }\n\n    // Check for invite token in URL\n    const inviteTokenParam = urlParams.get(\"invite_token\");\n    const invitedEmailParam = urlParams.get(\"invited_email\");\n    if (inviteTokenParam) {\n      setInviteToken(inviteTokenParam);\n      if (invitedEmailParam) {\n        setInvitedEmail(invitedEmailParam);\n      }\n      handleInviteValidation(inviteTokenParam).catch(() => undefined);\n    }\n\n    return () => {\n      isMountedRef.current = false;\n    };\n  }, []);\n\n  const handleInviteValidation = async (token: string): Promise<void> => {\n    setIsLoading(true);\n    try {\n      const result = await props.service.validateInvite(token);\n      if (!isMountedRef.current) {\n        return;\n      }\n      if (result.valid) {\n        if (result.email) {\n          setInvitedEmail(result.email);\n        }\n        if (result.nickname) {\n          setInvitedNickname(result.nickname);\n        }\n        setMode(\"email-register\");\n      } else if (result.reason === \"already-registered\") {\n        setAlreadyRegistered(true);\n        setMode(\"email-login\");\n      } else {\n        setMode(\"invalid-invite\");\n      }\n    } catch (error) {\n      if (!isMountedRef.current) {\n        return;\n      }\n      setMode(\"invalid-invite\");\n    } finally {\n      if (isMountedRef.current) {\n        setIsLoading(false);\n      }\n    }\n  };\n\n  const showPendingFinish = (email: string): void => {\n    removeQueryParam(\"magic_link_token\");\n    if (!isMountedRef.current) {\n      return;\n    }\n    setPendingFinishEmail(email);\n    setInvitedEmail(email);\n    setMode(\"email-register\");\n    setIsLoading(false);\n  };\n\n  const handleResetTokenValidation = async (token: string): Promise<void> => {\n    setIsLoading(true);\n    try {\n      const result = await props.service.validateResetToken(token);\n      if (!isMountedRef.current) {\n        return;\n      }\n      if (result.valid) {\n        setResetToken(token);\n        setMode(\"reset-password\");\n      } else {\n        setMode(\"invalid-token\");\n      }\n    } catch (error) {\n      if (!isMountedRef.current) {\n        return;\n      }\n      setMode(\"invalid-token\");\n    } finally {\n      if (isMountedRef.current) {\n        setIsLoading(false);\n      }\n    }\n  };\n\n  const handleMagicLinkVerification = async (token: string): Promise<void> => {\n    setIsLoading(true);\n    try {\n      if (props.dispatch) {\n        await props.dispatch(\n          Thunk.verifyMagicLink(\n            token,\n            () => {\n              removeQueryParam(\"magic_link_token\");\n              if (props.redirectUrl) {\n                window.location.href = props.redirectUrl;\n                return;\n              }\n              if (!isMountedRef.current) {\n                return;\n              }\n              setMode(\"buttons\");\n              setIsLoading(false);\n            },\n            undefined,\n            showPendingFinish\n          )\n        );\n        return;\n      }\n\n      const result = await props.service.verifyMagicLink(token);\n      if (result.needsFinish) {\n        showPendingFinish(result.email);\n        return;\n      }\n      if (result.email) {\n        removeQueryParam(\"magic_link_token\");\n        if (props.redirectUrl) {\n          window.location.href = props.redirectUrl;\n        } else {\n          window.location.href = \"/app/\";\n        }\n        return;\n      }\n\n      removeQueryParam(\"magic_link_token\");\n      if (isMountedRef.current) {\n        setIsLoading(false);\n      }\n      alert(\"Magic link verification failed\");\n    } catch (error) {\n      removeQueryParam(\"magic_link_token\");\n      if (isMountedRef.current) {\n        setIsLoading(false);\n      }\n      alert(error instanceof Error ? error.message : \"Magic link verification failed\");\n    }\n  };\n\n  const handleTrainerResetToken = async (token: string): Promise<void> => {\n    setIsLoading(true);\n    try {\n      removeQueryParam(\"reset_password_token_trainer\");\n      if (!isMountedRef.current) {\n        return;\n      }\n      setTrainerResetToken(token);\n      setMode(\"trainer-reset-password\");\n    } catch (error) {\n      if (!isMountedRef.current) {\n        return;\n      }\n      setMode(\"trainer-invalid-token\");\n    } finally {\n      if (isMountedRef.current) {\n        setIsLoading(false);\n      }\n    }\n  };\n\n  // Render different forms based on mode\n  if (mode === \"email-login\") {\n    return (\n      <EmailLoginForm\n        initialEmail={prefillEmail}\n        notice={alreadyRegistered ? \"You already have an account. Sign in to continue.\" : undefined}\n        onLogin={async (email, password) => {\n          if (props.dispatch) {\n            props.dispatch(\n              Thunk.emailSignIn(email, password, () => {\n                if (props.redirectUrl) {\n                  window.location.href = props.redirectUrl;\n                } else {\n                  window.location.href = \"/app/\";\n                }\n              })\n            );\n          } else {\n            const result = await props.service.emailSignIn(email, password);\n            if (result.email) {\n              if (props.redirectUrl) {\n                window.location.href = props.redirectUrl;\n              } else {\n                window.location.href = \"/app/\";\n              }\n            } else {\n              throw new Error(\"Couldn't log in\");\n            }\n          }\n        }}\n        onForgotPassword={(email) => {\n          setPrefillEmail(email);\n          setMode(\"forgot-password\");\n        }}\n        onSendMagicLink={(email) => {\n          setPrefillEmail(email);\n          setMode(\"magic-link\");\n        }}\n        onBack={() => setMode(\"buttons\")}\n      />\n    );\n  }\n\n  if (mode === \"email-register\") {\n    if (!inviteToken && !pendingFinishEmail) {\n      return (\n        <div>\n          <h2 className=\"mb-4 text-lg font-bold text-center\">Invitation Required</h2>\n          <div className=\"p-4 mb-4 text-center bg-background-cardyellow border border-border-cardyellow rounded text-text-warning\">\n            <p className=\"mb-2\">You need an invitation from a trainer to sign up.</p>\n            <p className=\"text-sm\">Please contact your trainer to receive an invitation link.</p>\n          </div>\n          <div className=\"text-center\">\n            <Button name=\"back-to-login\" kind=\"grayv2\" onClick={() => setMode(\"buttons\")}>\n              Back\n            </Button>\n          </div>\n        </div>\n      );\n    }\n\n    return (\n      <EmailRegisterForm\n        inviteToken={inviteToken}\n        invitedEmail={invitedEmail}\n        invitedNickname={invitedNickname}\n        showTerms={true}\n        isClaimed={!!pendingFinishEmail}\n        onClaim={\n          inviteToken && !pendingFinishEmail\n            ? async () => {\n                await props.service.claimInvite(inviteToken);\n              }\n            : undefined\n        }\n        onRegister={async (email, password, nickname, termsAccepted) => {\n          if (props.dispatch) {\n            props.dispatch(Thunk.finishInvite(password, nickname, termsAccepted));\n          } else {\n            const result = await props.service.finishInvite(password, termsAccepted, nickname);\n            if (!result.email) {\n              throw new Error(\"Couldn't create account\");\n            }\n            // The finish gives a full session. A new client goes to the app with the wizard flag.\n            window.location.href = \"/app?startwizard=true\";\n          }\n        }}\n        onSignIn={() => setMode(\"email-login\")}\n        onBack={() => setMode(\"buttons\")}\n      />\n    );\n  }\n\n  if (mode === \"magic-link\") {\n    return (\n      <MagicLinkForm\n        initialEmail={prefillEmail}\n        onSendMagicLink={async (email) => {\n          await props.service.requestMagicLink(email);\n        }}\n        onPasswordLogin={(email) => {\n          setPrefillEmail(email);\n          setMode(\"email-login\");\n        }}\n        onBack={() => setMode(\"buttons\")}\n      />\n    );\n  }\n\n  if (mode === \"forgot-password\") {\n    return (\n      <ForgotPasswordForm\n        initialEmail={prefillEmail}\n        onSendResetLink={async (email) => {\n          await props.service.requestPasswordReset(email);\n        }}\n        onBackToLogin={() => setMode(\"email-login\")}\n      />\n    );\n  }\n\n  if (mode === \"reset-password\" && resetToken) {\n    return (\n      <ResetPasswordForm\n        token={resetToken}\n        onResetPassword={async (token, newPassword) => {\n          await props.service.resetPassword(token, newPassword);\n        }}\n        onSuccess={() => {\n          alert(\"Password reset successful! You can now sign in with your new password.\");\n          setMode(\"email-login\");\n        }}\n      />\n    );\n  }\n\n  if (mode === \"invalid-token\") {\n    return (\n      <div>\n        <h2 className=\"mb-4 text-lg font-bold text-center\">Expired Reset Link</h2>\n        <div className=\"p-4 mb-4 text-center bg-background-lighterror border border-border-error rounded text-text-error\">\n          <p>Your reset password link has expired, you will need to request a new link.</p>\n        </div>\n        <div className=\"text-center\">\n          <Button name=\"back-to-forgot-password\" kind=\"purple\" onClick={() => setMode(\"forgot-password\")}>\n            Request New Reset Link\n          </Button>\n        </div>\n      </div>\n    );\n  }\n\n  if (mode === \"invalid-magic-link\") {\n    return (\n      <div>\n        <h2 className=\"mb-4 text-lg font-bold text-center\">Sign-in Link Not Valid</h2>\n        <div className=\"p-4 mb-4 text-center bg-background-lighterror border border-border-error rounded text-text-error\">\n          <p>This sign-in link has expired or was already used. Request a new link to sign in.</p>\n        </div>\n        <div className=\"text-center\">\n          <Button name=\"back-to-login\" kind=\"purple\" onClick={() => setMode(\"buttons\")}>\n            Back to Sign In\n          </Button>\n        </div>\n      </div>\n    );\n  }\n\n  if (mode === \"invalid-invite\") {\n    return (\n      <div>\n        <h2 className=\"mb-4 text-lg font-bold text-center\">Invitation Not Valid</h2>\n        <div className=\"p-4 mb-4 text-center bg-background-lighterror border border-border-error rounded text-text-error\">\n          <p>This invitation is no longer valid. Contact your trainer for a new link.</p>\n        </div>\n        <div className=\"text-center\">\n          <Button name=\"back-to-login\" kind=\"grayv2\" onClick={() => setMode(\"buttons\")}>\n            Back\n          </Button>\n        </div>\n      </div>\n    );\n  }\n\n  if (mode === \"trainer-email-login\") {\n    return (\n      <TrainerEmailLoginForm\n        initialEmail={prefillEmail ?? trainerDefaultEmail}\n        onLogin={async (email, password) => {\n          const result = await props.service.trainerEmailSignIn(email, password);\n          if (result.email) {\n            if (props.redirectUrl) {\n              window.location.href = props.redirectUrl;\n            } else {\n              window.location.href = \"/trainer/\";\n            }\n          } else {\n            throw new Error(\"Couldn't log in\");\n          }\n        }}\n        onForgotPassword={(email) => {\n          setPrefillEmail(email);\n          setMode(\"trainer-forgot-password\");\n        }}\n        onSendMagicLink={async (email) => {\n          await props.service.trainerRequestMagicLink(email);\n        }}\n        onBack={() => setMode(\"buttons\")}\n      />\n    );\n  }\n\n  if (mode === \"trainer-email-register\") {\n    return (\n      <EmailRegisterForm\n        onRegister={async (email, password, nickname) => {\n          const result = await props.service.trainerEmailRegister(email, password, nickname);\n          if (result.email) {\n            if (props.redirectUrl) {\n              window.location.href = props.redirectUrl;\n            } else {\n              window.location.href = \"/trainer/\";\n            }\n          } else {\n            throw new Error(\"Couldn't create account\");\n          }\n        }}\n        onSignIn={() => setMode(\"trainer-email-login\")}\n        onBack={() => setMode(\"buttons\")}\n      />\n    );\n  }\n\n  if (mode === \"trainer-magic-link\") {\n    return (\n      <MagicLinkForm\n        initialEmail={prefillEmail ?? trainerDefaultEmail}\n        onSendMagicLink={async (email) => {\n          await props.service.trainerRequestMagicLink(email);\n        }}\n        onPasswordLogin={(email) => {\n          setPrefillEmail(email);\n          setMode(\"trainer-email-login\");\n        }}\n        onBack={() => setMode(\"buttons\")}\n        isTrainerLogin={true}\n      />\n    );\n  }\n\n  if (mode === \"trainer-forgot-password\") {\n    return (\n      <ForgotPasswordForm\n        initialEmail={prefillEmail}\n        onSendResetLink={async (email) => {\n          await props.service.trainerRequestPasswordReset(email);\n        }}\n        onBackToLogin={() => setMode(\"trainer-email-login\")}\n      />\n    );\n  }\n\n  if (mode === \"trainer-reset-password\" && trainerResetToken) {\n    return (\n      <ResetPasswordForm\n        token={trainerResetToken}\n        onResetPassword={async (tokenValue, newPassword) => {\n          await props.service.trainerResetPassword(tokenValue, newPassword);\n        }}\n        onSuccess={() => {\n          alert(\"Password reset successful! You can now sign in with your new password.\");\n          setTrainerResetToken(undefined);\n          setMode(\"trainer-email-login\");\n        }}\n      />\n    );\n  }\n\n  if (mode === \"trainer-invalid-token\") {\n    return (\n      <div>\n        <h2 className=\"mb-4 text-lg font-bold text-center\">Invalid Trainer Reset Link</h2>\n        <div className=\"p-4 mb-4 text-center bg-background-lighterror border border-border-error rounded text-text-error\">\n          <p className=\"mb-2\">This trainer password reset link is invalid or has expired.</p>\n          <p className=\"text-sm\">Password reset links expire after 1 hour.</p>\n        </div>\n        <div className=\"text-center\">\n          <Button\n            name=\"back-to-trainer-forgot-password\"\n            kind=\"purple\"\n            onClick={() => setMode(\"trainer-forgot-password\")}\n          >\n            Request New Reset Link\n          </Button>\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <div>\n      <h2 className=\"mb-4 text-lg font-bold text-center\">Account</h2>\n      {isLoading ? (\n        <div className=\"my-4 text-center\">\n          <IconSpinner width={48} height={48} />\n        </div>\n      ) : (\n        <div>\n          <div className=\"mb-6\">\n            <h3 className=\"text-sm font-semibold uppercase text-text-secondary\">Client Login</h3>\n            <button\n              className=\"flex items-center w-full px-4 py-2 mt-2 rounded-lg nm-sign-in-with-email\"\n              style={{ boxShadow: \"0 1px 4px 0 rgba(0,0,0,0.1)\" }}\n              data-cy=\"menu-item-email-login\"\n              onClick={() => {\n                setMode(\"magic-link\");\n              }}\n            >\n              <span className=\"flex-1\">Sign in with Email</span>\n            </button>\n          </div>\n          <div>\n            <h3 className=\"text-sm font-semibold uppercase text-text-secondary\">Trainer Login</h3>\n            <button\n              className=\"flex items-center w-full px-4 py-2 mt-2 rounded-lg nm-sign-in-with-email\"\n              style={{ boxShadow: \"0 1px 4px 0 rgba(0,0,0,0.1)\" }}\n              data-cy=\"menu-item-trainer-login\"\n              onClick={() => {\n                setMode(\"trainer-email-login\");\n              }}\n            >\n              <span className=\"flex-1\">Trainer Login</span>\n            </button>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n","import { Equipment } from \"@shared/models/equipment\";\nimport { PlannerProgram } from \"@client/pages/planner/models/plannerProgram\";\nimport {\n  IDayData,\n  IPercentage,\n  IPlannerProgram,\n  IPlannerProgramDay,\n  IPlannerProgramWeek,\n  ISettings,\n  IWeight,\n} from \"../types\";\nimport { n } from \"../utils/math\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { Weight } from \"./weight\";\nimport { PlannerProgramExercise } from \"@client/pages/planner/models/plannerProgramExercise\";\nimport {\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseEvaluatedSet,\n  IPlannerProgramExerciseEvaluatedSetVariation,\n  IPlannerProgramExercisePyramid,\n  IPlannerProgramExerciseWarmupSet,\n} from \"@client/pages/planner/models/types\";\nimport { IEvaluatedProgram, Program } from \"./program\";\nimport { Pyramid } from \"./pyramid\";\nimport { BlockLogging } from \"./blockLogging\";\nimport { Exercise } from \"./exercise\";\nimport { CollectionUtils } from \"../utils/collection\";\nimport { PP } from \"./pp\";\nimport { PlannerKey } from \"@client/pages/planner/plannerKey\";\nimport { IPlannerTopLineItem } from \"@client/pages/planner/plannerExerciseEvaluator\";\n\ninterface IPlannerToProgram2Globals {\n  weight?: IWeight | IPercentage;\n  rpe?: number;\n  timer?: number;\n  setTimer?: number;\n  setTimerRest?: number;\n  isOverflowSetTimer?: boolean;\n  logRpe?: boolean;\n  askWeight?: boolean;\n}\n\ntype IDereuseDecision = \"sets\" | \"weight\" | \"rpe\" | \"timer\" | \"progress\" | \"update\";\n\nexport interface IPlannerToProgramConvertOpts {\n  renameMapping?: Record<string, { to: string; dayData?: Required<IDayData> }>;\n  reorder?: { dayData: Required<IDayData>; fromIndex: number; toIndex: number }[];\n  add?: { dayData: Required<IDayData>; index: number; fullName: string }[];\n}\n\nexport class ProgramToPlanner {\n  constructor(\n    private readonly program: IEvaluatedProgram,\n    private readonly settings: ISettings\n  ) {}\n\n  private getCurrentDescriptionExercise(\n    key: string,\n    weekIndex: number,\n    dayInWeekIndex: number\n  ): IPlannerProgramExercise | undefined {\n    return this.program.weeks[weekIndex]?.days[dayInWeekIndex]?.exercises?.find((e) => e.key === key);\n  }\n\n  private getCurrentDescriptionIndex(key: string, weekIndex: number, dayInWeekIndex: number): number {\n    const exercise = this.getCurrentDescriptionExercise(key, weekIndex, dayInWeekIndex);\n    const descriptions = exercise?.descriptions.values || [];\n    const index = descriptions.findIndex((s) => s.isCurrent);\n    return index === -1 ? 0 : index;\n  }\n\n  private shouldReuseSets(programExercise: IPlannerProgramExercise): boolean {\n    return !!programExercise.reuse;\n  }\n\n  private getDereuseDecisions(programExercise: IPlannerProgramExercise): IDereuseDecision[] {\n    const dereuseDecisions: Set<IDereuseDecision> = new Set();\n    const reuseExercise = programExercise.reuse?.exercise;\n    if (!reuseExercise) {\n      return Array.from(dereuseDecisions);\n    }\n    const globals = this.getGlobals(programExercise);\n    const reusedGlobals = this.getGlobals(reuseExercise);\n    if (programExercise.evaluatedSetVariations.length !== reuseExercise.evaluatedSetVariations.length) {\n      dereuseDecisions.add(\"sets\");\n    }\n    if (\n      PlannerProgramExercise.currentEvaluatedSetVariationIndex(programExercise) !==\n      PlannerProgramExercise.currentEvaluatedSetVariationIndex(reuseExercise)\n    ) {\n      dereuseDecisions.add(\"sets\");\n    }\n    if (reuseExercise.progress != null || programExercise.progress != null) {\n      if (\n        programExercise.progress == null ||\n        programExercise.progress.type !== reuseExercise.progress?.type ||\n        (programExercise.progress.reuse\n          ? programExercise.progress.reuse?.fullName !== reuseExercise.fullName\n          : programExercise.progress.script !== reuseExercise.progress.script) ||\n        Object.keys(PlannerProgramExercise.getOnlyChangedState(programExercise)).length > 0\n      ) {\n        dereuseDecisions.add(\"progress\");\n      }\n    }\n    if (reuseExercise.update != null || programExercise.update != null) {\n      if (\n        programExercise.update == null ||\n        (programExercise.update.reuse\n          ? programExercise.update.reuse?.fullName !== reuseExercise.fullName\n          : programExercise.update.script !== reuseExercise.update?.script)\n      ) {\n        dereuseDecisions.add(\"update\");\n      }\n    }\n    if (programExercise.evaluatedSetVariations.length === reuseExercise.evaluatedSetVariations.length) {\n      for (let i = 0; i < programExercise.evaluatedSetVariations.length; i += 1) {\n        const programVariation = programExercise.evaluatedSetVariations[i];\n        const reuseVariation = reuseExercise.evaluatedSetVariations[i];\n        if (programVariation.sets.length !== reuseVariation.sets.length) {\n          dereuseDecisions.add(\"sets\");\n        }\n        for (let j = 0; j < programVariation.sets.length; j += 1) {\n          const programSet = programVariation.sets[j];\n          const reuseSet = reuseVariation.sets[j];\n          if (programSet.maxrep !== reuseSet?.maxrep || programSet.minrep !== reuseSet?.minrep) {\n            dereuseDecisions.add(\"sets\");\n          }\n          if (\n            reuseSet\n              ? !Weight.eqNull(programSet.weight, reuseSet.weight) || programSet.askWeight !== reuseSet.askWeight\n              : !Weight.eq(globals.weight || Weight.zero, reusedGlobals.weight || Weight.zero) ||\n                globals.askWeight !== reusedGlobals.askWeight\n          ) {\n            if (globals.weight != null) {\n              dereuseDecisions.add(\"weight\");\n            } else {\n              dereuseDecisions.add(\"sets\");\n            }\n          }\n          if (\n            reuseSet\n              ? programSet.rpe !== reuseSet.rpe || programSet.logRpe !== reuseSet.logRpe\n              : globals.rpe !== reusedGlobals.rpe || globals.logRpe !== reusedGlobals.logRpe\n          ) {\n            if (globals.rpe != null) {\n              dereuseDecisions.add(\"rpe\");\n            } else {\n              dereuseDecisions.add(\"sets\");\n            }\n          }\n          if (reuseSet ? programSet.timer !== reuseSet.timer : globals.timer !== reusedGlobals.timer) {\n            if (globals.timer != null) {\n              dereuseDecisions.add(\"timer\");\n            } else {\n              dereuseDecisions.add(\"sets\");\n            }\n          }\n          if (\n            programSet.setTimer !== reuseSet?.setTimer ||\n            !!programSet.isOverflowSetTimer !== !!reuseSet?.isOverflowSetTimer\n          ) {\n            dereuseDecisions.add(\"sets\");\n          }\n        }\n      }\n    }\n    return Array.from(dereuseDecisions);\n  }\n\n  private reorderGroupedTopLine(\n    groupedTopLine: IPlannerTopLineItem[][][][],\n    reorders: IPlannerToProgramConvertOpts[\"reorder\"]\n  ): IPlannerTopLineItem[][][][] {\n    if (!reorders) {\n      return groupedTopLine;\n    }\n    for (const reorder of reorders) {\n      const groupedDay = groupedTopLine[reorder.dayData.week - 1]?.[reorder.dayData.dayInWeek - 1];\n      if (groupedDay) {\n        const indexMap = groupedDay.reduce<{ result: Record<number, number>; i: number }>(\n          ({ result, i }, group, index) => {\n            const exercise = group.find((item) => item.type === \"exercise\");\n            if (exercise && !exercise.notused) {\n              result[i] = index;\n              i += 1;\n            }\n            return { result, i };\n          },\n          { result: {}, i: 0 }\n        ).result;\n        const from = groupedDay[indexMap[reorder.fromIndex]];\n        if (from) {\n          groupedDay.splice(indexMap[reorder.fromIndex], 1);\n          groupedDay.splice(indexMap[reorder.toIndex], 0, from);\n        }\n      }\n    }\n    return groupedTopLine;\n  }\n\n  private addGroupedTopLine(\n    groupedTopLine: IPlannerTopLineItem[][][][],\n    adds: IPlannerToProgramConvertOpts[\"add\"]\n  ): IPlannerTopLineItem[][][][] {\n    if (!adds) {\n      return groupedTopLine;\n    }\n    for (const add of adds) {\n      const groupedDay = groupedTopLine[add.dayData.week - 1]?.[add.dayData.dayInWeek - 1];\n      if (groupedDay) {\n        groupedDay.splice(add.index, 0, [\n          {\n            type: \"exercise\",\n            value: PlannerKey.fromFullName(\n              add.fullName,\n              this.settings.exercises,\n              Equipment.currentEquipment(this.settings)\n            ),\n          },\n        ]);\n      }\n    }\n    return groupedTopLine;\n  }\n\n  private getRenamedValue(\n    opts: IPlannerToProgramConvertOpts,\n    line: IPlannerTopLineItem,\n    weekIndex: number,\n    dayInWeekIndex: number\n  ): string {\n    const renamedValue = opts.renameMapping?.[line.value];\n    if (\n      renamedValue &&\n      (!renamedValue.dayData ||\n        (renamedValue.dayData.week === weekIndex + 1 && renamedValue.dayData.dayInWeek === dayInWeekIndex + 1))\n    ) {\n      return renamedValue.to;\n    } else {\n      return line.value;\n    }\n  }\n\n  private addExerciseDescriptions(\n    exercise: IPlannerProgramExercise | undefined,\n    weekIndex: number,\n    dayInWeekIndex: number,\n    addedCurrentDescription: boolean\n  ): { lines: string[]; addedCurrentDescription: boolean } | undefined {\n    if (!exercise) {\n      return undefined;\n    }\n    if (\n      exercise?.descriptions.reuse == null ||\n      !ObjectUtils.isEqual(\n        exercise.descriptions.values || [],\n        exercise.descriptions.reuse.exercise?.descriptions.values || []\n      )\n    ) {\n      const lines: string[] = [];\n      const currentIndex = this.getCurrentDescriptionIndex(exercise.key, weekIndex, dayInWeekIndex);\n      for (let i = 0; i < exercise.descriptions.values.length; i += 1) {\n        if (i > 0) {\n          lines.push(\"\");\n        }\n        const description = exercise.descriptions.values[i];\n        const parts = description.value.split(\"\\n\");\n        for (const part of parts) {\n          if (currentIndex !== 0 && currentIndex === i && !addedCurrentDescription) {\n            lines.push(`// ! ${part}`);\n            addedCurrentDescription = true;\n          } else {\n            lines.push(`// ${part}`);\n          }\n        }\n      }\n      return { lines, addedCurrentDescription };\n    } else if (exercise?.descriptions.reuse?.exercise) {\n      const reusedExercise = exercise.descriptions.reuse.exercise;\n      const reusedDayData = reusedExercise.dayData;\n      const currentWeekReusedExercisesCount = this.program.weeks[weekIndex]?.days.filter((day) => {\n        return day.exercises.some((e) => e.key === reusedExercise.key);\n      }).length;\n      if (currentWeekReusedExercisesCount === 1 && reusedDayData.week === weekIndex + 1) {\n        return { lines: [`// ...${reusedExercise.fullName}`], addedCurrentDescription };\n      } else {\n        return {\n          lines: [`// ...${reusedExercise.fullName}[${reusedDayData.week}:${reusedDayData.dayInWeek}]`],\n          addedCurrentDescription,\n        };\n      }\n    } else {\n      return undefined;\n    }\n  }\n\n  public convertToPlanner(opts: IPlannerToProgramConvertOpts = {}): IPlannerProgram {\n    const plannerWeeks: IPlannerProgramWeek[] = [];\n    const plannerProgram = this.program.planner;\n    if (this.program.errors.length > 0) {\n      const error = this.program.errors[0];\n      const msg = `There's an error during evaluating a program, week ${error.dayData.week}, day: ${error.dayData.dayInWeek}. Please fix it to proceed.\\n\\n${error.error.toString()}`;\n      if (typeof window !== \"undefined\" && window.alert != null) {\n        window.alert(msg);\n      }\n      throw error.error;\n    }\n    const topLineMap = PlannerProgram.topLineItems(plannerProgram, this.settings);\n    let groupedTopLineMap = PlannerProgram.groupedTopLines(topLineMap);\n    groupedTopLineMap = opts.reorder ? this.reorderGroupedTopLine(groupedTopLineMap, opts.reorder) : groupedTopLineMap;\n    groupedTopLineMap = opts.add ? this.addGroupedTopLine(groupedTopLineMap, opts.add) : groupedTopLineMap;\n    let dayIndex = 0;\n    const addedProgressMap: Record<string, boolean> = {};\n    const addedUpdateMap: Record<string, boolean> = {};\n    const addedWarmupsMap: Record<string, boolean> = {};\n    const addedIdMap: Record<string, boolean> = {};\n\n    for (let weekIndex = 0; weekIndex < this.program.weeks.length; weekIndex += 1) {\n      const week = this.program.weeks[weekIndex];\n      const plannerWeek: IPlannerProgramWeek = {\n        name: week.name,\n        days: [],\n        description: week.description,\n        notes: week.notes,\n        loop: week.loop,\n      };\n      for (let dayInWeekIndex = 0; dayInWeekIndex < week.days.length; dayInWeekIndex += 1) {\n        const programDay = week.days[dayInWeekIndex];\n        const plannerDay: IPlannerProgramDay = { name: programDay.name, exerciseText: \"\" };\n        let descriptionIndex: number | undefined = undefined;\n        let addedCurrentDescription = false;\n        let finishedToAddDescription = false;\n        const groupedTopLines = groupedTopLineMap[weekIndex][dayInWeekIndex];\n        let groupTextArr: string[] = [];\n        groupLoop: for (let groupIndex = 0; groupIndex < groupedTopLines.length; groupIndex += 1) {\n          const exerciseTextArr: string[] = [];\n          const group = groupedTopLines[groupIndex];\n          for (let lineIndex = 0; lineIndex < group.length; lineIndex += 1) {\n            const line = group[lineIndex];\n            switch (line.type) {\n              case \"comment\": {\n                exerciseTextArr.push(line.value);\n                break;\n              }\n              case \"description\": {\n                let key: string | undefined;\n                for (let i = lineIndex; i < group.length; i += 1) {\n                  if (group[i].type === \"exercise\") {\n                    key = this.getRenamedValue(opts, group[i], weekIndex, dayInWeekIndex);\n                    break;\n                  }\n                }\n                if (descriptionIndex == null) {\n                  descriptionIndex = 0;\n                }\n                if (finishedToAddDescription) {\n                  break;\n                }\n                if (key != null) {\n                  const exercise = this.getCurrentDescriptionExercise(key, weekIndex, dayInWeekIndex);\n                  const result = this.addExerciseDescriptions(\n                    exercise,\n                    weekIndex,\n                    dayInWeekIndex,\n                    addedCurrentDescription\n                  );\n                  if (result) {\n                    exerciseTextArr.push(...result.lines);\n                    addedCurrentDescription = result.addedCurrentDescription;\n                    finishedToAddDescription = true;\n                  } else {\n                    const currentIndex = this.getCurrentDescriptionIndex(key, weekIndex, dayInWeekIndex);\n                    if (currentIndex !== 0 && currentIndex === descriptionIndex && !addedCurrentDescription) {\n                      exerciseTextArr.push(line.value.replace(/^\\/\\/\\s*!?\\s*/, \"// ! \"));\n                      addedCurrentDescription = true;\n                    } else {\n                      exerciseTextArr.push(line.value.replace(/^(\\/\\/\\s*)!\\s*/, \"$1\"));\n                    }\n                  }\n                } else {\n                  exerciseTextArr.push(line.value.replace(/^(\\/\\/\\s*)!\\s*/, \"$1\"));\n                }\n                break;\n              }\n              case \"empty\": {\n                if (!finishedToAddDescription) {\n                  exerciseTextArr.push(\"\");\n                  if (descriptionIndex != null) {\n                    descriptionIndex += 1;\n                  }\n                }\n                break;\n              }\n              case \"exercise\": {\n                descriptionIndex = undefined;\n                const value = this.getRenamedValue(opts, line, weekIndex, dayInWeekIndex);\n                const evalExercise = Program.getProgramExercise(dayIndex + 1, this.program, value)!;\n\n                if (evalExercise == null) {\n                  continue groupLoop;\n                }\n\n                const key = evalExercise.key;\n\n                if (\n                  !finishedToAddDescription &&\n                  (evalExercise.descriptions.reuse || evalExercise.descriptions.values.length > 0)\n                ) {\n                  const result = this.addExerciseDescriptions(\n                    evalExercise,\n                    weekIndex,\n                    dayInWeekIndex,\n                    addedCurrentDescription\n                  );\n                  if (result) {\n                    exerciseTextArr.push(...result.lines);\n                  }\n                }\n\n                finishedToAddDescription = false;\n                addedCurrentDescription = false;\n\n                let plannerExercise = \"\";\n                plannerExercise += this.getExerciseName(evalExercise);\n                plannerExercise += \" / \";\n                if (evalExercise.notused) {\n                  plannerExercise += \"used: none / \";\n                }\n                const variations = evalExercise.evaluatedSetVariations;\n                const globals = this.getGlobals(evalExercise);\n\n                const shouldReuseSets = this.shouldReuseSets(evalExercise);\n                const dereuseDecisions = shouldReuseSets ? this.getDereuseDecisions(evalExercise) : [];\n                if (shouldReuseSets) {\n                  plannerExercise += this.reuseToStr(evalExercise);\n\n                  if (dereuseDecisions.includes(\"sets\")) {\n                    plannerExercise +=\n                      ` / ` +\n                      variations\n                        .map((v, i) => {\n                          return this.variationToString(v, globals, i, evalExercise);\n                        })\n                        .join(\" / \");\n                  }\n\n                  const overriddenGlobals: string[] = [];\n                  if (dereuseDecisions.includes(\"weight\") && globals.weight != null) {\n                    overriddenGlobals.push(`${this.weightExprToStr(globals.weight)}${globals.askWeight ? \"+\" : \"\"}`);\n                  }\n                  if (dereuseDecisions.includes(\"rpe\") && globals.rpe != null) {\n                    overriddenGlobals.push(`@${n(globals.rpe)}${globals.logRpe ? \"+\" : \"\"}`);\n                  }\n                  if (dereuseDecisions.includes(\"timer\") && globals.timer != null) {\n                    overriddenGlobals.push(`${n(globals.timer)}s`);\n                  }\n                  if (overriddenGlobals.length > 0) {\n                    plannerExercise += ` / ${overriddenGlobals.join(\" \")}`;\n                  }\n                } else {\n                  const pyramid = evalExercise.pyramid;\n                  if (pyramid != null && variations.length === 1 && Pyramid.matches(pyramid, variations[0].sets)) {\n                    plannerExercise += this.pyramidToStr(pyramid);\n                  } else if (evalExercise.setVariations.length > 0) {\n                    plannerExercise += variations\n                      .map((v, i) => this.variationToString(v, globals, i, evalExercise))\n                      .join(\" / \");\n                  }\n\n                  const globalsStr: string[] = [];\n                  if (globals.weight != null) {\n                    globalsStr.push(`${this.weightExprToStr(globals.weight)}${globals.askWeight ? \"+\" : \"\"}`);\n                  }\n                  if (globals.rpe != null) {\n                    globalsStr.push(`@${globals.rpe}${globals.logRpe ? \"+\" : \"\"}`);\n                  }\n                  if (globals.timer != null) {\n                    globalsStr.push(`${globals.timer}s`);\n                  }\n                  if (globals.setTimer != null) {\n                    globalsStr.push(this.globalSetTimerToStr(globals));\n                  }\n                  if (globalsStr.length > 0) {\n                    plannerExercise += ` / ${globalsStr.join(\" \")}`;\n                  }\n                }\n\n                if (!addedWarmupsMap[key] && evalExercise?.warmupSets) {\n                  const warmupSets = this.getWarmupSets(evalExercise);\n                  if (warmupSets != null) {\n                    plannerExercise += ` / warmup: ${warmupSets}`;\n                    addedWarmupsMap[key] = true;\n                  }\n                }\n\n                if (!addedIdMap[key] && (evalExercise.tags || []).length > 0) {\n                  plannerExercise += this.getId(evalExercise);\n                  addedIdMap[key] = true;\n                }\n\n                const superset = evalExercise.superset?.name;\n                if (superset) {\n                  plannerExercise += ` / superset: ${superset}`;\n                }\n\n                if (evalExercise.block) {\n                  plannerExercise += ` / block: ${BlockLogging.serialize(evalExercise.block.logging, evalExercise.block.name)}`;\n                }\n\n                const update = evalExercise.update;\n                if (\n                  !addedUpdateMap[key] &&\n                  update &&\n                  (update.reuse || update.script) &&\n                  (!evalExercise.reuse || dereuseDecisions.includes(\"update\"))\n                ) {\n                  const updateStr = ProgramToPlanner.getUpdate(evalExercise, this.settings);\n                  if (updateStr) {\n                    plannerExercise += ` / ${updateStr}`;\n                  }\n                  addedUpdateMap[key] = true;\n                }\n\n                const progress = evalExercise.progress;\n                if (progress && progress.type === \"none\") {\n                  plannerExercise += ` / progress: none`;\n                } else if (\n                  !addedProgressMap[key] &&\n                  progress &&\n                  (progress.reuse || progress.script) &&\n                  (!evalExercise.reuse || dereuseDecisions.includes(\"progress\"))\n                ) {\n                  const progressStr = ProgramToPlanner.getProgress(evalExercise, this.settings, false);\n                  if (progressStr) {\n                    plannerExercise += ` / ${progressStr}`;\n                  }\n                  addedProgressMap[key] = true;\n                }\n                exerciseTextArr.push(plannerExercise);\n                break;\n              }\n            }\n          }\n          if (exerciseTextArr.length > 0) {\n            groupTextArr = groupTextArr.concat(exerciseTextArr);\n          }\n        }\n        plannerDay.exerciseText = groupTextArr.join(\"\\n\");\n        plannerDay.description = programDay.description;\n        plannerDay.notes = programDay.notes;\n        plannerWeek.days.push(plannerDay);\n        dayIndex += 1;\n      }\n      plannerWeeks.push(plannerWeek);\n    }\n    const result: IPlannerProgram = { vtype: \"planner\", name: this.program.name, weeks: plannerWeeks };\n    const repeatingExercises = new Set<string>();\n    PP.iterate2(this.program.weeks, (exercise) => {\n      if (exercise.repeat != null && exercise.repeat.length > 0) {\n        const key = PlannerKey.fromPlannerExercise(exercise, this.settings);\n        repeatingExercises.add(key);\n      }\n    });\n    const newPlanner = PlannerProgram.compact(this.program.planner, result, this.settings, repeatingExercises);\n    return newPlanner;\n  }\n\n  private getExerciseName(programExercise: IPlannerProgramExercise): string {\n    if (programExercise.exerciseType) {\n      const exercise = Exercise.get(programExercise.exerciseType, this.settings.exercises);\n      let name = Exercise.fullName(exercise, this.settings, programExercise.label);\n      if (programExercise.order > 0) {\n        name = `${name}[${programExercise.order}]`;\n      }\n      return name;\n    } else {\n      return programExercise.fullName;\n    }\n  }\n\n  private reuseToStr(programExercise: IPlannerProgramExercise): string {\n    const reuseExercise = programExercise.reuse?.exercise;\n    if (!reuseExercise) {\n      throw new Error(\"reuse.exercise is required\");\n    }\n    const reuse = programExercise.reuse;\n    if (!reuse) {\n      throw new Error(\"reuse is required\");\n    }\n    let str = \"...\";\n    if (reuseExercise.exerciseType) {\n      const exercise = Exercise.get(reuseExercise.exerciseType, this.settings.exercises);\n      const reuseStr = Exercise.fullName(exercise, this.settings, reuseExercise.label);\n      str += reuseStr;\n    } else {\n      str += reuseExercise.fullName;\n    }\n    if (reuse.week || reuse.day) {\n      const weekAndDay = CollectionUtils.compact([reuse.week, reuse.day]).join(\":\");\n      str += `[${weekAndDay}]`;\n    }\n    return str;\n  }\n\n  public static getUpdate(programExercise: IPlannerProgramExercise, settings: ISettings, hideScript?: boolean): string {\n    const update = programExercise.update;\n    if (!update) {\n      return \"\";\n    }\n    if (update.reuse) {\n      if (update.reuse.exercise?.exerciseType) {\n        const exercise = Exercise.get(update.reuse.exercise.exerciseType, settings.exercises);\n        const fullName = Exercise.fullName(exercise, settings, update.reuse.exercise.label);\n        return `update: custom() { ...${fullName} }`;\n      } else {\n        return ` / update: custom() { ...${update.reuse.exercise?.fullName || update.reuse.fullName} }`;\n      }\n    } else {\n      return `update: custom() ${hideScript ? \"{~ ... ~}\" : update.script}`;\n    }\n  }\n\n  private getId(programExercise: IPlannerProgramExercise): string {\n    return ` / id: tags(${(programExercise.tags || []).join(\", \")})`;\n  }\n\n  public static getProgress(\n    programExercise: IPlannerProgramExercise,\n    settings: ISettings,\n    hideScript?: boolean\n  ): string {\n    const progress = programExercise.progress;\n    if (!progress) {\n      return \"\";\n    }\n    let progressStr = `progress: ${progress.type}`;\n    const state = PlannerProgramExercise.getState(programExercise);\n    const stateMetadata = PlannerProgramExercise.getStateMetadata(programExercise);\n    if (progress.type === \"custom\") {\n      const onlyChangedState = PlannerProgramExercise.getOnlyChangedState(programExercise);\n      progressStr += `(${ObjectUtils.entries(onlyChangedState)\n        .map(([k, v]) => {\n          return `${k}${stateMetadata[k]?.userPrompted ? \"+\" : \"\"}: ${Weight.print(v)}`;\n        })\n        .join(\", \")})`;\n    } else if (progress.type === \"lp\") {\n      const increment = state.increment as IWeight | IPercentage;\n      const successes = state.successes as number;\n      const successCounter = state.successCounter as number;\n      const decrement = state.decrement as IWeight | IPercentage;\n      const failures = state.failures as number;\n      const failureCounter = state.failureCounter as number;\n      const args: string[] = [];\n      args.push(Weight.print(increment));\n      if (successes > 1 || decrement.value > 0) {\n        args.push(`${successes}`);\n      }\n      if (successes > 1 || decrement.value > 0) {\n        args.push(`${successCounter}`);\n      }\n      if (decrement.value > 0) {\n        args.push(Weight.print(decrement));\n      }\n      if (failures > 1) {\n        args.push(`${failures}`);\n      }\n      if (failures > 1) {\n        args.push(`${failureCounter}`);\n      }\n      progressStr += `(${args.join(\", \")})`;\n    } else if (progress.type === \"dp\") {\n      const increment = state.increment as IWeight | IPercentage;\n      const minReps = state.minReps as number;\n      const maxReps = state.maxReps as number;\n      const args = [Weight.print(increment), `${minReps}`, `${maxReps}`];\n      progressStr += `(${args.join(\", \")})`;\n    } else if (progress.type === \"sum\") {\n      const reps = state.reps as number;\n      const increment = state.increment as IWeight | IPercentage;\n      const args = [`${reps}`, Weight.print(increment)];\n      progressStr += `(${args.join(\", \")})`;\n    }\n    if (progress.type === \"custom\") {\n      if (progress.reuse) {\n        if (progress.reuse.exercise?.exerciseType) {\n          const exercise = Exercise.get(progress.reuse.exercise.exerciseType, settings.exercises);\n          const fullName = Exercise.fullName(exercise, settings, progress.reuse.exercise.label);\n          progressStr += ` { ...${fullName} }`;\n        } else {\n          progressStr += ` { ...${progress.reuse.exercise?.fullName || progress.reuse.fullName} }`;\n        }\n      } else {\n        progressStr += hideScript ? ` {~ ... ~}` : ` ${progress.script}`;\n      }\n    }\n    return progressStr;\n  }\n\n  private globalSetTimerToStr(globals: IPlannerToProgram2Globals): string {\n    const workStr = `${n(Math.max(0, globals.setTimer ?? 0))}s${globals.isOverflowSetTimer ? \"+\" : \"\"}`;\n    const restStr = globals.setTimerRest != null ? `${n(Math.max(0, globals.setTimerRest))}s` : \"?\";\n    return `${workStr}|${restStr}`;\n  }\n\n  private getGlobals(exercise: IPlannerProgramExercise): IPlannerToProgram2Globals {\n    const variations = exercise.evaluatedSetVariations;\n    if (variations.length === 0 || variations[0].sets.length === 0) {\n      const globals = exercise.globals;\n      const reusedGlobals = exercise.reuse?.exercise?.globals || {};\n      return {\n        weight: globals?.weight ?? reusedGlobals.weight,\n        rpe: globals?.rpe ?? reusedGlobals.rpe,\n        timer: globals?.timer ?? reusedGlobals.timer,\n        ...this.getGlobalSetTimer(exercise),\n        logRpe: globals?.logRpe ?? reusedGlobals.logRpe,\n        askWeight: globals?.askWeight ?? reusedGlobals.askWeight,\n      };\n    }\n    const firstWeight = variations[0]?.sets[0]?.weight;\n    const firstRpe = variations[0]?.sets[0]?.rpe;\n    const firstLogRpe = !!variations[0]?.sets[0]?.logRpe;\n    const firstAskWeight = !!variations[0]?.sets[0]?.askWeight;\n    const firstTimer = variations[0]?.sets[0]?.timer;\n    const hasAnySetTimer = variations.some((v) => v.sets.some((s) => s.setTimer != null));\n    return {\n      weight:\n        firstWeight != null &&\n        variations.every((v) =>\n          v.sets.every((s) => Weight.eqNull(s.weight, firstWeight) && !!s.askWeight === firstAskWeight)\n        )\n          ? firstWeight\n          : undefined,\n      askWeight: variations.every((v) => v.sets.every((s) => Weight.eqNull(s.weight, firstWeight) && !!s.askWeight)),\n      rpe:\n        firstRpe != null &&\n        variations.every((v) => v.sets.every((s) => s.rpe === firstRpe && !!s.logRpe === firstLogRpe))\n          ? firstRpe\n          : undefined,\n      logRpe: variations.every((v) => v.sets.every((s) => s.rpe === firstRpe && !!s.logRpe)),\n      timer:\n        !hasAnySetTimer && firstTimer != null && variations.every((v) => v.sets.every((s) => s.timer === firstTimer))\n          ? firstTimer\n          : undefined,\n      ...(hasAnySetTimer ? this.getGlobalSetTimer(exercise, variations) : {}),\n    };\n  }\n\n  // A global `60s|0s` is written back as a global only when it was written as one and every set still has it.\n  private getGlobalSetTimer(\n    exercise: IPlannerProgramExercise,\n    variations?: IPlannerProgramExercise[\"evaluatedSetVariations\"]\n  ): Pick<IPlannerToProgram2Globals, \"setTimer\" | \"setTimerRest\" | \"isOverflowSetTimer\"> {\n    const source = exercise.globals?.setTimer != null ? exercise.globals : exercise.reuse?.exercise?.globals;\n    if (source?.setTimer == null) {\n      return {};\n    }\n    if (\n      variations != null &&\n      !variations.every((v) =>\n        v.sets.every(\n          (s) =>\n            s.setTimer === source.setTimer &&\n            s.timer === source.setTimerRest &&\n            !!s.isOverflowSetTimer === !!source.isOverflowSetTimer\n        )\n      )\n    ) {\n      return {};\n    }\n    return {\n      setTimer: source.setTimer,\n      setTimerRest: source.setTimerRest,\n      isOverflowSetTimer: source.isOverflowSetTimer,\n    };\n  }\n\n  private groupVariationSets(\n    sets: IPlannerProgramExerciseEvaluatedSet[],\n    exercise: IPlannerProgramExercise,\n    index: number\n  ): [IPlannerProgramExerciseEvaluatedSet, number][] {\n    if (sets.length === 0) {\n      const originalSets = PlannerProgramExercise.sets(exercise, index)[0];\n      return [\n        [\n          {\n            maxrep: originalSets?.repRange?.maxrep || 1,\n            minrep: originalSets?.repRange?.minrep,\n            weight: originalSets?.weight || Weight.zero,\n            logRpe: originalSets?.logRpe || false,\n            isAmrap: originalSets?.repRange?.isAmrap || false,\n            isQuickAddSet: originalSets?.repRange?.isQuickAddSet || false,\n            askWeight: originalSets?.askWeight || false,\n            rpe: originalSets?.rpe,\n            timer: originalSets?.timer,\n            setTimer: originalSets?.setTimer,\n            isOverflowSetTimer: originalSets?.isOverflowSetTimer,\n            label: originalSets?.label,\n          },\n          0,\n        ],\n      ];\n    }\n    let lastKey: string | undefined;\n    const groups: [IPlannerProgramExerciseEvaluatedSet, number][] = [];\n    for (const set of sets) {\n      const key = this.setToKey(set);\n      if (lastKey == null || lastKey !== key) {\n        groups.push([set, 0]);\n      }\n      groups[groups.length - 1][1] += 1;\n      lastKey = key;\n    }\n    return groups;\n  }\n\n  private groupWarmupsSets(sets: IPlannerProgramExerciseWarmupSet[]): [IPlannerProgramExerciseWarmupSet, number][] {\n    let lastKey: string | undefined;\n    const groups: [IPlannerProgramExerciseWarmupSet, number][] = [];\n    for (const set of sets) {\n      const key = this.warmupSetToKey(set);\n      if (lastKey == null || lastKey !== key) {\n        groups.push([set, 0]);\n      }\n      groups[groups.length - 1][1] += set.numberOfSets;\n      lastKey = key;\n    }\n    return groups;\n  }\n\n  private getWarmupSets(programExercise: IPlannerProgramExercise): string | undefined {\n    const warmupSets = programExercise.warmupSets;\n    if (warmupSets) {\n      const groups = this.groupWarmupsSets(warmupSets);\n      const strs: string[] = [];\n      for (const group of groups) {\n        const first = group[0];\n        const length = group[1];\n        const weight =\n          first.weight ?? (first.percentage != null ? Weight.buildPct(first.percentage) : Weight.build(0, \"lb\"));\n        const reps = first.minReps != null ? `${first.minReps}-${first.reps}` : `${first.reps}`;\n        strs.push(`${length}x${reps} ${Weight.print(weight)}`);\n      }\n      return strs.length === 0 ? \"none\" : strs.join(\", \");\n    }\n    return undefined;\n  }\n\n  private weightExprToStr(weightExpr?: IWeight | IPercentage): string {\n    if (weightExpr != null) {\n      return Weight.print(weightExpr);\n    }\n    return \"\";\n  }\n\n  private pyramidToStr(pyramid: IPlannerProgramExercisePyramid): string {\n    const args = [\n      `from: ${n(Math.max(0, pyramid.from))}s`,\n      `to: ${n(Math.max(0, pyramid.to))}s`,\n      `step: ${n(Math.max(0, pyramid.step))}s`,\n    ];\n    if (pyramid.rest != null) {\n      args.push(`rest: ${n(Math.max(0, pyramid.rest))}s`);\n    }\n    return `pyramid: ${pyramid.mode}(${args.join(\", \")})`;\n  }\n\n  private variationToString(\n    variation: IPlannerProgramExerciseEvaluatedSetVariation,\n    globals: IPlannerToProgram2Globals,\n    index: number,\n    exercise: IPlannerProgramExercise\n  ): string {\n    const groupedVariationSets = this.groupVariationSets(variation.sets, exercise, index);\n    const result: string[] = [];\n    for (const group of groupedVariationSets) {\n      const set = group[0];\n      let setStr = \"\";\n      setStr += `${group[1]}${set.isQuickAddSet ? \"+\" : \"\"}x`;\n      setStr += set.minrep != null ? `${n(Math.max(0, set.minrep))}-` : \"\";\n      setStr += `${n(Math.max(0, set.maxrep ?? 0))}`;\n      setStr += set.isAmrap ? \"+\" : \"\";\n      if (globals.weight == null) {\n        const weightValue = this.weightExprToStr(set.weight);\n        setStr += weightValue ? ` ${weightValue}${set.askWeight ? \"+\" : \"\"}` : \"\";\n      }\n      if (globals.rpe == null) {\n        setStr += set.rpe != null ? ` @${n(Math.max(0, set.rpe))}` : \"\";\n        setStr += set.rpe != null && set.logRpe ? \"+\" : \"\";\n      }\n      if (globals.timer == null && globals.setTimer == null) {\n        if (set.setTimer != null) {\n          const workStr = `${n(Math.max(0, set.setTimer))}s${set.isOverflowSetTimer ? \"+\" : \"\"}`;\n          const restStr = set.timer != null ? `${n(Math.max(0, set.timer))}s` : \"?\";\n          setStr += ` ${workStr}|${restStr}`;\n        } else {\n          setStr += set.timer ? ` ${n(Math.max(0, set.timer))}s` : \"\";\n        }\n      }\n      if (set.label) {\n        setStr += ` (${set.label})`;\n      }\n      if (set.isAuto) {\n        setStr += \" auto\";\n      }\n      result.push(setStr);\n    }\n    let resultStr = \"\";\n    if (index > 0 && variation.isCurrent) {\n      resultStr += \"! \";\n    }\n    return resultStr + result.map((r) => r.trim()).join(\", \");\n  }\n\n  private warmupSetToKey(set: IPlannerProgramExerciseWarmupSet): string {\n    return `${set.minReps}-${set.reps}-${Weight.print(set.weight || set.percentage || 0)}`;\n  }\n\n  private setToKey(set: IPlannerProgramExerciseEvaluatedSet): string {\n    return `${set.maxrep}-${set.minrep}-${Weight.printNull(set.weight)}-${set.isAmrap}-${set.rpe}-${set.logRpe}-${\n      set.timer\n    }-${set.setTimer}-${set.isOverflowSetTimer}-${set.label}-${set.askWeight}-${set.isAuto}`;\n  }\n}\n","import { IHistoryEntry, IHistoryRecord, ISet, ISettings } from \"../types\";\nimport { Progress } from \"./progress\";\nimport { Exercise } from \"./exercise\";\n\nexport type IBlockStep =\n  | { type: \"work\"; entryIndex: number; setIndex: number; round: number; durationSeconds?: number; isOverflow: boolean }\n  | {\n      type: \"break\";\n      afterEntryIndex: number;\n      afterSetIndex: number;\n      round: number;\n      durationSeconds: number;\n    };\n\n// A circuit name, or a run (`blockRun`). A run with `entryIndex` is a single-exercise run.\nexport type IBlockRef = string | { name: string; entryIndex?: number };\n\nexport type IBlockEvent =\n  | { type: \"closeSetTimer\"; entryIndex: number; setIndex: number; completedSetTimer: number; at: number }\n  | { type: \"autoAdvance\"; at: number }\n  | { type: \"blockEnded\"; at: number };\n\nexport type IBlockDuration =\n  | { type: \"constant\"; seconds?: number }\n  | { type: \"series\"; seconds: (number | undefined)[] };\n\nexport interface IBlockStation {\n  name: string;\n  work: IBlockDuration;\n  restSeconds: number;\n}\n\nexport interface IBlockSummary {\n  rounds: number;\n  stations: IBlockStation[];\n  totalSeconds: number;\n}\n\nexport interface IWorkoutPage {\n  entryIndexes: number[];\n}\n\nexport interface IDisableSupersetMember<TBlock> {\n  key: string;\n  fullName: string;\n  superset?: { name: string };\n  block?: TBlock;\n}\n\n// One step of a Disable Superset. `block` is \"keep\", \"clear\", or the block to set.\nexport interface IDisableSupersetChange<TBlock> {\n  key: string;\n  clearSuperset: boolean;\n  block: \"keep\" | \"clear\" | TBlock;\n}\n\nexport interface IDisableSupersetResult<TBlock> {\n  confirmText?: string;\n  changes: IDisableSupersetChange<TBlock>[];\n}\n\nexport namespace Block {\n  // `members` are the exercises of one superset group on one day (the exercise included).\n  // The changes come in this order: clear the old `block` holders, set the new holder, clear `superset`.\n  export function disableSuperset<TBlock>(\n    members: IDisableSupersetMember<TBlock>[],\n    key: string\n  ): IDisableSupersetResult<TBlock> {\n    const exercise = members.find((m) => m.key === key);\n    if (exercise == null) {\n      return { changes: [{ key, clearSuperset: true, block: \"clear\" }] };\n    }\n    if (exercise.superset == null) {\n      // A single block has no superset, so it stays.\n      return { changes: [{ key, clearSuperset: true, block: \"keep\" }] };\n    }\n    const remaining = members.filter((m) => m.key !== key);\n    const holder = members.find((m) => m.block != null);\n    const changes: IDisableSupersetChange<TBlock>[] = [];\n    let confirmText: string | undefined;\n    if (holder != null) {\n      confirmText = `Remove ${exercise.fullName} from the circuit ${exercise.superset.name}?`;\n      if (remaining.length < 2) {\n        confirmText += \" The circuit ends, because a circuit needs two exercises.\";\n      }\n    }\n    if (exercise.block != null) {\n      changes.push({ key, clearSuperset: false, block: \"clear\" });\n    }\n    if (remaining.length < 2) {\n      for (const sibling of remaining) {\n        if (sibling.block != null) {\n          changes.push({ key: sibling.key, clearSuperset: false, block: \"clear\" });\n        }\n      }\n    } else if (exercise.block != null) {\n      changes.push({ key: remaining[0].key, clearSuperset: false, block: exercise.block });\n    }\n    changes.push({ key, clearSuperset: true, block: exercise.block != null ? \"keep\" : \"clear\" });\n    return { confirmText, changes };\n  }\n\n  function getSingleEntryIndex(ref: IBlockRef): number | undefined {\n    return typeof ref === \"string\" ? undefined : ref.entryIndex;\n  }\n\n  export function getBlockMembers(\n    entries: IHistoryEntry[],\n    ref: IBlockRef\n  ): { entry: IHistoryEntry; entryIndex: number }[] {\n    const singleIndex = getSingleEntryIndex(ref);\n    if (singleIndex != null) {\n      const entry = entries[singleIndex];\n      return entry != null ? [{ entry, entryIndex: singleIndex }] : [];\n    }\n    const blockName = typeof ref === \"string\" ? ref : ref.name;\n    return entries\n      .map((entry, entryIndex) => ({ entry, entryIndex }))\n      .filter(({ entry }) => entry.superset === blockName);\n  }\n\n  // The timer sets of one exercise. Rep and weight sets are not steps. A set with no rest has no break step.\n  function getSingleSteps(entry: IHistoryEntry, entryIndex: number, settings: ISettings): IBlockStep[] {\n    const steps: IBlockStep[] = [];\n    for (const [setIndex, set] of entry.sets.entries()) {\n      if (set.setTimer == null) {\n        continue;\n      }\n      steps.push({\n        type: \"work\",\n        entryIndex,\n        setIndex,\n        round: setIndex + 1,\n        durationSeconds: set.setTimer,\n        isOverflow: !!set.isOverflowSetTimer,\n      });\n      const rest = set.timer ?? settings.timers.workout ?? 0;\n      if (rest > 0) {\n        steps.push({\n          type: \"break\",\n          afterEntryIndex: entryIndex,\n          afterSetIndex: setIndex,\n          round: setIndex + 1,\n          durationSeconds: rest,\n        });\n      }\n    }\n    return steps;\n  }\n\n  export function getSteps(entries: IHistoryEntry[], ref: IBlockRef, settings: ISettings): IBlockStep[] {\n    const members = getBlockMembers(entries, ref);\n    if (getSingleEntryIndex(ref) != null) {\n      return members.length > 0 ? getSingleSteps(members[0].entry, members[0].entryIndex, settings) : [];\n    }\n    if (members.length < 2) {\n      return [];\n    }\n\n    const roundsCount = Math.max(...members.map(({ entry }) => entry.sets.length));\n    const steps: IBlockStep[] = [];\n    for (let roundIndex = 0; roundIndex < roundsCount; roundIndex += 1) {\n      for (const { entry, entryIndex } of members) {\n        const set = entry.sets[roundIndex];\n        if (set == null) {\n          continue;\n        }\n        steps.push({\n          type: \"work\",\n          entryIndex,\n          setIndex: roundIndex,\n          round: roundIndex + 1,\n          durationSeconds: set.setTimer,\n          isOverflow: !!set.isOverflowSetTimer,\n        });\n        steps.push({\n          type: \"break\",\n          afterEntryIndex: entryIndex,\n          afterSetIndex: roundIndex,\n          round: roundIndex + 1,\n          durationSeconds: resolveBreakDuration(set, settings),\n        });\n      }\n    }\n\n    return steps;\n  }\n\n  function isStepSetDone(entries: IHistoryEntry[], step: IBlockStep): boolean {\n    const entryIndex = step.type === \"work\" ? step.entryIndex : step.afterEntryIndex;\n    const setIndex = step.type === \"work\" ? step.setIndex : step.afterSetIndex;\n    return !!entries[entryIndex]?.sets[setIndex]?.isCompleted;\n  }\n\n  // Where a run starts: the first work step whose set is not done.\n  export function firstNotDoneStep(steps: IBlockStep[], entries: IHistoryEntry[]): number | undefined {\n    const index = steps.findIndex((step) => step.type === \"work\" && !isStepSetDone(entries, step));\n    return index === -1 ? undefined : index;\n  }\n\n  // The step index after `index`. A work step whose set is done, with its break, is passed over. A break\n  // after a work step that is not passed over is kept, also when its set is done (the rest after the work).\n  export function nextStep(steps: IBlockStep[], entries: IHistoryEntry[], index: number): number | undefined {\n    const passedOver = new Set<string>();\n    for (let i = index + 1; i < steps.length; i += 1) {\n      const step = steps[i];\n      if (step.type === \"work\") {\n        if (isStepSetDone(entries, step)) {\n          passedOver.add(`${step.entryIndex}:${step.setIndex}`);\n          continue;\n        }\n        return i;\n      }\n      if (!passedOver.has(`${step.afterEntryIndex}:${step.afterSetIndex}`)) {\n        return i;\n      }\n    }\n    return undefined;\n  }\n\n  // The work step after the rest (or work) of the set `entryIndex`/`setIndex`, in the current run.\n  export function getNextRunTarget(\n    progress: IHistoryRecord,\n    entryIndex: number,\n    setIndex: number,\n    settings: ISettings\n  ): { entryIndex: number; setIndex: number } | undefined {\n    const blockRun = progress.blockRun;\n    if (!blockRun) {\n      return undefined;\n    }\n    const steps = getSteps(progress.entries, blockRun, settings);\n    let current = -1;\n    for (const [i, step] of steps.entries()) {\n      const isThisSet =\n        step.type === \"work\"\n          ? step.entryIndex === entryIndex && step.setIndex === setIndex\n          : step.afterEntryIndex === entryIndex && step.afterSetIndex === setIndex;\n      if (isThisSet) {\n        current = i;\n      }\n    }\n    if (current === -1) {\n      return undefined;\n    }\n    let next = nextStep(steps, progress.entries, current);\n    while (next != null && steps[next].type === \"break\") {\n      next = nextStep(steps, progress.entries, next);\n    }\n    const target = next != null ? steps[next] : undefined;\n    return target?.type === \"work\" ? { entryIndex: target.entryIndex, setIndex: target.setIndex } : undefined;\n  }\n\n  // Mirrors Progress.startTimer's rest resolution (progress.ts:447-454), minus the two\n  // divergences the spec accepts: no `isCurrent` gate, and `workout` is hard-coded as the mode.\n  function resolveBreakDuration(set: ISet, settings: ISettings): number {\n    if (set.timer != null) {\n      return set.timer;\n    }\n    if (settings.timers.superset != null) {\n      return settings.timers.superset;\n    }\n    return settings.timers.workout || 0;\n  }\n\n  export function nextDueEvent(progress: IHistoryRecord, now: number, settings: ISettings): IBlockEvent | undefined {\n    const blockRun = progress.blockRun;\n    if (!blockRun || blockRun.isPaused) {\n      return undefined;\n    }\n\n    const { setTimerSince, setTimerEntryIndex, setTimerSetIndex } = progress;\n    if (setTimerSince != null && setTimerEntryIndex != null && setTimerSetIndex != null) {\n      const set = progress.entries[setTimerEntryIndex]?.sets[setTimerSetIndex];\n      if (set?.isOverflowSetTimer) {\n        // Time spent past an overflow step cannot be attributed; recovery stops here.\n        return undefined;\n      }\n      if (set?.setTimer != null) {\n        const at = setTimerSince + set.setTimer * 1000;\n        if (at <= now) {\n          return {\n            type: \"closeSetTimer\",\n            entryIndex: setTimerEntryIndex,\n            setIndex: setTimerSetIndex,\n            completedSetTimer: set.setTimer,\n            at,\n          };\n        }\n        return undefined;\n      }\n    }\n\n    const { timer, timerSince, timerMode, timerEntryIndex, timerSetIndex } = progress;\n    if (timer != null && timerSince != null && timerMode != null && timerEntryIndex != null && timerSetIndex != null) {\n      const at = timerSince + timer * 1000;\n      if (at < now) {\n        const target = Progress.shouldAutoAdvance(progress, now, settings);\n        if (target != null) {\n          return { type: \"autoAdvance\", at };\n        }\n        const entry = progress.entries[timerEntryIndex];\n        const set = timerMode === \"warmup\" ? entry?.warmupSets[timerSetIndex] : entry?.sets[timerSetIndex];\n        // A single-exercise run needs no `superset`, `isAuto` or `block` on the entry.\n        const isBlockRest =\n          blockRun.entryIndex != null\n            ? timerMode === \"workout\" && timerEntryIndex === blockRun.entryIndex\n            : entry?.superset === blockRun.name && (!!set?.isAuto || entry?.block != null);\n        if (isBlockRest) {\n          return { type: \"blockEnded\", at };\n        }\n      }\n    }\n\n    return undefined;\n  }\n\n  export function getCurrentStep(progress: IHistoryRecord, settings: ISettings): IBlockStep | undefined {\n    const blockRun = progress.blockRun;\n    if (!blockRun) {\n      return undefined;\n    }\n    const steps = getSteps(progress.entries, blockRun, settings);\n    const { setTimerEntryIndex, setTimerSetIndex, timerEntryIndex, timerSetIndex, timerMode } = progress;\n    if (setTimerEntryIndex != null && setTimerSetIndex != null) {\n      return steps.find(\n        (step) => step.type === \"work\" && step.entryIndex === setTimerEntryIndex && step.setIndex === setTimerSetIndex\n      );\n    }\n    if (timerEntryIndex != null && timerSetIndex != null && timerMode === \"workout\") {\n      return steps.find(\n        (step) =>\n          step.type === \"break\" && step.afterEntryIndex === timerEntryIndex && step.afterSetIndex === timerSetIndex\n      );\n    }\n    return undefined;\n  }\n\n  export function getSummary(entries: IHistoryEntry[], ref: IBlockRef, settings: ISettings): IBlockSummary {\n    const members = getBlockMembers(entries, ref);\n    const steps = getSteps(entries, ref, settings);\n    const rounds =\n      getSingleEntryIndex(ref) != null\n        ? steps.filter((step) => step.type === \"work\").length\n        : members.length > 0\n          ? Math.max(...members.map(({ entry }) => entry.sets.length))\n          : 0;\n\n    const stations: IBlockStation[] = members.map(({ entry, entryIndex }) => {\n      const workDurations = steps\n        .filter(\n          (step): step is Extract<IBlockStep, { type: \"work\" }> =>\n            step.type === \"work\" && step.entryIndex === entryIndex\n        )\n        .map((step) => step.durationSeconds);\n      const isConstant = workDurations.every((seconds) => seconds === workDurations[0]);\n      const work: IBlockDuration = isConstant\n        ? { type: \"constant\", seconds: workDurations[0] }\n        : { type: \"series\", seconds: workDurations };\n      const firstBreak = steps.find(\n        (step): step is Extract<IBlockStep, { type: \"break\" }> =>\n          step.type === \"break\" && step.afterEntryIndex === entryIndex\n      );\n      const exercise = Exercise.get(entry.exercise, settings.exercises);\n      return {\n        name: Exercise.fullName(exercise, settings),\n        work,\n        restSeconds: firstBreak?.durationSeconds ?? 0,\n      };\n    });\n\n    const totalSeconds = steps.reduce((sum, step) => sum + (step.durationSeconds ?? 0), 0);\n\n    return { rounds, stations, totalSeconds };\n  }\n\n  function isBlockMember(entry: IHistoryEntry): entry is IHistoryEntry & { superset: string } {\n    return entry.block != null && entry.superset != null;\n  }\n\n  export function getWorkoutPages(entries: IHistoryEntry[], isPlayground: boolean): IWorkoutPage[] {\n    if (isPlayground) {\n      return entries.map((_, entryIndex) => ({ entryIndexes: [entryIndex] }));\n    }\n\n    const pages: IWorkoutPage[] = [];\n    const emittedBlocks = new Set<string>();\n    for (const [entryIndex, entry] of entries.entries()) {\n      if (isBlockMember(entry)) {\n        const memberIndexes = entries\n          .map((e, i) => ({ e, i }))\n          .filter(({ e }) => isBlockMember(e) && e.superset === entry.superset)\n          .map(({ i }) => i);\n        if (memberIndexes.length < 2) {\n          // Not a working block (getSteps agrees); render it as its own page.\n          pages.push({ entryIndexes: [entryIndex] });\n          continue;\n        }\n        if (emittedBlocks.has(entry.superset)) {\n          continue;\n        }\n        emittedBlocks.add(entry.superset);\n        pages.push({ entryIndexes: memberIndexes });\n      } else {\n        pages.push({ entryIndexes: [entryIndex] });\n      }\n    }\n    return pages;\n  }\n\n  export function pageToEntryIndex(pages: IWorkoutPage[], page: number): number {\n    return pages[page]?.entryIndexes[0] ?? 0;\n  }\n\n  export function entryIndexToPage(pages: IWorkoutPage[], entryIndex: number): number {\n    const page = pages.findIndex((p) => p.entryIndexes.includes(entryIndex));\n    return page === -1 ? 0 : page;\n  }\n}\n","\"use strict\";\n/**\n * The `FromEither` type class represents those data types which support errors.\n *\n * @since 2.10.0\n */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    var desc = Object.getOwnPropertyDescriptor(m, k);\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n    }\n    Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n    __setModuleDefault(result, mod);\n    return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromOption = fromOption;\nexports.fromPredicate = fromPredicate;\nexports.fromOptionK = fromOptionK;\nexports.chainOptionK = chainOptionK;\nexports.fromEitherK = fromEitherK;\nexports.chainEitherK = chainEitherK;\nexports.chainFirstEitherK = chainFirstEitherK;\nexports.filterOrElse = filterOrElse;\nexports.tapEither = tapEither;\nvar Chain_1 = require(\"./Chain\");\nvar function_1 = require(\"./function\");\nvar _ = __importStar(require(\"./internal\"));\nfunction fromOption(F) {\n    return function (onNone) { return function (ma) { return F.fromEither(_.isNone(ma) ? _.left(onNone()) : _.right(ma.value)); }; };\n}\nfunction fromPredicate(F) {\n    return function (predicate, onFalse) {\n        return function (a) {\n            return F.fromEither(predicate(a) ? _.right(a) : _.left(onFalse(a)));\n        };\n    };\n}\nfunction fromOptionK(F) {\n    var fromOptionF = fromOption(F);\n    return function (onNone) {\n        var from = fromOptionF(onNone);\n        return function (f) { return (0, function_1.flow)(f, from); };\n    };\n}\nfunction chainOptionK(F, M) {\n    var fromOptionKF = fromOptionK(F);\n    return function (onNone) {\n        var from = fromOptionKF(onNone);\n        return function (f) { return function (ma) { return M.chain(ma, from(f)); }; };\n    };\n}\nfunction fromEitherK(F) {\n    return function (f) { return (0, function_1.flow)(f, F.fromEither); };\n}\nfunction chainEitherK(F, M) {\n    var fromEitherKF = fromEitherK(F);\n    return function (f) { return function (ma) { return M.chain(ma, fromEitherKF(f)); }; };\n}\nfunction chainFirstEitherK(F, M) {\n    var tapEitherM = tapEither(F, M);\n    return function (f) { return function (ma) { return tapEitherM(ma, f); }; };\n}\nfunction filterOrElse(F, M) {\n    return function (predicate, onFalse) {\n        return function (ma) {\n            return M.chain(ma, function (a) { return F.fromEither(predicate(a) ? _.right(a) : _.left(onFalse(a))); });\n        };\n    };\n}\n/** @internal */\nfunction tapEither(F, M) {\n    var fromEither = fromEitherK(F);\n    var tapM = (0, Chain_1.tap)(M);\n    return function (self, f) { return tapM(self, fromEither(f)); };\n}\n","import { Equipment } from \"@shared/models/equipment\";\n// import util from \"util\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { Exercise, equipmentName } from \"@shared/models/exercise\";\nimport { CollectionUtils } from \"@shared/utils/collection\";\nimport { parser as plannerExerciseParser } from \"./plannerExerciseParser\";\nimport { IEither } from \"@shared/utils/types\";\nimport {\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseRepRange,\n  IPlannerProgramExerciseSet,\n  IPlannerProgramExerciseSetVariation,\n  IPlannerProgramProperty,\n  IPlannerProgramReuse,\n  IPlannerProgramExerciseWarmupSet,\n  IProgramExerciseProgress,\n  IProgramExerciseUpdate,\n  IProgramExerciseProgressType,\n  IPlannerProgramExerciseSuperset,\n  IPlannerProgramExerciseBlock,\n  IPlannerProgramExercisePyramid,\n  IPlannerProgramExercisePyramidMode,\n  IBlockName,\n} from \"./models/types\";\nimport {\n  IWeight,\n  IProgramState,\n  IDayData,\n  ISettings,\n  IExerciseType,\n  IUnit,\n  IProgramStateMetadata,\n  IAllCustomExercises,\n  IAllEquipment,\n} from \"@shared/types\";\nimport * as W from \"@shared/models/weight\";\nimport { PlannerNodeName } from \"./plannerExerciseStyles\";\nimport {\n  fullTextLineToWeekdayDescription,\n  parseWeekHeading,\n  IPlannerNonExerciseFullTextLine,\n  splitWeekDayOngoingLines,\n} from \"./plannerExerciseEvaluatorText\";\nimport { ScriptRunner } from \"@shared/parser\";\nimport { Progress } from \"@shared/models/progress\";\nimport { LiftoscriptSyntaxError, LiftoscriptEvaluator } from \"@shared/liftoscriptEvaluator\";\nimport { Weight } from \"@shared/models/weight\";\nimport { MathUtils } from \"@shared/utils/math\";\nimport { PlannerKey } from \"./plannerKey\";\nimport { UidFactory } from \"@shared/utils/generator\";\nimport { ObjectUtils } from \"@shared/utils/object\";\nimport { PlannerProgramExercise } from \"./models/plannerProgramExercise\";\nimport { IPyramidArgument, Pyramid } from \"@shared/models/pyramid\";\nimport { BlockLogging, IBlockLoggingArg } from \"@shared/models/blockLogging\";\nimport memoize from \"micro-memoize\";\n\nexport interface IPlannerTopLineItem {\n  type: \"exercise\" | \"comment\" | \"description\" | \"empty\";\n  value: string;\n  exerciseIndex?: number;\n  notused?: boolean;\n  order?: number;\n  fullName?: string;\n  repeat?: number[];\n  repeatRanges?: string[];\n  descriptions?: string[];\n  sections?: string;\n  sectionsToReuse?: string;\n  used?: boolean;\n}\n\nexport type IPlannerSyntaxPointer = { line: number; offset: number; from: number; to: number };\n\nexport class PlannerSyntaxError extends SyntaxError {\n  public readonly line: number;\n  public readonly offset: number;\n  public readonly from: number;\n  public readonly to: number;\n\n  public static fromPoint(\n    fullName: string | undefined,\n    message: string,\n    point: IPlannerSyntaxPointer\n  ): PlannerSyntaxError {\n    return new PlannerSyntaxError(\n      `${fullName ? `${fullName}: ` : \"\"}${message} (${point.line}:${point.offset})`,\n      point.line,\n      point.offset,\n      point.from,\n      point.to\n    );\n  }\n\n  constructor(message: string, line: number, offset: number, from: number, to: number) {\n    super(message);\n    this.line = line;\n    this.offset = offset;\n    this.from = from;\n    this.to = to;\n  }\n\n  public toString(): string {\n    return this.message;\n  }\n}\n\nexport type IPlannerEvalResult = IEither<IPlannerProgramExercise[], PlannerSyntaxError>;\nexport type IPlannerEvalFullResult = IEither<IPlannerExerciseEvaluatorWeek[], PlannerSyntaxError>;\n\nfunction getChildren(node: SyntaxNode): SyntaxNode[] {\n  const cur = node.cursor();\n  const result: SyntaxNode[] = [];\n  if (!cur.firstChild()) {\n    return result;\n  }\n  do {\n    result.push(cur.node);\n  } while (cur.nextSibling());\n  return result;\n}\n\nfunction assert(name: string): never {\n  throw new PlannerSyntaxError(`Missing required nodes for ${name}, this should never happen`, 0, 0, 0, 1);\n}\n\nexport interface IPlannerExerciseEvaluatorWeek {\n  name: string;\n  loop?: \"start\";\n  line: number;\n  description?: string;\n  days: { name: string; line: number; description?: string; exercises: IPlannerProgramExercise[] }[];\n}\n\ntype IPlannerExerciseEvaluatorMode = \"perday\" | \"full\" | \"onset\";\n\nexport class PlannerExerciseEvaluator {\n  private readonly script: string;\n  private readonly mode: IPlannerExerciseEvaluatorMode;\n  private dayData: Required<IDayData>;\n  private readonly settings: ISettings;\n  private weeks: IPlannerExerciseEvaluatorWeek[] = [];\n  private exerciseIndex: number = 0;\n\n  private latestDescriptions: string[][] = [];\n  private ongoingLines: IPlannerNonExerciseFullTextLine[] = [];\n\n  constructor(script: string, settings: ISettings, mode: IPlannerExerciseEvaluatorMode, dayData?: Required<IDayData>) {\n    this.script = script;\n    this.settings = settings;\n    this.dayData = dayData || { day: 1, week: 1, dayInWeek: 1 };\n    this.mode = mode;\n  }\n\n  private getValue(node: SyntaxNode): string {\n    return this.getValueTrim(node).replace(/\\n/g, \"\\\\n\").replace(/\\t/g, \"\\\\t\");\n  }\n\n  private getValueTrim(node: SyntaxNode): string {\n    return this.script.slice(node.from, node.to);\n  }\n\n  public static applyChangesToScript(script: string, ranges: [number, number, string][]): string {\n    let offset = 0;\n    while (ranges.length > 0) {\n      const [from, to, replacement] = ranges.shift()!;\n      script = script.slice(0, from + offset) + replacement + script.slice(to + offset);\n      offset += replacement.length - (to - from);\n    }\n    return script;\n  }\n\n  public static isEqualProperty(a: IPlannerProgramProperty, b: IPlannerProgramProperty): boolean {\n    return a.fnName === b.fnName && a.fnArgs.join() === b.fnArgs.join() && a.script === b.script && a.body === b.body;\n  }\n\n  public static isEqualProgress(a: IProgramExerciseProgress, b: IProgramExerciseProgress): boolean {\n    const pickA = {\n      ...ObjectUtils.pick(a, [\"type\", \"state\", \"stateMetadata\", \"script\"]),\n      reuse: a.reuse?.fullName,\n    };\n    const pickB = {\n      ...ObjectUtils.pick(b, [\"type\", \"state\", \"stateMetadata\", \"script\"]),\n      reuse: b.reuse?.fullName,\n    };\n    return ObjectUtils.isEqual(pickA, pickB);\n  }\n\n  public static isEqualUpdate(a: IProgramExerciseUpdate, b: IProgramExerciseUpdate): boolean {\n    const pickA = { ...ObjectUtils.pick(a, [\"type\", \"script\"]), reuse: a.reuse?.fullName };\n    const pickB = { ...ObjectUtils.pick(b, [\"type\", \"script\"]), reuse: b.reuse?.fullName };\n    return ObjectUtils.isEqual(pickA, pickB);\n  }\n\n  private getPoint(node: SyntaxNode): IPlannerSyntaxPointer {\n    const [line, offset] = this.getLineAndOffset(node);\n    return { line, offset, from: node.from, to: node.to };\n  }\n\n  private error(message: string, node: SyntaxNode): never {\n    const point = this.getPoint(node);\n    throw PlannerSyntaxError.fromPoint(undefined, message, point);\n  }\n\n  private checkNoTimerArguments(argNodes: SyntaxNode[]): void {\n    for (const argNode of argNodes) {\n      const timerNode = argNode.getChild(PlannerNodeName.KeyValue)?.getChild(PlannerNodeName.Timer);\n      if (timerNode != null) {\n        this.error(`A duration like \"${this.getValue(timerNode)}\" is not allowed here`, argNode);\n      }\n    }\n  }\n\n  private checkNoKeywordArguments(argNodes: SyntaxNode[]): void {\n    for (const argNode of argNodes) {\n      const bareKeywordNode = argNode.getChild(PlannerNodeName.Keyword);\n      if (bareKeywordNode != null) {\n        this.error(`\"${this.getValue(bareKeywordNode)}\" is not allowed here`, argNode);\n      }\n      const keyValueNode = argNode.getChild(PlannerNodeName.KeyValue);\n      const keyValueValueKeywordNode = keyValueNode?.getChildren(PlannerNodeName.Keyword)[1];\n      if (keyValueValueKeywordNode != null) {\n        this.error(`\"${this.getValue(keyValueValueKeywordNode)}\" is not allowed here`, argNode);\n      }\n      const keyValueValueNoneNode = keyValueNode?.getChild(PlannerNodeName.None);\n      if (keyValueValueNoneNode != null) {\n        this.error(`\"${this.getValue(keyValueValueNoneNode)}\" is not allowed here`, argNode);\n      }\n    }\n  }\n\n  public static getLineAndOffset(script: string, node: SyntaxNode): [number, number] {\n    const linesLengths = script.split(\"\\n\").map((l) => l.length + 1);\n    let offset = 0;\n    for (let i = 0; i < linesLengths.length; i++) {\n      const lineLength = linesLengths[i];\n      if (node.from >= offset && node.from < offset + lineLength) {\n        return [i + 1, node.from - offset];\n      }\n      offset += lineLength;\n    }\n    return [linesLengths.length, linesLengths[linesLengths.length - 1]];\n  }\n\n  private getLineAndOffset(node: SyntaxNode): [number, number] {\n    return PlannerExerciseEvaluator.getLineAndOffset(this.script, node);\n  }\n\n  public parse(expr: SyntaxNode): void {\n    const cursor = expr.cursor();\n    do {\n      if (cursor.node.type.isError) {\n        this.error(\"Syntax error\", cursor.node);\n      }\n    } while (cursor.next());\n  }\n\n  private getWarmupReps(setParts: string): { numberOfSets: number; reps: number; minReps?: number } {\n    let [numberOfSetsStr, repsStr] = setParts.split(\"x\", 2);\n    if (!numberOfSetsStr) {\n      return { numberOfSets: 1, reps: 1 };\n    }\n    if (!repsStr) {\n      repsStr = numberOfSetsStr;\n      numberOfSetsStr = \"1\";\n    }\n    const [minRepsStr, maxRepsStr] = repsStr.split(\"-\", 2);\n    return {\n      reps: parseInt(maxRepsStr ?? minRepsStr, 10),\n      minReps: maxRepsStr != null ? parseInt(minRepsStr, 10) : undefined,\n      numberOfSets: parseInt(numberOfSetsStr, 10),\n    };\n  }\n\n  private getRepRange(setParts: string): IPlannerProgramExerciseRepRange | undefined {\n    if (!setParts) {\n      return undefined;\n    }\n    const [numberOfSetsStr, repRangeStr] = setParts.split(\"x\", 2);\n\n    const reprange = repRangeStr.split(\"-\", 2);\n    let minrepStr: string | undefined = reprange[0];\n    let maxrepStr: string | undefined = reprange[1];\n    if (!maxrepStr) {\n      maxrepStr = minrepStr;\n      minrepStr = undefined;\n    }\n    let isAmrap = false;\n    if (maxrepStr.endsWith(\"+\")) {\n      isAmrap = true;\n      maxrepStr.replace(/\\+/g, \"\");\n    }\n    return {\n      numberOfSets: parseInt(numberOfSetsStr, 10),\n      minrep: minrepStr != null ? parseInt(minrepStr, 10) : undefined,\n      maxrep: parseInt(maxrepStr, 10),\n      isAmrap: isAmrap,\n      isQuickAddSet: numberOfSetsStr.endsWith(\"+\"),\n    };\n  }\n\n  private getWeight(expr?: SyntaxNode | null): IWeight | undefined {\n    if (expr?.type.name === PlannerNodeName.WeightWithPlus || expr?.type.name === PlannerNodeName.Weight) {\n      const value = this.getValue(expr).replace(\"+\", \"\");\n      const unit = value.indexOf(\"kg\") !== -1 ? \"kg\" : \"lb\";\n      return W.Weight.build(parseFloat(value), unit);\n    } else {\n      return undefined;\n    }\n  }\n\n  private evaluateWarmupSet(expr: SyntaxNode): IPlannerProgramExerciseWarmupSet {\n    if (expr.type.name === PlannerNodeName.WarmupExerciseSet) {\n      const setPartNodes = expr.getChildren(PlannerNodeName.WarmupSetPart);\n      const setParts = setPartNodes.map((setPartNode) => this.getValue(setPartNode)).join(\"\");\n      const { numberOfSets, reps, minReps } = this.getWarmupReps(setParts);\n      const percentageNode = expr.getChild(PlannerNodeName.Percentage);\n      const weightNode = expr.getChild(PlannerNodeName.Weight);\n      const percentage =\n        percentageNode == null ? undefined : parseFloat(this.getValue(percentageNode).replace(\"%\", \"\"));\n      const weight = this.getWeight(weightNode);\n      if (percentage) {\n        return {\n          type: \"warmup\",\n          reps,\n          minReps,\n          numberOfSets,\n          percentage,\n        };\n      } else {\n        return {\n          type: \"warmup\",\n          reps,\n          minReps,\n          numberOfSets,\n          weight: weight!,\n        };\n      }\n    } else {\n      assert(PlannerNodeName.ExerciseSection);\n    }\n  }\n\n  public static fnArgsToStateVars(\n    fnArgs: string[],\n    onError?: (message: string) => void\n  ): {\n    state: IProgramState;\n    stateMetadata: IProgramStateMetadata;\n  } {\n    const state: IProgramState = {};\n    const stateMetadata: IProgramStateMetadata = {};\n    for (const value of fnArgs) {\n      // eslint-disable-next-line prefer-const\n      let [fnArgKey, fnArgValStr] = value.split(\":\").map((v) => v.trim());\n      if (onError && (!fnArgKey || !fnArgValStr)) {\n        onError(`Invalid argument ${value}`);\n      }\n      if (fnArgKey.endsWith(\"+\")) {\n        fnArgKey = fnArgKey.replace(\"+\", \"\");\n        stateMetadata[fnArgKey] = { userPrompted: true };\n      } else {\n        stateMetadata[fnArgKey] = { userPrompted: false };\n      }\n      try {\n        const fnArgVal = fnArgValStr.match(/(lb|kg)/)\n          ? Weight.parse(fnArgValStr)\n          : fnArgValStr.match(/%/)\n            ? Weight.buildPct(parseFloat(fnArgValStr))\n            : MathUtils.roundFloat(parseFloat(fnArgValStr), 2);\n        state[fnArgKey] = fnArgVal ?? 0;\n      } catch (e) {\n        if (onError) {\n          onError(`Invalid argument ${value}`);\n        } else {\n          throw e;\n        }\n      }\n    }\n    return { state, stateMetadata };\n  }\n\n  private evaluateSet(expr: SyntaxNode): IPlannerProgramExerciseSet {\n    if (expr.type.name === PlannerNodeName.ExerciseSet) {\n      const setPartNodes = expr.getChildren(PlannerNodeName.SetPart);\n      const setParts = setPartNodes.map((setPartNode) => this.getValue(setPartNode)).join(\"\");\n      const repRange = this.getRepRange(setParts);\n      const rpeNode = expr.getChild(PlannerNodeName.Rpe);\n      const timerNode = expr.getChild(PlannerNodeName.Timer);\n      const setTimerNode = expr.getChild(PlannerNodeName.SetTimer);\n      const percentageNode = expr.getChild(PlannerNodeName.PercentageWithPlus);\n      const weightNode = expr.getChild(PlannerNodeName.WeightWithPlus);\n      const labelNode = expr.getChild(PlannerNodeName.SetLabel);\n      const autoNode = expr.getChild(PlannerNodeName.Auto);\n      const isAuto = autoNode != null ? true : undefined;\n      const askWeight =\n        (weightNode != null && this.getValue(weightNode).indexOf(\"+\") !== -1) ||\n        (percentageNode != null && this.getValue(percentageNode).indexOf(\"+\") !== -1);\n      const logRpe = rpeNode == null ? undefined : this.getValue(rpeNode).indexOf(\"+\") !== -1;\n      const rpe = rpeNode == null ? undefined : parseFloat(this.getValue(rpeNode).replace(\"@\", \"\").replace(\"+\", \"\"));\n      let timer = timerNode == null ? undefined : parseInt(this.getValue(timerNode).replace(\"s\", \"\"), 10);\n      let setTimer: number | undefined;\n      let isOverflowSetTimer: boolean | undefined;\n      if (setTimerNode != null) {\n        const [workPart, restPart] = this.getValue(setTimerNode).split(\"|\");\n        isOverflowSetTimer = workPart.indexOf(\"+\") !== -1 ? true : undefined;\n        setTimer = parseInt(workPart.replace(\"s\", \"\").replace(\"+\", \"\"), 10);\n        timer = restPart === \"?\" ? undefined : parseInt(restPart.replace(\"s\", \"\"), 10);\n      }\n      const percentage =\n        percentageNode == null ? undefined : parseFloat(this.getValue(percentageNode).replace(/[%\\+]/, \"\"));\n      const weight = this.getWeight(weightNode);\n      const label = labelNode\n        ? getChildren(labelNode)\n            .map((n) => this.getValue(n))\n            .join(\" \")\n        : undefined;\n      if (labelNode && label && label.length > 8) {\n        this.error(\"Label length should be 8 chars max\", labelNode);\n      }\n      return {\n        repRange,\n        timer,\n        setTimer,\n        isOverflowSetTimer,\n        logRpe,\n        rpe,\n        weight,\n        percentage,\n        label,\n        askWeight,\n        isAuto,\n      };\n    } else {\n      assert(PlannerNodeName.ExerciseSection);\n    }\n  }\n\n  private evaluateId(expr: SyntaxNode): number[] {\n    if (expr.type.name === PlannerNodeName.ExerciseProperty) {\n      const valueNode = expr.getChild(PlannerNodeName.FunctionExpression);\n      if (valueNode == null) {\n        throw this.error(`Missing value for the property 'id'`, expr);\n      }\n      const fnNameNode = valueNode.getChild(PlannerNodeName.FunctionName);\n      if (fnNameNode == null) {\n        assert(PlannerNodeName.FunctionName);\n      }\n      const fnName = this.getValue(fnNameNode);\n      if ([\"tags\"].indexOf(fnName) === -1) {\n        this.error(`There's no such id type - '${fnName}'`, fnNameNode);\n      }\n      const fnArgNodes = valueNode.getChildren(PlannerNodeName.FunctionArgument);\n      this.checkNoTimerArguments(fnArgNodes);\n      this.checkNoKeywordArguments(fnArgNodes);\n      const fnArgs = fnArgNodes.map((argNode) => this.getValue(argNode));\n      if (fnName === \"tags\") {\n        if (fnArgs.length === 0) {\n          this.error(`You should provide the list of numbers in \"tags\"`, fnNameNode);\n        }\n        fnArgs.forEach((arg, i) => {\n          if (!/^\\s*\\d+\\s*$/.test(arg)) {\n            this.error(`\"tags\" accepts whole numbers only`, fnArgNodes[i]);\n          }\n        });\n      }\n      return fnArgs.map((t) => parseInt(t, 10));\n    } else {\n      assert(PlannerNodeName.ExerciseProperty);\n    }\n  }\n\n  private evaluateUpdate(expr: SyntaxNode, exerciseType?: IExerciseType): IProgramExerciseUpdate {\n    if (expr.type.name === PlannerNodeName.ExerciseProperty) {\n      const valueNode = expr.getChild(PlannerNodeName.FunctionExpression);\n      if (valueNode == null) {\n        throw this.error(`Missing value for the property 'update'`, expr);\n      }\n      const fnNameNode = valueNode.getChild(PlannerNodeName.FunctionName);\n      if (fnNameNode == null) {\n        assert(PlannerNodeName.FunctionName);\n      }\n      const fnName = this.getValue(fnNameNode);\n      const fnArgNodes = valueNode.getChildren(PlannerNodeName.FunctionArgument);\n      this.checkNoTimerArguments(fnArgNodes);\n      this.checkNoKeywordArguments(fnArgNodes);\n      const fnArgs = fnArgNodes.map((argNode) => this.getValue(argNode));\n      let script: string | undefined;\n      let body: string | undefined;\n      let meta: { stateKeys: Set<string> } | undefined;\n      let liftoscriptNode: SyntaxNode | undefined;\n      if (fnName === \"custom\") {\n        liftoscriptNode = valueNode.getChild(PlannerNodeName.Liftoscript) || undefined;\n        script = liftoscriptNode ? this.getValueTrim(liftoscriptNode) : undefined;\n        if (fnArgs.length > 0) {\n          this.error(`State variables for the update script are taken from \"progress\" block`, fnNameNode);\n        }\n        const reuseLiftoscriptNode = valueNode\n          .getChild(PlannerNodeName.ReuseLiftoscript)\n          ?.getChild(PlannerNodeName.ReuseSection)\n          ?.getChild(PlannerNodeName.ExerciseName);\n        body = reuseLiftoscriptNode ? this.getValue(reuseLiftoscriptNode) : undefined;\n        if (script) {\n          const liftoscriptEvaluator = new ScriptRunner(\n            script,\n            {},\n            {},\n            Progress.createEmptyScriptBindings(this.dayData, this.settings),\n            Progress.createScriptFunctions(this.settings),\n            this.settings.units,\n            { exerciseType, unit: this.settings.units, prints: [] },\n            \"update\"\n          );\n          const stateKeys = liftoscriptEvaluator.getStateVariableKeys();\n          meta = { stateKeys };\n        }\n        if (!script && !body) {\n          this.error(\n            `'custom' update requires either to specify Liftoscript block or specify which one to reuse`,\n            valueNode\n          );\n        }\n        return {\n          type: \"custom\",\n          script,\n          liftoscriptNode,\n          meta,\n          reuse: body ? { fullName: body, source: \"specific\" } : undefined,\n        };\n      } else {\n        this.error(`There's no such update progression exists - '${fnName}'`, fnNameNode);\n      }\n    } else {\n      assert(PlannerNodeName.ExerciseProperty);\n    }\n  }\n\n  private validateProgress(fnName: string, fnArgs: string[], fnNameNode: SyntaxNode, valueNode: SyntaxNode): void {\n    if ([\"lp\", \"sum\", \"dp\", \"custom\", \"none\"].indexOf(fnName) === -1) {\n      this.error(`There's no such progression exists - '${fnName}'`, fnNameNode);\n    }\n    if (fnName === \"lp\") {\n      if (fnArgs.length > 6) {\n        this.error(`Linear Progression 'lp' only has 6 arguments max`, valueNode);\n      } else if (fnArgs[0] && !fnArgs[0].endsWith(\"lb\") && !fnArgs[0].endsWith(\"kg\") && !fnArgs[0].endsWith(\"%\")) {\n        this.error(\n          `1st argument of 'lp' should be weight (ending with 'lb' or 'kg') or percentage (ending with '%'). For example '10lb' or '30%'.`,\n          valueNode\n        );\n      } else if (fnArgs[1] != null && isNaN(parseInt(fnArgs[1], 10))) {\n        this.error(`2nd argument of 'lp' should be a number of attempts - i.e. a number`, valueNode);\n      } else if (fnArgs[2] != null && isNaN(parseInt(fnArgs[2], 10))) {\n        this.error(\n          `3rd argument of 'lp' should be a current number of successful attempts up to date - i.e. a number`,\n          valueNode\n        );\n      } else if (\n        fnArgs[3] != null &&\n        !fnArgs[3].endsWith(\"lb\") &&\n        !fnArgs[3].endsWith(\"kg\") &&\n        !fnArgs[3].endsWith(\"%\")\n      ) {\n        this.error(\n          `4th argument of 'lp' should be weight (ending with 'lb' or 'kg') or percentage (ending with '%'). For example '10lb' or '30%'.`,\n          valueNode\n        );\n      } else if (fnArgs[4] != null && isNaN(parseInt(fnArgs[4], 10))) {\n        this.error(`5th argument of 'lp' should be a number of failed attempts - i.e. a number`, valueNode);\n      } else if (fnArgs[5] != null && isNaN(parseInt(fnArgs[5], 10))) {\n        this.error(\n          `6th argument of 'lp' should be a current number of failed attempts up to date - i.e. a number`,\n          valueNode\n        );\n      }\n    } else if (fnName === \"sum\") {\n      if (fnArgs.length > 2) {\n        this.error(`Reps Sum Progression 'sum' only has 2 arguments max`, valueNode);\n      } else if (fnArgs[0] == null || isNaN(parseInt(fnArgs[0], 10))) {\n        this.error(`1st argument of 'sum' should be a number of reps - i.e. a number`, valueNode);\n      } else if (\n        fnArgs[1] == null ||\n        (!fnArgs[1].endsWith(\"lb\") && !fnArgs[1].endsWith(\"kg\") && !fnArgs[1].endsWith(\"%\"))\n      ) {\n        this.error(\n          `2nd argument of 'sum' should be weight (ending with 'lb' or 'kg') or percentage (ending with '%'). For example '10lb' or '30%'.`,\n          valueNode\n        );\n      }\n    } else if (fnName === \"dp\") {\n      if (fnArgs.length !== 3) {\n        this.error(`Double Progression 'dp' should have 3 arguments`, valueNode);\n      } else if (\n        fnArgs[0] == null ||\n        (!fnArgs[0].endsWith(\"lb\") && !fnArgs[0].endsWith(\"kg\") && !fnArgs[0].endsWith(\"%\"))\n      ) {\n        this.error(\n          `1st argument of 'dp' should be weight (ending with 'lb' or 'kg') or percentage (ending with '%'). For example '10lb' or '30%'.`,\n          valueNode\n        );\n      } else if (fnArgs[1] == null || isNaN(parseInt(fnArgs[1], 10))) {\n        this.error(`2nd argument of 'dp' should be min reps in the range - i.e. a number, like 8`, valueNode);\n      } else if (fnArgs[2] == null || isNaN(parseInt(fnArgs[2], 10))) {\n        this.error(`3rd argument of 'dp' should be max reps in the range - i.e. a number, like 12`, valueNode);\n      }\n    } else if (fnName === \"custom\") {\n      const liftoscriptNode = valueNode.getChild(PlannerNodeName.Liftoscript);\n      const script = liftoscriptNode ? this.getValueTrim(liftoscriptNode) : undefined;\n      const reuseLiftoscriptNode = valueNode\n        .getChild(PlannerNodeName.ReuseLiftoscript)\n        ?.getChild(PlannerNodeName.ReuseSection)\n        ?.getChild(PlannerNodeName.ExerciseName);\n      const body = reuseLiftoscriptNode ? this.getValue(reuseLiftoscriptNode) : undefined;\n      if (!script && !body) {\n        this.error(\n          `'custom' progression requires either to specify Liftoscript block or specify which one to reuse`,\n          valueNode\n        );\n      }\n    }\n  }\n\n  private evaluateProgress(expr: SyntaxNode, exerciseType?: IExerciseType): IProgramExerciseProgress {\n    const result = this.evaluateProgressImpl(expr, exerciseType);\n    if (result.success) {\n      return result.data;\n    } else {\n      throw this.error(result.error, expr);\n    }\n  }\n\n  private evaluateProgressImpl(\n    expr: SyntaxNode,\n    exerciseType?: IExerciseType\n  ): IEither<IProgramExerciseProgress, string> {\n    if (expr.type.name === PlannerNodeName.ExerciseProperty) {\n      const valueNode = expr.getChild(PlannerNodeName.FunctionExpression);\n      if (valueNode == null) {\n        const none = expr.getChild(PlannerNodeName.None);\n        if (none != null) {\n          return PlannerProgramExercise.buildProgress(\"none\", []);\n        } else {\n          throw this.error(`Missing value for the property 'progress'`, expr);\n        }\n      }\n      const fnNameNode = valueNode.getChild(PlannerNodeName.FunctionName);\n      if (fnNameNode == null) {\n        assert(PlannerNodeName.FunctionName);\n      }\n      const fnName = this.getValue(fnNameNode);\n      const fnArgNodes = valueNode.getChildren(PlannerNodeName.FunctionArgument);\n      this.checkNoTimerArguments(fnArgNodes);\n      this.checkNoKeywordArguments(fnArgNodes);\n      const fnArgs = fnArgNodes.map((argNode) => this.getValue(argNode));\n      this.validateProgress(fnName, fnArgs, fnNameNode, valueNode);\n\n      const type = fnName as IProgramExerciseProgressType;\n      if (type === \"custom\") {\n        const liftoscriptNode = valueNode.getChild(PlannerNodeName.Liftoscript);\n        const script = liftoscriptNode ? this.getValueTrim(liftoscriptNode) : undefined;\n        const { state } = PlannerExerciseEvaluator.fnArgsToStateVars(fnArgs, (message) =>\n          this.error(message, fnNameNode)\n        );\n        if (script) {\n          const liftoscriptEvaluator = new ScriptRunner(\n            script,\n            state,\n            {},\n            Progress.createEmptyScriptBindings(this.dayData, this.settings),\n            Progress.createScriptFunctions(this.settings),\n            this.settings.units,\n            { exerciseType, unit: this.settings.units, prints: [] },\n            \"planner\"\n          );\n          try {\n            liftoscriptEvaluator.parse();\n          } catch (e) {\n            if (e instanceof LiftoscriptSyntaxError && liftoscriptNode) {\n              const [line] = this.getLineAndOffset(liftoscriptNode);\n              throw new PlannerSyntaxError(\n                e.message,\n                line + e.line,\n                e.offset,\n                liftoscriptNode.from + e.from,\n                liftoscriptNode.from + e.to\n              );\n            } else {\n              throw e;\n            }\n          }\n        }\n        const reuseLiftoscriptNode = valueNode\n          .getChild(PlannerNodeName.ReuseLiftoscript)\n          ?.getChild(PlannerNodeName.ReuseSection)\n          ?.getChild(PlannerNodeName.ExerciseName);\n        const body = reuseLiftoscriptNode ? this.getValue(reuseLiftoscriptNode) : undefined;\n        return PlannerProgramExercise.buildProgress(type, fnArgs, {\n          script,\n          reuseFullname: body,\n        });\n      } else {\n        return PlannerProgramExercise.buildProgress(type, fnArgs);\n      }\n    } else {\n      assert(PlannerNodeName.ExerciseProperty);\n    }\n  }\n\n  private evaluateWarmup(expr: SyntaxNode): IPlannerProgramExerciseWarmupSet[] {\n    if (expr.type.name === PlannerNodeName.ExerciseProperty) {\n      const none = expr.getChild(PlannerNodeName.None);\n      if (none != null) {\n        return [];\n      }\n      const setsNode = expr.getChild(PlannerNodeName.WarmupExerciseSets);\n      if (setsNode != null) {\n        const sets = setsNode.getChildren(PlannerNodeName.WarmupExerciseSet);\n        if (sets.length > 0) {\n          return sets.map((set) => this.evaluateWarmupSet(set));\n        }\n      }\n      return [];\n    } else {\n      assert(PlannerNodeName.ExerciseProperty);\n    }\n  }\n\n  private evaluateSuperset(expr: SyntaxNode): { type: \"superset\"; data: IPlannerProgramExerciseSuperset } {\n    if (expr.type.name === PlannerNodeName.Superset) {\n      const exerciseNameNode = expr.getChild(PlannerNodeName.ExerciseName);\n      if (exerciseNameNode != null) {\n        const name = this.getValue(exerciseNameNode);\n        return {\n          type: \"superset\",\n          data: { name },\n        };\n      } else {\n        assert(PlannerNodeName.ExerciseName);\n      }\n    } else {\n      assert(PlannerNodeName.Superset);\n    }\n  }\n\n  private evaluateBlock(expr: SyntaxNode): IPlannerProgramExerciseBlock {\n    if (expr.type.name === PlannerNodeName.ExerciseProperty) {\n      const valueNode = expr.getChild(PlannerNodeName.FunctionExpression);\n      if (valueNode == null) {\n        throw this.error(`Missing value for the property 'block'`, expr);\n      }\n      const fnNameNode = valueNode.getChild(PlannerNodeName.FunctionName);\n      if (fnNameNode == null) {\n        assert(PlannerNodeName.FunctionName);\n      }\n      const fnName = this.getValue(fnNameNode);\n      if (fnName !== \"circuit\" && fnName !== \"timed\") {\n        this.error(`There's no such block type - '${fnName}'`, fnNameNode);\n      }\n      const blockName: IBlockName = fnName === \"timed\" ? \"timed\" : \"circuit\";\n      const fnArgNodes = valueNode.getChildren(PlannerNodeName.FunctionArgument);\n      const args: IBlockLoggingArg[] = fnArgNodes.map((argNode) => {\n        const bareKeywordNode = argNode.getChild(PlannerNodeName.Keyword);\n        if (bareKeywordNode != null) {\n          return { type: \"bare\", value: this.getValue(bareKeywordNode) };\n        }\n        const keyValueNode = argNode.getChild(PlannerNodeName.KeyValue);\n        if (keyValueNode != null) {\n          const keywordNodes = keyValueNode.getChildren(PlannerNodeName.Keyword);\n          const keyNode = keywordNodes[0];\n          const valueNode2 = keywordNodes[1] ?? keyValueNode.getChild(PlannerNodeName.None);\n          if (keyNode != null && valueNode2 != null) {\n            return { type: \"keyvalue\", key: this.getValue(keyNode), value: this.getValue(valueNode2) };\n          }\n        }\n        return { type: \"other\" };\n      });\n      const result = BlockLogging.evaluateArgs(args, blockName);\n      if (!result.success) {\n        this.error(result.problem.message, fnArgNodes[result.problem.index]);\n      }\n      return { type: \"circuit\", name: blockName, logging: result.data };\n    } else {\n      assert(PlannerNodeName.ExerciseProperty);\n    }\n  }\n\n  private evaluatePyramid(expr: SyntaxNode): IPlannerProgramExercisePyramid {\n    if (expr.type.name === PlannerNodeName.ExerciseProperty) {\n      const valueNode = expr.getChild(PlannerNodeName.FunctionExpression);\n      if (valueNode == null) {\n        throw this.error(`Missing value for the property 'pyramid'`, expr);\n      }\n      const fnNameNode = valueNode.getChild(PlannerNodeName.FunctionName);\n      if (fnNameNode == null) {\n        assert(PlannerNodeName.FunctionName);\n      }\n      const fnName = this.getValue(fnNameNode);\n      const modes: IPlannerProgramExercisePyramidMode[] = [\"up\", \"down\", \"updown\", \"downup\"];\n      if (!(modes as string[]).includes(fnName)) {\n        this.error(`There's no such pyramid mode - '${fnName}'`, fnNameNode);\n      }\n      const mode = fnName as IPlannerProgramExercisePyramidMode;\n      const fnArgNodes = valueNode.getChildren(PlannerNodeName.FunctionArgument);\n      const argNodesByKey: Partial<Record<IPyramidArgument, SyntaxNode>> = {};\n      const values: Partial<Record<IPyramidArgument, number>> = {};\n      for (const argNode of fnArgNodes) {\n        const keyValueNode = argNode.getChild(PlannerNodeName.KeyValue);\n        if (keyValueNode == null) {\n          this.error(`Only named arguments (e.g. 'from: 20s') are allowed for 'pyramid'`, argNode);\n        }\n        const keywordNode = keyValueNode.getChild(PlannerNodeName.Keyword);\n        if (keywordNode == null) {\n          assert(PlannerNodeName.Keyword);\n        }\n        const rawKey = this.getValue(keywordNode).trim();\n        if (rawKey !== \"from\" && rawKey !== \"to\" && rawKey !== \"step\" && rawKey !== \"rest\") {\n          this.error(`Unknown pyramid argument '${rawKey}'`, keyValueNode);\n        }\n        const key = rawKey as IPyramidArgument;\n        if (argNodesByKey[key] != null) {\n          this.error(`Duplicate pyramid argument '${key}'`, keyValueNode);\n        }\n        const timerNode = keyValueNode.getChild(PlannerNodeName.Timer);\n        if (timerNode == null) {\n          this.error(`'${key}' must be a duration like '20s'`, keyValueNode);\n        }\n        argNodesByKey[key] = keyValueNode;\n        values[key] = parseInt(this.getValue(timerNode).replace(\"s\", \"\"), 10);\n      }\n      for (const required of [\"from\", \"to\", \"step\"] as const) {\n        if (values[required] == null) {\n          this.error(`Missing required argument '${required}' for 'pyramid'`, valueNode);\n        }\n      }\n      const spec: IPlannerProgramExercisePyramid = {\n        mode,\n        from: values.from!,\n        to: values.to!,\n        step: values.step!,\n        rest: values.rest,\n      };\n      const problems = Pyramid.validate(spec);\n      if (problems.length > 0) {\n        const problem = problems[0];\n        this.error(problem.message, argNodesByKey[problem.argument] || valueNode);\n      }\n      return spec;\n    } else {\n      assert(PlannerNodeName.ExerciseProperty);\n    }\n  }\n\n  private evaluateProperty(\n    expr: SyntaxNode,\n    exerciseType?: IExerciseType\n  ):\n    | { type: \"progress\"; data: IProgramExerciseProgress }\n    | { type: \"update\"; data: IProgramExerciseUpdate }\n    | { type: \"warmup\"; data: IPlannerProgramExerciseWarmupSet[] }\n    | { type: \"id\"; data: number[] }\n    | { type: \"used\"; data: \"\" }\n    | { type: \"block\"; data: IPlannerProgramExerciseBlock }\n    | { type: \"pyramid\"; data: IPlannerProgramExercisePyramid } {\n    if (expr.type.name === PlannerNodeName.ExerciseProperty) {\n      const nameNode = expr.getChild(PlannerNodeName.ExercisePropertyName);\n      if (nameNode == null) {\n        assert(PlannerNodeName.ExercisePropertyName);\n      }\n      const name = this.getValue(nameNode);\n      if (name === \"progress\") {\n        return { type: \"progress\", data: this.evaluateProgress(expr, exerciseType) };\n      } else if (name === \"update\") {\n        return { type: \"update\", data: this.evaluateUpdate(expr, exerciseType) };\n      } else if (name === \"warmup\") {\n        return { type: \"warmup\", data: this.evaluateWarmup(expr) };\n      } else if (name === \"id\") {\n        return { type: \"id\", data: this.evaluateId(expr) };\n      } else if (name === \"used\") {\n        return { type: \"used\", data: \"\" };\n      } else if (name === \"block\") {\n        return { type: \"block\", data: this.evaluateBlock(expr) };\n      } else if (name === \"pyramid\") {\n        return { type: \"pyramid\", data: this.evaluatePyramid(expr) };\n      } else {\n        this.error(`There's no such property exists - '${name}'`, nameNode);\n      }\n    } else {\n      assert(PlannerNodeName.ExerciseProperty);\n    }\n  }\n\n  private getReuseWeekDay(weekDayNode: SyntaxNode | null): { week?: number; day?: number } {\n    let week: number | undefined;\n    let day: number | undefined;\n    if (weekDayNode != null) {\n      const result = weekDayNode.getChildren(PlannerNodeName.WeekOrDay).map((n) => {\n        const child = getChildren(n)[0];\n        if (child.type.name === PlannerNodeName.Int) {\n          return parseInt(this.getValue(child), 10);\n        } else {\n          return undefined;\n        }\n      });\n      if (result.length === 1) {\n        day = result[0];\n      } else {\n        week = result[0];\n        day = result[1];\n      }\n    }\n    return { week, day };\n  }\n\n  private evaluateReuseNode(expr: SyntaxNode): { type: \"reuse\"; data: IPlannerProgramReuse } {\n    if (expr.type.name === PlannerNodeName.ReuseSectionWithWeekDay) {\n      const nameNode = expr.getChild(PlannerNodeName.ReuseSection)?.getChild(PlannerNodeName.ExerciseName);\n      if (nameNode == null) {\n        assert(PlannerNodeName.ExerciseName);\n      }\n      const name = this.getValue(nameNode);\n      const { week, day } = this.getReuseWeekDay(expr.getChild(PlannerNodeName.WeekDay));\n      return { type: \"reuse\", data: { fullName: name, week, day, source: \"overall\" } };\n    } else {\n      assert(PlannerNodeName.ReuseSectionWithWeekDay);\n    }\n  }\n\n  private evaluateSection(\n    expr: SyntaxNode,\n    exerciseType?: IExerciseType\n  ):\n    | { type: \"sets\"; data: IPlannerProgramExerciseSet[]; isCurrent: boolean }\n    | { type: \"progress\"; data: IProgramExerciseProgress }\n    | { type: \"update\"; data: IProgramExerciseUpdate }\n    | { type: \"id\"; data: number[] }\n    | { type: \"reuse\"; data: IPlannerProgramReuse }\n    | { type: \"warmup\"; data: IPlannerProgramExerciseWarmupSet[] }\n    | { type: \"superset\"; data: IPlannerProgramExerciseSuperset }\n    | { type: \"used\"; data: \"\" }\n    | { type: \"block\"; data: IPlannerProgramExerciseBlock }\n    | { type: \"pyramid\"; data: IPlannerProgramExercisePyramid } {\n    if (expr.type.name === PlannerNodeName.ExerciseSection) {\n      const reuseNode = expr.getChild(PlannerNodeName.ReuseSectionWithWeekDay);\n      if (reuseNode != null) {\n        return this.evaluateReuseNode(reuseNode);\n      }\n      const setsNode = expr.getChild(PlannerNodeName.ExerciseSets);\n      if (setsNode != null) {\n        const sets = setsNode.getChildren(PlannerNodeName.ExerciseSet);\n        const isCurrent = setsNode.getChild(PlannerNodeName.CurrentVariation) != null;\n        if (sets.length > 0) {\n          return { type: \"sets\", data: sets.map((set) => this.evaluateSet(set)), isCurrent };\n        }\n      }\n      const superset = expr.getChild(PlannerNodeName.Superset);\n      if (superset != null) {\n        return this.evaluateSuperset(superset);\n      }\n      const property = expr.getChild(PlannerNodeName.ExerciseProperty);\n      if (property != null) {\n        return this.evaluateProperty(property, exerciseType);\n      } else {\n        assert(PlannerNodeName.ExerciseProperty);\n      }\n    } else {\n      assert(PlannerNodeName.ExerciseSection);\n    }\n  }\n\n  public static extractNameParts = memoize(\n    (\n      str: string,\n      exercises: IAllCustomExercises,\n      allEquipment?: IAllEquipment\n    ): { name: string; label?: string; equipment?: string } => {\n      let [label, ...nameEquipmentItems] = str.split(\":\");\n      if (nameEquipmentItems.length === 0) {\n        nameEquipmentItems = [label];\n        label = \"\";\n      } else {\n        label = label.trim();\n      }\n      const nameEquipment = nameEquipmentItems.join(\":\").trim();\n      const matchingExercise = Exercise.findByNameAndEquipment(nameEquipment, exercises, allEquipment);\n      if (matchingExercise) {\n        // The name is the bare name. The equipment is resolved: it tells the variations apart.\n        return { name: matchingExercise.name, label: label ? label : undefined, equipment: matchingExercise.equipment };\n      }\n      return { name: nameEquipment, label: label ? label : undefined };\n    },\n    { maxSize: 1000 }\n  );\n\n  private addDescription(value: string): void {\n    value = value.replace(/^\\/\\//, \"\").trim();\n    if (this.latestDescriptions.length === 0) {\n      this.latestDescriptions.push([]);\n    }\n    this.latestDescriptions[this.latestDescriptions.length - 1].push(value);\n  }\n\n  private getOrder(expr: SyntaxNode): number {\n    if (expr.type.name === PlannerNodeName.ExerciseExpression) {\n      const repeatNode = expr.getChild(PlannerNodeName.Repeat);\n      if (repeatNode == null) {\n        return 0;\n      }\n      const children = getChildren(repeatNode);\n      for (const childNode of children) {\n        if (childNode.type.name === PlannerNodeName.Rep) {\n          return parseInt(this.getValue(childNode), 10);\n        }\n      }\n      return 0;\n    } else {\n      assert(PlannerNodeName.ExerciseExpression);\n    }\n  }\n\n  private getRepeat(expr: SyntaxNode): number[] {\n    if (expr.type.name === PlannerNodeName.ExerciseExpression) {\n      const repeatNode = expr.getChild(PlannerNodeName.Repeat);\n      if (repeatNode == null) {\n        return [];\n      }\n      const result: Set<number> = new Set();\n      const children = getChildren(repeatNode);\n      for (const childNode of children) {\n        if (childNode.type.name === PlannerNodeName.RepRange) {\n          const [from, to] = getChildren(childNode).map((n) => parseInt(this.getValue(n), 10));\n          for (let i = from; i <= to; i += 1) {\n            result.add(i);\n          }\n          break;\n        }\n      }\n      return Array.from(result).sort((a, b) => a - b);\n    } else {\n      assert(PlannerNodeName.ExerciseExpression);\n    }\n  }\n\n  private getRepeatRanges(numbers: number[]): string[] {\n    // Check if the input array is empty\n    if (numbers.length === 0) {\n      return [];\n    }\n\n    const ranges: string[] = [];\n    let rangeStart = numbers[0];\n    let rangeEnd = numbers[0];\n\n    for (let i = 1; i < numbers.length; i++) {\n      if (numbers[i] === rangeEnd + 1) {\n        // If the current number is consecutive, extend the current range\n        rangeEnd = numbers[i];\n      } else {\n        // If not consecutive, add the current range to results and start a new range\n        ranges.push(`${rangeStart}-${rangeEnd}`);\n        rangeStart = numbers[i];\n        rangeEnd = numbers[i];\n      }\n    }\n\n    // Add the last range to results\n    ranges.push(`${rangeStart}-${rangeEnd}`);\n\n    return ranges;\n  }\n\n  private getIsNotUsed(expr: SyntaxNode): boolean {\n    if (expr.type.name === PlannerNodeName.ExerciseExpression) {\n      const sections = expr.getChildren(PlannerNodeName.ExerciseSection);\n      for (const section of sections) {\n        const properties = section.getChildren(PlannerNodeName.ExerciseProperty);\n        for (const property of properties) {\n          const nameNode = property.getChild(PlannerNodeName.ExercisePropertyName);\n          const name = nameNode ? this.getValueTrim(nameNode) : undefined;\n          const valueNode = property.getChild(PlannerNodeName.None);\n          if (name === \"used\" && valueNode != null) {\n            return true;\n          }\n        }\n      }\n      return false;\n    } else {\n      assert(PlannerNodeName.ExerciseSection);\n    }\n  }\n\n  private takeWeekDayDescription(): string | undefined {\n    if (this.mode !== \"full\") {\n      return undefined;\n    }\n    // Only `nextLines` is used. `linesToPreviousExercise` (blank and `///` lines before the heading) is\n    // for the text path, which rebuilds the program text. The evaluated result has no place for those\n    // lines, and the day-by-day result drops them too. See tests/unit/evaluateFullBetweenDays.test.ts.\n    const { nextLines } = splitWeekDayOngoingLines(this.ongoingLines);\n    this.ongoingLines = [];\n    this.latestDescriptions = [];\n    return nextLines.length > 0 ? nextLines.map(fullTextLineToWeekdayDescription).join(\"\\n\").trim() : undefined;\n  }\n\n  private evaluateExercise(expr: SyntaxNode): void {\n    if (expr.type.name === PlannerNodeName.EmptyExpression || expr.type.name === PlannerNodeName.TripleLineComment) {\n      const type = expr.type.name === PlannerNodeName.EmptyExpression ? \"empty\" : \"triplelinecomment\";\n      this.ongoingLines.push({ type, line: this.getValueTrim(expr) });\n      if (this.latestDescriptions.length > 0) {\n        this.latestDescriptions.push([]);\n      }\n      return;\n    } else if (expr.type.name === PlannerNodeName.Week) {\n      if (this.mode === \"perday\") {\n        this.error(\n          `You cannot specify weeks in the per-day exercise lists. Switch to the full program mode for that.`,\n          expr\n        );\n      }\n      const heading = parseWeekHeading(this.getValueTrim(expr));\n      if (heading.error != null) {\n        this.error(heading.error, expr);\n      }\n      if (heading.loop != null && this.weeks.some((w) => w.loop != null)) {\n        this.error(`Only one week can have \"/ loop: start\"`, expr);\n      }\n      const [line] = this.getLineAndOffset(expr);\n      const description = this.takeWeekDayDescription();\n      this.weeks.push({\n        name: heading.name,\n        ...(heading.loop != null ? { loop: heading.loop } : {}),\n        line,\n        description,\n        days: [],\n      });\n      this.dayData = { day: this.dayData.day, week: this.weeks.length + 1, dayInWeek: 0 };\n    } else if (expr.type.name === PlannerNodeName.Day) {\n      if (this.mode === \"perday\") {\n        this.error(\n          `You cannot specify days in the per-day exercise lists. Switch to the full program mode for that.`,\n          expr\n        );\n      }\n      if (this.weeks.length === 0) {\n        this.error(`You need to specify a week before a day`, expr);\n      }\n      const dayName = this.getValueTrim(expr).replace(/^#+/, \"\").trim();\n      const [line] = this.getLineAndOffset(expr);\n      const description = this.takeWeekDayDescription();\n      this.weeks[this.weeks.length - 1].days.push({ name: dayName, line, description, exercises: [] });\n      this.dayData = {\n        day: this.dayData.day + 1,\n        week: this.dayData.week,\n        dayInWeek: (this.dayData.dayInWeek || 0) + 1,\n      };\n      this.exerciseIndex = 0;\n    } else if (expr.type.name === PlannerNodeName.LineComment) {\n      const value = this.getValueTrim(expr).trim();\n      this.ongoingLines.push({ type: \"comment\", line: value });\n      this.addDescription(value);\n      return undefined;\n    } else if (expr.type.name === PlannerNodeName.ExerciseExpression) {\n      if (this.mode === \"full\" && (this.weeks.length === 0 || this.weeks[this.weeks.length - 1].days.length === 0)) {\n        this.error(`You should first define a week and a day before listing exercises.`, expr);\n      } else if (this.weeks.length === 0) {\n        this.weeks.push({ name: \"Week 1\", line: 1, days: [{ name: \"Day 1\", line: 1, exercises: [] }] });\n      }\n      const nameNode = expr.getChild(PlannerNodeName.ExerciseName);\n      if (nameNode == null) {\n        assert(\"ExerciseName\");\n      }\n\n      const fullName = this.getValue(nameNode);\n      // eslint-disable-next-line prefer-const\n      let { label, name, equipment } = PlannerExerciseEvaluator.extractNameParts(\n        fullName,\n        this.settings.exercises,\n        Equipment.currentEquipment(this.settings)\n      );\n      const key = PlannerKey.fromFullName(fullName, this.settings.exercises, Equipment.currentEquipment(this.settings));\n      const shortName = PlannerProgramExercise.shortNameFromFullName(fullName, this.settings);\n      const exercise = Exercise.findByNameAndEquipment(\n        shortName,\n        this.settings.exercises,\n        Equipment.currentEquipment(this.settings)\n      );\n      let notused = this.getIsNotUsed(expr);\n      const sectionNodes = expr.getChildren(PlannerNodeName.ExerciseSection);\n      const setVariations: IPlannerProgramExerciseSetVariation[] = [];\n      const allSets: IPlannerProgramExerciseSet[] = [];\n      let allWarmupSets: IPlannerProgramExerciseWarmupSet[] | undefined;\n      let reuse: IPlannerProgramReuse | undefined;\n      const repeat = this.getRepeat(expr);\n      const order = this.getOrder(expr);\n      const text = this.getValueTrim(expr).trim();\n      let tags: number[] = [];\n      let progress: IProgramExerciseProgress | undefined;\n      let update: IProgramExerciseUpdate | undefined;\n      let superset: IPlannerProgramExerciseSuperset | undefined;\n      let block: IPlannerProgramExerciseBlock | undefined;\n      let pyramid: IPlannerProgramExercisePyramid | undefined;\n      let pyramidSectionNode: SyntaxNode | undefined;\n      let secondPyramidSectionNode: SyntaxNode | undefined;\n      let explicitSetsSectionNode: SyntaxNode | undefined;\n      let restTimerSectionNode: SyntaxNode | undefined;\n      for (const sectionNode of sectionNodes) {\n        const section = this.evaluateSection(sectionNode, exercise ? { id: exercise.id, equipment } : undefined);\n        if (section.type === \"sets\") {\n          allSets.push(...section.data);\n          if (section.data.some((set) => set.repRange != null)) {\n            setVariations.push({ sets: section.data, isCurrent: section.isCurrent });\n            if (explicitSetsSectionNode == null) {\n              explicitSetsSectionNode = sectionNode;\n            }\n          }\n          if (\n            restTimerSectionNode == null &&\n            section.data.some((set) => set.repRange == null && set.timer != null && set.setTimer == null)\n          ) {\n            restTimerSectionNode = sectionNode;\n          }\n        } else if (section.type === \"warmup\") {\n          allWarmupSets = allWarmupSets || [];\n          allWarmupSets.push(...section.data);\n        } else if (section.type === \"progress\") {\n          progress = section.data;\n        } else if (section.type === \"update\") {\n          update = section.data;\n        } else if (section.type === \"reuse\") {\n          reuse = section.data;\n        } else if (section.type === \"id\") {\n          tags = tags.concat(section.data);\n        } else if (section.type === \"superset\") {\n          superset = section.data;\n        } else if (section.type === \"block\") {\n          block = section.data;\n        } else if (section.type === \"pyramid\") {\n          if (pyramid == null) {\n            pyramid = section.data;\n            pyramidSectionNode = sectionNode;\n            setVariations.push({ sets: Pyramid.expand(pyramid), isCurrent: false });\n          } else if (secondPyramidSectionNode == null) {\n            secondPyramidSectionNode = sectionNode;\n          }\n        } else if (section.type === \"used\") {\n          notused = true;\n        } else {\n          throw new Error(`Unexpected section type`);\n        }\n      }\n      if (pyramid != null) {\n        if (secondPyramidSectionNode != null) {\n          this.error(`Only one 'pyramid:' is allowed per exercise`, secondPyramidSectionNode);\n        }\n        if (explicitSetsSectionNode != null) {\n          this.error(`'pyramid' cannot be combined with an explicit set list`, explicitSetsSectionNode);\n        }\n        if (restTimerSectionNode != null) {\n          this.error(`'pyramid' cannot be combined with a global rest timer`, restTimerSectionNode);\n        }\n        if (reuse != null) {\n          this.error(`'pyramid' cannot be combined with a reused set list`, pyramidSectionNode!);\n        }\n      }\n      const rpe = allSets.find((set) => set.repRange == null && set.rpe != null)?.rpe;\n      const hasAnySetTimer = allSets.some((set) => set.setTimer != null);\n      const timer = hasAnySetTimer\n        ? undefined\n        : allSets.find((set) => set.repRange == null && set.timer != null)?.timer;\n      const globalSetTimerSet = allSets.find((set) => set.repRange == null && set.setTimer != null);\n      const percentage = allSets.find((set) => set.repRange == null && set.percentage != null)?.percentage;\n      const weight = allSets.find((set) => set.repRange == null && set.weight != null)?.weight;\n      const logRpe = allSets.find((set) => set.repRange == null && set.logRpe != null)?.logRpe;\n      const askWeight = allSets.find((set) => set.repRange == null && set.askWeight != null)?.askWeight;\n      const isAuto = allSets.find((set) => set.repRange == null && set.isAuto != null)?.isAuto;\n      const [line] = this.getLineAndOffset(expr);\n      this.ongoingLines = [];\n      const rawDescriptions: string[] = this.latestDescriptions.map((d) => d.join(\"\\n\"));\n      const currentDescriptionIndex = rawDescriptions.findIndex((d) => d.startsWith(\"!\"));\n      let descriptions = rawDescriptions.map((d, i) => ({\n        value: d.replace(/^!/, \"\").trim(),\n        isCurrent: i === currentDescriptionIndex,\n      }));\n      if (descriptions.length > 1) {\n        descriptions = descriptions.filter((d) => d.value);\n      }\n      this.latestDescriptions = [];\n      const fullNamePoint = this.getPoint(nameNode);\n\n      const reuseSetsNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => n.getChild(PlannerNodeName.ReuseSectionWithWeekDay))\n        .filter((n) => n)[0];\n      const reuseSetPoint = reuseSetsNode ? this.getPoint(reuseSetsNode) : undefined;\n\n      const progressNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => {\n          const node = n.getChild(PlannerNodeName.ExerciseProperty)?.getChild(PlannerNodeName.ExercisePropertyName);\n          return node != null && this.getValueTrim(node) === \"progress\" ? node : undefined;\n        })\n        .flat(2)\n        .filter((n) => n)[0];\n      const progressPoint = progressNode ? this.getPoint(progressNode) : undefined;\n\n      const updateNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => {\n          const node = n.getChild(PlannerNodeName.ExerciseProperty)?.getChild(PlannerNodeName.ExercisePropertyName);\n          return node != null && this.getValueTrim(node) === \"update\" ? node : undefined;\n        })\n        .flat(2)\n        .filter((n) => n)[0];\n      const updatePoint = updateNode ? this.getPoint(updateNode) : undefined;\n\n      const idNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => {\n          const node = n.getChild(PlannerNodeName.ExerciseProperty)?.getChild(PlannerNodeName.ExercisePropertyName);\n          return node != null && this.getValueTrim(node) === \"id\" ? node : undefined;\n        })\n        .flat(2)\n        .filter((n) => n)[0];\n      const idPoint = idNode ? this.getPoint(idNode) : undefined;\n\n      const warmupNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => n.getChild(PlannerNodeName.ExerciseProperty)?.getChild(PlannerNodeName.WarmupExerciseSets))\n        .flat(2)\n        .filter((n) => n)[0];\n      const warmupPoint = warmupNode ? this.getPoint(warmupNode) : undefined;\n\n      const supersetNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => n.getChild(PlannerNodeName.Superset))\n        .filter((n) => n)[0];\n      const supersetPoint = supersetNode ? this.getPoint(supersetNode) : undefined;\n\n      const blockNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => {\n          const node = n.getChild(PlannerNodeName.ExerciseProperty)?.getChild(PlannerNodeName.ExercisePropertyName);\n          return node != null && this.getValueTrim(node) === \"block\" ? node : undefined;\n        })\n        .flat(2)\n        .filter((n) => n)[0];\n      const blockPoint = blockNode ? this.getPoint(blockNode) : undefined;\n\n      const pyramidNameNode = pyramidSectionNode\n        ?.getChild(PlannerNodeName.ExerciseProperty)\n        ?.getChild(PlannerNodeName.ExercisePropertyName);\n      const pyramidPoint = pyramidNameNode ? this.getPoint(pyramidNameNode) : undefined;\n\n      const plannerExercise: IPlannerProgramExercise = {\n        id: UidFactory.generateUid(8),\n        key,\n        fullName,\n        shortName,\n        exerciseType: exercise,\n        label,\n        dayData: this.dayData,\n        text,\n        repeat,\n        repeating: [...repeat],\n        order,\n        superset,\n        block,\n        pyramid,\n        name,\n        equipment,\n        exerciseIndex: this.exerciseIndex,\n        line,\n        tags,\n        notused: notused,\n        evaluatedSetVariations: [],\n        setVariations,\n        descriptions: {\n          values: descriptions,\n        },\n        warmupSets: allWarmupSets,\n        reuse,\n        progress,\n        update,\n        globals: {\n          rpe,\n          logRpe,\n          askWeight,\n          timer,\n          setTimer: globalSetTimerSet?.setTimer,\n          setTimerRest: globalSetTimerSet?.timer,\n          isOverflowSetTimer: globalSetTimerSet?.isOverflowSetTimer,\n          percentage,\n          weight,\n          isAuto,\n        },\n        points: {\n          fullName: fullNamePoint,\n          supersetPoint,\n          blockPoint,\n          pyramidPoint,\n          reuseSetPoint,\n          progressPoint,\n          idPoint,\n          updatePoint,\n          warmupPoint,\n        },\n      };\n      this.weeks[this.weeks.length - 1].days[this.weeks[this.weeks.length - 1].days.length - 1].exercises.push(\n        plannerExercise\n      );\n      if (!notused) {\n        this.exerciseIndex += 1;\n      }\n    } else {\n      this.error(`Unexpected node type ${expr.node.type.name}`, expr);\n    }\n  }\n\n  private evaluateProgram(expr: SyntaxNode): IPlannerExerciseEvaluatorWeek[] {\n    if (expr.type.name === PlannerNodeName.Program) {\n      this.weeks = [];\n      this.exerciseIndex = 0;\n      for (const child of CollectionUtils.compact(getChildren(expr))) {\n        this.evaluateExercise(child);\n      }\n      return this.weeks;\n    } else {\n      this.error(`Unexpected node type ${expr.node.type.name}`, expr);\n    }\n  }\n\n  public evaluate(programNode: SyntaxNode): IPlannerEvalFullResult {\n    try {\n      this.parse(programNode);\n      const program = this.evaluateProgram(programNode);\n      return { data: program, success: true };\n    } catch (e) {\n      if (e instanceof PlannerSyntaxError) {\n        return { error: e, success: false };\n      } else {\n        throw e;\n      }\n    }\n  }\n\n  public hasWeightInUnit(programNode: SyntaxNode, unit: IUnit): boolean {\n    const cursor = programNode.cursor();\n    do {\n      const weight = this.getWeight(cursor.node);\n      if (weight != null) {\n        if (weight.unit === unit) {\n          return true;\n        }\n      }\n    } while (cursor.next());\n    return false;\n  }\n\n  public switchWeightsToUnit(programNode: SyntaxNode, settings: ISettings): string {\n    const cursor = programNode.cursor();\n    let script = this.script;\n    let shift = 0;\n    do {\n      if (cursor.node.type.name === PlannerNodeName.Weight) {\n        const weight = this.getWeight(cursor.node);\n        if (weight != null) {\n          if (weight.unit !== settings.units) {\n            const from = cursor.node.from;\n            const to = cursor.node.to;\n            const oldWeightStr = Weight.print(weight);\n            const newWeightStr = Weight.print(Weight.smartConvert(weight, settings.units));\n            script = script.substring(0, from + shift) + newWeightStr + script.substring(to + shift);\n            shift = shift + newWeightStr.length - oldWeightStr.length;\n          }\n        }\n      } else if (cursor.node.type.name === PlannerNodeName.Liftoscript) {\n        const oldLiftoscript = this.getValueTrim(cursor.node);\n        const liftoscriptEvaluator = new ScriptRunner(\n          oldLiftoscript,\n          {},\n          {},\n          Progress.createEmptyScriptBindings({ day: 1, week: 1, dayInWeek: 1 }, settings),\n          Progress.createScriptFunctions(settings),\n          settings.units,\n          { unit: settings.units, prints: [] },\n          \"planner\"\n        );\n        const newLiftoscript = liftoscriptEvaluator.switchWeightsToUnit(settings.units);\n        script =\n          script.substring(0, cursor.node.from + shift) + newLiftoscript + script.substring(cursor.node.to + shift);\n        shift = shift + newLiftoscript.length - oldLiftoscript.length;\n      }\n    } while (cursor.next());\n    return script;\n  }\n\n  public changeExerciseName(node: SyntaxNode, from: string, to: string): string {\n    const cursor = node.cursor();\n    let script = this.script;\n    let shift = 0;\n    // The variations of a custom exercise print as \"Name, Equipment\". They change with the name.\n    const allEquipment = Equipment.currentEquipment(this.settings);\n    const variationNames = new Map<string, string>();\n    for (const id of Object.keys(allEquipment)) {\n      variationNames.set(`${from}, ${equipmentName(id, allEquipment)}`, `${to}, ${equipmentName(id, allEquipment)}`);\n    }\n    do {\n      if (cursor.node.type.name === PlannerNodeName.ExerciseName) {\n        const name = this.getValue(cursor.node);\n        const newName = name === from ? to : variationNames.get(name);\n        if (newName != null) {\n          const fromNode = cursor.node.from;\n          const toNode = cursor.node.to;\n          script = script.substring(0, fromNode + shift) + newName + script.substring(toNode + shift);\n          shift = shift + newName.length - name.length;\n        }\n      }\n    } while (cursor.next());\n    return script;\n  }\n\n  public static changeWeightsToCompletedWeights(oldScript: string): string {\n    const node = plannerExerciseParser.parse(oldScript);\n    const cursor = node.cursor();\n    let script = oldScript;\n    let shift = 0;\n    do {\n      if (cursor.node.type.name === PlannerNodeName.Liftoscript) {\n        const value = LiftoscriptEvaluator.getValueRaw(oldScript, cursor.node);\n        const from = cursor.node.from;\n        const to = cursor.node.to;\n        const newValue = LiftoscriptEvaluator.changeWeightsToCompleteWeights(value);\n        script = script.substring(0, from + shift) + newValue + script.substring(to + shift);\n        shift = shift + newValue.length - value.length;\n      }\n    } while (cursor.next());\n    return script;\n  }\n\n  public topLineMap(programNode: SyntaxNode): IPlannerTopLineItem[] {\n    if (programNode.type.name !== PlannerNodeName.Program) {\n      this.error(`Unexpected node type ${programNode.type.name} - should be Program`, programNode);\n    }\n    const children = getChildren(programNode);\n    const result: IPlannerTopLineItem[] = [];\n    let lastDescriptions: string[][] = [];\n    let ongoingDescriptions = false;\n    let exerciseIndex = 0;\n    for (const child of children) {\n      if (child.type.name === PlannerNodeName.ExerciseExpression) {\n        ongoingDescriptions = false;\n        const nameNode = child.getChild(PlannerNodeName.ExerciseName)!;\n        const fullName = this.getValue(nameNode);\n        const key = PlannerKey.fromFullName(\n          fullName,\n          this.settings.exercises,\n          Equipment.currentEquipment(this.settings)\n        );\n        const repeat = this.getRepeat(child);\n        const repeatRanges = this.getRepeatRanges(repeat);\n        const order = this.getOrder(child);\n        const isUsed = !this.getIsNotUsed(child);\n        const sectionsNode = child.getChildren(PlannerNodeName.ExerciseSection);\n        const sections = sectionsNode.map((section) => this.getValueTrim(section).trim()).join(\" / \");\n        const sectionsToReuse = sectionsNode\n          .filter((section) => {\n            const properties = section.getChild(PlannerNodeName.ExerciseProperty);\n            if (properties == null) {\n              return true;\n            }\n            const propertyNameNode = properties.getChild(PlannerNodeName.ExercisePropertyName);\n            const propertyName = propertyNameNode ? this.getValue(propertyNameNode) : undefined;\n            if (propertyName === \"progress\") {\n              const none = properties.getChild(PlannerNodeName.None);\n              return none != null;\n            }\n            return false;\n          })\n          .map((section) => this.getValueTrim(section).trim())\n          .join(\" / \");\n        result.push({\n          type: \"exercise\",\n          fullName,\n          order,\n          notused: !isUsed,\n          value: key,\n          exerciseIndex,\n          repeat,\n          repeatRanges,\n          descriptions: lastDescriptions.map((d) => d.join(\"\\n\")),\n          sections,\n          sectionsToReuse,\n        });\n        if (isUsed) {\n          exerciseIndex += 1;\n        }\n        lastDescriptions = [];\n      } else if (child.type.name === PlannerNodeName.LineComment) {\n        ongoingDescriptions = true;\n        const description = this.getValueTrim(child).trim();\n        if (lastDescriptions.length === 0) {\n          lastDescriptions.push([]);\n        }\n        lastDescriptions[lastDescriptions.length - 1].push(description);\n        result.push({ type: \"description\", value: description });\n      } else if (child.type.name === PlannerNodeName.TripleLineComment) {\n        result.push({ type: \"comment\", value: this.getValueTrim(child).trim() });\n      } else if (child.type.name === PlannerNodeName.EmptyExpression) {\n        result.push({ type: \"empty\", value: \"\" });\n        if (ongoingDescriptions) {\n          lastDescriptions.push([]);\n        }\n      } else {\n        this.error(\n          `Unexpected node type ${child.type.name}, should be only exercise, comment, description or empty line`,\n          child\n        );\n      }\n    }\n    return result;\n  }\n}\n","import { IEither } from \"./types\";\n\nexport class UrlUtils {\n  public static build(url: string, base?: string | URL): URL {\n    if (base != null) {\n      base = base.toString().replace(\"liftosaurtrainer://\", \"https://\");\n    }\n    try {\n      return new URL(url, base);\n    } catch (e) {\n      let json: string | undefined;\n      try {\n        json = JSON.stringify(url);\n      } catch {}\n      throw new TypeError(`Failed to construct URL: ${json || url}`);\n    }\n  }\n\n  public static buildSafe(url: string, base?: string | URL): IEither<URL, string> {\n    try {\n      return { success: true, data: this.build(url, base) };\n    } catch (e) {\n      return { success: false, error: e instanceof Error ? e.message : String(e) };\n    }\n  }\n}\n","import { JSX } from \"preact\";\n\ninterface IProps extends JSX.HTMLAttributes<HTMLButtonElement> {\n  buttonSize?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"lg2\";\n  kind: \"orange\" | \"purple\" | \"grayv2\" | \"red\" | \"transparent-purple\" | \"lightpurple\" | \"lightgrayv3\";\n  name: string;\n  disabled?: boolean;\n  type?: \"button\" | \"submit\" | \"reset\";\n}\n\nexport function Button(props: IProps): JSX.Element {\n  const { children, buttonSize, kind, ...otherProps } = props;\n  const classNameStr = typeof props.className === \"string\" ? props.className : \"\";\n  const hasTextSize =\n    classNameStr &&\n    (classNameStr.includes(\"text-xs\") ||\n      classNameStr.includes(\"text-sm\") ||\n      classNameStr.includes(\"text-lg\") ||\n      classNameStr.includes(\"text-base\"));\n  let className = `${!hasTextSize ? \"text-xs \" : \"\"}rounded-lg focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-button-primarybackground`;\n  if (props.disabled) {\n    className += \" bg-background-darkgray opacity-50 text-text-alwayswhite \";\n  } else if (kind === \"purple\") {\n    className += \" bg-button-primarybackground text-text-alwayswhite \";\n  } else if (kind === \"grayv2\") {\n    className += \" bg-background-darkgray text-text-alwayswhite \";\n  } else if (kind === \"red\") {\n    className += \" bg-background-darkred text-text-alwayswhite \";\n  } else if (kind === \"transparent-purple\") {\n    className += \" bg-transparent text-text-purple \";\n  } else if (kind === \"lightpurple\") {\n    className += \" bg-background-purpledark text-text-link \";\n  } else if (kind === \"lightgrayv3\") {\n    className += \" bg-background-subtle text-text-link border border-background-subtle \";\n  } else {\n    className += \" bg-button-orangebackground text-text-alwayswhite\";\n  }\n  if (props.buttonSize === \"sm\") {\n    className += \" px-2 py-1 font-semibold\";\n  } else if (props.buttonSize === \"xs\") {\n    className += \" px-1 py-0 font-normal\";\n  } else if (props.buttonSize === \"md\") {\n    className += \" px-4 py-2 font-semibold\";\n  } else if (props.buttonSize === \"lg2\") {\n    className += \" px-2 py-3 font-semibold\";\n  } else {\n    className += \" px-8 py-3 font-semibold\";\n  }\n  if (props.className) {\n    className += ` ${props.className}`;\n  }\n  if (props.disabled) {\n    className += \" cursor-not-allowed\";\n  }\n  return (\n    <button {...otherProps} className={`${props.className || \"\"} ${className} nm-${props.name}`}>\n      {props.children}\n    </button>\n  );\n}\n","import { IEventPayload, Service } from \"../api/service\";\nimport { SendMessage } from \"./sendMessage\";\n\ndeclare let __COMMIT_HASH__: string;\n\nexport function lg(name: string, extra?: Record<string, string | number>, service?: Service, userId?: string): void {\n  service = service ?? (typeof window !== \"undefined\" ? new Service(window.fetch.bind(window)) : undefined);\n  userId = userId ?? (typeof window !== \"undefined\" ? window.state?.user?.id : undefined);\n  if (service == null || userId == null) {\n    return;\n  }\n\n  const isMobile = SendMessage.isIos() || SendMessage.isAndroid();\n\n  const event: IEventPayload = {\n    type: \"event\",\n    timestamp: Date.now(),\n    commithash: typeof __COMMIT_HASH__ !== \"undefined\" ? __COMMIT_HASH__ : \"unknown\",\n    isMobile,\n    iOSVersion: SendMessage.isIos() ? SendMessage.iosAppVersion() : undefined,\n    androidVersion: SendMessage.isAndroid() ? SendMessage.androidAppVersion() : undefined,\n    name,\n    extra,\n    userId: userId,\n  };\n\n  if (\n    (SendMessage.isIos() && SendMessage.iosAppVersion() >= 13) ||\n    (SendMessage.isAndroid() && SendMessage.androidAppVersion() >= 22)\n  ) {\n    SendMessage.toIosAndAndroid({\n      type: \"event\",\n      data: JSON.stringify(event),\n      commithash: event.commithash,\n      userId: event.userId,\n    });\n    return;\n  }\n\n  service.postEvent(event).catch((e) => {\n    // do nothing;\n  });\n}\n","import { Exercise } from \"./exercise\";\nimport { Progress } from \"./progress\";\nimport { CollectionUtils } from \"../utils/collection\";\n\nimport { Weight } from \"./weight\";\nimport {\n  IHistoryEntry,\n  IHistoryRecord,\n  ISet,\n  IExerciseType,\n  IUnit,\n  IWeight,\n  ISettings,\n  IDayData,\n  IScreenMuscle,\n  IIntervals,\n} from \"../types\";\nimport { ICollectorFn } from \"@client/utils/collector\";\nimport { Reps } from \"./set\";\nimport { ProgramExercise } from \"./programExercise\";\nimport { IState, updateState } from \"./state\";\nimport { lb, lbu } from \"lens-shmens\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { IDispatch } from \"@client/ducks/types\";\nimport { SendMessage } from \"@client/utils/sendMessage\";\nimport memoize from \"micro-memoize\";\nimport { DateUtils } from \"../utils/date\";\nimport { IEvaluatedProgram, Program } from \"./program\";\nimport { PlannerProgramExercise } from \"@client/pages/planner/models/plannerProgramExercise\";\nimport { Muscle } from \"./muscle\";\nimport { UidFactory } from \"../utils/generator\";\n\nexport interface IHistoricalEntries {\n  last: { entry: IHistoryEntry; time: number };\n  max: { entry: IHistoryEntry; time: number };\n}\n\nexport interface IHistoryRecordAndEntry {\n  record: IHistoryRecord;\n  entry: IHistoryEntry;\n}\n\n// history id -> exercise key -> personal records\nexport type IPersonalRecords = Partial<Record<string, Partial<Record<string, IHistoryEntryPersonalRecords>>>>;\n\nexport interface IHistoryEntryPersonalRecords {\n  maxWeightSet?: ISet;\n  prevMaxWeightSet?: ISet;\n  max1RMSet?: ISet;\n  prevMax1RMSet?: ISet;\n}\n\nexport namespace History {\n  export function buildFromEntry(entry: IHistoryEntry, dayData: IDayData): IHistoryRecord {\n    return {\n      vtype: \"history_record\",\n      id: 0,\n      date: new Date().toISOString(),\n      programId: \"\",\n      programName: \"\",\n      day: dayData.day,\n      week: dayData.week,\n      dayInWeek: dayData.dayInWeek,\n      dayName: dayData.day.toString(),\n      startTime: Date.now(),\n      entries: [entry],\n    };\n  }\n\n  export function createCustomEntry(exerciseType: IExerciseType): IHistoryEntry {\n    return {\n      id: UidFactory.generateUid(8),\n      exercise: exerciseType,\n      sets: [],\n      warmupSets: [],\n    };\n  }\n\n  // A client edit of a history record. Each edit sets `updatedAt` to the phone time of the edit (spec \"The phone\").\n  export function edit(\n    record: IHistoryRecord,\n    fields: Partial<IHistoryRecord>,\n    time: number = Date.now()\n  ): IHistoryRecord {\n    return { ...record, ...fields, updatedAt: time };\n  }\n\n  export function finishProgramDay(\n    progress: IHistoryRecord,\n    settings: ISettings,\n    day: number,\n    program?: IEvaluatedProgram,\n    forceEndTime: number = Date.now()\n  ): IHistoryRecord {\n    const { deletedProgramExercises, ui, ...historyRecord } = progress;\n    const updatedAt = forceEndTime;\n    const endTime = Progress.isCurrent(progress) ? forceEndTime : (progress.endTime ?? forceEndTime);\n    return {\n      ...historyRecord,\n      entries: historyRecord.entries.map((entry) => {\n        const programExercise =\n          program && entry.programExerciseId\n            ? Program.getProgramExerciseForKeyAndDay(program, day, entry.programExerciseId)\n            : undefined;\n        if (Progress.isCurrent(progress)) {\n          const isUnilateral = Exercise.getIsUnilateral(entry.exercise, settings);\n          entry = {\n            ...entry,\n            updatePrints: undefined,\n            sets: entry.sets.map((set) => {\n              return {\n                ...set,\n                completedReps: set.isCompleted ? set.completedReps : undefined,\n                completedRepsLeft: isUnilateral && set.isCompleted ? set.completedRepsLeft : undefined,\n                completedRpe: set.isCompleted ? set.completedRpe : undefined,\n                completedWeight: set.isCompleted ? set.completedWeight : undefined,\n              };\n            }),\n          };\n          if (programExercise != null) {\n            const state = PlannerProgramExercise.getState(programExercise);\n            const useRm1 = ProgramExercise.isUsingVariable(programExercise, \"rm1\");\n            entry = {\n              ...entry,\n              state: { ...state },\n              vars: useRm1 ? { rm1: Exercise.onerm(programExercise.exerciseType, settings) } : {},\n            };\n          }\n        }\n        return entry;\n      }),\n      id: Progress.isCurrent(progress) ? endTime : progress.id,\n      updatedAt: updatedAt,\n      timerSince: undefined,\n      timerMode: undefined,\n      intervals: History.pauseWorkout(progress.intervals),\n      ...(Progress.isCurrent(progress) ? { endTime } : {}),\n    };\n  }\n\n  export function getMaxWeightSetFromEntry(entry: IHistoryEntry): ISet | undefined {\n    return getMaxWeightSet(entry.sets);\n  }\n\n  export function getMax1RMSetFromEntry(entry: IHistoryEntry): ISet | undefined {\n    return getMax1RMSet(entry.sets);\n  }\n\n  export function getMaxWeightSet(sets: ISet[]): ISet | undefined {\n    return CollectionUtils.sort(\n      sets.filter((s) => (s.completedReps || 0) > 0),\n      (a, b) => {\n        const weightDiff = Weight.compare(\n          b.completedWeight ?? b.weight ?? Weight.build(0, \"lb\"),\n          a.completedWeight ?? a.weight ?? Weight.build(0, \"lb\")\n        );\n        if (weightDiff === 0 && a.completedReps && b.completedReps) {\n          return b.completedReps - a.completedReps;\n        }\n        return weightDiff;\n      }\n    )[0];\n  }\n\n  export function getMax1RMSet(sets: ISet[]): ISet | undefined {\n    return CollectionUtils.sort(\n      sets.filter((s) => (s.completedReps || 0) > 0),\n      (a, b) => {\n        const weightDiff = Weight.compare(\n          Weight.getOneRepMax(\n            b.completedWeight ?? b.weight ?? Weight.build(0, \"lb\"),\n            Reps.avgUnilateralCompletedReps(b) || 0,\n            b.completedRpe ?? b.rpe ?? 10\n          ),\n          Weight.getOneRepMax(\n            a.completedWeight ?? a.weight ?? Weight.build(0, \"lb\"),\n            Reps.avgUnilateralCompletedReps(a) || 0,\n            a.completedRpe ?? a.rpe ?? 10\n          )\n        );\n        if (weightDiff === 0 && a.completedReps && b.completedReps) {\n          return b.completedReps - a.completedReps;\n        }\n        return weightDiff;\n      }\n    )[0];\n  }\n\n  export function findAllPersonalRecords(record: IHistoryRecord, history: IHistoryRecord[]): Map<IExerciseType, ISet> {\n    const prs: Map<IExerciseType, ISet> = new Map();\n    for (const entry of record.entries) {\n      const set = History.findPersonalRecord(record.id, entry, history);\n      if (set != null) {\n        prs.set(entry.exercise, set);\n      }\n    }\n    return prs;\n  }\n\n  export function findAllUsedExerciseTypes(history: IHistoryRecord[]): Partial<Record<string, IExerciseType>> {\n    const set: Partial<Record<string, IExerciseType>> = {};\n    for (const record of history) {\n      for (const entry of record.entries) {\n        set[Exercise.toKey(entry.exercise)] = entry.exercise;\n      }\n    }\n    return set;\n  }\n\n  export function collectMinAndMaxTime(): ICollectorFn<IHistoryRecord, { minTime: number; maxTime: number }> {\n    return {\n      fn: (acc, hr) => {\n        if (acc.maxTime < hr.startTime) {\n          acc.maxTime = hr.startTime;\n        }\n        if (acc.minTime > hr.startTime) {\n          acc.minTime = hr.startTime;\n        }\n        return acc;\n      },\n      initial: { maxTime: 0, minTime: Infinity },\n    };\n  }\n\n  export function collectProgramChangeTimes(): ICollectorFn<\n    IHistoryRecord,\n    {\n      currentProgram?: string;\n      changeProgramTimes: [number, string][];\n    }\n  > {\n    return {\n      fn: (acc, hr) => {\n        if (!acc.currentProgram || acc.currentProgram !== hr.programName) {\n          acc.currentProgram = hr.programName;\n          acc.changeProgramTimes.push([new Date(Date.parse(hr.date)).getTime() / 1000, acc.currentProgram]);\n        }\n        return acc;\n      },\n      initial: { changeProgramTimes: [] },\n    };\n  }\n\n  export function collectMuscleGroups(\n    settings: ISettings\n  ): ICollectorFn<IHistoryRecord, Record<IScreenMuscle | \"total\", [number[], number[], number[]]>> {\n    return {\n      fn: (acc, hr) => {\n        for (const entry of hr.entries) {\n          const exercise = Exercise.get(entry.exercise, settings.exercises);\n          const targetMuscleGroups = Exercise.targetMusclesGroups(exercise, settings);\n          const synergistMuscleGroups = Exercise.synergistMusclesGroups(exercise, settings);\n          const synergistMuscleGroupToMultiplier = Exercise.synergistMusclesGroupMultipliers(exercise, settings);\n          for (const muscleGroup of [...Muscle.getAvailableMuscleGroups(settings), \"total\"] as const) {\n            let multiplier = 0;\n            if (muscleGroup === \"total\") {\n              multiplier = 1;\n            } else if (targetMuscleGroups.indexOf(muscleGroup) !== -1) {\n              multiplier = 1;\n            } else if (synergistMuscleGroups.indexOf(muscleGroup) !== -1) {\n              multiplier = synergistMuscleGroupToMultiplier[muscleGroup] ?? settings.planner.synergistMultiplier;\n            }\n            if (multiplier === 0) {\n              continue;\n            }\n            acc[muscleGroup] = acc[muscleGroup] || [[], [], []];\n            const muscleGroupAcc = acc[muscleGroup];\n            const date = new Date(hr.startTime);\n            const lastTs = muscleGroupAcc[0][muscleGroupAcc[0]?.length - 1];\n            const finishedSets = entry.sets.filter((s) => (s.completedReps || 0) > 0);\n            if (lastTs == null) {\n              muscleGroupAcc[0].push(Math.round(date.getTime() / 1000));\n              muscleGroupAcc[1].push(0);\n              muscleGroupAcc[2].push(0);\n            } else {\n              const lastDate = new Date(lastTs * 1000);\n              const beginningOfWeekForDate = DateUtils.firstDayOfWeekTimestamp(date, settings.startWeekFromMonday);\n              const beginningOfWeekForLastDate = DateUtils.firstDayOfWeekTimestamp(\n                lastDate,\n                settings.startWeekFromMonday\n              );\n              if (beginningOfWeekForDate !== beginningOfWeekForLastDate) {\n                muscleGroupAcc[0].push(Math.round(date.getTime() / 1000));\n                muscleGroupAcc[1].push(0);\n                muscleGroupAcc[2].push(0);\n              }\n            }\n            muscleGroupAcc[1][muscleGroupAcc[1].length - 1] +=\n              Reps.volume(finishedSets, settings.units).value * multiplier;\n            muscleGroupAcc[2][muscleGroupAcc[2].length - 1] += finishedSets.length * multiplier;\n          }\n        }\n        return acc;\n      },\n      initial: {},\n    };\n  }\n\n  export function collectAllUsedExerciseTypes(): ICollectorFn<IHistoryRecord, Partial<Record<string, IExerciseType>>> {\n    return {\n      fn: (acc, hr) => {\n        for (const entry of hr.entries) {\n          acc[Exercise.toKey(entry.exercise)] = entry.exercise;\n        }\n        return acc;\n      },\n      initial: {},\n    };\n  }\n\n  export function collectAllHistoryRecordsOfExerciseType(\n    exerciseType: IExerciseType\n  ): ICollectorFn<IHistoryRecord, IHistoryRecord[]> {\n    return {\n      fn: (acc, hr) => {\n        const hasExercise = hr.entries.some((e) => Exercise.eq(e.exercise, exerciseType));\n        if (hasExercise) {\n          acc.push(hr);\n        }\n        return acc;\n      },\n      initial: [],\n    };\n  }\n\n  export function collectLastEntry(\n    startTime: number,\n    exerciseType: IExerciseType\n  ): ICollectorFn<\n    IHistoryRecord,\n    { lastHistoryEntry?: IHistoryEntry; lastHistoryRecord?: IHistoryRecord; timestamp?: number }\n  > {\n    return {\n      fn: (acc, hr) => {\n        const time = hr.endTime ?? hr.startTime;\n        if (time < startTime && (acc.timestamp == null || time > acc.timestamp)) {\n          const entry = hr.entries.find((e) => Exercise.eq(e.exercise, exerciseType) && Reps.isStarted(e.sets));\n          if (entry) {\n            acc = { lastHistoryEntry: entry, lastHistoryRecord: hr, timestamp: time };\n          }\n        }\n        return acc;\n      },\n      initial: {},\n    };\n  }\n\n  export function collectLastNote(\n    startTime: number,\n    exerciseType: IExerciseType\n  ): ICollectorFn<IHistoryRecord, { lastNote?: string; timestamp?: number }> {\n    return {\n      fn: (acc, hr) => {\n        const time = hr.endTime ?? hr.startTime;\n        const twoMonthsAgo = startTime - 60 * 24 * 60 * 60 * 1000;\n        if (time < startTime && time > twoMonthsAgo && (acc.timestamp == null || time > acc.timestamp)) {\n          const entry = hr.entries.find((e) => Exercise.eq(e.exercise, exerciseType));\n          if (entry && entry.notes) {\n            acc = { lastNote: entry.notes, timestamp: time };\n          }\n        }\n        return acc;\n      },\n      initial: {},\n    };\n  }\n\n  export function collectWeightPersonalRecord(\n    exerciseType: IExerciseType,\n    unit: IUnit\n  ): ICollectorFn<IHistoryRecord, { maxWeight: IWeight; maxWeightHistoryRecord?: IHistoryRecord }> {\n    return {\n      fn: (acc, hr) => {\n        const entries = hr.entries.filter((e) => Exercise.eq(e.exercise, exerciseType));\n        const maxSet = getMaxWeightSet(entries.flatMap((e) => e.sets));\n        if (maxSet != null) {\n          const weight = maxSet.completedWeight ?? maxSet.weight ?? Weight.build(0, unit);\n          if (Weight.gt(weight, acc.maxWeight)) {\n            acc = { maxWeight: weight, maxWeightHistoryRecord: hr };\n          }\n        }\n        return acc;\n      },\n      initial: { maxWeight: Weight.build(0, unit) },\n    };\n  }\n\n  export function collect1RMPersonalRecord(\n    exerciseType: IExerciseType,\n    settings: ISettings\n  ): ICollectorFn<IHistoryRecord, { max1RM: IWeight; max1RMHistoryRecord?: IHistoryRecord; max1RMSet?: ISet }> {\n    return {\n      fn: (acc, hr) => {\n        const entries = hr.entries.filter((e) => Exercise.eq(e.exercise, exerciseType));\n        const allSets = entries.flatMap((e) => e.sets);\n        const all1RMs = allSets.map<[ISet, IWeight]>((s) => [\n          s,\n          Weight.getOneRepMax(s.completedWeight ?? s.weight ?? Weight.build(0, settings.units), s.completedReps || 0),\n        ]);\n        const max1RM = CollectionUtils.sort(all1RMs, (a, b) => Weight.compare(b[1], a[1]))[0];\n        if (max1RM != null && Weight.gt(max1RM[1], acc.max1RM)) {\n          acc = { max1RM: max1RM[1], max1RMHistoryRecord: hr, max1RMSet: max1RM[0] };\n        }\n        return acc;\n      },\n      initial: { max1RM: Weight.build(0, settings.units) },\n    };\n  }\n\n  export function findAllMaxSetsPerId(history: IHistoryRecord[]): Partial<Record<string, ISet>> {\n    const maxSets: Partial<Record<string, ISet>> = {};\n    for (const r of history) {\n      for (const e of r.entries) {\n        const entryMaxSet = getMaxWeightSetFromEntry(e);\n        const key = Exercise.toKey(e.exercise);\n        if (entryMaxSet != null && (entryMaxSet.completedReps || 0) > 0) {\n          if (\n            maxSets[key] == null ||\n            Weight.lt(maxSets[key].weight || 0, entryMaxSet.weight ?? Weight.build(0, \"lb\"))\n          ) {\n            maxSets[key] = entryMaxSet;\n          }\n        }\n      }\n    }\n    return maxSets;\n  }\n\n  export const getDateToHistory = memoize(\n    (history: IHistoryRecord[]): Partial<Record<string, IHistoryRecord>> => {\n      return history.reduce<Partial<Record<string, IHistoryRecord>>>((memo, hr) => {\n        memo[DateUtils.formatYYYYMMDD(hr.date)] = hr;\n        return memo;\n      }, {});\n    },\n    { maxSize: 10 }\n  );\n\n  export function getNumberOfPersonalRecords(history: IHistoryRecord[], prs: IPersonalRecords): number {\n    return history.reduce((memo, r) => {\n      return memo + ObjectUtils.keys(prs[r.id] || {})?.length;\n    }, 0);\n  }\n\n  export const getPersonalRecords = memoize(\n    (history: IHistoryRecord[]): IPersonalRecords => {\n      const result: IPersonalRecords = {};\n      const sortedHistory = CollectionUtils.sortBy(history, \"id\");\n      const max1RMSets: Partial<Record<string, ISet | undefined>> = {};\n      const maxWeightSets: Partial<Record<string, ISet | undefined>> = {};\n      for (const record of sortedHistory) {\n        for (const entry of record.entries) {\n          const key = Exercise.toKey(entry.exercise);\n\n          const thisMaxWeightSet = getMaxWeightSetFromEntry(entry);\n          const thisMaxWeight = thisMaxWeightSet\n            ? (thisMaxWeightSet.completedWeight ?? thisMaxWeightSet.weight)\n            : undefined;\n          const lastMaxWeight = maxWeightSets[key]?.completedWeight ?? maxWeightSets[key]?.weight;\n          if (thisMaxWeight != null && (lastMaxWeight == null || Weight.gt(thisMaxWeight, lastMaxWeight))) {\n            const prevMaxWeightSet = maxWeightSets[key];\n            maxWeightSets[key] = thisMaxWeightSet;\n            result[record.id] = result[record.id] || {};\n            result[record.id]![key] = result[record.id]![key] || {};\n            result[record.id]![key]!.prevMaxWeightSet = prevMaxWeightSet;\n            result[record.id]![key]!.maxWeightSet = thisMaxWeightSet;\n          }\n\n          const thisMax1RMSet = getMax1RMSetFromEntry(entry);\n          const thisMax1RM = thisMax1RMSet\n            ? Weight.getOneRepMax(\n                thisMax1RMSet.completedWeight ?? thisMax1RMSet.weight ?? Weight.build(0, \"lb\"),\n                Reps.avgUnilateralCompletedReps(thisMax1RMSet) || 0,\n                thisMax1RMSet.completedRpe ?? thisMax1RMSet.rpe\n              )\n            : undefined;\n          const lastMax1RMSet = max1RMSets[key];\n          const lastMax1RM = lastMax1RMSet\n            ? Weight.getOneRepMax(\n                lastMax1RMSet.completedWeight ?? lastMax1RMSet.weight ?? Weight.build(0, \"lb\"),\n                lastMax1RMSet ? Reps.avgUnilateralCompletedReps(lastMax1RMSet) || 0 : 0,\n                lastMax1RMSet.completedRpe ?? lastMax1RMSet.rpe\n              )\n            : undefined;\n          if (thisMax1RM != null && (lastMax1RM == null || Weight.gt(thisMax1RM, lastMax1RM))) {\n            const prevMax1RMSet = max1RMSets[key];\n            max1RMSets[key] = thisMax1RMSet;\n            result[record.id] = result[record.id] || {};\n            result[record.id]![key] = result[record.id]![key] || {};\n            result[record.id]![key]!.prevMax1RMSet = prevMax1RMSet;\n            result[record.id]![key]!.max1RMSet = thisMax1RMSet;\n          }\n        }\n      }\n      return result;\n    },\n    { maxSize: 10 }\n  );\n\n  export function findMaxSet(exerciseType: IExerciseType, history: IHistoryRecord[]): ISet | undefined {\n    let maxSet: ISet | undefined = undefined;\n    for (const r of history) {\n      for (const e of r.entries) {\n        if (Exercise.eq(e.exercise, exerciseType)) {\n          const entryMaxSet = getMaxWeightSetFromEntry(e);\n          if (entryMaxSet != null && (entryMaxSet.completedReps || 0) > 0) {\n            if (\n              maxSet == null ||\n              Weight.gt(entryMaxSet.weight ?? Weight.build(0, \"lb\"), maxSet.weight ?? Weight.build(0, \"lb\"))\n            ) {\n              maxSet = entryMaxSet;\n            }\n          }\n        }\n      }\n    }\n    return maxSet;\n  }\n\n  export function findPersonalRecord(id: number, entry: IHistoryEntry, history: IHistoryRecord[]): ISet | undefined {\n    let isMax: boolean | undefined;\n    const entryMaxSet = getMaxWeightSetFromEntry(entry);\n    if (entryMaxSet != null && (entryMaxSet.completedReps || 0) > 0) {\n      for (const r of history) {\n        if (r.id < id) {\n          for (const e of r.entries) {\n            if (e.exercise.id === entry.exercise.id && e.exercise.equipment === entry.exercise.equipment) {\n              if (isMax == null) {\n                isMax = true;\n              }\n              const maxSet = getMaxWeightSetFromEntry(e);\n              if (\n                maxSet != null &&\n                Weight.gte(maxSet.weight ?? Weight.build(0, \"lb\"), entryMaxSet.weight ?? Weight.build(0, \"lb\"))\n              ) {\n                isMax = false;\n              }\n            }\n          }\n        }\n      }\n    } else {\n      isMax = false;\n    }\n    if (isMax == null || isMax === true) {\n      return entryMaxSet;\n    } else {\n      return undefined;\n    }\n  }\n\n  export function totalRecordWeight(record: IHistoryRecord, unit: IUnit): IWeight {\n    return record.entries.reduce((memo, e) => Weight.add(memo, totalEntryWeight(e, unit)), Weight.build(0, unit));\n  }\n\n  export function totalRecordReps(record: IHistoryRecord): number {\n    return record.entries.reduce((memo, e) => memo + totalEntryReps(e), 0);\n  }\n\n  export function totalRecordSets(record: IHistoryRecord): number {\n    return record.entries.reduce((memo, e) => memo + totalEntrySets(e), 0);\n  }\n\n  export function totalEntryWeight(entry: IHistoryEntry, unit: IUnit): IWeight {\n    return entry.sets\n      .filter((s) => (s.completedReps || 0) > 0)\n      .reduce((memo, set) => Weight.add(memo, Reps.setVolume(set, unit)), Weight.build(0, unit));\n  }\n\n  export function totalEntryReps(entry: IHistoryEntry): number {\n    return entry.sets.reduce((memo, set) => memo + (set.completedReps || 0), 0);\n  }\n\n  export function totalEntrySets(entry: IHistoryEntry): number {\n    return getFinishedSets(entry).length;\n  }\n\n  export function getStartedEntries(record: IHistoryRecord): IHistoryEntry[] {\n    return record.entries.filter((e) => e.sets.filter((s) => (s.completedReps || 0) > 0).length > 0);\n  }\n\n  export function getFinishedSets(entry: IHistoryEntry): ISet[] {\n    return entry.sets.filter((s) => Reps.isFinishedSet(s));\n  }\n\n  export function getHistoricalSameDay(\n    history: IHistoryRecord[],\n    progress: IHistoryRecord,\n    currentEntry: IHistoryEntry\n  ): IHistoryRecordAndEntry | undefined {\n    for (const record of history) {\n      if (record.day === progress.day) {\n        for (const entry of record.entries) {\n          if (\n            Exercise.eq(currentEntry.exercise, entry.exercise) &&\n            entry.sets.length > 0 &&\n            entry.sets.some((s) => (s.completedReps || 0) > 0)\n          ) {\n            return { record, entry };\n          }\n        }\n      }\n    }\n    return undefined;\n  }\n\n  export function getHistoricalLastDay(\n    history: IHistoryRecord[],\n    currentEntry: IHistoryEntry\n  ): IHistoryRecordAndEntry | undefined {\n    for (const record of history) {\n      for (const entry of record.entries) {\n        if (\n          Exercise.eq(currentEntry.exercise, entry.exercise) &&\n          entry.sets.length > 0 &&\n          entry.sets.some((s) => (s.completedReps || 0) > 0)\n        ) {\n          return { record, entry };\n        }\n      }\n    }\n    return undefined;\n  }\n\n  export function calories(historyRecord: IHistoryRecord): number {\n    const timeMs = workoutTime(historyRecord);\n    const minutes = Math.floor(timeMs / 60000);\n    return minutes * 6;\n  }\n\n  export function getHistoricalAmrapSets(\n    history: IHistoryRecord[],\n    currentEntry: IHistoryEntry,\n    nextSet?: ISet\n  ): { last: [ISet, number]; max: [ISet, number] } | undefined {\n    if (!nextSet?.isAmrap) {\n      return undefined;\n    }\n    let last: [ISet, number] | undefined;\n    let max: [ISet, number] | undefined;\n    for (const record of history) {\n      for (const entry of record.entries) {\n        if (Exercise.eq(currentEntry.exercise, entry.exercise)) {\n          for (const set of entry.sets) {\n            if (\n              set.isAmrap &&\n              set.reps === nextSet.reps &&\n              Weight.eq(set.weight ?? Weight.build(0, \"lb\"), nextSet.weight ?? Weight.build(0, \"lb\"))\n            ) {\n              if (last == null) {\n                last = [set, record.startTime];\n              }\n              if (max == null || (set.completedReps || 0) > (max[0].completedReps || 0)) {\n                max = [set, record.startTime];\n              }\n            }\n          }\n        }\n      }\n    }\n    return last != null && max != null ? { last, max } : undefined;\n  }\n\n  export function exportAsCSV(history: IHistoryRecord[], settings: ISettings): (string | number | null)[][] {\n    const lines: (string | number | null)[][] = [\n      [\n        \"Workout DateTime\",\n        \"Program\",\n        \"Day Name\",\n        \"Exercise\",\n        \"Is Warmup Set?\",\n        \"Required Reps\",\n        \"Completed Reps\",\n        \"Is AMRAP?\",\n        \"Required RPE\",\n        \"Completed RPE\",\n        \"Log RPE?\",\n        \"Required Weight Value\",\n        \"Required Weight Unit\",\n        \"Completed Weight Value\",\n        \"Completed Weight Unit\",\n        \"Ask Weight?\",\n        \"Completed Reps Time\",\n        \"Target Muscles\",\n        \"Synergist Muscles\",\n        \"Notes\",\n      ],\n    ];\n\n    for (const historyRecord of history) {\n      for (const entry of historyRecord.entries) {\n        const exercise = Exercise.get(entry.exercise, settings.exercises);\n        for (const warmupSet of entry.warmupSets) {\n          lines.push([\n            historyRecord.date,\n            historyRecord.programName,\n            historyRecord.dayName,\n            Exercise.fullName(exercise, settings),\n            1,\n            warmupSet.reps ?? null,\n            warmupSet.completedReps ?? null,\n            warmupSet.isAmrap ? 1 : 0,\n            warmupSet.rpe ?? null,\n            warmupSet.completedRpe ?? null,\n            warmupSet.logRpe ? 1 : 0,\n            warmupSet.weight?.value ?? null,\n            warmupSet.weight?.unit ?? null,\n            warmupSet.completedWeight?.value ?? null,\n            warmupSet.completedWeight?.unit ?? null,\n            warmupSet.askWeight ? 1 : 0,\n            warmupSet.timestamp != null ? new Date(warmupSet.timestamp || 0).toISOString() : null,\n            Exercise.targetMuscles(exercise, settings).join(\",\"),\n            Exercise.synergistMuscles(exercise, settings).join(\",\"),\n            entry.notes ?? \"\",\n          ]);\n        }\n        for (const set of entry.sets) {\n          lines.push([\n            historyRecord.date,\n            historyRecord.programName,\n            historyRecord.dayName,\n            Exercise.fullName(exercise, settings),\n            0,\n            set.reps ?? null,\n            set.completedReps ?? null,\n            set.isAmrap ? 1 : 0,\n            set.rpe ?? null,\n            set.completedRpe ?? null,\n            set.logRpe ? 1 : 0,\n            set.weight?.value ?? null,\n            set.weight?.unit ?? null,\n            set.completedWeight?.value ?? null,\n            set.completedWeight?.unit ?? null,\n            set.askWeight ? 1 : 0,\n            set.timestamp != null ? new Date(set.timestamp || 0).toISOString() : null,\n            Exercise.targetMuscles(exercise, settings).join(\",\"),\n            Exercise.synergistMuscles(exercise, settings).join(\",\"),\n            entry.notes ?? \"\",\n          ]);\n        }\n      }\n    }\n\n    return lines;\n  }\n\n  export function pauseWorkoutAction(dispatch: IDispatch): void {\n    const lensGetters = { progress: lb<IState>().p(\"progress\").pi(0).get() };\n    SendMessage.toIosAndAndroid({ type: \"pauseWorkout\" });\n    updateState(\n      dispatch,\n      [\n        lbu<IState, typeof lensGetters>(lensGetters)\n          .p(\"progress\")\n          .pi(0)\n          .p(\"intervals\")\n          .recordModify((intervals, getters) => pauseWorkout(getters.progress.intervals)),\n      ],\n      \"Pause workout\"\n    );\n  }\n\n  export function pauseWorkout(intervals?: IIntervals): IIntervals | undefined {\n    if (intervals && !isPaused(intervals)) {\n      const newIntervals = intervals ? ObjectUtils.clone(intervals) : [];\n      let lastInterval = newIntervals[newIntervals.length - 1];\n      if (lastInterval == null) {\n        lastInterval = [Date.now(), undefined];\n        newIntervals.push(lastInterval);\n      }\n      lastInterval[1] = Date.now();\n      return newIntervals;\n    } else {\n      return intervals;\n    }\n  }\n\n  export function resumeWorkoutAction(dispatch: IDispatch, isPlayground: boolean, settings: ISettings): void {\n    updateState(\n      dispatch,\n      [\n        lb<IState>()\n          .p(\"progress\")\n          .pi(0)\n          .recordModify((progress) => {\n            const intervals = resumeWorkout(progress, isPlayground, settings.timers.reminder);\n            return { ...progress, intervals };\n          }),\n      ],\n      \"Resume workout\"\n    );\n  }\n\n  export function isPaused(intervals?: IIntervals): boolean {\n    return intervals ? intervals.length === 0 || intervals[intervals.length - 1][1] != null : false;\n  }\n\n  export function resumeWorkout(\n    historyRecord: IHistoryRecord,\n    isPlayground: boolean,\n    reminder?: number\n  ): IIntervals | undefined {\n    const intervals = historyRecord.intervals;\n    if (!isPlayground && Progress.isCurrent(historyRecord)) {\n      SendMessage.toIosAndAndroid({ type: \"resumeWorkout\", reminder: `${reminder || 0}` });\n    }\n    if (isPaused(intervals)) {\n      const newIntervals = intervals ? ObjectUtils.clone(intervals) : [];\n      newIntervals.push([Date.now(), undefined]);\n      return newIntervals;\n    } else {\n      return intervals;\n    }\n  }\n\n  export function workoutTime(historyRecord: IHistoryRecord): number {\n    const intervals = historyRecord.intervals || [[historyRecord.startTime, historyRecord.endTime || Date.now()]];\n    return intervals.reduce((memo, interval) => {\n      return memo + ((interval[1] || Date.now()) - interval[0]);\n    }, 0);\n  }\n}\n","import { CollectionUtils } from \"../utils/collection\";\nimport { UidFactory } from \"../utils/generator\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { StringUtils } from \"../utils/string\";\nimport { IGraph, IStorage } from \"../types\";\nimport { Weight } from \"../models/weight\";\nimport { PlannerExerciseEvaluator } from \"@client/pages/planner/plannerExerciseEvaluator\";\nimport { basicBeginnerProgram } from \"@client/programs/basicBeginnerProgram\";\nimport { Settings } from \"../models/settings\";\n\nlet latestMigrationVersion: number | undefined;\nexport function getLatestMigrationVersion(): string {\n  if (latestMigrationVersion == null) {\n    latestMigrationVersion = CollectionUtils.sort(\n      Object.keys(migrations).map((v) => parseInt(v, 10)),\n      (a, b) => b - a\n    )[0];\n  }\n  return latestMigrationVersion.toString();\n}\n\nexport const migrations = {\n  \"20240720152051_fix_null_entries_set_weights\": async (\n    client: Window[\"fetch\"],\n    aStorage: IStorage\n  ): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const historyRecord of storage.history) {\n      for (const entry of historyRecord.entries) {\n        for (const set of entry.sets) {\n          if (set.weight?.value == null) {\n            set.weight = Weight.build(0, storage.settings.units || \"lb\");\n          }\n        }\n      }\n    }\n    return storage;\n  },\n  \"20240906074315_add_original_weight_to_sets\": async (\n    client: Window[\"fetch\"],\n    aStorage: IStorage\n  ): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const historyRecord of storage.history) {\n      for (const entry of historyRecord.entries) {\n        for (const set of entry.sets) {\n          set.originalWeight = ObjectUtils.clone(set.weight);\n        }\n        for (const set of entry.warmupSets) {\n          set.originalWeight = ObjectUtils.clone(set.weight);\n        }\n      }\n    }\n    return storage;\n  },\n  \"20241101192254_add_deleted_gyms\": async (client: Window[\"fetch\"], aStorage: IStorage): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    storage.settings.deletedGyms = storage.settings.deletedGyms || [];\n    return storage;\n  },\n  \"20241207120042_add_reminder_timer\": async (client: Window[\"fetch\"], aStorage: IStorage): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    storage.settings.timers.reminder = storage.settings.timers.reminder ?? 900;\n    return storage;\n  },\n  \"20250211073832_switch_to_planner_programs\": async (\n    client: Window[\"fetch\"],\n    aStorage: IStorage\n  ): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    const currentProgram = storage.programs.find((p) => p.id === storage.currentProgramId);\n    if (currentProgram && currentProgram.planner == null) {\n      const plannerProgram = storage.programs.find((p) => p.planner != null) || {\n        ...basicBeginnerProgram,\n        id: UidFactory.uidFromSeed(`planner:${currentProgram.id}`, 8),\n      };\n      storage.programs.push(plannerProgram);\n      storage.currentProgramId = plannerProgram.id;\n      if (typeof window !== \"undefined\" && window.alert != null) {\n        window.alert(\n          `Old-style programs are not supported anymore, your current program now is '${plannerProgram.name}'`\n        );\n      }\n    }\n    return storage;\n  },\n  \"20250305183455_cleanup_custom_exercises\": async (client: Window[\"fetch\"], aStorage: IStorage): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const customExerciseKey of ObjectUtils.keys(storage.settings.exercises)) {\n      const customExercise = storage.settings.exercises[customExerciseKey]!;\n      delete customExercise.defaultEquipment;\n      for (const record of storage.history) {\n        for (const entry of record.entries) {\n          if (entry.exercise.id === customExerciseKey) {\n            entry.exercise = { id: customExerciseKey };\n          }\n        }\n      }\n      for (const key of ObjectUtils.keys(storage.settings.exerciseData)) {\n        if (key.includes(customExerciseKey)) {\n          if (!storage.settings.exerciseData[customExerciseKey]) {\n            const value = storage.settings.exerciseData[key];\n            delete storage.settings.exerciseData[key];\n            storage.settings.exerciseData[customExercise.id] = value;\n          }\n        }\n      }\n    }\n    return storage;\n  },\n  \"20250306192146_fix_empty_graphs\": async (client: Window[\"fetch\"], aStorage: IStorage): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const customExerciseKey of ObjectUtils.keys(storage.settings.exercises)) {\n      if (Array.isArray(storage.settings.graphs)) {\n        for (const graph of storage.settings.graphs) {\n          if (graph.type === \"exercise\" && graph.id.includes(customExerciseKey) && graph.id !== customExerciseKey) {\n            graph.id = customExerciseKey;\n          }\n        }\n      }\n    }\n    return storage;\n  },\n  \"20250322014249_add_is_completed\": async (client: Window[\"fetch\"], aStorage: IStorage): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const record of storage.history) {\n      for (const entry of record.entries) {\n        for (const set of entry.sets) {\n          if (set.completedReps != null) {\n            set.isCompleted = set.isCompleted ?? true;\n            set.completedWeight = set.completedWeight ?? ObjectUtils.clone(set.weight);\n          }\n        }\n      }\n    }\n    return storage;\n  },\n  \"20250329092730_add_workout_settings\": async (client: Window[\"fetch\"], aStorage: IStorage): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    storage.settings.workoutSettings = storage.settings.workoutSettings || {\n      targetType: \"target\",\n    };\n    return storage;\n  },\n  \"20250331001906_migrate_weights_to_completed_weights\": async (\n    client: Window[\"fetch\"],\n    aStorage: IStorage\n  ): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const program of storage.programs) {\n      for (const week of program.planner?.weeks || []) {\n        for (const day of week.days) {\n          const newExerciseStr = PlannerExerciseEvaluator.changeWeightsToCompletedWeights(day.exerciseText);\n          if (newExerciseStr !== day.exerciseText) {\n            day.exerciseText = newExerciseStr;\n          }\n        }\n      }\n    }\n    return storage;\n  },\n  \"20250429083937_add_ids_to_planner_weeks_and_days\": async (\n    client: Window[\"fetch\"],\n    aStorage: IStorage\n  ): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const program of storage.programs) {\n      (program.planner?.weeks || []).forEach((week, weekIndex) => {\n        week.id = week.id || UidFactory.uidFromSeed(`${program.id}:${weekIndex}`, 8);\n        week.days.forEach((day, dayIndex) => {\n          day.id = day.id || UidFactory.uidFromSeed(`${program.id}:${weekIndex}:${dayIndex}`, 8);\n        });\n      });\n    }\n    return storage;\n  },\n  \"20250704123128_add_vtypes_and_restructure_subscriptions\": async (\n    client: Window[\"fetch\"],\n    aStorage: IStorage\n  ): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n\n    for (const program of storage.programs) {\n      program.vtype = program.vtype ?? \"program\";\n      if (program.planner) {\n        program.planner.vtype = program.planner.vtype ?? \"planner\";\n      }\n    }\n    for (const record of storage.history) {\n      record.vtype = record.vtype ?? \"history_record\";\n    }\n    for (const key of ObjectUtils.keys(storage.stats?.weight || {})) {\n      for (const record of storage.stats?.weight[key] || []) {\n        record.vtype = record.vtype ?? \"stat\";\n      }\n    }\n    for (const key of ObjectUtils.keys(storage.stats?.length || {})) {\n      for (const record of storage.stats?.length[key] || []) {\n        record.vtype = record.vtype ?? \"stat\";\n      }\n    }\n    for (const key of ObjectUtils.keys(storage.stats?.percentage || {})) {\n      for (const record of storage.stats?.percentage[key] || []) {\n        record.vtype = record.vtype ?? \"stat\";\n      }\n    }\n    for (const gym of storage.settings.gyms || []) {\n      gym.vtype = gym.vtype ?? \"gym\";\n      for (const equipment of ObjectUtils.values(gym.equipment)) {\n        if (equipment) {\n          equipment.vtype = equipment.vtype ?? \"equipment_data\";\n        }\n      }\n    }\n    for (const exercise of ObjectUtils.values(storage.settings.exercises)) {\n      if (exercise) {\n        exercise.vtype = exercise.vtype ?? \"custom_exercise\";\n      }\n    }\n    if (Array.isArray(storage.settings.graphs || [])) {\n      // @ts-ignore\n      for (const graph of storage.settings.graphs || []) {\n        graph.vtype = graph.vtype ?? \"graph\";\n      }\n    }\n    return storage;\n  },\n  \"20250719104230_add_cloned_at_to_programs\": async (\n    client: Window[\"fetch\"],\n    aStorage: IStorage\n  ): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const program of storage.programs) {\n      program.clonedAt = program.clonedAt ?? Math.abs(StringUtils.hashCode(program.id)) % 1000000;\n    }\n    return storage;\n  },\n  \"20250720120545_make_graphs_atomic_object\": async (\n    client: Window[\"fetch\"],\n    aStorage: IStorage\n  ): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    if (!storage.settings.graphs.vtype) {\n      storage.settings.graphs = {\n        vtype: \"graphs\",\n        graphs: storage.settings.graphs as unknown as IGraph[],\n      };\n    }\n    return storage;\n  },\n  \"20250815161850_add_gyms_if_empty\": async (client: Window[\"fetch\"], aStorage: IStorage): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    if (storage.settings.gyms && storage.settings.gyms.length === 0) {\n      storage.settings.gyms.push({\n        ...Settings.build().gyms[0],\n      });\n    }\n    return storage;\n  },\n  \"20251005115332_migrate_affiliates_to_affiliates_data\": async (\n    client: Window[\"fetch\"],\n    aStorage: IStorage\n  ): Promise<IStorage> => {\n    return JSON.parse(JSON.stringify(aStorage));\n  },\n  \"20251030203130_add_muscle_groups\": async (client: Window[\"fetch\"], aStorage: IStorage): Promise<IStorage> => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    storage.settings.muscleGroups = storage.settings.muscleGroups || { vtype: \"muscle_groups_settings\", data: {} };\n    return storage;\n  },\n  \"20261027100000_remove_trainer_message\": async (client: Window[\"fetch\"], aStorage: IStorage): Promise<IStorage> => {\n    // The trainer note is gone. The key is no longer in `TSettings` or in the sync units.\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    delete (storage.settings as unknown as Record<string, unknown>).trainerMessage;\n    return storage;\n  },\n  \"20261103110000_name_gym_equipment\": async (client: Window[\"fetch\"], aStorage: IStorage): Promise<IStorage> => {\n    // A local copy of the 11 fixed names. Do not call `equipmentName()`: a later change must not alter this migration.\n    const fixedNames: Record<string, string> = {\n      barbell: \"Barbell\",\n      cable: \"Cable\",\n      dumbbell: \"Dumbbell\",\n      smith: \"Smith Machine\",\n      band: \"Band\",\n      kettlebell: \"Kettlebell\",\n      bodyweight: \"Bodyweight\",\n      leverageMachine: \"Leverage Machine\",\n      medicineball: \"Medicine Ball\",\n      ezbar: \"EZ Bar\",\n      trapbar: \"Trap Bar\",\n    };\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const gym of storage.settings.gyms || []) {\n      for (const id of Object.keys(gym.equipment || {})) {\n        const entry = gym.equipment[id];\n        if (entry != null && (typeof entry.name !== \"string\" || entry.name.trim() === \"\")) {\n          entry.name = Object.prototype.hasOwnProperty.call(fixedNames, id) ? fixedNames[id] : \"Custom equipment\";\n        }\n      }\n    }\n    return storage;\n  },\n  \"20261103120000_variation_keys\": async (client: Window[\"fetch\"], aStorage: IStorage): Promise<IStorage> => {\n    // Only the version moves. The server applies the exercise key map on each sync, so an old cached client must\n    // restart before it can sync.\n    return JSON.parse(JSON.stringify(aStorage));\n  },\n  \"20261102100000_remove_custom_exercise_default_sets\": async (\n    client: Window[\"fetch\"],\n    aStorage: IStorage\n  ): Promise<IStorage> => {\n    // Custom exercises have no default sets any more. The key is no longer in `TCustomExercise`.\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const exercise of Object.values(storage.settings.exercises || {})) {\n      delete (exercise as unknown as Record<string, unknown> | undefined)?.defaultSets;\n    }\n    return storage;\n  },\n};\n","import { IState } from \"./state\";\nimport { dequal } from \"dequal\";\nimport { Progress } from \"./progress\";\nimport { IDayData, IStatsKey } from \"../types\";\nimport { IPlannerExerciseState, IPlannerState } from \"@client/pages/planner/models/types\";\nimport { Program } from \"./program\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { CollectionUtils } from \"../utils/collection\";\n\nexport type ITab = \"home\" | \"program\" | \"workout\" | \"graphs\" | \"me\";\n\nexport type IScreenData =\n  | { name: \"welcome\"; params?: Record<string, never> }\n  | { name: \"main\"; params?: { historyRecordId?: number } }\n  | { name: \"settings\"; params?: Record<string, never> }\n  | { name: \"timers\"; params?: Record<string, never> }\n  | { name: \"plates\"; params?: Record<string, never> }\n  | { name: \"programs\"; params?: Record<string, never> }\n  | { name: \"progress\"; params?: { id?: number } }\n  | { name: \"graphs\"; params?: Record<string, never> }\n  | { name: \"finishDay\"; params: { historyRecordId: number } }\n  | { name: \"muscles\"; params?: Record<string, never> }\n  | { name: \"muscleGroups\"; params?: Record<string, never> }\n  | { name: \"stats\"; params?: Record<string, never> }\n  | { name: \"units\"; params?: { setup?: boolean } }\n  | { name: \"editProgram\"; params?: { plannerState: IPlannerState } }\n  | {\n      name: \"editProgramExercise\";\n      params?: { key: string; dayData: Required<IDayData>; plannerState: IPlannerExerciseState };\n    }\n  | { name: \"measurements\"; params?: { key: IStatsKey } }\n  | { name: \"exerciseStats\"; params?: Record<string, never> }\n  | { name: \"onerms\"; params?: Record<string, never> }\n  | { name: \"setupequipment\"; params?: { setup?: boolean } }\n  | { name: \"programPreview\"; params?: Record<string, never> }\n  | { name: \"howToInstall\"; params?: { setup?: boolean } }\n  | { name: \"tour\"; params?: { step?: number } }\n  | { name: \"messages\"; params?: Record<string, never> };\n\nexport type IScreen = IScreenData[\"name\"];\nexport type IScreenStack = IScreenData[];\nexport type IScreenParams<T extends IScreen> = Extract<IScreenData, { name: T }>[\"params\"];\n\nexport namespace Screen {\n  // The screens a client with no program can open. Other screens go Home (the \"No Program Assigned\" view).\n  const SCREENS_WITHOUT_PROGRAM: IScreen[] = [\n    \"welcome\",\n    \"units\",\n    \"programs\",\n    \"programPreview\",\n    \"setupequipment\",\n    \"howToInstall\",\n    \"tour\",\n    \"messages\",\n    \"main\",\n    \"settings\",\n    \"timers\",\n    \"plates\",\n    \"graphs\",\n    \"measurements\",\n    \"stats\",\n    \"muscleGroups\",\n  ];\n\n  export function isAllowedWithoutProgram(screen: IScreen): boolean {\n    return SCREENS_WITHOUT_PROGRAM.indexOf(screen) !== -1;\n  }\n\n  export function currentName(stack: IScreenStack): IScreen {\n    return stack[stack.length - 1].name;\n  }\n\n  export function current(stack: IScreenStack): IScreenData {\n    return stack[stack.length - 1];\n  }\n\n  export function push<T extends IScreenData[\"name\"]>(\n    stack: IScreenStack,\n    name: T,\n    params?: IScreenParams<T>\n  ): IScreenStack {\n    const newEntry: IScreenData = { name, ...(params ? { params } : {}) } as Extract<IScreenData, { name: T }>;\n    return [...stack, newEntry];\n  }\n\n  export function updateParams<T extends IScreen>(stack: IScreenStack, params?: IScreenParams<T>): IScreenStack {\n    const topStack = stack[stack.length - 1];\n    const newTopStack = { ...topStack, params };\n    return [...stack.slice(0, stack.length - 1), newTopStack] as IScreenStack;\n  }\n\n  export function pull(stack: IScreenStack): IScreenStack {\n    return stack.length > 1 ? [...stack].slice(0, stack.length - 1) : stack;\n  }\n\n  export function previous(stack: IScreenStack): IScreen | undefined {\n    return stack[stack.length - 2]?.name;\n  }\n\n  export function enablePtr(stack: IScreenStack): boolean {\n    const curr = Screen.currentName(stack);\n    return [\"welcome\", \"tour\", \"finishDay\", \"programs\", \"measurements\", \"messages\"].indexOf(curr) === -1;\n  }\n\n  export function shouldConfirmNavigation(state: IState, isPush: boolean): string | undefined {\n    const progress = Progress.getProgress(state);\n    if (progress && !Progress.isCurrent(progress)) {\n      const oldHistoryRecord = state.storage.history.find((hr) => hr.id === progress.id);\n      if (oldHistoryRecord != null && !dequal(oldHistoryRecord, progress)) {\n        return \"Are you sure? Changes won't be saved.\";\n      }\n    }\n\n    const currentScreen = Screen.current(state.screenStack);\n    const screens = isPush ? [...state.screenStack].reverse() : [currentScreen];\n    for (const screen of screens) {\n      if (screen.name === \"editProgram\") {\n        const editProgramState = screen.params?.plannerState;\n        if (editProgramState) {\n          const currentProgram = Program.getProgram(state, editProgramState.current.program.id);\n          if (currentProgram != null && currentProgram.planner && editProgramState.current.program.planner) {\n            const oldCleanedProgram = Program.cleanPlannerProgram(currentProgram);\n            const newCleanedProgram = Program.cleanPlannerProgram(editProgramState.current.program);\n            if (!ObjectUtils.isEqual(oldCleanedProgram.planner!, newCleanedProgram.planner!)) {\n              return \"Are you sure? Your program changes won't be saved.\";\n            }\n          }\n        }\n      }\n    }\n\n    if (currentScreen.name === \"editProgramExercise\") {\n      const editProgramExerciseState = currentScreen.params?.plannerState;\n      if (editProgramExerciseState) {\n        const editProgramScreen = CollectionUtils.findBy(state.screenStack, \"name\", \"editProgram\");\n        if (editProgramScreen != null && editProgramScreen.name === \"editProgram\") {\n          const editProgramState = editProgramScreen.params?.plannerState;\n          if (\n            editProgramState &&\n            editProgramState.current.program.planner &&\n            editProgramExerciseState.current.program.planner\n          ) {\n            if (\n              !ObjectUtils.isEqual(\n                editProgramExerciseState.current.program.planner,\n                editProgramState.current.program.planner\n              )\n            ) {\n              return \"Are you sure? Your program exercise changes won't be saved.\";\n            }\n          }\n        } else {\n          const currentProgram = Program.getProgram(state, editProgramExerciseState.current.program.id);\n          if (currentProgram != null && currentProgram.planner && editProgramExerciseState.current.program.planner) {\n            if (!ObjectUtils.isEqual(currentProgram.planner, editProgramExerciseState.current.program.planner)) {\n              return \"Are you sure? Your program exercise changes won't be saved.\";\n            }\n          }\n        }\n      }\n    }\n\n    return undefined;\n  }\n\n  export function isSameTab(prev: IScreen, next: IScreen): boolean {\n    return tab(prev) === tab(next);\n  }\n\n  export function tab(screen: IScreen): ITab {\n    switch (screen) {\n      case \"main\": {\n        return \"home\";\n      }\n      case \"settings\": {\n        return \"me\";\n      }\n      case \"timers\": {\n        return \"me\";\n      }\n      case \"plates\": {\n        return \"me\";\n      }\n      case \"programs\": {\n        return \"program\";\n      }\n      case \"progress\": {\n        return \"workout\";\n      }\n      case \"graphs\": {\n        return \"graphs\";\n      }\n      case \"finishDay\": {\n        return \"workout\";\n      }\n      case \"muscles\": {\n        return \"program\";\n      }\n      case \"muscleGroups\": {\n        return \"me\";\n      }\n      case \"stats\": {\n        return \"me\";\n      }\n      case \"editProgram\": {\n        return \"program\";\n      }\n      case \"editProgramExercise\": {\n        return \"program\";\n      }\n      case \"measurements\": {\n        return \"me\";\n      }\n      case \"exerciseStats\": {\n        return \"me\";\n      }\n      case \"programPreview\": {\n        return \"program\";\n      }\n      case \"howToInstall\": {\n        return \"me\";\n      }\n      case \"welcome\": {\n        return \"program\";\n      }\n      case \"tour\": {\n        return \"program\";\n      }\n      case \"onerms\": {\n        return \"program\";\n      }\n      case \"setupequipment\": {\n        return \"program\";\n      }\n      case \"units\": {\n        return \"program\";\n      }\n      case \"messages\": {\n        // It opens from the Home top bar.\n        return \"home\";\n      }\n    }\n  }\n}\n","import { Exercise, allExercisesList, warmupValues } from \"./exercise\";\nimport { ScriptRunner } from \"../parser\";\nimport { IScriptBindings, Progress } from \"./progress\";\nimport { lb } from \"lens-shmens\";\nimport { IDispatch } from \"@client/ducks/types\";\nimport { IEither } from \"../utils/types\";\nimport { Weight } from \"./weight\";\nimport { UidFactory } from \"../utils/generator\";\nimport { IState, updateState } from \"./state\";\nimport {\n  IProgram,\n  IStorage,\n  IProgramExercise,\n  ISettings,\n  IHistoryEntry,\n  IExerciseType,\n  ILevelChange,\n  IProgramState,\n  ISet,\n  IHistoryRecord,\n  IWeight,\n  IProgramExerciseVariation,\n  IUnit,\n  IDayData,\n  IExerciseData,\n  IStats,\n  IShortDayData,\n} from \"../types\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { Exporter } from \"@client/utils/exporter\";\nimport { DateUtils } from \"../utils/date\";\nimport { ICustomExercise, IProgramContentSettings, IPlannerProgram, IPercentage } from \"../types\";\nimport { ProgramExercise } from \"./programExercise\";\nimport { Thunk } from \"@client/ducks/thunks\";\nimport { getLatestMigrationVersion } from \"../migrations/migrations\";\nimport { StringUtils } from \"../utils/string\";\nimport { ILiftoscriptEvaluatorUpdate } from \"../liftoscriptEvaluator\";\nimport { ProgramToPlanner } from \"./programToPlanner\";\nimport {\n  IExportedPlannerProgram,\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseBlock,\n  IPlannerProgramExerciseWithType,\n} from \"@client/pages/planner/models/types\";\nimport memoize from \"micro-memoize\";\nimport { PlannerProgram } from \"@client/pages/planner/models/plannerProgram\";\nimport { PlannerEvaluator, IByExercise, IByTag } from \"@client/pages/planner/plannerEvaluator\";\nimport { PP } from \"./pp\";\nimport { ExerciseLevel } from \"./exerciseLevel\";\nimport { PlannerProgramExercise } from \"@client/pages/planner/models/plannerProgramExercise\";\nimport { CollectionUtils } from \"../utils/collection\";\nimport { PlannerSyntaxError } from \"@client/pages/planner/plannerExerciseEvaluator\";\nimport { EditProgram } from \"./editProgram\";\nimport { ProgramSet } from \"./programSet\";\nimport { Stats } from \"./stats\";\nimport { LayeredText } from \"./layeredText\";\n\ndeclare let __HOST__: string;\n\nexport interface IExportedProgram {\n  program: IProgram;\n  customExercises: Partial<Record<string, ICustomExercise>>;\n  version: string;\n  settings: IProgramContentSettings;\n}\n\nexport interface IEvaluatedProgramWeek {\n  name: string;\n  description?: string;\n  notes?: string;\n  loop?: \"start\";\n  days: IEvaluatedProgramDay[];\n}\n\nexport interface IEvaluatedProgramDay {\n  name: string;\n  dayData: Required<IDayData>;\n  description?: string;\n  notes?: string;\n  exercises: IPlannerProgramExercise[];\n}\n\nexport interface IEvaluatedProgramError {\n  error: PlannerSyntaxError;\n  dayData: Required<IDayData>;\n}\n\nexport interface IEvaluatedProgram {\n  type: \"evaluatedProgram\";\n  id: string;\n  planner: IPlannerProgram;\n  name: string;\n  nextDay: number;\n  errors: IEvaluatedProgramError[];\n  weeks: IEvaluatedProgramWeek[];\n  states: IByTag<IProgramState>;\n}\nexport type IEProgram = IProgram | IEvaluatedProgram;\n\nexport type IAppliedLevelChange = ILevelChange & { programExerciseKey: string };\n\nexport type IProgramMode = \"planner\" | \"update\";\nexport const emptyProgramId = \"emptyprogram\";\n\nfunction isEvaluatedProgram(program: IEProgram): program is IEvaluatedProgram {\n  return \"type\" in program && program.type === \"evaluatedProgram\";\n}\n\nexport function ev(program: IEProgram, settings: ISettings): IEvaluatedProgram {\n  if (isEvaluatedProgram(program)) {\n    return program;\n  } else {\n    return Program.evaluate(program, settings);\n  }\n}\n\nexport namespace Program {\n  export function getProgram(state: IState, id?: string): IProgram | undefined {\n    if (id === emptyProgramId) {\n      return createEmptyProgram();\n    } else {\n      return state.storage.programs.find((p) => p.id === id);\n    }\n  }\n\n  export function getFullProgram(state: IState, id?: string): IProgram | undefined {\n    const program = getProgram(state, id);\n    if (program) {\n      return fullProgram(program, state.storage.settings);\n    } else {\n      return undefined;\n    }\n  }\n\n  export const fullProgram = memoize(\n    (program: IProgram, settings: ISettings): IProgram => {\n      return program;\n    },\n    { maxSize: 10 }\n  );\n\n  export function cleanPlannerProgram(program: IProgram): IProgram {\n    const planner = program.planner;\n    if (planner != null) {\n      const newPlanner = {\n        ...planner,\n        weeks: planner.weeks.map((w) => ({\n          ...ObjectUtils.omit(w, [\"id\"]),\n          days: w.days.map((d) => ({\n            ...ObjectUtils.omit(d, [\"id\"]),\n          })),\n        })),\n      };\n      return {\n        ...program,\n        planner: newPlanner,\n        exercises: [],\n        days: [],\n        weeks: [],\n        deletedDays: [],\n        deletedWeeks: [],\n        deletedExercises: [],\n      };\n    } else {\n      return program;\n    }\n  }\n\n  export function isEmpty(program?: IProgram | IEvaluatedProgram): boolean {\n    return program?.id === emptyProgramId;\n  }\n\n  export function getProgramExercisesFromExerciseType(\n    program: IEvaluatedProgram,\n    exerciseType: IExerciseType\n  ): IPlannerProgramExercise[] {\n    return Program.getAllUsedProgramExercises(program).filter((p) => Exercise.eq(p.exerciseType, exerciseType));\n  }\n\n  export function getProgramIndex(state: IState, id: string): number {\n    return state.storage.programs.findIndex((p) => p.id === id);\n  }\n\n  export function getCurrentProgram(storage: IStorage): IProgram | undefined {\n    return storage.programs.filter((p) => p.id === storage.currentProgramId)[0];\n  }\n\n  export function nextHistoryEntry(\n    program: IEvaluatedProgram,\n    dayData: IDayData,\n    programExercise: IPlannerProgramExerciseWithType,\n    stats: IStats,\n    settings: ISettings\n  ): IHistoryEntry {\n    const exercise = programExercise.exerciseType;\n    const programSets = PlannerProgramExercise.currentEvaluatedSetVariation(programExercise)?.sets;\n    const warmupSets = PlannerProgramExercise.programWarmups(programExercise, settings);\n    const sets: ISet[] = [];\n    for (let i = 0; i < programSets.length; i++) {\n      const programSet = programSets[i];\n      const minReps =\n        programSet.minrep != null && programSet.minrep !== programSet.maxrep ? programSet.minrep : undefined;\n      const weight = ProgramSet.getEvaluatedWeight(programSet, programExercise.exerciseType, settings);\n      sets.push({\n        id: UidFactory.generateUid(6),\n        reps: programSet.maxrep,\n        minReps,\n        weight,\n        isUnilateral: Exercise.getIsUnilateral(exercise, settings),\n        rpe: programSet.rpe,\n        timer: programSet.timer,\n        setTimer: programSet.setTimer,\n        isOverflowSetTimer: programSet.isOverflowSetTimer,\n        isAuto: programSet.isAuto,\n        logRpe: programSet.logRpe,\n        askWeight: programSet.askWeight,\n        originalWeight: programSet.weight,\n        isAmrap: programSet.isAmrap,\n        label: programSet.label,\n        isCompleted: false,\n        programSetIndex: i,\n      });\n    }\n\n    const block = Program.getEntryBlock(program, programExercise);\n\n    const entry: IHistoryEntry = {\n      id: UidFactory.generateUid(6),\n      exercise: exercise,\n      programExerciseId: programExercise.key,\n      sets,\n      superset: programExercise.superset?.name,\n      block,\n      warmupSets: Exercise.getWarmupSets(exercise, sets[0]?.weight, settings, warmupSets),\n    };\n    const newEntry = Progress.runUpdateScriptForEntry(\n      entry,\n      dayData,\n      programExercise,\n      program.states,\n      -1,\n      settings,\n      stats\n    );\n    return newEntry;\n  }\n\n  export function stateValue(\n    state: IProgramState,\n    key: string,\n    value?: string\n  ): number | IWeight | IPercentage | undefined {\n    if (value == null) {\n      return undefined;\n    }\n    const numValue = parseFloat(value);\n    const oldValue = state[key];\n    if (oldValue == null) {\n      return numValue;\n    } else if (Weight.is(oldValue)) {\n      return Weight.build(numValue, oldValue.unit);\n    } else if (Weight.isPct(oldValue)) {\n      return Weight.buildPct(numValue);\n    } else {\n      return numValue;\n    }\n  }\n\n  export function nextHistoryRecord(\n    aProgram: IProgram,\n    settings: ISettings,\n    stats: IStats,\n    dayIndex?: number\n  ): IHistoryRecord {\n    const program = Program.evaluate(aProgram, settings);\n    const day = Math.max(1, Math.min(numberOfDays(program), Math.max(1, (dayIndex || program.nextDay) ?? 0)));\n    const dayData = getDayData(program, day);\n    const { week, dayInWeek } = dayData;\n\n    const fullDayName = getDayName(program, day);\n    const now = Date.now();\n    const programDay = Program.getProgramDay(program, day);\n    const dayExercises = programDay ? Program.getProgramDayUsedExercises(programDay) : [];\n    const sortedDayExercises = CollectionUtils.sortBy(dayExercises, \"order\");\n    const entries = sortedDayExercises.map((exercise) => {\n      return nextHistoryEntry(program, dayData, exercise, stats, settings);\n    });\n    return {\n      vtype: \"history_record\",\n      id: 0,\n      date: new Date().toISOString(),\n      programId: program.id,\n      programName: program.name,\n      intervals: [],\n      day,\n      week,\n      dayInWeek,\n      dayName: fullDayName,\n      startTime: now,\n      updatedAt: now,\n      entries,\n      ui: {},\n    };\n  }\n\n  export function getSupersetGroups(\n    evaluatedProgram: IEvaluatedProgram,\n    dayData: IShortDayData,\n    excludeExercise?: IPlannerProgramExercise\n  ): Partial<Record<string, IPlannerProgramExerciseWithType[]>> {\n    const programDay = Program.getProgramDay(\n      evaluatedProgram,\n      Program.getDayNumber(evaluatedProgram, dayData.week, dayData.dayInWeek)\n    );\n    const dayExercises = programDay ? Program.getProgramDayUsedExercises(programDay) : [];\n    const groups: Partial<Record<string, IPlannerProgramExerciseWithType[]>> = {};\n    for (const exercise of dayExercises) {\n      if (exercise.superset != null) {\n        if (!groups[exercise.superset.name]) {\n          groups[exercise.superset.name] = [];\n        }\n        if (exercise.key !== excludeExercise?.key) {\n          groups[exercise.superset.name]!.push(exercise);\n        }\n      }\n    }\n    return groups;\n  }\n\n  export function getBlock(\n    evaluatedProgram: IEvaluatedProgram,\n    plannerExercise: IPlannerProgramExercise\n  ): IPlannerProgramExerciseBlock | undefined {\n    if (plannerExercise.superset == null) {\n      return plannerExercise.block;\n    }\n    return Program.getSupersetExercises(evaluatedProgram, plannerExercise).find((e) => e.block != null)?.block;\n  }\n\n  // The block config a history entry carries. The evaluator's `name` stays out of history.\n  export function getEntryBlock(\n    evaluatedProgram: IEvaluatedProgram,\n    plannerExercise: IPlannerProgramExercise\n  ): IHistoryEntry[\"block\"] {\n    const block = Program.getBlock(evaluatedProgram, plannerExercise);\n    if (block == null) {\n      return undefined;\n    }\n    const { name: _name, ...rest } = block;\n    return rest;\n  }\n\n  export function getSupersetExercises(\n    evalutedProgram: IEvaluatedProgram,\n    plannerExercise: IPlannerProgramExercise\n  ): IPlannerProgramExerciseWithType[] {\n    if (plannerExercise.superset == null) {\n      return [];\n    }\n    const dayData = plannerExercise.dayData;\n    const programDay = Program.getProgramDay(evalutedProgram, dayData.day);\n    const dayExercises = programDay ? Program.getProgramDayUsedExercises(programDay) : [];\n    const result = dayExercises.filter((e) => e.superset?.name === plannerExercise.superset?.name);\n    return result;\n  }\n\n  export function runExerciseFinishDayScript(\n    entry: IHistoryEntry,\n    dayData: IDayData,\n    settings: ISettings,\n    state: IProgramState,\n    otherStates: IByExercise<IProgramState>,\n    programExercise: IPlannerProgramExercise,\n    stats: IStats,\n    userPromptedStateVars?: IProgramState\n  ): IEither<\n    {\n      state: IProgramState;\n      bindings: IScriptBindings;\n      updates: ILiftoscriptEvaluatorUpdate[];\n      prints: [number | IPercentage | IWeight][];\n    },\n    string\n  > {\n    const script = PlannerProgramExercise.getProgressScript(programExercise) || \"\";\n    const setVariationIndex = PlannerProgramExercise.currentEvaluatedSetVariationIndex(programExercise);\n    const descriptionIndex = PlannerProgramExercise.currentDescriptionIndex(programExercise);\n\n    const bindings = Progress.createScriptBindings(\n      dayData,\n      entry,\n      settings,\n      programExercise.evaluatedSetVariations[setVariationIndex]?.sets.length ?? 0,\n      Stats.getCurrentMovingAverageBodyweight(stats, settings),\n      undefined,\n      setVariationIndex + 1,\n      descriptionIndex + 1\n    );\n    const fns = Progress.createScriptFunctions(settings);\n    let updates: ILiftoscriptEvaluatorUpdate[] = [];\n    const newState: IProgramState = ObjectUtils.clone({ ...state, ...userPromptedStateVars });\n\n    const fnContext = { exerciseType: entry.exercise, unit: settings.units, prints: [] };\n    try {\n      const runner = new ScriptRunner(\n        script,\n        newState,\n        ObjectUtils.clone(otherStates),\n        bindings,\n        fns,\n        settings.units,\n        fnContext,\n        \"planner\"\n      );\n      runner.execute();\n      updates = runner.getUpdates();\n    } catch (e) {\n      if (e instanceof SyntaxError) {\n        return { success: false, error: e.message };\n      } else {\n        throw e;\n      }\n    }\n\n    const stateDiff = { ...entry.state, ...ObjectUtils.diff(state, newState) };\n    return { success: true, data: { state: stateDiff, updates, bindings, prints: fnContext.prints } };\n  }\n\n  export function runFinishDayScript(\n    programExercise: IPlannerProgramExercise,\n    program: IEvaluatedProgram,\n    dayData: IDayData,\n    entry: IHistoryEntry,\n    settings: ISettings,\n    stats: IStats,\n    userPromptedStateVars?: IProgramState\n  ): IEither<\n    {\n      state: IProgramState;\n      otherStates: Record<number, IProgramState>;\n      updates: ILiftoscriptEvaluatorUpdate[];\n      bindings: IScriptBindings;\n    },\n    string\n  > {\n    const state = PlannerProgramExercise.getState(programExercise);\n    const setVariationIndex = PlannerProgramExercise.currentEvaluatedSetVariationIndex(programExercise);\n    const descriptionIndex = PlannerProgramExercise.currentDescriptionIndex(programExercise);\n    const bindings = Progress.createScriptBindings(\n      dayData,\n      entry,\n      settings,\n      programExercise.evaluatedSetVariations[setVariationIndex]?.sets.length ?? 0,\n      Stats.getCurrentMovingAverageBodyweight(stats, settings),\n      undefined,\n      setVariationIndex + 1,\n      descriptionIndex + 1\n    );\n    if (entry.levelChange?.cause === \"manual\") {\n      bindings.manualLevel = entry.levelChange.direction === \"up\" ? 1 : -1;\n    }\n    const fns = Progress.createScriptFunctions(settings);\n\n    const newState: IProgramState = {\n      ...state,\n      ...userPromptedStateVars,\n    };\n    const otherStates = ObjectUtils.clone(program.states);\n\n    const script = PlannerProgramExercise.getProgressScript(programExercise) || \"\";\n    let updates: ILiftoscriptEvaluatorUpdate[] = [];\n    try {\n      const runner = new ScriptRunner(\n        script,\n        newState,\n        otherStates,\n        bindings,\n        fns,\n        settings.units,\n        { exerciseType: programExercise.exerciseType, unit: settings.units, prints: [] },\n        \"planner\"\n      );\n      runner.execute();\n      updates = runner.getUpdates();\n    } catch (e) {\n      if (e instanceof SyntaxError) {\n        return { success: false, error: e.message };\n      } else {\n        throw e;\n      }\n    }\n\n    const diffOtherStates = ObjectUtils.keys(otherStates).reduce<IByTag<IProgramState>>((memo, key) => {\n      if (!ObjectUtils.isEqual(otherStates[key], program.states[key])) {\n        const diffState = ObjectUtils.keys(otherStates[key]).reduce<IProgramState>((memo2, key2) => {\n          if (!Weight.eq(otherStates[key][key2], program.states[key][key2])) {\n            memo2[key2] = otherStates[key][key2];\n          }\n          return memo2;\n        }, {});\n        memo[key] = diffState;\n      }\n      return memo;\n    }, {});\n\n    const stateDiff = ObjectUtils.diff(state, newState);\n    return { success: true, data: { state: stateDiff, otherStates: diffOtherStates, updates, bindings } };\n  }\n\n  export function dayAverageTimeMs(program: IEvaluatedProgram, settings: ISettings): number {\n    const dayApproxTimes: number[] = [];\n    for (const week of program.weeks) {\n      for (const day of week.days) {\n        dayApproxTimes.push(dayApproxTimeMs(day, settings));\n      }\n    }\n    return dayApproxTimes.reduce((acc, t) => acc + t, 0) / dayApproxTimes.length;\n  }\n\n  export function dayApproxTimeMs(programDay: IEvaluatedProgramDay, settings: ISettings): number {\n    return Program.getProgramDayUsedExercises(programDay).reduce((acc, e) => {\n      return acc + ProgramExercise.approxTimeMs(e, settings);\n    }, 0);\n  }\n\n  export function getProgramExerciseForKeyAndShortDayData(\n    program: IEvaluatedProgram,\n    dayData: IShortDayData,\n    key: string\n  ): IPlannerProgramExerciseWithType | undefined {\n    const day = Program.getDayNumber(program, dayData.week, dayData.dayInWeek);\n    return getProgramExerciseForKeyAndDay(program, day, key);\n  }\n\n  export function getProgramExerciseForKeyAndDay(\n    program: IEvaluatedProgram,\n    day: number,\n    key: string\n  ): IPlannerProgramExerciseWithType | undefined {\n    const programDay = program ? Program.getProgramDay(program, day) : undefined;\n    const dayExercises = programDay ? Program.getProgramDayUsedExercises(programDay) : [];\n    let programExercise = dayExercises.find((pe) => pe.key === key);\n    if (programExercise == null) {\n      const allExercises = program ? Program.getAllProgramExercisesWithType(program) : [];\n      programExercise = allExercises.find((pe) => pe.key === key);\n      if (programExercise != null) {\n        programExercise = { ...programExercise, dayData: getDayData(program, day) };\n      }\n    }\n    return programExercise;\n  }\n\n  export function runAllFinishDayScripts(\n    program: IProgram,\n    progress: IHistoryRecord,\n    stats: IStats,\n    settings: ISettings\n  ): { program: IProgram; exerciseData: IExerciseData; levelChanges: IAppliedLevelChange[] } {\n    const exerciseData: IExerciseData = {};\n    const newEvaluatedProgram = Program.forceEvaluate(program, settings);\n    const dayData = Progress.getDayData(progress);\n    const programDay = Program.getProgramDay(newEvaluatedProgram, progress.day);\n    if (!programDay) {\n      return { program, exerciseData, levelChanges: [] };\n    }\n    // Level steps wanted by the scripts, one total per program exercise key (D10: first entry of the key only).\n    const wantedSteps: Record<string, { steps: number; exerciseType: IExerciseType; cause: \"auto\" | \"manual\" }> = {};\n    // The manual step of the client (R5): the first entry of each key with a manual `levelChange`. A suppressed entry\n    // does not level. The script sees it as `manualLevel`, and its own `level` updates for that key are dropped (A9).\n    const manualChanges: Record<string, ILevelChange> = {};\n    for (const entry of progress.entries) {\n      if (\n        entry != null &&\n        !entry.isSuppressed &&\n        entry.programExerciseId != null &&\n        entry.levelChange?.cause === \"manual\" &&\n        manualChanges[entry.programExerciseId] == null\n      ) {\n        manualChanges[entry.programExerciseId] = entry.levelChange;\n      }\n    }\n    for (const entry of progress.entries) {\n      if (entry != null && !entry.isSuppressed && entry.sets.some((s) => s.isCompleted)) {\n        const programExercise =\n          program && entry.programExerciseId\n            ? Program.getProgramExerciseForKeyAndDay(newEvaluatedProgram, dayData.day, entry.programExerciseId)\n            : undefined;\n        if (programExercise) {\n          const newStateResult = Program.runFinishDayScript(\n            programExercise,\n            newEvaluatedProgram,\n            dayData,\n            manualChanges[programExercise.key] != null\n              ? { ...entry, levelChange: manualChanges[programExercise.key] }\n              : entry,\n            settings,\n            stats,\n            progress.userPromptedStateVars?.[programExercise.key]\n          );\n          if (newStateResult.success) {\n            const { state, updates, bindings, otherStates } = newStateResult.data;\n            const exerciseKey = Exercise.toKey(entry.exercise);\n            const onerm = Exercise.onerm(entry.exercise, settings);\n            if (!Weight.eq(bindings.rm1, onerm)) {\n              exerciseData[exerciseKey] = { rm1: Weight.roundTo005(bindings.rm1) };\n            }\n            PP.iterate2(newEvaluatedProgram.weeks, (exercise) => {\n              if (exercise.key === programExercise.key && exercise.progress) {\n                exercise.progress.state = { ...exercise.progress.state, ...entry.state, ...state };\n              }\n            });\n            ProgramExercise.applyVariables(\n              programExercise.key,\n              newEvaluatedProgram,\n              updates,\n              settings,\n              entry.sets.map((s) => (s.isCompleted ? s.completedWeight : undefined))\n            );\n            if (wantedSteps[programExercise.key] == null) {\n              wantedSteps[programExercise.key] = {\n                steps: levelSteps(updates),\n                exerciseType: programExercise.exerciseType,\n                cause: \"auto\",\n              };\n            }\n            for (const key of ObjectUtils.keys(otherStates || {})) {\n              PP.iterate2(newEvaluatedProgram.weeks, (exercise) => {\n                if (exercise.tags?.includes(Number(key)) && exercise.progress) {\n                  exercise.progress.state = { ...exercise.progress.state, ...otherStates[key] };\n                }\n              });\n            }\n          } else {\n            alert(`There was an error executing progress script: ${newStateResult.error}`);\n          }\n        }\n      }\n    }\n    // The separate pass for the manual step. It covers entries with no logged set and programs with no script.\n    for (const programExerciseKey of ObjectUtils.keys(manualChanges)) {\n      const programExercise = Program.getProgramExerciseForKeyAndDay(\n        newEvaluatedProgram,\n        dayData.day,\n        programExerciseKey\n      );\n      if (programExercise?.exerciseType != null) {\n        wantedSteps[programExerciseKey] = {\n          steps: manualChanges[programExerciseKey].direction === \"up\" ? 1 : -1,\n          exerciseType: programExercise.exerciseType,\n          cause: \"manual\",\n        };\n      }\n    }\n    const theNextDay = Program.nextDay(newEvaluatedProgram, progress.day);\n    let newPlanner = new ProgramToPlanner(newEvaluatedProgram, settings).convertToPlanner();\n    const levelChanges: IAppliedLevelChange[] = [];\n    for (const programExerciseKey of ObjectUtils.keys(wantedSteps)) {\n      const { steps, exerciseType, cause } = wantedSteps[programExerciseKey];\n      const change = buildLevelChange(newPlanner, programExerciseKey, exerciseType, steps, settings, cause);\n      if (change != null) {\n        newPlanner = PlannerProgram.replaceExercise(newPlanner, programExerciseKey, undefined, change.to, settings);\n        levelChanges.push({ ...change, programExerciseKey });\n      }\n    }\n    const newProgram = ObjectUtils.clone(program);\n    newProgram.nextDay = theNextDay;\n    newProgram.planner = newPlanner;\n\n    return {\n      program: newProgram,\n      exerciseData,\n      levelChanges,\n    };\n  }\n\n  // The signed total of the `level` updates of one script run.\n  function levelSteps(updates: ILiftoscriptEvaluatorUpdate[]): number {\n    let total = 0;\n    for (const update of updates) {\n      if (update.type === \"level\") {\n        total += update.value.op === \"-=\" ? -update.value.value : update.value.value;\n      }\n    }\n    return total;\n  }\n\n  // The level change to apply for one key, or undefined when nothing moves: no chain, an end of the chain (D11, D12),\n  // or the target exercise id is already in the program under another key (D22).\n  function buildLevelChange(\n    planner: IPlannerProgram,\n    programExerciseKey: string,\n    exerciseType: IExerciseType | undefined,\n    steps: number,\n    settings: ISettings,\n    cause: \"auto\" | \"manual\" = \"auto\"\n  ): Omit<IAppliedLevelChange, \"programExerciseKey\"> | undefined {\n    if (exerciseType == null || steps === 0) {\n      return undefined;\n    }\n    const levels = ExerciseLevel.chain(exerciseType, settings);\n    const fromType = Exercise.resolveType(exerciseType, settings.exercises);\n    const index = levels.findIndex((l) => Exercise.eq(l, fromType));\n    const targetIndex = Math.max(0, Math.min(levels.length - 1, index + steps));\n    const target = levels[targetIndex];\n    const fromCustom = settings.exercises[exerciseType.id];\n    const toCustom = target != null ? settings.exercises[target.id] : undefined;\n    if (index === -1 || targetIndex === index || fromCustom == null || toCustom == null) {\n      return undefined;\n    }\n    const evaluated = Program.evaluate({ ...Program.create(\"Temp\"), planner }, settings);\n    let isInProgram = false;\n    PP.iterate2(evaluated.weeks, (exercise) => {\n      if (\n        exercise.key !== programExerciseKey &&\n        exercise.exerciseType != null &&\n        Exercise.eq(Exercise.resolveType(exercise.exerciseType, settings.exercises), target)\n      ) {\n        isInProgram = true;\n      }\n    });\n    if (isInProgram) {\n      return undefined;\n    }\n    return ExerciseLevel.buildChange(exerciseType, target, targetIndex > index ? \"up\" : \"down\", cause, settings);\n  }\n\n  export function createVariation(useStateWeight?: boolean): IProgramExerciseVariation {\n    return {\n      sets: [\n        {\n          repsExpr: \"5\",\n          weightExpr: useStateWeight ? \"state.weight\" : \"0lb\",\n          isAmrap: false,\n        },\n      ],\n    };\n  }\n\n  export function createExercise(units: IUnit): IProgramExercise {\n    const defaultWarmup = warmupValues(units)[45];\n    return {\n      name: \"Squat\",\n      id: UidFactory.generateUid(8),\n      variations: [createVariation(true)],\n      exerciseType: {\n        id: \"squat\",\n        equipment: \"barbell\",\n      },\n      state: {\n        weight: units === \"kg\" ? allExercisesList.squat.startingWeightKg : allExercisesList.squat.startingWeightLb,\n      },\n      warmupSets: defaultWarmup,\n      finishDayExpr: \"\",\n      variationExpr: \"1\",\n      descriptions: [\"\"],\n      stateMetadata: {},\n      reuseLogic: { selected: undefined, states: {} },\n    };\n  }\n\n  export function previewProgram(dispatch: IDispatch, programId: string, showCustomPrograms: boolean): void {\n    updateState(\n      dispatch,\n      [\n        lb<IState>().p(\"previewProgram\").record({\n          id: programId,\n          showCustomPrograms,\n        }),\n      ],\n      \"Preview program\"\n    );\n    dispatch(Thunk.pushScreen(\"programPreview\"));\n  }\n\n  export function createEmptyProgram(): IProgram {\n    return {\n      vtype: \"program\",\n      exercises: [],\n      id: emptyProgramId,\n      name: \"Ad-Hoc Workout\",\n      description: \"\",\n      url: \"\",\n      author: \"\",\n      nextDay: 1,\n      days: [],\n      weeks: [],\n      isMultiweek: false,\n      planner: {\n        vtype: \"planner\",\n        name: \"Ad-Hoc Workout\",\n        weeks: [{ name: \"\", days: [{ name: \"\", exerciseText: \"\" }] }],\n      },\n      tags: [],\n    };\n  }\n\n  export function cloneProgramData(program: IProgram, settings: ISettings): IProgram {\n    const newProgramId = UidFactory.generateUid(8);\n    const newProgram = { ...program, clonedAt: Date.now(), id: newProgramId };\n    // A description that is not layered text is old HTML or plain text. The clone gets plain text with no tags.\n    if (newProgram.descriptionFormat !== \"layered\" && newProgram.description) {\n      newProgram.description = LayeredText.htmlToText(newProgram.description)\n        .replace(/\\n{3,}/g, \"\\n\\n\")\n        .trim();\n      delete newProgram.descriptionFormat;\n    }\n    if (newProgram.planner) {\n      newProgram.planner = PlannerProgram.switchToUnit(newProgram.planner, settings);\n    }\n    return newProgram;\n  }\n\n  export function cloneProgram(dispatch: IDispatch, program: IProgram, settings: ISettings): void {\n    const newProgram = cloneProgramData(program, settings);\n    updateState(\n      dispatch,\n      [\n        lb<IState>()\n          .p(\"storage\")\n          .p(\"programs\")\n          .recordModify((programs) => [...programs, newProgram]),\n        lb<IState>().p(\"storage\").p(\"currentProgramId\").record(newProgram.id),\n      ],\n      \"Clone program\"\n    );\n  }\n\n  export function selectProgram(dispatch: IDispatch, programId: string): void {\n    updateState(dispatch, [lb<IState>().p(\"storage\").p(\"currentProgramId\").record(programId)], \"Select program\");\n    dispatch(Thunk.pushScreen(\"main\", undefined, true));\n  }\n\n  export function getAllProgramExercises(evaluatedProgram: IEvaluatedProgram): IPlannerProgramExercise[] {\n    return evaluatedProgram.weeks.flatMap((w) => w.days.flatMap((d) => d.exercises));\n  }\n\n  export function getAllUsedProgramExercises(evaluatedProgram: IEvaluatedProgram): IPlannerProgramExerciseWithType[] {\n    const used = getAllProgramExercises(evaluatedProgram).filter((e) => !e.notused && e.exerciseType != null);\n    return used as IPlannerProgramExerciseWithType[];\n  }\n\n  export function getAllProgramExercisesWithType(\n    evaluatedProgram: IEvaluatedProgram\n  ): IPlannerProgramExerciseWithType[] {\n    const used = getAllProgramExercises(evaluatedProgram).filter((e) => e.exerciseType != null);\n    return used as IPlannerProgramExerciseWithType[];\n  }\n\n  export function getProgramExerciseByTypeWeekAndDay(\n    evaluatedProgram: IEvaluatedProgram,\n    exerciseType: IExerciseType,\n    week: number,\n    dayInWeek: number\n  ): IPlannerProgramExercise | undefined {\n    let exercise: IPlannerProgramExercise | undefined;\n    PP.iterate2(evaluatedProgram.weeks, (e, weekIndex, dayInWeekIndex) => {\n      if (\n        weekIndex + 1 === week &&\n        dayInWeekIndex + 1 === dayInWeek &&\n        e.exerciseType &&\n        Exercise.eq(e.exerciseType, exerciseType)\n      ) {\n        exercise = e;\n        return true;\n      }\n      return false;\n    });\n    return exercise;\n  }\n\n  export const evaluate = memoize(forceEvaluate, { maxSize: 10 });\n\n  export function forceEvaluate(program: IProgram, settings: ISettings): IEvaluatedProgram {\n    const planner = program.planner;\n    if (!planner) {\n      return {\n        type: \"evaluatedProgram\",\n        id: program.id,\n        planner: {\n          vtype: \"planner\",\n          name: program.name,\n          weeks: [{ name: \"Week 1\", days: [{ name: \"Day 1\", exerciseText: \"\" }] }],\n        },\n        name: program.name,\n        errors: [],\n        nextDay: program.nextDay,\n        weeks: [\n          {\n            name: \"Week 1\",\n            days: [\n              {\n                name: \"Day 1\",\n                dayData: { day: 1, week: 1, dayInWeek: 1 },\n                exercises: [],\n              },\n            ],\n          },\n        ],\n        states: {},\n      };\n    }\n    const { evaluatedWeeks } = PlannerEvaluator.forceEvaluate(program.planner!, settings);\n    let dayNum = 0;\n    const errors: IEvaluatedProgramError[] = [];\n    const carriedDayDescriptions: Partial<Record<number, string>> = {};\n    const weeks = planner.weeks.map((week, weekIndex) => {\n      const evaluatedWeek = evaluatedWeeks[weekIndex];\n      const days = week.days.map((day, dayInWeekIndex) => {\n        dayNum += 1;\n        carriedDayDescriptions[dayInWeekIndex] = day.description ?? carriedDayDescriptions[dayInWeekIndex];\n        const evaluatedDay = evaluatedWeek[dayInWeekIndex];\n        const dayData = {\n          day: dayNum,\n          week: weekIndex + 1,\n          dayInWeek: dayInWeekIndex + 1,\n        };\n        const evaluatedExercises = CollectionUtils.sortBy(evaluatedDay.success ? evaluatedDay.data : [], \"order\");\n        if (!evaluatedDay.success) {\n          errors.push({ error: evaluatedDay.error, dayData });\n        }\n        return {\n          name: day.name,\n          description: carriedDayDescriptions[dayInWeekIndex],\n          notes: day.notes,\n          dayData,\n          exercises: evaluatedExercises,\n        };\n      });\n      return { name: week.name, description: week.description, notes: week.notes, loop: week.loop, days };\n    });\n    const states: IByTag<IProgramState> = {};\n    PP.iterate(evaluatedWeeks, (exercise) => {\n      for (const tag of exercise.tags) {\n        states[tag] = { ...states[tag], ...PlannerProgramExercise.getState(exercise) };\n      }\n    });\n    const result: IEvaluatedProgram = {\n      type: \"evaluatedProgram\",\n      id: program.id,\n      errors,\n      planner,\n      name: program.name,\n      nextDay: program.nextDay,\n      weeks: weeks,\n      states,\n    };\n    return result;\n  }\n\n  export function getNumberOfExerciseInstances(program: IEvaluatedProgram, exerciseKey: string): number {\n    let count = 0;\n    PP.iterate2(program.weeks, (exercise) => {\n      if (exercise.key === exerciseKey) {\n        count += 1;\n      }\n    });\n    return count;\n  }\n\n  export function changeExerciseName(from: string, to: string, program: IProgram, settings: ISettings): IProgram {\n    const planner = program.planner;\n    if (!planner) {\n      return program;\n    }\n    return {\n      ...program,\n      planner: {\n        ...planner,\n        weeks: planner.weeks.map((week) => {\n          return {\n            ...week,\n            days: week.days.map((day) => {\n              return {\n                ...day,\n                exerciseText: PlannerEvaluator.changeExerciseName(day.exerciseText, from, to, settings),\n              };\n            }),\n          };\n        }),\n      },\n    };\n  }\n\n  export function numberOfDays(program: IEvaluatedProgram): number {\n    return program.weeks.reduce((memo, week) => memo + week.days.length, 0);\n  }\n\n  export function weeksRange(program: IEvaluatedProgram): string | undefined {\n    return program.weeks.length > 1\n      ? `${program.weeks.length} ${StringUtils.pluralize(\"week\", program.weeks.length)}`\n      : \"\";\n  }\n\n  export function daysRange(program: IEvaluatedProgram): string {\n    const minDays = Math.min(...program.weeks.map((w) => w.days.length));\n    const maxDays = Math.max(...program.weeks.map((w) => w.days.length));\n    if (minDays === maxDays) {\n      return `${minDays} ${StringUtils.pluralize(\"day\", minDays)} per week`;\n    } else {\n      return `${minDays}-${maxDays} days per week`;\n    }\n  }\n\n  export function exerciseRange(program: IEvaluatedProgram): string {\n    const days = program.weeks.flatMap((w) => w.days);\n    const minExs = Math.min(...days.map((d) => Program.getProgramDayUsedExercises(d).length));\n    const maxExs = Math.max(...days.map((d) => Program.getProgramDayUsedExercises(d).length));\n    return exerciseRangeFormat(minExs, maxExs);\n  }\n\n  export function exerciseRangeFormat(minExs: number, maxExs: number): string {\n    if (minExs === maxExs) {\n      return `${minExs} ${StringUtils.pluralize(\"exercise\", minExs)} per day`;\n    } else {\n      return `${minExs}-${maxExs} exercises per day`;\n    }\n  }\n\n  export function getWeekFromDay(program: IEvaluatedProgram, day: number): number {\n    let daysTotal = 0;\n    for (let i = 0; i < program.weeks.length; i += 1) {\n      const weekDays = program.weeks[i].days.length;\n      daysTotal += weekDays;\n      if (daysTotal >= day) {\n        return i + 1;\n      }\n    }\n    return 1;\n  }\n\n  export function getDayNumber(program: IPlannerProgram | IEvaluatedProgram, week: number, dayInWeek: number): number {\n    let dayIndex = 1;\n    for (let w = 0; w < program.weeks.length; w += 1) {\n      for (let d = 0; d < program.weeks[w].days.length; d += 1) {\n        if (w === week - 1 && d === dayInWeek - 1) {\n          return dayIndex;\n        }\n        dayIndex += 1;\n      }\n    }\n    return -1;\n  }\n\n  export function getExerciseTypesForWeekDay(program: IEvaluatedProgram, week: number, day: number): IExerciseType[] {\n    const exerciseTypes: IExerciseType[] = [];\n    PP.iterate2(program.weeks, (exercise, weekIndex, dayInWeekIndex) => {\n      if (weekIndex + 1 === week && dayInWeekIndex + 1 === day) {\n        const exType = exercise.exerciseType;\n        if (exType && !exerciseTypes.some((et) => Exercise.eq(et, exType))) {\n          exerciseTypes.push(exType);\n        }\n      }\n    });\n    return exerciseTypes;\n  }\n\n  export function getDayData(program: IEvaluatedProgram, day: number): Required<IDayData> {\n    return {\n      day,\n      week: Program.getWeekFromDay(program, day),\n      dayInWeek: Program.getDayInWeek(program, day),\n    };\n  }\n\n  export function getDayInWeek(program: IEvaluatedProgram, day: number): number {\n    let daysTotal = 0;\n    for (const week of program.weeks) {\n      daysTotal += week.days.length;\n      if (daysTotal >= day) {\n        return day - (daysTotal - week.days.length);\n      }\n    }\n    return 1;\n  }\n\n  export function getDayName(program: IEvaluatedProgram, day: number): string {\n    const dayData = getDayData(program, day);\n    const programDay = getProgramDay(program, day);\n    const week = program.weeks[(dayData.week || 1) - 1];\n    const isMultiweek = program.weeks.length > 1 && week != null;\n    return `${isMultiweek ? `${week.name} - ` : \"\"}${programDay?.name}`;\n  }\n\n  export function getListOfDays(program: IEvaluatedProgram): [string, string][] {\n    const days: [string, string][] = [];\n    const isReallyMultiweek = program.weeks.length > 1;\n    let dayIndex = 0;\n    for (const week of program.weeks) {\n      for (const day of week.days) {\n        dayIndex += 1;\n        days.push([`${dayIndex}`, `${isReallyMultiweek ? `${week.name} - ` : \"\"}${day.name}`]);\n      }\n    }\n    return days;\n  }\n\n  export function getProgramWeek(program: IEvaluatedProgram, day?: number): IEvaluatedProgramWeek {\n    return program.weeks[Program.getWeekFromDay(program, day || 1) - 1] || program.weeks[0];\n  }\n\n  export function getProgramDay(program: IEvaluatedProgram, day: number): IEvaluatedProgramDay | undefined {\n    let aDay = 0;\n    for (const week of program.weeks || []) {\n      for (const d of week.days) {\n        aDay += 1;\n        if (day === aDay) {\n          return d;\n        }\n      }\n    }\n    return undefined;\n  }\n\n  export function getProgramDayExercises(programDay: IEvaluatedProgramDay): IPlannerProgramExerciseWithType[] {\n    const list = programDay.exercises.filter((e) => e.exerciseType != null);\n    return list as IPlannerProgramExerciseWithType[];\n  }\n\n  export function getProgramDayUsedExercises(programDay: IEvaluatedProgramDay): IPlannerProgramExerciseWithType[] {\n    const list = programDay.exercises.filter((e) => !e.notused && e.exerciseType != null);\n    return list as IPlannerProgramExerciseWithType[];\n  }\n\n  export function applyEvaluatedProgram(\n    program: IProgram,\n    evaluatedProgram: IEvaluatedProgram,\n    settings: ISettings\n  ): IProgram {\n    const newProgram = ObjectUtils.clone(program);\n    newProgram.planner = new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner();\n    newProgram.nextDay = evaluatedProgram.nextDay;\n    return newProgram;\n  }\n\n  export function getProgramExercise(\n    day: number,\n    program?: IEvaluatedProgram,\n    key?: string\n  ): IPlannerProgramExercise | undefined {\n    if (key == null || program == null) {\n      return undefined;\n    }\n    const programDay = getProgramDay(program, day);\n    return programDay?.exercises.find((e) => e.key === key);\n  }\n\n  export function getFirstProgramExercise(\n    program: IEvaluatedProgram,\n    key: string\n  ): IPlannerProgramExercise | undefined {\n    return Program.getAllProgramExercises(program).find((e) => e.key === key || e.fullName === key);\n  }\n\n  export function getProgramExerciseFromDay(\n    programDay?: IEvaluatedProgramDay,\n    key?: string\n  ): IPlannerProgramExercise | undefined {\n    if (key == null || programDay == null) {\n      return undefined;\n    }\n    return programDay?.exercises.find((e) => e.key === key);\n  }\n\n  export function getEvaluatedExercise(\n    program: IProgram,\n    day: number,\n    key: string,\n    settings: ISettings\n  ): IPlannerProgramExercise | undefined {\n    const { weeks: evaluatedWeeks } = Program.evaluate(program, settings);\n    let plannerProgramExercise: IPlannerProgramExercise | undefined;\n    PP.iterate2(evaluatedWeeks, (exercise, weekIndex, dayInWeekIndex, dayIndex) => {\n      if (dayIndex === day - 1 && exercise.key === key) {\n        plannerProgramExercise = exercise;\n        return true;\n      } else {\n        return undefined;\n      }\n    });\n    return plannerProgramExercise;\n  }\n\n  export function weeksSummary(program: { planner?: { weeks: { loop?: \"start\" }[] } }): string {\n    const weeks = program.planner?.weeks ?? [];\n    const count = weeks.length;\n    const loopIndex = weeks.findIndex((w) => w.loop === \"start\");\n    if (loopIndex > 0) {\n      const loopLength = count - loopIndex;\n      return `${loopIndex} ${StringUtils.pluralize(\"week\", loopIndex)}, then a ${loopLength}-week loop`;\n    }\n    return `${count} ${StringUtils.pluralize(\"week\", count)}`;\n  }\n\n  export function nextDay(program: IEvaluatedProgram, day?: number): number {\n    const total = numberOfDays(program);\n    const loopWeekIndex = program.weeks.findIndex((w) => w.loop === \"start\");\n    if (day != null && day >= total && loopWeekIndex > 0) {\n      const loopDay = getDayNumber(program, loopWeekIndex + 1, 1);\n      if (loopDay > 0) {\n        return loopDay;\n      }\n    }\n    const nd = (day != null ? day % total : 0) + 1;\n    return isNaN(nd) ? 1 : nd;\n  }\n\n  export function editAction(\n    dispatch: IDispatch,\n    program: IProgram,\n    dayData?: IDayData,\n    key?: string,\n    resetStack?: boolean\n  ): void {\n    const plannerState = EditProgram.initPlannerState(program.id, program, dayData, key);\n    dispatch(Thunk.pushScreen(\"editProgram\", { plannerState }, resetStack));\n  }\n\n  export function exportProgramToFile(program: IProgram, settings: ISettings, version: string): void {\n    const payload = exportProgram(program, settings, version);\n    Exporter.toFile(\n      `liftosaur_${program.name.replace(/\\s+/g, \"-\")}_${DateUtils.formatYYYYMMDD(Date.now())}.json`,\n      JSON.stringify(payload, null, 2)\n    );\n  }\n\n  export function exportProgram(program: IProgram, settings: ISettings, version?: string): IExportedProgram {\n    const aFullProgram = Program.evaluate(program, settings);\n    const customExerciseIds = Program.getAllProgramExercises(aFullProgram).reduce<string[]>((memo, programExercise) => {\n      const id = programExercise.exerciseType?.id;\n      if (id) {\n        const isBuiltIn = !!Exercise.findById(id, {});\n        if (!isBuiltIn) {\n          memo.push(id);\n        }\n      }\n      return memo;\n    }, []);\n\n    const customExercises = ObjectUtils.pick(settings.exercises, customExerciseIds);\n    return {\n      customExercises,\n      program,\n      version: version || getLatestMigrationVersion(),\n      settings: ObjectUtils.pick(settings, [\"units\", \"timers\", \"planner\"]),\n    };\n  }\n\n  export function exportedPlannerProgramToExportedProgram(\n    exportedPlannerProgram: IExportedPlannerProgram,\n    aNextDay?: number\n  ): IExportedProgram {\n    const program = {\n      ...Program.create(exportedPlannerProgram.program.name, exportedPlannerProgram.id),\n      planner: exportedPlannerProgram.program,\n    };\n    if (aNextDay != null) {\n      program.nextDay = aNextDay;\n    }\n    const exportedProgram: IExportedProgram = {\n      customExercises: exportedPlannerProgram.settings.exercises,\n      program,\n      version: exportedPlannerProgram.version,\n      settings: {\n        timers: {\n          workout: exportedPlannerProgram.settings.timer,\n        },\n        planner: exportedPlannerProgram.plannerSettings,\n      },\n    };\n    return exportedProgram;\n  }\n\n  export function create(name: string, id?: string): IProgram {\n    return {\n      vtype: \"program\" as const,\n      id: id || UidFactory.generateUid(8),\n      name: name,\n      url: \"\",\n      author: \"\",\n      description: \"\",\n      nextDay: 1,\n      weeks: [],\n      isMultiweek: false,\n      days: [{ id: UidFactory.generateUid(8), name: \"Day 1\", exercises: [] }],\n      exercises: [],\n      tags: [],\n      deletedDays: [],\n      deletedWeeks: [],\n      deletedExercises: [],\n      clonedAt: Date.now(),\n    };\n  }\n\n  export function isChanged(aProgram: IProgram, bProgram: IProgram): boolean {\n    const { ...cleanedAProgram } = aProgram;\n    const { ...cleanedBProgram } = bProgram;\n    const changed = !ObjectUtils.isEqual(cleanedAProgram, cleanedBProgram);\n    if (changed) {\n      const paths = ObjectUtils.diffPaths(cleanedAProgram, cleanedBProgram);\n      return paths.some((p) => {\n        return !p.match(/exercises.\\d+.state/) && !p.match(/exercises.\\d+.reuseLogic\\.states/) && !p.match(/nextDay/);\n      });\n    }\n    return false;\n  }\n\n  export function mergePrograms(oldProgram: IProgram, newProgram: IProgram, enforceNew: boolean = false): IProgram {\n    const deletedWeeks = new Set([...(oldProgram.deletedWeeks || []), ...(newProgram.deletedWeeks || [])]);\n    const deletedDays = new Set([...(oldProgram.deletedDays || []), ...(newProgram.deletedDays || [])]);\n    const deletedExercises = new Set([...(oldProgram.deletedExercises || []), ...(newProgram.deletedExercises || [])]);\n    return {\n      vtype: \"program\",\n      id: newProgram.id,\n      name: newProgram.name,\n      description: newProgram.description,\n      url: newProgram.url,\n      author: newProgram.author,\n      nextDay: newProgram.nextDay,\n      days: newProgram.days,\n      deletedDays: Array.from(deletedDays),\n      weeks: newProgram.weeks,\n      deletedWeeks: Array.from(deletedWeeks),\n      isMultiweek: newProgram.isMultiweek,\n      tags: newProgram.tags,\n      exercises: newProgram.exercises,\n      deletedExercises: Array.from(deletedExercises),\n      clonedAt: newProgram.clonedAt || oldProgram.clonedAt,\n      planner: newProgram.planner,\n    };\n  }\n\n  export function createFromHistoryRecord(programName: string, record: IHistoryRecord, settings: ISettings): IProgram {\n    const dayData = { week: 1, day: 1, dayInWeek: 1 };\n    const program: IProgram = {\n      ...Program.create(programName),\n      planner: {\n        vtype: \"planner\",\n        name: programName,\n        weeks: [{ name: \"Week 1\", days: [{ name: \"Day 1\", exerciseText: \"\" }] }],\n      },\n    };\n    const evaluatedProgram = Program.evaluate(program, settings);\n    const planner = program.planner!;\n    planner.weeks[0].days[0].exerciseText = record.entries\n      .map((entry) => {\n        const exercise = Exercise.get(entry.exercise, settings.exercises);\n        return Exercise.fullName(exercise, settings);\n      })\n      .join(\"\\n\");\n    const newDay: IEvaluatedProgramDay = {\n      dayData: dayData,\n      name: \"Day 1\",\n      exercises: record.entries.map((e, i) => {\n        return PlannerProgramExercise.createExerciseFromEntry(e, dayData, settings, i);\n      }),\n    };\n    evaluatedProgram.weeks[0].days[0] = newDay;\n    const newPlanner = new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner();\n    const newProgram = {\n      ...ObjectUtils.clone(program),\n      planner: newPlanner,\n    };\n    return newProgram;\n  }\n\n  export function addDayFromHistoryRecord(\n    program: IProgram,\n    afterDay: number,\n    record: IHistoryRecord,\n    settings: ISettings\n  ): { program: IProgram; dayData: Required<IDayData> } {\n    const evaluatedProgram = Program.evaluate(program, settings);\n    const dayData = Program.getDayData(evaluatedProgram, afterDay);\n    const newDayData = { week: dayData.week, day: dayData.day + 1, dayInWeek: dayData.dayInWeek + 1 };\n    const newDay: IEvaluatedProgramDay = {\n      dayData: newDayData,\n      name: `Day ${dayData.day + 1}`,\n      exercises: record.entries.map((e, i) => {\n        return PlannerProgramExercise.createExerciseFromEntry(e, newDayData, settings, i);\n      }),\n    };\n    evaluatedProgram.weeks[dayData.week - 1].days.splice(dayData.dayInWeek, 0, newDay);\n    evaluatedProgram.planner.weeks[dayData.week - 1].days.splice(dayData.dayInWeek, 0, {\n      name: newDay.name,\n      exerciseText: newDay.exercises.map((e) => e.fullName).join(\"\\n\"),\n    });\n    const newPlanner = new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner();\n    const newProgram = {\n      ...ObjectUtils.clone(program),\n      planner: newPlanner,\n    };\n    return { program: newProgram, dayData: newDayData };\n  }\n\n  export function getReusingSetsExercises(\n    evaluatedProgram: IEvaluatedProgram,\n    programExercise: IPlannerProgramExercise\n  ): IPlannerProgramExercise[] {\n    const exercises: IPlannerProgramExercise[] = [];\n    PP.iterate2(evaluatedProgram.weeks, (e) => {\n      if (\n        e.reuse?.exercise?.key === programExercise.key &&\n        e.reuse?.exercise.dayData.week === programExercise.dayData.week &&\n        e.reuse?.exercise.dayData.dayInWeek === programExercise.dayData.dayInWeek\n      ) {\n        exercises.push(e);\n      }\n    });\n    return exercises;\n  }\n\n  export function getReusingDescriptionsExercises(\n    evaluatedProgram: IEvaluatedProgram,\n    programExercise: IPlannerProgramExercise\n  ): IPlannerProgramExercise[] {\n    const exercises: IPlannerProgramExercise[] = [];\n    PP.iterate2(evaluatedProgram.weeks, (e) => {\n      if (\n        e.descriptions.reuse?.exercise?.key === programExercise.key &&\n        e.descriptions.reuse?.exercise.dayData.week === programExercise.dayData.week &&\n        e.descriptions.reuse?.exercise.dayData.dayInWeek === programExercise.dayData.dayInWeek\n      ) {\n        exercises.push(e);\n      }\n    });\n    return exercises;\n  }\n\n  export function getReusingCustomProgressExercises(\n    evaluatedProgram: IEvaluatedProgram,\n    programExercise: IPlannerProgramExercise\n  ): IPlannerProgramExercise[] {\n    const exercises: IPlannerProgramExercise[] = [];\n    PP.iterate2(evaluatedProgram.weeks, (e) => {\n      if (e.progress?.type === \"custom\" && e.progress?.reuse?.fullName === programExercise.fullName) {\n        exercises.push(e);\n      }\n    });\n    return exercises;\n  }\n\n  export function getReusingSetProgressExercises(\n    evaluatedProgram: IEvaluatedProgram,\n    programExercise: IPlannerProgramExercise\n  ): IPlannerProgramExercise[] {\n    const exercises: IPlannerProgramExercise[] = [];\n    PP.iterate2(evaluatedProgram.weeks, (e) => {\n      if (e.reuse?.fullName === programExercise.fullName && e.progress) {\n        exercises.push(e);\n      }\n    });\n    return exercises;\n  }\n\n  export function getReusingProgressExercises(\n    evaluatedProgram: IEvaluatedProgram,\n    programExercise: IPlannerProgramExercise\n  ): IPlannerProgramExercise[] {\n    const reusingCustomProgressExercises = getReusingCustomProgressExercises(evaluatedProgram, programExercise);\n    const reusingSetProgressExercises = getReusingSetProgressExercises(evaluatedProgram, programExercise);\n    const exercises = CollectionUtils.uniqBy(\n      [...reusingCustomProgressExercises, ...reusingSetProgressExercises],\n      \"fullName\"\n    );\n    return exercises;\n  }\n\n  export function getReusingUpdateExercises(\n    evaluatedProgram: IEvaluatedProgram,\n    programExercise: IPlannerProgramExercise\n  ): IPlannerProgramExercise[] {\n    const exercises: IPlannerProgramExercise[] = [];\n    PP.iterate2(evaluatedProgram.weeks, (e) => {\n      if (e.reuse?.fullName === programExercise.fullName) {\n        exercises.push(e);\n      }\n    });\n    return exercises;\n  }\n}\n","import { IEvaluatedProgram, IEvaluatedProgramDay, Program } from \"./program\";\nimport { Exercise } from \"./exercise\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { ISettings, IMuscle, IDayData, IScreenMuscle, IStats, screenMuscles, IMuscleGroupsSettings } from \"../types\";\nimport { StringUtils } from \"../utils/string\";\nimport { IPlannerProgramExerciseWithType } from \"@client/pages/planner/models/types\";\nimport { SetUtils } from \"@client/utils/setUtils\";\nimport { UidFactory } from \"../utils/generator\";\n\nexport type IScreenMusclePointsColl = Partial<Record<IScreenMuscle, number>>;\n\nexport interface IScreenMusclePoints {\n  strength: IScreenMusclePointsColl;\n  hypertrophy: IScreenMusclePointsColl;\n}\n\nexport type IExercisePointsColl = Partial<Record<string, IScreenMusclePointsColl>>;\n\nexport interface IExercisePoints {\n  strength: IExercisePointsColl;\n  hypertrophy: IExercisePointsColl;\n}\n\nexport interface IUnifiedPoints {\n  screenMusclePoints: IScreenMusclePointsColl;\n  exercisePoints: IExercisePointsColl;\n}\n\nexport interface IPoints {\n  screenMusclePoints: IScreenMusclePoints;\n  exercisePoints: IExercisePoints;\n}\n\nconst screenMuscleToMuscleMapping: Record<IScreenMuscle, IMuscle[]> = {\n  shoulders: [\n    \"Deltoid Anterior\",\n    \"Deltoid Lateral\",\n    \"Deltoid Posterior\",\n    \"Infraspinatus\",\n    \"Teres Major\",\n    \"Teres Minor\",\n  ],\n  triceps: [\"Triceps Brachii\"],\n  back: [\n    \"Erector Spinae\",\n    \"Latissimus Dorsi\",\n    \"Levator Scapulae\",\n    \"Trapezius Lower Fibers\",\n    \"Trapezius Middle Fibers\",\n    \"Trapezius Upper Fibers\",\n    \"Sternocleidomastoid\",\n    \"Splenius\",\n  ],\n  abs: [\"Obliques\", \"Rectus Abdominis\", \"Iliopsoas\"],\n  glutes: [\"Gluteus Maximus\", \"Gluteus Medius\", \"Tensor Fasciae Latae\"],\n  hamstrings: [\"Adductor Magnus\", \"Adductor Brevis\", \"Adductor Longus\", \"Hamstrings\"],\n  quadriceps: [\"Adductor Brevis\", \"Adductor Longus\", \"Pectineous\", \"Quadriceps\", \"Sartorius\"],\n  chest: [\"Pectoralis Major Clavicular Head\", \"Pectoralis Major Sternal Head\", \"Serratus Anterior\"],\n  biceps: [\"Biceps Brachii\", \"Brachialis\"],\n  calves: [\"Gastrocnemius\", \"Soleus\", \"Tibialis Anterior\"],\n  forearms: [\"Brachioradialis\", \"Wrist Extensors\", \"Wrist Flexors\"],\n};\n\nconst muscleToScreenMuscleMapping = ObjectUtils.keys(screenMuscleToMuscleMapping).reduce<\n  Record<IMuscle, IScreenMuscle[]>\n>((memo, screenMuscle) => {\n  const muscles = screenMuscleToMuscleMapping[screenMuscle];\n  for (const muscle of muscles) {\n    memo[muscle] = memo[muscle] || [];\n    memo[muscle].push(screenMuscle);\n  }\n  return memo;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n}, {} as any);\n\nexport namespace Muscle {\n  export function getEmptyScreenMusclesPoints(): IScreenMusclePointsColl {\n    return {\n      shoulders: 0,\n      triceps: 0,\n      back: 0,\n      abs: 0,\n      glutes: 0,\n      hamstrings: 0,\n      quadriceps: 0,\n      chest: 0,\n      biceps: 0,\n      calves: 0,\n      forearms: 0,\n    };\n  }\n\n  export function imageUrl(muscle: IMuscle): string {\n    return `/externalimages/muscles/muscle-${StringUtils.dashcase(muscle)}.jpeg`;\n  }\n\n  function normalize(obj: IScreenMusclePointsColl, maxValue: number): IScreenMusclePointsColl {\n    return ObjectUtils.keys(obj).reduce<IScreenMusclePointsColl>((memo, key) => {\n      memo[key] = (obj[key] || 0) / maxValue;\n      return memo;\n    }, {});\n  }\n\n  export function normalizePoints(points: IPoints): IPoints {\n    const maxValues = {\n      strength: ObjectUtils.findMaxValue(points.screenMusclePoints.strength),\n      hypertrophy: ObjectUtils.findMaxValue(points.screenMusclePoints.hypertrophy),\n    };\n    return {\n      screenMusclePoints: {\n        strength: normalize(points.screenMusclePoints.strength, maxValues.strength),\n        hypertrophy: normalize(points.screenMusclePoints.hypertrophy, maxValues.hypertrophy),\n      },\n      exercisePoints: {\n        strength: ObjectUtils.keys(points.exercisePoints.strength).reduce<IExercisePointsColl>((memo, key) => {\n          memo[key] = normalize(points.exercisePoints.strength[key]!, maxValues.strength);\n          return memo;\n        }, {}),\n        hypertrophy: ObjectUtils.keys(points.exercisePoints.hypertrophy).reduce<IExercisePointsColl>((memo, key) => {\n          memo[key] = normalize(points.exercisePoints.hypertrophy[key]!, maxValues.hypertrophy);\n          return memo;\n        }, {}),\n      },\n    };\n  }\n\n  export function normalizeUnifiedPoints(points: IUnifiedPoints): IUnifiedPoints {\n    const maxValues = ObjectUtils.findMaxValue(points.screenMusclePoints);\n    return {\n      screenMusclePoints: normalize(points.screenMusclePoints, maxValues),\n      exercisePoints: ObjectUtils.keys(points.exercisePoints).reduce<IExercisePointsColl>((memo, key) => {\n        memo[key] = normalize(points.exercisePoints[key]!, maxValues);\n        return memo;\n      }, {}),\n    };\n  }\n\n  export function combinePoints(points: IPoints): IPoints {\n    return {\n      screenMusclePoints: {\n        strength: ObjectUtils.keys(points.screenMusclePoints.strength).reduce<IScreenMusclePointsColl>((memo, key) => {\n          memo[key] = (memo[key] || 0) + points.screenMusclePoints.strength[key]!;\n          return memo;\n        }, {}),\n        hypertrophy: {},\n      },\n      exercisePoints: {\n        strength: {},\n        hypertrophy: {},\n      },\n    };\n  }\n\n  export function getScreenMusclesFromMuscle(muscle: IMuscle, settings: ISettings): (IScreenMuscle | string)[] {\n    const availableMuscleGroups = getAvailableMuscleGroups(settings);\n    const matchingMuscleGroups = availableMuscleGroups.filter((mg) => {\n      const muscles = settings.muscleGroups.data[mg]?.muscles ?? screenMuscleToMuscleMapping[mg as IScreenMuscle] ?? [];\n      return muscles.includes(muscle);\n    });\n    return matchingMuscleGroups;\n  }\n\n  export function getMuscleGroupName(muscleGroup: IScreenMuscle, settings: ISettings): string {\n    return settings.muscleGroups.data[muscleGroup]?.name ?? StringUtils.capitalize(muscleGroup);\n  }\n\n  export function isDefaultMuscles(muscleGroup: IScreenMuscle, muscles: IMuscle[]): boolean {\n    const defaultMuscles = screenMuscleToMuscleMapping[muscleGroup as IScreenMuscle] ?? [];\n    return SetUtils.areEqual(new Set(defaultMuscles), new Set(muscles));\n  }\n\n  export function getAvailableMuscleGroups(settings: ISettings): IScreenMuscle[] {\n    return [\n      ...screenMuscles.filter((sm) => !settings.muscleGroups.data[sm]?.isHidden),\n      ...Object.keys(settings.muscleGroups.data).filter((k) => !(screenMuscles as readonly string[]).includes(k)),\n    ];\n  }\n\n  export function getBuiltinMuscleGroups(): IScreenMuscle[] {\n    return screenMuscles;\n  }\n\n  export function getHiddenMuscleGroups(settings: ISettings): IScreenMuscle[] {\n    return [...screenMuscles.filter((sm) => settings.muscleGroups.data[sm]?.isHidden)];\n  }\n\n  export function getMusclesFromScreenMuscle(muscleGroup: IScreenMuscle | string, settings: ISettings): IMuscle[] {\n    const availableMuscleGroups = getAvailableMuscleGroups(settings);\n    if (!availableMuscleGroups.includes(muscleGroup)) {\n      return [];\n    }\n    return (\n      settings.muscleGroups.data[muscleGroup]?.muscles ??\n      screenMuscleToMuscleMapping[muscleGroup as IScreenMuscle] ??\n      []\n    );\n  }\n\n  export function isBuiltInMuscleGroup(muscleGroup: IScreenMuscle | string): boolean {\n    return (screenMuscles as readonly string[]).includes(muscleGroup);\n  }\n\n  export function getPointsForProgram(program: IEvaluatedProgram, stats: IStats, settings: ISettings): IPoints {\n    const screenMusclePoints: IScreenMusclePoints = {\n      strength: {},\n      hypertrophy: {},\n    };\n    const exercisePoints: IExercisePoints = {\n      strength: {},\n      hypertrophy: {},\n    };\n\n    return program.weeks[0].days.reduce(\n      (memo, day) => mergePoints(memo, getPointsForDay(program, day, stats, settings)),\n      {\n        screenMusclePoints,\n        exercisePoints,\n      }\n    );\n  }\n\n  export function getPointsForDay(\n    program: IEvaluatedProgram,\n    programDay: IEvaluatedProgramDay,\n    stats: IStats,\n    settings: ISettings\n  ): IPoints {\n    const screenMusclePoints: IScreenMusclePoints = {\n      strength: {},\n      hypertrophy: {},\n    };\n    const exercisePoints: IExercisePoints = {\n      strength: {},\n      hypertrophy: {},\n    };\n\n    const dayExercises = Program.getProgramDayUsedExercises(programDay);\n    return dayExercises.reduce(\n      (memo, exercise) => {\n        return mergePoints(memo, getPointsForExercise(program, exercise, programDay.dayData, settings, stats));\n      },\n      { screenMusclePoints, exercisePoints }\n    );\n  }\n\n  export function getUnifiedPointsForDay(\n    program: IEvaluatedProgram,\n    programDay: IEvaluatedProgramDay,\n    stats: IStats,\n    settings: ISettings\n  ): IUnifiedPoints {\n    const screenMusclePoints: IScreenMusclePointsColl = {};\n    const exercisePoints: IExercisePointsColl = {};\n\n    const dayExercises = Program.getProgramDayUsedExercises(programDay);\n    return dayExercises.reduce(\n      (memo, exercise) => {\n        return mergeUnifiedPoints(\n          memo,\n          getUnifiedPointsForExercise(program, exercise, programDay.dayData, settings, stats)\n        );\n      },\n      { screenMusclePoints, exercisePoints }\n    );\n  }\n\n  export function getUnifiedPointsForExercise(\n    program: IEvaluatedProgram,\n    programExercise: IPlannerProgramExerciseWithType,\n    dayData: IDayData,\n    settings: ISettings,\n    stats: IStats\n  ): IUnifiedPoints {\n    const screenMusclePoints: IScreenMusclePointsColl = {};\n    const exercisePoints: IExercisePointsColl = {};\n\n    const id = Exercise.toKey(programExercise.exerciseType);\n    const historyEntry = Program.nextHistoryEntry(program, dayData, programExercise, stats, settings);\n    const targetMuscles = Exercise.targetMuscles(programExercise.exerciseType, settings);\n    const synergistMuscles = Exercise.synergistMuscles(programExercise.exerciseType, settings);\n    const screenTargetMuscles = Array.from(new Set(targetMuscles.flatMap((t) => muscleToScreenMuscleMapping[t] || [])));\n    const screenSynergistMuscles = Array.from(\n      new Set(synergistMuscles.flatMap((t) => muscleToScreenMuscleMapping[t] || []))\n    );\n    const synergistMuscleGroupToMultiplier = Exercise.synergistMusclesGroupMultipliers(\n      programExercise.exerciseType,\n      settings\n    );\n    for (const _set of historyEntry.sets) {\n      for (const muscle of screenTargetMuscles) {\n        screenMusclePoints[muscle] = screenMusclePoints[muscle] || 0;\n        screenMusclePoints[muscle]! += 100;\n        exercisePoints[id] = exercisePoints[id] || {};\n        exercisePoints[id]![muscle] = exercisePoints[id]![muscle] || 0;\n        exercisePoints[id]![muscle]! += 100;\n      }\n      for (const muscle of screenSynergistMuscles) {\n        screenMusclePoints[muscle] = screenMusclePoints[muscle] || 0;\n        screenMusclePoints[muscle]! +=\n          (synergistMuscleGroupToMultiplier[muscle] ?? settings.planner.synergistMultiplier) * 100;\n        exercisePoints[id] = exercisePoints[id] || {};\n        exercisePoints[id]![muscle] = exercisePoints[id]![muscle] || 0;\n        exercisePoints[id]![muscle]! +=\n          (synergistMuscleGroupToMultiplier[muscle] ?? settings.planner.synergistMultiplier) * 100;\n      }\n    }\n    return { screenMusclePoints, exercisePoints };\n  }\n\n  export function getPointsForExercise(\n    program: IEvaluatedProgram,\n    programExercise: IPlannerProgramExerciseWithType,\n    dayData: IDayData,\n    settings: ISettings,\n    stats: IStats\n  ): IPoints {\n    const screenMusclePoints: IScreenMusclePoints = {\n      strength: {},\n      hypertrophy: {},\n    };\n    const exercisePoints: IExercisePoints = {\n      strength: {},\n      hypertrophy: {},\n    };\n\n    const id = Exercise.toKey(programExercise.exerciseType);\n    const historyEntry = Program.nextHistoryEntry(program, dayData, programExercise, stats, settings);\n    const targetMuscles = Exercise.targetMuscles(programExercise.exerciseType, settings);\n    const synergistMuscles = Exercise.synergistMuscles(programExercise.exerciseType, settings);\n    const synergistMuscleGroupToMultiplier = Exercise.synergistMusclesGroupMultipliers(\n      programExercise.exerciseType,\n      settings\n    );\n    const screenTargetMuscles = Array.from(new Set(targetMuscles.flatMap((t) => muscleToScreenMuscleMapping[t] || [])));\n    const screenSynergistMuscles = Array.from(\n      new Set(synergistMuscles.flatMap((t) => muscleToScreenMuscleMapping[t] || []))\n    );\n    for (const set of historyEntry.sets) {\n      if ((set.reps ?? 0) >= 8) {\n        for (const muscle of screenTargetMuscles) {\n          screenMusclePoints.hypertrophy[muscle] = screenMusclePoints.hypertrophy[muscle] || 0;\n          screenMusclePoints.hypertrophy[muscle]! += 100;\n          exercisePoints.hypertrophy[id] = exercisePoints.hypertrophy[id] || {};\n          exercisePoints.hypertrophy[id]![muscle] = exercisePoints.hypertrophy[id]![muscle] || 0;\n          exercisePoints.hypertrophy[id]![muscle]! += 100;\n        }\n        for (const muscle of screenSynergistMuscles) {\n          screenMusclePoints.hypertrophy[muscle] = screenMusclePoints.hypertrophy[muscle] || 0;\n          screenMusclePoints.hypertrophy[muscle]! +=\n            100 * (synergistMuscleGroupToMultiplier[muscle] ?? settings.planner.synergistMultiplier);\n          exercisePoints.hypertrophy[id] = exercisePoints.hypertrophy[id] || {};\n          exercisePoints.hypertrophy[id]![muscle] = exercisePoints.hypertrophy[id]![muscle] || 0;\n          exercisePoints.hypertrophy[id]![muscle]! +=\n            100 * (synergistMuscleGroupToMultiplier[muscle] ?? settings.planner.synergistMultiplier);\n        }\n      } else {\n        for (const muscle of screenTargetMuscles) {\n          screenMusclePoints.strength[muscle] = screenMusclePoints.strength[muscle] || 0;\n          screenMusclePoints.strength[muscle]! += 100;\n          exercisePoints.strength[id] = exercisePoints.strength[id] || {};\n          exercisePoints.strength[id]![muscle] = exercisePoints.strength[id]![muscle] || 0;\n          exercisePoints.strength[id]![muscle]! += 100;\n        }\n        for (const muscle of screenSynergistMuscles) {\n          screenMusclePoints.strength[muscle] = screenMusclePoints.strength[muscle] || 0;\n          screenMusclePoints.strength[muscle]! +=\n            100 * (synergistMuscleGroupToMultiplier[muscle] ?? settings.planner.synergistMultiplier);\n          exercisePoints.strength[id] = exercisePoints.strength[id] || {};\n          exercisePoints.strength[id]![muscle] = exercisePoints.strength[id]![muscle] || 0;\n          exercisePoints.strength[id]![muscle]! +=\n            100 * (synergistMuscleGroupToMultiplier[muscle] ?? settings.planner.synergistMultiplier);\n        }\n      }\n    }\n    return { screenMusclePoints, exercisePoints };\n  }\n\n  export function mergeScreenMusclePoints(\n    a: IScreenMusclePointsColl,\n    b: IScreenMusclePointsColl\n  ): IScreenMusclePointsColl {\n    return ObjectUtils.combinedKeys(a, b).reduce<IScreenMusclePointsColl>((memo, screenMuscle) => {\n      const oldValue = a[screenMuscle] || 0;\n      const newValue = b[screenMuscle] || 0;\n      memo[screenMuscle] = oldValue + newValue;\n      return memo;\n    }, {});\n  }\n\n  export function createMuscleGroup(muscleGroupSettings: IMuscleGroupsSettings, name: string): IMuscleGroupsSettings {\n    const id = UidFactory.generateUid(8);\n    return { ...muscleGroupSettings, data: { ...muscleGroupSettings.data, [id]: { name, muscles: [] } } };\n  }\n\n  export function updateMuscleGroup(\n    muscleGroupSettings: IMuscleGroupsSettings,\n    muscleGroup: IScreenMuscle,\n    muscles: IMuscle[]\n  ): IMuscleGroupsSettings {\n    const isDefault = Muscle.isDefaultMuscles(muscleGroup, muscles);\n    const newMuscleGroups = ObjectUtils.clone(muscleGroupSettings);\n    if (isDefault) {\n      delete newMuscleGroups.data[muscleGroup]?.muscles;\n    } else {\n      newMuscleGroups.data = newMuscleGroups.data || {};\n      newMuscleGroups.data[muscleGroup] = newMuscleGroups.data[muscleGroup] || {};\n      newMuscleGroups.data[muscleGroup].muscles = muscles;\n    }\n    return newMuscleGroups;\n  }\n\n  export function deleteMuscleGroup(\n    muscleGroupSettings: IMuscleGroupsSettings,\n    muscleGroup: IScreenMuscle\n  ): IMuscleGroupsSettings {\n    const isBuiltin = Muscle.isBuiltInMuscleGroup(muscleGroup);\n    if (isBuiltin) {\n      return {\n        ...muscleGroupSettings,\n        data: {\n          ...muscleGroupSettings.data,\n          [muscleGroup]: { ...muscleGroupSettings.data[muscleGroup], isHidden: true },\n        },\n      };\n    } else {\n      const newMuscleGroups = ObjectUtils.clone(muscleGroupSettings);\n      delete newMuscleGroups.data[muscleGroup];\n      return newMuscleGroups;\n    }\n  }\n\n  export function restoreMuscleGroup(\n    muscleGroupSettings: IMuscleGroupsSettings,\n    muscleGroup: IScreenMuscle\n  ): IMuscleGroupsSettings {\n    const newMuscleGroups = ObjectUtils.clone(muscleGroupSettings);\n    newMuscleGroups.data = newMuscleGroups.data || {};\n    newMuscleGroups.data[muscleGroup] = newMuscleGroups.data[muscleGroup] || {};\n    newMuscleGroups.data[muscleGroup].isHidden = false;\n    return newMuscleGroups;\n  }\n\n  function mergeExercisePoints(a: IExercisePointsColl, b: IExercisePointsColl): IExercisePointsColl {\n    return ObjectUtils.combinedKeys(a, b).reduce<IExercisePointsColl>((memo, exerciseId) => {\n      const points1 = a[exerciseId] || {};\n      const points2 = b[exerciseId] || {};\n      memo[exerciseId] = mergeScreenMusclePoints(points1, points2);\n      return memo;\n    }, {});\n  }\n\n  function mergePoints(oldPoints: IPoints, newPoints: IPoints): IPoints {\n    return {\n      screenMusclePoints: {\n        strength: mergeScreenMusclePoints(oldPoints.screenMusclePoints.strength, newPoints.screenMusclePoints.strength),\n        hypertrophy: mergeScreenMusclePoints(\n          oldPoints.screenMusclePoints.hypertrophy,\n          newPoints.screenMusclePoints.hypertrophy\n        ),\n      },\n      exercisePoints: {\n        strength: mergeExercisePoints(oldPoints.exercisePoints.strength, newPoints.exercisePoints.strength),\n        hypertrophy: mergeExercisePoints(oldPoints.exercisePoints.hypertrophy, newPoints.exercisePoints.hypertrophy),\n      },\n    };\n  }\n\n  function mergeUnifiedPoints(oldPoints: IUnifiedPoints, newPoints: IUnifiedPoints): IUnifiedPoints {\n    return {\n      screenMusclePoints: mergeScreenMusclePoints(oldPoints.screenMusclePoints, newPoints.screenMusclePoints),\n      exercisePoints: mergeExercisePoints(oldPoints.exercisePoints, newPoints.exercisePoints),\n    };\n  }\n}\n","import { JSX } from \"preact\";\nimport { useState } from \"preact/hooks\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\n\ninterface IResetPasswordFormProps {\n  token: string;\n  onResetPassword: (token: string, newPassword: string) => Promise<void>;\n  onSuccess: () => void;\n}\n\nexport function ResetPasswordForm(props: IResetPasswordFormProps): JSX.Element {\n  const [newPassword, setNewPassword] = useState(\"\");\n  const [confirmPassword, setConfirmPassword] = useState(\"\");\n  const [isLoading, setIsLoading] = useState(false);\n  const [error, setError] = useState<string | undefined>(undefined);\n\n  const validatePassword = (pwd: string): string | undefined => {\n    if (pwd.length < 8) {\n      return \"Password must be at least 8 characters\";\n    }\n    if (!/\\d/.test(pwd)) {\n      return \"Password must contain at least one number\";\n    }\n    if (new TextEncoder().encode(pwd).length > 72) {\n      return \"Password must be at most 72 bytes long\";\n    }\n    return undefined;\n  };\n\n  const handleSubmit = async (e: Event): Promise<void> => {\n    e.preventDefault();\n    setError(undefined);\n\n    // Validate password\n    const passwordError = validatePassword(newPassword);\n    if (passwordError) {\n      setError(passwordError);\n      return;\n    }\n\n    // Check passwords match\n    if (newPassword !== confirmPassword) {\n      setError(\"Passwords do not match\");\n      return;\n    }\n\n    setIsLoading(true);\n    try {\n      await props.onResetPassword(props.token, newPassword);\n      props.onSuccess();\n    } catch (err) {\n      setError(err instanceof Error ? err.message : \"Failed to reset password\");\n      setIsLoading(false);\n    }\n  };\n\n  return (\n    <div>\n      <h2 className=\"mb-4 text-lg font-bold text-center\">Reset Password</h2>\n      {isLoading ? (\n        <div className=\"my-4 text-center\">\n          <IconSpinner width={48} height={48} />\n        </div>\n      ) : (\n        <form onSubmit={handleSubmit}>\n          <div className=\"mb-4\">\n            <Input\n              label=\"New Password\"\n              type=\"password\"\n              identifier=\"reset-password-new\"\n              isLabelOutside={true}\n              required={true}\n              requiredMessage=\"Password is required\"\n              value={newPassword}\n              changeType=\"oninput\"\n              changeHandler={(result) => {\n                if (result.success) {\n                  setNewPassword(result.data);\n                  setError(undefined);\n                }\n              }}\n              placeholder=\"Enter new password\"\n            />\n          </div>\n          <div className=\"mb-4\">\n            <Input\n              label=\"Confirm Password\"\n              type=\"password\"\n              identifier=\"reset-password-confirm\"\n              isLabelOutside={true}\n              required={true}\n              requiredMessage=\"Please confirm your password\"\n              value={confirmPassword}\n              changeType=\"oninput\"\n              changeHandler={(result) => {\n                if (result.success) {\n                  setConfirmPassword(result.data);\n                  setError(undefined);\n                }\n              }}\n              placeholder=\"Confirm new password\"\n            />\n          </div>\n          <div className=\"mb-4 text-xs text-text-secondary\">\n            Password requirements:\n            <ul className=\"ml-4 list-disc\">\n              <li>At least 8 characters</li>\n              <li>At least one number</li>\n            </ul>\n          </div>\n          {error && (\n            <div className=\"mb-4 text-sm text-center text-text-error\" data-cy=\"reset-password-error\">\n              {error}\n            </div>\n          )}\n          <div className=\"mb-4 text-center\">\n            <Button\n              name=\"reset-password-submit\"\n              kind=\"purple\"\n              type=\"submit\"\n              data-cy=\"reset-password-submit\"\n              disabled={!newPassword || !confirmPassword}\n            >\n              Reset Password\n            </Button>\n          </div>\n        </form>\n      )}\n    </div>\n  );\n}\n","import { IPlannerProgramExerciseEvaluatedSet } from \"@client/pages/planner/models/types\";\nimport { IExerciseType, IProgramSet, ISettings, IWeight } from \"../types\";\nimport { Equipment } from \"./equipment\";\nimport { Weight } from \"./weight\";\n\nexport namespace ProgramSet {\n  export function group(sets: IProgramSet[]): IProgramSet[][] {\n    return sets.reduce<IProgramSet[][]>(\n      (memo, set) => {\n        let lastGroup = memo[memo.length - 1];\n        const last = lastGroup[lastGroup.length - 1];\n        if (\n          last != null &&\n          (last.weightExpr !== set.weightExpr ||\n            last.repsExpr !== set.repsExpr ||\n            last.isAmrap !== set.isAmrap ||\n            last.rpeExpr !== set.rpeExpr ||\n            last.logRpe !== set.logRpe)\n        ) {\n          memo.push([]);\n          lastGroup = memo[memo.length - 1];\n        }\n        lastGroup.push(set);\n        return memo;\n      },\n      [[]]\n    );\n  }\n\n  export function approxTimeMs(set: IPlannerProgramExerciseEvaluatedSet, settings: ISettings): number {\n    const reps = set.maxrep;\n    const secondsPerRep = 7;\n    const prepareTime = 20;\n    const timeToRep = (prepareTime + (reps ?? 0) * secondsPerRep) * 1000;\n    const timeToRest = (settings.timers.workout || 0) * 1000;\n    const totalTime = timeToRep + timeToRest;\n    return totalTime;\n  }\n\n  export function isEligibleForInferredWeight(set: IPlannerProgramExerciseEvaluatedSet): boolean {\n    return set.weight == null && set.maxrep != null && set.rpe != null;\n  }\n\n  export function getEvaluatedWeight(\n    programSet: IPlannerProgramExerciseEvaluatedSet,\n    exerciseType: IExerciseType,\n    settings: ISettings\n  ): IWeight | undefined {\n    const originalWeight = programSet.weight;\n    const unit = Equipment.getUnitOrDefaultForExerciseType(settings, exerciseType);\n    const evaluatedWeight = originalWeight\n      ? Weight.evaluateWeight(originalWeight, exerciseType, settings)\n      : ProgramSet.isEligibleForInferredWeight(programSet) && programSet.maxrep != null && programSet.rpe != null\n        ? Weight.evaluateWeight(Weight.rpePct(programSet.maxrep, programSet.rpe), exerciseType, settings)\n        : undefined;\n    return evaluatedWeight ? Weight.roundConvertTo(evaluatedWeight, settings, unit, exerciseType) : undefined;\n  }\n}\n","'use strict';\n\nvar common = require('@lezer/common');\n\n/**\nA parse stack. These are used internally by the parser to track\nparsing progress. They also provide some properties and methods\nthat external code such as a tokenizer can use to get information\nabout the parse state.\n*/\nclass Stack {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The parse that this stack is part of @internal\n    */\n    p, \n    /**\n    Holds state, input pos, buffer index triplets for all but the\n    top state @internal\n    */\n    stack, \n    /**\n    The current parse state @internal\n    */\n    state, \n    // The position at which the next reduce should take place. This\n    // can be less than `this.pos` when skipped expressions have been\n    // added to the stack (which should be moved outside of the next\n    // reduction)\n    /**\n    @internal\n    */\n    reducePos, \n    /**\n    The input position up to which this stack has parsed.\n    */\n    pos, \n    /**\n    The dynamic score of the stack, including dynamic precedence\n    and error-recovery penalties\n    @internal\n    */\n    score, \n    // The output buffer. Holds (type, start, end, size) quads\n    // representing nodes created by the parser, where `size` is\n    // amount of buffer array entries covered by this node.\n    /**\n    @internal\n    */\n    buffer, \n    // The base offset of the buffer. When stacks are split, the split\n    // instance shared the buffer history with its parent up to\n    // `bufferBase`, which is the absolute offset (including the\n    // offset of previous splits) into the buffer at which this stack\n    // starts writing.\n    /**\n    @internal\n    */\n    bufferBase, \n    /**\n    @internal\n    */\n    curContext, \n    /**\n    @internal\n    */\n    lookAhead = 0, \n    // A parent stack from which this was split off, if any. This is\n    // set up so that it always points to a stack that has some\n    // additional buffer content, never to a stack with an equal\n    // `bufferBase`.\n    /**\n    @internal\n    */\n    parent) {\n        this.p = p;\n        this.stack = stack;\n        this.state = state;\n        this.reducePos = reducePos;\n        this.pos = pos;\n        this.score = score;\n        this.buffer = buffer;\n        this.bufferBase = bufferBase;\n        this.curContext = curContext;\n        this.lookAhead = lookAhead;\n        this.parent = parent;\n    }\n    /**\n    @internal\n    */\n    toString() {\n        return `[${this.stack.filter((_, i) => i % 3 == 0).concat(this.state)}]@${this.pos}${this.score ? \"!\" + this.score : \"\"}`;\n    }\n    // Start an empty stack\n    /**\n    @internal\n    */\n    static start(p, state, pos = 0) {\n        let cx = p.parser.context;\n        return new Stack(p, [], state, pos, pos, 0, [], 0, cx ? new StackContext(cx, cx.start) : null, 0, null);\n    }\n    /**\n    The stack's current [context](#lr.ContextTracker) value, if\n    any. Its type will depend on the context tracker's type\n    parameter, or it will be `null` if there is no context\n    tracker.\n    */\n    get context() { return this.curContext ? this.curContext.context : null; }\n    // Push a state onto the stack, tracking its start position as well\n    // as the buffer base at that point.\n    /**\n    @internal\n    */\n    pushState(state, start) {\n        this.stack.push(this.state, start, this.bufferBase + this.buffer.length);\n        this.state = state;\n    }\n    // Apply a reduce action\n    /**\n    @internal\n    */\n    reduce(action) {\n        var _a;\n        let depth = action >> 19 /* Action.ReduceDepthShift */, type = action & 65535 /* Action.ValueMask */;\n        let { parser } = this.p;\n        let lookaheadRecord = this.reducePos < this.pos - 25 /* Lookahead.Margin */ && this.setLookAhead(this.pos);\n        let dPrec = parser.dynamicPrecedence(type);\n        if (dPrec)\n            this.score += dPrec;\n        if (depth == 0) {\n            this.pushState(parser.getGoto(this.state, type, true), this.reducePos);\n            // Zero-depth reductions are a special case—they add stuff to\n            // the stack without popping anything off.\n            if (type < parser.minRepeatTerm)\n                this.storeNode(type, this.reducePos, this.reducePos, lookaheadRecord ? 8 : 4, true);\n            this.reduceContext(type, this.reducePos);\n            return;\n        }\n        // Find the base index into `this.stack`, content after which will\n        // be dropped. Note that with `StayFlag` reductions we need to\n        // consume two extra frames (the dummy parent node for the skipped\n        // expression and the state that we'll be staying in, which should\n        // be moved to `this.state`).\n        let base = this.stack.length - ((depth - 1) * 3) - (action & 262144 /* Action.StayFlag */ ? 6 : 0);\n        let start = base ? this.stack[base - 2] : this.p.ranges[0].from, size = this.reducePos - start;\n        // This is a kludge to try and detect overly deep left-associative\n        // trees, which will not increase the parse stack depth and thus\n        // won't be caught by the regular stack-depth limit check.\n        if (size >= 2000 /* Recover.MinBigReduction */ && !((_a = this.p.parser.nodeSet.types[type]) === null || _a === void 0 ? void 0 : _a.isAnonymous)) {\n            if (start == this.p.lastBigReductionStart) {\n                this.p.bigReductionCount++;\n                this.p.lastBigReductionSize = size;\n            }\n            else if (this.p.lastBigReductionSize < size) {\n                this.p.bigReductionCount = 1;\n                this.p.lastBigReductionStart = start;\n                this.p.lastBigReductionSize = size;\n            }\n        }\n        let bufferBase = base ? this.stack[base - 1] : 0, count = this.bufferBase + this.buffer.length - bufferBase;\n        // Store normal terms or `R -> R R` repeat reductions\n        if (type < parser.minRepeatTerm || (action & 131072 /* Action.RepeatFlag */)) {\n            let pos = parser.stateFlag(this.state, 1 /* StateFlag.Skipped */) ? this.pos : this.reducePos;\n            this.storeNode(type, start, pos, count + 4, true);\n        }\n        if (action & 262144 /* Action.StayFlag */) {\n            this.state = this.stack[base];\n        }\n        else {\n            let baseStateID = this.stack[base - 3];\n            this.state = parser.getGoto(baseStateID, type, true);\n        }\n        while (this.stack.length > base)\n            this.stack.pop();\n        this.reduceContext(type, start);\n    }\n    // Shift a value into the buffer\n    /**\n    @internal\n    */\n    storeNode(term, start, end, size = 4, mustSink = false) {\n        if (term == 0 /* Term.Err */ &&\n            (!this.stack.length || this.stack[this.stack.length - 1] < this.buffer.length + this.bufferBase)) {\n            // Try to omit/merge adjacent error nodes\n            let cur = this, top = this.buffer.length;\n            if (top == 0 && cur.parent) {\n                top = cur.bufferBase - cur.parent.bufferBase;\n                cur = cur.parent;\n            }\n            if (top > 0 && cur.buffer[top - 4] == 0 /* Term.Err */ && cur.buffer[top - 1] > -1) {\n                if (start == end)\n                    return;\n                if (cur.buffer[top - 2] >= start) {\n                    cur.buffer[top - 2] = end;\n                    return;\n                }\n            }\n        }\n        if (!mustSink || this.pos == end) { // Simple case, just append\n            this.buffer.push(term, start, end, size);\n        }\n        else { // There may be skipped nodes that have to be moved forward\n            let index = this.buffer.length;\n            if (index > 0 && (this.buffer[index - 4] != 0 /* Term.Err */ || this.buffer[index - 1] < 0)) {\n                let mustMove = false;\n                for (let scan = index; scan > 0 && this.buffer[scan - 2] > end; scan -= 4) {\n                    if (this.buffer[scan - 1] >= 0) {\n                        mustMove = true;\n                        break;\n                    }\n                }\n                if (mustMove)\n                    while (index > 0 && this.buffer[index - 2] > end) {\n                        // Move this record forward\n                        this.buffer[index] = this.buffer[index - 4];\n                        this.buffer[index + 1] = this.buffer[index - 3];\n                        this.buffer[index + 2] = this.buffer[index - 2];\n                        this.buffer[index + 3] = this.buffer[index - 1];\n                        index -= 4;\n                        if (size > 4)\n                            size -= 4;\n                    }\n            }\n            this.buffer[index] = term;\n            this.buffer[index + 1] = start;\n            this.buffer[index + 2] = end;\n            this.buffer[index + 3] = size;\n        }\n    }\n    // Apply a shift action\n    /**\n    @internal\n    */\n    shift(action, type, start, end) {\n        if (action & 131072 /* Action.GotoFlag */) {\n            this.pushState(action & 65535 /* Action.ValueMask */, this.pos);\n        }\n        else if ((action & 262144 /* Action.StayFlag */) == 0) { // Regular shift\n            let nextState = action, { parser } = this.p;\n            if (end > this.pos || type <= parser.maxNode) {\n                this.pos = end;\n                if (!parser.stateFlag(nextState, 1 /* StateFlag.Skipped */))\n                    this.reducePos = end;\n            }\n            this.pushState(nextState, start);\n            this.shiftContext(type, start);\n            if (type <= parser.maxNode)\n                this.buffer.push(type, start, end, 4);\n        }\n        else { // Shift-and-stay, which means this is a skipped token\n            this.pos = end;\n            this.shiftContext(type, start);\n            if (type <= this.p.parser.maxNode)\n                this.buffer.push(type, start, end, 4);\n        }\n    }\n    // Apply an action\n    /**\n    @internal\n    */\n    apply(action, next, nextStart, nextEnd) {\n        if (action & 65536 /* Action.ReduceFlag */)\n            this.reduce(action);\n        else\n            this.shift(action, next, nextStart, nextEnd);\n    }\n    // Add a prebuilt (reused) node into the buffer.\n    /**\n    @internal\n    */\n    useNode(value, next) {\n        let index = this.p.reused.length - 1;\n        if (index < 0 || this.p.reused[index] != value) {\n            this.p.reused.push(value);\n            index++;\n        }\n        let start = this.pos;\n        this.reducePos = this.pos = start + value.length;\n        this.pushState(next, start);\n        this.buffer.push(index, start, this.reducePos, -1 /* size == -1 means this is a reused value */);\n        if (this.curContext)\n            this.updateContext(this.curContext.tracker.reuse(this.curContext.context, value, this, this.p.stream.reset(this.pos - value.length)));\n    }\n    // Split the stack. Due to the buffer sharing and the fact\n    // that `this.stack` tends to stay quite shallow, this isn't very\n    // expensive.\n    /**\n    @internal\n    */\n    split() {\n        let parent = this;\n        let off = parent.buffer.length;\n        // Because the top of the buffer (after this.pos) may be mutated\n        // to reorder reductions and skipped tokens, and shared buffers\n        // should be immutable, this copies any outstanding skipped tokens\n        // to the new buffer, and puts the base pointer before them.\n        while (off > 0 && parent.buffer[off - 2] > parent.reducePos)\n            off -= 4;\n        let buffer = parent.buffer.slice(off), base = parent.bufferBase + off;\n        // Make sure parent points to an actual parent with content, if there is such a parent.\n        while (parent && base == parent.bufferBase)\n            parent = parent.parent;\n        return new Stack(this.p, this.stack.slice(), this.state, this.reducePos, this.pos, this.score, buffer, base, this.curContext, this.lookAhead, parent);\n    }\n    // Try to recover from an error by 'deleting' (ignoring) one token.\n    /**\n    @internal\n    */\n    recoverByDelete(next, nextEnd) {\n        let isNode = next <= this.p.parser.maxNode;\n        if (isNode)\n            this.storeNode(next, this.pos, nextEnd, 4);\n        this.storeNode(0 /* Term.Err */, this.pos, nextEnd, isNode ? 8 : 4);\n        this.pos = this.reducePos = nextEnd;\n        this.score -= 190 /* Recover.Delete */;\n    }\n    /**\n    Check if the given term would be able to be shifted (optionally\n    after some reductions) on this stack. This can be useful for\n    external tokenizers that want to make sure they only provide a\n    given token when it applies.\n    */\n    canShift(term) {\n        for (let sim = new SimulatedStack(this);;) {\n            let action = this.p.parser.stateSlot(sim.state, 4 /* ParseState.DefaultReduce */) || this.p.parser.hasAction(sim.state, term);\n            if (action == 0)\n                return false;\n            if ((action & 65536 /* Action.ReduceFlag */) == 0)\n                return true;\n            sim.reduce(action);\n        }\n    }\n    // Apply up to Recover.MaxNext recovery actions that conceptually\n    // inserts some missing token or rule.\n    /**\n    @internal\n    */\n    recoverByInsert(next) {\n        if (this.stack.length >= 300 /* Recover.MaxInsertStackDepth */)\n            return [];\n        let nextStates = this.p.parser.nextStates(this.state);\n        if (nextStates.length > 4 /* Recover.MaxNext */ << 1 || this.stack.length >= 120 /* Recover.DampenInsertStackDepth */) {\n            let best = [];\n            for (let i = 0, s; i < nextStates.length; i += 2) {\n                if ((s = nextStates[i + 1]) != this.state && this.p.parser.hasAction(s, next))\n                    best.push(nextStates[i], s);\n            }\n            if (this.stack.length < 120 /* Recover.DampenInsertStackDepth */)\n                for (let i = 0; best.length < 4 /* Recover.MaxNext */ << 1 && i < nextStates.length; i += 2) {\n                    let s = nextStates[i + 1];\n                    if (!best.some((v, i) => (i & 1) && v == s))\n                        best.push(nextStates[i], s);\n                }\n            nextStates = best;\n        }\n        let result = [];\n        for (let i = 0; i < nextStates.length && result.length < 4 /* Recover.MaxNext */; i += 2) {\n            let s = nextStates[i + 1];\n            if (s == this.state)\n                continue;\n            let stack = this.split();\n            stack.pushState(s, this.pos);\n            stack.storeNode(0 /* Term.Err */, stack.pos, stack.pos, 4, true);\n            stack.shiftContext(nextStates[i], this.pos);\n            stack.reducePos = this.pos;\n            stack.score -= 200 /* Recover.Insert */;\n            result.push(stack);\n        }\n        return result;\n    }\n    // Force a reduce, if possible. Return false if that can't\n    // be done.\n    /**\n    @internal\n    */\n    forceReduce() {\n        let { parser } = this.p;\n        let reduce = parser.stateSlot(this.state, 5 /* ParseState.ForcedReduce */);\n        if ((reduce & 65536 /* Action.ReduceFlag */) == 0)\n            return false;\n        if (!parser.validAction(this.state, reduce)) {\n            let depth = reduce >> 19 /* Action.ReduceDepthShift */, term = reduce & 65535 /* Action.ValueMask */;\n            let target = this.stack.length - depth * 3;\n            if (target < 0 || parser.getGoto(this.stack[target], term, false) < 0) {\n                let backup = this.findForcedReduction();\n                if (backup == null)\n                    return false;\n                reduce = backup;\n            }\n            this.storeNode(0 /* Term.Err */, this.pos, this.pos, 4, true);\n            this.score -= 100 /* Recover.Reduce */;\n        }\n        this.reducePos = this.pos;\n        this.reduce(reduce);\n        return true;\n    }\n    /**\n    Try to scan through the automaton to find some kind of reduction\n    that can be applied. Used when the regular ForcedReduce field\n    isn't a valid action. @internal\n    */\n    findForcedReduction() {\n        let { parser } = this.p, seen = [];\n        let explore = (state, depth) => {\n            if (seen.includes(state))\n                return;\n            seen.push(state);\n            return parser.allActions(state, (action) => {\n                if (action & (262144 /* Action.StayFlag */ | 131072 /* Action.GotoFlag */)) ;\n                else if (action & 65536 /* Action.ReduceFlag */) {\n                    let rDepth = (action >> 19 /* Action.ReduceDepthShift */) - depth;\n                    if (rDepth > 1) {\n                        let term = action & 65535 /* Action.ValueMask */, target = this.stack.length - rDepth * 3;\n                        if (target >= 0 && parser.getGoto(this.stack[target], term, false) >= 0)\n                            return (rDepth << 19 /* Action.ReduceDepthShift */) | 65536 /* Action.ReduceFlag */ | term;\n                    }\n                }\n                else {\n                    let found = explore(action, depth + 1);\n                    if (found != null)\n                        return found;\n                }\n            });\n        };\n        return explore(this.state, 0);\n    }\n    /**\n    @internal\n    */\n    forceAll() {\n        while (!this.p.parser.stateFlag(this.state, 2 /* StateFlag.Accepting */)) {\n            if (!this.forceReduce()) {\n                this.storeNode(0 /* Term.Err */, this.pos, this.pos, 4, true);\n                break;\n            }\n        }\n        return this;\n    }\n    /**\n    Check whether this state has no further actions (assumed to be a direct descendant of the\n    top state, since any other states must be able to continue\n    somehow). @internal\n    */\n    get deadEnd() {\n        if (this.stack.length != 3)\n            return false;\n        let { parser } = this.p;\n        return parser.data[parser.stateSlot(this.state, 1 /* ParseState.Actions */)] == 65535 /* Seq.End */ &&\n            !parser.stateSlot(this.state, 4 /* ParseState.DefaultReduce */);\n    }\n    /**\n    Restart the stack (put it back in its start state). Only safe\n    when this.stack.length == 3 (state is directly below the top\n    state). @internal\n    */\n    restart() {\n        this.storeNode(0 /* Term.Err */, this.pos, this.pos, 4, true);\n        this.state = this.stack[0];\n        this.stack.length = 0;\n    }\n    /**\n    @internal\n    */\n    sameState(other) {\n        if (this.state != other.state || this.stack.length != other.stack.length)\n            return false;\n        for (let i = 0; i < this.stack.length; i += 3)\n            if (this.stack[i] != other.stack[i])\n                return false;\n        return true;\n    }\n    /**\n    Get the parser used by this stack.\n    */\n    get parser() { return this.p.parser; }\n    /**\n    Test whether a given dialect (by numeric ID, as exported from\n    the terms file) is enabled.\n    */\n    dialectEnabled(dialectID) { return this.p.parser.dialect.flags[dialectID]; }\n    shiftContext(term, start) {\n        if (this.curContext)\n            this.updateContext(this.curContext.tracker.shift(this.curContext.context, term, this, this.p.stream.reset(start)));\n    }\n    reduceContext(term, start) {\n        if (this.curContext)\n            this.updateContext(this.curContext.tracker.reduce(this.curContext.context, term, this, this.p.stream.reset(start)));\n    }\n    /**\n    @internal\n    */\n    emitContext() {\n        let last = this.buffer.length - 1;\n        if (last < 0 || this.buffer[last] != -3)\n            this.buffer.push(this.curContext.hash, this.pos, this.pos, -3);\n    }\n    /**\n    @internal\n    */\n    emitLookAhead() {\n        let last = this.buffer.length - 1;\n        if (last < 0 || this.buffer[last] != -4)\n            this.buffer.push(this.lookAhead, this.pos, this.pos, -4);\n    }\n    updateContext(context) {\n        if (context != this.curContext.context) {\n            let newCx = new StackContext(this.curContext.tracker, context);\n            if (newCx.hash != this.curContext.hash)\n                this.emitContext();\n            this.curContext = newCx;\n        }\n    }\n    /**\n    @internal\n    */\n    setLookAhead(lookAhead) {\n        if (lookAhead <= this.lookAhead)\n            return false;\n        this.emitLookAhead();\n        this.lookAhead = lookAhead;\n        return true;\n    }\n    /**\n    @internal\n    */\n    close() {\n        if (this.curContext && this.curContext.tracker.strict)\n            this.emitContext();\n        if (this.lookAhead > 0)\n            this.emitLookAhead();\n    }\n}\nclass StackContext {\n    constructor(tracker, context) {\n        this.tracker = tracker;\n        this.context = context;\n        this.hash = tracker.strict ? tracker.hash(context) : 0;\n    }\n}\n// Used to cheaply run some reductions to scan ahead without mutating\n// an entire stack\nclass SimulatedStack {\n    constructor(start) {\n        this.start = start;\n        this.state = start.state;\n        this.stack = start.stack;\n        this.base = this.stack.length;\n    }\n    reduce(action) {\n        let term = action & 65535 /* Action.ValueMask */, depth = action >> 19 /* Action.ReduceDepthShift */;\n        if (depth == 0) {\n            if (this.stack == this.start.stack)\n                this.stack = this.stack.slice();\n            this.stack.push(this.state, 0, 0);\n            this.base += 3;\n        }\n        else {\n            this.base -= (depth - 1) * 3;\n        }\n        let goto = this.start.p.parser.getGoto(this.stack[this.base - 3], term, true);\n        this.state = goto;\n    }\n}\n// This is given to `Tree.build` to build a buffer, and encapsulates\n// the parent-stack-walking necessary to read the nodes.\nclass StackBufferCursor {\n    constructor(stack, pos, index) {\n        this.stack = stack;\n        this.pos = pos;\n        this.index = index;\n        this.buffer = stack.buffer;\n        if (this.index == 0)\n            this.maybeNext();\n    }\n    static create(stack, pos = stack.bufferBase + stack.buffer.length) {\n        return new StackBufferCursor(stack, pos, pos - stack.bufferBase);\n    }\n    maybeNext() {\n        let next = this.stack.parent;\n        if (next != null) {\n            this.index = this.stack.bufferBase - next.bufferBase;\n            this.stack = next;\n            this.buffer = next.buffer;\n        }\n    }\n    get id() { return this.buffer[this.index - 4]; }\n    get start() { return this.buffer[this.index - 3]; }\n    get end() { return this.buffer[this.index - 2]; }\n    get size() { return this.buffer[this.index - 1]; }\n    next() {\n        this.index -= 4;\n        this.pos -= 4;\n        if (this.index == 0)\n            this.maybeNext();\n    }\n    fork() {\n        return new StackBufferCursor(this.stack, this.pos, this.index);\n    }\n}\n\n// See lezer-generator/src/encode.ts for comments about the encoding\n// used here\nfunction decodeArray(input, Type = Uint16Array) {\n    if (typeof input != \"string\")\n        return input;\n    let array = null;\n    for (let pos = 0, out = 0; pos < input.length;) {\n        let value = 0;\n        for (;;) {\n            let next = input.charCodeAt(pos++), stop = false;\n            if (next == 126 /* Encode.BigValCode */) {\n                value = 65535 /* Encode.BigVal */;\n                break;\n            }\n            if (next >= 92 /* Encode.Gap2 */)\n                next--;\n            if (next >= 34 /* Encode.Gap1 */)\n                next--;\n            let digit = next - 32 /* Encode.Start */;\n            if (digit >= 46 /* Encode.Base */) {\n                digit -= 46 /* Encode.Base */;\n                stop = true;\n            }\n            value += digit;\n            if (stop)\n                break;\n            value *= 46 /* Encode.Base */;\n        }\n        if (array)\n            array[out++] = value;\n        else\n            array = new Type(value);\n    }\n    return array;\n}\n\nclass CachedToken {\n    constructor() {\n        this.start = -1;\n        this.value = -1;\n        this.end = -1;\n        this.extended = -1;\n        this.lookAhead = 0;\n        this.mask = 0;\n        this.context = 0;\n    }\n}\nconst nullToken = new CachedToken;\n/**\n[Tokenizers](#lr.ExternalTokenizer) interact with the input\nthrough this interface. It presents the input as a stream of\ncharacters, tracking lookahead and hiding the complexity of\n[ranges](#common.Parser.parse^ranges) from tokenizer code.\n*/\nclass InputStream {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    @internal\n    */\n    input, \n    /**\n    @internal\n    */\n    ranges) {\n        this.input = input;\n        this.ranges = ranges;\n        /**\n        @internal\n        */\n        this.chunk = \"\";\n        /**\n        @internal\n        */\n        this.chunkOff = 0;\n        /**\n        Backup chunk\n        */\n        this.chunk2 = \"\";\n        this.chunk2Pos = 0;\n        /**\n        The character code of the next code unit in the input, or -1\n        when the stream is at the end of the input.\n        */\n        this.next = -1;\n        /**\n        @internal\n        */\n        this.token = nullToken;\n        this.rangeIndex = 0;\n        this.pos = this.chunkPos = ranges[0].from;\n        this.range = ranges[0];\n        this.end = ranges[ranges.length - 1].to;\n        this.readNext();\n    }\n    /**\n    @internal\n    */\n    resolveOffset(offset, assoc) {\n        let range = this.range, index = this.rangeIndex;\n        let pos = this.pos + offset;\n        while (pos < range.from) {\n            if (!index)\n                return null;\n            let next = this.ranges[--index];\n            pos -= range.from - next.to;\n            range = next;\n        }\n        while (assoc < 0 ? pos > range.to : pos >= range.to) {\n            if (index == this.ranges.length - 1)\n                return null;\n            let next = this.ranges[++index];\n            pos += next.from - range.to;\n            range = next;\n        }\n        return pos;\n    }\n    /**\n    @internal\n    */\n    clipPos(pos) {\n        if (pos >= this.range.from && pos < this.range.to)\n            return pos;\n        for (let range of this.ranges)\n            if (range.to > pos)\n                return Math.max(pos, range.from);\n        return this.end;\n    }\n    /**\n    Look at a code unit near the stream position. `.peek(0)` equals\n    `.next`, `.peek(-1)` gives you the previous character, and so\n    on.\n    \n    Note that looking around during tokenizing creates dependencies\n    on potentially far-away content, which may reduce the\n    effectiveness incremental parsing—when looking forward—or even\n    cause invalid reparses when looking backward more than 25 code\n    units, since the library does not track lookbehind.\n    */\n    peek(offset) {\n        let idx = this.chunkOff + offset, pos, result;\n        if (idx >= 0 && idx < this.chunk.length) {\n            pos = this.pos + offset;\n            result = this.chunk.charCodeAt(idx);\n        }\n        else {\n            let resolved = this.resolveOffset(offset, 1);\n            if (resolved == null)\n                return -1;\n            pos = resolved;\n            if (pos >= this.chunk2Pos && pos < this.chunk2Pos + this.chunk2.length) {\n                result = this.chunk2.charCodeAt(pos - this.chunk2Pos);\n            }\n            else {\n                let i = this.rangeIndex, range = this.range;\n                while (range.to <= pos)\n                    range = this.ranges[++i];\n                this.chunk2 = this.input.chunk(this.chunk2Pos = pos);\n                if (pos + this.chunk2.length > range.to)\n                    this.chunk2 = this.chunk2.slice(0, range.to - pos);\n                result = this.chunk2.charCodeAt(0);\n            }\n        }\n        if (pos >= this.token.lookAhead)\n            this.token.lookAhead = pos + 1;\n        return result;\n    }\n    /**\n    Accept a token. By default, the end of the token is set to the\n    current stream position, but you can pass an offset (relative to\n    the stream position) to change that.\n    */\n    acceptToken(token, endOffset = 0) {\n        let end = endOffset ? this.resolveOffset(endOffset, -1) : this.pos;\n        if (end == null || end < this.token.start)\n            throw new RangeError(\"Token end out of bounds\");\n        this.token.value = token;\n        this.token.end = end;\n    }\n    /**\n    Accept a token ending at a specific given position.\n    */\n    acceptTokenTo(token, endPos) {\n        this.token.value = token;\n        this.token.end = endPos;\n    }\n    getChunk() {\n        if (this.pos >= this.chunk2Pos && this.pos < this.chunk2Pos + this.chunk2.length) {\n            let { chunk, chunkPos } = this;\n            this.chunk = this.chunk2;\n            this.chunkPos = this.chunk2Pos;\n            this.chunk2 = chunk;\n            this.chunk2Pos = chunkPos;\n            this.chunkOff = this.pos - this.chunkPos;\n        }\n        else {\n            this.chunk2 = this.chunk;\n            this.chunk2Pos = this.chunkPos;\n            let nextChunk = this.input.chunk(this.pos);\n            let end = this.pos + nextChunk.length;\n            this.chunk = end > this.range.to ? nextChunk.slice(0, this.range.to - this.pos) : nextChunk;\n            this.chunkPos = this.pos;\n            this.chunkOff = 0;\n        }\n    }\n    readNext() {\n        if (this.chunkOff >= this.chunk.length) {\n            this.getChunk();\n            if (this.chunkOff == this.chunk.length)\n                return this.next = -1;\n        }\n        return this.next = this.chunk.charCodeAt(this.chunkOff);\n    }\n    /**\n    Move the stream forward N (defaults to 1) code units. Returns\n    the new value of [`next`](#lr.InputStream.next).\n    */\n    advance(n = 1) {\n        this.chunkOff += n;\n        while (this.pos + n >= this.range.to) {\n            if (this.rangeIndex == this.ranges.length - 1)\n                return this.setDone();\n            n -= this.range.to - this.pos;\n            this.range = this.ranges[++this.rangeIndex];\n            this.pos = this.range.from;\n        }\n        this.pos += n;\n        if (this.pos >= this.token.lookAhead)\n            this.token.lookAhead = this.pos + 1;\n        return this.readNext();\n    }\n    setDone() {\n        this.pos = this.chunkPos = this.end;\n        this.range = this.ranges[this.rangeIndex = this.ranges.length - 1];\n        this.chunk = \"\";\n        return this.next = -1;\n    }\n    /**\n    @internal\n    */\n    reset(pos, token) {\n        if (token) {\n            this.token = token;\n            token.start = pos;\n            token.lookAhead = pos + 1;\n            token.value = token.extended = -1;\n        }\n        else {\n            this.token = nullToken;\n        }\n        if (this.pos != pos) {\n            this.pos = pos;\n            if (pos == this.end) {\n                this.setDone();\n                return this;\n            }\n            while (pos < this.range.from)\n                this.range = this.ranges[--this.rangeIndex];\n            while (pos >= this.range.to)\n                this.range = this.ranges[++this.rangeIndex];\n            if (pos >= this.chunkPos && pos < this.chunkPos + this.chunk.length) {\n                this.chunkOff = pos - this.chunkPos;\n            }\n            else {\n                this.chunk = \"\";\n                this.chunkOff = 0;\n            }\n            this.readNext();\n        }\n        return this;\n    }\n    /**\n    @internal\n    */\n    read(from, to) {\n        if (from >= this.chunkPos && to <= this.chunkPos + this.chunk.length)\n            return this.chunk.slice(from - this.chunkPos, to - this.chunkPos);\n        if (from >= this.chunk2Pos && to <= this.chunk2Pos + this.chunk2.length)\n            return this.chunk2.slice(from - this.chunk2Pos, to - this.chunk2Pos);\n        if (from >= this.range.from && to <= this.range.to)\n            return this.input.read(from, to);\n        let result = \"\";\n        for (let r of this.ranges) {\n            if (r.from >= to)\n                break;\n            if (r.to > from)\n                result += this.input.read(Math.max(r.from, from), Math.min(r.to, to));\n        }\n        return result;\n    }\n}\n/**\n@internal\n*/\nclass TokenGroup {\n    constructor(data, id) {\n        this.data = data;\n        this.id = id;\n    }\n    token(input, stack) {\n        let { parser } = stack.p;\n        readToken(this.data, input, stack, this.id, parser.data, parser.tokenPrecTable);\n    }\n}\nTokenGroup.prototype.contextual = TokenGroup.prototype.fallback = TokenGroup.prototype.extend = false;\n/**\n@hide\n*/\nclass LocalTokenGroup {\n    constructor(data, precTable, elseToken) {\n        this.precTable = precTable;\n        this.elseToken = elseToken;\n        this.data = typeof data == \"string\" ? decodeArray(data) : data;\n    }\n    token(input, stack) {\n        let start = input.pos, skipped = 0;\n        for (;;) {\n            let atEof = input.next < 0, nextPos = input.resolveOffset(1, 1);\n            readToken(this.data, input, stack, 0, this.data, this.precTable);\n            if (input.token.value > -1)\n                break;\n            if (this.elseToken == null)\n                return;\n            if (!atEof)\n                skipped++;\n            if (nextPos == null)\n                break;\n            input.reset(nextPos, input.token);\n        }\n        if (skipped) {\n            input.reset(start, input.token);\n            input.acceptToken(this.elseToken, skipped);\n        }\n    }\n}\nLocalTokenGroup.prototype.contextual = TokenGroup.prototype.fallback = TokenGroup.prototype.extend = false;\n/**\n`@external tokens` declarations in the grammar should resolve to\nan instance of this class.\n*/\nclass ExternalTokenizer {\n    /**\n    Create a tokenizer. The first argument is the function that,\n    given an input stream, scans for the types of tokens it\n    recognizes at the stream's position, and calls\n    [`acceptToken`](#lr.InputStream.acceptToken) when it finds\n    one.\n    */\n    constructor(\n    /**\n    @internal\n    */\n    token, options = {}) {\n        this.token = token;\n        this.contextual = !!options.contextual;\n        this.fallback = !!options.fallback;\n        this.extend = !!options.extend;\n    }\n}\n// Tokenizer data is stored a big uint16 array containing, for each\n// state:\n//\n//  - A group bitmask, indicating what token groups are reachable from\n//    this state, so that paths that can only lead to tokens not in\n//    any of the current groups can be cut off early.\n//\n//  - The position of the end of the state's sequence of accepting\n//    tokens\n//\n//  - The number of outgoing edges for the state\n//\n//  - The accepting tokens, as (token id, group mask) pairs\n//\n//  - The outgoing edges, as (start character, end character, state\n//    index) triples, with end character being exclusive\n//\n// This function interprets that data, running through a stream as\n// long as new states with the a matching group mask can be reached,\n// and updating `input.token` when it matches a token.\nfunction readToken(data, input, stack, group, precTable, precOffset) {\n    let state = 0, groupMask = 1 << group, { dialect } = stack.p.parser;\n    scan: for (;;) {\n        if ((groupMask & data[state]) == 0)\n            break;\n        let accEnd = data[state + 1];\n        // Check whether this state can lead to a token in the current group\n        // Accept tokens in this state, possibly overwriting\n        // lower-precedence / shorter tokens\n        for (let i = state + 3; i < accEnd; i += 2)\n            if ((data[i + 1] & groupMask) > 0) {\n                let term = data[i];\n                if (dialect.allows(term) &&\n                    (input.token.value == -1 || input.token.value == term ||\n                        overrides(term, input.token.value, precTable, precOffset))) {\n                    input.acceptToken(term);\n                    break;\n                }\n            }\n        let next = input.next, low = 0, high = data[state + 2];\n        // Special case for EOF\n        if (input.next < 0 && high > low && data[accEnd + high * 3 - 3] == 65535 /* Seq.End */) {\n            state = data[accEnd + high * 3 - 1];\n            continue scan;\n        }\n        // Do a binary search on the state's edges\n        for (; low < high;) {\n            let mid = (low + high) >> 1;\n            let index = accEnd + mid + (mid << 1);\n            let from = data[index], to = data[index + 1] || 0x10000;\n            if (next < from)\n                high = mid;\n            else if (next >= to)\n                low = mid + 1;\n            else {\n                state = data[index + 2];\n                input.advance();\n                continue scan;\n            }\n        }\n        break;\n    }\n}\nfunction findOffset(data, start, term) {\n    for (let i = start, next; (next = data[i]) != 65535 /* Seq.End */; i++)\n        if (next == term)\n            return i - start;\n    return -1;\n}\nfunction overrides(token, prev, tableData, tableOffset) {\n    let iPrev = findOffset(tableData, tableOffset, prev);\n    return iPrev < 0 || findOffset(tableData, tableOffset, token) < iPrev;\n}\n\n// Environment variable used to control console output\nconst verbose = typeof process != \"undefined\" && process.env && /\\bparse\\b/.test(process.env.LOG);\nlet stackIDs = null;\nfunction cutAt(tree, pos, side) {\n    let cursor = tree.cursor(common.IterMode.IncludeAnonymous);\n    cursor.moveTo(pos);\n    for (;;) {\n        if (!(side < 0 ? cursor.childBefore(pos) : cursor.childAfter(pos)))\n            for (;;) {\n                if ((side < 0 ? cursor.to < pos : cursor.from > pos) && !cursor.type.isError)\n                    return side < 0 ? Math.max(0, Math.min(cursor.to - 1, pos - 25 /* Lookahead.Margin */))\n                        : Math.min(tree.length, Math.max(cursor.from + 1, pos + 25 /* Lookahead.Margin */));\n                if (side < 0 ? cursor.prevSibling() : cursor.nextSibling())\n                    break;\n                if (!cursor.parent())\n                    return side < 0 ? 0 : tree.length;\n            }\n    }\n}\nclass FragmentCursor {\n    constructor(fragments, nodeSet) {\n        this.fragments = fragments;\n        this.nodeSet = nodeSet;\n        this.i = 0;\n        this.fragment = null;\n        this.safeFrom = -1;\n        this.safeTo = -1;\n        this.trees = [];\n        this.start = [];\n        this.index = [];\n        this.nextFragment();\n    }\n    nextFragment() {\n        let fr = this.fragment = this.i == this.fragments.length ? null : this.fragments[this.i++];\n        if (fr) {\n            this.safeFrom = fr.openStart ? cutAt(fr.tree, fr.from + fr.offset, 1) - fr.offset : fr.from;\n            this.safeTo = fr.openEnd ? cutAt(fr.tree, fr.to + fr.offset, -1) - fr.offset : fr.to;\n            while (this.trees.length) {\n                this.trees.pop();\n                this.start.pop();\n                this.index.pop();\n            }\n            this.trees.push(fr.tree);\n            this.start.push(-fr.offset);\n            this.index.push(0);\n            this.nextStart = this.safeFrom;\n        }\n        else {\n            this.nextStart = 1e9;\n        }\n    }\n    // `pos` must be >= any previously given `pos` for this cursor\n    nodeAt(pos) {\n        if (pos < this.nextStart)\n            return null;\n        while (this.fragment && this.safeTo <= pos)\n            this.nextFragment();\n        if (!this.fragment)\n            return null;\n        for (;;) {\n            let last = this.trees.length - 1;\n            if (last < 0) { // End of tree\n                this.nextFragment();\n                return null;\n            }\n            let top = this.trees[last], index = this.index[last];\n            if (index == top.children.length) {\n                this.trees.pop();\n                this.start.pop();\n                this.index.pop();\n                continue;\n            }\n            let next = top.children[index];\n            let start = this.start[last] + top.positions[index];\n            if (start > pos) {\n                this.nextStart = start;\n                return null;\n            }\n            if (next instanceof common.Tree) {\n                if (start == pos) {\n                    if (start < this.safeFrom)\n                        return null;\n                    let end = start + next.length;\n                    if (end <= this.safeTo) {\n                        let lookAhead = next.prop(common.NodeProp.lookAhead);\n                        if (!lookAhead || end + lookAhead < this.fragment.to)\n                            return next;\n                    }\n                }\n                this.index[last]++;\n                if (start + next.length >= Math.max(this.safeFrom, pos)) { // Enter this node\n                    this.trees.push(next);\n                    this.start.push(start);\n                    this.index.push(0);\n                }\n            }\n            else {\n                this.index[last]++;\n                this.nextStart = start + next.length;\n            }\n        }\n    }\n}\nclass TokenCache {\n    constructor(parser, stream) {\n        this.stream = stream;\n        this.tokens = [];\n        this.mainToken = null;\n        this.actions = [];\n        this.tokens = parser.tokenizers.map(_ => new CachedToken);\n    }\n    getActions(stack) {\n        let actionIndex = 0;\n        let main = null;\n        let { parser } = stack.p, { tokenizers } = parser;\n        let mask = parser.stateSlot(stack.state, 3 /* ParseState.TokenizerMask */);\n        let context = stack.curContext ? stack.curContext.hash : 0;\n        let lookAhead = 0;\n        for (let i = 0; i < tokenizers.length; i++) {\n            if (((1 << i) & mask) == 0)\n                continue;\n            let tokenizer = tokenizers[i], token = this.tokens[i];\n            if (main && !tokenizer.fallback)\n                continue;\n            if (tokenizer.contextual || token.start != stack.pos || token.mask != mask || token.context != context) {\n                this.updateCachedToken(token, tokenizer, stack);\n                token.mask = mask;\n                token.context = context;\n            }\n            if (token.lookAhead > token.end + 25 /* Lookahead.Margin */)\n                lookAhead = Math.max(token.lookAhead, lookAhead);\n            if (token.value != 0 /* Term.Err */) {\n                let startIndex = actionIndex;\n                if (token.extended > -1)\n                    actionIndex = this.addActions(stack, token.extended, token.end, actionIndex);\n                actionIndex = this.addActions(stack, token.value, token.end, actionIndex);\n                if (!tokenizer.extend) {\n                    main = token;\n                    if (actionIndex > startIndex)\n                        break;\n                }\n            }\n        }\n        while (this.actions.length > actionIndex)\n            this.actions.pop();\n        if (lookAhead)\n            stack.setLookAhead(lookAhead);\n        if (!main && stack.pos == this.stream.end) {\n            main = new CachedToken;\n            main.value = stack.p.parser.eofTerm;\n            main.start = main.end = stack.pos;\n            actionIndex = this.addActions(stack, main.value, main.end, actionIndex);\n        }\n        this.mainToken = main;\n        return this.actions;\n    }\n    getMainToken(stack) {\n        if (this.mainToken)\n            return this.mainToken;\n        let main = new CachedToken, { pos, p } = stack;\n        main.start = pos;\n        main.end = Math.min(pos + 1, p.stream.end);\n        main.value = pos == p.stream.end ? p.parser.eofTerm : 0 /* Term.Err */;\n        return main;\n    }\n    updateCachedToken(token, tokenizer, stack) {\n        let start = this.stream.clipPos(stack.pos);\n        tokenizer.token(this.stream.reset(start, token), stack);\n        if (token.value > -1) {\n            let { parser } = stack.p;\n            for (let i = 0; i < parser.specialized.length; i++)\n                if (parser.specialized[i] == token.value) {\n                    let result = parser.specializers[i](this.stream.read(token.start, token.end), stack);\n                    if (result >= 0 && stack.p.parser.dialect.allows(result >> 1)) {\n                        if ((result & 1) == 0 /* Specialize.Specialize */)\n                            token.value = result >> 1;\n                        else\n                            token.extended = result >> 1;\n                        break;\n                    }\n                }\n        }\n        else {\n            token.value = 0 /* Term.Err */;\n            token.end = this.stream.clipPos(start + 1);\n        }\n    }\n    putAction(action, token, end, index) {\n        // Don't add duplicate actions\n        for (let i = 0; i < index; i += 3)\n            if (this.actions[i] == action)\n                return index;\n        this.actions[index++] = action;\n        this.actions[index++] = token;\n        this.actions[index++] = end;\n        return index;\n    }\n    addActions(stack, token, end, index) {\n        let { state } = stack, { parser } = stack.p, { data } = parser;\n        for (let set = 0; set < 2; set++) {\n            for (let i = parser.stateSlot(state, set ? 2 /* ParseState.Skip */ : 1 /* ParseState.Actions */);; i += 3) {\n                if (data[i] == 65535 /* Seq.End */) {\n                    if (data[i + 1] == 1 /* Seq.Next */) {\n                        i = pair(data, i + 2);\n                    }\n                    else {\n                        if (index == 0 && data[i + 1] == 2 /* Seq.Other */)\n                            index = this.putAction(pair(data, i + 2), token, end, index);\n                        break;\n                    }\n                }\n                if (data[i] == token)\n                    index = this.putAction(pair(data, i + 1), token, end, index);\n            }\n        }\n        return index;\n    }\n}\nclass Parse {\n    constructor(parser, input, fragments, ranges) {\n        this.parser = parser;\n        this.input = input;\n        this.ranges = ranges;\n        this.recovering = 0;\n        this.nextStackID = 0x2654; // ♔, ♕, ♖, ♗, ♘, ♙, ♠, ♡, ♢, ♣, ♤, ♥, ♦, ♧\n        this.minStackPos = 0;\n        this.reused = [];\n        this.stoppedAt = null;\n        this.lastBigReductionStart = -1;\n        this.lastBigReductionSize = 0;\n        this.bigReductionCount = 0;\n        this.stream = new InputStream(input, ranges);\n        this.tokens = new TokenCache(parser, this.stream);\n        this.topTerm = parser.top[1];\n        let { from } = ranges[0];\n        this.stacks = [Stack.start(this, parser.top[0], from)];\n        this.fragments = fragments.length && this.stream.end - from > parser.bufferLength * 4\n            ? new FragmentCursor(fragments, parser.nodeSet) : null;\n    }\n    get parsedPos() {\n        return this.minStackPos;\n    }\n    // Move the parser forward. This will process all parse stacks at\n    // `this.pos` and try to advance them to a further position. If no\n    // stack for such a position is found, it'll start error-recovery.\n    //\n    // When the parse is finished, this will return a syntax tree. When\n    // not, it returns `null`.\n    advance() {\n        let stacks = this.stacks, pos = this.minStackPos;\n        // This will hold stacks beyond `pos`.\n        let newStacks = this.stacks = [];\n        let stopped, stoppedTokens;\n        // If a large amount of reductions happened with the same start\n        // position, force the stack out of that production in order to\n        // avoid creating a tree too deep to recurse through.\n        // (This is an ugly kludge, because unfortunately there is no\n        // straightforward, cheap way to check for this happening, due to\n        // the history of reductions only being available in an\n        // expensive-to-access format in the stack buffers.)\n        if (this.bigReductionCount > 300 /* Rec.MaxLeftAssociativeReductionCount */ && stacks.length == 1) {\n            let [s] = stacks;\n            while (s.forceReduce() && s.stack.length && s.stack[s.stack.length - 2] >= this.lastBigReductionStart) { }\n            this.bigReductionCount = this.lastBigReductionSize = 0;\n        }\n        // Keep advancing any stacks at `pos` until they either move\n        // forward or can't be advanced. Gather stacks that can't be\n        // advanced further in `stopped`.\n        for (let i = 0; i < stacks.length; i++) {\n            let stack = stacks[i];\n            for (;;) {\n                this.tokens.mainToken = null;\n                if (stack.pos > pos) {\n                    newStacks.push(stack);\n                }\n                else if (this.advanceStack(stack, newStacks, stacks)) {\n                    continue;\n                }\n                else {\n                    if (!stopped) {\n                        stopped = [];\n                        stoppedTokens = [];\n                    }\n                    stopped.push(stack);\n                    let tok = this.tokens.getMainToken(stack);\n                    stoppedTokens.push(tok.value, tok.end);\n                }\n                break;\n            }\n        }\n        if (!newStacks.length) {\n            let finished = stopped && findFinished(stopped);\n            if (finished) {\n                if (verbose)\n                    console.log(\"Finish with \" + this.stackID(finished));\n                return this.stackToTree(finished);\n            }\n            if (this.parser.strict) {\n                if (verbose && stopped)\n                    console.log(\"Stuck with token \" + (this.tokens.mainToken ? this.parser.getName(this.tokens.mainToken.value) : \"none\"));\n                throw new SyntaxError(\"No parse at \" + pos);\n            }\n            if (!this.recovering)\n                this.recovering = 5 /* Rec.Distance */;\n        }\n        if (this.recovering && stopped) {\n            let finished = this.stoppedAt != null && stopped[0].pos > this.stoppedAt ? stopped[0]\n                : this.runRecovery(stopped, stoppedTokens, newStacks);\n            if (finished) {\n                if (verbose)\n                    console.log(\"Force-finish \" + this.stackID(finished));\n                return this.stackToTree(finished.forceAll());\n            }\n        }\n        if (this.recovering) {\n            let maxRemaining = this.recovering == 1 ? 1 : this.recovering * 3 /* Rec.MaxRemainingPerStep */;\n            if (newStacks.length > maxRemaining) {\n                newStacks.sort((a, b) => b.score - a.score);\n                while (newStacks.length > maxRemaining)\n                    newStacks.pop();\n            }\n            if (newStacks.some(s => s.reducePos > pos))\n                this.recovering--;\n        }\n        else if (newStacks.length > 1) {\n            // Prune stacks that are in the same state, or that have been\n            // running without splitting for a while, to avoid getting stuck\n            // with multiple successful stacks running endlessly on.\n            outer: for (let i = 0; i < newStacks.length - 1; i++) {\n                let stack = newStacks[i];\n                for (let j = i + 1; j < newStacks.length; j++) {\n                    let other = newStacks[j];\n                    if (stack.sameState(other) ||\n                        stack.buffer.length > 500 /* Rec.MinBufferLengthPrune */ && other.buffer.length > 500 /* Rec.MinBufferLengthPrune */) {\n                        if (((stack.score - other.score) || (stack.buffer.length - other.buffer.length)) > 0) {\n                            newStacks.splice(j--, 1);\n                        }\n                        else {\n                            newStacks.splice(i--, 1);\n                            continue outer;\n                        }\n                    }\n                }\n            }\n            if (newStacks.length > 12 /* Rec.MaxStackCount */) {\n                newStacks.sort((a, b) => b.score - a.score);\n                newStacks.splice(12 /* Rec.MaxStackCount */, newStacks.length - 12 /* Rec.MaxStackCount */);\n            }\n        }\n        this.minStackPos = newStacks[0].pos;\n        for (let i = 1; i < newStacks.length; i++)\n            if (newStacks[i].pos < this.minStackPos)\n                this.minStackPos = newStacks[i].pos;\n        return null;\n    }\n    stopAt(pos) {\n        if (this.stoppedAt != null && this.stoppedAt < pos)\n            throw new RangeError(\"Can't move stoppedAt forward\");\n        this.stoppedAt = pos;\n    }\n    // Returns an updated version of the given stack, or null if the\n    // stack can't advance normally. When `split` and `stacks` are\n    // given, stacks split off by ambiguous operations will be pushed to\n    // `split`, or added to `stacks` if they move `pos` forward.\n    advanceStack(stack, stacks, split) {\n        let start = stack.pos, { parser } = this;\n        let base = verbose ? this.stackID(stack) + \" -> \" : \"\";\n        if (this.stoppedAt != null && start > this.stoppedAt)\n            return stack.forceReduce() ? stack : null;\n        if (this.fragments) {\n            let strictCx = stack.curContext && stack.curContext.tracker.strict, cxHash = strictCx ? stack.curContext.hash : 0;\n            for (let cached = this.fragments.nodeAt(start); cached;) {\n                let match = this.parser.nodeSet.types[cached.type.id] == cached.type ? parser.getGoto(stack.state, cached.type.id) : -1;\n                if (match > -1 && cached.length && (!strictCx || (cached.prop(common.NodeProp.contextHash) || 0) == cxHash)) {\n                    stack.useNode(cached, match);\n                    if (verbose)\n                        console.log(base + this.stackID(stack) + ` (via reuse of ${parser.getName(cached.type.id)})`);\n                    return true;\n                }\n                if (!(cached instanceof common.Tree) || cached.children.length == 0 || cached.positions[0] > 0)\n                    break;\n                let inner = cached.children[0];\n                if (inner instanceof common.Tree && cached.positions[0] == 0)\n                    cached = inner;\n                else\n                    break;\n            }\n        }\n        let defaultReduce = parser.stateSlot(stack.state, 4 /* ParseState.DefaultReduce */);\n        if (defaultReduce > 0) {\n            stack.reduce(defaultReduce);\n            if (verbose)\n                console.log(base + this.stackID(stack) + ` (via always-reduce ${parser.getName(defaultReduce & 65535 /* Action.ValueMask */)})`);\n            return true;\n        }\n        if (stack.stack.length >= 8400 /* Rec.CutDepth */) {\n            while (stack.stack.length > 6000 /* Rec.CutTo */ && stack.forceReduce()) { }\n        }\n        let actions = this.tokens.getActions(stack);\n        for (let i = 0; i < actions.length;) {\n            let action = actions[i++], term = actions[i++], end = actions[i++];\n            let last = i == actions.length || !split;\n            let localStack = last ? stack : stack.split();\n            let main = this.tokens.mainToken;\n            localStack.apply(action, term, main ? main.start : localStack.pos, end);\n            if (verbose)\n                console.log(base + this.stackID(localStack) + ` (via ${(action & 65536 /* Action.ReduceFlag */) == 0 ? \"shift\"\n                    : `reduce of ${parser.getName(action & 65535 /* Action.ValueMask */)}`} for ${parser.getName(term)} @ ${start}${localStack == stack ? \"\" : \", split\"})`);\n            if (last)\n                return true;\n            else if (localStack.pos > start)\n                stacks.push(localStack);\n            else\n                split.push(localStack);\n        }\n        return false;\n    }\n    // Advance a given stack forward as far as it will go. Returns the\n    // (possibly updated) stack if it got stuck, or null if it moved\n    // forward and was given to `pushStackDedup`.\n    advanceFully(stack, newStacks) {\n        let pos = stack.pos;\n        for (;;) {\n            if (!this.advanceStack(stack, null, null))\n                return false;\n            if (stack.pos > pos) {\n                pushStackDedup(stack, newStacks);\n                return true;\n            }\n        }\n    }\n    runRecovery(stacks, tokens, newStacks) {\n        let finished = null, restarted = false;\n        for (let i = 0; i < stacks.length; i++) {\n            let stack = stacks[i], token = tokens[i << 1], tokenEnd = tokens[(i << 1) + 1];\n            let base = verbose ? this.stackID(stack) + \" -> \" : \"\";\n            if (stack.deadEnd) {\n                if (restarted)\n                    continue;\n                restarted = true;\n                stack.restart();\n                if (verbose)\n                    console.log(base + this.stackID(stack) + \" (restarted)\");\n                let done = this.advanceFully(stack, newStacks);\n                if (done)\n                    continue;\n            }\n            let force = stack.split(), forceBase = base;\n            for (let j = 0; j < 10 /* Rec.ForceReduceLimit */ && force.forceReduce(); j++) {\n                if (verbose)\n                    console.log(forceBase + this.stackID(force) + \" (via force-reduce)\");\n                let done = this.advanceFully(force, newStacks);\n                if (done)\n                    break;\n                if (verbose)\n                    forceBase = this.stackID(force) + \" -> \";\n            }\n            for (let insert of stack.recoverByInsert(token)) {\n                if (verbose)\n                    console.log(base + this.stackID(insert) + \" (via recover-insert)\");\n                this.advanceFully(insert, newStacks);\n            }\n            if (this.stream.end > stack.pos) {\n                if (tokenEnd == stack.pos) {\n                    tokenEnd++;\n                    token = 0 /* Term.Err */;\n                }\n                stack.recoverByDelete(token, tokenEnd);\n                if (verbose)\n                    console.log(base + this.stackID(stack) + ` (via recover-delete ${this.parser.getName(token)})`);\n                pushStackDedup(stack, newStacks);\n            }\n            else if (!finished || finished.score < stack.score) {\n                finished = stack;\n            }\n        }\n        return finished;\n    }\n    // Convert the stack's buffer to a syntax tree.\n    stackToTree(stack) {\n        stack.close();\n        return common.Tree.build({ buffer: StackBufferCursor.create(stack),\n            nodeSet: this.parser.nodeSet,\n            topID: this.topTerm,\n            maxBufferLength: this.parser.bufferLength,\n            reused: this.reused,\n            start: this.ranges[0].from,\n            length: stack.pos - this.ranges[0].from,\n            minRepeatType: this.parser.minRepeatTerm });\n    }\n    stackID(stack) {\n        let id = (stackIDs || (stackIDs = new WeakMap)).get(stack);\n        if (!id)\n            stackIDs.set(stack, id = String.fromCodePoint(this.nextStackID++));\n        return id + stack;\n    }\n}\nfunction pushStackDedup(stack, newStacks) {\n    for (let i = 0; i < newStacks.length; i++) {\n        let other = newStacks[i];\n        if (other.pos == stack.pos && other.sameState(stack)) {\n            if (newStacks[i].score < stack.score)\n                newStacks[i] = stack;\n            return;\n        }\n    }\n    newStacks.push(stack);\n}\nclass Dialect {\n    constructor(source, flags, disabled) {\n        this.source = source;\n        this.flags = flags;\n        this.disabled = disabled;\n    }\n    allows(term) { return !this.disabled || this.disabled[term] == 0; }\n}\nconst id = x => x;\n/**\nContext trackers are used to track stateful context (such as\nindentation in the Python grammar, or parent elements in the XML\ngrammar) needed by external tokenizers. You declare them in a\ngrammar file as `@context exportName from \"module\"`.\n\nContext values should be immutable, and can be updated (replaced)\non shift or reduce actions.\n\nThe export used in a `@context` declaration should be of this\ntype.\n*/\nclass ContextTracker {\n    /**\n    Define a context tracker.\n    */\n    constructor(spec) {\n        this.start = spec.start;\n        this.shift = spec.shift || id;\n        this.reduce = spec.reduce || id;\n        this.reuse = spec.reuse || id;\n        this.hash = spec.hash || (() => 0);\n        this.strict = spec.strict !== false;\n    }\n}\n/**\nHolds the parse tables for a given grammar, as generated by\n`lezer-generator`, and provides [methods](#common.Parser) to parse\ncontent with.\n*/\nclass LRParser extends common.Parser {\n    /**\n    @internal\n    */\n    constructor(spec) {\n        super();\n        /**\n        @internal\n        */\n        this.wrappers = [];\n        if (spec.version != 14 /* File.Version */)\n            throw new RangeError(`Parser version (${spec.version}) doesn't match runtime version (${14 /* File.Version */})`);\n        let nodeNames = spec.nodeNames.split(\" \");\n        this.minRepeatTerm = nodeNames.length;\n        for (let i = 0; i < spec.repeatNodeCount; i++)\n            nodeNames.push(\"\");\n        let topTerms = Object.keys(spec.topRules).map(r => spec.topRules[r][1]);\n        let nodeProps = [];\n        for (let i = 0; i < nodeNames.length; i++)\n            nodeProps.push([]);\n        function setProp(nodeID, prop, value) {\n            nodeProps[nodeID].push([prop, prop.deserialize(String(value))]);\n        }\n        if (spec.nodeProps)\n            for (let propSpec of spec.nodeProps) {\n                let prop = propSpec[0];\n                if (typeof prop == \"string\")\n                    prop = common.NodeProp[prop];\n                for (let i = 1; i < propSpec.length;) {\n                    let next = propSpec[i++];\n                    if (next >= 0) {\n                        setProp(next, prop, propSpec[i++]);\n                    }\n                    else {\n                        let value = propSpec[i + -next];\n                        for (let j = -next; j > 0; j--)\n                            setProp(propSpec[i++], prop, value);\n                        i++;\n                    }\n                }\n            }\n        this.nodeSet = new common.NodeSet(nodeNames.map((name, i) => common.NodeType.define({\n            name: i >= this.minRepeatTerm ? undefined : name,\n            id: i,\n            props: nodeProps[i],\n            top: topTerms.indexOf(i) > -1,\n            error: i == 0,\n            skipped: spec.skippedNodes && spec.skippedNodes.indexOf(i) > -1\n        })));\n        if (spec.propSources)\n            this.nodeSet = this.nodeSet.extend(...spec.propSources);\n        this.strict = false;\n        this.bufferLength = common.DefaultBufferLength;\n        let tokenArray = decodeArray(spec.tokenData);\n        this.context = spec.context;\n        this.specializerSpecs = spec.specialized || [];\n        this.specialized = new Uint16Array(this.specializerSpecs.length);\n        for (let i = 0; i < this.specializerSpecs.length; i++)\n            this.specialized[i] = this.specializerSpecs[i].term;\n        this.specializers = this.specializerSpecs.map(getSpecializer);\n        this.states = decodeArray(spec.states, Uint32Array);\n        this.data = decodeArray(spec.stateData);\n        this.goto = decodeArray(spec.goto);\n        this.maxTerm = spec.maxTerm;\n        this.tokenizers = spec.tokenizers.map(value => typeof value == \"number\" ? new TokenGroup(tokenArray, value) : value);\n        this.topRules = spec.topRules;\n        this.dialects = spec.dialects || {};\n        this.dynamicPrecedences = spec.dynamicPrecedences || null;\n        this.tokenPrecTable = spec.tokenPrec;\n        this.termNames = spec.termNames || null;\n        this.maxNode = this.nodeSet.types.length - 1;\n        this.dialect = this.parseDialect();\n        this.top = this.topRules[Object.keys(this.topRules)[0]];\n    }\n    createParse(input, fragments, ranges) {\n        let parse = new Parse(this, input, fragments, ranges);\n        for (let w of this.wrappers)\n            parse = w(parse, input, fragments, ranges);\n        return parse;\n    }\n    /**\n    Get a goto table entry @internal\n    */\n    getGoto(state, term, loose = false) {\n        let table = this.goto;\n        if (term >= table[0])\n            return -1;\n        for (let pos = table[term + 1];;) {\n            let groupTag = table[pos++], last = groupTag & 1;\n            let target = table[pos++];\n            if (last && loose)\n                return target;\n            for (let end = pos + (groupTag >> 1); pos < end; pos++)\n                if (table[pos] == state)\n                    return target;\n            if (last)\n                return -1;\n        }\n    }\n    /**\n    Check if this state has an action for a given terminal @internal\n    */\n    hasAction(state, terminal) {\n        let data = this.data;\n        for (let set = 0; set < 2; set++) {\n            for (let i = this.stateSlot(state, set ? 2 /* ParseState.Skip */ : 1 /* ParseState.Actions */), next;; i += 3) {\n                if ((next = data[i]) == 65535 /* Seq.End */) {\n                    if (data[i + 1] == 1 /* Seq.Next */)\n                        next = data[i = pair(data, i + 2)];\n                    else if (data[i + 1] == 2 /* Seq.Other */)\n                        return pair(data, i + 2);\n                    else\n                        break;\n                }\n                if (next == terminal || next == 0 /* Term.Err */)\n                    return pair(data, i + 1);\n            }\n        }\n        return 0;\n    }\n    /**\n    @internal\n    */\n    stateSlot(state, slot) {\n        return this.states[(state * 6 /* ParseState.Size */) + slot];\n    }\n    /**\n    @internal\n    */\n    stateFlag(state, flag) {\n        return (this.stateSlot(state, 0 /* ParseState.Flags */) & flag) > 0;\n    }\n    /**\n    @internal\n    */\n    validAction(state, action) {\n        return !!this.allActions(state, a => a == action ? true : null);\n    }\n    /**\n    @internal\n    */\n    allActions(state, action) {\n        let deflt = this.stateSlot(state, 4 /* ParseState.DefaultReduce */);\n        let result = deflt ? action(deflt) : undefined;\n        for (let i = this.stateSlot(state, 1 /* ParseState.Actions */); result == null; i += 3) {\n            if (this.data[i] == 65535 /* Seq.End */) {\n                if (this.data[i + 1] == 1 /* Seq.Next */)\n                    i = pair(this.data, i + 2);\n                else\n                    break;\n            }\n            result = action(pair(this.data, i + 1));\n        }\n        return result;\n    }\n    /**\n    Get the states that can follow this one through shift actions or\n    goto jumps. @internal\n    */\n    nextStates(state) {\n        let result = [];\n        for (let i = this.stateSlot(state, 1 /* ParseState.Actions */);; i += 3) {\n            if (this.data[i] == 65535 /* Seq.End */) {\n                if (this.data[i + 1] == 1 /* Seq.Next */)\n                    i = pair(this.data, i + 2);\n                else\n                    break;\n            }\n            if ((this.data[i + 2] & (65536 /* Action.ReduceFlag */ >> 16)) == 0) {\n                let value = this.data[i + 1];\n                if (!result.some((v, i) => (i & 1) && v == value))\n                    result.push(this.data[i], value);\n            }\n        }\n        return result;\n    }\n    /**\n    Configure the parser. Returns a new parser instance that has the\n    given settings modified. Settings not provided in `config` are\n    kept from the original parser.\n    */\n    configure(config) {\n        // Hideous reflection-based kludge to make it easy to create a\n        // slightly modified copy of a parser.\n        let copy = Object.assign(Object.create(LRParser.prototype), this);\n        if (config.props)\n            copy.nodeSet = this.nodeSet.extend(...config.props);\n        if (config.top) {\n            let info = this.topRules[config.top];\n            if (!info)\n                throw new RangeError(`Invalid top rule name ${config.top}`);\n            copy.top = info;\n        }\n        if (config.tokenizers)\n            copy.tokenizers = this.tokenizers.map(t => {\n                let found = config.tokenizers.find(r => r.from == t);\n                return found ? found.to : t;\n            });\n        if (config.specializers) {\n            copy.specializers = this.specializers.slice();\n            copy.specializerSpecs = this.specializerSpecs.map((s, i) => {\n                let found = config.specializers.find(r => r.from == s.external);\n                if (!found)\n                    return s;\n                let spec = Object.assign(Object.assign({}, s), { external: found.to });\n                copy.specializers[i] = getSpecializer(spec);\n                return spec;\n            });\n        }\n        if (config.contextTracker)\n            copy.context = config.contextTracker;\n        if (config.dialect)\n            copy.dialect = this.parseDialect(config.dialect);\n        if (config.strict != null)\n            copy.strict = config.strict;\n        if (config.wrap)\n            copy.wrappers = copy.wrappers.concat(config.wrap);\n        if (config.bufferLength != null)\n            copy.bufferLength = config.bufferLength;\n        return copy;\n    }\n    /**\n    Tells you whether any [parse wrappers](#lr.ParserConfig.wrap)\n    are registered for this parser.\n    */\n    hasWrappers() {\n        return this.wrappers.length > 0;\n    }\n    /**\n    Returns the name associated with a given term. This will only\n    work for all terms when the parser was generated with the\n    `--names` option. By default, only the names of tagged terms are\n    stored.\n    */\n    getName(term) {\n        return this.termNames ? this.termNames[term] : String(term <= this.maxNode && this.nodeSet.types[term].name || term);\n    }\n    /**\n    The eof term id is always allocated directly after the node\n    types. @internal\n    */\n    get eofTerm() { return this.maxNode + 1; }\n    /**\n    The type of top node produced by the parser.\n    */\n    get topNode() { return this.nodeSet.types[this.top[1]]; }\n    /**\n    @internal\n    */\n    dynamicPrecedence(term) {\n        let prec = this.dynamicPrecedences;\n        return prec == null ? 0 : prec[term] || 0;\n    }\n    /**\n    @internal\n    */\n    parseDialect(dialect) {\n        let values = Object.keys(this.dialects), flags = values.map(() => false);\n        if (dialect)\n            for (let part of dialect.split(\" \")) {\n                let id = values.indexOf(part);\n                if (id >= 0)\n                    flags[id] = true;\n            }\n        let disabled = null;\n        for (let i = 0; i < values.length; i++)\n            if (!flags[i]) {\n                for (let j = this.dialects[values[i]], id; (id = this.data[j++]) != 65535 /* Seq.End */;)\n                    (disabled || (disabled = new Uint8Array(this.maxTerm + 1)))[id] = 1;\n            }\n        return new Dialect(dialect, flags, disabled);\n    }\n    /**\n    Used by the output of the parser generator. Not available to\n    user code. @hide\n    */\n    static deserialize(spec) {\n        return new LRParser(spec);\n    }\n}\nfunction pair(data, off) { return data[off] | (data[off + 1] << 16); }\nfunction findFinished(stacks) {\n    let best = null;\n    for (let stack of stacks) {\n        let stopped = stack.p.stoppedAt;\n        if ((stack.pos == stack.p.stream.end || stopped != null && stack.pos > stopped) &&\n            stack.p.parser.stateFlag(stack.state, 2 /* StateFlag.Accepting */) &&\n            (!best || best.score < stack.score))\n            best = stack;\n    }\n    return best;\n}\nfunction getSpecializer(spec) {\n    if (spec.external) {\n        let mask = spec.extend ? 1 /* Specialize.Extend */ : 0 /* Specialize.Specialize */;\n        return (value, stack) => (spec.external(value, stack) << 1) | mask;\n    }\n    return spec.get;\n}\n\nexports.ContextTracker = ContextTracker;\nexports.ExternalTokenizer = ExternalTokenizer;\nexports.InputStream = InputStream;\nexports.LRParser = LRParser;\nexports.LocalTokenGroup = LocalTokenGroup;\nexports.Stack = Stack;\n","import { NativeStorage } from \"./nativeStorage\";\nimport { lg } from \"./posthog\";\n\ntype ITransactionMode = \"readonly\" | \"readwrite\";\n\nexport let nativeStorage: NativeStorage | undefined;\n\nexport namespace IndexedDBUtils {\n  async function withTransaction<T>(\n    mode: ITransactionMode,\n    operation: (objectStore: IDBObjectStore) => IDBRequest<T>\n  ): Promise<T | undefined> {\n    const promise = new Promise<T>(async (resolve, reject) => {\n      const db = await initialize();\n      const transaction = db.transaction(\"keyval\", mode);\n      const objectStore = transaction.objectStore(\"keyval\");\n\n      let result: T;\n\n      try {\n        const request = operation(objectStore);\n\n        request.addEventListener(\"success\", () => {\n          result = request.result;\n        });\n\n        request.addEventListener(\"error\", (e) => {\n          const error = (e.target as IDBRequest)?.error;\n          reject(error || new Error(\"IndexedDB request failed\"));\n        });\n      } catch (e) {\n        db.close();\n        reject(e);\n        return;\n      }\n\n      transaction.addEventListener(\"complete\", () => {\n        db.close();\n        resolve(result);\n      });\n\n      transaction.addEventListener(\"error\", (e) => {\n        db.close();\n        const error = (e.target as IDBTransaction)?.error;\n        reject(error || new Error(\"IndexedDB transaction failed\"));\n      });\n\n      transaction.addEventListener(\"abort\", (e) => {\n        db.close();\n        const error = (e.target as IDBTransaction)?.error;\n        reject(error || new Error(\"IndexedDB transaction aborted\"));\n      });\n    });\n    try {\n      const result = await promise;\n      return result;\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    } catch (e: any) {\n      const errorDetails = {\n        name: e?.name,\n        message: e?.message,\n        stack: e?.stack,\n      };\n      lg(\"ls-indexeddb-error\", { json: JSON.stringify(e), details: JSON.stringify(errorDetails) });\n      console.error(\"IndexedDB error:\", e);\n      return undefined;\n    }\n  }\n\n  async function withNative<T>(operation: () => T): Promise<T | undefined> {\n    try {\n      return await operation();\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    } catch (e: any) {\n      lg(\"ls-native-storage-error\", { json: JSON.stringify(e) });\n      console.error(\"Native Storage error:\", e);\n      return undefined;\n    }\n  }\n\n  export function initializeForSafari(): Promise<void> {\n    return new Promise((resolve) => {\n      if (nativeStorage == null && NativeStorage.isAvailable()) {\n        nativeStorage = new NativeStorage();\n      }\n      const connection = window.indexedDB.open(\"keyval-store\");\n      const handler = (): void => {\n        if (connection.result != null) {\n          connection.result.close();\n        }\n        resolve();\n      };\n      connection.addEventListener(\"success\", handler);\n      connection.addEventListener(\"error\", handler);\n      connection.addEventListener(\"blocked\", handler);\n      connection.addEventListener(\"upgradeneeded\", (event) => {\n        const request = event.target as IDBOpenDBRequest;\n        if (request?.result) {\n          request.result.createObjectStore(\"keyval\");\n        }\n      });\n    });\n  }\n\n  export function initialize(): Promise<IDBDatabase> {\n    return new Promise((resolve, reject) => {\n      if (nativeStorage == null && NativeStorage.isAvailable()) {\n        nativeStorage = new NativeStorage();\n      }\n\n      const connection = window.indexedDB.open(\"keyval-store\");\n      connection.addEventListener(\"success\", (event) => {\n        const request = event.target as IDBOpenDBRequest;\n        resolve(request.result);\n      });\n      connection.addEventListener(\"error\", (event) => {\n        reject(event);\n      });\n      connection.addEventListener(\"blocked\", (event) => {\n        reject(new Error(\"IndexedDB initialization blocked\"));\n      });\n      connection.addEventListener(\"upgradeneeded\", (event) => {\n        const request = event.target as IDBOpenDBRequest;\n        request.result.createObjectStore(\"keyval\");\n      });\n    });\n  }\n\n  export async function getAllKeys(): Promise<string[]> {\n    let result: string[] | undefined = undefined;\n    if (nativeStorage != null) {\n      result = await nativeStorage.getAllKeys();\n    } else {\n      result = await withTransaction(\"readonly\", (objectStore) => {\n        const keys = objectStore.getAllKeys();\n        return keys as IDBRequest<string[]>;\n      });\n    }\n    if (result != null) {\n      return result;\n    } else {\n      return Promise.resolve([]);\n    }\n  }\n\n  export async function get(key: string): Promise<unknown> {\n    let result: unknown = undefined;\n    const userid =\n      typeof window !== \"undefined\"\n        ? (window.state?.user?.id ?? (key.startsWith(\"liftosaur_\") ? key.replace(\"liftosaur_\", \"\") : undefined))\n        : undefined;\n    if (nativeStorage != null) {\n      result = await withNative(() => nativeStorage?.get(key));\n      if (result == null) {\n        lg(\"ls-native-fallback-get\", { key }, undefined, userid);\n        result = await withTransaction(\"readonly\", (objectStore) => objectStore.getAll(key)).then(\n          (results: unknown[] | undefined) => {\n            return results?.[0];\n          }\n        );\n      } else {\n        lg(\"ls-native-get\", { key }, undefined, userid);\n      }\n      return result;\n    } else {\n      result = await withTransaction(\"readonly\", (objectStore) => objectStore.getAll(key)).then(\n        (results: unknown[] | undefined) => {\n          return results?.[0];\n        }\n      );\n      lg(\"ls-indexeddb-get\", { key }, undefined, userid);\n    }\n    return result;\n  }\n\n  export async function remove(key: string): Promise<void> {\n    await Promise.all([\n      withTransaction(\"readwrite\", (objectStore) => objectStore.delete(key)),\n      withNative(() => nativeStorage?.delete(key)),\n    ]);\n  }\n\n  export async function set(key: string, value?: string): Promise<void> {\n    await Promise.all([\n      withTransaction(\"readwrite\", (objectStore) => {\n        return objectStore.put(value, key);\n      }),\n      withNative(() => nativeStorage?.set(key, value)),\n    ]);\n  }\n}\n","var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\n// -------------------------------------------------------------------------------------\n// instances\n// -------------------------------------------------------------------------------------\n/**\n * @category instances\n * @since 2.10.0\n */\nexport var getBooleanAlgebra = function (B) {\n    return function () { return ({\n        meet: function (x, y) { return function (a) { return B.meet(x(a), y(a)); }; },\n        join: function (x, y) { return function (a) { return B.join(x(a), y(a)); }; },\n        zero: function () { return B.zero; },\n        one: function () { return B.one; },\n        implies: function (x, y) { return function (a) { return B.implies(x(a), y(a)); }; },\n        not: function (x) { return function (a) { return B.not(x(a)); }; }\n    }); };\n};\n/**\n * Unary functions form a semigroup as long as you can provide a semigroup for the codomain.\n *\n * @example\n * import { Predicate, getSemigroup } from 'fp-ts/function'\n * import * as B from 'fp-ts/boolean'\n *\n * const f: Predicate<number> = (n) => n <= 2\n * const g: Predicate<number> = (n) => n >= 0\n *\n * const S1 = getSemigroup(B.SemigroupAll)<number>()\n *\n * assert.deepStrictEqual(S1.concat(f, g)(1), true)\n * assert.deepStrictEqual(S1.concat(f, g)(3), false)\n *\n * const S2 = getSemigroup(B.SemigroupAny)<number>()\n *\n * assert.deepStrictEqual(S2.concat(f, g)(1), true)\n * assert.deepStrictEqual(S2.concat(f, g)(3), true)\n *\n * @category instances\n * @since 2.10.0\n */\nexport var getSemigroup = function (S) {\n    return function () { return ({\n        concat: function (f, g) { return function (a) { return S.concat(f(a), g(a)); }; }\n    }); };\n};\n/**\n * Unary functions form a monoid as long as you can provide a monoid for the codomain.\n *\n * @example\n * import { Predicate } from 'fp-ts/Predicate'\n * import { getMonoid } from 'fp-ts/function'\n * import * as B from 'fp-ts/boolean'\n *\n * const f: Predicate<number> = (n) => n <= 2\n * const g: Predicate<number> = (n) => n >= 0\n *\n * const M1 = getMonoid(B.MonoidAll)<number>()\n *\n * assert.deepStrictEqual(M1.concat(f, g)(1), true)\n * assert.deepStrictEqual(M1.concat(f, g)(3), false)\n *\n * const M2 = getMonoid(B.MonoidAny)<number>()\n *\n * assert.deepStrictEqual(M2.concat(f, g)(1), true)\n * assert.deepStrictEqual(M2.concat(f, g)(3), true)\n *\n * @category instances\n * @since 2.10.0\n */\nexport var getMonoid = function (M) {\n    var getSemigroupM = getSemigroup(M);\n    return function () { return ({\n        concat: getSemigroupM().concat,\n        empty: function () { return M.empty; }\n    }); };\n};\n/**\n * @category instances\n * @since 2.10.0\n */\nexport var getSemiring = function (S) { return ({\n    add: function (f, g) { return function (x) { return S.add(f(x), g(x)); }; },\n    zero: function () { return S.zero; },\n    mul: function (f, g) { return function (x) { return S.mul(f(x), g(x)); }; },\n    one: function () { return S.one; }\n}); };\n/**\n * @category instances\n * @since 2.10.0\n */\nexport var getRing = function (R) {\n    var S = getSemiring(R);\n    return {\n        add: S.add,\n        mul: S.mul,\n        one: S.one,\n        zero: S.zero,\n        sub: function (f, g) { return function (x) { return R.sub(f(x), g(x)); }; }\n    };\n};\n// -------------------------------------------------------------------------------------\n// utils\n// -------------------------------------------------------------------------------------\n/**\n * @since 2.11.0\n */\nexport var apply = function (a) {\n    return function (f) {\n        return f(a);\n    };\n};\n/**\n * @since 2.0.0\n */\nexport function identity(a) {\n    return a;\n}\n/**\n * @since 2.0.0\n */\nexport var unsafeCoerce = identity;\n/**\n * @since 2.0.0\n */\nexport function constant(a) {\n    return function () { return a; };\n}\n/**\n * A thunk that returns always `true`.\n *\n * @since 2.0.0\n */\nexport var constTrue = /*#__PURE__*/ constant(true);\n/**\n * A thunk that returns always `false`.\n *\n * @since 2.0.0\n */\nexport var constFalse = /*#__PURE__*/ constant(false);\n/**\n * A thunk that returns always `null`.\n *\n * @since 2.0.0\n */\nexport var constNull = /*#__PURE__*/ constant(null);\n/**\n * A thunk that returns always `undefined`.\n *\n * @since 2.0.0\n */\nexport var constUndefined = /*#__PURE__*/ constant(undefined);\n/**\n * A thunk that returns always `void`.\n *\n * @since 2.0.0\n */\nexport var constVoid = constUndefined;\nexport function flip(f) {\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (args.length > 1) {\n            return f(args[1], args[0]);\n        }\n        return function (a) { return f(a)(args[0]); };\n    };\n}\nexport function flow(ab, bc, cd, de, ef, fg, gh, hi, ij) {\n    switch (arguments.length) {\n        case 1:\n            return ab;\n        case 2:\n            return function () {\n                return bc(ab.apply(this, arguments));\n            };\n        case 3:\n            return function () {\n                return cd(bc(ab.apply(this, arguments)));\n            };\n        case 4:\n            return function () {\n                return de(cd(bc(ab.apply(this, arguments))));\n            };\n        case 5:\n            return function () {\n                return ef(de(cd(bc(ab.apply(this, arguments)))));\n            };\n        case 6:\n            return function () {\n                return fg(ef(de(cd(bc(ab.apply(this, arguments))))));\n            };\n        case 7:\n            return function () {\n                return gh(fg(ef(de(cd(bc(ab.apply(this, arguments)))))));\n            };\n        case 8:\n            return function () {\n                return hi(gh(fg(ef(de(cd(bc(ab.apply(this, arguments))))))));\n            };\n        case 9:\n            return function () {\n                return ij(hi(gh(fg(ef(de(cd(bc(ab.apply(this, arguments)))))))));\n            };\n    }\n    return;\n}\n/**\n * @since 2.0.0\n */\nexport function tuple() {\n    var t = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        t[_i] = arguments[_i];\n    }\n    return t;\n}\n/**\n * @since 2.0.0\n */\nexport function increment(n) {\n    return n + 1;\n}\n/**\n * @since 2.0.0\n */\nexport function decrement(n) {\n    return n - 1;\n}\n/**\n * @since 2.0.0\n */\nexport function absurd(_) {\n    throw new Error('Called `absurd` function which should be uncallable');\n}\n/**\n * Creates a tupled version of this function: instead of `n` arguments, it accepts a single tuple argument.\n *\n * @example\n * import { tupled } from 'fp-ts/function'\n *\n * const add = tupled((x: number, y: number): number => x + y)\n *\n * assert.strictEqual(add([1, 2]), 3)\n *\n * @since 2.4.0\n */\nexport function tupled(f) {\n    return function (a) { return f.apply(void 0, a); };\n}\n/**\n * Inverse function of `tupled`\n *\n * @since 2.4.0\n */\nexport function untupled(f) {\n    return function () {\n        var a = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            a[_i] = arguments[_i];\n        }\n        return f(a);\n    };\n}\nexport function pipe(a, ab, bc, cd, de, ef, fg, gh, hi) {\n    switch (arguments.length) {\n        case 1:\n            return a;\n        case 2:\n            return ab(a);\n        case 3:\n            return bc(ab(a));\n        case 4:\n            return cd(bc(ab(a)));\n        case 5:\n            return de(cd(bc(ab(a))));\n        case 6:\n            return ef(de(cd(bc(ab(a)))));\n        case 7:\n            return fg(ef(de(cd(bc(ab(a))))));\n        case 8:\n            return gh(fg(ef(de(cd(bc(ab(a)))))));\n        case 9:\n            return hi(gh(fg(ef(de(cd(bc(ab(a))))))));\n        default: {\n            var ret = arguments[0];\n            for (var i = 1; i < arguments.length; i++) {\n                ret = arguments[i](ret);\n            }\n            return ret;\n        }\n    }\n}\n/**\n * Type hole simulation\n *\n * @since 2.7.0\n */\nexport var hole = absurd;\n/**\n * @since 2.11.0\n */\nexport var SK = function (_, b) { return b; };\n/**\n * Use `Predicate` module instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nexport function not(predicate) {\n    return function (a) { return !predicate(a); };\n}\n/**\n * Use `Endomorphism` module instead.\n *\n * @category zone of death\n * @since 2.10.0\n * @deprecated\n */\nexport var getEndomorphismMonoid = function () { return ({\n    concat: function (first, second) { return flow(first, second); },\n    empty: identity\n}); };\n/** @internal */\nexport var dual = function (arity, body) {\n    var isDataFirst = typeof arity === 'number' ? function (args) { return args.length >= arity; } : arity;\n    return function () {\n        var args = Array.from(arguments);\n        if (isDataFirst(arguments)) {\n            return body.apply(this, args);\n        }\n        return function (self) { return body.apply(void 0, __spreadArray([self], args, false)); };\n    };\n};\n","/**\n * A `Functor` is a type constructor which supports a mapping operation `map`.\n *\n * `map` can be used to turn functions `a -> b` into functions `f a -> f b` whose argument and return types use the type\n * constructor `f` to represent some computational context.\n *\n * Instances must satisfy the following laws:\n *\n * 1. Identity: `F.map(fa, a => a) <-> fa`\n * 2. Composition: `F.map(fa, a => bc(ab(a))) <-> F.map(F.map(fa, ab), bc)`\n *\n * @since 2.0.0\n */\nimport { pipe } from './function';\nexport function map(F, G) {\n    return function (f) { return function (fa) { return F.map(fa, function (ga) { return G.map(ga, f); }); }; };\n}\nexport function flap(F) {\n    return function (a) { return function (fab) { return F.map(fab, function (f) { return f(a); }); }; };\n}\nexport function bindTo(F) {\n    return function (name) { return function (fa) { return F.map(fa, function (a) {\n        var _a;\n        return (_a = {}, _a[name] = a, _a);\n    }); }; };\n}\nfunction let_(F) {\n    return function (name, f) { return function (fa) { return F.map(fa, function (a) {\n        var _a;\n        return Object.assign({}, a, (_a = {}, _a[name] = f(a), _a));\n    }); }; };\n}\nexport { \n/**\n * @since 2.13.0\n */\nlet_ as let };\n/** @deprecated */\nexport function getFunctorComposition(F, G) {\n    var _map = map(F, G);\n    return {\n        map: function (fga, f) { return pipe(fga, _map(f)); }\n    };\n}\n/** @internal */\nexport function as(F) {\n    return function (self, b) { return F.map(self, function () { return b; }); };\n}\n/** @internal */\nexport function asUnit(F) {\n    var asM = as(F);\n    return function (self) { return asM(self, undefined); };\n}\n","var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nimport { dual } from './function';\n// -------------------------------------------------------------------------------------\n// Option\n// -------------------------------------------------------------------------------------\n/** @internal */\nexport var isNone = function (fa) { return fa._tag === 'None'; };\n/** @internal */\nexport var isSome = function (fa) { return fa._tag === 'Some'; };\n/** @internal */\nexport var none = { _tag: 'None' };\n/** @internal */\nexport var some = function (a) { return ({ _tag: 'Some', value: a }); };\n// -------------------------------------------------------------------------------------\n// Either\n// -------------------------------------------------------------------------------------\n/** @internal */\nexport var isLeft = function (ma) { return ma._tag === 'Left'; };\n/** @internal */\nexport var isRight = function (ma) { return ma._tag === 'Right'; };\n/** @internal */\nexport var left = function (e) { return ({ _tag: 'Left', left: e }); };\n/** @internal */\nexport var right = function (a) { return ({ _tag: 'Right', right: a }); };\n// -------------------------------------------------------------------------------------\n// ReadonlyNonEmptyArray\n// -------------------------------------------------------------------------------------\n/** @internal */\nexport var singleton = function (a) { return [a]; };\n/** @internal */\nexport var isNonEmpty = function (as) { return as.length > 0; };\n/** @internal */\nexport var head = function (as) { return as[0]; };\n/** @internal */\nexport var tail = function (as) { return as.slice(1); };\n// -------------------------------------------------------------------------------------\n// empty\n// -------------------------------------------------------------------------------------\n/** @internal */\nexport var emptyReadonlyArray = [];\n/** @internal */\nexport var emptyRecord = {};\n// -------------------------------------------------------------------------------------\n// Record\n// -------------------------------------------------------------------------------------\n/** @internal */\nexport var has = Object.prototype.hasOwnProperty;\n// -------------------------------------------------------------------------------------\n// NonEmptyArray\n// -------------------------------------------------------------------------------------\n/** @internal */\nexport var fromReadonlyNonEmptyArray = function (as) { return __spreadArray([as[0]], as.slice(1), true); };\n/** @internal */\nexport var liftNullable = function (F) {\n    return function (f, onNullable) {\n        return function () {\n            var a = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                a[_i] = arguments[_i];\n            }\n            var o = f.apply(void 0, a);\n            return F.fromEither(o == null ? left(onNullable.apply(void 0, a)) : right(o));\n        };\n    };\n};\n/** @internal */\nexport var liftOption = function (F) {\n    return function (f, onNone) {\n        return function () {\n            var a = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                a[_i] = arguments[_i];\n            }\n            var o = f.apply(void 0, a);\n            return F.fromEither(isNone(o) ? left(onNone.apply(void 0, a)) : right(o.value));\n        };\n    };\n};\n/** @internal */\nexport var flatMapNullable = function (F, M) {\n    return /*#__PURE__*/ dual(3, function (self, f, onNullable) {\n        return M.flatMap(self, liftNullable(F)(f, onNullable));\n    });\n};\n/** @internal */\nexport var flatMapOption = function (F, M) {\n    return /*#__PURE__*/ dual(3, function (self, f, onNone) { return M.flatMap(self, liftOption(F)(f, onNone)); });\n};\n/** @internal */\nexport var flatMapEither = function (F, M) {\n    return /*#__PURE__*/ dual(2, function (self, f) {\n        return M.flatMap(self, function (a) { return F.fromEither(f(a)); });\n    });\n};\n/** @internal */\nexport var flatMapIO = function (F, M) {\n    return /*#__PURE__*/ dual(2, function (self, f) {\n        return M.flatMap(self, function (a) { return F.fromIO(f(a)); });\n    });\n};\n/** @internal */\nexport var flatMapTask = function (F, M) {\n    return /*#__PURE__*/ dual(2, function (self, f) {\n        return M.flatMap(self, function (a) { return F.fromTask(f(a)); });\n    });\n};\n/** @internal */\nexport var flatMapReader = function (F, M) {\n    return /*#__PURE__*/ dual(2, function (self, f) {\n        return M.flatMap(self, function (a) { return F.fromReader(f(a)); });\n    });\n};\n","import { getApplicativeMonoid } from './Applicative';\nimport { apFirst as apFirst_, apS as apS_, apSecond as apSecond_, getApplySemigroup as getApplySemigroup_ } from './Apply';\nimport * as chainable from './Chain';\nimport { tailRec } from './ChainRec';\nimport { chainOptionK as chainOptionK_, filterOrElse as filterOrElse_, fromOption as fromOption_, fromOptionK as fromOptionK_, fromPredicate as fromPredicate_ } from './FromEither';\nimport { dual, flow, identity, pipe } from './function';\nimport { as as as_, asUnit as asUnit_, bindTo as bindTo_, flap as flap_, let as let__ } from './Functor';\nimport * as _ from './internal';\nimport { separated } from './Separated';\nimport { wiltDefault, witherDefault } from './Witherable';\n// -------------------------------------------------------------------------------------\n// constructors\n// -------------------------------------------------------------------------------------\n/**\n * Constructs a new `Either` holding a `Left` value. This usually represents a failure, due to the right-bias of this\n * structure.\n *\n * @category constructors\n * @since 2.0.0\n */\nexport var left = _.left;\n/**\n * Constructs a new `Either` holding a `Right` value. This usually represents a successful value due to the right bias\n * of this structure.\n *\n * @category constructors\n * @since 2.0.0\n */\nexport var right = _.right;\n/**\n * @category sequencing\n * @since 2.14.0\n */\nexport var flatMap = /*#__PURE__*/ dual(2, function (ma, f) { return (isLeft(ma) ? ma : f(ma.right)); });\nvar _map = function (fa, f) { return pipe(fa, map(f)); };\nvar _ap = function (fab, fa) { return pipe(fab, ap(fa)); };\n/* istanbul ignore next */\nvar _reduce = function (fa, b, f) { return pipe(fa, reduce(b, f)); };\n/* istanbul ignore next */\nvar _foldMap = function (M) { return function (fa, f) {\n    var foldMapM = foldMap(M);\n    return pipe(fa, foldMapM(f));\n}; };\n/* istanbul ignore next */\nvar _reduceRight = function (fa, b, f) { return pipe(fa, reduceRight(b, f)); };\nvar _traverse = function (F) {\n    var traverseF = traverse(F);\n    return function (ta, f) { return pipe(ta, traverseF(f)); };\n};\nvar _bimap = function (fa, f, g) { return pipe(fa, bimap(f, g)); };\nvar _mapLeft = function (fa, f) { return pipe(fa, mapLeft(f)); };\n/* istanbul ignore next */\nvar _alt = function (fa, that) { return pipe(fa, alt(that)); };\n/* istanbul ignore next */\nvar _extend = function (wa, f) { return pipe(wa, extend(f)); };\nvar _chainRec = function (a, f) {\n    return tailRec(f(a), function (e) {\n        return isLeft(e) ? right(left(e.left)) : isLeft(e.right) ? left(f(e.right.left)) : right(right(e.right.right));\n    });\n};\n/**\n * @category type lambdas\n * @since 2.0.0\n */\nexport var URI = 'Either';\n/**\n * @category instances\n * @since 2.0.0\n */\nexport var getShow = function (SE, SA) { return ({\n    show: function (ma) { return (isLeft(ma) ? \"left(\".concat(SE.show(ma.left), \")\") : \"right(\".concat(SA.show(ma.right), \")\")); }\n}); };\n/**\n * @category instances\n * @since 2.0.0\n */\nexport var getEq = function (EL, EA) { return ({\n    equals: function (x, y) {\n        return x === y || (isLeft(x) ? isLeft(y) && EL.equals(x.left, y.left) : isRight(y) && EA.equals(x.right, y.right));\n    }\n}); };\n/**\n * Semigroup returning the left-most non-`Left` value. If both operands are `Right`s then the inner values are\n * concatenated using the provided `Semigroup`\n *\n * @example\n * import { getSemigroup, left, right } from 'fp-ts/Either'\n * import { SemigroupSum } from 'fp-ts/number'\n *\n * const S = getSemigroup<string, number>(SemigroupSum)\n * assert.deepStrictEqual(S.concat(left('a'), left('b')), left('a'))\n * assert.deepStrictEqual(S.concat(left('a'), right(2)), right(2))\n * assert.deepStrictEqual(S.concat(right(1), left('b')), right(1))\n * assert.deepStrictEqual(S.concat(right(1), right(2)), right(3))\n *\n * @category instances\n * @since 2.0.0\n */\nexport var getSemigroup = function (S) { return ({\n    concat: function (x, y) { return (isLeft(y) ? x : isLeft(x) ? y : right(S.concat(x.right, y.right))); }\n}); };\n/**\n * Builds a `Compactable` instance for `Either` given `Monoid` for the left side.\n *\n * @category filtering\n * @since 2.10.0\n */\nexport var getCompactable = function (M) {\n    var empty = left(M.empty);\n    return {\n        URI: URI,\n        _E: undefined,\n        compact: function (ma) { return (isLeft(ma) ? ma : ma.right._tag === 'None' ? empty : right(ma.right.value)); },\n        separate: function (ma) {\n            return isLeft(ma)\n                ? separated(ma, ma)\n                : isLeft(ma.right)\n                    ? separated(right(ma.right.left), empty)\n                    : separated(empty, right(ma.right.right));\n        }\n    };\n};\n/**\n * Builds a `Filterable` instance for `Either` given `Monoid` for the left side\n *\n * @category filtering\n * @since 2.10.0\n */\nexport var getFilterable = function (M) {\n    var empty = left(M.empty);\n    var _a = getCompactable(M), compact = _a.compact, separate = _a.separate;\n    var filter = function (ma, predicate) {\n        return isLeft(ma) ? ma : predicate(ma.right) ? ma : empty;\n    };\n    var partition = function (ma, p) {\n        return isLeft(ma)\n            ? separated(ma, ma)\n            : p(ma.right)\n                ? separated(empty, right(ma.right))\n                : separated(right(ma.right), empty);\n    };\n    return {\n        URI: URI,\n        _E: undefined,\n        map: _map,\n        compact: compact,\n        separate: separate,\n        filter: filter,\n        filterMap: function (ma, f) {\n            if (isLeft(ma)) {\n                return ma;\n            }\n            var ob = f(ma.right);\n            return ob._tag === 'None' ? empty : right(ob.value);\n        },\n        partition: partition,\n        partitionMap: function (ma, f) {\n            if (isLeft(ma)) {\n                return separated(ma, ma);\n            }\n            var e = f(ma.right);\n            return isLeft(e) ? separated(right(e.left), empty) : separated(empty, right(e.right));\n        }\n    };\n};\n/**\n * Builds `Witherable` instance for `Either` given `Monoid` for the left side\n *\n * @category filtering\n * @since 2.0.0\n */\nexport var getWitherable = function (M) {\n    var F_ = getFilterable(M);\n    var C = getCompactable(M);\n    return {\n        URI: URI,\n        _E: undefined,\n        map: _map,\n        compact: F_.compact,\n        separate: F_.separate,\n        filter: F_.filter,\n        filterMap: F_.filterMap,\n        partition: F_.partition,\n        partitionMap: F_.partitionMap,\n        traverse: _traverse,\n        sequence: sequence,\n        reduce: _reduce,\n        foldMap: _foldMap,\n        reduceRight: _reduceRight,\n        wither: witherDefault(Traversable, C),\n        wilt: wiltDefault(Traversable, C)\n    };\n};\n/**\n * The default [`Applicative`](#applicative) instance returns the first error, if you want to\n * get all errors you need to provide a way to concatenate them via a `Semigroup`.\n *\n * @example\n * import * as A from 'fp-ts/Apply'\n * import * as E from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n * import * as S from 'fp-ts/Semigroup'\n * import * as string from 'fp-ts/string'\n *\n * const parseString = (u: unknown): E.Either<string, string> =>\n *   typeof u === 'string' ? E.right(u) : E.left('not a string')\n *\n * const parseNumber = (u: unknown): E.Either<string, number> =>\n *   typeof u === 'number' ? E.right(u) : E.left('not a number')\n *\n * interface Person {\n *   readonly name: string\n *   readonly age: number\n * }\n *\n * const parsePerson = (\n *   input: Record<string, unknown>\n * ): E.Either<string, Person> =>\n *   pipe(\n *     E.Do,\n *     E.apS('name', parseString(input.name)),\n *     E.apS('age', parseNumber(input.age))\n *   )\n *\n * assert.deepStrictEqual(parsePerson({}), E.left('not a string')) // <= first error\n *\n * const Applicative = E.getApplicativeValidation(\n *   pipe(string.Semigroup, S.intercalate(', '))\n * )\n *\n * const apS = A.apS(Applicative)\n *\n * const parsePersonAll = (\n *   input: Record<string, unknown>\n * ): E.Either<string, Person> =>\n *   pipe(\n *     E.Do,\n *     apS('name', parseString(input.name)),\n *     apS('age', parseNumber(input.age))\n *   )\n *\n * assert.deepStrictEqual(parsePersonAll({}), E.left('not a string, not a number')) // <= all errors\n *\n * @category error handling\n * @since 2.7.0\n */\nexport var getApplicativeValidation = function (SE) { return ({\n    URI: URI,\n    _E: undefined,\n    map: _map,\n    ap: function (fab, fa) {\n        return isLeft(fab)\n            ? isLeft(fa)\n                ? left(SE.concat(fab.left, fa.left))\n                : fab\n            : isLeft(fa)\n                ? fa\n                : right(fab.right(fa.right));\n    },\n    of: of\n}); };\n/**\n * The default [`Alt`](#alt) instance returns the last error, if you want to\n * get all errors you need to provide a way to concatenate them via a `Semigroup`.\n *\n * @example\n * import * as E from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n * import * as S from 'fp-ts/Semigroup'\n * import * as string from 'fp-ts/string'\n *\n * const parseString = (u: unknown): E.Either<string, string> =>\n *   typeof u === 'string' ? E.right(u) : E.left('not a string')\n *\n * const parseNumber = (u: unknown): E.Either<string, number> =>\n *   typeof u === 'number' ? E.right(u) : E.left('not a number')\n *\n * const parse = (u: unknown): E.Either<string, string | number> =>\n *   pipe(\n *     parseString(u),\n *     E.alt<string, string | number>(() => parseNumber(u))\n *   )\n *\n * assert.deepStrictEqual(parse(true), E.left('not a number')) // <= last error\n *\n * const Alt = E.getAltValidation(pipe(string.Semigroup, S.intercalate(', ')))\n *\n * const parseAll = (u: unknown): E.Either<string, string | number> =>\n *   Alt.alt<string | number>(parseString(u), () => parseNumber(u))\n *\n * assert.deepStrictEqual(parseAll(true), E.left('not a string, not a number')) // <= all errors\n *\n * @category error handling\n * @since 2.7.0\n */\nexport var getAltValidation = function (SE) { return ({\n    URI: URI,\n    _E: undefined,\n    map: _map,\n    alt: function (me, that) {\n        if (isRight(me)) {\n            return me;\n        }\n        var ea = that();\n        return isLeft(ea) ? left(SE.concat(me.left, ea.left)) : ea;\n    }\n}); };\n/**\n * @category mapping\n * @since 2.0.0\n */\nexport var map = function (f) { return function (fa) {\n    return isLeft(fa) ? fa : right(f(fa.right));\n}; };\n/**\n * @category instances\n * @since 2.7.0\n */\nexport var Functor = {\n    URI: URI,\n    map: _map\n};\n/**\n * Maps the `Right` value of this `Either` to the specified constant value.\n *\n * @category mapping\n * @since 2.16.0\n */\nexport var as = dual(2, as_(Functor));\n/**\n * Maps the `Right` value of this `Either` to the void constant value.\n *\n * @category mapping\n * @since 2.16.0\n */\nexport var asUnit = asUnit_(Functor);\n/**\n * @category constructors\n * @since 2.7.0\n */\nexport var of = right;\n/**\n * @category instances\n * @since 2.10.0\n */\nexport var Pointed = {\n    URI: URI,\n    of: of\n};\n/**\n * Less strict version of [`ap`](#ap).\n *\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @since 2.8.0\n */\nexport var apW = function (fa) { return function (fab) {\n    return isLeft(fab) ? fab : isLeft(fa) ? fa : right(fab.right(fa.right));\n}; };\n/**\n * @since 2.0.0\n */\nexport var ap = apW;\n/**\n * @category instances\n * @since 2.10.0\n */\nexport var Apply = {\n    URI: URI,\n    map: _map,\n    ap: _ap\n};\n/**\n * @category instances\n * @since 2.7.0\n */\nexport var Applicative = {\n    URI: URI,\n    map: _map,\n    ap: _ap,\n    of: of\n};\n/**\n * @category instances\n * @since 2.10.0\n */\nexport var Chain = {\n    URI: URI,\n    map: _map,\n    ap: _ap,\n    chain: flatMap\n};\n/**\n * @category instances\n * @since 2.7.0\n */\nexport var Monad = {\n    URI: URI,\n    map: _map,\n    ap: _ap,\n    of: of,\n    chain: flatMap\n};\n/**\n * Left-associative fold of a structure.\n *\n * @example\n * import { pipe } from 'fp-ts/function'\n * import * as E from 'fp-ts/Either'\n *\n * const startWith = 'prefix'\n * const concat = (a: string, b: string) => `${a}:${b}`\n *\n * assert.deepStrictEqual(\n *   pipe(E.right('a'), E.reduce(startWith, concat)),\n *   'prefix:a'\n * )\n *\n * assert.deepStrictEqual(\n *   pipe(E.left('e'), E.reduce(startWith, concat)),\n *   'prefix'\n * )\n *\n * @category folding\n * @since 2.0.0\n */\nexport var reduce = function (b, f) { return function (fa) {\n    return isLeft(fa) ? b : f(b, fa.right);\n}; };\n/**\n * Map each element of the structure to a monoid, and combine the results.\n *\n * @example\n * import { pipe } from 'fp-ts/function'\n * import * as E from 'fp-ts/Either'\n * import * as S from 'fp-ts/string'\n *\n * const yell = (a: string) => `${a}!`\n *\n * assert.deepStrictEqual(\n *   pipe(E.right('a'), E.foldMap(S.Monoid)(yell)),\n *   'a!'\n * )\n *\n * assert.deepStrictEqual(\n *   pipe(E.left('e'), E.foldMap(S.Monoid)(yell)),\n *   S.Monoid.empty\n * )\n *\n * @category folding\n * @since 2.0.0\n */\nexport var foldMap = function (M) { return function (f) { return function (fa) {\n    return isLeft(fa) ? M.empty : f(fa.right);\n}; }; };\n/**\n * Right-associative fold of a structure.\n *\n * @example\n * import { pipe } from 'fp-ts/function'\n * import * as E from 'fp-ts/Either'\n *\n * const startWith = 'postfix'\n * const concat = (a: string, b: string) => `${a}:${b}`\n *\n * assert.deepStrictEqual(\n *   pipe(E.right('a'), E.reduceRight(startWith, concat)),\n *   'a:postfix'\n * )\n *\n * assert.deepStrictEqual(\n *   pipe(E.left('e'), E.reduceRight(startWith, concat)),\n *   'postfix'\n * )\n *\n * @category folding\n * @since 2.0.0\n */\nexport var reduceRight = function (b, f) { return function (fa) {\n    return isLeft(fa) ? b : f(fa.right, b);\n}; };\n/**\n * @category instances\n * @since 2.7.0\n */\nexport var Foldable = {\n    URI: URI,\n    reduce: _reduce,\n    foldMap: _foldMap,\n    reduceRight: _reduceRight\n};\n/**\n * Map each element of a structure to an action, evaluate these actions from left to right, and collect the results.\n *\n * @example\n * import { pipe } from 'fp-ts/function'\n * import * as RA from 'fp-ts/ReadonlyArray'\n * import * as E from 'fp-ts/Either'\n * import * as O from 'fp-ts/Option'\n *\n * assert.deepStrictEqual(\n *   pipe(E.right(['a']), E.traverse(O.Applicative)(RA.head)),\n *   O.some(E.right('a'))\n *  )\n *\n * assert.deepStrictEqual(\n *   pipe(E.right([]), E.traverse(O.Applicative)(RA.head)),\n *   O.none\n * )\n *\n * @category traversing\n * @since 2.6.3\n */\nexport var traverse = function (F) {\n    return function (f) {\n        return function (ta) {\n            return isLeft(ta) ? F.of(left(ta.left)) : F.map(f(ta.right), right);\n        };\n    };\n};\n/**\n * Evaluate each monadic action in the structure from left to right, and collect the results.\n *\n * @example\n * import { pipe } from 'fp-ts/function'\n * import * as E from 'fp-ts/Either'\n * import * as O from 'fp-ts/Option'\n *\n * assert.deepStrictEqual(\n *   pipe(E.right(O.some('a')), E.sequence(O.Applicative)),\n *   O.some(E.right('a'))\n *  )\n *\n * assert.deepStrictEqual(\n *   pipe(E.right(O.none), E.sequence(O.Applicative)),\n *   O.none\n * )\n *\n * @category traversing\n * @since 2.6.3\n */\nexport var sequence = function (F) {\n    return function (ma) {\n        return isLeft(ma) ? F.of(left(ma.left)) : F.map(ma.right, right);\n    };\n};\n/**\n * @category instances\n * @since 2.7.0\n */\nexport var Traversable = {\n    URI: URI,\n    map: _map,\n    reduce: _reduce,\n    foldMap: _foldMap,\n    reduceRight: _reduceRight,\n    traverse: _traverse,\n    sequence: sequence\n};\n/**\n * Map a pair of functions over the two type arguments of the bifunctor.\n *\n * @category mapping\n * @since 2.0.0\n */\nexport var bimap = function (f, g) { return function (fa) {\n    return isLeft(fa) ? left(f(fa.left)) : right(g(fa.right));\n}; };\n/**\n * Map a function over the first type argument of a bifunctor.\n *\n * @category error handling\n * @since 2.0.0\n */\nexport var mapLeft = function (f) { return function (fa) {\n    return isLeft(fa) ? left(f(fa.left)) : fa;\n}; };\n/**\n * @category instances\n * @since 2.7.0\n */\nexport var Bifunctor = {\n    URI: URI,\n    bimap: _bimap,\n    mapLeft: _mapLeft\n};\n/**\n * Less strict version of [`alt`](#alt).\n *\n * The `W` suffix (short for **W**idening) means that the error and the return types will be merged.\n *\n * @category error handling\n * @since 2.9.0\n */\nexport var altW = function (that) { return function (fa) {\n    return isLeft(fa) ? that() : fa;\n}; };\n/**\n * Identifies an associative operation on a type constructor. It is similar to `Semigroup`, except that it applies to\n * types of kind `* -> *`.\n *\n * In case of `Either` returns the left-most non-`Left` value (or the right-most `Left` value if both values are `Left`).\n *\n * | x        | y        | pipe(x, alt(() => y) |\n * | -------- | -------- | -------------------- |\n * | left(a)  | left(b)  | left(b)              |\n * | left(a)  | right(2) | right(2)             |\n * | right(1) | left(b)  | right(1)             |\n * | right(1) | right(2) | right(1)             |\n *\n * @example\n * import * as E from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n *\n * assert.deepStrictEqual(\n *   pipe(\n *     E.left('a'),\n *     E.alt(() => E.left('b'))\n *   ),\n *   E.left('b')\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     E.left('a'),\n *     E.alt(() => E.right(2))\n *   ),\n *   E.right(2)\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     E.right(1),\n *     E.alt(() => E.left('b'))\n *   ),\n *   E.right(1)\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     E.right(1),\n *     E.alt(() => E.right(2))\n *   ),\n *   E.right(1)\n * )\n *\n * @category error handling\n * @since 2.0.0\n */\nexport var alt = altW;\n/**\n * @category instances\n * @since 2.7.0\n */\nexport var Alt = {\n    URI: URI,\n    map: _map,\n    alt: _alt\n};\n/**\n * @since 2.0.0\n */\nexport var extend = function (f) { return function (wa) {\n    return isLeft(wa) ? wa : right(f(wa));\n}; };\n/**\n * @category instances\n * @since 2.7.0\n */\nexport var Extend = {\n    URI: URI,\n    map: _map,\n    extend: _extend\n};\n/**\n * @category instances\n * @since 2.7.0\n */\nexport var ChainRec = {\n    URI: URI,\n    map: _map,\n    ap: _ap,\n    chain: flatMap,\n    chainRec: _chainRec\n};\n/**\n * @since 2.6.3\n */\nexport var throwError = left;\n/**\n * @category instances\n * @since 2.7.0\n */\nexport var MonadThrow = {\n    URI: URI,\n    map: _map,\n    ap: _ap,\n    of: of,\n    chain: flatMap,\n    throwError: throwError\n};\n/**\n * @category instances\n * @since 2.10.0\n */\nexport var FromEither = {\n    URI: URI,\n    fromEither: identity\n};\n/**\n * @example\n * import { fromPredicate, left, right } from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n *\n * assert.deepStrictEqual(\n *   pipe(\n *     1,\n *     fromPredicate(\n *       (n) => n > 0,\n *       () => 'error'\n *     )\n *   ),\n *   right(1)\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     -1,\n *     fromPredicate(\n *       (n) => n > 0,\n *       () => 'error'\n *     )\n *   ),\n *   left('error')\n * )\n *\n * @category lifting\n * @since 2.0.0\n */\nexport var fromPredicate = /*#__PURE__*/ fromPredicate_(FromEither);\n// -------------------------------------------------------------------------------------\n// conversions\n// -------------------------------------------------------------------------------------\n/**\n * @example\n * import * as E from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n * import * as O from 'fp-ts/Option'\n *\n * assert.deepStrictEqual(\n *   pipe(\n *     O.some(1),\n *     E.fromOption(() => 'error')\n *   ),\n *   E.right(1)\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     O.none,\n *     E.fromOption(() => 'error')\n *   ),\n *   E.left('error')\n * )\n *\n * @category conversions\n * @since 2.0.0\n */\nexport var fromOption = \n/*#__PURE__*/ fromOption_(FromEither);\n// -------------------------------------------------------------------------------------\n// refinements\n// -------------------------------------------------------------------------------------\n/**\n * Returns `true` if the either is an instance of `Left`, `false` otherwise.\n *\n * @category refinements\n * @since 2.0.0\n */\nexport var isLeft = _.isLeft;\n/**\n * Returns `true` if the either is an instance of `Right`, `false` otherwise.\n *\n * @category refinements\n * @since 2.0.0\n */\nexport var isRight = _.isRight;\n/**\n * Less strict version of [`match`](#match).\n *\n * The `W` suffix (short for **W**idening) means that the handler return types will be merged.\n *\n * @category pattern matching\n * @since 2.10.0\n */\nexport var matchW = function (onLeft, onRight) {\n    return function (ma) {\n        return isLeft(ma) ? onLeft(ma.left) : onRight(ma.right);\n    };\n};\n/**\n * Alias of [`matchW`](#matchw).\n *\n * @category pattern matching\n * @since 2.10.0\n */\nexport var foldW = matchW;\n/**\n * Takes two functions and an `Either` value, if the value is a `Left` the inner value is applied to the first function,\n * if the value is a `Right` the inner value is applied to the second function.\n *\n * @example\n * import { match, left, right } from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n *\n * function onLeft(errors: Array<string>): string {\n *   return `Errors: ${errors.join(', ')}`\n * }\n *\n * function onRight(value: number): string {\n *   return `Ok: ${value}`\n * }\n *\n * assert.strictEqual(\n *   pipe(\n *     right(1),\n *     match(onLeft, onRight)\n *   ),\n *   'Ok: 1'\n * )\n * assert.strictEqual(\n *   pipe(\n *     left(['error 1', 'error 2']),\n *     match(onLeft, onRight)\n *   ),\n *   'Errors: error 1, error 2'\n * )\n *\n * @category pattern matching\n * @since 2.10.0\n */\nexport var match = matchW;\n/**\n * Alias of [`match`](#match).\n *\n * @category pattern matching\n * @since 2.0.0\n */\nexport var fold = match;\n/**\n * Less strict version of [`getOrElse`](#getorelse).\n *\n * The `W` suffix (short for **W**idening) means that the handler return type will be merged.\n *\n * @category error handling\n * @since 2.6.0\n */\nexport var getOrElseW = function (onLeft) {\n    return function (ma) {\n        return isLeft(ma) ? onLeft(ma.left) : ma.right;\n    };\n};\n/**\n * Returns the wrapped value if it's a `Right` or a default value if is a `Left`.\n *\n * @example\n * import { getOrElse, left, right } from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n *\n * assert.deepStrictEqual(\n *   pipe(\n *     right(1),\n *     getOrElse(() => 0)\n *   ),\n *   1\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     left('error'),\n *     getOrElse(() => 0)\n *   ),\n *   0\n * )\n *\n * @category error handling\n * @since 2.0.0\n */\nexport var getOrElse = getOrElseW;\n// -------------------------------------------------------------------------------------\n// combinators\n// -------------------------------------------------------------------------------------\n/**\n * @category mapping\n * @since 2.10.0\n */\nexport var flap = /*#__PURE__*/ flap_(Functor);\n/**\n * Combine two effectful actions, keeping only the result of the first.\n *\n * @since 2.0.0\n */\nexport var apFirst = /*#__PURE__*/ apFirst_(Apply);\n/**\n * Less strict version of [`apFirst`](#apfirst)\n *\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @since 2.12.0\n */\nexport var apFirstW = apFirst;\n/**\n * Combine two effectful actions, keeping only the result of the second.\n *\n * @since 2.0.0\n */\nexport var apSecond = /*#__PURE__*/ apSecond_(Apply);\n/**\n * Less strict version of [`apSecond`](#apsecond)\n *\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @since 2.12.0\n */\nexport var apSecondW = apSecond;\n/**\n * Composes computations in sequence, using the return value of one computation to determine the next computation and\n * keeping only the result of the first.\n *\n * @category combinators\n * @since 2.15.0\n */\nexport var tap = /*#__PURE__*/ dual(2, chainable.tap(Chain));\n/**\n * Less strict version of [`flatten`](#flatten).\n *\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @category sequencing\n * @since 2.11.0\n */\nexport var flattenW = \n/*#__PURE__*/ flatMap(identity);\n/**\n * The `flatten` function is the conventional monad join operator. It is used to remove one level of monadic structure, projecting its bound argument into the outer level.\n *\n * @example\n * import * as E from 'fp-ts/Either'\n *\n * assert.deepStrictEqual(E.flatten(E.right(E.right('a'))), E.right('a'))\n * assert.deepStrictEqual(E.flatten(E.right(E.left('e'))), E.left('e'))\n * assert.deepStrictEqual(E.flatten(E.left('e')), E.left('e'))\n *\n * @category sequencing\n * @since 2.0.0\n */\nexport var flatten = flattenW;\n/**\n * @since 2.0.0\n */\nexport var duplicate = /*#__PURE__*/ extend(identity);\n/**\n * Use `liftOption`.\n *\n * @category legacy\n * @since 2.10.0\n */\nexport var fromOptionK = \n/*#__PURE__*/ fromOptionK_(FromEither);\n/**\n * Use `flatMapOption`.\n *\n * @category legacy\n * @since 2.11.0\n */\nexport var chainOptionK = /*#__PURE__*/ chainOptionK_(FromEither, Chain);\n/**\n * Use `flatMapOption`.\n *\n * @category legacy\n * @since 2.13.2\n */\nexport var chainOptionKW = chainOptionK;\n/** @internal */\nvar _FromEither = {\n    fromEither: FromEither.fromEither\n};\n/**\n * @category lifting\n * @since 2.15.0\n */\nexport var liftNullable = /*#__PURE__*/ _.liftNullable(_FromEither);\n/**\n * @category lifting\n * @since 2.15.0\n */\nexport var liftOption = /*#__PURE__*/ _.liftOption(_FromEither);\n/** @internal */\nvar _FlatMap = {\n    flatMap: flatMap\n};\n/**\n * @category sequencing\n * @since 2.15.0\n */\nexport var flatMapNullable = /*#__PURE__*/ _.flatMapNullable(_FromEither, _FlatMap);\n/**\n * @category sequencing\n * @since 2.15.0\n */\nexport var flatMapOption = /*#__PURE__*/ _.flatMapOption(_FromEither, _FlatMap);\n/**\n * @example\n * import * as E from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n *\n * assert.deepStrictEqual(\n *   pipe(\n *     E.right(1),\n *     E.filterOrElse(\n *       (n) => n > 0,\n *       () => 'error'\n *     )\n *   ),\n *   E.right(1)\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     E.right(-1),\n *     E.filterOrElse(\n *       (n) => n > 0,\n *       () => 'error'\n *     )\n *   ),\n *   E.left('error')\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     E.left('a'),\n *     E.filterOrElse(\n *       (n) => n > 0,\n *       () => 'error'\n *     )\n *   ),\n *   E.left('a')\n * )\n *\n * @category filtering\n * @since 2.0.0\n */\nexport var filterOrElse = /*#__PURE__*/ filterOrElse_(FromEither, Chain);\n/**\n * Less strict version of [`filterOrElse`](#filterorelse).\n *\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @category filtering\n * @since 2.9.0\n */\nexport var filterOrElseW = filterOrElse;\n/**\n * Returns a `Right` if is a `Left` (and vice versa).\n *\n * @since 2.0.0\n */\nexport var swap = function (ma) { return (isLeft(ma) ? right(ma.left) : left(ma.right)); };\n/**\n * Less strict version of [`orElse`](#orelse).\n *\n * The `W` suffix (short for **W**idening) means that the return types will be merged.\n *\n * @category error handling\n * @since 2.10.0\n */\nexport var orElseW = function (onLeft) {\n    return function (ma) {\n        return isLeft(ma) ? onLeft(ma.left) : ma;\n    };\n};\n/**\n * Useful for recovering from errors.\n *\n * @category error handling\n * @since 2.0.0\n */\nexport var orElse = orElseW;\n/**\n * Takes a default and a nullable value, if the value is not nully, turn it into a `Right`, if the value is nully use\n * the provided default as a `Left`.\n *\n * @example\n * import { fromNullable, left, right } from 'fp-ts/Either'\n *\n * const parse = fromNullable('nully')\n *\n * assert.deepStrictEqual(parse(1), right(1))\n * assert.deepStrictEqual(parse(null), left('nully'))\n *\n * @category conversions\n * @since 2.0.0\n */\nexport var fromNullable = function (e) {\n    return function (a) {\n        return a == null ? left(e) : right(a);\n    };\n};\n/**\n * Constructs a new `Either` from a function that might throw.\n *\n * See also [`tryCatchK`](#trycatchk).\n *\n * @example\n * import * as E from 'fp-ts/Either'\n *\n * const unsafeHead = <A>(as: ReadonlyArray<A>): A => {\n *   if (as.length > 0) {\n *     return as[0]\n *   } else {\n *     throw new Error('empty array')\n *   }\n * }\n *\n * const head = <A>(as: ReadonlyArray<A>): E.Either<Error, A> =>\n *   E.tryCatch(() => unsafeHead(as), e => (e instanceof Error ? e : new Error('unknown error')))\n *\n * assert.deepStrictEqual(head([]), E.left(new Error('empty array')))\n * assert.deepStrictEqual(head([1, 2, 3]), E.right(1))\n *\n * @category interop\n * @since 2.0.0\n */\nexport var tryCatch = function (f, onThrow) {\n    try {\n        return right(f());\n    }\n    catch (e) {\n        return left(onThrow(e));\n    }\n};\n/**\n * Converts a function that may throw to one returning a `Either`.\n *\n * @category interop\n * @since 2.10.0\n */\nexport var tryCatchK = function (f, onThrow) {\n    return function () {\n        var a = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            a[_i] = arguments[_i];\n        }\n        return tryCatch(function () { return f.apply(void 0, a); }, onThrow);\n    };\n};\n/**\n * Use `liftNullable`.\n *\n * @category legacy\n * @since 2.9.0\n */\nexport var fromNullableK = function (e) {\n    var from = fromNullable(e);\n    return function (f) { return flow(f, from); };\n};\n/**\n * Use `flatMapNullable`.\n *\n * @category legacy\n * @since 2.9.0\n */\nexport var chainNullableK = function (e) {\n    var from = fromNullableK(e);\n    return function (f) { return flatMap(from(f)); };\n};\n/**\n * @category conversions\n * @since 2.10.0\n */\nexport var toUnion = /*#__PURE__*/ foldW(identity, identity);\n// -------------------------------------------------------------------------------------\n// utils\n// -------------------------------------------------------------------------------------\n/**\n * Default value for the `onError` argument of `tryCatch`\n *\n * @since 2.0.0\n */\nexport function toError(e) {\n    try {\n        return e instanceof Error ? e : new Error(String(e));\n    }\n    catch (error) {\n        return new Error();\n    }\n}\nexport function elem(E) {\n    return function (a, ma) {\n        if (ma === undefined) {\n            var elemE_1 = elem(E);\n            return function (ma) { return elemE_1(a, ma); };\n        }\n        return isLeft(ma) ? false : E.equals(a, ma.right);\n    };\n}\n/**\n * Returns `false` if `Left` or returns the result of the application of the given predicate to the `Right` value.\n *\n * @example\n * import { exists, left, right } from 'fp-ts/Either'\n *\n * const gt2 = exists((n: number) => n > 2)\n *\n * assert.strictEqual(gt2(left('a')), false)\n * assert.strictEqual(gt2(right(1)), false)\n * assert.strictEqual(gt2(right(3)), true)\n *\n * @since 2.0.0\n */\nexport var exists = function (predicate) {\n    return function (ma) {\n        return isLeft(ma) ? false : predicate(ma.right);\n    };\n};\n// -------------------------------------------------------------------------------------\n// do notation\n// -------------------------------------------------------------------------------------\n/**\n * @category do notation\n * @since 2.9.0\n */\nexport var Do = /*#__PURE__*/ of(_.emptyRecord);\n/**\n * @category do notation\n * @since 2.8.0\n */\nexport var bindTo = /*#__PURE__*/ bindTo_(Functor);\nvar let_ = /*#__PURE__*/ let__(Functor);\nexport { \n/**\n * @category do notation\n * @since 2.13.0\n */\nlet_ as let };\n/**\n * @category do notation\n * @since 2.8.0\n */\nexport var bind = /*#__PURE__*/ chainable.bind(Chain);\n/**\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @category do notation\n * @since 2.8.0\n */\nexport var bindW = bind;\n/**\n * @category do notation\n * @since 2.8.0\n */\nexport var apS = /*#__PURE__*/ apS_(Apply);\n/**\n * Less strict version of [`apS`](#aps).\n *\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @category do notation\n * @since 2.8.0\n */\nexport var apSW = apS;\n/**\n * @since 2.11.0\n */\nexport var ApT = /*#__PURE__*/ of(_.emptyReadonlyArray);\n// -------------------------------------------------------------------------------------\n// array utils\n// -------------------------------------------------------------------------------------\n/**\n * Equivalent to `ReadonlyNonEmptyArray#traverseWithIndex(Applicative)`.\n *\n * @category traversing\n * @since 2.11.0\n */\nexport var traverseReadonlyNonEmptyArrayWithIndex = function (f) {\n    return function (as) {\n        var e = f(0, _.head(as));\n        if (isLeft(e)) {\n            return e;\n        }\n        var out = [e.right];\n        for (var i = 1; i < as.length; i++) {\n            var e_1 = f(i, as[i]);\n            if (isLeft(e_1)) {\n                return e_1;\n            }\n            out.push(e_1.right);\n        }\n        return right(out);\n    };\n};\n/**\n * Equivalent to `ReadonlyArray#traverseWithIndex(Applicative)`.\n *\n * @category traversing\n * @since 2.11.0\n */\nexport var traverseReadonlyArrayWithIndex = function (f) {\n    var g = traverseReadonlyNonEmptyArrayWithIndex(f);\n    return function (as) { return (_.isNonEmpty(as) ? g(as) : ApT); };\n};\n/**\n * Equivalent to `ReadonlyArray#traverseWithIndex(Applicative)`.\n *\n * @category traversing\n * @since 2.9.0\n */\nexport var traverseArrayWithIndex = traverseReadonlyArrayWithIndex;\n/**\n * Equivalent to `ReadonlyArray#traverse(Applicative)`.\n *\n * @category traversing\n * @since 2.9.0\n */\nexport var traverseArray = function (f) { return traverseReadonlyArrayWithIndex(function (_, a) { return f(a); }); };\n/**\n * Equivalent to `ReadonlyArray#sequence(Applicative)`.\n *\n * @category traversing\n * @since 2.9.0\n */\nexport var sequenceArray = \n/*#__PURE__*/ traverseArray(identity);\n// -------------------------------------------------------------------------------------\n// legacy\n// -------------------------------------------------------------------------------------\n/**\n * Alias of `flatMap`.\n *\n * @category legacy\n * @since 2.6.0\n */\nexport var chainW = flatMap;\n/**\n * Alias of `flatMap`.\n *\n * @category legacy\n * @since 2.0.0\n */\nexport var chain = flatMap;\n/**\n * Alias of `tap`.\n *\n * @category legacy\n * @since 2.0.0\n */\nexport var chainFirst = tap;\n/**\n * Alias of `tap`.\n *\n * @category legacy\n * @since 2.8.0\n */\nexport var chainFirstW = tap;\n/**\n * Use [`parse`](./Json.ts.html#parse) instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nexport function parseJSON(s, onError) {\n    return tryCatch(function () { return JSON.parse(s); }, onError);\n}\n/**\n * Use [`stringify`](./Json.ts.html#stringify) instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nexport var stringifyJSON = function (u, onError) {\n    return tryCatch(function () {\n        var s = JSON.stringify(u);\n        if (typeof s !== 'string') {\n            throw new Error('Converting unsupported structure to JSON');\n        }\n        return s;\n    }, onError);\n};\n/**\n * This instance is deprecated, use small, specific instances instead.\n * For example if a function needs a `Functor` instance, pass `E.Functor` instead of `E.either`\n * (where `E` is from `import E from 'fp-ts/Either'`)\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nexport var either = {\n    URI: URI,\n    map: _map,\n    of: of,\n    ap: _ap,\n    chain: flatMap,\n    reduce: _reduce,\n    foldMap: _foldMap,\n    reduceRight: _reduceRight,\n    traverse: _traverse,\n    sequence: sequence,\n    bimap: _bimap,\n    mapLeft: _mapLeft,\n    alt: _alt,\n    extend: _extend,\n    chainRec: _chainRec,\n    throwError: throwError\n};\n/**\n * Use [`getApplySemigroup`](./Apply.ts.html#getapplysemigroup) instead.\n *\n * Semigroup returning the left-most `Left` value. If both operands are `Right`s then the inner values\n * are concatenated using the provided `Semigroup`\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nexport var getApplySemigroup = \n/*#__PURE__*/ getApplySemigroup_(Apply);\n/**\n * Use [`getApplicativeMonoid`](./Applicative.ts.html#getapplicativemonoid) instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nexport var getApplyMonoid = \n/*#__PURE__*/ getApplicativeMonoid(Applicative);\n/**\n * Use [`getApplySemigroup`](./Apply.ts.html#getapplysemigroup) instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nexport var getValidationSemigroup = function (SE, SA) {\n    return getApplySemigroup_(getApplicativeValidation(SE))(SA);\n};\n/**\n * Use [`getApplicativeMonoid`](./Applicative.ts.html#getapplicativemonoid) instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nexport var getValidationMonoid = function (SE, MA) {\n    return getApplicativeMonoid(getApplicativeValidation(SE))(MA);\n};\n/**\n * Use [`getApplicativeValidation`](#getapplicativevalidation) and [`getAltValidation`](#getaltvalidation) instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nexport function getValidation(SE) {\n    var ap = getApplicativeValidation(SE).ap;\n    var alt = getAltValidation(SE).alt;\n    return {\n        URI: URI,\n        _E: undefined,\n        map: _map,\n        of: of,\n        chain: flatMap,\n        bimap: _bimap,\n        mapLeft: _mapLeft,\n        reduce: _reduce,\n        foldMap: _foldMap,\n        reduceRight: _reduceRight,\n        extend: _extend,\n        traverse: _traverse,\n        sequence: sequence,\n        chainRec: _chainRec,\n        throwError: throwError,\n        ap: ap,\n        alt: alt\n    };\n}\n","var __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\n/**\n * @since 1.0.0\n */\nimport { isLeft, left, right } from 'fp-ts/es6/Either';\n/**\n * @category Decode error\n * @since 1.0.0\n */\nexport var failures = left;\n/**\n * @category Decode error\n * @since 1.0.0\n */\nexport var failure = function (value, context, message) {\n    return failures([{ value: value, context: context, message: message }]);\n};\n/**\n * @category Decode error\n * @since 1.0.0\n */\nexport var success = right;\n/**\n * @category Codec\n * @since 1.0.0\n */\nvar Type = /** @class */ (function () {\n    function Type(\n    /** a unique name for this codec */\n    name, \n    /** a custom type guard */\n    is, \n    /** succeeds if a value of type I can be decoded to a value of type A */\n    validate, \n    /** converts a value of type A to a value of type O */\n    encode) {\n        this.name = name;\n        this.is = is;\n        this.validate = validate;\n        this.encode = encode;\n        this.decode = this.decode.bind(this);\n    }\n    /**\n     * @since 1.0.0\n     */\n    Type.prototype.pipe = function (ab, name) {\n        var _this = this;\n        if (name === void 0) { name = \"pipe(\".concat(this.name, \", \").concat(ab.name, \")\"); }\n        return new Type(name, ab.is, function (i, c) {\n            var e = _this.validate(i, c);\n            if (isLeft(e)) {\n                return e;\n            }\n            return ab.validate(e.right, c);\n        }, this.encode === identity && ab.encode === identity ? identity : function (b) { return _this.encode(ab.encode(b)); });\n    };\n    /**\n     * @since 1.0.0\n     */\n    Type.prototype.asDecoder = function () {\n        return this;\n    };\n    /**\n     * @since 1.0.0\n     */\n    Type.prototype.asEncoder = function () {\n        return this;\n    };\n    /**\n     * a version of `validate` with a default context\n     * @since 1.0.0\n     */\n    Type.prototype.decode = function (i) {\n        return this.validate(i, [{ key: '', type: this, actual: i }]);\n    };\n    return Type;\n}());\nexport { Type };\n// -------------------------------------------------------------------------------------\n// utils\n// -------------------------------------------------------------------------------------\n/**\n * @since 1.0.0\n */\nexport var identity = function (a) { return a; };\n/**\n * @since 1.0.0\n */\nexport function getFunctionName(f) {\n    return f.displayName || f.name || \"<function\".concat(f.length, \">\");\n}\n/**\n * @since 1.0.0\n */\nexport function getContextEntry(key, decoder) {\n    return { key: key, type: decoder };\n}\n/**\n * @since 1.0.0\n */\nexport function appendContext(c, key, decoder, actual) {\n    var len = c.length;\n    var r = Array(len + 1);\n    for (var i = 0; i < len; i++) {\n        r[i] = c[i];\n    }\n    r[len] = { key: key, type: decoder, actual: actual };\n    return r;\n}\nfunction pushAll(xs, ys) {\n    var l = ys.length;\n    for (var i = 0; i < l; i++) {\n        xs.push(ys[i]);\n    }\n}\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction getNameFromProps(props) {\n    return Object.keys(props)\n        .map(function (k) { return \"\".concat(k, \": \").concat(props[k].name); })\n        .join(', ');\n}\nfunction useIdentity(codecs) {\n    for (var i = 0; i < codecs.length; i++) {\n        if (codecs[i].encode !== identity) {\n            return false;\n        }\n    }\n    return true;\n}\nfunction getInterfaceTypeName(props) {\n    return \"{ \".concat(getNameFromProps(props), \" }\");\n}\nfunction getPartialTypeName(inner) {\n    return \"Partial<\".concat(inner, \">\");\n}\nfunction enumerableRecord(keys, domain, codomain, name) {\n    if (name === void 0) { name = \"{ [K in \".concat(domain.name, \"]: \").concat(codomain.name, \" }\"); }\n    var len = keys.length;\n    var props = {};\n    for (var i = 0; i < len; i++) {\n        props[keys[i]] = codomain;\n    }\n    var exactCodec = strict(props, name);\n    return new DictionaryType(name, function (u) { return exactCodec.is(u); }, exactCodec.validate, exactCodec.encode, domain, codomain);\n}\n/**\n * @internal\n */\nexport function getDomainKeys(domain) {\n    var _a;\n    if (isLiteralC(domain)) {\n        var literal_1 = domain.value;\n        if (string.is(literal_1)) {\n            return _a = {}, _a[literal_1] = null, _a;\n        }\n    }\n    else if (isKeyofC(domain)) {\n        return domain.keys;\n    }\n    else if (isUnionC(domain)) {\n        var keys = domain.types.map(function (type) { return getDomainKeys(type); });\n        return keys.some(undefinedType.is) ? undefined : Object.assign.apply(Object, __spreadArray([{}], keys, false));\n    }\n    return undefined;\n}\nfunction stripNonDomainKeys(o, domain) {\n    var keys = Object.keys(o);\n    var len = keys.length;\n    var shouldStrip = false;\n    var r = {};\n    for (var i = 0; i < len; i++) {\n        var k = keys[i];\n        if (domain.is(k)) {\n            r[k] = o[k];\n        }\n        else {\n            shouldStrip = true;\n        }\n    }\n    return shouldStrip ? r : o;\n}\nfunction nonEnumerableRecord(domain, codomain, name) {\n    if (name === void 0) { name = \"{ [K in \".concat(domain.name, \"]: \").concat(codomain.name, \" }\"); }\n    return new DictionaryType(name, function (u) {\n        if (UnknownRecord.is(u)) {\n            return Object.keys(u).every(function (k) { return !domain.is(k) || codomain.is(u[k]); });\n        }\n        return isAnyC(codomain) && Array.isArray(u);\n    }, function (u, c) {\n        if (UnknownRecord.is(u)) {\n            var a = {};\n            var errors = [];\n            var keys = Object.keys(u);\n            var len = keys.length;\n            var changed = false;\n            for (var i = 0; i < len; i++) {\n                var k = keys[i];\n                var ok = u[k];\n                var domainResult = domain.validate(k, appendContext(c, k, domain, k));\n                if (isLeft(domainResult)) {\n                    changed = true;\n                }\n                else {\n                    var vk = domainResult.right;\n                    changed = changed || vk !== k;\n                    k = vk;\n                    var codomainResult = codomain.validate(ok, appendContext(c, k, codomain, ok));\n                    if (isLeft(codomainResult)) {\n                        pushAll(errors, codomainResult.left);\n                    }\n                    else {\n                        var vok = codomainResult.right;\n                        changed = changed || vok !== ok;\n                        a[k] = vok;\n                    }\n                }\n            }\n            return errors.length > 0 ? failures(errors) : success((changed ? a : u));\n        }\n        if (isAnyC(codomain) && Array.isArray(u)) {\n            return success(u);\n        }\n        return failure(u, c);\n    }, domain.encode === identity && codomain.encode === identity\n        ? function (a) { return stripNonDomainKeys(a, domain); }\n        : function (a) {\n            var s = {};\n            var keys = Object.keys(stripNonDomainKeys(a, domain));\n            var len = keys.length;\n            for (var i = 0; i < len; i++) {\n                var k = keys[i];\n                s[String(domain.encode(k))] = codomain.encode(a[k]);\n            }\n            return s;\n        }, domain, codomain);\n}\nfunction getUnionName(codecs) {\n    return '(' + codecs.map(function (type) { return type.name; }).join(' | ') + ')';\n}\n/**\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function mergeAll(base, us) {\n    var equal = true;\n    var primitive = true;\n    var baseIsNotADictionary = !UnknownRecord.is(base);\n    for (var _i = 0, us_1 = us; _i < us_1.length; _i++) {\n        var u = us_1[_i];\n        if (u !== base) {\n            equal = false;\n        }\n        if (UnknownRecord.is(u)) {\n            primitive = false;\n        }\n    }\n    if (equal) {\n        return base;\n    }\n    else if (primitive) {\n        return us[us.length - 1];\n    }\n    var r = {};\n    for (var _a = 0, us_2 = us; _a < us_2.length; _a++) {\n        var u = us_2[_a];\n        for (var k in u) {\n            if (!hasOwnProperty.call(r, k) || baseIsNotADictionary || u[k] !== base[k]) {\n                r[k] = u[k];\n            }\n        }\n    }\n    return r;\n}\nfunction getProps(codec) {\n    switch (codec._tag) {\n        case 'RefinementType':\n        case 'ReadonlyType':\n            return getProps(codec.type);\n        case 'InterfaceType':\n        case 'StrictType':\n        case 'PartialType':\n            return codec.props;\n        case 'IntersectionType':\n            return codec.types.reduce(function (props, type) { return Object.assign(props, getProps(type)); }, {});\n    }\n}\nfunction stripKeys(o, props) {\n    var keys = Object.getOwnPropertyNames(o);\n    var shouldStrip = false;\n    var r = {};\n    for (var i = 0; i < keys.length; i++) {\n        var key = keys[i];\n        if (!hasOwnProperty.call(props, key)) {\n            shouldStrip = true;\n        }\n        else {\n            r[key] = o[key];\n        }\n    }\n    return shouldStrip ? r : o;\n}\nfunction getExactTypeName(codec) {\n    if (isTypeC(codec)) {\n        return \"{| \".concat(getNameFromProps(codec.props), \" |}\");\n    }\n    else if (isPartialC(codec)) {\n        return getPartialTypeName(\"{| \".concat(getNameFromProps(codec.props), \" |}\"));\n    }\n    return \"Exact<\".concat(codec.name, \">\");\n}\nfunction isNonEmpty(as) {\n    return as.length > 0;\n}\n/**\n * @internal\n */\nexport var emptyTags = {};\nfunction intersect(a, b) {\n    var r = [];\n    for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {\n        var v = a_1[_i];\n        if (b.indexOf(v) !== -1) {\n            r.push(v);\n        }\n    }\n    return r;\n}\nfunction mergeTags(a, b) {\n    if (a === emptyTags) {\n        return b;\n    }\n    if (b === emptyTags) {\n        return a;\n    }\n    var r = Object.assign({}, a);\n    for (var k in b) {\n        if (hasOwnProperty.call(a, k)) {\n            var intersection_1 = intersect(a[k], b[k]);\n            if (isNonEmpty(intersection_1)) {\n                r[k] = intersection_1;\n            }\n            else {\n                r = emptyTags;\n                break;\n            }\n        }\n        else {\n            r[k] = b[k];\n        }\n    }\n    return r;\n}\nfunction intersectTags(a, b) {\n    if (a === emptyTags || b === emptyTags) {\n        return emptyTags;\n    }\n    var r = emptyTags;\n    for (var k in a) {\n        if (hasOwnProperty.call(b, k)) {\n            var intersection_2 = intersect(a[k], b[k]);\n            if (intersection_2.length === 0) {\n                if (r === emptyTags) {\n                    r = {};\n                }\n                r[k] = a[k].concat(b[k]);\n            }\n        }\n    }\n    return r;\n}\n// tslint:disable-next-line: deprecation\nfunction isAnyC(codec) {\n    return codec._tag === 'AnyType';\n}\nfunction isLiteralC(codec) {\n    return codec._tag === 'LiteralType';\n}\nfunction isKeyofC(codec) {\n    return codec._tag === 'KeyofType';\n}\nfunction isTypeC(codec) {\n    return codec._tag === 'InterfaceType';\n}\nfunction isPartialC(codec) {\n    return codec._tag === 'PartialType';\n}\n// tslint:disable-next-line: deprecation\nfunction isStrictC(codec) {\n    return codec._tag === 'StrictType';\n}\nfunction isExactC(codec) {\n    return codec._tag === 'ExactType';\n}\n// tslint:disable-next-line: deprecation\nfunction isRefinementC(codec) {\n    return codec._tag === 'RefinementType';\n}\nfunction isIntersectionC(codec) {\n    return codec._tag === 'IntersectionType';\n}\nfunction isUnionC(codec) {\n    return codec._tag === 'UnionType';\n}\nfunction isRecursiveC(codec) {\n    return codec._tag === 'RecursiveType';\n}\nfunction isReadonlyC(codec) {\n    return codec._tag === 'ReadonlyType';\n}\nvar lazyCodecs = [];\n/**\n * @internal\n */\nexport function getTags(codec) {\n    if (lazyCodecs.indexOf(codec) !== -1) {\n        return emptyTags;\n    }\n    if (isTypeC(codec) || isStrictC(codec)) {\n        var index = emptyTags;\n        // tslint:disable-next-line: forin\n        for (var k in codec.props) {\n            var prop = codec.props[k];\n            if (isLiteralC(prop)) {\n                if (index === emptyTags) {\n                    index = {};\n                }\n                index[k] = [prop.value];\n            }\n        }\n        return index;\n    }\n    else if (isExactC(codec) || isRefinementC(codec) || isReadonlyC(codec)) {\n        return getTags(codec.type);\n    }\n    else if (isIntersectionC(codec)) {\n        return codec.types.reduce(function (tags, codec) { return mergeTags(tags, getTags(codec)); }, emptyTags);\n    }\n    else if (isUnionC(codec)) {\n        return codec.types.slice(1).reduce(function (tags, codec) { return intersectTags(tags, getTags(codec)); }, getTags(codec.types[0]));\n    }\n    else if (isRecursiveC(codec)) {\n        lazyCodecs.push(codec);\n        var tags = getTags(codec.type);\n        lazyCodecs.pop();\n        return tags;\n    }\n    return emptyTags;\n}\n/**\n * @internal\n */\nexport function getIndex(codecs) {\n    var tags = getTags(codecs[0]);\n    var keys = Object.keys(tags);\n    var len = codecs.length;\n    var _loop_1 = function (k) {\n        var all = tags[k].slice();\n        var index = [tags[k]];\n        for (var i = 1; i < len; i++) {\n            var codec = codecs[i];\n            var ctags = getTags(codec);\n            var values = ctags[k];\n            // tslint:disable-next-line: strict-type-predicates\n            if (values === undefined) {\n                return \"continue-keys\";\n            }\n            else {\n                if (values.some(function (v) { return all.indexOf(v) !== -1; })) {\n                    return \"continue-keys\";\n                }\n                else {\n                    all.push.apply(all, values);\n                    index.push(values);\n                }\n            }\n        }\n        return { value: [k, index] };\n    };\n    keys: for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n        var k = keys_1[_i];\n        var state_1 = _loop_1(k);\n        if (typeof state_1 === \"object\")\n            return state_1.value;\n        switch (state_1) {\n            case \"continue-keys\": continue keys;\n        }\n    }\n    return undefined;\n}\n// -------------------------------------------------------------------------------------\n// primitives\n// -------------------------------------------------------------------------------------\n/**\n * @since 1.0.0\n */\nvar NullType = /** @class */ (function (_super) {\n    __extends(NullType, _super);\n    function NullType() {\n        var _this = _super.call(this, 'null', function (u) { return u === null; }, function (u, c) { return (_this.is(u) ? success(u) : failure(u, c)); }, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'NullType';\n        return _this;\n    }\n    return NullType;\n}(Type));\nexport { NullType };\n/**\n * @category primitives\n * @since 1.0.0\n */\nexport var nullType = new NullType();\n/**\n * @since 1.0.0\n */\nvar UndefinedType = /** @class */ (function (_super) {\n    __extends(UndefinedType, _super);\n    function UndefinedType() {\n        var _this = _super.call(this, 'undefined', function (u) { return u === void 0; }, function (u, c) { return (_this.is(u) ? success(u) : failure(u, c)); }, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'UndefinedType';\n        return _this;\n    }\n    return UndefinedType;\n}(Type));\nexport { UndefinedType };\nvar undefinedType = new UndefinedType();\n/**\n * @since 1.2.0\n */\nvar VoidType = /** @class */ (function (_super) {\n    __extends(VoidType, _super);\n    function VoidType() {\n        var _this = _super.call(this, 'void', undefinedType.is, undefinedType.validate, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'VoidType';\n        return _this;\n    }\n    return VoidType;\n}(Type));\nexport { VoidType };\n/**\n * @category primitives\n * @since 1.2.0\n */\nexport var voidType = new VoidType();\n/**\n * @since 1.5.0\n */\nvar UnknownType = /** @class */ (function (_super) {\n    __extends(UnknownType, _super);\n    function UnknownType() {\n        var _this = _super.call(this, 'unknown', function (_) { return true; }, success, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'UnknownType';\n        return _this;\n    }\n    return UnknownType;\n}(Type));\nexport { UnknownType };\n/**\n * @category primitives\n * @since 1.5.0\n */\nexport var unknown = new UnknownType();\n/**\n * @since 1.0.0\n */\nvar StringType = /** @class */ (function (_super) {\n    __extends(StringType, _super);\n    function StringType() {\n        var _this = _super.call(this, 'string', function (u) { return typeof u === 'string'; }, function (u, c) { return (_this.is(u) ? success(u) : failure(u, c)); }, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'StringType';\n        return _this;\n    }\n    return StringType;\n}(Type));\nexport { StringType };\n/**\n * @category primitives\n * @since 1.0.0\n */\nexport var string = new StringType();\n/**\n * @since 1.0.0\n */\nvar NumberType = /** @class */ (function (_super) {\n    __extends(NumberType, _super);\n    function NumberType() {\n        var _this = _super.call(this, 'number', function (u) { return typeof u === 'number'; }, function (u, c) { return (_this.is(u) ? success(u) : failure(u, c)); }, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'NumberType';\n        return _this;\n    }\n    return NumberType;\n}(Type));\nexport { NumberType };\n/**\n * @category primitives\n * @since 1.0.0\n */\nexport var number = new NumberType();\n/**\n * @since 2.1.0\n */\nvar BigIntType = /** @class */ (function (_super) {\n    __extends(BigIntType, _super);\n    function BigIntType() {\n        var _this = _super.call(this, 'bigint', \n        // tslint:disable-next-line: valid-typeof\n        function (u) { return typeof u === 'bigint'; }, function (u, c) { return (_this.is(u) ? success(u) : failure(u, c)); }, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'BigIntType';\n        return _this;\n    }\n    return BigIntType;\n}(Type));\nexport { BigIntType };\n/**\n * @category primitives\n * @since 2.1.0\n */\nexport var bigint = new BigIntType();\n/**\n * @since 1.0.0\n */\nvar BooleanType = /** @class */ (function (_super) {\n    __extends(BooleanType, _super);\n    function BooleanType() {\n        var _this = _super.call(this, 'boolean', function (u) { return typeof u === 'boolean'; }, function (u, c) { return (_this.is(u) ? success(u) : failure(u, c)); }, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'BooleanType';\n        return _this;\n    }\n    return BooleanType;\n}(Type));\nexport { BooleanType };\n/**\n * @category primitives\n * @since 1.0.0\n */\nexport var boolean = new BooleanType();\n/**\n * @since 1.0.0\n */\nvar AnyArrayType = /** @class */ (function (_super) {\n    __extends(AnyArrayType, _super);\n    function AnyArrayType() {\n        var _this = _super.call(this, 'UnknownArray', Array.isArray, function (u, c) { return (_this.is(u) ? success(u) : failure(u, c)); }, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'AnyArrayType';\n        return _this;\n    }\n    return AnyArrayType;\n}(Type));\nexport { AnyArrayType };\n/**\n * @category primitives\n * @since 1.7.1\n */\nexport var UnknownArray = new AnyArrayType();\n/**\n * @since 1.0.0\n */\nvar AnyDictionaryType = /** @class */ (function (_super) {\n    __extends(AnyDictionaryType, _super);\n    function AnyDictionaryType() {\n        var _this = _super.call(this, 'UnknownRecord', function (u) { return u !== null && typeof u === 'object' && !Array.isArray(u); }, function (u, c) { return (_this.is(u) ? success(u) : failure(u, c)); }, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'AnyDictionaryType';\n        return _this;\n    }\n    return AnyDictionaryType;\n}(Type));\nexport { AnyDictionaryType };\n/**\n * @category primitives\n * @since 1.7.1\n */\nexport var UnknownRecord = new AnyDictionaryType();\nexport { \n/**\n * @category primitives\n * @since 1.0.0\n */\nnullType as null, \n/**\n * @category primitives\n * @since 1.0.0\n */\nundefinedType as undefined, \n/**\n * @category primitives\n * @since 1.0.0\n */\nvoidType as void };\n/**\n * @since 1.0.0\n */\nvar LiteralType = /** @class */ (function (_super) {\n    __extends(LiteralType, _super);\n    function LiteralType(name, is, validate, encode, value) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.value = value;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'LiteralType';\n        return _this;\n    }\n    return LiteralType;\n}(Type));\nexport { LiteralType };\n/**\n * @category constructors\n * @since 1.0.0\n */\nexport function literal(value, name) {\n    if (name === void 0) { name = JSON.stringify(value); }\n    var is = function (u) { return u === value; };\n    return new LiteralType(name, is, function (u, c) { return (is(u) ? success(value) : failure(u, c)); }, identity, value);\n}\n/**\n * @since 1.0.0\n */\nvar KeyofType = /** @class */ (function (_super) {\n    __extends(KeyofType, _super);\n    function KeyofType(name, is, validate, encode, keys) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.keys = keys;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'KeyofType';\n        return _this;\n    }\n    return KeyofType;\n}(Type));\nexport { KeyofType };\n/**\n * @category constructors\n * @since 1.0.0\n */\nexport function keyof(keys, name) {\n    if (name === void 0) { name = Object.keys(keys)\n        .map(function (k) { return JSON.stringify(k); })\n        .join(' | '); }\n    var is = function (u) { return string.is(u) && hasOwnProperty.call(keys, u); };\n    return new KeyofType(name, is, function (u, c) { return (is(u) ? success(u) : failure(u, c)); }, identity, keys);\n}\n// -------------------------------------------------------------------------------------\n// combinators\n// -------------------------------------------------------------------------------------\n/**\n * @since 1.0.0\n */\nvar RefinementType = /** @class */ (function (_super) {\n    __extends(RefinementType, _super);\n    function RefinementType(name, is, validate, encode, type, predicate) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.type = type;\n        _this.predicate = predicate;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'RefinementType';\n        return _this;\n    }\n    return RefinementType;\n}(Type));\nexport { RefinementType };\n/**\n * @category combinators\n * @since 1.8.1\n */\nexport function brand(codec, predicate, name) {\n    return refinement(codec, predicate, name);\n}\n/**\n * A branded codec representing an integer\n *\n * @category primitives\n * @since 1.8.1\n */\nexport var Int = brand(number, function (n) { return Number.isInteger(n); }, 'Int');\n/**\n * @since 1.0.0\n */\nvar RecursiveType = /** @class */ (function (_super) {\n    __extends(RecursiveType, _super);\n    function RecursiveType(name, is, validate, encode, runDefinition) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.runDefinition = runDefinition;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'RecursiveType';\n        return _this;\n    }\n    return RecursiveType;\n}(Type));\nexport { RecursiveType };\nObject.defineProperty(RecursiveType.prototype, 'type', {\n    get: function () {\n        return this.runDefinition();\n    },\n    enumerable: true,\n    configurable: true\n});\n/**\n * @category combinators\n * @since 1.0.0\n */\nexport function recursion(name, definition) {\n    var cache;\n    var runDefinition = function () {\n        if (!cache) {\n            cache = definition(Self);\n            cache.name = name;\n        }\n        return cache;\n    };\n    var Self = new RecursiveType(name, function (u) { return runDefinition().is(u); }, function (u, c) { return runDefinition().validate(u, c); }, function (a) { return runDefinition().encode(a); }, runDefinition);\n    return Self;\n}\n/**\n * @since 1.0.0\n */\nvar ArrayType = /** @class */ (function (_super) {\n    __extends(ArrayType, _super);\n    function ArrayType(name, is, validate, encode, type) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.type = type;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'ArrayType';\n        return _this;\n    }\n    return ArrayType;\n}(Type));\nexport { ArrayType };\n/**\n * @category combinators\n * @since 1.0.0\n */\nexport function array(item, name) {\n    if (name === void 0) { name = \"Array<\".concat(item.name, \">\"); }\n    return new ArrayType(name, function (u) { return UnknownArray.is(u) && u.every(item.is); }, function (u, c) {\n        var e = UnknownArray.validate(u, c);\n        if (isLeft(e)) {\n            return e;\n        }\n        var us = e.right;\n        var len = us.length;\n        var as = us;\n        var errors = [];\n        for (var i = 0; i < len; i++) {\n            var ui = us[i];\n            var result = item.validate(ui, appendContext(c, String(i), item, ui));\n            if (isLeft(result)) {\n                pushAll(errors, result.left);\n            }\n            else {\n                var ai = result.right;\n                if (ai !== ui) {\n                    if (as === us) {\n                        as = us.slice();\n                    }\n                    as[i] = ai;\n                }\n            }\n        }\n        return errors.length > 0 ? failures(errors) : success(as);\n    }, item.encode === identity ? identity : function (a) { return a.map(item.encode); }, item);\n}\n/**\n * @since 1.0.0\n */\nvar InterfaceType = /** @class */ (function (_super) {\n    __extends(InterfaceType, _super);\n    function InterfaceType(name, is, validate, encode, props) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.props = props;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'InterfaceType';\n        return _this;\n    }\n    return InterfaceType;\n}(Type));\nexport { InterfaceType };\n/**\n * @category combinators\n * @since 1.0.0\n */\nexport function type(props, name) {\n    if (name === void 0) { name = getInterfaceTypeName(props); }\n    var keys = Object.keys(props);\n    var types = keys.map(function (key) { return props[key]; });\n    var len = keys.length;\n    return new InterfaceType(name, function (u) {\n        if (UnknownRecord.is(u)) {\n            for (var i = 0; i < len; i++) {\n                var k = keys[i];\n                var uk = u[k];\n                if ((uk === undefined && !hasOwnProperty.call(u, k)) || !types[i].is(uk)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        return false;\n    }, function (u, c) {\n        var e = UnknownRecord.validate(u, c);\n        if (isLeft(e)) {\n            return e;\n        }\n        var o = e.right;\n        var a = o;\n        var errors = [];\n        for (var i = 0; i < len; i++) {\n            var k = keys[i];\n            var ak = a[k];\n            var type_1 = types[i];\n            var result = type_1.validate(ak, appendContext(c, k, type_1, ak));\n            if (isLeft(result)) {\n                pushAll(errors, result.left);\n            }\n            else {\n                var vak = result.right;\n                if (vak !== ak || (vak === undefined && !hasOwnProperty.call(a, k))) {\n                    /* istanbul ignore next */\n                    if (a === o) {\n                        a = __assign({}, o);\n                    }\n                    a[k] = vak;\n                }\n            }\n        }\n        return errors.length > 0 ? failures(errors) : success(a);\n    }, useIdentity(types)\n        ? identity\n        : function (a) {\n            var s = __assign({}, a);\n            for (var i = 0; i < len; i++) {\n                var k = keys[i];\n                var encode = types[i].encode;\n                if (encode !== identity) {\n                    s[k] = encode(a[k]);\n                }\n            }\n            return s;\n        }, props);\n}\n/**\n * @since 1.0.0\n */\nvar PartialType = /** @class */ (function (_super) {\n    __extends(PartialType, _super);\n    function PartialType(name, is, validate, encode, props) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.props = props;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'PartialType';\n        return _this;\n    }\n    return PartialType;\n}(Type));\nexport { PartialType };\n/**\n * @category combinators\n * @since 1.0.0\n */\nexport function partial(props, name) {\n    if (name === void 0) { name = getPartialTypeName(getInterfaceTypeName(props)); }\n    var keys = Object.keys(props);\n    var types = keys.map(function (key) { return props[key]; });\n    var len = keys.length;\n    return new PartialType(name, function (u) {\n        if (UnknownRecord.is(u)) {\n            for (var i = 0; i < len; i++) {\n                var k = keys[i];\n                var uk = u[k];\n                if (uk !== undefined && !props[k].is(uk)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        return false;\n    }, function (u, c) {\n        var e = UnknownRecord.validate(u, c);\n        if (isLeft(e)) {\n            return e;\n        }\n        var o = e.right;\n        var a = o;\n        var errors = [];\n        for (var i = 0; i < len; i++) {\n            var k = keys[i];\n            var ak = a[k];\n            var type_2 = props[k];\n            var result = type_2.validate(ak, appendContext(c, k, type_2, ak));\n            if (isLeft(result)) {\n                if (ak !== undefined) {\n                    pushAll(errors, result.left);\n                }\n            }\n            else {\n                var vak = result.right;\n                if (vak !== ak) {\n                    /* istanbul ignore next */\n                    if (a === o) {\n                        a = __assign({}, o);\n                    }\n                    a[k] = vak;\n                }\n            }\n        }\n        return errors.length > 0 ? failures(errors) : success(a);\n    }, useIdentity(types)\n        ? identity\n        : function (a) {\n            var s = __assign({}, a);\n            for (var i = 0; i < len; i++) {\n                var k = keys[i];\n                var ak = a[k];\n                if (ak !== undefined) {\n                    s[k] = types[i].encode(ak);\n                }\n            }\n            return s;\n        }, props);\n}\n/**\n * @since 1.0.0\n */\nvar DictionaryType = /** @class */ (function (_super) {\n    __extends(DictionaryType, _super);\n    function DictionaryType(name, is, validate, encode, domain, codomain) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.domain = domain;\n        _this.codomain = codomain;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'DictionaryType';\n        return _this;\n    }\n    return DictionaryType;\n}(Type));\nexport { DictionaryType };\n/**\n * @category combinators\n * @since 1.7.1\n */\nexport function record(domain, codomain, name) {\n    var keys = getDomainKeys(domain);\n    return keys\n        ? enumerableRecord(Object.keys(keys), domain, codomain, name)\n        : nonEnumerableRecord(domain, codomain, name);\n}\n/**\n * @since 1.0.0\n */\nvar UnionType = /** @class */ (function (_super) {\n    __extends(UnionType, _super);\n    function UnionType(name, is, validate, encode, types) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.types = types;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'UnionType';\n        return _this;\n    }\n    return UnionType;\n}(Type));\nexport { UnionType };\n/**\n * @category combinators\n * @since 1.0.0\n */\nexport function union(codecs, name) {\n    if (name === void 0) { name = getUnionName(codecs); }\n    var index = getIndex(codecs);\n    if (index !== undefined && codecs.length > 0) {\n        var tag_1 = index[0], groups_1 = index[1];\n        var len_1 = groups_1.length;\n        var find_1 = function (value) {\n            for (var i = 0; i < len_1; i++) {\n                if (groups_1[i].indexOf(value) !== -1) {\n                    return i;\n                }\n            }\n            return undefined;\n        };\n        // tslint:disable-next-line: deprecation\n        return new TaggedUnionType(name, function (u) {\n            if (UnknownRecord.is(u)) {\n                var i = find_1(u[tag_1]);\n                return i !== undefined ? codecs[i].is(u) : false;\n            }\n            return false;\n        }, function (u, c) {\n            var e = UnknownRecord.validate(u, c);\n            if (isLeft(e)) {\n                return e;\n            }\n            var r = e.right;\n            var i = find_1(r[tag_1]);\n            if (i === undefined) {\n                return failure(u, c);\n            }\n            var codec = codecs[i];\n            return codec.validate(r, appendContext(c, String(i), codec, r));\n        }, useIdentity(codecs)\n            ? identity\n            : function (a) {\n                var i = find_1(a[tag_1]);\n                if (i === undefined) {\n                    // https://github.com/gcanti/io-ts/pull/305\n                    throw new Error(\"no codec found to encode value in union codec \".concat(name));\n                }\n                else {\n                    return codecs[i].encode(a);\n                }\n            }, codecs, tag_1);\n    }\n    else {\n        return new UnionType(name, function (u) { return codecs.some(function (type) { return type.is(u); }); }, function (u, c) {\n            var errors = [];\n            for (var i = 0; i < codecs.length; i++) {\n                var codec = codecs[i];\n                var result = codec.validate(u, appendContext(c, String(i), codec, u));\n                if (isLeft(result)) {\n                    pushAll(errors, result.left);\n                }\n                else {\n                    return success(result.right);\n                }\n            }\n            return failures(errors);\n        }, useIdentity(codecs)\n            ? identity\n            : function (a) {\n                for (var _i = 0, codecs_1 = codecs; _i < codecs_1.length; _i++) {\n                    var codec = codecs_1[_i];\n                    if (codec.is(a)) {\n                        return codec.encode(a);\n                    }\n                }\n                // https://github.com/gcanti/io-ts/pull/305\n                throw new Error(\"no codec found to encode value in union type \".concat(name));\n            }, codecs);\n    }\n}\n/**\n * @since 1.0.0\n */\nvar IntersectionType = /** @class */ (function (_super) {\n    __extends(IntersectionType, _super);\n    function IntersectionType(name, is, validate, encode, types) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.types = types;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'IntersectionType';\n        return _this;\n    }\n    return IntersectionType;\n}(Type));\nexport { IntersectionType };\nexport function intersection(codecs, name) {\n    if (name === void 0) { name = \"(\".concat(codecs.map(function (type) { return type.name; }).join(' & '), \")\"); }\n    var len = codecs.length;\n    return new IntersectionType(name, function (u) { return codecs.every(function (type) { return type.is(u); }); }, codecs.length === 0\n        ? success\n        : function (u, c) {\n            var us = [];\n            var errors = [];\n            for (var i = 0; i < len; i++) {\n                var codec = codecs[i];\n                var result = codec.validate(u, appendContext(c, String(i), codec, u));\n                if (isLeft(result)) {\n                    pushAll(errors, result.left);\n                }\n                else {\n                    us.push(result.right);\n                }\n            }\n            return errors.length > 0 ? failures(errors) : success(mergeAll(u, us));\n        }, codecs.length === 0\n        ? identity\n        : function (a) {\n            return mergeAll(a, codecs.map(function (codec) { return codec.encode(a); }));\n        }, codecs);\n}\n/**\n * @since 1.0.0\n */\nvar TupleType = /** @class */ (function (_super) {\n    __extends(TupleType, _super);\n    function TupleType(name, is, validate, encode, types) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.types = types;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'TupleType';\n        return _this;\n    }\n    return TupleType;\n}(Type));\nexport { TupleType };\nexport function tuple(codecs, name) {\n    if (name === void 0) { name = \"[\".concat(codecs.map(function (type) { return type.name; }).join(', '), \"]\"); }\n    var len = codecs.length;\n    return new TupleType(name, function (u) { return UnknownArray.is(u) && u.length === len && codecs.every(function (type, i) { return type.is(u[i]); }); }, function (u, c) {\n        var e = UnknownArray.validate(u, c);\n        if (isLeft(e)) {\n            return e;\n        }\n        var us = e.right;\n        var as = us.length > len ? us.slice(0, len) : us; // strip additional components\n        var errors = [];\n        for (var i = 0; i < len; i++) {\n            var a = us[i];\n            var type_3 = codecs[i];\n            var result = type_3.validate(a, appendContext(c, String(i), type_3, a));\n            if (isLeft(result)) {\n                pushAll(errors, result.left);\n            }\n            else {\n                var va = result.right;\n                if (va !== a) {\n                    /* istanbul ignore next */\n                    if (as === us) {\n                        as = us.slice();\n                    }\n                    as[i] = va;\n                }\n            }\n        }\n        return errors.length > 0 ? failures(errors) : success(as);\n    }, useIdentity(codecs) ? identity : function (a) { return codecs.map(function (type, i) { return type.encode(a[i]); }); }, codecs);\n}\n/**\n * @since 1.0.0\n */\nvar ReadonlyType = /** @class */ (function (_super) {\n    __extends(ReadonlyType, _super);\n    function ReadonlyType(name, is, validate, encode, type) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.type = type;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'ReadonlyType';\n        return _this;\n    }\n    return ReadonlyType;\n}(Type));\nexport { ReadonlyType };\n/**\n * @category combinators\n * @since 1.0.0\n */\nexport function readonly(codec, name) {\n    if (name === void 0) { name = \"Readonly<\".concat(codec.name, \">\"); }\n    return new ReadonlyType(name, codec.is, codec.validate, codec.encode, codec);\n}\n/**\n * @since 1.0.0\n */\nvar ReadonlyArrayType = /** @class */ (function (_super) {\n    __extends(ReadonlyArrayType, _super);\n    function ReadonlyArrayType(name, is, validate, encode, type) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.type = type;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'ReadonlyArrayType';\n        return _this;\n    }\n    return ReadonlyArrayType;\n}(Type));\nexport { ReadonlyArrayType };\n/**\n * @category combinators\n * @since 1.0.0\n */\nexport function readonlyArray(item, name) {\n    if (name === void 0) { name = \"ReadonlyArray<\".concat(item.name, \">\"); }\n    var codec = array(item);\n    return new ReadonlyArrayType(name, codec.is, codec.validate, codec.encode, item);\n}\n/**\n * Strips additional properties, equivalent to `exact(type(props))`.\n *\n * @category combinators\n * @since 1.0.0\n */\nexport var strict = function (props, name) { return exact(type(props), name); };\n/**\n * @since 1.1.0\n */\nvar ExactType = /** @class */ (function (_super) {\n    __extends(ExactType, _super);\n    function ExactType(name, is, validate, encode, type) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.type = type;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'ExactType';\n        return _this;\n    }\n    return ExactType;\n}(Type));\nexport { ExactType };\n/**\n * Strips additional properties.\n *\n * @category combinators\n * @since 1.1.0\n */\nexport function exact(codec, name) {\n    if (name === void 0) { name = getExactTypeName(codec); }\n    var props = getProps(codec);\n    return new ExactType(name, codec.is, function (u, c) {\n        var e = UnknownRecord.validate(u, c);\n        if (isLeft(e)) {\n            return e;\n        }\n        var ce = codec.validate(u, c);\n        if (isLeft(ce)) {\n            return ce;\n        }\n        return right(stripKeys(ce.right, props));\n    }, function (a) { return codec.encode(stripKeys(a, props)); }, codec);\n}\n/**\n * @since 1.0.0\n */\nvar FunctionType = /** @class */ (function (_super) {\n    __extends(FunctionType, _super);\n    function FunctionType() {\n        var _this = _super.call(this, 'Function', \n        // tslint:disable-next-line:strict-type-predicates\n        function (u) { return typeof u === 'function'; }, function (u, c) { return (_this.is(u) ? success(u) : failure(u, c)); }, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'FunctionType';\n        return _this;\n    }\n    return FunctionType;\n}(Type));\nexport { FunctionType };\n/**\n * @category primitives\n * @since 1.0.0\n */\nexport var Function = new FunctionType();\n/**\n * @since 1.0.0\n */\nvar NeverType = /** @class */ (function (_super) {\n    __extends(NeverType, _super);\n    function NeverType() {\n        var _this = _super.call(this, 'never', function (_) { return false; }, function (u, c) { return failure(u, c); }, \n        /* istanbul ignore next */\n        function () {\n            throw new Error('cannot encode never');\n        }) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'NeverType';\n        return _this;\n    }\n    return NeverType;\n}(Type));\nexport { NeverType };\n/**\n * @category primitives\n * @since 1.0.0\n */\nexport var never = new NeverType();\n/**\n * @since 1.0.0\n */\nvar AnyType = /** @class */ (function (_super) {\n    __extends(AnyType, _super);\n    function AnyType() {\n        var _this = _super.call(this, 'any', function (_) { return true; }, success, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'AnyType';\n        return _this;\n    }\n    return AnyType;\n}(Type));\nexport { AnyType };\n/**\n * @category primitives\n * @since 1.0.0\n */\nexport var any = new AnyType();\nexport function refinement(codec, predicate, name) {\n    if (name === void 0) { name = \"(\".concat(codec.name, \" | \").concat(getFunctionName(predicate), \")\"); }\n    return new RefinementType(name, function (u) { return codec.is(u) && predicate(u); }, function (i, c) {\n        var e = codec.validate(i, c);\n        if (isLeft(e)) {\n            return e;\n        }\n        var a = e.right;\n        return predicate(a) ? success(a) : failure(a, c);\n    }, codec.encode, codec, predicate);\n}\n/**\n * @category primitives\n * @since 1.0.0\n */\nexport var Integer = refinement(number, Number.isInteger, 'Integer');\n// -------------------------------------------------------------------------------------\n// deprecated\n// -------------------------------------------------------------------------------------\n/**\n * @since 1.3.0\n * @deprecated\n */\nvar TaggedUnionType = /** @class */ (function (_super) {\n    __extends(TaggedUnionType, _super);\n    function TaggedUnionType(name, \n    // tslint:disable-next-line: deprecation\n    is, \n    // tslint:disable-next-line: deprecation\n    validate, \n    // tslint:disable-next-line: deprecation\n    encode, codecs, tag) {\n        var _this = _super.call(this, name, is, validate, encode, codecs) /* istanbul ignore next */ // <= workaround for https://github.com/Microsoft/TypeScript/issues/13455\n         || this;\n        _this.tag = tag;\n        return _this;\n    }\n    return TaggedUnionType;\n}(UnionType));\nexport { TaggedUnionType };\n/**\n * Use `union` instead.\n *\n * @category combinators\n * @since 1.3.0\n * @deprecated\n */\nexport var taggedUnion = function (tag, codecs, name\n// tslint:disable-next-line: deprecation\n) {\n    if (name === void 0) { name = getUnionName(codecs); }\n    var U = union(codecs, name);\n    // tslint:disable-next-line: deprecation\n    if (U instanceof TaggedUnionType) {\n        return U;\n    }\n    else {\n        console.warn(\"[io-ts] Cannot build a tagged union for \".concat(name, \", returning a de-optimized union\"));\n        // tslint:disable-next-line: deprecation\n        return new TaggedUnionType(name, U.is, U.validate, U.encode, codecs, tag);\n    }\n};\nexport { \n/**\n * Use `UnknownArray` instead.\n *\n * @category primitives\n * @deprecated\n * @since 1.0.0\n */\nUnknownArray as Array };\nexport { \n/**\n * Use `type` instead.\n *\n * @category combinators\n * @deprecated\n * @since 1.0.0\n */\ntype as interface };\n/**\n * @since 1.0.0\n * @deprecated\n */\nexport var getValidationError /* istanbul ignore next */ = function (value, context) { return ({\n    value: value,\n    context: context\n}); };\n/**\n * @since 1.0.0\n * @deprecated\n */\nexport var getDefaultContext /* istanbul ignore next */ = function (decoder) { return [\n    { key: '', type: decoder }\n]; };\n/**\n * Use `UnknownRecord` instead.\n *\n * @category primitives\n * @since 1.0.0\n * @deprecated\n */\nexport var Dictionary = UnknownRecord;\n/**\n * @since 1.0.0\n * @deprecated\n */\nvar ObjectType = /** @class */ (function (_super) {\n    __extends(ObjectType, _super);\n    function ObjectType() {\n        var _this = _super.call(this, 'object', function (u) { return u !== null && typeof u === 'object'; }, function (u, c) { return (_this.is(u) ? success(u) : failure(u, c)); }, identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'ObjectType';\n        return _this;\n    }\n    return ObjectType;\n}(Type));\nexport { ObjectType };\n/**\n * Use `UnknownRecord` instead.\n *\n * @category primitives\n * @since 1.0.0\n * @deprecated\n */\n// tslint:disable-next-line: deprecation\nexport var object = new ObjectType();\n/**\n * Use `record` instead.\n *\n * @category combinators\n * @since 1.0.0\n * @deprecated\n */\nexport var dictionary = record;\n/**\n * @since 1.0.0\n * @deprecated\n */\nvar StrictType = /** @class */ (function (_super) {\n    __extends(StrictType, _super);\n    function StrictType(name, \n    // tslint:disable-next-line: deprecation\n    is, \n    // tslint:disable-next-line: deprecation\n    validate, \n    // tslint:disable-next-line: deprecation\n    encode, props) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.props = props;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'StrictType';\n        return _this;\n    }\n    return StrictType;\n}(Type));\nexport { StrictType };\n/**\n * Drops the codec \"kind\".\n *\n * @category combinators\n * @since 1.1.0\n * @deprecated\n */\nexport function clean(codec) {\n    return codec;\n}\nexport function alias(codec) {\n    return function () { return codec; };\n}\n","import { Equipment } from \"@shared/models/equipment\";\nimport {\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseWarmupSet,\n  IPlannerProgramProperty,\n  IExportedPlannerProgram,\n} from \"./types\";\nimport { parser as plannerExerciseParser } from \"../plannerExerciseParser\";\nimport {\n  IPlannerEvalFullResult,\n  IPlannerEvalResult,\n  PlannerExerciseEvaluator,\n  PlannerSyntaxError,\n} from \"../plannerExerciseEvaluator\";\nimport {\n  IAllCustomExercises,\n  IAllEquipment,\n  IDayData,\n  IExerciseType,\n  IPlannerProgram,\n  IPlannerProgramWeek,\n  IProgram,\n  ISettings,\n} from \"@shared/types\";\nimport { ObjectUtils } from \"@shared/utils/object\";\nimport { PlannerExerciseEvaluatorText, parseWeekHeading } from \"../plannerExerciseEvaluatorText\";\nimport { IPlannerTopLineItem } from \"../plannerExerciseEvaluator\";\nimport { IEvaluatedProgram, IExportedProgram, Program } from \"@shared/models/program\";\nimport { PlannerEvaluator } from \"../plannerEvaluator\";\nimport { IWeightChange } from \"@shared/models/programExercise\";\nimport { Storage } from \"@shared/models/storage\";\nimport { Weight } from \"@shared/models/weight\";\nimport { PP } from \"@shared/models/pp\";\nimport { IEither } from \"@shared/utils/types\";\nimport { getLatestMigrationVersion } from \"@shared/migrations/migrations\";\nimport { ProgramToPlanner } from \"@shared/models/programToPlanner\";\nimport { PlannerKey } from \"../plannerKey\";\nimport { UidFactory } from \"@shared/utils/generator\";\nimport { CollectionUtils } from \"@shared/utils/collection\";\n\nexport type IExerciseTypeToProperties = Record<string, (IPlannerProgramProperty & { dayData: Required<IDayData> })[]>;\nexport type IExerciseTypeToWarmupSets = Record<string, IPlannerProgramExerciseWarmupSet[] | undefined>;\n\nexport class PlannerDayDataError extends Error {\n  constructor(\n    message: string,\n    public readonly dayData: Required<IDayData>\n  ) {\n    super(message);\n  }\n}\n\nexport type IDereuseDecision = \"all\" | \"weight\" | \"rpe\" | \"timer\";\n\nexport class PlannerProgram {\n  public static isValid(program: IPlannerProgram, settings: ISettings): boolean {\n    const { evaluatedWeeks } = PlannerProgram.evaluate(program, settings);\n    return evaluatedWeeks.every((week) => week.every((day) => day.success));\n  }\n\n  public static replaceWeight(\n    program: IEvaluatedProgram,\n    programExerciseId: string,\n    weightChanges: IWeightChange[]\n  ): IEvaluatedProgram {\n    if (weightChanges.every((wc) => ObjectUtils.isEqual(wc.originalWeight, wc.weight))) {\n      return program;\n    }\n    const newEvalutedProgram = ObjectUtils.clone(program);\n    PP.iterate2(newEvalutedProgram.weeks, (ex) => {\n      if (ex.key === programExerciseId) {\n        for (const setVariation of ex.evaluatedSetVariations) {\n          for (const set of setVariation.sets) {\n            const weightChange = weightChanges.find((wc) => Weight.eqNull(wc.originalWeight, set.weight));\n            if (weightChange != null) {\n              set.weight = weightChange.weight;\n            }\n          }\n        }\n      }\n    });\n    return newEvalutedProgram;\n  }\n\n  public static replaceExercise(\n    planner: IPlannerProgram,\n    key: string,\n    newLabel: string | undefined,\n    toExerciseType: IExerciseType | string,\n    settings: ISettings,\n    dayData?: Required<IDayData>\n  ): IPlannerProgram {\n    const evaluatedProgram = ObjectUtils.clone(Program.evaluate({ ...Program.create(\"Temp\"), planner }, settings));\n    const allExercises = Program.getAllProgramExercises(evaluatedProgram);\n    let labelSuffix: string | undefined = undefined;\n    let noConflicts = false;\n\n    function getLabel(label?: string): string | undefined {\n      return (newLabel ?? label) || labelSuffix\n        ? CollectionUtils.compact([newLabel ?? label, labelSuffix]).join(\"-\")\n        : undefined;\n    }\n\n    if (dayData) {\n      noConflicts = true;\n    }\n\n    while (!noConflicts) {\n      const conflictingExercises = allExercises.filter((e) => {\n        const newKey =\n          typeof toExerciseType === \"string\"\n            ? PlannerKey.fromLabelNameAndEquipment(\n                getLabel(e.label),\n                toExerciseType,\n                undefined,\n                settings.exercises,\n                Equipment.currentEquipment(settings)\n              )\n            : PlannerKey.fromExerciseType(toExerciseType, getLabel(e.label));\n        return (\n          e.key === newKey &&\n          (!dayData || (dayData.week !== e.dayData.week && dayData.dayInWeek !== e.dayData.dayInWeek))\n        );\n      });\n      if (conflictingExercises.length > 0) {\n        noConflicts = false;\n        labelSuffix = UidFactory.generateUid(3);\n      } else {\n        noConflicts = true;\n      }\n    }\n\n    const renameMapping: Record<string, { to: string; dayData?: Required<IDayData> }> = {};\n    PP.iterate2(evaluatedProgram.weeks, (exercise, weekIndex, dayInWeekIndex) => {\n      if (exercise.key === key) {\n        if (!dayData || (dayData.week === weekIndex + 1 && dayData.dayInWeek === dayInWeekIndex + 1)) {\n          exercise.exerciseType = typeof toExerciseType === \"string\" ? undefined : toExerciseType;\n          const newLabel2 = getLabel(exercise.label);\n          exercise.label = newLabel2;\n          if (typeof toExerciseType === \"string\") {\n            exercise.notused = true;\n            exercise.fullName = `${newLabel2 ? `${newLabel2}: ` : \"\"}${toExerciseType}`;\n          }\n          const newKey =\n            typeof toExerciseType === \"string\"\n              ? PlannerKey.fromLabelNameAndEquipment(\n                  newLabel2,\n                  toExerciseType,\n                  undefined,\n                  settings.exercises,\n                  Equipment.currentEquipment(settings)\n                )\n              : PlannerKey.fromExerciseType(toExerciseType, newLabel2);\n          renameMapping[exercise.key] = { to: newKey, dayData };\n          exercise.key = newKey;\n        }\n      }\n    });\n    if (!dayData && renameMapping[key] != null) {\n      // Reuse references can hold their own copy of the reused exercise, so they must follow the rename too.\n      const renamed = renameMapping[key].to;\n      const follow = (reused: IPlannerProgramExercise | undefined): void => {\n        if (reused != null && reused.key === key) {\n          reused.exerciseType = typeof toExerciseType === \"string\" ? undefined : toExerciseType;\n          reused.key = renamed;\n        }\n      };\n      PP.iterate2(evaluatedProgram.weeks, (exercise) => {\n        follow(exercise.reuse?.exercise);\n        follow(exercise.progress?.reuse?.exercise);\n        follow(exercise.update?.reuse?.exercise);\n        follow(exercise.descriptions?.reuse?.exercise);\n      });\n    }\n    return new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner({ renameMapping });\n  }\n\n  public static replaceAndValidateExercise(\n    program: IProgram,\n    key: string,\n    toExerciseType: IExerciseType,\n    settings: ISettings,\n    dayData?: Required<IDayData>\n  ): IEither<IProgram, string> {\n    const newPlanner = PlannerProgram.replaceExercise(\n      program.planner!,\n      key,\n      undefined,\n      toExerciseType,\n      settings,\n      dayData\n    );\n    const { evaluatedWeeks } = PlannerEvaluator.evaluate(newPlanner, settings);\n    let error: PlannerSyntaxError | undefined;\n    for (const week of evaluatedWeeks) {\n      for (const day of week) {\n        if (!day.success) {\n          error = day.error;\n          break;\n        }\n      }\n    }\n    if (error) {\n      return { success: false, error: error.message };\n    } else {\n      return { success: true, data: { ...program, planner: newPlanner } };\n    }\n  }\n\n  public static modifyTopLineItems(\n    aPlannerProgram: IPlannerProgram,\n    settings: ISettings,\n    firstPass: (\n      line: IPlannerTopLineItem,\n      weekIndex: number,\n      dayInWeekIndex: number,\n      dayIndex: number,\n      lineIndex: number\n    ) => IPlannerTopLineItem\n  ): IPlannerProgram {\n    let dayIndex = 0;\n    const plannerProgram = ObjectUtils.clone(aPlannerProgram);\n    const mapping = plannerProgram.weeks.map((week, weekIndex) => {\n      return week.days.map((day, dayInWeekIndex) => {\n        const tree = plannerExerciseParser.parse(day.exerciseText);\n        const evaluator = new PlannerExerciseEvaluator(day.exerciseText, settings, \"perday\", {\n          day: dayIndex + 1,\n          dayInWeek: dayInWeekIndex + 1,\n          week: weekIndex + 1,\n        });\n        dayIndex += 1;\n        const map = evaluator.topLineMap(tree.topNode);\n        return map;\n      });\n    });\n\n    dayIndex = 0;\n    for (let weekIndex = 0; weekIndex < mapping.length; weekIndex += 1) {\n      const week = mapping[weekIndex];\n      for (let dayInWeekIndex = 0; dayInWeekIndex < week.length; dayInWeekIndex += 1) {\n        const day = week[dayInWeekIndex];\n        for (let lineIndex = 0; lineIndex < day.length; lineIndex += 1) {\n          const line = day[lineIndex];\n          const newLine = firstPass(line, weekIndex, dayInWeekIndex, dayIndex, lineIndex);\n          day[lineIndex] = newLine;\n        }\n        dayIndex += 1;\n      }\n    }\n\n    for (let weekIndex = 0; weekIndex < mapping.length; weekIndex += 1) {\n      const programWeek = plannerProgram.weeks[weekIndex];\n      const week = mapping[weekIndex];\n      for (let dayInWeekIndex = 0; dayInWeekIndex < week.length; dayInWeekIndex += 1) {\n        const day = week[dayInWeekIndex];\n        const programDay = programWeek.days[dayInWeekIndex];\n        let str = \"\";\n        for (const line of day) {\n          str += this.topLineItemToText(line);\n        }\n        programDay.exerciseText = str.trim();\n      }\n    }\n\n    return plannerProgram;\n  }\n\n  public static topLineItemToText(line: IPlannerTopLineItem): string {\n    let str = \"\";\n    if (line.type === \"description\") {\n      //\n    } else if (line.type === \"exercise\") {\n      if (!line.used) {\n        if (line.descriptions && line.descriptions.length > 0) {\n          str += `${line.descriptions.join(\"\\n\\n\")}\\n`;\n        }\n        let repeatStr = \"\";\n        if ((line.order != null && line.order !== 0) || (line.repeatRanges && line.repeatRanges.length > 0)) {\n          const repeatParts = [];\n          if (line.order != null && line.order !== 0) {\n            repeatParts.push(line.order);\n          }\n          if (line.repeatRanges && line.repeatRanges.length > 0) {\n            repeatParts.push(line.repeatRanges.join(\",\"));\n          }\n          repeatStr = `[${repeatParts.join(\",\")}]`;\n        }\n        str += `${line.fullName}${repeatStr} / ${line.sections}\\n`;\n      }\n    } else {\n      str += line.value + \"\\n\";\n    }\n    return str;\n  }\n\n  public static switchToUnit(plannerProgram: IPlannerProgram, settings: ISettings): IPlannerProgram {\n    const newPlannerProgram = ObjectUtils.clone(plannerProgram);\n    for (const week of newPlannerProgram.weeks) {\n      for (const day of week.days) {\n        const evaluator = new PlannerExerciseEvaluator(day.exerciseText, settings, \"perday\");\n        const tree = plannerExerciseParser.parse(day.exerciseText);\n        day.exerciseText = evaluator.switchWeightsToUnit(tree.topNode, settings);\n      }\n    }\n    return newPlannerProgram;\n  }\n\n  public static compact(\n    oldPlannerProgram: IPlannerProgram,\n    plannerProgram: IPlannerProgram,\n    settings: ISettings,\n    additionalRepeatingExercises?: Set<string>\n  ): IPlannerProgram {\n    let dayIndex = 0;\n    const repeatingExercises = new Set<string>();\n    const { evaluatedWeeks } = PlannerProgram.evaluate(ObjectUtils.clone(oldPlannerProgram), settings);\n    const { evaluatedWeeks: newEvaluatedWeeks } = PlannerProgram.evaluate(ObjectUtils.clone(plannerProgram), settings);\n    for (const ev of [evaluatedWeeks, newEvaluatedWeeks]) {\n      PP.iterate(ev, (exercise) => {\n        if (exercise.repeat != null && exercise.repeat.length > 0) {\n          repeatingExercises.add(exercise.key);\n        }\n      });\n    }\n    for (const ex of additionalRepeatingExercises || []) {\n      repeatingExercises.add(ex);\n    }\n\n    const lastDescriptions: Partial<Record<number, string | undefined>> = {};\n    plannerProgram.weeks.forEach((week) => {\n      week.days.forEach((day, dayInWeekIndex) => {\n        if (lastDescriptions[dayInWeekIndex] == null) {\n          lastDescriptions[dayInWeekIndex] = day.description;\n        } else if (lastDescriptions[dayInWeekIndex] === day.description) {\n          day.description = undefined;\n        } else {\n          lastDescriptions[dayInWeekIndex] = day.description;\n        }\n      });\n    });\n\n    const mapping = plannerProgram.weeks.map((week, weekIndex) => {\n      return week.days.map((day, dayInWeekIndex) => {\n        const tree = plannerExerciseParser.parse(day.exerciseText);\n        const evaluator = new PlannerExerciseEvaluator(day.exerciseText, settings, \"perday\", {\n          day: dayIndex + 1,\n          dayInWeek: dayInWeekIndex + 1,\n          week: weekIndex + 1,\n        });\n        dayIndex += 1;\n        const map = evaluator.topLineMap(tree.topNode);\n        return map;\n      });\n    });\n\n    for (let weekIndex = 0; weekIndex < mapping.length; weekIndex += 1) {\n      const week = mapping[weekIndex];\n      for (dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n        const day = week[dayIndex];\n        for (const line of day) {\n          if (line.type === \"exercise\" && !line.used && repeatingExercises.has(line.value)) {\n            const repeatRanges: [number, number | undefined][] = [];\n            for (let repeatWeekIndex = weekIndex + 1; repeatWeekIndex < mapping.length; repeatWeekIndex += 1) {\n              const repeatDay = mapping[repeatWeekIndex]?.[dayIndex];\n              const repeatedExercises = (repeatDay || []).filter((e) => {\n                if (\n                  e.type !== \"exercise\" ||\n                  e.value !== line.value ||\n                  e.sectionsToReuse !== line.sectionsToReuse ||\n                  e.exerciseIndex !== line.exerciseIndex ||\n                  !ObjectUtils.isEqual(e.descriptions || [], line.descriptions || [])\n                ) {\n                  return false;\n                }\n                const oldDay = evaluatedWeeks[repeatWeekIndex][dayIndex];\n                const oldExercise = oldDay.success ? oldDay.data.find((ex) => ex.key === e.value) : undefined;\n                return oldExercise?.repeating?.includes(weekIndex + 1);\n              });\n              for (const e of repeatedExercises) {\n                e.used = true;\n              }\n              if (repeatedExercises.length > 0) {\n                if (repeatRanges.length === 0 || repeatRanges[repeatRanges.length - 1][1] != null) {\n                  repeatRanges.push([repeatWeekIndex, undefined]);\n                }\n              } else {\n                if (repeatRanges.length > 0) {\n                  repeatRanges[repeatRanges.length - 1][1] = repeatWeekIndex;\n                }\n                break;\n              }\n            }\n            if (repeatRanges.length > 0 && repeatRanges[repeatRanges.length - 1][1] == null) {\n              repeatRanges[repeatRanges.length - 1][1] = mapping.length;\n            }\n            line.repeatRanges = repeatRanges.map((r) => `${r[0]}-${r[1]}`);\n          }\n        }\n      }\n    }\n\n    for (let weekIndex = 0; weekIndex < mapping.length; weekIndex += 1) {\n      const programWeek = plannerProgram.weeks[weekIndex];\n      const week = mapping[weekIndex];\n      for (dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n        const day = week[dayIndex];\n        const programDay = programWeek.days[dayIndex];\n        let str = \"\";\n        let ongoingDescriptions = false;\n        for (const line of day) {\n          if (line.type === \"description\") {\n            ongoingDescriptions = true;\n            //\n          } else if (line.type === \"exercise\") {\n            ongoingDescriptions = false;\n            if (!line.used) {\n              if (line.descriptions && line.descriptions.length > 0) {\n                str += `${line.descriptions.filter((d) => d.trim()).join(\"\\n\\n\")}\\n`;\n              }\n              let repeatStr = \"\";\n              if ((line.order != null && line.order !== 0) || (line.repeatRanges && line.repeatRanges.length > 0)) {\n                const repeatParts = [];\n                if (line.order != null && line.order !== 0) {\n                  repeatParts.push(line.order);\n                }\n                if (line.repeatRanges && line.repeatRanges.length > 0) {\n                  repeatParts.push(line.repeatRanges.join(\",\"));\n                }\n                repeatStr = `[${repeatParts.join(\",\")}]`;\n              }\n              str += [`${line.fullName}${repeatStr}`, line.sections].filter((r) => r).join(\" / \") + `\\n`;\n            }\n          } else if (line.type === \"empty\") {\n            if (!ongoingDescriptions) {\n              str += line.value + \"\\n\";\n            }\n          } else {\n            str += line.value + \"\\n\";\n          }\n        }\n        programDay.exerciseText = str.trim();\n      }\n    }\n\n    return plannerProgram;\n  }\n\n  public static groupedTopLines(topLine: IPlannerTopLineItem[][][]): IPlannerTopLineItem[][][][] {\n    const groupedTopLine: IPlannerTopLineItem[][][][] = [];\n    for (let weekIndex = 0; weekIndex < topLine.length; weekIndex += 1) {\n      const topLineWeek = topLine[weekIndex];\n      groupedTopLine.push([]);\n      for (let dayInWeekIndex = 0; dayInWeekIndex < topLineWeek.length; dayInWeekIndex += 1) {\n        const topLineDay = topLineWeek[dayInWeekIndex];\n        const group: IPlannerTopLineItem[][] = [];\n        groupedTopLine[weekIndex].push(group);\n        let reset = true;\n        for (let lineIndex = 0; lineIndex < topLineDay.length; lineIndex += 1) {\n          if (reset) {\n            group.push([]);\n            reset = false;\n          }\n          const line = topLineDay[lineIndex];\n          group[group.length - 1] = group[group.length - 1] || [];\n          group[group.length - 1].push(line);\n          if (line.type === \"exercise\") {\n            reset = true;\n          }\n        }\n      }\n    }\n    for (const week of groupedTopLine) {\n      for (const day of week) {\n        day.sort((group1, group2) => {\n          const ex1 = group1.find((l) => l.type === \"exercise\");\n          const ex2 = group2.find((l) => l.type === \"exercise\");\n          if (ex1 == null || ex2 == null) {\n            return 0;\n          }\n          if (ex1.exerciseIndex === ex2.exerciseIndex) {\n            return (ex1.repeat?.[0] ?? 0) - (ex2.repeat?.[0] ?? 0);\n          } else {\n            return (ex1.exerciseIndex ?? 0) - (ex2.exerciseIndex ?? 0);\n          }\n        });\n      }\n    }\n    return groupedTopLine;\n  }\n\n  public static topLineItems(plannerProgram: IPlannerProgram, settings: ISettings): IPlannerTopLineItem[][][] {\n    let dayIndex = 0;\n\n    const mapping = plannerProgram.weeks.map((week, weekIndex) => {\n      return week.days.map((day, dayInWeekIndex) => {\n        const tree = plannerExerciseParser.parse(day.exerciseText);\n        const evaluator = new PlannerExerciseEvaluator(day.exerciseText, settings, \"perday\", {\n          day: dayIndex + 1,\n          dayInWeek: dayInWeekIndex + 1,\n          week: weekIndex + 1,\n        });\n        dayIndex += 1;\n        const map = evaluator.topLineMap(tree.topNode);\n        return map;\n      });\n    });\n    for (let weekIndex = 0; weekIndex < mapping.length; weekIndex += 1) {\n      const week = mapping[weekIndex];\n      for (dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n        const day = week[dayIndex];\n        for (const exercise of day) {\n          for (const r of exercise.repeat || []) {\n            const reuseDay = mapping[r - 1]?.[dayIndex];\n            if (reuseDay && !reuseDay.some((e) => e.type === \"exercise\" && e.value === exercise.value)) {\n              if (exercise.descriptions) {\n                for (let di = 0; di < exercise.descriptions.length; di += 1) {\n                  if (di !== 0) {\n                    reuseDay.push({ type: \"empty\", value: \"\" });\n                  }\n                  reuseDay.push({ type: \"description\", value: exercise.descriptions[di] });\n                }\n              }\n              reuseDay.push({ ...exercise, repeat: undefined });\n            }\n          }\n        }\n      }\n    }\n    return mapping;\n  }\n\n  public static evaluate(\n    plannerProgram: IPlannerProgram,\n    settings: ISettings\n  ): { evaluatedWeeks: IPlannerEvalResult[][]; exerciseFullNames: string[] } {\n    return PlannerEvaluator.evaluate(plannerProgram, settings);\n  }\n\n  public static evaluateFull(\n    fullProgramText: string,\n    settings: ISettings\n  ): { evaluatedWeeks: IPlannerEvalFullResult; exerciseFullNames: string[] } {\n    return PlannerEvaluator.evaluateFull(fullProgramText, settings);\n  }\n\n  public static evaluateText(fullProgramText: string): IPlannerProgramWeek[] {\n    const evaluator = new PlannerExerciseEvaluatorText(fullProgramText);\n    const tree = plannerExerciseParser.parse(fullProgramText);\n    const data = evaluator.evaluate(tree.topNode);\n    const weeks: IPlannerProgramWeek[] = data.map((week) => {\n      return {\n        name: week.name,\n        ...(week.loop != null ? { loop: week.loop } : {}),\n        description: week.description,\n        notes: week.notes,\n        days: week.days.map((day) => {\n          return {\n            name: day.name,\n            description: day.description,\n            notes: day.notes,\n            exerciseText: day.exercises.join(\"\").trim(),\n          };\n        }),\n      };\n    });\n    if (weeks.length === 0) {\n      weeks.push({ name: \"Week 1\", days: [{ name: \"Day 1\", exerciseText: \"\" }] });\n    }\n    return weeks;\n  }\n\n  public static fullToWeekEvalResult(fullResult: IPlannerEvalFullResult): IPlannerEvalResult[][] {\n    return fullResult.success\n      ? fullResult.data.map((week) => week.days.map((d) => ({ success: true, data: d.exercises })))\n      : [[fullResult]];\n  }\n\n  // A name that reads as a loop marker would turn into a marker on the next full-text round trip.\n  public static isWeekNameReserved(name: string): boolean {\n    const heading = parseWeekHeading(name);\n    return heading.loop != null || heading.error != null;\n  }\n\n  // Marks one week as the loop start and clears the marker on every other week.\n  public static setLoopWeek(planner: IPlannerProgram, weekIndex: number | undefined): IPlannerProgram {\n    return {\n      ...planner,\n      weeks: planner.weeks.map((week, i) => {\n        const { loop: _loop, ...rest } = week;\n        return i === weekIndex ? { ...rest, loop: \"start\" as const } : rest;\n      }),\n    };\n  }\n\n  public static generateFullText(weeks: IPlannerProgramWeek[]): string {\n    let fullText = \"\";\n    for (const week of weeks) {\n      if (week.notes != null) {\n        fullText += `${week.notes}\\n`;\n      }\n      if (week.description != null) {\n        fullText +=\n          week.description\n            .split(\"\\n\")\n            .map((l) => (l ? `// ${l}` : \"//\"))\n            .join(\"\\n\") + \"\\n\";\n      }\n      fullText += `# ${week.name}${week.loop === \"start\" ? \" / loop: start\" : \"\"}\\n`;\n      for (const day of week.days) {\n        if (day.notes != null) {\n          fullText += `${day.notes}\\n`;\n        }\n        if (day.description != null) {\n          fullText +=\n            day.description\n              .split(\"\\n\")\n              .map((l) => `// ${l}`)\n              .join(\"\\n\") + \"\\n\";\n        }\n        fullText += `## ${day.name}\\n`;\n        fullText += `${day.exerciseText}\\n\\n`;\n      }\n      fullText += \"\\n\";\n    }\n    return fullText;\n  }\n\n  public static usedExercises(\n    exercises: IAllCustomExercises,\n    evaluatedWeeks: IPlannerEvalResult[][]\n  ): IAllCustomExercises {\n    return ObjectUtils.filter(exercises, (_id, ex) => {\n      if (!ex) {\n        return false;\n      }\n\n      return evaluatedWeeks.some((week) => {\n        return week.some((day) => {\n          return day.success && day.data.some((d) => d.name.toLowerCase() === ex.name.toLowerCase());\n        });\n      });\n    });\n  }\n\n  public static usedEquipment(equipment: IAllEquipment, evaluatedWeeks: IPlannerEvalResult[][]): IAllEquipment {\n    return ObjectUtils.filter(equipment, (key, value) => {\n      return evaluatedWeeks.some((week) => {\n        return week.some((day) => {\n          return day.success && day.data.some((d) => d.equipment?.toLowerCase() === key);\n        });\n      });\n    });\n  }\n\n  public static buildExportedProgram(\n    id: string,\n    program: IPlannerProgram,\n    settings: ISettings,\n    nextDay?: number\n  ): IExportedProgram {\n    const { evaluatedWeeks } = PlannerProgram.evaluate(program, settings);\n\n    const exportedPlannerProgram: IExportedPlannerProgram = {\n      id,\n      type: \"v2\",\n      version: getLatestMigrationVersion(),\n      program: program,\n      plannerSettings: settings.planner,\n      settings: {\n        exercises: PlannerProgram.usedExercises(settings.exercises, evaluatedWeeks),\n        timer: settings.timers.workout ?? 0,\n      },\n    };\n    return Program.exportedPlannerProgramToExportedProgram(exportedPlannerProgram, nextDay);\n  }\n\n  public static async getExportedPlannerProgram(\n    client: Window[\"fetch\"],\n    program: IExportedPlannerProgram,\n    settings: ISettings\n  ): Promise<IEither<IExportedPlannerProgram, string[]>> {\n    const storage = Storage.getDefault();\n    storage.version = program.version;\n    storage.programs = [{ ...Program.create(program.program.name), planner: program.program }];\n    storage.settings = { ...storage.settings, planner: program.plannerSettings || storage.settings.planner };\n    storage.settings.exercises = { ...storage.settings.exercises, ...settings.exercises };\n\n    const result = await Storage.get(client, storage);\n    if (result.success) {\n      const newStorage = result.data;\n      return {\n        success: true,\n        data: {\n          id: program.id,\n          type: \"v2\",\n          version: newStorage.version,\n          program: newStorage.programs[0].planner!,\n          plannerSettings: storage.settings.planner,\n          settings: {\n            exercises: storage.settings.exercises || {},\n            timer: storage.settings.timers?.workout || 180,\n          },\n        },\n      };\n    } else {\n      return { success: false, error: result.error };\n    }\n  }\n}\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function p(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function d(n){return o=1,h(D,n)}function h(n,u,i){var o=p(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.__f)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=o.__c.props!==n;return u.some(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),c&&c.call(this,n,t,r)||i};r.__f=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=p(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__H.__h.push(i))}function _(n,u){var i=p(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){if(\"function\"==typeof n){var r=n(t());return function(){n(null),r&&\"function\"==typeof r&&r()}}if(n)return n.current=t(),function(){return n.current=null}},null==r?r:r.concat(n))}function T(n,r){var u=p(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=p(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=p(t++,10),i=d();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=p(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();){var t=n.__H;if(n.__P&&t)try{t.__h.some(z),t.__h.some(B),t.__h=[]}catch(r){t.__h=[],c.__e(r,n.__v)}}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(i.__h.some(z),i.__h.some(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.some(function(n){n.u&&(n.__H=n.u),n.u=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.some(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.some(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,35);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,h as useReducer,A as useRef,d as useState};\n//# sourceMappingURL=hooks.module.js.map\n","/* eslint-disable @typescript-eslint/unified-signatures */\nimport { LiftoscriptEvaluator, NodeName, LiftoscriptSyntaxError } from \"./liftoscriptEvaluator\";\nimport { parser as LiftoscriptParser } from \"./liftoscript\";\nimport { IScriptBindings, IScriptFnContext, IScriptFunctions, Progress } from \"./models/progress\";\nimport { Weight } from \"./models/weight\";\nimport { IUnit, IWeight, IProgramState, IPercentage, IDayData, IExerciseType, ISettings } from \"./types\";\nimport type { Tree } from \"@lezer/common\";\nimport { ErrorReporter } from \"./utils/errorReporter\";\nimport { IProgramMode } from \"./models/program\";\nimport { ILiftoscriptEvaluatorUpdate } from \"./liftoscriptEvaluator\";\n\nconst lastAlertDisplayedTs: Partial<Record<string, number>> = {};\n\nexport class ScriptRunner {\n  private readonly script: string;\n  private readonly state: IProgramState;\n  private readonly otherStates: Record<number, IProgramState>;\n  private readonly bindings: IScriptBindings;\n  private readonly fns: IScriptFunctions;\n  private readonly units: IUnit;\n  private readonly context: IScriptFnContext;\n  private readonly mode: IProgramMode;\n  private updates: ILiftoscriptEvaluatorUpdate[] = [];\n\n  constructor(\n    script: string,\n    state: IProgramState,\n    otherStates: Record<number, IProgramState>,\n    bindings: IScriptBindings,\n    fns: IScriptFunctions,\n    units: IUnit,\n    context: IScriptFnContext,\n    mode: IProgramMode\n  ) {\n    this.script = script;\n    this.state = state;\n    this.otherStates = otherStates;\n    this.bindings = bindings;\n    this.fns = fns;\n    this.units = units;\n    this.context = context;\n    this.mode = mode;\n  }\n\n  public static isValid(\n    script: string,\n    state: IProgramState,\n    dayData: IDayData,\n    settings: ISettings,\n    exerciseType?: IExerciseType\n  ): LiftoscriptSyntaxError | undefined {\n    const liftoscriptEvaluator = new ScriptRunner(\n      script,\n      state,\n      {},\n      Progress.createEmptyScriptBindings(dayData, settings),\n      Progress.createScriptFunctions(settings),\n      settings.units,\n      { exerciseType: exerciseType, unit: settings.units, prints: [] },\n      \"planner\"\n    );\n    try {\n      liftoscriptEvaluator.parse();\n    } catch (e) {\n      if (e instanceof LiftoscriptSyntaxError) {\n        return e;\n      } else {\n        throw e;\n      }\n    }\n    return undefined;\n  }\n\n  public parse(): [LiftoscriptEvaluator, Tree] {\n    const liftoscriptTree = LiftoscriptParser.parse(this.script);\n    const liftoscriptEvaluator = new LiftoscriptEvaluator(\n      this.script,\n      this.state,\n      this.otherStates,\n      this.bindings,\n      this.fns,\n      this.context,\n      this.units,\n      this.mode\n    );\n    liftoscriptEvaluator.parse(liftoscriptTree.topNode);\n    return [liftoscriptEvaluator, liftoscriptTree];\n  }\n\n  public switchWeightsToUnit(toUnit: IUnit): string {\n    const liftoscriptTree = LiftoscriptParser.parse(this.script);\n    const liftoscriptEvaluator = new LiftoscriptEvaluator(\n      this.script,\n      this.state,\n      this.otherStates,\n      this.bindings,\n      this.fns,\n      this.context,\n      this.units,\n      this.mode\n    );\n    return liftoscriptEvaluator.switchWeightsToUnit(liftoscriptTree.topNode, toUnit);\n  }\n\n  public getStateVariableKeys(): Set<string> {\n    const liftoscriptTree = LiftoscriptParser.parse(this.script);\n    const liftoscriptEvaluator = new LiftoscriptEvaluator(\n      this.script,\n      this.state,\n      this.otherStates,\n      this.bindings,\n      this.fns,\n      this.context,\n      this.units,\n      this.mode\n    );\n    return liftoscriptEvaluator.getStateVariableKeys(liftoscriptTree.topNode);\n  }\n\n  public static hasStateVariable(script: string, name: string): boolean {\n    const expr = LiftoscriptParser.parse(script);\n    const cursor = expr.cursor();\n    do {\n      if (cursor.node.type.name === NodeName.StateVariable) {\n        const keywordNode = cursor.node.getChild(NodeName.Keyword);\n        if (keywordNode != null) {\n          const value = LiftoscriptEvaluator.getValue(script, keywordNode);\n          if (value === name) {\n            return true;\n          }\n        }\n      }\n    } while (cursor.next());\n    return false;\n  }\n\n  public static hasKeyword(script: string, name: string): boolean {\n    const expr = LiftoscriptParser.parse(script);\n    const cursor = expr.cursor();\n    do {\n      if (cursor.node.type.name === NodeName.Keyword) {\n        if (LiftoscriptEvaluator.getValue(script, cursor.node) === name) {\n          return true;\n        }\n      }\n    } while (cursor.next());\n    return false;\n  }\n\n  public static safe<T>(cb: () => T, errorMsg: (e: Error) => string, defaultValue: T, disabled?: boolean): T {\n    let value: T;\n    try {\n      value = cb();\n    } catch (e) {\n      if (!disabled && e instanceof LiftoscriptSyntaxError) {\n        const lastAlertTs = lastAlertDisplayedTs[e.message];\n        if (lastAlertTs == null || lastAlertTs < Date.now() - 1000 * 60 * 1) {\n          if (typeof window !== \"undefined\") {\n            alert(errorMsg(e));\n          }\n          this.reportError(\"Error during Liftoscript execution\", e);\n          lastAlertDisplayedTs[e.message] = Date.now();\n        }\n        value = defaultValue;\n      } else {\n        throw e;\n      }\n    }\n    return value;\n  }\n\n  public execute(type: \"reps\"): number;\n  public execute(type: \"rpe\"): number;\n  public execute(type: \"weight\"): IWeight | IPercentage;\n  public execute(type: \"timer\"): number;\n  public execute(type?: undefined): number | IWeight | boolean;\n  public execute(type?: \"reps\" | \"weight\" | \"timer\" | \"rpe\"): number | IWeight | IPercentage | boolean {\n    const [liftoscriptEvaluator, liftoscriptTree] = this.parse();\n    const rawResult = liftoscriptEvaluator.evaluate(liftoscriptTree.topNode);\n    let result = Array.isArray(rawResult) ? rawResult[0] : rawResult;\n    if (result == null) {\n      result = 0;\n    }\n    const output = this.convertResult(type, result);\n    this.updates = liftoscriptEvaluator.updates;\n\n    return output;\n  }\n\n  public getUpdates(): ILiftoscriptEvaluatorUpdate[] {\n    return this.updates;\n  }\n\n  private convertResult(\n    type: \"reps\" | \"weight\" | \"timer\" | \"rpe\" | undefined,\n    result: number | IWeight | IPercentage | boolean\n  ): number | IWeight | IPercentage | boolean {\n    if (type === \"reps\" || type === \"timer\") {\n      if (typeof result !== \"number\") {\n        throw new LiftoscriptSyntaxError(\"Expected to get number as a result\", 0, 0, 0, 0);\n      } else if (result < 0) {\n        return 0;\n      } else {\n        return result;\n      }\n    } else if (type === \"rpe\") {\n      if (typeof result !== \"number\") {\n        throw new LiftoscriptSyntaxError(\"Expected to get number as a result\", 0, 0, 0, 0);\n      } else {\n        return Math.round(Math.min(10, Math.max(0, result)) / 0.5) * 0.5;\n      }\n    } else if (type === \"weight\") {\n      if (typeof result === \"boolean\") {\n        throw new LiftoscriptSyntaxError(\"Expected to get number, percentage or weight as a result\", 0, 0, 0, 0);\n      } else if (typeof result === \"number\") {\n        return Weight.build(result, this.units);\n      } else {\n        if (result.value < 0) {\n          return Weight.build(0, this.units);\n        } else {\n          return result;\n        }\n      }\n    } else {\n      return result;\n    }\n  }\n\n  private static reportError(msg: string, error?: Error): void {\n    ErrorReporter.report(msg, error);\n  }\n}\n","(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global[\"micro-memoize\"] = factory());\n})(this, (function () { 'use strict';\n\n    /**\n     * @constant DEFAULT_OPTIONS_KEYS the default options keys\n     */\n    var DEFAULT_OPTIONS_KEYS = {\n        isEqual: true,\n        isMatchingKey: true,\n        isPromise: true,\n        maxSize: true,\n        onCacheAdd: true,\n        onCacheChange: true,\n        onCacheHit: true,\n        transformKey: true,\n    };\n    /**\n     * @function slice\n     *\n     * @description\n     * slice.call() pre-bound\n     */\n    var slice = Array.prototype.slice;\n    /**\n     * @function cloneArray\n     *\n     * @description\n     * clone the array-like object and return the new array\n     *\n     * @param arrayLike the array-like object to clone\n     * @returns the clone as an array\n     */\n    function cloneArray(arrayLike) {\n        var length = arrayLike.length;\n        if (!length) {\n            return [];\n        }\n        if (length === 1) {\n            return [arrayLike[0]];\n        }\n        if (length === 2) {\n            return [arrayLike[0], arrayLike[1]];\n        }\n        if (length === 3) {\n            return [arrayLike[0], arrayLike[1], arrayLike[2]];\n        }\n        return slice.call(arrayLike, 0);\n    }\n    /**\n     * @function getCustomOptions\n     *\n     * @description\n     * get the custom options on the object passed\n     *\n     * @param options the memoization options passed\n     * @returns the custom options passed\n     */\n    function getCustomOptions(options) {\n        var customOptions = {};\n        /* eslint-disable no-restricted-syntax */\n        for (var key in options) {\n            if (!DEFAULT_OPTIONS_KEYS[key]) {\n                customOptions[key] = options[key];\n            }\n        }\n        /* eslint-enable */\n        return customOptions;\n    }\n    /**\n     * @function isMemoized\n     *\n     * @description\n     * is the function passed already memoized\n     *\n     * @param fn the function to test\n     * @returns is the function already memoized\n     */\n    function isMemoized(fn) {\n        return typeof fn === 'function' && fn.isMemoized;\n    }\n    /**\n     * @function isSameValueZero\n     *\n     * @description\n     * are the objects equal based on SameValueZero equality\n     *\n     * @param object1 the first object to compare\n     * @param object2 the second object to compare\n     * @returns are the two objects equal\n     */\n    function isSameValueZero(object1, object2) {\n        // eslint-disable-next-line no-self-compare\n        return object1 === object2 || (object1 !== object1 && object2 !== object2);\n    }\n    /**\n     * @function mergeOptions\n     *\n     * @description\n     * merge the options into the target\n     *\n     * @param existingOptions the options provided\n     * @param newOptions the options to include\n     * @returns the merged options\n     */\n    function mergeOptions(existingOptions, newOptions) {\n        var target = {};\n        /* eslint-disable no-restricted-syntax */\n        for (var key in existingOptions) {\n            target[key] = existingOptions[key];\n        }\n        for (var key in newOptions) {\n            target[key] = newOptions[key];\n        }\n        /* eslint-enable */\n        return target;\n    }\n\n    // utils\n    var Cache = /** @class */ (function () {\n        function Cache(options) {\n            this.keys = [];\n            this.values = [];\n            this.options = options;\n            var isMatchingKeyFunction = typeof options.isMatchingKey === 'function';\n            if (isMatchingKeyFunction) {\n                this.getKeyIndex = this._getKeyIndexFromMatchingKey;\n            }\n            else if (options.maxSize > 1) {\n                this.getKeyIndex = this._getKeyIndexForMany;\n            }\n            else {\n                this.getKeyIndex = this._getKeyIndexForSingle;\n            }\n            this.canTransformKey = typeof options.transformKey === 'function';\n            this.shouldCloneArguments = this.canTransformKey || isMatchingKeyFunction;\n            this.shouldUpdateOnAdd = typeof options.onCacheAdd === 'function';\n            this.shouldUpdateOnChange = typeof options.onCacheChange === 'function';\n            this.shouldUpdateOnHit = typeof options.onCacheHit === 'function';\n        }\n        Object.defineProperty(Cache.prototype, \"size\", {\n            /**\n             * The number of cached [key,value] results.\n             */\n            get: function () {\n                return this.keys.length;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(Cache.prototype, \"snapshot\", {\n            /**\n             * A copy of the cache at a moment in time. This is useful\n             * to compare changes over time, since the cache mutates\n             * internally for performance reasons.\n             */\n            get: function () {\n                return {\n                    keys: cloneArray(this.keys),\n                    size: this.size,\n                    values: cloneArray(this.values),\n                };\n            },\n            enumerable: false,\n            configurable: true\n        });\n        /**\n         * Gets the matching key index when a custom key matcher is used.\n         */\n        Cache.prototype._getKeyIndexFromMatchingKey = function (keyToMatch) {\n            var _a = this.options, isMatchingKey = _a.isMatchingKey, maxSize = _a.maxSize;\n            var keys = this.keys;\n            var keysLength = keys.length;\n            if (!keysLength) {\n                return -1;\n            }\n            if (isMatchingKey(keys[0], keyToMatch)) {\n                return 0;\n            }\n            if (maxSize > 1) {\n                for (var index = 1; index < keysLength; index++) {\n                    if (isMatchingKey(keys[index], keyToMatch)) {\n                        return index;\n                    }\n                }\n            }\n            return -1;\n        };\n        /**\n         * Gets the matching key index when multiple keys are used.\n         */\n        Cache.prototype._getKeyIndexForMany = function (keyToMatch) {\n            var isEqual = this.options.isEqual;\n            var keys = this.keys;\n            var keysLength = keys.length;\n            if (!keysLength) {\n                return -1;\n            }\n            if (keysLength === 1) {\n                return this._getKeyIndexForSingle(keyToMatch);\n            }\n            var keyLength = keyToMatch.length;\n            var existingKey;\n            var argIndex;\n            if (keyLength > 1) {\n                for (var index = 0; index < keysLength; index++) {\n                    existingKey = keys[index];\n                    if (existingKey.length === keyLength) {\n                        argIndex = 0;\n                        for (; argIndex < keyLength; argIndex++) {\n                            if (!isEqual(existingKey[argIndex], keyToMatch[argIndex])) {\n                                break;\n                            }\n                        }\n                        if (argIndex === keyLength) {\n                            return index;\n                        }\n                    }\n                }\n            }\n            else {\n                for (var index = 0; index < keysLength; index++) {\n                    existingKey = keys[index];\n                    if (existingKey.length === keyLength &&\n                        isEqual(existingKey[0], keyToMatch[0])) {\n                        return index;\n                    }\n                }\n            }\n            return -1;\n        };\n        /**\n         * Gets the matching key index when a single key is used.\n         */\n        Cache.prototype._getKeyIndexForSingle = function (keyToMatch) {\n            var keys = this.keys;\n            if (!keys.length) {\n                return -1;\n            }\n            var existingKey = keys[0];\n            var length = existingKey.length;\n            if (keyToMatch.length !== length) {\n                return -1;\n            }\n            var isEqual = this.options.isEqual;\n            if (length > 1) {\n                for (var index = 0; index < length; index++) {\n                    if (!isEqual(existingKey[index], keyToMatch[index])) {\n                        return -1;\n                    }\n                }\n                return 0;\n            }\n            return isEqual(existingKey[0], keyToMatch[0]) ? 0 : -1;\n        };\n        /**\n         * Order the array based on a Least-Recently-Used basis.\n         */\n        Cache.prototype.orderByLru = function (key, value, startingIndex) {\n            var keys = this.keys;\n            var values = this.values;\n            var currentLength = keys.length;\n            var index = startingIndex;\n            while (index--) {\n                keys[index + 1] = keys[index];\n                values[index + 1] = values[index];\n            }\n            keys[0] = key;\n            values[0] = value;\n            var maxSize = this.options.maxSize;\n            if (currentLength === maxSize && startingIndex === currentLength) {\n                keys.pop();\n                values.pop();\n            }\n            else if (startingIndex >= maxSize) {\n                // eslint-disable-next-line no-multi-assign\n                keys.length = values.length = maxSize;\n            }\n        };\n        /**\n         * Update the promise method to auto-remove from cache if rejected, and\n         * if resolved then fire cache hit / changed.\n         */\n        Cache.prototype.updateAsyncCache = function (memoized) {\n            var _this = this;\n            var _a = this.options, onCacheChange = _a.onCacheChange, onCacheHit = _a.onCacheHit;\n            var firstKey = this.keys[0];\n            var firstValue = this.values[0];\n            this.values[0] = firstValue.then(function (value) {\n                if (_this.shouldUpdateOnHit) {\n                    onCacheHit(_this, _this.options, memoized);\n                }\n                if (_this.shouldUpdateOnChange) {\n                    onCacheChange(_this, _this.options, memoized);\n                }\n                return value;\n            }, function (error) {\n                var keyIndex = _this.getKeyIndex(firstKey);\n                if (keyIndex !== -1) {\n                    _this.keys.splice(keyIndex, 1);\n                    _this.values.splice(keyIndex, 1);\n                }\n                throw error;\n            });\n        };\n        return Cache;\n    }());\n\n    function createMemoizedFunction(fn, options) {\n        if (options === void 0) { options = {}; }\n        if (isMemoized(fn)) {\n            return createMemoizedFunction(fn.fn, mergeOptions(fn.options, options));\n        }\n        if (typeof fn !== 'function') {\n            throw new TypeError('You must pass a function to `memoize`.');\n        }\n        var _a = options.isEqual, isEqual = _a === void 0 ? isSameValueZero : _a, isMatchingKey = options.isMatchingKey, _b = options.isPromise, isPromise = _b === void 0 ? false : _b, _c = options.maxSize, maxSize = _c === void 0 ? 1 : _c, onCacheAdd = options.onCacheAdd, onCacheChange = options.onCacheChange, onCacheHit = options.onCacheHit, transformKey = options.transformKey;\n        var normalizedOptions = mergeOptions({\n            isEqual: isEqual,\n            isMatchingKey: isMatchingKey,\n            isPromise: isPromise,\n            maxSize: maxSize,\n            onCacheAdd: onCacheAdd,\n            onCacheChange: onCacheChange,\n            onCacheHit: onCacheHit,\n            transformKey: transformKey,\n        }, getCustomOptions(options));\n        var cache = new Cache(normalizedOptions);\n        var keys = cache.keys, values = cache.values, canTransformKey = cache.canTransformKey, shouldCloneArguments = cache.shouldCloneArguments, shouldUpdateOnAdd = cache.shouldUpdateOnAdd, shouldUpdateOnChange = cache.shouldUpdateOnChange, shouldUpdateOnHit = cache.shouldUpdateOnHit;\n        var memoized = function () {\n            var key = shouldCloneArguments\n                ? cloneArray(arguments)\n                : arguments;\n            if (canTransformKey) {\n                key = transformKey(key);\n            }\n            var keyIndex = keys.length ? cache.getKeyIndex(key) : -1;\n            if (keyIndex !== -1) {\n                if (shouldUpdateOnHit) {\n                    onCacheHit(cache, normalizedOptions, memoized);\n                }\n                if (keyIndex) {\n                    cache.orderByLru(keys[keyIndex], values[keyIndex], keyIndex);\n                    if (shouldUpdateOnChange) {\n                        onCacheChange(cache, normalizedOptions, memoized);\n                    }\n                }\n            }\n            else {\n                var newValue = fn.apply(this, arguments);\n                var newKey = shouldCloneArguments\n                    ? key\n                    : cloneArray(arguments);\n                cache.orderByLru(newKey, newValue, keys.length);\n                if (isPromise) {\n                    cache.updateAsyncCache(memoized);\n                }\n                if (shouldUpdateOnAdd) {\n                    onCacheAdd(cache, normalizedOptions, memoized);\n                }\n                if (shouldUpdateOnChange) {\n                    onCacheChange(cache, normalizedOptions, memoized);\n                }\n            }\n            return values[0];\n        };\n        memoized.cache = cache;\n        memoized.fn = fn;\n        memoized.isMemoized = true;\n        memoized.options = normalizedOptions;\n        return memoized;\n    }\n\n    return createMemoizedFunction;\n\n}));\n","import {\n  IPlannerProgramExerciseEvaluatedSet,\n  IPlannerProgramExercisePyramid,\n  IPlannerProgramExerciseSet,\n} from \"@client/pages/planner/models/types\";\nimport { Weight } from \"./weight\";\n\nexport type IPyramidArgument = \"mode\" | \"from\" | \"to\" | \"step\" | \"rest\";\n\nexport interface IPyramidProblem {\n  argument: IPyramidArgument;\n  message: string;\n}\n\nexport namespace Pyramid {\n  export function expand(spec: IPlannerProgramExercisePyramid): IPlannerProgramExerciseSet[] {\n    return rungValues(spec).map((value) => ({\n      repRange: { numberOfSets: 1, maxrep: 1, isAmrap: false, isQuickAddSet: false },\n      setTimer: value,\n      timer: spec.rest,\n    }));\n  }\n\n  export function orientFor(\n    mode: IPlannerProgramExercisePyramid[\"mode\"],\n    from: number,\n    to: number\n  ): { from: number; to: number } {\n    const ascends = mode === \"up\" || mode === \"updown\";\n    const goesWrongWay = ascends ? from > to : from < to;\n    return goesWrongWay ? { from: to, to: from } : { from, to };\n  }\n\n  export function validate(spec: IPlannerProgramExercisePyramid): IPyramidProblem[] {\n    const problems: IPyramidProblem[] = [];\n    if (spec.from === 0) {\n      problems.push({ argument: \"from\", message: \"'from' must not be 0\" });\n    } else if (spec.from < 0) {\n      problems.push({ argument: \"from\", message: \"'from' must not be negative\" });\n    }\n    if (spec.to === 0) {\n      problems.push({ argument: \"to\", message: \"'to' must not be 0\" });\n    } else if (spec.to < 0) {\n      problems.push({ argument: \"to\", message: \"'to' must not be negative\" });\n    }\n    if (spec.rest != null && spec.rest < 0) {\n      problems.push({ argument: \"rest\", message: \"'rest' must not be negative\" });\n    }\n    if (spec.step === 0) {\n      problems.push({ argument: \"step\", message: \"'step' must not be 0\" });\n    } else if (spec.step < 0) {\n      problems.push({ argument: \"step\", message: \"'step' must not be negative\" });\n    } else if ((spec.to - spec.from) % spec.step !== 0) {\n      problems.push({\n        argument: \"step\",\n        message: \"'step' must evenly divide the distance between 'from' and 'to'\",\n      });\n    }\n    if (spec.from !== spec.to) {\n      const ascends = spec.mode === \"up\" || spec.mode === \"updown\";\n      if (ascends && spec.from > spec.to) {\n        problems.push({ argument: \"to\", message: `'${spec.mode}' requires 'from' to be less than 'to'` });\n      } else if (!ascends && spec.from < spec.to) {\n        problems.push({ argument: \"to\", message: `'${spec.mode}' requires 'from' to be greater than 'to'` });\n      }\n    }\n    return problems;\n  }\n\n  export function matches(spec: IPlannerProgramExercisePyramid, sets: IPlannerProgramExerciseEvaluatedSet[]): boolean {\n    const rungs = expand(spec);\n    if (rungs.length !== sets.length || sets.length === 0) {\n      return false;\n    }\n    for (let i = 0; i < sets.length; i++) {\n      const set = sets[i];\n      const rung = rungs[i];\n      if (\n        set.setTimer !== rung.setTimer ||\n        set.timer !== rung.timer ||\n        set.minrep !== rung.repRange!.minrep ||\n        set.maxrep !== rung.repRange!.maxrep ||\n        set.isAmrap ||\n        set.isQuickAddSet ||\n        set.isOverflowSetTimer ||\n        set.label != null ||\n        set.isAuto\n      ) {\n        return false;\n      }\n    }\n    const first = sets[0];\n    return sets.every(\n      (set) =>\n        Weight.eqNull(set.weight, first.weight) &&\n        !!set.askWeight === !!first.askWeight &&\n        set.rpe === first.rpe &&\n        !!set.logRpe === !!first.logRpe\n    );\n  }\n\n  function rungValues(spec: IPlannerProgramExercisePyramid): number[] {\n    const { mode, from, to, step } = spec;\n    if (from === to) {\n      return [from];\n    }\n    const ascends = mode === \"up\" || mode === \"updown\";\n    const ramp: number[] = [];\n    if (ascends) {\n      for (let value = from; value <= to; value += step) {\n        ramp.push(value);\n      }\n    } else {\n      for (let value = from; value >= to; value -= step) {\n        ramp.push(value);\n      }\n    }\n    if (mode === \"up\" || mode === \"down\") {\n      return ramp;\n    }\n    return [...ramp, ...ramp.slice(0, -1).reverse()];\n  }\n}\n","import { runMigrations } from \"../migrations/runner\";\nimport * as t from \"io-ts\";\nimport { PathReporter } from \"io-ts/lib/PathReporter\";\nimport { getLatestMigrationVersion } from \"../migrations/migrations\";\nimport { Settings } from \"../models/settings\";\nimport { IEither } from \"../utils/types\";\nimport { ErrorReporter } from \"../utils/errorReporter\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { IStorage, TStorage, IPartialStorage } from \"../types\";\nimport { lg } from \"@client/utils/posthog\";\n\nexport namespace Storage {\n  export function validate(\n    data: Record<string, unknown>,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    type: t.Type<any, any, any>,\n    name: string\n  ): IEither<IStorage, string[]> {\n    const decoded = type.decode(data);\n    if (\"left\" in decoded) {\n      const error = PathReporter.report(decoded);\n      return { success: false, error };\n    } else {\n      return { success: true, data: decoded.right };\n    }\n  }\n\n  export function validateStorage(data: Record<string, unknown>): IEither<IStorage, string[]> {\n    return validate(data, TStorage, \"storage\");\n  }\n\n  export function validateAndReportStorage(data: Record<string, unknown>): IEither<IStorage, string[]> {\n    return validateAndReport(data, TStorage, \"storage\");\n  }\n\n  export function validateAndReport(\n    data: Record<string, unknown>,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    type: t.Type<any, any, any>,\n    name: string\n  ): IEither<IStorage, string[]> {\n    const result = validate(data, type, name);\n    if (!result.success) {\n      const error = result.error;\n      lg(\"ls-corrupted-storage\", { lastActions: JSON.stringify(window.reducerLastActions || []) });\n      ErrorReporter.report(`${name}: ${error.join(\"\\n\")}`);\n      // eslint-disable-next-line no-console -- client only (uses window); logs the type name, not the data\n      console.error(`Error decoding ${name}`);\n      // eslint-disable-next-line no-console -- client only (uses window); these are validation messages, not the data\n      error.forEach((e) => console.error(e));\n    }\n    return result;\n  }\n\n  // `program.tags` is a free-form string list, but it reaches us from a trainer's\n  // plain-text input and from older data that used a stricter type. A single\n  // unexpected entry must not fail the whole storage decode and strand the user\n  // on the \"Corrupted Storage\" screen - drop anything that isn't a string.\n  function coerceProgramTags(storage: IStorage): void {\n    for (const program of storage.programs || []) {\n      if (program != null) {\n        program.tags = Array.isArray(program.tags)\n          ? program.tags.filter((tag): tag is string => typeof tag === \"string\")\n          : [];\n      }\n    }\n  }\n\n  export async function get(\n    client: Window[\"fetch\"],\n    maybeStorage?: Record<string, unknown>,\n    shouldReportError?: boolean\n  ): Promise<IEither<IStorage, string[]>> {\n    if (maybeStorage) {\n      let finalStorage = await runMigrations(client, maybeStorage as IStorage);\n      coerceProgramTags(finalStorage);\n      const firstValidateResult = validate(finalStorage, TStorage, \"storage\");\n      if (!firstValidateResult.success) {\n        maybeStorage.version = \"20250322014249\";\n        finalStorage = await runMigrations(client, maybeStorage as IStorage);\n        coerceProgramTags(finalStorage);\n      }\n      const result = shouldReportError\n        ? validateAndReport(finalStorage, TStorage, \"storage\")\n        : validate(finalStorage, TStorage, \"storage\");\n      return result;\n    } else {\n      return { success: false, error: [\"Provided data is empty\"] };\n    }\n  }\n\n  export function getDefault(): IStorage {\n    const dateNow = Date.now();\n    return {\n      id: dateNow,\n      originalId: dateNow,\n      currentProgramId: undefined,\n      reviewRequests: [],\n      signupRequests: [],\n      deletedHistory: [],\n      deletedPrograms: [],\n      deletedStats: [],\n      stats: {\n        weight: { weight: [] },\n        length: {\n          neck: [],\n          shoulders: [],\n          bicepLeft: [],\n          bicepRight: [],\n          forearmLeft: [],\n          forearmRight: [],\n          chest: [],\n          waist: [],\n          hips: [],\n          thighLeft: [],\n          thighRight: [],\n          calfLeft: [],\n          calfRight: [],\n        },\n        percentage: { bodyfat: [] },\n      },\n      settings: Settings.build(),\n      history: [],\n      version: getLatestMigrationVersion(),\n      programs: [],\n      helps: [],\n      email: undefined,\n    };\n  }\n\n  export function isChanged(aStorage?: IStorage, bStorage?: IStorage): boolean {\n    if ((!aStorage && bStorage) || (!bStorage && aStorage)) {\n      return true;\n    }\n    if (!aStorage && !bStorage) {\n      return false;\n    }\n    const { originalId: _aOriginalId, id: _aId, _versions: _aVersions, ...cleanedAStorage } = aStorage!;\n    const { originalId: _bOriginalId, id: _bId, _versions: _bVersions, ...cleanedBStorage } = bStorage!;\n    const changed = !ObjectUtils.isEqual(cleanedAStorage, cleanedBStorage, [\"version\"]);\n    return changed;\n  }\n\n  export function isFullStorage(storage: IStorage | IPartialStorage): storage is IStorage {\n    return storage.programs != null && storage.history != null && storage.stats != null;\n  }\n\n  export function partialStorageToStorage(partialStorage: IPartialStorage): IStorage {\n    if (partialStorage.history != null && partialStorage.programs != null && partialStorage.stats != null) {\n      return partialStorage as IStorage;\n    } else {\n      return {\n        ...partialStorage,\n        history: partialStorage.history || [],\n        programs: partialStorage.programs || [],\n        stats: partialStorage.stats || {\n          length: {},\n          percentage: {},\n          weight: {},\n        },\n      };\n    }\n  }\n}\n\nif (typeof window !== \"undefined\") {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  (window as any).Storage = Storage;\n}\n","var n,l,u,t,i,r,o,e,f,c,s,a,h,p={},v=[],y=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,d=Array.isArray;function w(n,l){for(var u in l)n[u]=l[u];return n}function g(n){n&&n.parentNode&&n.parentNode.removeChild(n)}function _(l,u,t){var i,r,o,e={};for(o in u)\"key\"==o?i=u[o]:\"ref\"==o?r=u[o]:e[o]=u[o];if(arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(o in l.defaultProps)void 0===e[o]&&(e[o]=l.defaultProps[o]);return m(l,e,i,r,null)}function m(n,t,i,r,o){var e={type:n,props:t,key:i,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==o?++u:o,__i:-1,__u:0};return null==o&&null!=l.vnode&&l.vnode(e),e}function b(){return{current:null}}function k(n){return n.children}function x(n,l){this.props=n,this.context=l}function S(n,l){if(null==l)return n.__?S(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?S(n):null}function C(n){if(n.__P&&n.__d){var u=n.__v,t=u.__e,i=[],r=[],o=w({},u);o.__v=u.__v+1,l.vnode&&l.vnode(o),z(n.__P,o,u,n.__n,n.__P.namespaceURI,32&u.__u?[t]:null,i,null==t?S(u):t,!!(32&u.__u),r),o.__v=u.__v,o.__.__k[o.__i]=o,V(i,o,r),u.__e=u.__=null,o.__e!=t&&M(o)}}function M(n){if(null!=(n=n.__)&&null!=n.__c)return n.__e=n.__c.base=null,n.__k.some(function(l){if(null!=l&&null!=l.__e)return n.__e=n.__c.base=l.__e}),M(n)}function $(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!I.__r++||r!=l.debounceRendering)&&((r=l.debounceRendering)||o)(I)}function I(){for(var n,l=1;i.length;)i.length>l&&i.sort(e),n=i.shift(),l=i.length,C(n);I.__r=0}function P(n,l,u,t,i,r,o,e,f,c,s){var a,h,y,d,w,g,_,m=t&&t.__k||v,b=l.length;for(f=A(u,l,m,f,b),a=0;a<b;a++)null!=(y=u.__k[a])&&(h=-1!=y.__i&&m[y.__i]||p,y.__i=a,g=z(n,y,h,i,r,o,e,f,c,s),d=y.__e,y.ref&&h.ref!=y.ref&&(h.ref&&D(h.ref,null,y),s.push(y.ref,y.__c||d,y)),null==w&&null!=d&&(w=d),(_=!!(4&y.__u))||h.__k===y.__k?f=H(y,f,n,_):\"function\"==typeof y.type&&void 0!==g?f=g:d&&(f=d.nextSibling),y.__u&=-7);return u.__e=w,f}function A(n,l,u,t,i){var r,o,e,f,c,s=u.length,a=s,h=0;for(n.__k=new Array(i),r=0;r<i;r++)null!=(o=l[r])&&\"boolean\"!=typeof o&&\"function\"!=typeof o?(\"string\"==typeof o||\"number\"==typeof o||\"bigint\"==typeof o||o.constructor==String?o=n.__k[r]=m(null,o,null,null,null):d(o)?o=n.__k[r]=m(k,{children:o},null,null,null):void 0===o.constructor&&o.__b>0?o=n.__k[r]=m(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):n.__k[r]=o,f=r+h,o.__=n,o.__b=n.__b+1,e=null,-1!=(c=o.__i=T(o,u,f,a))&&(a--,(e=u[c])&&(e.__u|=2)),null==e||null==e.__v?(-1==c&&(i>s?h--:i<s&&h++),\"function\"!=typeof o.type&&(o.__u|=4)):c!=f&&(c==f-1?h--:c==f+1?h++:(c>f?h--:h++,o.__u|=4))):n.__k[r]=null;if(a)for(r=0;r<s;r++)null!=(e=u[r])&&0==(2&e.__u)&&(e.__e==t&&(t=S(e)),E(e,e));return t}function H(n,l,u,t){var i,r;if(\"function\"==typeof n.type){for(i=n.__k,r=0;i&&r<i.length;r++)i[r]&&(i[r].__=n,l=H(i[r],l,u,t));return l}n.__e!=l&&(t&&(l&&n.type&&!l.parentNode&&(l=S(n)),u.insertBefore(n.__e,l||null)),l=n.__e);do{l=l&&l.nextSibling}while(null!=l&&8==l.nodeType);return l}function L(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(d(n)?n.some(function(n){L(n,l)}):l.push(n)),l}function T(n,l,u,t){var i,r,o,e=n.key,f=n.type,c=l[u],s=null!=c&&0==(2&c.__u);if(null===c&&null==e||s&&e==c.key&&f==c.type)return u;if(t>(s?1:0))for(i=u-1,r=u+1;i>=0||r<l.length;)if(null!=(c=l[o=i>=0?i--:r++])&&0==(2&c.__u)&&e==c.key&&f==c.type)return o;return-1}function j(n,l,u){\"-\"==l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||y.test(l)?u:u+\"px\"}function F(n,l,u,t,i){var r,o;n:if(\"style\"==l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||j(n.style,l,\"\");if(u)for(l in u)t&&u[l]==t[l]||j(n.style,l,u[l])}else if(\"o\"==l[0]&&\"n\"==l[1])r=l!=(l=l.replace(f,\"$1\")),o=l.toLowerCase(),l=o in n||\"onFocusOut\"==l||\"onFocusIn\"==l?o.slice(2):l.slice(2),n.l||(n.l={}),n.l[l+r]=u,u?t?u.u=t.u:(u.u=c,n.addEventListener(l,r?a:s,r)):n.removeEventListener(l,r?a:s,r);else{if(\"http://www.w3.org/2000/svg\"==i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!=l&&\"height\"!=l&&\"href\"!=l&&\"list\"!=l&&\"form\"!=l&&\"tabIndex\"!=l&&\"download\"!=l&&\"rowSpan\"!=l&&\"colSpan\"!=l&&\"role\"!=l&&\"popover\"!=l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!=l[4]?n.removeAttribute(l):n.setAttribute(l,\"popover\"==l&&1==u?\"\":u))}}function O(n){return function(u){if(this.l){var t=this.l[u.type+n];if(null==u.t)u.t=c++;else if(u.t<t.u)return;return t(l.event?l.event(u):u)}}}function z(n,u,t,i,r,o,e,f,c,s){var a,h,p,y,_,m,b,S,C,M,$,I,A,H,L,T=u.type;if(void 0!==u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),o=[f=u.__e=t.__e]),(a=l.__b)&&a(u);n:if(\"function\"==typeof T)try{if(S=u.props,C=\"prototype\"in T&&T.prototype.render,M=(a=T.contextType)&&i[a.__c],$=a?M?M.props.value:a.__:i,t.__c?b=(h=u.__c=t.__c).__=h.__E:(C?u.__c=h=new T(S,$):(u.__c=h=new x(S,$),h.constructor=T,h.render=G),M&&M.sub(h),h.state||(h.state={}),h.__n=i,p=h.__d=!0,h.__h=[],h._sb=[]),C&&null==h.__s&&(h.__s=h.state),C&&null!=T.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=w({},h.__s)),w(h.__s,T.getDerivedStateFromProps(S,h.__s))),y=h.props,_=h.state,h.__v=u,p)C&&null==T.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),C&&null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(C&&null==T.getDerivedStateFromProps&&S!==y&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(S,$),u.__v==t.__v||!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(S,h.__s,$)){u.__v!=t.__v&&(h.props=S,h.state=h.__s,h.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.some(function(n){n&&(n.__=u)}),v.push.apply(h.__h,h._sb),h._sb=[],h.__h.length&&e.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(S,h.__s,$),C&&null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(y,_,m)})}if(h.context=$,h.props=S,h.__P=n,h.__e=!1,I=l.__r,A=0,C)h.state=h.__s,h.__d=!1,I&&I(u),a=h.render(h.props,h.state,h.context),v.push.apply(h.__h,h._sb),h._sb=[];else do{h.__d=!1,I&&I(u),a=h.render(h.props,h.state,h.context),h.state=h.__s}while(h.__d&&++A<25);h.state=h.__s,null!=h.getChildContext&&(i=w(w({},i),h.getChildContext())),C&&!p&&null!=h.getSnapshotBeforeUpdate&&(m=h.getSnapshotBeforeUpdate(y,_)),H=null!=a&&a.type===k&&null==a.key?q(a.props.children):a,f=P(n,d(H)?H:[H],u,t,i,r,o,e,f,c,s),h.base=u.__e,u.__u&=-161,h.__h.length&&e.push(h),b&&(h.__E=h.__=null)}catch(n){if(u.__v=null,c||null!=o)if(n.then){for(u.__u|=c?160:128;f&&8==f.nodeType&&f.nextSibling;)f=f.nextSibling;o[o.indexOf(f)]=null,u.__e=f}else{for(L=o.length;L--;)g(o[L]);N(u)}else u.__e=t.__e,u.__k=t.__k,n.then||N(u);l.__e(n,u,t)}else null==o&&u.__v==t.__v?(u.__k=t.__k,u.__e=t.__e):f=u.__e=B(t.__e,u,t,i,r,o,e,c,s);return(a=l.diffed)&&a(u),128&u.__u?void 0:f}function N(n){n&&(n.__c&&(n.__c.__e=!0),n.__k&&n.__k.some(N))}function V(n,u,t){for(var i=0;i<t.length;i++)D(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function q(n){return\"object\"!=typeof n||null==n||n.__b>0?n:d(n)?n.map(q):w({},n)}function B(u,t,i,r,o,e,f,c,s){var a,h,v,y,w,_,m,b=i.props||p,k=t.props,x=t.type;if(\"svg\"==x?o=\"http://www.w3.org/2000/svg\":\"math\"==x?o=\"http://www.w3.org/1998/Math/MathML\":o||(o=\"http://www.w3.org/1999/xhtml\"),null!=e)for(a=0;a<e.length;a++)if((w=e[a])&&\"setAttribute\"in w==!!x&&(x?w.localName==x:3==w.nodeType)){u=w,e[a]=null;break}if(null==u){if(null==x)return document.createTextNode(k);u=document.createElementNS(o,x,k.is&&k),c&&(l.__m&&l.__m(t,e),c=!1),e=null}if(null==x)b===k||c&&u.data==k||(u.data=k);else{if(e=e&&n.call(u.childNodes),!c&&null!=e)for(b={},a=0;a<u.attributes.length;a++)b[(w=u.attributes[a]).name]=w.value;for(a in b)w=b[a],\"dangerouslySetInnerHTML\"==a?v=w:\"children\"==a||a in k||\"value\"==a&&\"defaultValue\"in k||\"checked\"==a&&\"defaultChecked\"in k||F(u,a,null,w,o);for(a in k)w=k[a],\"children\"==a?y=w:\"dangerouslySetInnerHTML\"==a?h=w:\"value\"==a?_=w:\"checked\"==a?m=w:c&&\"function\"!=typeof w||b[a]===w||F(u,a,w,b[a],o);if(h)c||v&&(h.__html==v.__html||h.__html==u.innerHTML)||(u.innerHTML=h.__html),t.__k=[];else if(v&&(u.innerHTML=\"\"),P(\"template\"==t.type?u.content:u,d(y)?y:[y],t,i,r,\"foreignObject\"==x?\"http://www.w3.org/1999/xhtml\":o,e,f,e?e[0]:i.__k&&S(i,0),c,s),null!=e)for(a=e.length;a--;)g(e[a]);c||(a=\"value\",\"progress\"==x&&null==_?u.removeAttribute(\"value\"):null!=_&&(_!==u[a]||\"progress\"==x&&!_||\"option\"==x&&_!=b[a])&&F(u,a,_,b[a],o),a=\"checked\",null!=m&&m!=u[a]&&F(u,a,m,b[a],o))}return u}function D(n,u,t){try{if(\"function\"==typeof n){var i=\"function\"==typeof n.__u;i&&n.__u(),i&&null==u||(n.__u=n(u))}else n.current=u}catch(n){l.__e(n,t)}}function E(n,u,t){var i,r;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!=n.__e||D(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=null}if(i=n.__k)for(r=0;r<i.length;r++)i[r]&&E(i[r],u,t||\"function\"!=typeof n.type);t||g(n.__e),n.__c=n.__=n.__e=void 0}function G(n,l,u){return this.constructor(n,u)}function J(u,t,i){var r,o,e,f;t==document&&(t=document.documentElement),l.__&&l.__(u,t),o=(r=\"function\"==typeof i)?null:i&&i.__k||t.__k,e=[],f=[],z(t,u=(!r&&i||t).__k=_(k,null,[u]),o||p,p,t.namespaceURI,!r&&i?[i]:o?null:t.firstChild?n.call(t.childNodes):null,e,!r&&i?i:o?o.__e:t.firstChild,r,f),V(e,u,f)}function K(n,l){J(n,l,K)}function Q(l,u,t){var i,r,o,e,f=w({},l.props);for(o in l.type&&l.type.defaultProps&&(e=l.type.defaultProps),u)\"key\"==o?i=u[o]:\"ref\"==o?r=u[o]:f[o]=void 0===u[o]&&null!=e?e[o]:u[o];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),m(l.type,f,i||l.key,r||l.ref,null)}function R(n){function l(n){var u,t;return this.getChildContext||(u=new Set,(t={})[l.__c]=this,this.getChildContext=function(){return t},this.componentWillUnmount=function(){u=null},this.shouldComponentUpdate=function(n){this.props.value!=n.value&&u.forEach(function(n){n.__e=!0,$(n)})},this.sub=function(n){u.add(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u&&u.delete(n),l&&l.call(n)}}),n.children}return l.__c=\"__cC\"+h++,l.__=n,l.Provider=l.__l=(l.Consumer=function(n,l){return n.children(l)}).contextType=l,l}n=v.slice,l={__e:function(n,l,u,t){for(var i,r,o;l=l.__;)if((i=l.__c)&&!i.__)try{if((r=i.constructor)&&null!=r.getDerivedStateFromError&&(i.setState(r.getDerivedStateFromError(n)),o=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),o=i.__d),o)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&void 0===n.constructor},x.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!=this.state?this.__s:this.__s=w({},this.state),\"function\"==typeof n&&(n=n(w({},u),this.props)),n&&w(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),$(this))},x.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),$(this))},x.prototype.render=k,i=[],o=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,e=function(n,l){return n.__v.__b-l.__v.__b},I.__r=0,f=/(PointerCapture)$|Capture$/i,c=0,s=O(!1),a=O(!0),h=0;export{x as Component,k as Fragment,Q as cloneElement,R as createContext,_ as createElement,b as createRef,_ as h,K as hydrate,t as isValidElement,l as options,J as render,L as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ObjectUtils = void 0;\nvar ObjectUtils;\n(function (ObjectUtils) {\n    function keys(obj) {\n        return Object.keys(obj);\n    }\n    ObjectUtils.keys = keys;\n})(ObjectUtils = exports.ObjectUtils || (exports.ObjectUtils = {}));\n//# sourceMappingURL=object.js.map","'use strict';\n\n/**\nThe default maximum length of a `TreeBuffer` node.\n*/\nconst DefaultBufferLength = 1024;\nlet nextPropID = 0;\nclass Range {\n    constructor(from, to) {\n        this.from = from;\n        this.to = to;\n    }\n}\n/**\nEach [node type](#common.NodeType) or [individual tree](#common.Tree)\ncan have metadata associated with it in props. Instances of this\nclass represent prop names.\n*/\nclass NodeProp {\n    /**\n    Create a new node prop type.\n    */\n    constructor(config = {}) {\n        this.id = nextPropID++;\n        this.perNode = !!config.perNode;\n        this.deserialize = config.deserialize || (() => {\n            throw new Error(\"This node type doesn't define a deserialize function\");\n        });\n        this.combine = config.combine || null;\n    }\n    /**\n    This is meant to be used with\n    [`NodeSet.extend`](#common.NodeSet.extend) or\n    [`LRParser.configure`](#lr.ParserConfig.props) to compute\n    prop values for each node type in the set. Takes a [match\n    object](#common.NodeType^match) or function that returns undefined\n    if the node type doesn't get this prop, and the prop's value if\n    it does.\n    */\n    add(match) {\n        if (this.perNode)\n            throw new RangeError(\"Can't add per-node props to node types\");\n        if (typeof match != \"function\")\n            match = NodeType.match(match);\n        return (type) => {\n            let result = match(type);\n            return result === undefined ? null : [this, result];\n        };\n    }\n}\n/**\nProp that is used to describe matching delimiters. For opening\ndelimiters, this holds an array of node names (written as a\nspace-separated string when declaring this prop in a grammar)\nfor the node types of closing delimiters that match it.\n*/\nNodeProp.closedBy = new NodeProp({ deserialize: str => str.split(\" \") });\n/**\nThe inverse of [`closedBy`](#common.NodeProp^closedBy). This is\nattached to closing delimiters, holding an array of node names\nof types of matching opening delimiters.\n*/\nNodeProp.openedBy = new NodeProp({ deserialize: str => str.split(\" \") });\n/**\nUsed to assign node types to groups (for example, all node\ntypes that represent an expression could be tagged with an\n`\"Expression\"` group).\n*/\nNodeProp.group = new NodeProp({ deserialize: str => str.split(\" \") });\n/**\nAttached to nodes to indicate these should be\n[displayed](https://codemirror.net/docs/ref/#language.syntaxTree)\nin a bidirectional text isolate, so that direction-neutral\ncharacters on their sides don't incorrectly get associated with\nsurrounding text. You'll generally want to set this for nodes\nthat contain arbitrary text, like strings and comments, and for\nnodes that appear _inside_ arbitrary text, like HTML tags. When\nnot given a value, in a grammar declaration, defaults to\n`\"auto\"`.\n*/\nNodeProp.isolate = new NodeProp({ deserialize: value => {\n        if (value && value != \"rtl\" && value != \"ltr\" && value != \"auto\")\n            throw new RangeError(\"Invalid value for isolate: \" + value);\n        return value || \"auto\";\n    } });\n/**\nThe hash of the [context](#lr.ContextTracker.constructor)\nthat the node was parsed in, if any. Used to limit reuse of\ncontextual nodes.\n*/\nNodeProp.contextHash = new NodeProp({ perNode: true });\n/**\nThe distance beyond the end of the node that the tokenizer\nlooked ahead for any of the tokens inside the node. (The LR\nparser only stores this when it is larger than 25, for\nefficiency reasons.)\n*/\nNodeProp.lookAhead = new NodeProp({ perNode: true });\n/**\nThis per-node prop is used to replace a given node, or part of a\nnode, with another tree. This is useful to include trees from\ndifferent languages in mixed-language parsers.\n*/\nNodeProp.mounted = new NodeProp({ perNode: true });\n/**\nA mounted tree, which can be [stored](#common.NodeProp^mounted) on\na tree node to indicate that parts of its content are\nrepresented by another tree.\n*/\nclass MountedTree {\n    constructor(\n    /**\n    The inner tree.\n    */\n    tree, \n    /**\n    If this is null, this tree replaces the entire node (it will\n    be included in the regular iteration instead of its host\n    node). If not, only the given ranges are considered to be\n    covered by this tree. This is used for trees that are mixed in\n    a way that isn't strictly hierarchical. Such mounted trees are\n    only entered by [`resolveInner`](#common.Tree.resolveInner)\n    and [`enter`](#common.SyntaxNode.enter).\n    */\n    overlay, \n    /**\n    The parser used to create this subtree.\n    */\n    parser, \n    /**\n    [Indicates](#common.IterMode.EnterBracketed) that the nested\n    content is delineated with some kind\n    of bracket token.\n    */\n    bracketed = false) {\n        this.tree = tree;\n        this.overlay = overlay;\n        this.parser = parser;\n        this.bracketed = bracketed;\n    }\n    /**\n    @internal\n    */\n    static get(tree) {\n        return tree && tree.props && tree.props[NodeProp.mounted.id];\n    }\n}\nconst noProps = Object.create(null);\n/**\nEach node in a syntax tree has a node type associated with it.\n*/\nclass NodeType {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The name of the node type. Not necessarily unique, but if the\n    grammar was written properly, different node types with the\n    same name within a node set should play the same semantic\n    role.\n    */\n    name, \n    /**\n    @internal\n    */\n    props, \n    /**\n    The id of this node in its set. Corresponds to the term ids\n    used in the parser.\n    */\n    id, \n    /**\n    @internal\n    */\n    flags = 0) {\n        this.name = name;\n        this.props = props;\n        this.id = id;\n        this.flags = flags;\n    }\n    /**\n    Define a node type.\n    */\n    static define(spec) {\n        let props = spec.props && spec.props.length ? Object.create(null) : noProps;\n        let flags = (spec.top ? 1 /* NodeFlag.Top */ : 0) | (spec.skipped ? 2 /* NodeFlag.Skipped */ : 0) |\n            (spec.error ? 4 /* NodeFlag.Error */ : 0) | (spec.name == null ? 8 /* NodeFlag.Anonymous */ : 0);\n        let type = new NodeType(spec.name || \"\", props, spec.id, flags);\n        if (spec.props)\n            for (let src of spec.props) {\n                if (!Array.isArray(src))\n                    src = src(type);\n                if (src) {\n                    if (src[0].perNode)\n                        throw new RangeError(\"Can't store a per-node prop on a node type\");\n                    props[src[0].id] = src[1];\n                }\n            }\n        return type;\n    }\n    /**\n    Retrieves a node prop for this type. Will return `undefined` if\n    the prop isn't present on this node.\n    */\n    prop(prop) { return this.props[prop.id]; }\n    /**\n    True when this is the top node of a grammar.\n    */\n    get isTop() { return (this.flags & 1 /* NodeFlag.Top */) > 0; }\n    /**\n    True when this node is produced by a skip rule.\n    */\n    get isSkipped() { return (this.flags & 2 /* NodeFlag.Skipped */) > 0; }\n    /**\n    Indicates whether this is an error node.\n    */\n    get isError() { return (this.flags & 4 /* NodeFlag.Error */) > 0; }\n    /**\n    When true, this node type doesn't correspond to a user-declared\n    named node, for example because it is used to cache repetition.\n    */\n    get isAnonymous() { return (this.flags & 8 /* NodeFlag.Anonymous */) > 0; }\n    /**\n    Returns true when this node's name or one of its\n    [groups](#common.NodeProp^group) matches the given string.\n    */\n    is(name) {\n        if (typeof name == 'string') {\n            if (this.name == name)\n                return true;\n            let group = this.prop(NodeProp.group);\n            return group ? group.indexOf(name) > -1 : false;\n        }\n        return this.id == name;\n    }\n    /**\n    Create a function from node types to arbitrary values by\n    specifying an object whose property names are node or\n    [group](#common.NodeProp^group) names. Often useful with\n    [`NodeProp.add`](#common.NodeProp.add). You can put multiple\n    names, separated by spaces, in a single property name to map\n    multiple node names to a single value.\n    */\n    static match(map) {\n        let direct = Object.create(null);\n        for (let prop in map)\n            for (let name of prop.split(\" \"))\n                direct[name] = map[prop];\n        return (node) => {\n            for (let groups = node.prop(NodeProp.group), i = -1; i < (groups ? groups.length : 0); i++) {\n                let found = direct[i < 0 ? node.name : groups[i]];\n                if (found)\n                    return found;\n            }\n        };\n    }\n}\n/**\nAn empty dummy node type to use when no actual type is available.\n*/\nNodeType.none = new NodeType(\"\", Object.create(null), 0, 8 /* NodeFlag.Anonymous */);\n/**\nA node set holds a collection of node types. It is used to\ncompactly represent trees by storing their type ids, rather than a\nfull pointer to the type object, in a numeric array. Each parser\n[has](#lr.LRParser.nodeSet) a node set, and [tree\nbuffers](#common.TreeBuffer) can only store collections of nodes\nfrom the same set. A set can have a maximum of 2**16 (65536) node\ntypes in it, so that the ids fit into 16-bit typed array slots.\n*/\nclass NodeSet {\n    /**\n    Create a set with the given types. The `id` property of each\n    type should correspond to its position within the array.\n    */\n    constructor(\n    /**\n    The node types in this set, by id.\n    */\n    types) {\n        this.types = types;\n        for (let i = 0; i < types.length; i++)\n            if (types[i].id != i)\n                throw new RangeError(\"Node type ids should correspond to array positions when creating a node set\");\n    }\n    /**\n    Create a copy of this set with some node properties added. The\n    arguments to this method can be created with\n    [`NodeProp.add`](#common.NodeProp.add).\n    */\n    extend(...props) {\n        let newTypes = [];\n        for (let type of this.types) {\n            let newProps = null;\n            for (let source of props) {\n                let add = source(type);\n                if (add) {\n                    if (!newProps)\n                        newProps = Object.assign({}, type.props);\n                    let value = add[1], prop = add[0];\n                    if (prop.combine && prop.id in newProps)\n                        value = prop.combine(newProps[prop.id], value);\n                    newProps[prop.id] = value;\n                }\n            }\n            newTypes.push(newProps ? new NodeType(type.name, newProps, type.id, type.flags) : type);\n        }\n        return new NodeSet(newTypes);\n    }\n}\nconst CachedNode = new WeakMap(), CachedInnerNode = new WeakMap();\n/**\nOptions that control iteration. Can be combined with the `|`\noperator to enable multiple ones.\n*/\nexports.IterMode = void 0;\n(function (IterMode) {\n    /**\n    When enabled, iteration will only visit [`Tree`](#common.Tree)\n    objects, not nodes packed into\n    [`TreeBuffer`](#common.TreeBuffer)s.\n    */\n    IterMode[IterMode[\"ExcludeBuffers\"] = 1] = \"ExcludeBuffers\";\n    /**\n    Enable this to make iteration include anonymous nodes (such as\n    the nodes that wrap repeated grammar constructs into a balanced\n    tree).\n    */\n    IterMode[IterMode[\"IncludeAnonymous\"] = 2] = \"IncludeAnonymous\";\n    /**\n    By default, regular [mounted](#common.NodeProp^mounted) nodes\n    replace their base node in iteration. Enable this to ignore them\n    instead.\n    */\n    IterMode[IterMode[\"IgnoreMounts\"] = 4] = \"IgnoreMounts\";\n    /**\n    This option only applies in\n    [`enter`](#common.SyntaxNode.enter)-style methods. It tells the\n    library to not enter mounted overlays if one covers the given\n    position.\n    */\n    IterMode[IterMode[\"IgnoreOverlays\"] = 8] = \"IgnoreOverlays\";\n    /**\n    When set, positions on the boundary of a mounted overlay tree\n    that has its [`bracketed`](#common.NestedParse.bracketed) flag\n    set will enter that tree regardless of side. Only supported in\n    [`enter`](#common.SyntaxNode.enter), not in cursors.\n    */\n    IterMode[IterMode[\"EnterBracketed\"] = 16] = \"EnterBracketed\";\n})(exports.IterMode || (exports.IterMode = {}));\n/**\nA piece of syntax tree. There are two ways to approach these\ntrees: the way they are actually stored in memory, and the\nconvenient way.\n\nSyntax trees are stored as a tree of `Tree` and `TreeBuffer`\nobjects. By packing detail information into `TreeBuffer` leaf\nnodes, the representation is made a lot more memory-efficient.\n\nHowever, when you want to actually work with tree nodes, this\nrepresentation is very awkward, so most client code will want to\nuse the [`TreeCursor`](#common.TreeCursor) or\n[`SyntaxNode`](#common.SyntaxNode) interface instead, which provides\na view on some part of this data structure, and can be used to\nmove around to adjacent nodes.\n*/\nclass Tree {\n    /**\n    Construct a new tree. See also [`Tree.build`](#common.Tree^build).\n    */\n    constructor(\n    /**\n    The type of the top node.\n    */\n    type, \n    /**\n    This node's child nodes.\n    */\n    children, \n    /**\n    The positions (offsets relative to the start of this tree) of\n    the children.\n    */\n    positions, \n    /**\n    The total length of this tree\n    */\n    length, \n    /**\n    Per-node [node props](#common.NodeProp) to associate with this node.\n    */\n    props) {\n        this.type = type;\n        this.children = children;\n        this.positions = positions;\n        this.length = length;\n        /**\n        @internal\n        */\n        this.props = null;\n        if (props && props.length) {\n            this.props = Object.create(null);\n            for (let [prop, value] of props)\n                this.props[typeof prop == \"number\" ? prop : prop.id] = value;\n        }\n    }\n    /**\n    @internal\n    */\n    toString() {\n        let mounted = MountedTree.get(this);\n        if (mounted && !mounted.overlay)\n            return mounted.tree.toString();\n        let children = \"\";\n        for (let ch of this.children) {\n            let str = ch.toString();\n            if (str) {\n                if (children)\n                    children += \",\";\n                children += str;\n            }\n        }\n        return !this.type.name ? children :\n            (/\\W/.test(this.type.name) && !this.type.isError ? JSON.stringify(this.type.name) : this.type.name) +\n                (children.length ? \"(\" + children + \")\" : \"\");\n    }\n    /**\n    Get a [tree cursor](#common.TreeCursor) positioned at the top of\n    the tree. Mode can be used to [control](#common.IterMode) which\n    nodes the cursor visits.\n    */\n    cursor(mode = 0) {\n        return new TreeCursor(this.topNode, mode);\n    }\n    /**\n    Get a [tree cursor](#common.TreeCursor) pointing into this tree\n    at the given position and side (see\n    [`moveTo`](#common.TreeCursor.moveTo).\n    */\n    cursorAt(pos, side = 0, mode = 0) {\n        let scope = CachedNode.get(this) || this.topNode;\n        let cursor = new TreeCursor(scope);\n        cursor.moveTo(pos, side);\n        CachedNode.set(this, cursor._tree);\n        return cursor;\n    }\n    /**\n    Get a [syntax node](#common.SyntaxNode) object for the top of the\n    tree.\n    */\n    get topNode() {\n        return new TreeNode(this, 0, 0, null);\n    }\n    /**\n    Get the [syntax node](#common.SyntaxNode) at the given position.\n    If `side` is -1, this will move into nodes that end at the\n    position. If 1, it'll move into nodes that start at the\n    position. With 0, it'll only enter nodes that cover the position\n    from both sides.\n    \n    Note that this will not enter\n    [overlays](#common.MountedTree.overlay), and you often want\n    [`resolveInner`](#common.Tree.resolveInner) instead.\n    */\n    resolve(pos, side = 0) {\n        let node = resolveNode(CachedNode.get(this) || this.topNode, pos, side, false);\n        CachedNode.set(this, node);\n        return node;\n    }\n    /**\n    Like [`resolve`](#common.Tree.resolve), but will enter\n    [overlaid](#common.MountedTree.overlay) nodes, producing a syntax node\n    pointing into the innermost overlaid tree at the given position\n    (with parent links going through all parent structure, including\n    the host trees).\n    */\n    resolveInner(pos, side = 0) {\n        let node = resolveNode(CachedInnerNode.get(this) || this.topNode, pos, side, true);\n        CachedInnerNode.set(this, node);\n        return node;\n    }\n    /**\n    In some situations, it can be useful to iterate through all\n    nodes around a position, including those in overlays that don't\n    directly cover the position. This method gives you an iterator\n    that will produce all nodes, from small to big, around the given\n    position.\n    */\n    resolveStack(pos, side = 0) {\n        return stackIterator(this, pos, side);\n    }\n    /**\n    Iterate over the tree and its children, calling `enter` for any\n    node that touches the `from`/`to` region (if given) before\n    running over such a node's children, and `leave` (if given) when\n    leaving the node. When `enter` returns `false`, that node will\n    not have its children iterated over (or `leave` called).\n    */\n    iterate(spec) {\n        let { enter, leave, from = 0, to = this.length } = spec;\n        let mode = spec.mode || 0, anon = (mode & exports.IterMode.IncludeAnonymous) > 0;\n        for (let c = this.cursor(mode | exports.IterMode.IncludeAnonymous);;) {\n            let entered = false;\n            if (c.from <= to && c.to >= from && (!anon && c.type.isAnonymous || enter(c) !== false)) {\n                if (c.firstChild())\n                    continue;\n                entered = true;\n            }\n            for (;;) {\n                if (entered && leave && (anon || !c.type.isAnonymous))\n                    leave(c);\n                if (c.nextSibling())\n                    break;\n                if (!c.parent())\n                    return;\n                entered = true;\n            }\n        }\n    }\n    /**\n    Get the value of the given [node prop](#common.NodeProp) for this\n    node. Works with both per-node and per-type props.\n    */\n    prop(prop) {\n        return !prop.perNode ? this.type.prop(prop) : this.props ? this.props[prop.id] : undefined;\n    }\n    /**\n    Returns the node's [per-node props](#common.NodeProp.perNode) in a\n    format that can be passed to the [`Tree`](#common.Tree)\n    constructor.\n    */\n    get propValues() {\n        let result = [];\n        if (this.props)\n            for (let id in this.props)\n                result.push([+id, this.props[id]]);\n        return result;\n    }\n    /**\n    Balance the direct children of this tree, producing a copy of\n    which may have children grouped into subtrees with type\n    [`NodeType.none`](#common.NodeType^none).\n    */\n    balance(config = {}) {\n        return this.children.length <= 8 /* Balance.BranchFactor */ ? this :\n            balanceRange(NodeType.none, this.children, this.positions, 0, this.children.length, 0, this.length, (children, positions, length) => new Tree(this.type, children, positions, length, this.propValues), config.makeTree || ((children, positions, length) => new Tree(NodeType.none, children, positions, length)));\n    }\n    /**\n    Build a tree from a postfix-ordered buffer of node information,\n    or a cursor over such a buffer.\n    */\n    static build(data) { return buildTree(data); }\n}\n/**\nThe empty tree\n*/\nTree.empty = new Tree(NodeType.none, [], [], 0);\nclass FlatBufferCursor {\n    constructor(buffer, index) {\n        this.buffer = buffer;\n        this.index = index;\n    }\n    get id() { return this.buffer[this.index - 4]; }\n    get start() { return this.buffer[this.index - 3]; }\n    get end() { return this.buffer[this.index - 2]; }\n    get size() { return this.buffer[this.index - 1]; }\n    get pos() { return this.index; }\n    next() { this.index -= 4; }\n    fork() { return new FlatBufferCursor(this.buffer, this.index); }\n}\n/**\nTree buffers contain (type, start, end, endIndex) quads for each\nnode. In such a buffer, nodes are stored in prefix order (parents\nbefore children, with the endIndex of the parent indicating which\nchildren belong to it).\n*/\nclass TreeBuffer {\n    /**\n    Create a tree buffer.\n    */\n    constructor(\n    /**\n    The buffer's content.\n    */\n    buffer, \n    /**\n    The total length of the group of nodes in the buffer.\n    */\n    length, \n    /**\n    The node set used in this buffer.\n    */\n    set) {\n        this.buffer = buffer;\n        this.length = length;\n        this.set = set;\n    }\n    /**\n    @internal\n    */\n    get type() { return NodeType.none; }\n    /**\n    @internal\n    */\n    toString() {\n        let result = [];\n        for (let index = 0; index < this.buffer.length;) {\n            result.push(this.childString(index));\n            index = this.buffer[index + 3];\n        }\n        return result.join(\",\");\n    }\n    /**\n    @internal\n    */\n    childString(index) {\n        let id = this.buffer[index], endIndex = this.buffer[index + 3];\n        let type = this.set.types[id], result = type.name;\n        if (/\\W/.test(result) && !type.isError)\n            result = JSON.stringify(result);\n        index += 4;\n        if (endIndex == index)\n            return result;\n        let children = [];\n        while (index < endIndex) {\n            children.push(this.childString(index));\n            index = this.buffer[index + 3];\n        }\n        return result + \"(\" + children.join(\",\") + \")\";\n    }\n    /**\n    @internal\n    */\n    findChild(startIndex, endIndex, dir, pos, side) {\n        let { buffer } = this, pick = -1;\n        for (let i = startIndex; i != endIndex; i = buffer[i + 3]) {\n            if (checkSide(side, pos, buffer[i + 1], buffer[i + 2])) {\n                pick = i;\n                if (dir > 0)\n                    break;\n            }\n        }\n        return pick;\n    }\n    /**\n    @internal\n    */\n    slice(startI, endI, from) {\n        let b = this.buffer;\n        let copy = new Uint16Array(endI - startI), len = 0;\n        for (let i = startI, j = 0; i < endI;) {\n            copy[j++] = b[i++];\n            copy[j++] = b[i++] - from;\n            let to = copy[j++] = b[i++] - from;\n            copy[j++] = b[i++] - startI;\n            len = Math.max(len, to);\n        }\n        return new TreeBuffer(copy, len, this.set);\n    }\n}\nfunction checkSide(side, pos, from, to) {\n    switch (side) {\n        case -2 /* Side.Before */: return from < pos;\n        case -1 /* Side.AtOrBefore */: return to >= pos && from < pos;\n        case 0 /* Side.Around */: return from < pos && to > pos;\n        case 1 /* Side.AtOrAfter */: return from <= pos && to > pos;\n        case 2 /* Side.After */: return to > pos;\n        case 4 /* Side.DontCare */: return true;\n    }\n}\nfunction resolveNode(node, pos, side, overlays) {\n    var _a;\n    // Move up to a node that actually holds the position, if possible\n    while (node.from == node.to ||\n        (side < 1 ? node.from >= pos : node.from > pos) ||\n        (side > -1 ? node.to <= pos : node.to < pos)) {\n        let parent = !overlays && node instanceof TreeNode && node.index < 0 ? null : node.parent;\n        if (!parent)\n            return node;\n        node = parent;\n    }\n    let mode = overlays ? 0 : exports.IterMode.IgnoreOverlays;\n    // Must go up out of overlays when those do not overlap with pos\n    if (overlays)\n        for (let scan = node, parent = scan.parent; parent; scan = parent, parent = scan.parent) {\n            if (scan instanceof TreeNode && scan.index < 0 && ((_a = parent.enter(pos, side, mode)) === null || _a === void 0 ? void 0 : _a.from) != scan.from)\n                node = parent;\n        }\n    for (;;) {\n        let inner = node.enter(pos, side, mode);\n        if (!inner)\n            return node;\n        node = inner;\n    }\n}\nclass BaseNode {\n    cursor(mode = 0) { return new TreeCursor(this, mode); }\n    getChild(type, before = null, after = null) {\n        let r = getChildren(this, type, before, after);\n        return r.length ? r[0] : null;\n    }\n    getChildren(type, before = null, after = null) {\n        return getChildren(this, type, before, after);\n    }\n    resolve(pos, side = 0) {\n        return resolveNode(this, pos, side, false);\n    }\n    resolveInner(pos, side = 0) {\n        return resolveNode(this, pos, side, true);\n    }\n    matchContext(context) {\n        return matchNodeContext(this.parent, context);\n    }\n    enterUnfinishedNodesBefore(pos) {\n        let scan = this.childBefore(pos), node = this;\n        while (scan) {\n            let last = scan.lastChild;\n            if (!last || last.to != scan.to)\n                break;\n            if (last.type.isError && last.from == last.to) {\n                node = scan;\n                scan = last.prevSibling;\n            }\n            else {\n                scan = last;\n            }\n        }\n        return node;\n    }\n    get node() { return this; }\n    get next() { return this.parent; }\n}\nclass TreeNode extends BaseNode {\n    constructor(_tree, from, \n    // Index in parent node, set to -1 if the node is not a direct child of _parent.node (overlay)\n    index, _parent) {\n        super();\n        this._tree = _tree;\n        this.from = from;\n        this.index = index;\n        this._parent = _parent;\n    }\n    get type() { return this._tree.type; }\n    get name() { return this._tree.type.name; }\n    get to() { return this.from + this._tree.length; }\n    nextChild(i, dir, pos, side, mode = 0) {\n        var _a;\n        for (let parent = this;;) {\n            for (let { children, positions } = parent._tree, e = dir > 0 ? children.length : -1; i != e; i += dir) {\n                let next = children[i], start = positions[i] + parent.from;\n                if (!((mode & exports.IterMode.EnterBracketed) && next instanceof Tree &&\n                    ((_a = MountedTree.get(next)) === null || _a === void 0 ? void 0 : _a.overlay) === null && (start >= pos || start + next.length <= pos)) &&\n                    !checkSide(side, pos, start, start + next.length))\n                    continue;\n                if (next instanceof TreeBuffer) {\n                    if (mode & exports.IterMode.ExcludeBuffers)\n                        continue;\n                    let index = next.findChild(0, next.buffer.length, dir, pos - start, side);\n                    if (index > -1)\n                        return new BufferNode(new BufferContext(parent, next, i, start), null, index);\n                }\n                else if ((mode & exports.IterMode.IncludeAnonymous) || (!next.type.isAnonymous || hasChild(next))) {\n                    let mounted;\n                    if (!(mode & exports.IterMode.IgnoreMounts) && (mounted = MountedTree.get(next)) && !mounted.overlay)\n                        return new TreeNode(mounted.tree, start, i, parent);\n                    let inner = new TreeNode(next, start, i, parent);\n                    return (mode & exports.IterMode.IncludeAnonymous) || !inner.type.isAnonymous ? inner\n                        : inner.nextChild(dir < 0 ? next.children.length - 1 : 0, dir, pos, side, mode);\n                }\n            }\n            if ((mode & exports.IterMode.IncludeAnonymous) || !parent.type.isAnonymous)\n                return null;\n            if (parent.index >= 0)\n                i = parent.index + dir;\n            else\n                i = dir < 0 ? -1 : parent._parent._tree.children.length;\n            parent = parent._parent;\n            if (!parent)\n                return null;\n        }\n    }\n    get firstChild() { return this.nextChild(0, 1, 0, 4 /* Side.DontCare */); }\n    get lastChild() { return this.nextChild(this._tree.children.length - 1, -1, 0, 4 /* Side.DontCare */); }\n    childAfter(pos) { return this.nextChild(0, 1, pos, 2 /* Side.After */); }\n    childBefore(pos) { return this.nextChild(this._tree.children.length - 1, -1, pos, -2 /* Side.Before */); }\n    prop(prop) { return this._tree.prop(prop); }\n    enter(pos, side, mode = 0) {\n        let mounted;\n        if (!(mode & exports.IterMode.IgnoreOverlays) && (mounted = MountedTree.get(this._tree)) && mounted.overlay) {\n            let rPos = pos - this.from, enterBracketed = (mode & exports.IterMode.EnterBracketed) && mounted.bracketed;\n            for (let { from, to } of mounted.overlay) {\n                if ((side > 0 || enterBracketed ? from <= rPos : from < rPos) &&\n                    (side < 0 || enterBracketed ? to >= rPos : to > rPos))\n                    return new TreeNode(mounted.tree, mounted.overlay[0].from + this.from, -1, this);\n            }\n        }\n        return this.nextChild(0, 1, pos, side, mode);\n    }\n    nextSignificantParent() {\n        let val = this;\n        while (val.type.isAnonymous && val._parent)\n            val = val._parent;\n        return val;\n    }\n    get parent() {\n        return this._parent ? this._parent.nextSignificantParent() : null;\n    }\n    get nextSibling() {\n        return this._parent && this.index >= 0 ? this._parent.nextChild(this.index + 1, 1, 0, 4 /* Side.DontCare */) : null;\n    }\n    get prevSibling() {\n        return this._parent && this.index >= 0 ? this._parent.nextChild(this.index - 1, -1, 0, 4 /* Side.DontCare */) : null;\n    }\n    get tree() { return this._tree; }\n    toTree() { return this._tree; }\n    /**\n    @internal\n    */\n    toString() { return this._tree.toString(); }\n}\nfunction getChildren(node, type, before, after) {\n    let cur = node.cursor(), result = [];\n    if (!cur.firstChild())\n        return result;\n    if (before != null)\n        for (let found = false; !found;) {\n            found = cur.type.is(before);\n            if (!cur.nextSibling())\n                return result;\n        }\n    for (;;) {\n        if (after != null && cur.type.is(after))\n            return result;\n        if (cur.type.is(type))\n            result.push(cur.node);\n        if (!cur.nextSibling())\n            return after == null ? result : [];\n    }\n}\nfunction matchNodeContext(node, context, i = context.length - 1) {\n    for (let p = node; i >= 0; p = p.parent) {\n        if (!p)\n            return false;\n        if (!p.type.isAnonymous) {\n            if (context[i] && context[i] != p.name)\n                return false;\n            i--;\n        }\n    }\n    return true;\n}\nclass BufferContext {\n    constructor(parent, buffer, index, start) {\n        this.parent = parent;\n        this.buffer = buffer;\n        this.index = index;\n        this.start = start;\n    }\n}\nclass BufferNode extends BaseNode {\n    get name() { return this.type.name; }\n    get from() { return this.context.start + this.context.buffer.buffer[this.index + 1]; }\n    get to() { return this.context.start + this.context.buffer.buffer[this.index + 2]; }\n    constructor(context, _parent, index) {\n        super();\n        this.context = context;\n        this._parent = _parent;\n        this.index = index;\n        this.type = context.buffer.set.types[context.buffer.buffer[index]];\n    }\n    child(dir, pos, side) {\n        let { buffer } = this.context;\n        let index = buffer.findChild(this.index + 4, buffer.buffer[this.index + 3], dir, pos - this.context.start, side);\n        return index < 0 ? null : new BufferNode(this.context, this, index);\n    }\n    get firstChild() { return this.child(1, 0, 4 /* Side.DontCare */); }\n    get lastChild() { return this.child(-1, 0, 4 /* Side.DontCare */); }\n    childAfter(pos) { return this.child(1, pos, 2 /* Side.After */); }\n    childBefore(pos) { return this.child(-1, pos, -2 /* Side.Before */); }\n    prop(prop) { return this.type.prop(prop); }\n    enter(pos, side, mode = 0) {\n        if (mode & exports.IterMode.ExcludeBuffers)\n            return null;\n        let { buffer } = this.context;\n        let index = buffer.findChild(this.index + 4, buffer.buffer[this.index + 3], side > 0 ? 1 : -1, pos - this.context.start, side);\n        return index < 0 ? null : new BufferNode(this.context, this, index);\n    }\n    get parent() {\n        return this._parent || this.context.parent.nextSignificantParent();\n    }\n    externalSibling(dir) {\n        return this._parent ? null : this.context.parent.nextChild(this.context.index + dir, dir, 0, 4 /* Side.DontCare */);\n    }\n    get nextSibling() {\n        let { buffer } = this.context;\n        let after = buffer.buffer[this.index + 3];\n        if (after < (this._parent ? buffer.buffer[this._parent.index + 3] : buffer.buffer.length))\n            return new BufferNode(this.context, this._parent, after);\n        return this.externalSibling(1);\n    }\n    get prevSibling() {\n        let { buffer } = this.context;\n        let parentStart = this._parent ? this._parent.index + 4 : 0;\n        if (this.index == parentStart)\n            return this.externalSibling(-1);\n        return new BufferNode(this.context, this._parent, buffer.findChild(parentStart, this.index, -1, 0, 4 /* Side.DontCare */));\n    }\n    get tree() { return null; }\n    toTree() {\n        let children = [], positions = [];\n        let { buffer } = this.context;\n        let startI = this.index + 4, endI = buffer.buffer[this.index + 3];\n        if (endI > startI) {\n            let from = buffer.buffer[this.index + 1];\n            children.push(buffer.slice(startI, endI, from));\n            positions.push(0);\n        }\n        return new Tree(this.type, children, positions, this.to - this.from);\n    }\n    /**\n    @internal\n    */\n    toString() { return this.context.buffer.childString(this.index); }\n}\nfunction iterStack(heads) {\n    if (!heads.length)\n        return null;\n    let pick = 0, picked = heads[0];\n    for (let i = 1; i < heads.length; i++) {\n        let node = heads[i];\n        if (node.from > picked.from || node.to < picked.to) {\n            picked = node;\n            pick = i;\n        }\n    }\n    let next = picked instanceof TreeNode && picked.index < 0 ? null : picked.parent;\n    let newHeads = heads.slice();\n    if (next)\n        newHeads[pick] = next;\n    else\n        newHeads.splice(pick, 1);\n    return new StackIterator(newHeads, picked);\n}\nclass StackIterator {\n    constructor(heads, node) {\n        this.heads = heads;\n        this.node = node;\n    }\n    get next() { return iterStack(this.heads); }\n}\nfunction stackIterator(tree, pos, side) {\n    let inner = tree.resolveInner(pos, side), layers = null;\n    for (let scan = inner instanceof TreeNode ? inner : inner.context.parent; scan; scan = scan.parent) {\n        if (scan.index < 0) { // This is an overlay root\n            let parent = scan.parent;\n            (layers || (layers = [inner])).push(parent.resolve(pos, side));\n            scan = parent;\n        }\n        else {\n            let mount = MountedTree.get(scan.tree);\n            // Relevant overlay branching off\n            if (mount && mount.overlay && mount.overlay[0].from <= pos && mount.overlay[mount.overlay.length - 1].to >= pos) {\n                let root = new TreeNode(mount.tree, mount.overlay[0].from + scan.from, -1, scan);\n                (layers || (layers = [inner])).push(resolveNode(root, pos, side, false));\n            }\n        }\n    }\n    return layers ? iterStack(layers) : inner;\n}\n/**\nA tree cursor object focuses on a given node in a syntax tree, and\nallows you to move to adjacent nodes.\n*/\nclass TreeCursor {\n    /**\n    Shorthand for `.type.name`.\n    */\n    get name() { return this.type.name; }\n    /**\n    @internal\n    */\n    constructor(node, mode = 0) {\n        /**\n        @internal\n        */\n        this.buffer = null;\n        this.stack = [];\n        /**\n        @internal\n        */\n        this.index = 0;\n        this.bufferNode = null;\n        this.mode = mode & ~exports.IterMode.EnterBracketed;\n        if (node instanceof TreeNode) {\n            this.yieldNode(node);\n        }\n        else {\n            this._tree = node.context.parent;\n            this.buffer = node.context;\n            for (let n = node._parent; n; n = n._parent)\n                this.stack.unshift(n.index);\n            this.bufferNode = node;\n            this.yieldBuf(node.index);\n        }\n    }\n    yieldNode(node) {\n        if (!node)\n            return false;\n        this._tree = node;\n        this.type = node.type;\n        this.from = node.from;\n        this.to = node.to;\n        return true;\n    }\n    yieldBuf(index, type) {\n        this.index = index;\n        let { start, buffer } = this.buffer;\n        this.type = type || buffer.set.types[buffer.buffer[index]];\n        this.from = start + buffer.buffer[index + 1];\n        this.to = start + buffer.buffer[index + 2];\n        return true;\n    }\n    /**\n    @internal\n    */\n    yield(node) {\n        if (!node)\n            return false;\n        if (node instanceof TreeNode) {\n            this.buffer = null;\n            return this.yieldNode(node);\n        }\n        this.buffer = node.context;\n        return this.yieldBuf(node.index, node.type);\n    }\n    /**\n    @internal\n    */\n    toString() {\n        return this.buffer ? this.buffer.buffer.childString(this.index) : this._tree.toString();\n    }\n    /**\n    @internal\n    */\n    enterChild(dir, pos, side) {\n        if (!this.buffer)\n            return this.yield(this._tree.nextChild(dir < 0 ? this._tree._tree.children.length - 1 : 0, dir, pos, side, this.mode));\n        let { buffer } = this.buffer;\n        let index = buffer.findChild(this.index + 4, buffer.buffer[this.index + 3], dir, pos - this.buffer.start, side);\n        if (index < 0)\n            return false;\n        this.stack.push(this.index);\n        return this.yieldBuf(index);\n    }\n    /**\n    Move the cursor to this node's first child. When this returns\n    false, the node has no child, and the cursor has not been moved.\n    */\n    firstChild() { return this.enterChild(1, 0, 4 /* Side.DontCare */); }\n    /**\n    Move the cursor to this node's last child.\n    */\n    lastChild() { return this.enterChild(-1, 0, 4 /* Side.DontCare */); }\n    /**\n    Move the cursor to the first child that ends after `pos`.\n    */\n    childAfter(pos) { return this.enterChild(1, pos, 2 /* Side.After */); }\n    /**\n    Move to the last child that starts before `pos`.\n    */\n    childBefore(pos) { return this.enterChild(-1, pos, -2 /* Side.Before */); }\n    /**\n    Move the cursor to the child around `pos`. If side is -1 the\n    child may end at that position, when 1 it may start there. This\n    will also enter [overlaid](#common.MountedTree.overlay)\n    [mounted](#common.NodeProp^mounted) trees unless `overlays` is\n    set to false.\n    */\n    enter(pos, side, mode = this.mode) {\n        if (!this.buffer)\n            return this.yield(this._tree.enter(pos, side, mode));\n        return mode & exports.IterMode.ExcludeBuffers ? false : this.enterChild(1, pos, side);\n    }\n    /**\n    Move to the node's parent node, if this isn't the top node.\n    */\n    parent() {\n        if (!this.buffer)\n            return this.yieldNode((this.mode & exports.IterMode.IncludeAnonymous) ? this._tree._parent : this._tree.parent);\n        if (this.stack.length)\n            return this.yieldBuf(this.stack.pop());\n        let parent = (this.mode & exports.IterMode.IncludeAnonymous) ? this.buffer.parent : this.buffer.parent.nextSignificantParent();\n        this.buffer = null;\n        return this.yieldNode(parent);\n    }\n    /**\n    @internal\n    */\n    sibling(dir) {\n        if (!this.buffer)\n            return !this._tree._parent ? false\n                : this.yield(this._tree.index < 0 ? null\n                    : this._tree._parent.nextChild(this._tree.index + dir, dir, 0, 4 /* Side.DontCare */, this.mode));\n        let { buffer } = this.buffer, d = this.stack.length - 1;\n        if (dir < 0) {\n            let parentStart = d < 0 ? 0 : this.stack[d] + 4;\n            if (this.index != parentStart)\n                return this.yieldBuf(buffer.findChild(parentStart, this.index, -1, 0, 4 /* Side.DontCare */));\n        }\n        else {\n            let after = buffer.buffer[this.index + 3];\n            if (after < (d < 0 ? buffer.buffer.length : buffer.buffer[this.stack[d] + 3]))\n                return this.yieldBuf(after);\n        }\n        return d < 0 ? this.yield(this.buffer.parent.nextChild(this.buffer.index + dir, dir, 0, 4 /* Side.DontCare */, this.mode)) : false;\n    }\n    /**\n    Move to this node's next sibling, if any.\n    */\n    nextSibling() { return this.sibling(1); }\n    /**\n    Move to this node's previous sibling, if any.\n    */\n    prevSibling() { return this.sibling(-1); }\n    atLastNode(dir) {\n        let index, parent, { buffer } = this;\n        if (buffer) {\n            if (dir > 0) {\n                if (this.index < buffer.buffer.buffer.length)\n                    return false;\n            }\n            else {\n                for (let i = 0; i < this.index; i++)\n                    if (buffer.buffer.buffer[i + 3] < this.index)\n                        return false;\n            }\n            ({ index, parent } = buffer);\n        }\n        else {\n            ({ index, _parent: parent } = this._tree);\n        }\n        for (; parent; { index, _parent: parent } = parent) {\n            if (index > -1)\n                for (let i = index + dir, e = dir < 0 ? -1 : parent._tree.children.length; i != e; i += dir) {\n                    let child = parent._tree.children[i];\n                    if ((this.mode & exports.IterMode.IncludeAnonymous) ||\n                        child instanceof TreeBuffer ||\n                        !child.type.isAnonymous ||\n                        hasChild(child))\n                        return false;\n                }\n        }\n        return true;\n    }\n    move(dir, enter) {\n        if (enter && this.enterChild(dir, 0, 4 /* Side.DontCare */))\n            return true;\n        for (;;) {\n            if (this.sibling(dir))\n                return true;\n            if (this.atLastNode(dir) || !this.parent())\n                return false;\n        }\n    }\n    /**\n    Move to the next node in a\n    [pre-order](https://en.wikipedia.org/wiki/Tree_traversal#Pre-order,_NLR)\n    traversal, going from a node to its first child or, if the\n    current node is empty or `enter` is false, its next sibling or\n    the next sibling of the first parent node that has one.\n    */\n    next(enter = true) { return this.move(1, enter); }\n    /**\n    Move to the next node in a last-to-first pre-order traversal. A\n    node is followed by its last child or, if it has none, its\n    previous sibling or the previous sibling of the first parent\n    node that has one.\n    */\n    prev(enter = true) { return this.move(-1, enter); }\n    /**\n    Move the cursor to the innermost node that covers `pos`. If\n    `side` is -1, it will enter nodes that end at `pos`. If it is 1,\n    it will enter nodes that start at `pos`.\n    */\n    moveTo(pos, side = 0) {\n        // Move up to a node that actually holds the position, if possible\n        while (this.from == this.to ||\n            (side < 1 ? this.from >= pos : this.from > pos) ||\n            (side > -1 ? this.to <= pos : this.to < pos))\n            if (!this.parent())\n                break;\n        // Then scan down into child nodes as far as possible\n        while (this.enterChild(1, pos, side)) { }\n        return this;\n    }\n    /**\n    Get a [syntax node](#common.SyntaxNode) at the cursor's current\n    position.\n    */\n    get node() {\n        if (!this.buffer)\n            return this._tree;\n        let cache = this.bufferNode, result = null, depth = 0;\n        if (cache && cache.context == this.buffer) {\n            scan: for (let index = this.index, d = this.stack.length; d >= 0;) {\n                for (let c = cache; c; c = c._parent)\n                    if (c.index == index) {\n                        if (index == this.index)\n                            return c;\n                        result = c;\n                        depth = d + 1;\n                        break scan;\n                    }\n                index = this.stack[--d];\n            }\n        }\n        for (let i = depth; i < this.stack.length; i++)\n            result = new BufferNode(this.buffer, result, this.stack[i]);\n        return this.bufferNode = new BufferNode(this.buffer, result, this.index);\n    }\n    /**\n    Get the [tree](#common.Tree) that represents the current node, if\n    any. Will return null when the node is in a [tree\n    buffer](#common.TreeBuffer).\n    */\n    get tree() {\n        return this.buffer ? null : this._tree._tree;\n    }\n    /**\n    Iterate over the current node and all its descendants, calling\n    `enter` when entering a node and `leave`, if given, when leaving\n    one. When `enter` returns `false`, any children of that node are\n    skipped, and `leave` isn't called for it.\n    */\n    iterate(enter, leave) {\n        for (let depth = 0;;) {\n            let mustLeave = false;\n            if (this.type.isAnonymous || enter(this) !== false) {\n                if (this.firstChild()) {\n                    depth++;\n                    continue;\n                }\n                if (!this.type.isAnonymous)\n                    mustLeave = true;\n            }\n            for (;;) {\n                if (mustLeave && leave)\n                    leave(this);\n                mustLeave = this.type.isAnonymous;\n                if (!depth)\n                    return;\n                if (this.nextSibling())\n                    break;\n                this.parent();\n                depth--;\n                mustLeave = true;\n            }\n        }\n    }\n    /**\n    Test whether the current node matches a given context—a sequence\n    of direct parent node names. Empty strings in the context array\n    are treated as wildcards.\n    */\n    matchContext(context) {\n        if (!this.buffer)\n            return matchNodeContext(this.node.parent, context);\n        let { buffer } = this.buffer, { types } = buffer.set;\n        for (let i = context.length - 1, d = this.stack.length - 1; i >= 0; d--) {\n            if (d < 0)\n                return matchNodeContext(this._tree, context, i);\n            let type = types[buffer.buffer[this.stack[d]]];\n            if (!type.isAnonymous) {\n                if (context[i] && context[i] != type.name)\n                    return false;\n                i--;\n            }\n        }\n        return true;\n    }\n}\nfunction hasChild(tree) {\n    return tree.children.some(ch => ch instanceof TreeBuffer || !ch.type.isAnonymous || hasChild(ch));\n}\nfunction buildTree(data) {\n    var _a;\n    let { buffer, nodeSet, maxBufferLength = DefaultBufferLength, reused = [], minRepeatType = nodeSet.types.length } = data;\n    let cursor = Array.isArray(buffer) ? new FlatBufferCursor(buffer, buffer.length) : buffer;\n    let types = nodeSet.types;\n    let contextHash = 0, lookAhead = 0;\n    function takeNode(parentStart, minPos, children, positions, inRepeat, depth) {\n        let { id, start, end, size } = cursor;\n        let lookAheadAtStart = lookAhead, contextAtStart = contextHash;\n        if (size < 0) {\n            cursor.next();\n            if (size == -1 /* SpecialRecord.Reuse */) {\n                let node = reused[id];\n                children.push(node);\n                positions.push(start - parentStart);\n                return;\n            }\n            else if (size == -3 /* SpecialRecord.ContextChange */) { // Context change\n                contextHash = id;\n                return;\n            }\n            else if (size == -4 /* SpecialRecord.LookAhead */) {\n                lookAhead = id;\n                return;\n            }\n            else {\n                throw new RangeError(`Unrecognized record size: ${size}`);\n            }\n        }\n        let type = types[id], node, buffer;\n        let startPos = start - parentStart;\n        if (end - start <= maxBufferLength && (buffer = findBufferSize(cursor.pos - minPos, inRepeat))) {\n            // Small enough for a buffer, and no reused nodes inside\n            let data = new Uint16Array(buffer.size - buffer.skip);\n            let endPos = cursor.pos - buffer.size, index = data.length;\n            while (cursor.pos > endPos)\n                index = copyToBuffer(buffer.start, data, index);\n            node = new TreeBuffer(data, end - buffer.start, nodeSet);\n            startPos = buffer.start - parentStart;\n        }\n        else { // Make it a node\n            let endPos = cursor.pos - size;\n            cursor.next();\n            let localChildren = [], localPositions = [];\n            let localInRepeat = id >= minRepeatType ? id : -1;\n            let lastGroup = 0, lastEnd = end;\n            while (cursor.pos > endPos) {\n                if (localInRepeat >= 0 && cursor.id == localInRepeat && cursor.size >= 0) {\n                    if (cursor.end <= lastEnd - maxBufferLength) {\n                        makeRepeatLeaf(localChildren, localPositions, start, lastGroup, cursor.end, lastEnd, localInRepeat, lookAheadAtStart, contextAtStart);\n                        lastGroup = localChildren.length;\n                        lastEnd = cursor.end;\n                    }\n                    cursor.next();\n                }\n                else if (depth > 2500 /* CutOff.Depth */) {\n                    takeFlatNode(start, endPos, localChildren, localPositions);\n                }\n                else {\n                    takeNode(start, endPos, localChildren, localPositions, localInRepeat, depth + 1);\n                }\n            }\n            if (localInRepeat >= 0 && lastGroup > 0 && lastGroup < localChildren.length)\n                makeRepeatLeaf(localChildren, localPositions, start, lastGroup, start, lastEnd, localInRepeat, lookAheadAtStart, contextAtStart);\n            localChildren.reverse();\n            localPositions.reverse();\n            if (localInRepeat > -1 && lastGroup > 0) {\n                let make = makeBalanced(type, contextAtStart);\n                node = balanceRange(type, localChildren, localPositions, 0, localChildren.length, 0, end - start, make, make);\n            }\n            else {\n                node = makeTree(type, localChildren, localPositions, end - start, lookAheadAtStart - end, contextAtStart);\n            }\n        }\n        children.push(node);\n        positions.push(startPos);\n    }\n    function takeFlatNode(parentStart, minPos, children, positions) {\n        let nodes = []; // Temporary, inverted array of leaf nodes found, with absolute positions\n        let nodeCount = 0, stopAt = -1;\n        while (cursor.pos > minPos) {\n            let { id, start, end, size } = cursor;\n            if (size > 4) { // Not a leaf\n                cursor.next();\n            }\n            else if (stopAt > -1 && start < stopAt) {\n                break;\n            }\n            else {\n                if (stopAt < 0)\n                    stopAt = end - maxBufferLength;\n                nodes.push(id, start, end);\n                nodeCount++;\n                cursor.next();\n            }\n        }\n        if (nodeCount) {\n            let buffer = new Uint16Array(nodeCount * 4);\n            let start = nodes[nodes.length - 2];\n            for (let i = nodes.length - 3, j = 0; i >= 0; i -= 3) {\n                buffer[j++] = nodes[i];\n                buffer[j++] = nodes[i + 1] - start;\n                buffer[j++] = nodes[i + 2] - start;\n                buffer[j++] = j;\n            }\n            children.push(new TreeBuffer(buffer, nodes[2] - start, nodeSet));\n            positions.push(start - parentStart);\n        }\n    }\n    function makeBalanced(type, contextHash) {\n        return (children, positions, length) => {\n            let lookAhead = 0, lastI = children.length - 1, last, lookAheadProp;\n            if (lastI >= 0 && (last = children[lastI]) instanceof Tree) {\n                if (!lastI && last.type == type && last.length == length)\n                    return last;\n                if (lookAheadProp = last.prop(NodeProp.lookAhead))\n                    lookAhead = positions[lastI] + last.length + lookAheadProp;\n            }\n            return makeTree(type, children, positions, length, lookAhead, contextHash);\n        };\n    }\n    function makeRepeatLeaf(children, positions, base, i, from, to, type, lookAhead, contextHash) {\n        let localChildren = [], localPositions = [];\n        while (children.length > i) {\n            localChildren.push(children.pop());\n            localPositions.push(positions.pop() + base - from);\n        }\n        children.push(makeTree(nodeSet.types[type], localChildren, localPositions, to - from, lookAhead - to, contextHash));\n        positions.push(from - base);\n    }\n    function makeTree(type, children, positions, length, lookAhead, contextHash, props) {\n        if (contextHash) {\n            let pair = [NodeProp.contextHash, contextHash];\n            props = props ? [pair].concat(props) : [pair];\n        }\n        if (lookAhead > 25) {\n            let pair = [NodeProp.lookAhead, lookAhead];\n            props = props ? [pair].concat(props) : [pair];\n        }\n        return new Tree(type, children, positions, length, props);\n    }\n    function findBufferSize(maxSize, inRepeat) {\n        // Scan through the buffer to find previous siblings that fit\n        // together in a TreeBuffer, and don't contain any reused nodes\n        // (which can't be stored in a buffer).\n        // If `inRepeat` is > -1, ignore node boundaries of that type for\n        // nesting, but make sure the end falls either at the start\n        // (`maxSize`) or before such a node.\n        let fork = cursor.fork();\n        let size = 0, start = 0, skip = 0, minStart = fork.end - maxBufferLength;\n        let result = { size: 0, start: 0, skip: 0 };\n        scan: for (let minPos = fork.pos - maxSize; fork.pos > minPos;) {\n            let nodeSize = fork.size;\n            // Pretend nested repeat nodes of the same type don't exist\n            if (fork.id == inRepeat && nodeSize >= 0) {\n                // Except that we store the current state as a valid return\n                // value.\n                result.size = size;\n                result.start = start;\n                result.skip = skip;\n                skip += 4;\n                size += 4;\n                fork.next();\n                continue;\n            }\n            let startPos = fork.pos - nodeSize;\n            if (nodeSize < 0 || startPos < minPos || fork.start < minStart)\n                break;\n            let localSkipped = fork.id >= minRepeatType ? 4 : 0;\n            let nodeStart = fork.start;\n            fork.next();\n            while (fork.pos > startPos) {\n                if (fork.size < 0) {\n                    if (fork.size == -3 /* SpecialRecord.ContextChange */ || fork.size == -4 /* SpecialRecord.LookAhead */)\n                        localSkipped += 4;\n                    else\n                        break scan;\n                }\n                else if (fork.id >= minRepeatType) {\n                    localSkipped += 4;\n                }\n                fork.next();\n            }\n            start = nodeStart;\n            size += nodeSize;\n            skip += localSkipped;\n        }\n        if (inRepeat < 0 || size == maxSize) {\n            result.size = size;\n            result.start = start;\n            result.skip = skip;\n        }\n        return result.size > 4 ? result : undefined;\n    }\n    function copyToBuffer(bufferStart, buffer, index) {\n        let { id, start, end, size } = cursor;\n        cursor.next();\n        if (size >= 0 && id < minRepeatType) {\n            let startIndex = index;\n            if (size > 4) {\n                let endPos = cursor.pos - (size - 4);\n                while (cursor.pos > endPos)\n                    index = copyToBuffer(bufferStart, buffer, index);\n            }\n            buffer[--index] = startIndex;\n            buffer[--index] = end - bufferStart;\n            buffer[--index] = start - bufferStart;\n            buffer[--index] = id;\n        }\n        else if (size == -3 /* SpecialRecord.ContextChange */) {\n            contextHash = id;\n        }\n        else if (size == -4 /* SpecialRecord.LookAhead */) {\n            lookAhead = id;\n        }\n        return index;\n    }\n    let children = [], positions = [];\n    while (cursor.pos > 0)\n        takeNode(data.start || 0, data.bufferStart || 0, children, positions, -1, 0);\n    let length = (_a = data.length) !== null && _a !== void 0 ? _a : (children.length ? positions[0] + children[0].length : 0);\n    return new Tree(types[data.topID], children.reverse(), positions.reverse(), length);\n}\nconst nodeSizeCache = new WeakMap;\nfunction nodeSize(balanceType, node) {\n    if (!balanceType.isAnonymous || node instanceof TreeBuffer || node.type != balanceType)\n        return 1;\n    let size = nodeSizeCache.get(node);\n    if (size == null) {\n        size = 1;\n        for (let child of node.children) {\n            if (child.type != balanceType || !(child instanceof Tree)) {\n                size = 1;\n                break;\n            }\n            size += nodeSize(balanceType, child);\n        }\n        nodeSizeCache.set(node, size);\n    }\n    return size;\n}\nfunction balanceRange(\n// The type the balanced tree's inner nodes.\nbalanceType, \n// The direct children and their positions\nchildren, positions, \n// The index range in children/positions to use\nfrom, to, \n// The start position of the nodes, relative to their parent.\nstart, \n// Length of the outer node\nlength, \n// Function to build the top node of the balanced tree\nmkTop, \n// Function to build internal nodes for the balanced tree\nmkTree) {\n    let total = 0;\n    for (let i = from; i < to; i++)\n        total += nodeSize(balanceType, children[i]);\n    let maxChild = Math.ceil((total * 1.5) / 8 /* Balance.BranchFactor */);\n    let localChildren = [], localPositions = [];\n    function divide(children, positions, from, to, offset) {\n        for (let i = from; i < to;) {\n            let groupFrom = i, groupStart = positions[i], groupSize = nodeSize(balanceType, children[i]);\n            i++;\n            for (; i < to; i++) {\n                let nextSize = nodeSize(balanceType, children[i]);\n                if (groupSize + nextSize >= maxChild)\n                    break;\n                groupSize += nextSize;\n            }\n            if (i == groupFrom + 1) {\n                if (groupSize > maxChild) {\n                    let only = children[groupFrom]; // Only trees can have a size > 1\n                    divide(only.children, only.positions, 0, only.children.length, positions[groupFrom] + offset);\n                    continue;\n                }\n                localChildren.push(children[groupFrom]);\n            }\n            else {\n                let length = positions[i - 1] + children[i - 1].length - groupStart;\n                localChildren.push(balanceRange(balanceType, children, positions, groupFrom, i, groupStart, length, null, mkTree));\n            }\n            localPositions.push(groupStart + offset - start);\n        }\n    }\n    divide(children, positions, from, to, 0);\n    return (mkTop || mkTree)(localChildren, localPositions, length);\n}\n/**\nProvides a way to associate values with pieces of trees. As long\nas that part of the tree is reused, the associated values can be\nretrieved from an updated tree.\n*/\nclass NodeWeakMap {\n    constructor() {\n        this.map = new WeakMap();\n    }\n    setBuffer(buffer, index, value) {\n        let inner = this.map.get(buffer);\n        if (!inner)\n            this.map.set(buffer, inner = new Map);\n        inner.set(index, value);\n    }\n    getBuffer(buffer, index) {\n        let inner = this.map.get(buffer);\n        return inner && inner.get(index);\n    }\n    /**\n    Set the value for this syntax node.\n    */\n    set(node, value) {\n        if (node instanceof BufferNode)\n            this.setBuffer(node.context.buffer, node.index, value);\n        else if (node instanceof TreeNode)\n            this.map.set(node.tree, value);\n    }\n    /**\n    Retrieve value for this syntax node, if it exists in the map.\n    */\n    get(node) {\n        return node instanceof BufferNode ? this.getBuffer(node.context.buffer, node.index)\n            : node instanceof TreeNode ? this.map.get(node.tree) : undefined;\n    }\n    /**\n    Set the value for the node that a cursor currently points to.\n    */\n    cursorSet(cursor, value) {\n        if (cursor.buffer)\n            this.setBuffer(cursor.buffer.buffer, cursor.index, value);\n        else\n            this.map.set(cursor.tree, value);\n    }\n    /**\n    Retrieve the value for the node that a cursor currently points\n    to.\n    */\n    cursorGet(cursor) {\n        return cursor.buffer ? this.getBuffer(cursor.buffer.buffer, cursor.index) : this.map.get(cursor.tree);\n    }\n}\n\n/**\nTree fragments are used during [incremental\nparsing](#common.Parser.startParse) to track parts of old trees\nthat can be reused in a new parse. An array of fragments is used\nto track regions of an old tree whose nodes might be reused in new\nparses. Use the static\n[`applyChanges`](#common.TreeFragment^applyChanges) method to\nupdate fragments for document changes.\n*/\nclass TreeFragment {\n    /**\n    Construct a tree fragment. You'll usually want to use\n    [`addTree`](#common.TreeFragment^addTree) and\n    [`applyChanges`](#common.TreeFragment^applyChanges) instead of\n    calling this directly.\n    */\n    constructor(\n    /**\n    The start of the unchanged range pointed to by this fragment.\n    This refers to an offset in the _updated_ document (as opposed\n    to the original tree).\n    */\n    from, \n    /**\n    The end of the unchanged range.\n    */\n    to, \n    /**\n    The tree that this fragment is based on.\n    */\n    tree, \n    /**\n    The offset between the fragment's tree and the document that\n    this fragment can be used against. Add this when going from\n    document to tree positions, subtract it to go from tree to\n    document positions.\n    */\n    offset, openStart = false, openEnd = false) {\n        this.from = from;\n        this.to = to;\n        this.tree = tree;\n        this.offset = offset;\n        this.open = (openStart ? 1 /* Open.Start */ : 0) | (openEnd ? 2 /* Open.End */ : 0);\n    }\n    /**\n    Whether the start of the fragment represents the start of a\n    parse, or the end of a change. (In the second case, it may not\n    be safe to reuse some nodes at the start, depending on the\n    parsing algorithm.)\n    */\n    get openStart() { return (this.open & 1 /* Open.Start */) > 0; }\n    /**\n    Whether the end of the fragment represents the end of a\n    full-document parse, or the start of a change.\n    */\n    get openEnd() { return (this.open & 2 /* Open.End */) > 0; }\n    /**\n    Create a set of fragments from a freshly parsed tree, or update\n    an existing set of fragments by replacing the ones that overlap\n    with a tree with content from the new tree. When `partial` is\n    true, the parse is treated as incomplete, and the resulting\n    fragment has [`openEnd`](#common.TreeFragment.openEnd) set to\n    true.\n    */\n    static addTree(tree, fragments = [], partial = false) {\n        let result = [new TreeFragment(0, tree.length, tree, 0, false, partial)];\n        for (let f of fragments)\n            if (f.to > tree.length)\n                result.push(f);\n        return result;\n    }\n    /**\n    Apply a set of edits to an array of fragments, removing or\n    splitting fragments as necessary to remove edited ranges, and\n    adjusting offsets for fragments that moved.\n    */\n    static applyChanges(fragments, changes, minGap = 128) {\n        if (!changes.length)\n            return fragments;\n        let result = [];\n        let fI = 1, nextF = fragments.length ? fragments[0] : null;\n        for (let cI = 0, pos = 0, off = 0;; cI++) {\n            let nextC = cI < changes.length ? changes[cI] : null;\n            let nextPos = nextC ? nextC.fromA : 1e9;\n            if (nextPos - pos >= minGap)\n                while (nextF && nextF.from < nextPos) {\n                    let cut = nextF;\n                    if (pos >= cut.from || nextPos <= cut.to || off) {\n                        let fFrom = Math.max(cut.from, pos) - off, fTo = Math.min(cut.to, nextPos) - off;\n                        cut = fFrom >= fTo ? null : new TreeFragment(fFrom, fTo, cut.tree, cut.offset + off, cI > 0, !!nextC);\n                    }\n                    if (cut)\n                        result.push(cut);\n                    if (nextF.to > nextPos)\n                        break;\n                    nextF = fI < fragments.length ? fragments[fI++] : null;\n                }\n            if (!nextC)\n                break;\n            pos = nextC.toA;\n            off = nextC.toA - nextC.toB;\n        }\n        return result;\n    }\n}\n/**\nA superclass that parsers should extend.\n*/\nclass Parser {\n    /**\n    Start a parse, returning a [partial parse](#common.PartialParse)\n    object. [`fragments`](#common.TreeFragment) can be passed in to\n    make the parse incremental.\n    \n    By default, the entire input is parsed. You can pass `ranges`,\n    which should be a sorted array of non-empty, non-overlapping\n    ranges, to parse only those ranges. The tree returned in that\n    case will start at `ranges[0].from`.\n    */\n    startParse(input, fragments, ranges) {\n        if (typeof input == \"string\")\n            input = new StringInput(input);\n        ranges = !ranges ? [new Range(0, input.length)] : ranges.length ? ranges.map(r => new Range(r.from, r.to)) : [new Range(0, 0)];\n        return this.createParse(input, fragments || [], ranges);\n    }\n    /**\n    Run a full parse, returning the resulting tree.\n    */\n    parse(input, fragments, ranges) {\n        let parse = this.startParse(input, fragments, ranges);\n        for (;;) {\n            let done = parse.advance();\n            if (done)\n                return done;\n        }\n    }\n}\nclass StringInput {\n    constructor(string) {\n        this.string = string;\n    }\n    get length() { return this.string.length; }\n    chunk(from) { return this.string.slice(from); }\n    get lineChunks() { return false; }\n    read(from, to) { return this.string.slice(from, to); }\n}\n\n/**\nCreate a parse wrapper that, after the inner parse completes,\nscans its tree for mixed language regions with the `nest`\nfunction, runs the resulting [inner parses](#common.NestedParse),\nand then [mounts](#common.NodeProp^mounted) their results onto the\ntree.\n*/\nfunction parseMixed(nest) {\n    return (parse, input, fragments, ranges) => new MixedParse(parse, nest, input, fragments, ranges);\n}\nclass InnerParse {\n    constructor(parser, parse, overlay, bracketed, target, from) {\n        this.parser = parser;\n        this.parse = parse;\n        this.overlay = overlay;\n        this.bracketed = bracketed;\n        this.target = target;\n        this.from = from;\n    }\n}\nfunction checkRanges(ranges) {\n    if (!ranges.length || ranges.some(r => r.from >= r.to))\n        throw new RangeError(\"Invalid inner parse ranges given: \" + JSON.stringify(ranges));\n}\nclass ActiveOverlay {\n    constructor(parser, predicate, mounts, index, start, bracketed, target, prev) {\n        this.parser = parser;\n        this.predicate = predicate;\n        this.mounts = mounts;\n        this.index = index;\n        this.start = start;\n        this.bracketed = bracketed;\n        this.target = target;\n        this.prev = prev;\n        this.depth = 0;\n        this.ranges = [];\n    }\n}\nconst stoppedInner = new NodeProp({ perNode: true });\nclass MixedParse {\n    constructor(base, nest, input, fragments, ranges) {\n        this.nest = nest;\n        this.input = input;\n        this.fragments = fragments;\n        this.ranges = ranges;\n        this.inner = [];\n        this.innerDone = 0;\n        this.baseTree = null;\n        this.stoppedAt = null;\n        this.baseParse = base;\n    }\n    advance() {\n        if (this.baseParse) {\n            let done = this.baseParse.advance();\n            if (!done)\n                return null;\n            this.baseParse = null;\n            this.baseTree = done;\n            this.startInner();\n            if (this.stoppedAt != null)\n                for (let inner of this.inner)\n                    inner.parse.stopAt(this.stoppedAt);\n        }\n        if (this.innerDone == this.inner.length) {\n            let result = this.baseTree;\n            if (this.stoppedAt != null)\n                result = new Tree(result.type, result.children, result.positions, result.length, result.propValues.concat([[stoppedInner, this.stoppedAt]]));\n            return result;\n        }\n        let inner = this.inner[this.innerDone], done = inner.parse.advance();\n        if (done) {\n            this.innerDone++;\n            // This is a somewhat dodgy but super helpful hack where we\n            // patch up nodes created by the inner parse (and thus\n            // presumably not aliased anywhere else) to hold the information\n            // about the inner parse.\n            let props = Object.assign(Object.create(null), inner.target.props);\n            props[NodeProp.mounted.id] = new MountedTree(done, inner.overlay, inner.parser, inner.bracketed);\n            inner.target.props = props;\n        }\n        return null;\n    }\n    get parsedPos() {\n        if (this.baseParse)\n            return 0;\n        let pos = this.input.length;\n        for (let i = this.innerDone; i < this.inner.length; i++) {\n            if (this.inner[i].from < pos)\n                pos = Math.min(pos, this.inner[i].parse.parsedPos);\n        }\n        return pos;\n    }\n    stopAt(pos) {\n        this.stoppedAt = pos;\n        if (this.baseParse)\n            this.baseParse.stopAt(pos);\n        else\n            for (let i = this.innerDone; i < this.inner.length; i++)\n                this.inner[i].parse.stopAt(pos);\n    }\n    startInner() {\n        let fragmentCursor = new FragmentCursor(this.fragments);\n        let overlay = null;\n        let covered = null;\n        let cursor = new TreeCursor(new TreeNode(this.baseTree, this.ranges[0].from, 0, null), exports.IterMode.IncludeAnonymous | exports.IterMode.IgnoreMounts);\n        scan: for (let nest, isCovered;;) {\n            let enter = true, range;\n            if (this.stoppedAt != null && cursor.from >= this.stoppedAt) {\n                enter = false;\n            }\n            else if (fragmentCursor.hasNode(cursor)) {\n                if (overlay) {\n                    let match = overlay.mounts.find(m => m.frag.from <= cursor.from && m.frag.to >= cursor.to && m.mount.overlay);\n                    if (match)\n                        for (let r of match.mount.overlay) {\n                            let from = r.from + match.pos, to = r.to + match.pos;\n                            if (from >= cursor.from && to <= cursor.to && !overlay.ranges.some(r => r.from < to && r.to > from))\n                                overlay.ranges.push({ from, to });\n                        }\n                }\n                enter = false;\n            }\n            else if (covered && (isCovered = checkCover(covered.ranges, cursor.from, cursor.to))) {\n                enter = isCovered != 2 /* Cover.Full */;\n            }\n            else if (!cursor.type.isAnonymous && (nest = this.nest(cursor, this.input)) &&\n                (cursor.from < cursor.to || !nest.overlay)) {\n                if (!cursor.tree) {\n                    materialize(cursor);\n                    // materialize create one more level of nesting\n                    // we need to add depth to active overlay for going backwards\n                    if (overlay)\n                        overlay.depth++;\n                    if (covered)\n                        covered.depth++;\n                }\n                let oldMounts = fragmentCursor.findMounts(cursor.from, nest.parser);\n                if (typeof nest.overlay == \"function\") {\n                    overlay = new ActiveOverlay(nest.parser, nest.overlay, oldMounts, this.inner.length, cursor.from, !!nest.bracketed, cursor.tree, overlay);\n                }\n                else {\n                    let ranges = punchRanges(this.ranges, nest.overlay ||\n                        (cursor.from < cursor.to ? [new Range(cursor.from, cursor.to)] : []));\n                    if (ranges.length)\n                        checkRanges(ranges);\n                    if (ranges.length || !nest.overlay)\n                        this.inner.push(new InnerParse(nest.parser, ranges.length ? nest.parser.startParse(this.input, enterFragments(oldMounts, ranges), ranges)\n                            : nest.parser.startParse(\"\"), nest.overlay ? nest.overlay.map(r => new Range(r.from - cursor.from, r.to - cursor.from)) : null, !!nest.bracketed, cursor.tree, ranges.length ? ranges[0].from : cursor.from));\n                    if (!nest.overlay)\n                        enter = false;\n                    else if (ranges.length)\n                        covered = { ranges, depth: 0, prev: covered };\n                }\n            }\n            else if (overlay && (range = overlay.predicate(cursor))) {\n                if (range === true)\n                    range = new Range(cursor.from, cursor.to);\n                if (range.from < range.to) {\n                    let last = overlay.ranges.length - 1;\n                    if (last >= 0 && overlay.ranges[last].to == range.from)\n                        overlay.ranges[last] = { from: overlay.ranges[last].from, to: range.to };\n                    else\n                        overlay.ranges.push(range);\n                }\n            }\n            if (enter && cursor.firstChild()) {\n                if (overlay)\n                    overlay.depth++;\n                if (covered)\n                    covered.depth++;\n            }\n            else {\n                for (;;) {\n                    if (cursor.nextSibling())\n                        break;\n                    if (!cursor.parent())\n                        break scan;\n                    if (overlay && !--overlay.depth) {\n                        let ranges = punchRanges(this.ranges, overlay.ranges);\n                        if (ranges.length) {\n                            checkRanges(ranges);\n                            this.inner.splice(overlay.index, 0, new InnerParse(overlay.parser, overlay.parser.startParse(this.input, enterFragments(overlay.mounts, ranges), ranges), overlay.ranges.map(r => new Range(r.from - overlay.start, r.to - overlay.start)), overlay.bracketed, overlay.target, ranges[0].from));\n                        }\n                        overlay = overlay.prev;\n                    }\n                    if (covered && !--covered.depth)\n                        covered = covered.prev;\n                }\n            }\n        }\n    }\n}\nfunction checkCover(covered, from, to) {\n    for (let range of covered) {\n        if (range.from >= to)\n            break;\n        if (range.to > from)\n            return range.from <= from && range.to >= to ? 2 /* Cover.Full */ : 1 /* Cover.Partial */;\n    }\n    return 0 /* Cover.None */;\n}\n// Take a piece of buffer and convert it into a stand-alone\n// TreeBuffer.\nfunction sliceBuf(buf, startI, endI, nodes, positions, off) {\n    if (startI < endI) {\n        let from = buf.buffer[startI + 1];\n        nodes.push(buf.slice(startI, endI, from));\n        positions.push(from - off);\n    }\n}\n// This function takes a node that's in a buffer, and converts it, and\n// its parent buffer nodes, into a Tree. This is again acting on the\n// assumption that the trees and buffers have been constructed by the\n// parse that was ran via the mix parser, and thus aren't shared with\n// any other code, making violations of the immutability safe.\nfunction materialize(cursor) {\n    let { node } = cursor, stack = [];\n    let buffer = node.context.buffer;\n    // Scan up to the nearest tree\n    do {\n        stack.push(cursor.index);\n        cursor.parent();\n    } while (!cursor.tree);\n    // Find the index of the buffer in that tree\n    let base = cursor.tree, i = base.children.indexOf(buffer);\n    let buf = base.children[i], b = buf.buffer, newStack = [i];\n    // Split a level in the buffer, putting the nodes before and after\n    // the child that contains `node` into new buffers.\n    function split(startI, endI, type, innerOffset, length, stackPos) {\n        let targetI = stack[stackPos];\n        let children = [], positions = [];\n        sliceBuf(buf, startI, targetI, children, positions, innerOffset);\n        let from = b[targetI + 1], to = b[targetI + 2];\n        newStack.push(children.length);\n        let child = stackPos\n            ? split(targetI + 4, b[targetI + 3], buf.set.types[b[targetI]], from, to - from, stackPos - 1)\n            : node.toTree();\n        children.push(child);\n        positions.push(from - innerOffset);\n        sliceBuf(buf, b[targetI + 3], endI, children, positions, innerOffset);\n        return new Tree(type, children, positions, length);\n    }\n    base.children[i] = split(0, b.length, NodeType.none, 0, buf.length, stack.length - 1);\n    // Move the cursor back to the target node\n    for (let index of newStack) {\n        let tree = cursor.tree.children[index], pos = cursor.tree.positions[index];\n        cursor.yield(new TreeNode(tree, pos + cursor.from, index, cursor._tree));\n    }\n}\nclass StructureCursor {\n    constructor(root, offset) {\n        this.offset = offset;\n        this.done = false;\n        this.cursor = root.cursor(exports.IterMode.IncludeAnonymous | exports.IterMode.IgnoreMounts);\n    }\n    // Move to the first node (in pre-order) that starts at or after `pos`.\n    moveTo(pos) {\n        let { cursor } = this, p = pos - this.offset;\n        while (!this.done && cursor.from < p) {\n            if (cursor.to >= pos && cursor.enter(p, 1, exports.IterMode.IgnoreOverlays | exports.IterMode.ExcludeBuffers)) ;\n            else if (!cursor.next(false))\n                this.done = true;\n        }\n    }\n    hasNode(cursor) {\n        this.moveTo(cursor.from);\n        if (!this.done && this.cursor.from + this.offset == cursor.from && this.cursor.tree) {\n            for (let tree = this.cursor.tree;;) {\n                if (tree == cursor.tree)\n                    return true;\n                if (tree.children.length && tree.positions[0] == 0 && tree.children[0] instanceof Tree)\n                    tree = tree.children[0];\n                else\n                    break;\n            }\n        }\n        return false;\n    }\n}\nclass FragmentCursor {\n    constructor(fragments) {\n        var _a;\n        this.fragments = fragments;\n        this.curTo = 0;\n        this.fragI = 0;\n        if (fragments.length) {\n            let first = this.curFrag = fragments[0];\n            this.curTo = (_a = first.tree.prop(stoppedInner)) !== null && _a !== void 0 ? _a : first.to;\n            this.inner = new StructureCursor(first.tree, -first.offset);\n        }\n        else {\n            this.curFrag = this.inner = null;\n        }\n    }\n    hasNode(node) {\n        while (this.curFrag && node.from >= this.curTo)\n            this.nextFrag();\n        return this.curFrag && this.curFrag.from <= node.from && this.curTo >= node.to && this.inner.hasNode(node);\n    }\n    nextFrag() {\n        var _a;\n        this.fragI++;\n        if (this.fragI == this.fragments.length) {\n            this.curFrag = this.inner = null;\n        }\n        else {\n            let frag = this.curFrag = this.fragments[this.fragI];\n            this.curTo = (_a = frag.tree.prop(stoppedInner)) !== null && _a !== void 0 ? _a : frag.to;\n            this.inner = new StructureCursor(frag.tree, -frag.offset);\n        }\n    }\n    findMounts(pos, parser) {\n        var _a;\n        let result = [];\n        if (this.inner) {\n            this.inner.cursor.moveTo(pos, 1);\n            for (let pos = this.inner.cursor.node; pos; pos = pos.parent) {\n                let mount = (_a = pos.tree) === null || _a === void 0 ? void 0 : _a.prop(NodeProp.mounted);\n                if (mount && mount.parser == parser) {\n                    for (let i = this.fragI; i < this.fragments.length; i++) {\n                        let frag = this.fragments[i];\n                        if (frag.from >= pos.to)\n                            break;\n                        if (frag.tree == this.curFrag.tree)\n                            result.push({\n                                frag,\n                                pos: pos.from - frag.offset,\n                                mount\n                            });\n                    }\n                }\n            }\n        }\n        return result;\n    }\n}\nfunction punchRanges(outer, ranges) {\n    let copy = null, current = ranges;\n    for (let i = 1, j = 0; i < outer.length; i++) {\n        let gapFrom = outer[i - 1].to, gapTo = outer[i].from;\n        for (; j < current.length; j++) {\n            let r = current[j];\n            if (r.from >= gapTo)\n                break;\n            if (r.to <= gapFrom)\n                continue;\n            if (!copy)\n                current = copy = ranges.slice();\n            if (r.from < gapFrom) {\n                copy[j] = new Range(r.from, gapFrom);\n                if (r.to > gapTo)\n                    copy.splice(j + 1, 0, new Range(gapTo, r.to));\n            }\n            else if (r.to > gapTo) {\n                copy[j--] = new Range(gapTo, r.to);\n            }\n            else {\n                copy.splice(j--, 1);\n            }\n        }\n    }\n    return current;\n}\nfunction findCoverChanges(a, b, from, to) {\n    let iA = 0, iB = 0, inA = false, inB = false, pos = -1e9;\n    let result = [];\n    for (;;) {\n        let nextA = iA == a.length ? 1e9 : inA ? a[iA].to : a[iA].from;\n        let nextB = iB == b.length ? 1e9 : inB ? b[iB].to : b[iB].from;\n        if (inA != inB) {\n            let start = Math.max(pos, from), end = Math.min(nextA, nextB, to);\n            if (start < end)\n                result.push(new Range(start, end));\n        }\n        pos = Math.min(nextA, nextB);\n        if (pos == 1e9)\n            break;\n        if (nextA == pos) {\n            if (!inA)\n                inA = true;\n            else {\n                inA = false;\n                iA++;\n            }\n        }\n        if (nextB == pos) {\n            if (!inB)\n                inB = true;\n            else {\n                inB = false;\n                iB++;\n            }\n        }\n    }\n    return result;\n}\n// Given a number of fragments for the outer tree, and a set of ranges\n// to parse, find fragments for inner trees mounted around those\n// ranges, if any.\nfunction enterFragments(mounts, ranges) {\n    let result = [];\n    for (let { pos, mount, frag } of mounts) {\n        let startPos = pos + (mount.overlay ? mount.overlay[0].from : 0), endPos = startPos + mount.tree.length;\n        let from = Math.max(frag.from, startPos), to = Math.min(frag.to, endPos);\n        if (mount.overlay) {\n            let overlay = mount.overlay.map(r => new Range(r.from + pos, r.to + pos));\n            let changes = findCoverChanges(ranges, overlay, from, to);\n            for (let i = 0, pos = from;; i++) {\n                let last = i == changes.length, end = last ? to : changes[i].from;\n                if (end > pos)\n                    result.push(new TreeFragment(pos, end, mount.tree, -startPos, frag.from >= pos || frag.openStart, frag.to <= end || frag.openEnd));\n                if (last)\n                    break;\n                pos = changes[i].to;\n            }\n        }\n        else {\n            result.push(new TreeFragment(from, to, mount.tree, -startPos, frag.from >= startPos || frag.openStart, frag.to <= endPos || frag.openEnd));\n        }\n    }\n    return result;\n}\n\nexports.DefaultBufferLength = DefaultBufferLength;\nexports.MountedTree = MountedTree;\nexports.NodeProp = NodeProp;\nexports.NodeSet = NodeSet;\nexports.NodeType = NodeType;\nexports.NodeWeakMap = NodeWeakMap;\nexports.Parser = Parser;\nexports.Tree = Tree;\nexports.TreeBuffer = TreeBuffer;\nexports.TreeCursor = TreeCursor;\nexports.TreeFragment = TreeFragment;\nexports.parseMixed = parseMixed;\n","import { Exercise } from \"./exercise\";\nimport { Reps } from \"./set\";\nimport { Block, IBlockRef, IBlockStep } from \"./block\";\nimport { Weight } from \"./weight\";\nimport { DateUtils } from \"../utils/date\";\nimport { lf, lb } from \"lens-shmens\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { IDispatch } from \"@client/ducks/types\";\nimport { ScriptRunner } from \"../parser\";\n\nimport { IEvaluatedProgram, Program } from \"./program\";\nimport { IState, updateProgress, updateState } from \"./state\";\nimport {\n  IWeight,\n  IHistoryEntry,\n  ISettings,\n  IHistoryRecord,\n  IProgressMode,\n  IExerciseType,\n  IProgressUi,\n  IProgramState,\n  IEquipment,\n  ISet,\n  IDayData,\n  IExerciseDataValue,\n  IUnit,\n  IStats,\n} from \"../types\";\nimport { SendMessage } from \"@client/utils/sendMessage\";\nimport { IPercentage, ILevelChange } from \"../types\";\nimport { History } from \"./history\";\nimport { CollectionUtils } from \"../utils/collection\";\nimport { ILiftoscriptEvaluatorUpdate } from \"../liftoscriptEvaluator\";\nimport { Equipment } from \"./equipment\";\nimport { IByTag } from \"@client/pages/planner/plannerEvaluator\";\nimport { IPlannerProgramExercise, IPlannerProgramExerciseWithType } from \"@client/pages/planner/models/types\";\nimport { PlannerProgramExercise } from \"@client/pages/planner/models/plannerProgramExercise\";\nimport { IScreenStack, Screen } from \"./screen\";\nimport { UidFactory } from \"../utils/generator\";\nimport { ProgramSet } from \"./programSet\";\nimport { Stats } from \"./stats\";\nimport { BlockLogging } from \"./blockLogging\";\nimport { Thunk } from \"@client/ducks/thunks\";\n\nexport interface IScriptBindings {\n  day: number;\n  week: number;\n  dayInWeek: number;\n  originalWeights: (IWeight | IPercentage)[];\n  weights: (IWeight | undefined)[];\n  completedWeights: (IWeight | undefined)[];\n  rm1: IWeight;\n  reps: (number | undefined)[];\n  minReps: (number | undefined)[];\n  amraps: (number | undefined)[];\n  askweights: (number | undefined)[];\n  logrpes: (number | undefined)[];\n  timers: (number | undefined)[];\n  setTimers: (number | undefined)[];\n  completedSetTimers: (number | undefined)[];\n  RPE: (number | undefined)[];\n  completedRPE: (number | undefined)[];\n  completedReps: (number | undefined)[];\n  completedRepsLeft: (number | undefined)[];\n  isCompleted: (0 | 1)[];\n  w: (IWeight | undefined)[];\n  r: (number | undefined)[];\n  mr: (number | undefined)[];\n  cr: (number | undefined)[];\n  cw: (IWeight | undefined)[];\n  ns: number;\n  programNumberOfSets: number;\n  numberOfSets: number;\n  completedNumberOfSets: number;\n  setVariationIndex: number;\n  bodyweight: IWeight;\n  descriptionIndex: number;\n  setIndex: number;\n  manualLevel: number;\n}\n\nexport interface IScriptFnContext {\n  prints: (number | IWeight | IPercentage)[][];\n  unit: IUnit;\n  exerciseType?: IExerciseType;\n}\n\nexport interface IScriptFinishContext {\n  type: \"finish\";\n  updates: ILiftoscriptEvaluatorUpdate[];\n  exerciseData: IExerciseDataValue;\n  setVariationIndex: number;\n  descriptionIndex: number;\n}\n\nexport interface IScriptUpdateContext {\n  equipment?: IEquipment;\n}\n\nexport interface IScriptFunctions {\n  roundWeight: (num: IWeight, context: IScriptFnContext) => IWeight;\n  calculateTrainingMax: (weight: IWeight, reps: number, context: IScriptFnContext) => IWeight;\n  calculate1RM: (weight: IWeight, reps: number, context: IScriptFnContext) => IWeight;\n  rpeMultiplier: (reps: number, rpe: number, context: IScriptFnContext) => number;\n  floor(num: number): number;\n  floor(num: IWeight): IWeight;\n  ceil(num: number): number;\n  ceil(num: IWeight): IWeight;\n  round(num: number): number;\n  round(num: IWeight): IWeight;\n  sum(vals: number[]): number;\n  sum(vals: IWeight[]): IWeight;\n  min(vals: number[]): number;\n  min(vals: IWeight[]): IWeight;\n  max(vals: number[]): number;\n  max(vals: IWeight[]): IWeight;\n  zeroOrGte(a: number[] | IWeight[], b: number[] | IWeight[]): boolean;\n  print(...args: unknown[]): (typeof args)[0];\n  increment(val: IWeight, context: IScriptFnContext): IWeight;\n  increment(val: IPercentage, context: IScriptFnContext): IPercentage;\n  increment(val: number, context: IScriptFnContext): number;\n  decrement(val: IWeight, context: IScriptFnContext): IWeight;\n  decrement(val: IPercentage, context: IScriptFnContext): IPercentage;\n  decrement(val: number, context: IScriptFnContext): number;\n  sets(\n    from: number,\n    to: number,\n    minReps: number,\n    reps: number,\n    isAmrap: number,\n    weight: IWeight | IPercentage | number,\n    timer: number,\n    rpe: number,\n    logRpe: number,\n    context: IScriptFnContext,\n    bindings: IScriptBindings\n  ): number;\n}\n\nfunction floor(num: number): number;\nfunction floor(num: IWeight): IWeight;\nfunction floor(num: IWeight | number): IWeight | number {\n  if (num == null) {\n    return 0;\n  }\n  return typeof num === \"number\" ? Math.floor(num) : Weight.build(Math.floor(num.value), num.unit);\n}\n\nfunction ceil(num: number): number;\nfunction ceil(num: IWeight): IWeight;\nfunction ceil(num: IWeight | number): IWeight | number {\n  if (num == null) {\n    return 0;\n  }\n  return typeof num === \"number\" ? Math.ceil(num) : Weight.build(Math.ceil(num.value), num.unit);\n}\n\nfunction round(num: number): number;\nfunction round(num: IWeight): IWeight;\nfunction round(num: IWeight | number): IWeight | number {\n  if (num == null) {\n    return 0;\n  }\n  return typeof num === \"number\" ? Math.round(num) : Weight.build(Math.round(num.value), num.unit);\n}\n\nfunction sum(vals: number[]): number;\nfunction sum(vals: IWeight[]): IWeight;\nfunction sum(vals: IWeight[] | number[]): IWeight | number {\n  const firstElement = vals[0];\n  if (firstElement == null) {\n    return 0;\n  }\n  if (typeof firstElement === \"number\") {\n    return (vals as number[]).reduce((acc, a) => acc + (a || 0), 0);\n  } else {\n    return (vals as IWeight[]).reduce((acc, a) => Weight.add(acc, a || 0), Weight.build(0, firstElement.unit));\n  }\n}\n\nfunction min(vals: number[]): number;\nfunction min(vals: IWeight[]): IWeight;\nfunction min(vals: IWeight[] | number[]): IWeight | number {\n  const firstElement = vals[0];\n  if (firstElement == null) {\n    return 0;\n  }\n  if (typeof firstElement === \"number\") {\n    vals = vals.map((v) => v ?? 0) as number[];\n    return Math.min(...(vals as number[]));\n  } else {\n    vals = vals.map((v) => v ?? Weight.build(0, \"lb\")) as IWeight[];\n    const sortedWeights = (vals as IWeight[]).sort((a, b) => Weight.compare(a, b));\n    return sortedWeights[0];\n  }\n}\n\nfunction max(vals: number[]): number;\nfunction max(vals: IWeight[]): IWeight;\nfunction max(vals: IWeight[] | number[]): IWeight | number {\n  const firstElement = vals[0];\n  if (firstElement == null) {\n    return 0;\n  }\n  if (typeof firstElement === \"number\") {\n    vals = vals.map((v) => v ?? 0) as number[];\n    return Math.max(...(vals as number[]));\n  } else {\n    vals = vals.map((v) => v ?? Weight.build(0, \"lb\")) as IWeight[];\n    const sortedWeights = (vals as IWeight[]).sort((a, b) => Weight.compare(b, a));\n    return sortedWeights[0];\n  }\n}\n\nfunction zeroOrGte(a: IWeight[] | number[], b: IWeight[] | number[]): boolean {\n  for (let i = 0; i < Math.max(a.length, b.length); i++) {\n    const aVal = a[i];\n    const bVal = b[i];\n    if (aVal != null && bVal != null && !Weight.eq(aVal, 0) && Weight.lt(aVal, bVal)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport namespace Progress {\n  export function createEmptyScriptBindings(\n    dayData: IDayData,\n    settings: ISettings,\n    exercise?: IExerciseType\n  ): IScriptBindings {\n    const rm1 = exercise ? Exercise.onerm(exercise, settings) : Weight.build(0, \"lb\");\n    return {\n      day: dayData.day,\n      week: dayData.week ?? 1,\n      dayInWeek: dayData.dayInWeek ?? dayData.day,\n      completedWeights: [],\n      originalWeights: [],\n      weights: [],\n      reps: [],\n      minReps: [],\n      RPE: [],\n      amraps: [],\n      logrpes: [],\n      askweights: [],\n      completedReps: [],\n      completedRepsLeft: [],\n      completedRPE: [],\n      isCompleted: [],\n      timers: [],\n      setTimers: [],\n      completedSetTimers: [],\n      w: [],\n      r: [],\n      cr: [],\n      cw: [],\n      mr: [],\n      programNumberOfSets: 0,\n      numberOfSets: 0,\n      completedNumberOfSets: 0,\n      ns: 0,\n      setVariationIndex: 1,\n      descriptionIndex: 1,\n      bodyweight: Weight.build(0, settings.units),\n      setIndex: 1,\n      manualLevel: 0,\n      rm1,\n    };\n  }\n\n  export function createScriptBindings(\n    dayData: IDayData,\n    entry: IHistoryEntry,\n    settings: ISettings,\n    programNumberOfSets: number,\n    bodyweight: IWeight | undefined,\n    setIndex?: number,\n    setVariationIndex?: number,\n    descriptionIndex?: number\n  ): IScriptBindings {\n    const bindings = createEmptyScriptBindings(dayData, settings, entry.exercise);\n    for (const set of entry.sets) {\n      bindings.weights.push(set.weight);\n      bindings.originalWeights.push(set.originalWeight ?? Weight.build(0, settings.units));\n      bindings.reps.push(set.reps);\n      bindings.minReps.push(set.minReps);\n      bindings.completedReps.push(set.completedReps);\n      bindings.completedRepsLeft.push(set.completedRepsLeft);\n      bindings.completedRPE.push(set.completedRpe);\n      bindings.completedWeights.push(set.completedWeight);\n      bindings.RPE.push(set.rpe);\n      bindings.amraps.push(set.isAmrap ? 1 : undefined);\n      bindings.logrpes.push(set.logRpe ? 1 : undefined);\n      bindings.askweights.push(set.askWeight ? 1 : undefined);\n      bindings.timers.push(set.timer);\n      bindings.setTimers.push(set.setTimer);\n      bindings.completedSetTimers.push(set.completedSetTimer);\n      bindings.isCompleted.push(set.isCompleted ? 1 : 0);\n    }\n    bindings.w = bindings.weights;\n    bindings.r = bindings.reps;\n    bindings.cr = bindings.completedReps;\n    bindings.cw = bindings.completedWeights;\n    bindings.mr = bindings.minReps;\n    bindings.ns = entry.sets.length;\n    bindings.programNumberOfSets = programNumberOfSets;\n    bindings.numberOfSets = entry.sets.length;\n    bindings.completedNumberOfSets = entry.sets.filter((s) => s.isCompleted).length;\n    bindings.setIndex = setIndex ?? 1;\n    bindings.setVariationIndex = setVariationIndex ?? 1;\n    bindings.descriptionIndex = descriptionIndex ?? 1;\n    bindings.bodyweight = bodyweight ?? Weight.build(0, settings.units);\n    return bindings;\n  }\n\n  export function createScriptFunctions(settings: ISettings): IScriptFunctions {\n    function increment(vals: number, context: IScriptFnContext): number;\n    function increment(vals: IWeight, context: IScriptFnContext): IWeight;\n    function increment(vals: IPercentage, context: IScriptFnContext): IPercentage;\n    function increment(\n      vals: IWeight | IPercentage | number,\n      context: IScriptFnContext\n    ): IWeight | IPercentage | number {\n      if (typeof vals === \"number\") {\n        const weight = Weight.build(vals, context.unit);\n        return Weight.increment(weight, settings, context.exerciseType);\n      } else if (Weight.isPct(vals)) {\n        return Weight.buildPct(vals.value + 1);\n      } else {\n        return Weight.increment(vals, settings, context.exerciseType);\n      }\n    }\n\n    function decrement(vals: number, context: IScriptFnContext): number;\n    function decrement(vals: IWeight, context: IScriptFnContext): IWeight;\n    function decrement(vals: IPercentage, context: IScriptFnContext): IPercentage;\n    function decrement(\n      vals: IWeight | IPercentage | number,\n      context: IScriptFnContext\n    ): IWeight | IPercentage | number {\n      if (typeof vals === \"number\") {\n        const weight = Weight.build(vals, context.unit);\n        return Weight.decrement(weight, settings, context.exerciseType);\n      } else if (Weight.isPct(vals)) {\n        return Weight.buildPct(vals.value - 1);\n      } else {\n        return Weight.decrement(vals, settings, context.exerciseType);\n      }\n    }\n\n    const fns: IScriptFunctions = {\n      roundWeight: (num, context) => {\n        if (!Weight.is(num)) {\n          num = Weight.build(num, settings.units);\n        }\n        const unit = Equipment.getUnitForExerciseType(settings, context?.exerciseType);\n        return Weight.round(num, settings, unit ?? settings.units, context?.exerciseType);\n      },\n      calculateTrainingMax: (weight, reps, context) => {\n        if (!Weight.is(weight)) {\n          weight = Weight.build(weight, settings.units);\n        }\n        return Weight.getTrainingMax(weight, reps || 0, settings);\n      },\n      calculate1RM: (weight, reps, context) => {\n        if (!Weight.is(weight)) {\n          weight = Weight.build(weight, settings.units);\n        }\n        return Weight.getOneRepMax(weight, reps);\n      },\n      rpeMultiplier: (repsRaw, rpeRawOrContext, context) => {\n        const reps = Weight.is(repsRaw) ? repsRaw.value : typeof repsRaw === \"number\" ? repsRaw : 1;\n        const rpe =\n          typeof rpeRawOrContext === \"number\" && context != null\n            ? Weight.is(rpeRawOrContext)\n              ? rpeRawOrContext.value\n              : typeof rpeRawOrContext === \"number\"\n                ? rpeRawOrContext\n                : 10\n            : 10;\n        return Weight.rpeMultiplier(reps, rpe);\n      },\n      floor,\n      ceil,\n      round,\n      sum,\n      min,\n      max,\n      increment,\n      decrement,\n      zeroOrGte,\n      print: (...fnArgs) => {\n        fnArgs.pop();\n        const context = fnArgs.pop() as IScriptFnContext;\n        const args = [...fnArgs] as (number | IWeight | IPercentage)[];\n        context.prints = context.prints || [];\n        context.prints.push(args);\n        return args[0];\n      },\n      sets(\n        from: number,\n        to: number,\n        minReps: number,\n        reps: number,\n        isAmrap: number,\n        weight: IWeight | IPercentage | number,\n        timer: number,\n        rpe: number,\n        logRpe: number,\n        context: IScriptFnContext,\n        bindings: IScriptBindings\n      ): number {\n        for (let i = 0; i < bindings.numberOfSets; i++) {\n          if (i >= from - 1 && i < to) {\n            const weightValue = Weight.convertToWeight(bindings.rm1, weight, context.unit);\n            bindings.minReps[i] = reps !== minReps ? minReps : undefined;\n            bindings.reps[i] = reps;\n            bindings.originalWeights[i] = weightValue;\n            bindings.weights[i] = Weight.round(weightValue, settings, context.unit, context.exerciseType);\n            bindings.RPE[i] = rpe !== 0 ? rpe : undefined;\n            bindings.amraps[i] = isAmrap !== 0 ? 1 : 0;\n            bindings.logrpes[i] = logRpe !== 0 ? 1 : 0;\n            bindings.timers[i] = timer !== 0 ? timer : undefined;\n          }\n        }\n        return to - from;\n      },\n    };\n    return fns;\n  }\n\n  export function isCurrent(progress: IHistoryRecord): boolean {\n    return progress.id === 0;\n  }\n\n  export function startTimer(\n    progress: IHistoryRecord,\n    timestamp: number,\n    mode: IProgressMode,\n    entryIndex: number,\n    setIndex: number,\n    settings: ISettings,\n    timer?: number,\n    isAdjusting?: boolean\n  ): IHistoryRecord {\n    const entry = progress.entries[entryIndex];\n    const set = mode === \"warmup\" ? entry?.warmupSets[setIndex] : entry?.sets[setIndex];\n    // A run starts the rest of a set that is not done (a Skip), so the gate is open during a run.\n    if (!isAdjusting && (!set || (!set.isCompleted && progress.blockRun == null))) {\n      return progress;\n    }\n    if (timer == null && Progress.isCurrent(progress) && mode === \"workout\") {\n      timer = entry?.sets[setIndex]?.timer;\n    }\n    if (timer == null) {\n      timer =\n        mode === \"workout\" && entry.superset != null && settings.timers.superset != null\n          ? settings.timers.superset\n          : (settings.timers[mode] ?? undefined);\n    }\n    // An explicit 0s rest (e.g. a block member with `|0s`) is a real, zero-length timer, not a missing\n    // one - `!timer` treated 0 as falsy and cleared the timer fields, corrupting the block runner's\n    // current-step lookup (spec C2, candidate 4). Only a genuinely unset timer clears these fields.\n    if (timer == null) {\n      return {\n        ...progress,\n        timerSince: undefined,\n        timer: undefined,\n        timerMode: undefined,\n        timerEntryIndex: undefined,\n        timerSetIndex: undefined,\n      };\n    }\n    const timerForPush = timer - Math.round((Date.now() - timestamp) / 1000);\n    // A paused run schedules no alert. `resumeBlock` leaves the flag unset, so the rest view schedules it then.\n    if (!progress.blockRun?.isPaused) {\n      Progress.sendNativeTimer(progress, mode, entryIndex, setIndex, settings, timerForPush);\n    }\n    const newProgress: IHistoryRecord = {\n      ...progress,\n      timerSince: timestamp,\n      timer,\n      timerMode: mode,\n      timerEntryIndex: entryIndex,\n      timerSetIndex: setIndex,\n      ui: { ...progress.ui, nativeNotificationScheduled: undefined },\n    };\n    return newProgress;\n  }\n\n  // Schedules the native end alert of a rest. `timeLeft` is in seconds. It texts the next set.\n  export function sendNativeTimer(\n    progress: IHistoryRecord,\n    mode: \"workout\" | \"warmup\",\n    entryIndex: number,\n    setIndex: number,\n    settings: ISettings,\n    timeLeft: number\n  ): void {\n    const timerForPush = timeLeft;\n    const title = \"It's time for the next set!\";\n    let subtitle = \"\";\n    let body = \"Time to lift!\";\n    let subtitleHeader = \"\";\n    let bodyHeader = \"The rest is over\";\n    const nextRunTarget = progress.blockRun\n      ? Block.getNextRunTarget(progress, entryIndex, setIndex, settings)\n      : undefined;\n    const nextRunEntry = nextRunTarget != null ? progress.entries[nextRunTarget.entryIndex] : undefined;\n    const nextRunSet = nextRunEntry?.sets[nextRunTarget!.setIndex];\n    const nextEntryAndSet =\n      progress.blockRun != null\n        ? nextRunEntry != null && nextRunSet != null\n          ? { entry: nextRunEntry, set: nextRunSet }\n          : undefined\n        : Reps.findNextEntryAndSet(progress, entryIndex, mode);\n    if (nextEntryAndSet != null) {\n      const { entry: nextEntry, set: aSet } = nextEntryAndSet;\n      const exercise = Exercise.get(nextEntry.exercise, settings.exercises);\n      if (exercise) {\n        subtitleHeader = \"Next Set\";\n        subtitle = CollectionUtils.compact([\n          exercise.name,\n          aSet.reps != null ? `${aSet.reps}${aSet.isAmrap ? \"+\" : \"\"} reps` : undefined,\n          aSet.weight != null ? Weight.display(aSet.weight) : undefined,\n        ]).join(\", \");\n        if (aSet.weight != null && Equipment.hasPlatesPerSide(settings, nextEntry.exercise)) {\n          const { plates } = Weight.calculatePlates(aSet.weight, settings, aSet.weight.unit, nextEntry.exercise);\n          const formattedPlates = plates.length > 0 ? Weight.formatOneSide(settings, plates, exercise) : \"None\";\n          bodyHeader = \"Plates per side\";\n          body = formattedPlates;\n        }\n      }\n    }\n    const ignoreDoNotDisturb = settings.ignoreDoNotDisturb ? \"true\" : \"false\";\n    const vibration = settings.vibration ? \"true\" : \"false\";\n    const volume = settings.volume.toString();\n    SendMessage.print(`Scheduling timer notification, volume: ${volume}`);\n    SendMessage.toIos({\n      type: \"startTimer\",\n      duration: timerForPush.toString(),\n      mode,\n      title,\n      subtitleHeader,\n      subtitle,\n      bodyHeader,\n      body,\n      ignoreDoNotDisturb,\n      vibration,\n      volume,\n    });\n    SendMessage.toAndroid({\n      type: \"startTimer\",\n      duration: timerForPush.toString(),\n      mode,\n      title,\n      subtitleHeader,\n      subtitle,\n      bodyHeader,\n      body,\n      ignoreDoNotDisturb,\n      vibration,\n      volume,\n    });\n  }\n\n  // Stops the native end alert only. Unlike `stopTimer`, it keeps the timer fields.\n  export function sendNativeStopTimer(): void {\n    SendMessage.toIos({ type: \"stopTimer\" });\n    SendMessage.toAndroid({ type: \"stopTimer\" });\n  }\n\n  export function startSetTimer(\n    progress: IHistoryRecord,\n    timestamp: number,\n    entryIndex: number,\n    setIndex: number,\n    timer?: number\n  ): IHistoryRecord {\n    const entry = progress.entries[entryIndex];\n    const set = entry?.sets[setIndex];\n    // A work step of a run starts before its set is done.\n    if (!set || (!set.isCompleted && progress.blockRun == null)) {\n      return progress;\n    }\n    if (timer == null) {\n      timer = set.setTimer;\n    }\n    if (!timer) {\n      return {\n        ...progress,\n        setTimerSince: undefined,\n        setTimerMode: undefined,\n        setTimerEntryIndex: undefined,\n        setTimerSetIndex: undefined,\n      };\n    }\n    return {\n      ...progress,\n      setTimerSince: timestamp,\n      setTimerMode: \"workout\",\n      setTimerEntryIndex: entryIndex,\n      setTimerSetIndex: setIndex,\n    };\n  }\n\n  // The next work step of a run starts: the rest timer stops, the set timer starts. The set is not done.\n  export function startRunWorkStep(\n    progress: IHistoryRecord,\n    timestamp: number,\n    entryIndex: number,\n    setIndex: number\n  ): IHistoryRecord {\n    return Progress.startSetTimer(Progress.stopTimer(progress), timestamp, entryIndex, setIndex);\n  }\n\n  // Ends a work step: writes the time, sets `isCompleted` (never a toggle) and fills the completed values the\n  // way `completeAmrapSet` does. It opens no prompt. A set that is done already stays as it is.\n  export function completeTimerSet(\n    progress: IHistoryRecord,\n    entryIndex: number,\n    setIndex: number,\n    completedSetTimer: number | undefined,\n    timestamp: number,\n    settings: ISettings\n  ): IHistoryRecord {\n    const entry = progress.entries[entryIndex];\n    const set = entry?.sets[setIndex];\n    if (!entry || !set || set.isCompleted) {\n      return progress;\n    }\n    const isUnilateral = Exercise.getIsUnilateral(entry.exercise, settings);\n    return lf(progress)\n      .p(\"entries\")\n      .i(entryIndex)\n      .p(\"sets\")\n      .i(setIndex)\n      .modify((progressSet) => ({\n        ...progressSet,\n        completedSetTimer: completedSetTimer ?? progressSet.completedSetTimer,\n        timestamp,\n        completedRepsLeft: isUnilateral ? (progressSet.completedRepsLeft ?? progressSet.reps) : undefined,\n        completedReps: progressSet.completedReps ?? progressSet.reps,\n        completedWeight: progressSet.completedWeight ?? progressSet.weight,\n        isCompleted: true,\n      }));\n  }\n\n  // What follows a work step that just ended. A set with a rest starts that rest. A set with no rest goes\n  // to the next work step at once, or ends the run when it was the last step.\n  export function startAfterWorkStep(\n    progress: IHistoryRecord,\n    timestamp: number,\n    entryIndex: number,\n    setIndex: number,\n    settings: ISettings\n  ): IHistoryRecord {\n    const blockRun = progress.blockRun;\n    if (blockRun != null) {\n      const steps = Block.getSteps(progress.entries, blockRun, settings);\n      const index = steps.findIndex(\n        (step) => step.type === \"work\" && step.entryIndex === entryIndex && step.setIndex === setIndex\n      );\n      if (index !== -1) {\n        const following = steps[index + 1];\n        if (\n          following?.type === \"break\" &&\n          following.afterEntryIndex === entryIndex &&\n          following.afterSetIndex === setIndex\n        ) {\n          return Progress.startTimer(\n            progress,\n            timestamp,\n            \"workout\",\n            entryIndex,\n            setIndex,\n            settings,\n            following.durationSeconds\n          );\n        }\n        const next = Block.nextStep(steps, progress.entries, index);\n        const nextStep = next != null ? steps[next] : undefined;\n        if (nextStep?.type === \"work\") {\n          return Progress.startRunWorkStep(progress, timestamp, nextStep.entryIndex, nextStep.setIndex);\n        }\n        return Progress.endBlockRun(progress, { openLog: Progress.shouldOpenRunLog(progress) });\n      }\n    }\n    return Progress.startTimer(progress, timestamp, \"workout\", entryIndex, setIndex, settings);\n  }\n\n  // Skip: the set stays not done. Its rest starts, or the next work step when it has no rest.\n  export function skipWorkStep(\n    progress: IHistoryRecord,\n    timestamp: number,\n    entryIndex: number,\n    setIndex: number,\n    settings: ISettings\n  ): IHistoryRecord {\n    return Progress.startAfterWorkStep(Progress.stopSetTimer(progress), timestamp, entryIndex, setIndex, settings);\n  }\n\n  // Skip rest: the rest stops. The next work step starts at once, or the run ends when there is none.\n  // No set changes its done state.\n  export function skipRunRest(progress: IHistoryRecord, timestamp: number, settings: ISettings): IHistoryRecord {\n    const blockRun = progress.blockRun;\n    const { timerEntryIndex, timerSetIndex } = progress;\n    if (!blockRun || timerEntryIndex == null || timerSetIndex == null) {\n      return progress;\n    }\n    const target = Block.getNextRunTarget(progress, timerEntryIndex, timerSetIndex, settings);\n    if (target) {\n      return Progress.startRunWorkStep(progress, timestamp, target.entryIndex, target.setIndex);\n    }\n    return Progress.endBlockRun(progress, { openLog: Progress.shouldOpenRunLog(progress) });\n  }\n\n  // Back, Done and Skip work while paused. The run stays paused on the new step with its full time:\n  // `pausedAt` moves to `now`, the start of the new step, so Resume counts down from the full time.\n  // `before` is the run before the action. A run that ended stays ended.\n  export function keepPaused(before: IHistoryRecord, after: IHistoryRecord, now: number): IHistoryRecord {\n    if (!before.blockRun?.isPaused || !after.blockRun) {\n      return after;\n    }\n    return { ...after, blockRun: { ...after.blockRun, isPaused: true, pausedAt: now } };\n  }\n\n  // The time a step has run. A paused run counts up to the pause, so the shown time does not move.\n  export function stepElapsedMs(progress: IHistoryRecord, since: number, now: number): number {\n    const blockRun = progress.blockRun;\n    const end = blockRun?.isPaused && blockRun.pausedAt != null ? blockRun.pausedAt : now;\n    return end - since;\n  }\n\n  // Back: within this time of a step start, Back goes to the previous step. Later, it restarts the step.\n  export const backRestartWindowMs = 3000;\n\n  // `getCurrentStep` builds its own step list, so a step is found by its set, not by identity.\n  function stepIndex(steps: IBlockStep[], step: IBlockStep): number {\n    return steps.findIndex((other) =>\n      step.type === \"work\"\n        ? other.type === \"work\" && other.entryIndex === step.entryIndex && other.setIndex === step.setIndex\n        : other.type === \"break\" &&\n          other.afterEntryIndex === step.afterEntryIndex &&\n          other.afterSetIndex === step.afterSetIndex\n    );\n  }\n\n  // Back: restarts the current step of a run, or goes to the previous one (the music-player rule). Step 0\n  // does nothing. A paused run stays paused on the new step. A previous work step that is done is cleared. A rest starts\n  // with its full time. Known limit: clearing a set does not undo its `update: custom()` script.\n  export function backStep(progress: IHistoryRecord, now: number, settings: ISettings): IHistoryRecord {\n    const blockRun = progress.blockRun;\n    if (!blockRun) {\n      return progress;\n    }\n    const steps = Block.getSteps(progress.entries, blockRun, settings);\n    const current = Block.getCurrentStep(progress, settings);\n    const index = current != null ? stepIndex(steps, current) : -1;\n    if (current == null || index <= 0) {\n      return progress;\n    }\n    const since = current.type === \"work\" ? progress.setTimerSince : progress.timerSince;\n    if (since == null) {\n      return progress;\n    }\n    const target =\n      Progress.stepElapsedMs(progress, since, now) > Progress.backRestartWindowMs ? current : steps[index - 1];\n    return Progress.keepPaused(progress, startBackTarget(progress, target, now, settings), now);\n  }\n\n  function startBackTarget(\n    progress: IHistoryRecord,\n    target: IBlockStep,\n    now: number,\n    settings: ISettings\n  ): IHistoryRecord {\n    if (target.type === \"break\") {\n      return Progress.startTimer(\n        Progress.stopSetTimer(progress),\n        now,\n        \"workout\",\n        target.afterEntryIndex,\n        target.afterSetIndex,\n        settings,\n        target.durationSeconds\n      );\n    }\n    const cleared = progress.entries[target.entryIndex]?.sets[target.setIndex]?.isCompleted\n      ? Progress.clearTimerSet(progress, target.entryIndex, target.setIndex)\n      : progress;\n    return Progress.startRunWorkStep(cleared, now, target.entryIndex, target.setIndex);\n  }\n\n  // Redo: a done timer set becomes not done again. Its time and completed values are cleared.\n  export function clearTimerSet(progress: IHistoryRecord, entryIndex: number, setIndex: number): IHistoryRecord {\n    const cleared = lf(progress)\n      .p(\"entries\")\n      .i(entryIndex)\n      .p(\"sets\")\n      .i(setIndex)\n      .modify((progressSet) => ({\n        ...progressSet,\n        isCompleted: false,\n        completedSetTimer: undefined,\n        completedReps: undefined,\n        completedRepsLeft: undefined,\n        completedWeight: undefined,\n        timestamp: undefined,\n      }));\n    return clearSingleBlockLog(cleared, entryIndex);\n  }\n\n  // Redo of a set in a single block (no superset) removes what the run-end log wrote: `loggedAt`, the RPE on the\n  // sets and the `logRpe` marks that the log added. A group path does not change.\n  function clearSingleBlockLog(progress: IHistoryRecord, entryIndex: number): IHistoryRecord {\n    const entry = progress.entries[entryIndex];\n    if (entry.block == null || entry.superset != null || entry.block.loggedAt == null) {\n      return progress;\n    }\n    const addedIndexes = entry.block.rpeSetIndexes ?? [];\n    const sets = entry.sets.map((set, index) => {\n      if (set.logRpe !== true) {\n        return set;\n      }\n      return addedIndexes.includes(index)\n        ? { ...set, completedRpe: undefined, logRpe: undefined }\n        : { ...set, completedRpe: undefined };\n    });\n    const { loggedAt: _loggedAt, rpeSetIndexes: _rpeSetIndexes, ...block } = entry.block;\n    const entries = progress.entries.map((e, i) => (i === entryIndex ? { ...entry, sets, block } : e));\n    return { ...progress, entries };\n  }\n\n  // Restart: clears every set of the circuit and the values that the block log wrote, and removes the logged\n  // mark. Closes the log modal when it names this block. Other entries stay as they are.\n  export function resetBlock(progress: IHistoryRecord, blockName: string): IHistoryRecord {\n    const entries = progress.entries.map((entry, entryIndex) => {\n      if (entry.superset !== blockName || entry.block == null) {\n        return entry;\n      }\n      const cleared = entry.sets.reduce(\n        (acc, _set, setIndex) => Progress.clearTimerSet(acc, entryIndex, setIndex),\n        progress\n      ).entries[entryIndex];\n      const sets = cleared.sets.map((set) => ({ ...set, completedRpe: undefined, logRpe: undefined }));\n      return { ...entry, sets, block: { ...entry.block, loggedAt: undefined } };\n    });\n    const modal = progress.ui?.blockLogModal;\n    const ui = modal?.blockName === blockName ? { ...progress.ui, blockLogModal: undefined } : progress.ui;\n    return { ...progress, entries, ui };\n  }\n\n  export function shouldAutoAdvance(\n    progress: IHistoryRecord,\n    now: number,\n    settings: ISettings\n  ): { entryIndex: number; setIndex: number } | undefined {\n    if (progress.blockRun?.isPaused) {\n      return undefined;\n    }\n    const { timer, timerSince, timerMode, timerEntryIndex, timerSetIndex } = progress;\n    if (timer == null || timerSince == null || timerMode == null || timerEntryIndex == null || timerSetIndex == null) {\n      return undefined;\n    }\n    if (now - timerSince <= timer * 1000) {\n      return undefined;\n    }\n    const entry = progress.entries[timerEntryIndex];\n    const set = timerMode === \"warmup\" ? entry?.warmupSets[timerSetIndex] : entry?.sets[timerSetIndex];\n    if (!entry || !set) {\n      return undefined;\n    }\n    const blockRun = progress.blockRun;\n    if (blockRun != null) {\n      // In a run the next step comes from the run's steps, never from \"first not-done set\".\n      const isMember =\n        blockRun.entryIndex != null ? timerEntryIndex === blockRun.entryIndex : entry.superset === blockRun.name;\n      if (timerMode !== \"workout\" || !isMember) {\n        return undefined;\n      }\n      return Block.getNextRunTarget(progress, timerEntryIndex, timerSetIndex, settings);\n    }\n    // A single block (no superset) is never auto; only a group block is.\n    const isAuto = !!set.isAuto || (entry.block != null && entry.superset != null);\n    if (!isAuto) {\n      return undefined;\n    }\n    const target = Reps.findNextEntryAndSetIndex(progress, timerEntryIndex, timerMode);\n    if (target != null && entry.block != null) {\n      // A block ends at its own terminal break; never auto-complete a set outside it\n      const targetEntry = progress.entries[target.entryIndex];\n      // A group block compares the superset name. A single block has no superset, so it compares the entry.\n      const isSameBlock =\n        entry.superset != null\n          ? targetEntry?.block != null && targetEntry.superset === entry.superset\n          : targetEntry === entry;\n      if (!isSameBlock) {\n        return undefined;\n      }\n    }\n    return target;\n  }\n\n  export function getNextSupersetEntry(entries: IHistoryEntry[], entry: IHistoryEntry): IHistoryEntry | undefined {\n    const superset: string | undefined = entry.superset;\n    if (superset == null) {\n      return undefined;\n    }\n    const supersetGroups = getSupersetGroups(entries);\n    const supersetGroup: IHistoryEntry[] = supersetGroups?.[superset] ?? [];\n    if (supersetGroup.length <= 1) {\n      return undefined;\n    }\n    const supersetIndex = supersetGroup?.findIndex((e) => e.id === entry!.id);\n    if (supersetIndex == null || supersetIndex < 0) {\n      return undefined;\n    }\n    return supersetGroup[(supersetIndex + 1) % supersetGroup.length];\n  }\n\n  export function getNextEntry(\n    progress: IHistoryRecord,\n    entry: IHistoryEntry,\n    mode: \"workout\" | \"warmup\",\n    shouldGoToNextEntry: boolean\n  ): IHistoryEntry | undefined {\n    if (isFullyEmptyOrFinishedSet(progress)) {\n      return undefined;\n    }\n    const visitedAndFinished = new Set<IHistoryEntry>();\n    let currentEntry: IHistoryEntry | undefined = entry;\n    let isInitial = true;\n    const supersetGroups = getSupersetGroups(progress.entries);\n    while (currentEntry != null) {\n      let index = progress.entries.findIndex((e) => e.id != null && e.id === currentEntry?.id);\n      if (index === -1) {\n        index = progress.entries.findIndex((e) => e === currentEntry);\n      }\n      const superset: string | undefined = currentEntry.superset;\n      if (mode === \"workout\" && superset != null && !visitedAndFinished.has(currentEntry)) {\n        const supersetGroup: IHistoryEntry[] = supersetGroups?.[superset] ?? [];\n        if (supersetGroup.length > 1) {\n          const supersetIndex = supersetGroup?.findIndex((e) => e.id === currentEntry?.id);\n          currentEntry = supersetGroup[(supersetIndex + 1) % supersetGroup.length];\n        } else {\n          if (shouldGoToNextEntry) {\n            currentEntry = progress.entries[(index + 1) % progress.entries.length];\n          } else {\n            return currentEntry;\n          }\n        }\n      } else if (Reps.isEmptyOrFinished(currentEntry.sets)) {\n        if (shouldGoToNextEntry) {\n          currentEntry = progress.entries[(index + 1) % progress.entries.length];\n        } else {\n          return undefined;\n        }\n      }\n      if (currentEntry == null) {\n        return undefined;\n      }\n      if (!Reps.isEmptyOrFinished(currentEntry.sets)) {\n        return currentEntry;\n      } else if (!isInitial) {\n        visitedAndFinished.add(currentEntry);\n      }\n      isInitial = false;\n    }\n    return undefined;\n  }\n\n  export function getNextEntryIndex(\n    progress: IHistoryRecord,\n    entry: IHistoryEntry,\n    mode: \"workout\" | \"warmup\"\n  ): number | undefined {\n    const nextEntry = getNextEntry(progress, entry, mode, false);\n    if (nextEntry != null) {\n      let index = progress.entries.findIndex((e) => e.id != null && e.id === nextEntry.id);\n      if (index === -1) {\n        index = progress.entries.findIndex((e) => e === nextEntry);\n      }\n      return index === -1 ? undefined : index;\n    }\n    return undefined;\n  }\n\n  export function updateTimer(\n    dispatch: IDispatch,\n    progress: IHistoryRecord,\n    newTimer: number,\n    timerSince: number,\n    liveActivityEntryIndex: number | undefined,\n    liveActivitySetIndex: number | undefined,\n    skipLiveActivityUpdate: boolean\n  ): void {\n    const timerForPush = newTimer - Math.round((Date.now() - timerSince) / 1000);\n    if (timerForPush > 0) {\n      dispatch({\n        type: \"StartTimer\",\n        entryIndex: progress.timerEntryIndex || 0,\n        setIndex: progress.timerSetIndex || 0,\n        mode: progress.timerMode || \"workout\",\n        timestamp: progress.timerSince || Date.now(),\n        timer: newTimer,\n      });\n      if (!skipLiveActivityUpdate) {\n        dispatch(\n          Thunk.updateLiveActivity(\n            liveActivityEntryIndex,\n            liveActivitySetIndex,\n            newTimer,\n            progress.timerSince || Date.now()\n          )\n        );\n      }\n    } else {\n      SendMessage.toIos({ type: \"stopTimer\" });\n      SendMessage.toAndroid({ type: \"stopTimer\" });\n      updateState(\n        dispatch,\n        [\n          lb<IState>().p(\"progress\").pi(progress.id).p(\"timer\").record(Math.max(0, newTimer)),\n          lb<IState>()\n            .p(\"progress\")\n            .pi(progress.id)\n            .recordModify((record) => {\n              return {\n                ...record,\n                ui: {\n                  ...record.ui,\n                  nativeNotificationScheduled: undefined,\n                },\n              };\n            }),\n        ],\n        \"Update timer\"\n      );\n      if (!skipLiveActivityUpdate) {\n        dispatch(\n          Thunk.updateLiveActivity(\n            liveActivityEntryIndex,\n            liveActivitySetIndex,\n            Math.max(0, newTimer),\n            progress.timerSince || Date.now()\n          )\n        );\n      }\n    }\n  }\n\n  export function maybeApplySuperset(\n    progress: IHistoryRecord,\n    entryIndex: number,\n    mode: \"workout\" | \"warmup\"\n  ): IHistoryRecord {\n    if (!Progress.isCurrent(progress)) {\n      return progress;\n    }\n    const entry = progress.entries[entryIndex];\n    const nextEntryIndex = getNextEntryIndex(progress, entry, mode);\n    if (nextEntryIndex != null) {\n      return { ...progress, ui: { ...progress.ui, currentEntryIndex: nextEntryIndex } };\n    }\n    return progress;\n  }\n\n  export function stopTimer(progress: IHistoryRecord): IHistoryRecord {\n    SendMessage.toIos({ type: \"stopTimer\" });\n    SendMessage.toAndroid({ type: \"stopTimer\" });\n    return {\n      ...progress,\n      timerSince: undefined,\n      timerMode: undefined,\n      timerSetIndex: undefined,\n      timerEntryIndex: undefined,\n    };\n  }\n\n  export function stopSetTimer(progress: IHistoryRecord): IHistoryRecord {\n    return {\n      ...progress,\n      setTimerSince: undefined,\n      setTimerMode: undefined,\n      setTimerSetIndex: undefined,\n      setTimerEntryIndex: undefined,\n    };\n  }\n\n  export function findEntryByExercise(\n    progress: IHistoryRecord,\n    exerciseType: IExerciseType\n  ): IHistoryEntry | undefined {\n    return progress.entries.find((entry) => entry.exercise === exerciseType);\n  }\n\n  export function isFullyCompletedSet(progress: IHistoryRecord): boolean {\n    return progress.entries.every((entry) => isCompletedSet(entry));\n  }\n\n  export function isCompletedSet(entry: IHistoryEntry): boolean {\n    return Reps.isCompleted(entry.sets, entry.block != null);\n  }\n\n  export function isFullyFinishedSet(progress: IHistoryRecord): boolean {\n    return progress.entries.every((entry) => isFinishedSet(entry));\n  }\n\n  export function isFullyEmptySet(progress: IHistoryRecord): boolean {\n    return progress.entries.every((entry) => Reps.isEmpty(entry.sets));\n  }\n\n  export function isFinishedSet(entry: IHistoryEntry): boolean {\n    return Reps.isFinished(entry.sets);\n  }\n\n  export function isFullyEmptyOrFinishedSet(progress: IHistoryRecord): boolean {\n    return progress.entries.every((entry) => isEmptyOrFinishedSet(entry));\n  }\n\n  export function isEmptyOrFinishedSet(entry: IHistoryEntry): boolean {\n    return Reps.isEmptyOrFinished(entry.sets);\n  }\n\n  export function hasLastUnfinishedSet(entry: IHistoryEntry): boolean {\n    return entry.sets.filter((s) => !s.isCompleted).length === 1;\n  }\n\n  export function isChanged(aProgress?: IHistoryRecord, bProgress?: IHistoryRecord): boolean {\n    if (aProgress != null && bProgress == null) {\n      return true;\n    } else if (aProgress == null && bProgress != null) {\n      return true;\n    } else if (aProgress == null && bProgress == null) {\n      return false;\n    } else {\n      const changed = !ObjectUtils.isEqual(aProgress!, bProgress!);\n      return changed;\n    }\n  }\n\n  export function showUpdateDate(progress: IHistoryRecord, date: string, time: number): IHistoryRecord {\n    return {\n      ...progress,\n      ui: {\n        ...progress.ui,\n        dateModal: { date, time },\n      },\n    };\n  }\n\n  export function getColorToSupersetGroup(progress: IHistoryRecord): Partial<Record<string, IHistoryEntry[]>> {\n    const groups = getSupersetGroups(progress.entries);\n    const colors = [\"red\", \"blue\", \"green\", \"purple\"];\n    let index = 0;\n    return ObjectUtils.entriesNonnull(groups).reduce<Partial<Record<string, IHistoryEntry[]>>>((memo, [, group]) => {\n      const color = colors[index % colors.length];\n      memo[color] = group;\n      index += 1;\n      return memo;\n    }, {});\n  }\n\n  export function getSupersetGroups(entries: IHistoryEntry[]): Partial<Record<string, IHistoryEntry[]>> {\n    const groups: Partial<Record<string, IHistoryEntry[]>> = {};\n    for (const entry of entries) {\n      if (entry.superset != null) {\n        if (!groups[entry.superset]) {\n          groups[entry.superset] = [];\n        }\n        groups[entry.superset]!.push(entry);\n      }\n    }\n    return groups;\n  }\n\n  export function stop(\n    progresses: Record<number, IHistoryRecord | undefined>,\n    id: number\n  ): Record<number, IHistoryRecord | undefined> {\n    return ObjectUtils.keys(progresses).reduce<Record<number, IHistoryRecord | undefined>>((memo, k) => {\n      const p = progresses[k];\n      if (p != null && p.id !== id) {\n        memo[k] = p;\n      }\n      return memo;\n    }, {});\n  }\n\n  export function dateTimes(\n    progress: IHistoryRecord,\n    dateStr?: string,\n    time?: number\n  ): { startTime: number; endTime: number } {\n    let startTime = progress.startTime;\n    const startTimeDate = new Date(startTime);\n    const date = dateStr != null ? DateUtils.fromYYYYMMDD(dateStr) : undefined;\n    if (date != null) {\n      startTime = new Date(\n        date.getFullYear(),\n        date.getMonth(),\n        date.getDate(),\n        startTimeDate.getHours(),\n        startTimeDate.getMinutes(),\n        startTimeDate.getSeconds()\n      ).getTime();\n    }\n    const endTime = time != null ? startTime + time : startTime + History.workoutTime(progress);\n    return { startTime, endTime };\n  }\n\n  export function changeDate(progress: IHistoryRecord, dateStr?: string, time?: number): IHistoryRecord {\n    const { startTime, endTime } = dateTimes(progress, dateStr, time);\n    return {\n      ...progress,\n      ...(dateStr != null ? { date: DateUtils.fromYYYYMMDDStr(dateStr) } : {}),\n      startTime,\n      intervals: [[startTime, endTime]],\n      endTime,\n      ui: {\n        ...progress.ui,\n        dateModal: undefined,\n      },\n    };\n  }\n\n  // The key of the practice workout of the app tour in `state.progress`. It is not 0 (the current workout, the only\n  // key that is saved and synced) and it is not a history record id. The tour screen reads and writes this key.\n  export const PRACTICE_ID = -1;\n\n  export function isPractice(progress: IHistoryRecord | undefined): boolean {\n    return progress?.id === PRACTICE_ID;\n  }\n\n  export function getProgressId(screenStack: IScreenStack): number {\n    const currentScreen = Screen.current(screenStack);\n    if (currentScreen.name === \"tour\") {\n      return PRACTICE_ID;\n    }\n    if (currentScreen.name === \"progress\") {\n      return currentScreen.params?.id ?? 0;\n    }\n    return 0;\n  }\n\n  export function getProgress(state: Pick<IState, \"screenStack\" | \"progress\">): IHistoryRecord | undefined {\n    return state.progress[getProgressId(state.screenStack)];\n  }\n\n  export function setProgress(state: IState, progress: IHistoryRecord): IState {\n    return lf(state).p(\"progress\").p(progress.id).set(progress);\n  }\n\n  export function runUpdateScriptForEntry(\n    entry: IHistoryEntry,\n    dayData: IDayData,\n    programExercise: IPlannerProgramExercise,\n    otherStates: IByTag<IProgramState>,\n    setIndex: number,\n    settings: ISettings,\n    stats: IStats\n  ): IHistoryEntry {\n    if (setIndex !== -1 && !entry?.sets[setIndex]?.isCompleted) {\n      return entry;\n    }\n    const script = PlannerProgramExercise.getUpdateScript(programExercise);\n    if (!script) {\n      return entry;\n    }\n    const exercise = programExercise.exerciseType;\n    const state = ObjectUtils.clone(PlannerProgramExercise.getState(programExercise));\n    const setVariationIndex = PlannerProgramExercise.currentEvaluatedSetVariationIndex(programExercise);\n    const descriptionIndex = PlannerProgramExercise.currentDescriptionIndex(programExercise);\n    const bindings = Progress.createScriptBindings(\n      dayData,\n      entry,\n      settings,\n      programExercise.evaluatedSetVariations[setVariationIndex]?.sets.length ?? 0,\n      Stats.getCurrentMovingAverageBodyweight(stats, settings),\n      setIndex + 1,\n      setVariationIndex,\n      descriptionIndex\n    );\n    try {\n      const fnContext: IScriptFnContext = { exerciseType: exercise, unit: settings.units, prints: [] };\n      const runner = new ScriptRunner(\n        script,\n        state,\n        ObjectUtils.clone(otherStates),\n        bindings,\n        Progress.createScriptFunctions(settings),\n        settings.units,\n        fnContext,\n        \"update\"\n      );\n      runner.execute();\n      const newEntry = Progress.applyBindings(entry, bindings, settings);\n      newEntry.state = { ...newEntry.state, ...state };\n      if (fnContext.prints.length > 0) {\n        newEntry.updatePrints = fnContext.prints;\n      }\n      return newEntry;\n    } catch (error) {\n      const e = error as Error;\n      alert(`Error during executing 'update: custom()' script: ${e.message}`);\n      return entry;\n    }\n  }\n\n  export function runInitialUpdateScripts(\n    aProgress: IHistoryRecord,\n    programExerciseIds: string[] | undefined,\n    day: number,\n    program: IEvaluatedProgram,\n    settings: ISettings,\n    stats: IStats\n  ): IHistoryRecord {\n    const programDay = Program.getProgramDay(program, day);\n    if (!programDay) {\n      return aProgress;\n    }\n    const dayExercises = Program.getProgramDayUsedExercises(programDay);\n    const programExercises = programExerciseIds\n      ? CollectionUtils.compact(programExerciseIds.map((id) => dayExercises.find((e) => e.key === id)))\n      : dayExercises;\n\n    return {\n      ...aProgress,\n      entries: aProgress.entries.map((entry) => {\n        const programExercise =\n          entry.programExerciseId != null ? programExercises.find((e) => e.key === entry.programExerciseId) : undefined;\n        if (!programExercise) {\n          return entry;\n        }\n        return runUpdateScriptForEntry(\n          entry,\n          Progress.getDayData(aProgress),\n          programExercise,\n          program.states,\n          -1,\n          settings,\n          stats\n        );\n      }),\n    };\n  }\n\n  export function runUpdateScript(\n    aProgress: IHistoryRecord,\n    programExercise: IPlannerProgramExercise,\n    otherStates: IByTag<IProgramState>,\n    entryIndex: number,\n    setIndex: number,\n    mode: IProgressMode,\n    settings: ISettings,\n    stats: IStats\n  ): IHistoryRecord {\n    if (mode === \"warmup\") {\n      return aProgress;\n    }\n    const entry = aProgress.entries[entryIndex];\n    const newEntry = runUpdateScriptForEntry(\n      entry,\n      Progress.getDayData(aProgress),\n      programExercise,\n      otherStates,\n      setIndex,\n      settings,\n      stats\n    );\n    const progress = lf(aProgress).p(\"entries\").i(entryIndex).set(newEntry);\n    return progress;\n  }\n\n  export function applyBindings(\n    oldEntry: IHistoryEntry,\n    bindings: IScriptBindings,\n    settings: ISettings\n  ): IHistoryEntry {\n    const keys = [\n      \"RPE\",\n      \"minReps\",\n      \"reps\",\n      \"weights\",\n      \"amraps\",\n      \"logrpes\",\n      \"timers\",\n      \"setTimers\",\n      \"originalWeights\",\n      \"askweights\",\n    ] as const;\n    const entry = ObjectUtils.clone(oldEntry);\n    const lastCompletedIndex = CollectionUtils.findIndexReverse(bindings.completedReps, (r) => r != null) + 1;\n    entry.sets = entry.sets.slice(0, Math.max(lastCompletedIndex, bindings.numberOfSets, 0));\n    for (const key of keys) {\n      for (let i = 0; i < bindings[key].length; i += 1) {\n        if (entry.sets[i] == null) {\n          entry.sets[i] = {\n            id: UidFactory.generateUid(6),\n            isUnilateral: Exercise.getIsUnilateral(entry.exercise, settings),\n            reps: 0,\n            weight: Weight.build(0, \"lb\"),\n            originalWeight: Weight.build(0, \"lb\"),\n            askWeight: false,\n            isCompleted: false,\n          };\n        }\n        if (!entry.sets[i].isCompleted) {\n          if (key === \"RPE\") {\n            const value = bindings.RPE[i];\n            entry.sets[i].rpe = value !== 0 ? value : undefined;\n          } else if (key === \"reps\") {\n            const value = bindings.reps[i];\n            entry.sets[i].reps = value;\n          } else if (key === \"minReps\") {\n            const value = bindings.minReps[i];\n            entry.sets[i].minReps = value !== 0 ? value : undefined;\n          } else if (key === \"weights\") {\n            const value = bindings.weights[i];\n            entry.sets[i].weight = value;\n          } else if (key === \"originalWeights\") {\n            const value = bindings.originalWeights[i];\n            entry.sets[i].originalWeight = value;\n          } else if (key === \"amraps\") {\n            const value = bindings.amraps[i];\n            entry.sets[i].isAmrap = !!value;\n          } else if (key === \"logrpes\") {\n            const value = bindings.logrpes[i];\n            entry.sets[i].logRpe = !!value;\n          } else if (key === \"askweights\") {\n            const value = bindings.askweights[i];\n            entry.sets[i].askWeight = !!value;\n          } else if (key === \"timers\") {\n            const value = bindings.timers[i];\n            entry.sets[i].timer = value !== 0 ? value : undefined;\n          } else if (key === \"setTimers\") {\n            const value = bindings.setTimers[i];\n            entry.sets[i].setTimer = value !== 0 ? value : undefined;\n          }\n        }\n      }\n    }\n    return entry;\n  }\n\n  export function completeAmrapSet(\n    progress: IHistoryRecord,\n    entryIndex: number,\n    setIndex: number,\n    settings: ISettings\n  ): IHistoryRecord {\n    const entry = progress.entries[entryIndex];\n    const isUnilateral = Exercise.getIsUnilateral(entry.exercise, settings);\n    return lf(progress)\n      .p(\"entries\")\n      .i(entryIndex)\n      .p(\"sets\")\n      .i(setIndex)\n      .modify((progressSet) => {\n        return {\n          ...progressSet,\n          timestamp: !progressSet.isCompleted ? Date.now() : progressSet.timestamp,\n          completedRepsLeft: isUnilateral ? (progressSet.completedRepsLeft ?? progressSet.reps) : undefined,\n          completedReps: progressSet.completedReps ?? progressSet.reps,\n          completedWeight: progressSet.completedWeight ?? progressSet.weight,\n          isCompleted: !progressSet.isCompleted,\n        };\n      });\n  }\n\n  export function shouldAskWeight(set: ISet): boolean {\n    return set?.completedWeight == null && !!set?.askWeight;\n  }\n\n  export function shouldShowAmrapModal(\n    entry: IHistoryEntry,\n    setIndex: number,\n    mode: IProgressMode,\n    hasUserPromptedVars: boolean,\n    settings: ISettings\n  ): boolean {\n    const set = mode === \"warmup\" ? entry.warmupSets[setIndex] : entry.sets[setIndex];\n    const shouldLogRpe = !!set?.logRpe;\n    const shouldPromptUserVars = hasUserPromptedVars && Progress.hasLastUnfinishedSet(entry);\n    const isUnilateral = Exercise.getIsUnilateral(entry.exercise, settings);\n    const isAmrap =\n      (set?.completedReps == null || (isUnilateral && set?.completedRepsLeft == null)) &&\n      (!!set?.isAmrap || set.reps == null);\n    const askWeight = Progress.shouldAskWeight(set);\n    return !set.isCompleted && (shouldLogRpe || shouldPromptUserVars || isAmrap || askWeight);\n  }\n\n  export function completeSet(\n    progress: IHistoryRecord,\n    entryIndex: number,\n    setIndex: number,\n    mode: IProgressMode,\n    hasUserPromptedVars: boolean,\n    settings: ISettings\n  ): IHistoryRecord {\n    const entry = progress.entries[entryIndex];\n    const set = mode === \"warmup\" ? entry.warmupSets[setIndex] : entry.sets[setIndex];\n    const shouldLogRpe = !!set?.logRpe;\n    const shouldPromptUserVars = hasUserPromptedVars && Progress.hasLastUnfinishedSet(entry);\n    const isUnilateral = Exercise.getIsUnilateral(entry.exercise, settings);\n    const isAmrap =\n      (set?.completedReps == null || (isUnilateral && set?.completedRepsLeft == null)) &&\n      (!!set?.isAmrap || set.reps == null);\n    const askWeight = Progress.shouldAskWeight(set);\n    if (mode === \"warmup\") {\n      return lf(progress)\n        .p(\"entries\")\n        .i(entryIndex)\n        .p(\"warmupSets\")\n        .i(setIndex)\n        .modify((progressSet) => {\n          return {\n            ...progressSet,\n            timestamp: !progressSet.isCompleted ? Date.now() : progressSet.timestamp,\n            completedRepsLeft: isUnilateral ? (progressSet.completedRepsLeft ?? progressSet.reps) : undefined,\n            completedReps: progressSet.completedReps ?? progressSet.reps,\n            completedWeight: progressSet.completedWeight ?? progressSet.weight,\n            isCompleted: !progressSet.isCompleted,\n          };\n        });\n    } else if (Progress.shouldShowAmrapModal(entry, setIndex, mode, hasUserPromptedVars, settings)) {\n      const amrapUi: IProgressUi = {\n        amrapModal: {\n          entryIndex,\n          setIndex,\n          logRpe: shouldLogRpe,\n          userVars: shouldPromptUserVars,\n          isAmrap: isAmrap,\n          askWeight,\n        },\n      };\n      return { ...progress, ui: { ...progress.ui, ...amrapUi } };\n    } else {\n      return completeAmrapSet(progress, entryIndex, setIndex, settings);\n    }\n  }\n\n  export function getIsRpeEnabled(sets: ISet[]): boolean {\n    return sets.some((set) => set.rpe != null);\n  }\n\n  export function getIsMinRepsEnabled(sets: ISet[]): boolean {\n    return sets.some((set) => set.minReps != null);\n  }\n\n  export function updateAmrapRepsInExercise(progress: IHistoryRecord, value?: number): IHistoryRecord {\n    if (progress.ui?.amrapModal != null) {\n      const { entryIndex, setIndex } = progress.ui.amrapModal;\n      return lf(progress).p(\"entries\").i(entryIndex).p(\"sets\").i(setIndex).p(\"completedReps\").set(value);\n    } else {\n      return progress;\n    }\n  }\n\n  export function updateAmrapRepsLeftInExercise(progress: IHistoryRecord, value?: number): IHistoryRecord {\n    if (progress.ui?.amrapModal != null) {\n      const { entryIndex, setIndex } = progress.ui.amrapModal;\n      return lf(progress).p(\"entries\").i(entryIndex).p(\"sets\").i(setIndex).p(\"completedRepsLeft\").set(value);\n    } else {\n      return progress;\n    }\n  }\n\n  export function updateRpeInExercise(progress: IHistoryRecord, value?: number): IHistoryRecord {\n    if (progress.ui?.amrapModal != null) {\n      const { entryIndex, setIndex } = progress.ui.amrapModal;\n      const newValue = value != null ? Math.round(Math.min(10, Math.max(0, value)) / 0.5) * 0.5 : undefined;\n      return lf(progress).p(\"entries\").i(entryIndex).p(\"sets\").i(setIndex).p(\"completedRpe\").set(newValue);\n    } else {\n      return progress;\n    }\n  }\n\n  export function updateWeightInExercise(progress: IHistoryRecord, value?: IWeight): IHistoryRecord {\n    if (progress.ui?.amrapModal != null) {\n      const { entryIndex, setIndex } = progress.ui.amrapModal;\n      return lf(progress).p(\"entries\").i(entryIndex).p(\"sets\").i(setIndex).p(\"completedWeight\").set(value);\n    } else {\n      return progress;\n    }\n  }\n\n  // The ref of the open block log: a group name, or `{ name: \"\", entryIndex }` for a single block.\n  export function getBlockLogRef(modal: { blockName: string; entryIndex?: number }): IBlockRef {\n    return modal.entryIndex != null ? { name: modal.blockName, entryIndex: modal.entryIndex } : modal.blockName;\n  }\n\n  // Does nothing when the modal is already open for that block.\n  export function openBlockLog(progress: IHistoryRecord, ref: IBlockRef): IHistoryRecord {\n    const blockName = typeof ref === \"string\" ? ref : ref.name;\n    const entryIndex = typeof ref === \"string\" ? undefined : ref.entryIndex;\n    const current = progress.ui?.blockLogModal;\n    if (current != null && current.blockName === blockName && current.entryIndex === entryIndex) {\n      return progress;\n    }\n    const blockLogModal = entryIndex != null ? { blockName, entryIndex } : { blockName };\n    return { ...progress, ui: { ...progress.ui, blockLogModal } };\n  }\n\n  // The one open rule of a single block: a set is done, and the block (or a set) asks for something.\n  // It serves the run end, the reconcile end and the Log button.\n  export function shouldOpenSingleLog(progress: IHistoryRecord, entryIndex: number): boolean {\n    const entry = progress.entries[entryIndex];\n    if (entry?.block == null || !entry.sets.some((set) => set.isCompleted)) {\n      return false;\n    }\n    const logging = entry.block.logging ?? BlockLogging.DEFAULT;\n    const asksReps = logging.reps !== \"none\" && logging.reps !== \"check\";\n    return logging.rpe || asksReps || entry.sets.some((set) => !!set.logRpe);\n  }\n\n  // The Log button of a single block: the open rule holds, no run is active and the block is not logged yet.\n  export function canShowLogButton(progress: IHistoryRecord, entryIndex: number): boolean {\n    return (\n      progress.blockRun == null &&\n      progress.entries[entryIndex]?.block?.loggedAt == null &&\n      Progress.shouldOpenSingleLog(progress, entryIndex)\n    );\n  }\n\n  // Should the end of the current run open the log? A group run always does. A single run follows the open rule.\n  export function shouldOpenRunLog(progress: IHistoryRecord): boolean {\n    const blockRun = progress.blockRun;\n    if (blockRun == null) {\n      return false;\n    }\n    return blockRun.entryIndex == null || Progress.shouldOpenSingleLog(progress, blockRun.entryIndex);\n  }\n\n  export function endBlockRun(progress: IHistoryRecord, options: { openLog: boolean }): IHistoryRecord {\n    const blockRun = progress.blockRun;\n    let newProgress = Progress.stopTimer(progress);\n    newProgress = Progress.stopSetTimer(newProgress);\n    // A single-exercise run is addressed by its entry; a group run by its name.\n    if (options.openLog && blockRun != null) {\n      newProgress = Progress.openBlockLog(\n        newProgress,\n        blockRun.entryIndex != null ? { name: \"\", entryIndex: blockRun.entryIndex } : blockRun.name\n      );\n    }\n    return { ...newProgress, blockRun: undefined };\n  }\n\n  export function pauseBlock(progress: IHistoryRecord, now: number): IHistoryRecord {\n    const blockRun = progress.blockRun;\n    if (!blockRun || blockRun.isPaused) {\n      return progress;\n    }\n    return { ...progress, blockRun: { ...blockRun, isPaused: true, pausedAt: now } };\n  }\n\n  export function resumeBlock(progress: IHistoryRecord, now: number): IHistoryRecord {\n    const blockRun = progress.blockRun;\n    if (!blockRun || !blockRun.isPaused || blockRun.pausedAt == null) {\n      return progress;\n    }\n    const pausedDurationMs = now - blockRun.pausedAt;\n    let newProgress: IHistoryRecord = { ...progress, blockRun: { ...blockRun, isPaused: false, pausedAt: undefined } };\n    if (newProgress.setTimerSince != null) {\n      newProgress = { ...newProgress, setTimerSince: newProgress.setTimerSince + pausedDurationMs };\n    } else if (newProgress.timerSince != null) {\n      // The native alert is scheduled again on resume, so the old flag is stale.\n      newProgress = {\n        ...newProgress,\n        timerSince: newProgress.timerSince + pausedDurationMs,\n        ui: { ...newProgress.ui, nativeNotificationScheduled: undefined },\n      };\n    }\n    return newProgress;\n  }\n\n  // The reps answers for one entry. `*Left` is the left side of a unilateral exercise. `each` is keyed by set index\n  // and is used by a single block (`reps: each`, or `check` not ticked).\n  export interface IBlockLogRepsValues {\n    first?: number;\n    last?: number;\n    avg?: number;\n    firstLeft?: number;\n    lastLeft?: number;\n    avgLeft?: number;\n    each?: Record<number, { reps?: number; left?: number }>;\n  }\n\n  export interface IApplyBlockLogValues {\n    rpe?: number;\n    reps: Record<string, IBlockLogRepsValues>;\n  }\n\n  function roundRpe(rpe: number): number {\n    return Math.round(Math.min(10, Math.max(0, rpe)) / 0.5) * 0.5;\n  }\n\n  // A single block writes only the fields its questions cover. Other set fields stay as the run left them.\n  function applySingleBlockLog(\n    entry: IHistoryEntry,\n    block: NonNullable<IHistoryEntry[\"block\"]>,\n    values: IApplyBlockLogValues\n  ): IHistoryEntry {\n    let sets: ISet[] = [...entry.sets];\n    const rpe = values.rpe != null ? roundRpe(values.rpe) : undefined;\n    let rpeSetIndexes: number[] | undefined;\n    if (rpe != null) {\n      // A second log first removes the logRpe marks that the earlier log added.\n      for (const index of block.rpeSetIndexes ?? []) {\n        if (sets[index] != null) {\n          sets[index] = { ...sets[index], completedRpe: undefined, logRpe: undefined };\n        }\n      }\n      // Every done set gets the RPE. A set without a programmed logRpe gets the mark, and its index is kept so\n      // that Redo can remove the mark again.\n      const doneIndexes = sets.flatMap((set, index) => (set.isCompleted ? [index] : []));\n      rpeSetIndexes = doneIndexes.filter((index) => !sets[index].logRpe);\n      sets = sets.map((set, index) =>\n        doneIndexes.includes(index) ? { ...set, completedRpe: rpe, logRpe: true } : set\n      );\n    } else {\n      rpeSetIndexes = block.rpeSetIndexes;\n    }\n\n    const answers = values.reps[entry.id ?? \"\"] ?? {};\n    const doneIndexes = sets.flatMap((set, index) => (set.isCompleted ? [index] : []));\n    const writeReps = (index: number, reps?: number, left?: number): void => {\n      if (reps == null && left == null) {\n        return;\n      }\n      sets[index] = {\n        ...sets[index],\n        ...(reps != null ? { completedReps: reps } : {}),\n        ...(left != null ? { completedRepsLeft: left } : {}),\n      };\n    };\n    const logging = block.logging ?? BlockLogging.DEFAULT;\n    const first = doneIndexes[0];\n    const last = doneIndexes[doneIndexes.length - 1];\n    if (doneIndexes.length > 0) {\n      if (logging.reps === \"last\") {\n        writeReps(last, answers.last, answers.lastLeft);\n      } else if (logging.reps === \"firstlast\") {\n        if (first === last) {\n          writeReps(first, answers.first ?? answers.last, answers.firstLeft ?? answers.lastLeft);\n        } else {\n          writeReps(first, answers.first, answers.firstLeft);\n          writeReps(last, answers.last, answers.lastLeft);\n        }\n      } else if (logging.reps === \"avg\") {\n        for (const index of doneIndexes) {\n          writeReps(index, answers.avg, answers.avgLeft);\n        }\n      } else if (logging.reps === \"each\") {\n        for (const index of doneIndexes) {\n          const answer = answers.each?.[index];\n          writeReps(index, answer?.reps, answer?.left);\n        }\n      }\n    }\n\n    const newBlock = { ...block, loggedAt: Date.now(), rpeSetIndexes };\n    if (rpeSetIndexes == null || rpeSetIndexes.length === 0) {\n      delete newBlock.rpeSetIndexes;\n    }\n    return { ...entry, sets, block: newBlock };\n  }\n\n  export function applyBlockLog(\n    progress: IHistoryRecord,\n    ref: IBlockRef,\n    values: IApplyBlockLogValues\n  ): IHistoryRecord {\n    const rpeValue = values.rpe != null ? roundRpe(values.rpe) : undefined;\n    const isSingle = typeof ref !== \"string\" && ref.entryIndex != null;\n    const memberIndexes = new Set(Block.getBlockMembers(progress.entries, ref).map((m) => m.entryIndex));\n    return {\n      ...progress,\n      entries: progress.entries.map((entry, entryIndex) => {\n        if (!memberIndexes.has(entryIndex) || entry.block == null) {\n          return entry;\n        }\n        if (isSingle) {\n          return applySingleBlockLog(entry, entry.block, values);\n        }\n        const logging = entry.block.logging ?? BlockLogging.DEFAULT;\n        const repsAnswers = values.reps[entry.id ?? \"\"] ?? {};\n        const lastIndex = entry.sets.length - 1;\n        const sets: ISet[] = entry.sets.map((set, setIndex) => {\n          const isFirst = setIndex === 0;\n          const isLast = setIndex === lastIndex;\n          let completedReps: number | undefined;\n          if (logging.reps === \"avg\") {\n            completedReps = repsAnswers.avg;\n          } else if (logging.reps === \"last\" && isLast) {\n            completedReps = repsAnswers.last;\n          } else if (logging.reps === \"firstlast\" && (isFirst || isLast)) {\n            completedReps =\n              isFirst && isLast\n                ? (repsAnswers.first ?? repsAnswers.last)\n                : isFirst\n                  ? repsAnswers.first\n                  : repsAnswers.last;\n          }\n          const newSet: ISet = { ...set, completedReps, completedRepsLeft: undefined };\n          // Only a completed set gets logRpe: true - otherwise a client who later completes this\n          // set normally would hit a second, unwanted RPE prompt from the completion path's own\n          // logRpe check (plan decision 6; hazard flagged in block-logging's Risks).\n          if (logging.rpe && set.isCompleted) {\n            newSet.completedRpe = rpeValue;\n            newSet.logRpe = true;\n          }\n          return newSet;\n        });\n        // Marks this block instance as logged, independent of which axes it logs (a bare\n        // circuit() with no logging still needs a marker) - the card reads this to stop\n        // offering Start circuit once outputs have been recorded.\n        return { ...entry, sets, block: { ...entry.block, loggedAt: Date.now() } };\n      }),\n    };\n  }\n\n  export function updateUserPromptedStateVars(\n    progress: IHistoryRecord,\n    programExerciseId: string,\n    userPromptedStateVars: IProgramState\n  ): IHistoryRecord {\n    return {\n      ...progress,\n      userPromptedStateVars: {\n        ...(progress.userPromptedStateVars || {}),\n        [programExerciseId]: userPromptedStateVars,\n      },\n    };\n  }\n\n  export function editExerciseNotes(dispatch: IDispatch, entryIndex: number, notes: string): void {\n    updateProgress(dispatch, [lb<IHistoryRecord>().p(\"entries\").i(entryIndex).p(\"notes\").record(notes)], \"edit-notes\");\n  }\n\n  export function addExercise(dispatch: IDispatch, exerciseType: IExerciseType, numberOfEntries: number): void {\n    updateProgress(\n      dispatch,\n      [\n        lb<IHistoryRecord>()\n          .p(\"entries\")\n          .recordModify((entries) => {\n            return [...entries, History.createCustomEntry(exerciseType)];\n          }),\n      ],\n      \"add-exercise\"\n    );\n  }\n\n  export function isEligibleForInferredWeight(set: ISet): boolean {\n    return set.originalWeight == null && set.reps != null && set.rpe != null;\n  }\n\n  export function updateSetWeights(\n    entry: IHistoryEntry,\n    exerciseType: IExerciseType,\n    settings: ISettings\n  ): IHistoryEntry {\n    const newSets = entry.sets.map((set) => {\n      if ((Progress.isEligibleForInferredWeight(set) || Weight.isPct(set.originalWeight)) && !set.isCompleted) {\n        const originalWeight = set.originalWeight ?? Weight.rpePct(set.reps ?? 1, set.rpe ?? 10);\n        const evaluatedWeight = Weight.evaluateWeight(originalWeight, exerciseType, settings);\n        const unit = Equipment.getUnitForExerciseType(settings, exerciseType) ?? settings.units;\n        const weight = Weight.roundConvertTo(evaluatedWeight, settings, unit, exerciseType);\n        return { ...set, weight };\n      }\n      return set;\n    });\n    return { ...entry, sets: newSets };\n  }\n\n  export function doesUse1RM(entry: IHistoryEntry): boolean {\n    return entry.sets.some((set) => (set.originalWeight == null ? set.rpe != null : Weight.isPct(set.originalWeight)));\n  }\n\n  export function changeExercise(\n    dispatch: IDispatch,\n    settings: ISettings,\n    progressId: number,\n    exerciseType: IExerciseType,\n    entryIndex: number,\n    shouldKeepProgramExerciseId: boolean,\n    // Set by the level actions of the menu (R5). The program exercise id stays. `levelChange` is undefined for an undo.\n    levelAction?: { levelChange?: ILevelChange }\n  ): void {\n    updateState(\n      dispatch,\n      [\n        lb<IState>()\n          .p(\"progress\")\n          .pi(progressId)\n          .p(\"entries\")\n          .i(entryIndex)\n          .recordModify((entry) => {\n            entry = Progress.updateSetWeights(entry, exerciseType, settings);\n            return {\n              ...entry,\n              exercise: exerciseType,\n              ...(shouldKeepProgramExerciseId || levelAction != null ? {} : { programExerciseId: undefined }),\n              // A swap through the exercise picker is not a level change, so it clears a manual one (R5).\n              levelChange: levelAction?.levelChange,\n              changed: true,\n            };\n          }),\n      ],\n      \"Change exercise\"\n    );\n  }\n\n  export function changeEquipment(\n    dispatch: IDispatch,\n    progressId: number,\n    entryIndex: number,\n    equipment: IEquipment\n  ): void {\n    updateState(\n      dispatch,\n      [\n        lb<IState>()\n          .p(\"progress\")\n          .pi(progressId)\n          .p(\"entries\")\n          .i(entryIndex)\n          .p(\"exercise\")\n          .p(\"equipment\")\n          .record(equipment),\n      ],\n      \"Change equipment\"\n    );\n  }\n\n  export function editNotes(dispatch: IDispatch, progressId: number, notes: string): void {\n    updateState(dispatch, [lb<IState>().p(\"progress\").pi(progressId).p(\"notes\").record(notes)], \"Edit workout notes\");\n  }\n\n  export function getDayData(progress: IHistoryRecord): IDayData {\n    return {\n      day: progress.day,\n      week: progress.week,\n      dayInWeek: progress.dayInWeek,\n    };\n  }\n\n  // The programme owns the block settings. The run-end log marks (`loggedAt`, `rpeSetIndexes`) stay on the entry.\n  function keepBlockLog(\n    block: NonNullable<IHistoryEntry[\"block\"]>,\n    old: IHistoryEntry[\"block\"]\n  ): NonNullable<IHistoryEntry[\"block\"]> {\n    return {\n      ...block,\n      ...(old?.loggedAt != null ? { loggedAt: old.loggedAt } : {}),\n      ...(old?.rpeSetIndexes != null ? { rpeSetIndexes: old.rpeSetIndexes } : {}),\n    };\n  }\n\n  export function applyProgramExercise(\n    progressEntry: IHistoryEntry | undefined,\n    programExercise: IPlannerProgramExerciseWithType,\n    settings: ISettings,\n    forceWarmupSets?: boolean,\n    program?: IEvaluatedProgram\n  ): IHistoryEntry {\n    const variationIndex = PlannerProgramExercise.currentSetVariationIndex(programExercise);\n    const sets = programExercise.evaluatedSetVariations[variationIndex].sets;\n    const programExerciseWarmupSets = PlannerProgramExercise.programWarmups(programExercise, settings);\n    // A circuit (\"block\") grouping - or an ungrouping - made after the client started the workout must\n    // still reach the running progress entry, or the fullscreen timer never appears (spec C2, candidate 2).\n    const superset = programExercise.superset?.name;\n    const block = program ? Program.getEntryBlock(program, programExercise) : undefined;\n\n    if (progressEntry != null) {\n      const newSetsNum = Math.max(progressEntry.sets.length, sets.length);\n      const newSets: ISet[] = [];\n      for (let i = 0; i < newSetsNum; i++) {\n        const progressSet: ISet | undefined = progressEntry.sets[i] as ISet | undefined;\n        const programSet = sets[i];\n        if (!!progressSet?.isCompleted) {\n          newSets.push(progressSet);\n        } else if (programSet != null) {\n          const originalWeight = programSet.weight;\n          const weight = ProgramSet.getEvaluatedWeight(programSet, programExercise.exerciseType, settings);\n          newSets.push({\n            ...progressSet,\n            reps: programSet.maxrep,\n            minReps: programSet.minrep,\n            rpe: programSet.rpe,\n            isUnilateral: Exercise.getIsUnilateral(programExercise.exerciseType, settings),\n            originalWeight,\n            weight,\n            isAmrap: programSet.isAmrap,\n            logRpe: programSet.logRpe,\n            label: programSet.label,\n          });\n        }\n      }\n      let newWarmupSets = progressEntry.warmupSets;\n      if (progressEntry.warmupSets.every((w) => !w.isCompleted)) {\n        const firstWeight = newSets[0]?.weight;\n        forceWarmupSets = forceWarmupSets || Reps.isEmpty(newSets);\n        newWarmupSets = forceWarmupSets\n          ? firstWeight != null\n            ? Exercise.getWarmupSets(programExercise.exerciseType, firstWeight, settings, programExerciseWarmupSets)\n            : []\n          : progressEntry.warmupSets;\n      }\n\n      return {\n        ...progressEntry,\n        exercise: progressEntry.changed ? progressEntry.exercise : programExercise.exerciseType,\n        warmupSets: newWarmupSets,\n        sets: newSets,\n        superset,\n        block: block != null ? keepBlockLog(block, progressEntry.block) : block,\n      };\n    } else {\n      const newSets = sets.map((set) => {\n        const weight = ProgramSet.getEvaluatedWeight(set, programExercise.exerciseType, settings);\n        return {\n          reps: set.maxrep,\n          minReps: set.minrep,\n          originalWeight: set.weight,\n          isUnilateral: Exercise.getIsUnilateral(programExercise.exerciseType, settings),\n          weight,\n          rpe: set.rpe,\n          logRpe: set.logRpe,\n          isAmrap: set.isAmrap,\n          label: set.label,\n        };\n      });\n      const firstWeight = newSets[0]?.weight;\n\n      return {\n        id: UidFactory.generateUid(8),\n        exercise: programExercise.exerciseType,\n        programExerciseId: programExercise.key,\n        sets: newSets,\n        warmupSets:\n          firstWeight != null\n            ? Exercise.getWarmupSets(programExercise.exerciseType, firstWeight, settings, programExerciseWarmupSets)\n            : [],\n        superset,\n        block,\n      };\n    }\n  }\n\n  export function applyProgramDay(\n    progress: IHistoryRecord,\n    program: IEvaluatedProgram,\n    day: number,\n    settings: ISettings,\n    programExerciseIds?: string[]\n  ): IHistoryRecord {\n    const programDay = Program.getProgramDay(program, day);\n    if (!programDay) {\n      return progress;\n    }\n    const newEntries = progress.entries.map((entry) => {\n      if (entry.programExerciseId == null) {\n        return entry;\n      }\n      if (programExerciseIds != null && !programExerciseIds.includes(entry.programExerciseId)) {\n        return entry;\n      }\n      const programExercise = Program.getProgramExerciseForKeyAndDay(program, day, entry.programExerciseId);\n      if (!programExercise) {\n        return entry;\n      }\n      return applyProgramExercise(entry, programExercise, settings, false, program);\n    });\n\n    return { ...progress, entries: newEntries };\n  }\n\n  export function forceUpdateEntryIndex(dispatch: IDispatch): void {\n    updateProgress(\n      dispatch,\n      [\n        lb<IHistoryRecord>()\n          .pi(\"ui\")\n          .p(\"forceUpdateEntryIndex\")\n          .recordModify((v) => !v),\n      ],\n      \"Force update entry index\"\n    );\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { CollectionUtils } from \"./collection\";\nimport { INonNullObject } from \"./types\";\n\nexport namespace ObjectUtils {\n  export function keys<T extends {}>(obj: T): Array<keyof T> {\n    return Object.keys(obj) as Array<keyof T>;\n  }\n\n  export function values<T extends {}>(obj: T): Array<T[keyof T]> {\n    if (\"values\" in Object) {\n      return Object.values(obj);\n    } else {\n      return ObjectUtils.keys(obj).map((key) => obj[key]);\n    }\n  }\n\n  export function entries<T extends {}>(obj: T): Array<[keyof T, T[keyof T]]> {\n    return ObjectUtils.keys(obj).map((key) => [key, obj[key]]);\n  }\n\n  export function entriesNonnull<T extends {}>(obj: T): Array<[keyof T, NonNullable<T[keyof T]>]> {\n    return CollectionUtils.compact(ObjectUtils.keys(obj)).map((key) => [key, obj[key] as NonNullable<T[keyof T]>]);\n  }\n\n  export function isEmpty<T extends {}>(obj: T): boolean {\n    return ObjectUtils.keys(obj).length === 0;\n  }\n\n  export function isNotEmpty<T extends {}>(obj: T): boolean {\n    return !ObjectUtils.isEmpty(obj);\n  }\n\n  export function isEqual<T extends Record<string, any>>(obj1: T, obj2: T, ignoreKeys: string[] = []): boolean {\n    // Create a stack for comparing objects\n    const stack: Array<[any, any]> = [[obj1, obj2]];\n\n    while (stack.length > 0) {\n      // Pop a pair of items from the stack\n      const [currentObj1, currentObj2] = stack.pop()!;\n      if (currentObj1 === currentObj2) {\n        continue;\n      }\n\n      // Check if both are objects\n      if (\n        typeof currentObj1 !== \"object\" ||\n        typeof currentObj2 !== \"object\" ||\n        currentObj1 == null ||\n        currentObj2 == null\n      ) {\n        if (currentObj1 !== currentObj2) {\n          return false;\n        }\n        continue;\n      }\n\n      // Get keys of both objects\n      const keys1 = Object.keys(currentObj1);\n      const keys2 = Object.keys(currentObj2);\n\n      // Iterate over keys and add nested objects to the stack\n      for (const key of new Set([...keys1, ...keys2])) {\n        if (ignoreKeys.indexOf(key) !== -1) {\n          continue;\n        }\n        stack.push([currentObj1[key], currentObj2[key]]);\n      }\n    }\n\n    // If all checks pass, the objects are equal\n    return true;\n  }\n\n  export function diffPaths<T extends object>(obj1original: T, obj2original: T): string[] {\n    const result: string[] = [];\n    const queue: {\n      obj1: any;\n      obj2: any;\n      path: string;\n    }[] = [{ obj1: obj1original, obj2: obj2original, path: \"\" }];\n\n    while (queue.length > 0) {\n      const { obj1, obj2, path } = queue.shift()!;\n\n      if (obj1 === obj2) {\n        continue;\n      }\n\n      if (Object(obj1) !== obj1 || Object(obj2) !== obj2) {\n        if (obj1 !== obj2) {\n          result.push(path);\n        }\n        continue;\n      }\n\n      for (const key of new Set([...Object.keys(obj1), ...Object.keys(obj2)])) {\n        const newPath = path ? `${path}.${key}` : key;\n        queue.push({ obj1: obj1[key], obj2: obj2[key], path: newPath });\n      }\n    }\n\n    return result;\n  }\n\n  export function diff<T extends Record<string, any>>(oldObj: T, newObj: T): T {\n    const chKeys = ObjectUtils.changedKeys(oldObj, newObj);\n    const result: Partial<T> = {};\n    for (const key of ObjectUtils.keys(chKeys)) {\n      const value = chKeys[key];\n      if (value === \"add\" || value === \"update\") {\n        result[key] = newObj[key];\n      }\n    }\n    return result as any;\n  }\n\n  export function changedKeys<T extends {}>(\n    oldObj: T,\n    newObj: T,\n    eq: (a: any, b: any) => boolean = (a, b) => a === b\n  ): Partial<Record<keyof T, \"delete\" | \"update\" | \"add\">> {\n    let oldKeys = keys(oldObj);\n    const newKeys = keys(newObj);\n    const changes: Partial<Record<keyof T, \"delete\" | \"update\" | \"add\">> = {};\n\n    for (const newKey of newKeys) {\n      if (newObj[newKey] != null && oldObj[newKey] == null) {\n        changes[newKey] = \"add\";\n      } else if (newObj[newKey] == null && oldObj[newKey] != null) {\n        changes[newKey] = \"delete\";\n      } else if (newObj[newKey] != null && oldObj[newKey] != null) {\n        if (!eq(newObj[newKey], oldObj[newKey])) {\n          changes[newKey] = \"update\";\n        }\n      }\n      oldKeys = CollectionUtils.remove(oldKeys, newKey);\n    }\n    for (const oldKey of oldKeys) {\n      if (oldObj[oldKey] != null && newObj[oldKey] == null) {\n        changes[oldKey] = \"delete\";\n      }\n    }\n    return changes;\n  }\n\n  export function mapValues<U, V, T extends Record<any, U>>(obj: T, fn: (x: U, k: keyof T) => V): Record<keyof T, V> {\n    return ObjectUtils.keys(obj).reduce<Record<keyof T, V>>(\n      (memo, k) => {\n        memo[k] = fn(obj[k], k);\n        return memo;\n      },\n      {} as Record<keyof T, V>\n    );\n  }\n\n  export function filter<T extends {}>(obj: T, cb: (key: keyof T, value: T[keyof T]) => boolean): Partial<T> {\n    const filteredKeys = ObjectUtils.keys(obj).filter((key) => {\n      const value = obj[key];\n      return cb(key, value);\n    });\n    return filteredKeys.reduce<Partial<T>>((memo, k) => {\n      memo[k] = obj[k];\n      return memo;\n    }, {});\n  }\n\n  export function compact<T extends Record<string, any>>(obj: T): INonNullObject<T> {\n    return Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== null)) as INonNullObject<T>;\n  }\n\n  export function sortedByKeys<T extends {}>(obj: T, sortedKeys: Array<keyof T>): Array<[keyof T, T[keyof T]]> {\n    const arr: Array<[keyof T, T[keyof T]]> = [];\n    const copyObj = { ...obj };\n    for (const k of sortedKeys) {\n      arr.push([k, copyObj[k]]);\n      delete copyObj[k];\n    }\n    for (const k of ObjectUtils.keys(copyObj)) {\n      arr.push([k, copyObj[k]]);\n    }\n    return arr;\n  }\n\n  export function pick<T extends {}, K extends keyof T, U extends Pick<T, K>>(obj: T, theKeys: K[]): U {\n    return keys(obj).reduce<U>((memo, key: any) => {\n      if (theKeys.indexOf(key) !== -1) {\n        (memo as any)[key] = (obj as any)[key];\n      }\n      return memo;\n    }, {} as any);\n  }\n\n  export function omit<T extends {}, K extends keyof T, U extends Omit<T, K>>(obj: T, theKeys: readonly K[]): U {\n    return keys(obj).reduce<U>((memo, key: any) => {\n      if (theKeys.indexOf(key) === -1) {\n        (memo as any)[key] = (obj as any)[key];\n      }\n      return memo;\n    }, {} as any);\n  }\n\n  export function combinedKeys<T extends Record<string, unknown>, U extends Record<string, unknown>>(\n    obj1: T,\n    obj2: U\n  ): Array<keyof T | keyof U> {\n    return Array.from(new Set(ObjectUtils.keys(obj1).concat(ObjectUtils.keys(obj2) as any)));\n  }\n\n  export function findMaxValue<T extends Record<string, number | undefined>>(obj: T): number {\n    return ObjectUtils.keys(obj).reduce<number>((memo, key) => {\n      const v = obj[key];\n      if (v != null && v > memo) {\n        memo = v || 0;\n      }\n      return memo;\n    }, 0);\n  }\n\n  export function clone<T>(obj: T): T {\n    if (obj == null) {\n      return obj;\n    }\n    if (typeof window !== \"undefined\" && window.structuredClone) {\n      return window.structuredClone(obj);\n    } else {\n      return JSON.parse(JSON.stringify(obj));\n    }\n  }\n\n  export function fromArray<K extends string, V>(arr: Array<[K, V]>): Record<K, V> {\n    return arr.reduce<Record<K, V>>(\n      (memo, [key, value]) => {\n        memo[key] = value;\n        return memo;\n      },\n      {} as Record<K, V>\n    );\n  }\n}\n","import { JSX } from \"preact\";\nimport { IAccount } from \"@shared/models/account\";\n\ninterface IProps {\n  maxWidth?: number;\n  account?: IAccount;\n  withoutBg?: boolean;\n  withAcknowledgement?: boolean;\n}\n\nexport function FooterPage(props: IProps): JSX.Element {\n  const maxWidth = props.maxWidth != null ? `${props.maxWidth}px` : \"800px\";\n  return (\n    <footer>\n      {!props.withoutBg && (\n        <div\n          className=\"w-full bg-no-repeat\"\n          style={{\n            paddingBottom: \"9%\",\n            backgroundSize: \"100% auto\",\n            backgroundImage: \"url(/images/desktop-wave-footer.svg)\",\n          }}\n        ></div>\n      )}\n      <div style={{ backgroundColor: props.withoutBg ? undefined : \"#fafafa\" }}>\n        <div className=\"flex flex-col px-6 py-0 mx-auto my-0 text-sm font-bold md:flex-row\" style={{ maxWidth }}>\n          <nav className=\"flex items-center flex-1 w-full px-0 py-6 leading-loose text-left md:text-right md:py-12 md:px-3\">\n            <div className=\"flex flex-1 md:pr-6\">\n              <ul className=\"flex-1\">\n                {[\n                  [\"Terms & Conditions\", \"/terms.html\"],\n                  [\"Privacy\", \"/privacy.html\"],\n                ].map(([text, link]) => {\n                  return (\n                    <li className=\"block mx-4 my-0 mb-2 leading-5 text-left\">\n                      <a className=\"text-text-link underline cursor-pointer\" href={link}>\n                        {text}\n                      </a>\n                    </li>\n                  );\n                })}\n              </ul>\n            </div>\n            <ul className=\"inline-block align-middle list-none\">\n              <li className=\"inline-block text-left align-middle list-none\">\n                <a\n                  href=\"mailto:support@trainwithkurtis.com\"\n                  style={{\n                    textIndent: \"-9999px\",\n                    backgroundPosition: \"50%\",\n                    backgroundSize: \"60%\",\n                    backgroundImage: `url(/images/logo-email.svg)`,\n                  }}\n                  className=\"inline-block w-10 h-10 p-2 bg-no-repeat\"\n                >\n                  <span>Email</span>\n                </a>\n              </li>\n            </ul>\n          </nav>\n        </div>\n        {props.withAcknowledgement && (\n          <div\n            className=\"px-6 pb-8 mx-auto text-sm leading-relaxed\"\n            style={{ maxWidth }}\n            data-cy=\"acknowledgement-of-country\"\n          >\n            <div style={{ maxWidth: \"75ch\" }}>\n              <p className=\"mb-3\">\n                We acknowledge the Gadigal people of the Eora Nation as the Traditional Custodians of the land on which\n                Kurtis coaches in Sydney.\n              </p>\n              <p>\n                We acknowledge the Aboriginal and Torres Strait Islander peoples as the Traditional Owners of the Land\n                on which we operate throughout Australia. We pay our respects to Elders past and present and extend this\n                respect to all Aboriginal and Torres Strait Islander peoples. We recognise the enduring connection First\n                Nations people have to their Country and acknowledge the wisdom, strength and resilience of their\n                cultures. We commit to learning from and working in partnership with them in our journey towards\n                reconciliation.\n              </p>\n            </div>\n          </div>\n        )}\n      </div>\n    </footer>\n  );\n}\n","import { ErrorReporter } from \"@shared/utils/errorReporter\";\nimport { UrlUtils } from \"@shared/utils/url\";\n\ndeclare let __API_HOST__: string;\n\nexport namespace LogUtils {\n  export async function log(\n    user: string | undefined,\n    action: string,\n    subscriptions: string[],\n    onClear: () => void,\n    key?: string,\n    referrer?: string\n  ): Promise<void> {\n    if (!user) {\n      return;\n    }\n    let enforce = false;\n    if (typeof window !== \"undefined\") {\n      const currentUrl = UrlUtils.build(window.location.href);\n      enforce = !!currentUrl.searchParams.get(\"enforce\");\n    }\n    const platform = {\n      name: window.lftAndroidVersion ? \"android\" : window.lftIosVersion ? \"ios\" : \"web\",\n      version: window.lftAndroidAppVersion || window.lftIosAppVersion,\n    };\n    const url = UrlUtils.build(`${__API_HOST__}/api/log`);\n    try {\n      fetch(url.toString(), {\n        method: \"POST\",\n        body: JSON.stringify({ action, platform, subscriptions, key, enforce, referrer }),\n        credentials: \"include\",\n      })\n        .then((res) => res.json())\n        .then((json) => {\n          if (json?.data?.clear) {\n            onClear();\n          }\n        })\n        .catch(() => {\n          // do nothing; a failed log call (for example 401) must not break the client\n        });\n    } catch (e) {\n      ErrorReporter.report(\"Log failed\", e);\n    }\n  }\n}\n","declare let __API_HOST__: string;\ndeclare let __FULL_COMMIT_HASH__: string;\n\nexport const exceptionIgnores = [\n  \"Script error\",\n  \"Failed to fetch\",\n  \"Failed to register a ServiceWorker\",\n  \"The element has no supported sources\",\n  \"The operation was aborted\",\n  \"FetchEvent.respondWith received an error\",\n  \"play() failed because the user\",\n  \"play() request was interrupted\",\n  \"The request is not allowed by the user agent or the platform\",\n  \"Load failed\",\n  \"Function timed out\",\n  \"is out of range for changeset\",\n  \"when attempting to fetch resource\",\n  \"Selection points outside of document\",\n  \"Invalid position\",\n  \"outdated_client_storage\",\n  '{\"isTrusted\":true}',\n];\n\nconst MAX_REPORTS_PER_MINUTE = 5;\nconst MAX_MESSAGE_CHARS = 500;\nconst MAX_STACK_CHARS = 4 * 1024;\n\nexport namespace ErrorReporter {\n  let sentAt: number[] = [];\n\n  export function resetForTests(): void {\n    sentAt = [];\n  }\n\n  function isIgnored(message: string): boolean {\n    return exceptionIgnores.some((i) => message.indexOf(i) !== -1);\n  }\n\n  function allow(): boolean {\n    const now = Date.now();\n    sentAt = sentAt.filter((t) => now - t < 60000);\n    if (sentAt.length >= MAX_REPORTS_PER_MINUTE) {\n      return false;\n    }\n    sentAt.push(now);\n    return true;\n  }\n\n  export function report(message: string, error?: unknown): void {\n    try {\n      const text = typeof message === \"string\" ? message : String(message);\n      if (isIgnored(text) || !allow()) {\n        return;\n      }\n      const stack = error instanceof Error && typeof error.stack === \"string\" ? error.stack : \"\";\n      const page = typeof window !== \"undefined\" && window.location ? window.location.pathname : \"\";\n      const payload = {\n        message: text.slice(0, MAX_MESSAGE_CHARS),\n        stack: stack.slice(0, MAX_STACK_CHARS),\n        page,\n        commithash: typeof __FULL_COMMIT_HASH__ !== \"undefined\" ? __FULL_COMMIT_HASH__ : \"\",\n      };\n      const result = fetch(`${__API_HOST__}/api/client-errors`, {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify(payload),\n        credentials: \"include\",\n      });\n      Promise.resolve(result).catch(() => undefined);\n    } catch (e) {\n      // Reporting must never throw.\n    }\n  }\n}\n","import { JSX } from \"preact\";\nimport { Tailwind } from \"../../utils/tailwindConfig\";\n\nexport function IconHandle(): JSX.Element {\n  const color = Tailwind.semantic().icon.neutral;\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" version=\"1.1\">\n      <path\n        fill={color}\n        d=\"M7 2a2 2 0 1 0 .001 4.001A2 2 0 0 0 7 2m0 6a2 2 0 1 0 .001 4.001A2 2 0 0 0 7 8m0 6a2 2 0 1 0 .001 4.001A2 2 0 0 0 7 14m6-8a2 2 0 1 0-.001-4.001A2 2 0 0 0 13 6m0 2a2 2 0 1 0 .001 4.001A2 2 0 0 0 13 8m0 6a2 2 0 1 0 .001 4.001A2 2 0 0 0 13 14\"\n      />\n    </svg>\n  );\n}\n","import { Service } from \"@client/api/service\";\nimport { IAudioInterface } from \"@client/lib/audioInterface\";\nimport { IScreenStack } from \"./screen\";\nimport { IDispatch } from \"@client/ducks/types\";\nimport { Storage } from \"../models/storage\";\nimport { ILensRecordingPayload } from \"lens-shmens\";\nimport { IUser } from \"./user\";\nimport {\n  IStorage,\n  IProgram,\n  IHistoryRecord,\n  IProgramDay,\n  ISettings,\n  IExerciseType,\n  IEquipment,\n  IStats,\n  IUnitKey,\n} from \"../types\";\nimport { AsyncQueue } from \"@client/utils/asyncQueue\";\nimport { basicBeginnerProgram } from \"@client/programs/basicBeginnerProgram\";\n\nexport type IEnv = {\n  service: Service;\n  audio: IAudioInterface;\n  queue: AsyncQueue;\n};\n\nexport interface INotification {\n  type: \"error\" | \"success\";\n  content: string;\n}\n\nexport interface INavCommon {\n  loading: ILoading;\n  helps: string[];\n  doesHaveWorkouts: boolean;\n  userId?: string;\n  screenStack: IScreenStack;\n  currentProgram?: IProgram;\n  allPrograms: IProgram[];\n  progress?: IHistoryRecord;\n  stats: IStats;\n  settings: ISettings;\n  // The app tour: \"Start\" on the practice workout goes to the tour's workout step. It starts no real workout.\n  onStartPractice?: () => void;\n}\n\nexport interface ILoadingItem {\n  startTime: number;\n  type: string;\n  attempt?: number;\n  endTime?: number;\n  error?: string;\n}\n\nexport type ILoading = {\n  items: Partial<Record<string, ILoadingItem>>;\n};\n\nexport interface IStateErrors {\n  corruptedstorage?: {\n    userid: string;\n    backup: boolean;\n    confirmed: boolean;\n    local: boolean;\n  };\n}\n\nexport interface IAttributionData {\n  isOrganic: boolean;\n  mediaSource: string;\n  campaign: string;\n  adSet: string;\n  ad: string;\n}\n\n// The server values and revisions that the phone last received (spec \"The phone\"). A local change is a unit where\n// `storage` differs from `values`. `revs` has the `rev` of each unit; a workout with no entry is \"new\".\nexport interface IPhoneSnapshot {\n  values: Record<IUnitKey, unknown>;\n  revs: Record<IUnitKey, number>;\n  // The `serverRev` of this snapshot.\n  lastRev: number;\n  syncEpoch?: string;\n}\n\n// The original base of a local change that was in flight when a response arrived. It stays until the server decides\n// the change. A `converted` base is the old app's `lastSyncedStorage` value (first-start converter): the change goes\n// as a converted change (rule 7), with no base rev.\nexport interface IHeldBase {\n  rev: number;\n  value?: unknown;\n  converted?: boolean;\n}\n\nexport interface IState {\n  user?: IUser;\n  storage: IStorage;\n  snapshot?: IPhoneSnapshot;\n  heldBases?: Record<IUnitKey, IHeldBase>;\n  // The phone time of each removal (`history.<id>` → time) that the server has not decided yet.\n  removedAt?: Record<IUnitKey, number>;\n  // Units that the phone does not send: a single record over 350 KB that the server could not take.\n  notSynced?: IUnitKey[];\n  // The old app's `lastSyncedStorage` (migrated), until the first-start converter loads the snapshot.\n  lastSyncedStorage?: IStorage;\n  programs: IProgram[];\n  notification?: INotification;\n  screenStack: IScreenStack;\n  revisions: Partial<Record<string, string[]>>;\n  loading: ILoading;\n  defaultEquipmentExpanded?: IEquipment;\n  progress: Partial<Record<number, IHistoryRecord>>;\n  previewProgram?: {\n    id: string;\n    showCustomPrograms?: boolean;\n  };\n  muscleView?: {\n    type: \"program\" | \"day\";\n    programId?: string;\n    day?: number;\n  };\n  viewExerciseType?: IExerciseType;\n  adminKey?: string;\n  freshMigrations: boolean;\n  errors: IStateErrors;\n  reportedCorruptedStorage?: boolean;\n  nosync: boolean;\n}\n\nexport interface ILocalStorage {\n  storage?: IStorage;\n  progress?: IHistoryRecord;\n  snapshot?: IPhoneSnapshot;\n  heldBases?: Record<IUnitKey, IHeldBase>;\n  removedAt?: Record<IUnitKey, number>;\n  notSynced?: IUnitKey[];\n  // Written by the old (vector-clock) app. The new app keeps it until the first-start converter has used it.\n  lastSyncedStorage?: IStorage;\n  editDay?: IProgramDay;\n}\n\nexport function buildState(args: {\n  storage?: IStorage;\n  shouldSkipIntro?: boolean;\n  notification?: INotification;\n  userId?: string;\n  nosync?: boolean;\n}): IState {\n  return {\n    screenStack: [{ name: \"main\" }],\n    progress: {},\n    programs: [basicBeginnerProgram],\n    loading: { items: {} },\n    notification: args.notification,\n    storage: args.storage || Storage.getDefault(),\n    user: args.userId ? { email: args.userId, id: args.userId } : undefined,\n    errors: {},\n    revisions: {},\n    freshMigrations: false,\n    nosync: !!args.nosync,\n  };\n}\n\nexport function updateState(dispatch: IDispatch, lensRecording: ILensRecordingPayload<IState>[], desc: string): void {\n  dispatch({ type: \"UpdateState\", lensRecording, desc });\n}\n\nexport function updateSettings(\n  dispatch: IDispatch,\n  lensRecording: ILensRecordingPayload<ISettings>,\n  desc: string\n): void {\n  dispatch({ type: \"UpdateSettings\", lensRecording, desc });\n}\n\nexport function updateProgress(\n  dispatch: IDispatch,\n  lensRecordings: ILensRecordingPayload<IHistoryRecord>[] | ILensRecordingPayload<IHistoryRecord>,\n  desc: string\n): void {\n  const recordings = Array.isArray(lensRecordings) ? lensRecordings : [lensRecordings];\n  dispatch({ type: \"UpdateProgress\", lensRecordings: recordings, desc });\n}\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    var desc = Object.getOwnPropertyDescriptor(m, k);\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n    }\n    Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n    __setModuleDefault(result, mod);\n    return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.match = exports.foldW = exports.matchW = exports.isRight = exports.isLeft = exports.fromOption = exports.fromPredicate = exports.FromEither = exports.MonadThrow = exports.throwError = exports.ChainRec = exports.Extend = exports.extend = exports.Alt = exports.alt = exports.altW = exports.Bifunctor = exports.mapLeft = exports.bimap = exports.Traversable = exports.sequence = exports.traverse = exports.Foldable = exports.reduceRight = exports.foldMap = exports.reduce = exports.Monad = exports.Chain = exports.Applicative = exports.Apply = exports.ap = exports.apW = exports.Pointed = exports.of = exports.asUnit = exports.as = exports.Functor = exports.map = exports.getAltValidation = exports.getApplicativeValidation = exports.getWitherable = exports.getFilterable = exports.getCompactable = exports.getSemigroup = exports.getEq = exports.getShow = exports.URI = exports.flatMap = exports.right = exports.left = void 0;\nexports.either = exports.stringifyJSON = exports.chainFirstW = exports.chainFirst = exports.chain = exports.chainW = exports.sequenceArray = exports.traverseArray = exports.traverseArrayWithIndex = exports.traverseReadonlyArrayWithIndex = exports.traverseReadonlyNonEmptyArrayWithIndex = exports.ApT = exports.apSW = exports.apS = exports.bindW = exports.bind = exports.let = exports.bindTo = exports.Do = exports.exists = exports.toUnion = exports.chainNullableK = exports.fromNullableK = exports.tryCatchK = exports.tryCatch = exports.fromNullable = exports.orElse = exports.orElseW = exports.swap = exports.filterOrElseW = exports.filterOrElse = exports.flatMapOption = exports.flatMapNullable = exports.liftOption = exports.liftNullable = exports.chainOptionKW = exports.chainOptionK = exports.fromOptionK = exports.duplicate = exports.flatten = exports.flattenW = exports.tap = exports.apSecondW = exports.apSecond = exports.apFirstW = exports.apFirst = exports.flap = exports.getOrElse = exports.getOrElseW = exports.fold = void 0;\nexports.getValidationMonoid = exports.getValidationSemigroup = exports.getApplyMonoid = exports.getApplySemigroup = void 0;\nexports.toError = toError;\nexports.elem = elem;\nexports.parseJSON = parseJSON;\nexports.getValidation = getValidation;\nvar Applicative_1 = require(\"./Applicative\");\nvar Apply_1 = require(\"./Apply\");\nvar chainable = __importStar(require(\"./Chain\"));\nvar ChainRec_1 = require(\"./ChainRec\");\nvar FromEither_1 = require(\"./FromEither\");\nvar function_1 = require(\"./function\");\nvar Functor_1 = require(\"./Functor\");\nvar _ = __importStar(require(\"./internal\"));\nvar Separated_1 = require(\"./Separated\");\nvar Witherable_1 = require(\"./Witherable\");\n// -------------------------------------------------------------------------------------\n// constructors\n// -------------------------------------------------------------------------------------\n/**\n * Constructs a new `Either` holding a `Left` value. This usually represents a failure, due to the right-bias of this\n * structure.\n *\n * @category constructors\n * @since 2.0.0\n */\nexports.left = _.left;\n/**\n * Constructs a new `Either` holding a `Right` value. This usually represents a successful value due to the right bias\n * of this structure.\n *\n * @category constructors\n * @since 2.0.0\n */\nexports.right = _.right;\n/**\n * @category sequencing\n * @since 2.14.0\n */\nexports.flatMap = (0, function_1.dual)(2, function (ma, f) { return ((0, exports.isLeft)(ma) ? ma : f(ma.right)); });\nvar _map = function (fa, f) { return (0, function_1.pipe)(fa, (0, exports.map)(f)); };\nvar _ap = function (fab, fa) { return (0, function_1.pipe)(fab, (0, exports.ap)(fa)); };\n/* istanbul ignore next */\nvar _reduce = function (fa, b, f) { return (0, function_1.pipe)(fa, (0, exports.reduce)(b, f)); };\n/* istanbul ignore next */\nvar _foldMap = function (M) { return function (fa, f) {\n    var foldMapM = (0, exports.foldMap)(M);\n    return (0, function_1.pipe)(fa, foldMapM(f));\n}; };\n/* istanbul ignore next */\nvar _reduceRight = function (fa, b, f) { return (0, function_1.pipe)(fa, (0, exports.reduceRight)(b, f)); };\nvar _traverse = function (F) {\n    var traverseF = (0, exports.traverse)(F);\n    return function (ta, f) { return (0, function_1.pipe)(ta, traverseF(f)); };\n};\nvar _bimap = function (fa, f, g) { return (0, function_1.pipe)(fa, (0, exports.bimap)(f, g)); };\nvar _mapLeft = function (fa, f) { return (0, function_1.pipe)(fa, (0, exports.mapLeft)(f)); };\n/* istanbul ignore next */\nvar _alt = function (fa, that) { return (0, function_1.pipe)(fa, (0, exports.alt)(that)); };\n/* istanbul ignore next */\nvar _extend = function (wa, f) { return (0, function_1.pipe)(wa, (0, exports.extend)(f)); };\nvar _chainRec = function (a, f) {\n    return (0, ChainRec_1.tailRec)(f(a), function (e) {\n        return (0, exports.isLeft)(e) ? (0, exports.right)((0, exports.left)(e.left)) : (0, exports.isLeft)(e.right) ? (0, exports.left)(f(e.right.left)) : (0, exports.right)((0, exports.right)(e.right.right));\n    });\n};\n/**\n * @category type lambdas\n * @since 2.0.0\n */\nexports.URI = 'Either';\n/**\n * @category instances\n * @since 2.0.0\n */\nvar getShow = function (SE, SA) { return ({\n    show: function (ma) { return ((0, exports.isLeft)(ma) ? \"left(\".concat(SE.show(ma.left), \")\") : \"right(\".concat(SA.show(ma.right), \")\")); }\n}); };\nexports.getShow = getShow;\n/**\n * @category instances\n * @since 2.0.0\n */\nvar getEq = function (EL, EA) { return ({\n    equals: function (x, y) {\n        return x === y || ((0, exports.isLeft)(x) ? (0, exports.isLeft)(y) && EL.equals(x.left, y.left) : (0, exports.isRight)(y) && EA.equals(x.right, y.right));\n    }\n}); };\nexports.getEq = getEq;\n/**\n * Semigroup returning the left-most non-`Left` value. If both operands are `Right`s then the inner values are\n * concatenated using the provided `Semigroup`\n *\n * @example\n * import { getSemigroup, left, right } from 'fp-ts/Either'\n * import { SemigroupSum } from 'fp-ts/number'\n *\n * const S = getSemigroup<string, number>(SemigroupSum)\n * assert.deepStrictEqual(S.concat(left('a'), left('b')), left('a'))\n * assert.deepStrictEqual(S.concat(left('a'), right(2)), right(2))\n * assert.deepStrictEqual(S.concat(right(1), left('b')), right(1))\n * assert.deepStrictEqual(S.concat(right(1), right(2)), right(3))\n *\n * @category instances\n * @since 2.0.0\n */\nvar getSemigroup = function (S) { return ({\n    concat: function (x, y) { return ((0, exports.isLeft)(y) ? x : (0, exports.isLeft)(x) ? y : (0, exports.right)(S.concat(x.right, y.right))); }\n}); };\nexports.getSemigroup = getSemigroup;\n/**\n * Builds a `Compactable` instance for `Either` given `Monoid` for the left side.\n *\n * @category filtering\n * @since 2.10.0\n */\nvar getCompactable = function (M) {\n    var empty = (0, exports.left)(M.empty);\n    return {\n        URI: exports.URI,\n        _E: undefined,\n        compact: function (ma) { return ((0, exports.isLeft)(ma) ? ma : ma.right._tag === 'None' ? empty : (0, exports.right)(ma.right.value)); },\n        separate: function (ma) {\n            return (0, exports.isLeft)(ma)\n                ? (0, Separated_1.separated)(ma, ma)\n                : (0, exports.isLeft)(ma.right)\n                    ? (0, Separated_1.separated)((0, exports.right)(ma.right.left), empty)\n                    : (0, Separated_1.separated)(empty, (0, exports.right)(ma.right.right));\n        }\n    };\n};\nexports.getCompactable = getCompactable;\n/**\n * Builds a `Filterable` instance for `Either` given `Monoid` for the left side\n *\n * @category filtering\n * @since 2.10.0\n */\nvar getFilterable = function (M) {\n    var empty = (0, exports.left)(M.empty);\n    var _a = (0, exports.getCompactable)(M), compact = _a.compact, separate = _a.separate;\n    var filter = function (ma, predicate) {\n        return (0, exports.isLeft)(ma) ? ma : predicate(ma.right) ? ma : empty;\n    };\n    var partition = function (ma, p) {\n        return (0, exports.isLeft)(ma)\n            ? (0, Separated_1.separated)(ma, ma)\n            : p(ma.right)\n                ? (0, Separated_1.separated)(empty, (0, exports.right)(ma.right))\n                : (0, Separated_1.separated)((0, exports.right)(ma.right), empty);\n    };\n    return {\n        URI: exports.URI,\n        _E: undefined,\n        map: _map,\n        compact: compact,\n        separate: separate,\n        filter: filter,\n        filterMap: function (ma, f) {\n            if ((0, exports.isLeft)(ma)) {\n                return ma;\n            }\n            var ob = f(ma.right);\n            return ob._tag === 'None' ? empty : (0, exports.right)(ob.value);\n        },\n        partition: partition,\n        partitionMap: function (ma, f) {\n            if ((0, exports.isLeft)(ma)) {\n                return (0, Separated_1.separated)(ma, ma);\n            }\n            var e = f(ma.right);\n            return (0, exports.isLeft)(e) ? (0, Separated_1.separated)((0, exports.right)(e.left), empty) : (0, Separated_1.separated)(empty, (0, exports.right)(e.right));\n        }\n    };\n};\nexports.getFilterable = getFilterable;\n/**\n * Builds `Witherable` instance for `Either` given `Monoid` for the left side\n *\n * @category filtering\n * @since 2.0.0\n */\nvar getWitherable = function (M) {\n    var F_ = (0, exports.getFilterable)(M);\n    var C = (0, exports.getCompactable)(M);\n    return {\n        URI: exports.URI,\n        _E: undefined,\n        map: _map,\n        compact: F_.compact,\n        separate: F_.separate,\n        filter: F_.filter,\n        filterMap: F_.filterMap,\n        partition: F_.partition,\n        partitionMap: F_.partitionMap,\n        traverse: _traverse,\n        sequence: exports.sequence,\n        reduce: _reduce,\n        foldMap: _foldMap,\n        reduceRight: _reduceRight,\n        wither: (0, Witherable_1.witherDefault)(exports.Traversable, C),\n        wilt: (0, Witherable_1.wiltDefault)(exports.Traversable, C)\n    };\n};\nexports.getWitherable = getWitherable;\n/**\n * The default [`Applicative`](#applicative) instance returns the first error, if you want to\n * get all errors you need to provide a way to concatenate them via a `Semigroup`.\n *\n * @example\n * import * as A from 'fp-ts/Apply'\n * import * as E from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n * import * as S from 'fp-ts/Semigroup'\n * import * as string from 'fp-ts/string'\n *\n * const parseString = (u: unknown): E.Either<string, string> =>\n *   typeof u === 'string' ? E.right(u) : E.left('not a string')\n *\n * const parseNumber = (u: unknown): E.Either<string, number> =>\n *   typeof u === 'number' ? E.right(u) : E.left('not a number')\n *\n * interface Person {\n *   readonly name: string\n *   readonly age: number\n * }\n *\n * const parsePerson = (\n *   input: Record<string, unknown>\n * ): E.Either<string, Person> =>\n *   pipe(\n *     E.Do,\n *     E.apS('name', parseString(input.name)),\n *     E.apS('age', parseNumber(input.age))\n *   )\n *\n * assert.deepStrictEqual(parsePerson({}), E.left('not a string')) // <= first error\n *\n * const Applicative = E.getApplicativeValidation(\n *   pipe(string.Semigroup, S.intercalate(', '))\n * )\n *\n * const apS = A.apS(Applicative)\n *\n * const parsePersonAll = (\n *   input: Record<string, unknown>\n * ): E.Either<string, Person> =>\n *   pipe(\n *     E.Do,\n *     apS('name', parseString(input.name)),\n *     apS('age', parseNumber(input.age))\n *   )\n *\n * assert.deepStrictEqual(parsePersonAll({}), E.left('not a string, not a number')) // <= all errors\n *\n * @category error handling\n * @since 2.7.0\n */\nvar getApplicativeValidation = function (SE) { return ({\n    URI: exports.URI,\n    _E: undefined,\n    map: _map,\n    ap: function (fab, fa) {\n        return (0, exports.isLeft)(fab)\n            ? (0, exports.isLeft)(fa)\n                ? (0, exports.left)(SE.concat(fab.left, fa.left))\n                : fab\n            : (0, exports.isLeft)(fa)\n                ? fa\n                : (0, exports.right)(fab.right(fa.right));\n    },\n    of: exports.of\n}); };\nexports.getApplicativeValidation = getApplicativeValidation;\n/**\n * The default [`Alt`](#alt) instance returns the last error, if you want to\n * get all errors you need to provide a way to concatenate them via a `Semigroup`.\n *\n * @example\n * import * as E from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n * import * as S from 'fp-ts/Semigroup'\n * import * as string from 'fp-ts/string'\n *\n * const parseString = (u: unknown): E.Either<string, string> =>\n *   typeof u === 'string' ? E.right(u) : E.left('not a string')\n *\n * const parseNumber = (u: unknown): E.Either<string, number> =>\n *   typeof u === 'number' ? E.right(u) : E.left('not a number')\n *\n * const parse = (u: unknown): E.Either<string, string | number> =>\n *   pipe(\n *     parseString(u),\n *     E.alt<string, string | number>(() => parseNumber(u))\n *   )\n *\n * assert.deepStrictEqual(parse(true), E.left('not a number')) // <= last error\n *\n * const Alt = E.getAltValidation(pipe(string.Semigroup, S.intercalate(', ')))\n *\n * const parseAll = (u: unknown): E.Either<string, string | number> =>\n *   Alt.alt<string | number>(parseString(u), () => parseNumber(u))\n *\n * assert.deepStrictEqual(parseAll(true), E.left('not a string, not a number')) // <= all errors\n *\n * @category error handling\n * @since 2.7.0\n */\nvar getAltValidation = function (SE) { return ({\n    URI: exports.URI,\n    _E: undefined,\n    map: _map,\n    alt: function (me, that) {\n        if ((0, exports.isRight)(me)) {\n            return me;\n        }\n        var ea = that();\n        return (0, exports.isLeft)(ea) ? (0, exports.left)(SE.concat(me.left, ea.left)) : ea;\n    }\n}); };\nexports.getAltValidation = getAltValidation;\n/**\n * @category mapping\n * @since 2.0.0\n */\nvar map = function (f) { return function (fa) {\n    return (0, exports.isLeft)(fa) ? fa : (0, exports.right)(f(fa.right));\n}; };\nexports.map = map;\n/**\n * @category instances\n * @since 2.7.0\n */\nexports.Functor = {\n    URI: exports.URI,\n    map: _map\n};\n/**\n * Maps the `Right` value of this `Either` to the specified constant value.\n *\n * @category mapping\n * @since 2.16.0\n */\nexports.as = (0, function_1.dual)(2, (0, Functor_1.as)(exports.Functor));\n/**\n * Maps the `Right` value of this `Either` to the void constant value.\n *\n * @category mapping\n * @since 2.16.0\n */\nexports.asUnit = (0, Functor_1.asUnit)(exports.Functor);\n/**\n * @category constructors\n * @since 2.7.0\n */\nexports.of = exports.right;\n/**\n * @category instances\n * @since 2.10.0\n */\nexports.Pointed = {\n    URI: exports.URI,\n    of: exports.of\n};\n/**\n * Less strict version of [`ap`](#ap).\n *\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @since 2.8.0\n */\nvar apW = function (fa) { return function (fab) {\n    return (0, exports.isLeft)(fab) ? fab : (0, exports.isLeft)(fa) ? fa : (0, exports.right)(fab.right(fa.right));\n}; };\nexports.apW = apW;\n/**\n * @since 2.0.0\n */\nexports.ap = exports.apW;\n/**\n * @category instances\n * @since 2.10.0\n */\nexports.Apply = {\n    URI: exports.URI,\n    map: _map,\n    ap: _ap\n};\n/**\n * @category instances\n * @since 2.7.0\n */\nexports.Applicative = {\n    URI: exports.URI,\n    map: _map,\n    ap: _ap,\n    of: exports.of\n};\n/**\n * @category instances\n * @since 2.10.0\n */\nexports.Chain = {\n    URI: exports.URI,\n    map: _map,\n    ap: _ap,\n    chain: exports.flatMap\n};\n/**\n * @category instances\n * @since 2.7.0\n */\nexports.Monad = {\n    URI: exports.URI,\n    map: _map,\n    ap: _ap,\n    of: exports.of,\n    chain: exports.flatMap\n};\n/**\n * Left-associative fold of a structure.\n *\n * @example\n * import { pipe } from 'fp-ts/function'\n * import * as E from 'fp-ts/Either'\n *\n * const startWith = 'prefix'\n * const concat = (a: string, b: string) => `${a}:${b}`\n *\n * assert.deepStrictEqual(\n *   pipe(E.right('a'), E.reduce(startWith, concat)),\n *   'prefix:a'\n * )\n *\n * assert.deepStrictEqual(\n *   pipe(E.left('e'), E.reduce(startWith, concat)),\n *   'prefix'\n * )\n *\n * @category folding\n * @since 2.0.0\n */\nvar reduce = function (b, f) { return function (fa) {\n    return (0, exports.isLeft)(fa) ? b : f(b, fa.right);\n}; };\nexports.reduce = reduce;\n/**\n * Map each element of the structure to a monoid, and combine the results.\n *\n * @example\n * import { pipe } from 'fp-ts/function'\n * import * as E from 'fp-ts/Either'\n * import * as S from 'fp-ts/string'\n *\n * const yell = (a: string) => `${a}!`\n *\n * assert.deepStrictEqual(\n *   pipe(E.right('a'), E.foldMap(S.Monoid)(yell)),\n *   'a!'\n * )\n *\n * assert.deepStrictEqual(\n *   pipe(E.left('e'), E.foldMap(S.Monoid)(yell)),\n *   S.Monoid.empty\n * )\n *\n * @category folding\n * @since 2.0.0\n */\nvar foldMap = function (M) { return function (f) { return function (fa) {\n    return (0, exports.isLeft)(fa) ? M.empty : f(fa.right);\n}; }; };\nexports.foldMap = foldMap;\n/**\n * Right-associative fold of a structure.\n *\n * @example\n * import { pipe } from 'fp-ts/function'\n * import * as E from 'fp-ts/Either'\n *\n * const startWith = 'postfix'\n * const concat = (a: string, b: string) => `${a}:${b}`\n *\n * assert.deepStrictEqual(\n *   pipe(E.right('a'), E.reduceRight(startWith, concat)),\n *   'a:postfix'\n * )\n *\n * assert.deepStrictEqual(\n *   pipe(E.left('e'), E.reduceRight(startWith, concat)),\n *   'postfix'\n * )\n *\n * @category folding\n * @since 2.0.0\n */\nvar reduceRight = function (b, f) { return function (fa) {\n    return (0, exports.isLeft)(fa) ? b : f(fa.right, b);\n}; };\nexports.reduceRight = reduceRight;\n/**\n * @category instances\n * @since 2.7.0\n */\nexports.Foldable = {\n    URI: exports.URI,\n    reduce: _reduce,\n    foldMap: _foldMap,\n    reduceRight: _reduceRight\n};\n/**\n * Map each element of a structure to an action, evaluate these actions from left to right, and collect the results.\n *\n * @example\n * import { pipe } from 'fp-ts/function'\n * import * as RA from 'fp-ts/ReadonlyArray'\n * import * as E from 'fp-ts/Either'\n * import * as O from 'fp-ts/Option'\n *\n * assert.deepStrictEqual(\n *   pipe(E.right(['a']), E.traverse(O.Applicative)(RA.head)),\n *   O.some(E.right('a'))\n *  )\n *\n * assert.deepStrictEqual(\n *   pipe(E.right([]), E.traverse(O.Applicative)(RA.head)),\n *   O.none\n * )\n *\n * @category traversing\n * @since 2.6.3\n */\nvar traverse = function (F) {\n    return function (f) {\n        return function (ta) {\n            return (0, exports.isLeft)(ta) ? F.of((0, exports.left)(ta.left)) : F.map(f(ta.right), exports.right);\n        };\n    };\n};\nexports.traverse = traverse;\n/**\n * Evaluate each monadic action in the structure from left to right, and collect the results.\n *\n * @example\n * import { pipe } from 'fp-ts/function'\n * import * as E from 'fp-ts/Either'\n * import * as O from 'fp-ts/Option'\n *\n * assert.deepStrictEqual(\n *   pipe(E.right(O.some('a')), E.sequence(O.Applicative)),\n *   O.some(E.right('a'))\n *  )\n *\n * assert.deepStrictEqual(\n *   pipe(E.right(O.none), E.sequence(O.Applicative)),\n *   O.none\n * )\n *\n * @category traversing\n * @since 2.6.3\n */\nvar sequence = function (F) {\n    return function (ma) {\n        return (0, exports.isLeft)(ma) ? F.of((0, exports.left)(ma.left)) : F.map(ma.right, exports.right);\n    };\n};\nexports.sequence = sequence;\n/**\n * @category instances\n * @since 2.7.0\n */\nexports.Traversable = {\n    URI: exports.URI,\n    map: _map,\n    reduce: _reduce,\n    foldMap: _foldMap,\n    reduceRight: _reduceRight,\n    traverse: _traverse,\n    sequence: exports.sequence\n};\n/**\n * Map a pair of functions over the two type arguments of the bifunctor.\n *\n * @category mapping\n * @since 2.0.0\n */\nvar bimap = function (f, g) { return function (fa) {\n    return (0, exports.isLeft)(fa) ? (0, exports.left)(f(fa.left)) : (0, exports.right)(g(fa.right));\n}; };\nexports.bimap = bimap;\n/**\n * Map a function over the first type argument of a bifunctor.\n *\n * @category error handling\n * @since 2.0.0\n */\nvar mapLeft = function (f) { return function (fa) {\n    return (0, exports.isLeft)(fa) ? (0, exports.left)(f(fa.left)) : fa;\n}; };\nexports.mapLeft = mapLeft;\n/**\n * @category instances\n * @since 2.7.0\n */\nexports.Bifunctor = {\n    URI: exports.URI,\n    bimap: _bimap,\n    mapLeft: _mapLeft\n};\n/**\n * Less strict version of [`alt`](#alt).\n *\n * The `W` suffix (short for **W**idening) means that the error and the return types will be merged.\n *\n * @category error handling\n * @since 2.9.0\n */\nvar altW = function (that) { return function (fa) {\n    return (0, exports.isLeft)(fa) ? that() : fa;\n}; };\nexports.altW = altW;\n/**\n * Identifies an associative operation on a type constructor. It is similar to `Semigroup`, except that it applies to\n * types of kind `* -> *`.\n *\n * In case of `Either` returns the left-most non-`Left` value (or the right-most `Left` value if both values are `Left`).\n *\n * | x        | y        | pipe(x, alt(() => y) |\n * | -------- | -------- | -------------------- |\n * | left(a)  | left(b)  | left(b)              |\n * | left(a)  | right(2) | right(2)             |\n * | right(1) | left(b)  | right(1)             |\n * | right(1) | right(2) | right(1)             |\n *\n * @example\n * import * as E from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n *\n * assert.deepStrictEqual(\n *   pipe(\n *     E.left('a'),\n *     E.alt(() => E.left('b'))\n *   ),\n *   E.left('b')\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     E.left('a'),\n *     E.alt(() => E.right(2))\n *   ),\n *   E.right(2)\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     E.right(1),\n *     E.alt(() => E.left('b'))\n *   ),\n *   E.right(1)\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     E.right(1),\n *     E.alt(() => E.right(2))\n *   ),\n *   E.right(1)\n * )\n *\n * @category error handling\n * @since 2.0.0\n */\nexports.alt = exports.altW;\n/**\n * @category instances\n * @since 2.7.0\n */\nexports.Alt = {\n    URI: exports.URI,\n    map: _map,\n    alt: _alt\n};\n/**\n * @since 2.0.0\n */\nvar extend = function (f) { return function (wa) {\n    return (0, exports.isLeft)(wa) ? wa : (0, exports.right)(f(wa));\n}; };\nexports.extend = extend;\n/**\n * @category instances\n * @since 2.7.0\n */\nexports.Extend = {\n    URI: exports.URI,\n    map: _map,\n    extend: _extend\n};\n/**\n * @category instances\n * @since 2.7.0\n */\nexports.ChainRec = {\n    URI: exports.URI,\n    map: _map,\n    ap: _ap,\n    chain: exports.flatMap,\n    chainRec: _chainRec\n};\n/**\n * @since 2.6.3\n */\nexports.throwError = exports.left;\n/**\n * @category instances\n * @since 2.7.0\n */\nexports.MonadThrow = {\n    URI: exports.URI,\n    map: _map,\n    ap: _ap,\n    of: exports.of,\n    chain: exports.flatMap,\n    throwError: exports.throwError\n};\n/**\n * @category instances\n * @since 2.10.0\n */\nexports.FromEither = {\n    URI: exports.URI,\n    fromEither: function_1.identity\n};\n/**\n * @example\n * import { fromPredicate, left, right } from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n *\n * assert.deepStrictEqual(\n *   pipe(\n *     1,\n *     fromPredicate(\n *       (n) => n > 0,\n *       () => 'error'\n *     )\n *   ),\n *   right(1)\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     -1,\n *     fromPredicate(\n *       (n) => n > 0,\n *       () => 'error'\n *     )\n *   ),\n *   left('error')\n * )\n *\n * @category lifting\n * @since 2.0.0\n */\nexports.fromPredicate = (0, FromEither_1.fromPredicate)(exports.FromEither);\n// -------------------------------------------------------------------------------------\n// conversions\n// -------------------------------------------------------------------------------------\n/**\n * @example\n * import * as E from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n * import * as O from 'fp-ts/Option'\n *\n * assert.deepStrictEqual(\n *   pipe(\n *     O.some(1),\n *     E.fromOption(() => 'error')\n *   ),\n *   E.right(1)\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     O.none,\n *     E.fromOption(() => 'error')\n *   ),\n *   E.left('error')\n * )\n *\n * @category conversions\n * @since 2.0.0\n */\nexports.fromOption = \n/*#__PURE__*/ (0, FromEither_1.fromOption)(exports.FromEither);\n// -------------------------------------------------------------------------------------\n// refinements\n// -------------------------------------------------------------------------------------\n/**\n * Returns `true` if the either is an instance of `Left`, `false` otherwise.\n *\n * @category refinements\n * @since 2.0.0\n */\nexports.isLeft = _.isLeft;\n/**\n * Returns `true` if the either is an instance of `Right`, `false` otherwise.\n *\n * @category refinements\n * @since 2.0.0\n */\nexports.isRight = _.isRight;\n/**\n * Less strict version of [`match`](#match).\n *\n * The `W` suffix (short for **W**idening) means that the handler return types will be merged.\n *\n * @category pattern matching\n * @since 2.10.0\n */\nvar matchW = function (onLeft, onRight) {\n    return function (ma) {\n        return (0, exports.isLeft)(ma) ? onLeft(ma.left) : onRight(ma.right);\n    };\n};\nexports.matchW = matchW;\n/**\n * Alias of [`matchW`](#matchw).\n *\n * @category pattern matching\n * @since 2.10.0\n */\nexports.foldW = exports.matchW;\n/**\n * Takes two functions and an `Either` value, if the value is a `Left` the inner value is applied to the first function,\n * if the value is a `Right` the inner value is applied to the second function.\n *\n * @example\n * import { match, left, right } from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n *\n * function onLeft(errors: Array<string>): string {\n *   return `Errors: ${errors.join(', ')}`\n * }\n *\n * function onRight(value: number): string {\n *   return `Ok: ${value}`\n * }\n *\n * assert.strictEqual(\n *   pipe(\n *     right(1),\n *     match(onLeft, onRight)\n *   ),\n *   'Ok: 1'\n * )\n * assert.strictEqual(\n *   pipe(\n *     left(['error 1', 'error 2']),\n *     match(onLeft, onRight)\n *   ),\n *   'Errors: error 1, error 2'\n * )\n *\n * @category pattern matching\n * @since 2.10.0\n */\nexports.match = exports.matchW;\n/**\n * Alias of [`match`](#match).\n *\n * @category pattern matching\n * @since 2.0.0\n */\nexports.fold = exports.match;\n/**\n * Less strict version of [`getOrElse`](#getorelse).\n *\n * The `W` suffix (short for **W**idening) means that the handler return type will be merged.\n *\n * @category error handling\n * @since 2.6.0\n */\nvar getOrElseW = function (onLeft) {\n    return function (ma) {\n        return (0, exports.isLeft)(ma) ? onLeft(ma.left) : ma.right;\n    };\n};\nexports.getOrElseW = getOrElseW;\n/**\n * Returns the wrapped value if it's a `Right` or a default value if is a `Left`.\n *\n * @example\n * import { getOrElse, left, right } from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n *\n * assert.deepStrictEqual(\n *   pipe(\n *     right(1),\n *     getOrElse(() => 0)\n *   ),\n *   1\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     left('error'),\n *     getOrElse(() => 0)\n *   ),\n *   0\n * )\n *\n * @category error handling\n * @since 2.0.0\n */\nexports.getOrElse = exports.getOrElseW;\n// -------------------------------------------------------------------------------------\n// combinators\n// -------------------------------------------------------------------------------------\n/**\n * @category mapping\n * @since 2.10.0\n */\nexports.flap = (0, Functor_1.flap)(exports.Functor);\n/**\n * Combine two effectful actions, keeping only the result of the first.\n *\n * @since 2.0.0\n */\nexports.apFirst = (0, Apply_1.apFirst)(exports.Apply);\n/**\n * Less strict version of [`apFirst`](#apfirst)\n *\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @since 2.12.0\n */\nexports.apFirstW = exports.apFirst;\n/**\n * Combine two effectful actions, keeping only the result of the second.\n *\n * @since 2.0.0\n */\nexports.apSecond = (0, Apply_1.apSecond)(exports.Apply);\n/**\n * Less strict version of [`apSecond`](#apsecond)\n *\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @since 2.12.0\n */\nexports.apSecondW = exports.apSecond;\n/**\n * Composes computations in sequence, using the return value of one computation to determine the next computation and\n * keeping only the result of the first.\n *\n * @category combinators\n * @since 2.15.0\n */\nexports.tap = (0, function_1.dual)(2, chainable.tap(exports.Chain));\n/**\n * Less strict version of [`flatten`](#flatten).\n *\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @category sequencing\n * @since 2.11.0\n */\nexports.flattenW = \n/*#__PURE__*/ (0, exports.flatMap)(function_1.identity);\n/**\n * The `flatten` function is the conventional monad join operator. It is used to remove one level of monadic structure, projecting its bound argument into the outer level.\n *\n * @example\n * import * as E from 'fp-ts/Either'\n *\n * assert.deepStrictEqual(E.flatten(E.right(E.right('a'))), E.right('a'))\n * assert.deepStrictEqual(E.flatten(E.right(E.left('e'))), E.left('e'))\n * assert.deepStrictEqual(E.flatten(E.left('e')), E.left('e'))\n *\n * @category sequencing\n * @since 2.0.0\n */\nexports.flatten = exports.flattenW;\n/**\n * @since 2.0.0\n */\nexports.duplicate = (0, exports.extend)(function_1.identity);\n/**\n * Use `liftOption`.\n *\n * @category legacy\n * @since 2.10.0\n */\nexports.fromOptionK = \n/*#__PURE__*/ (0, FromEither_1.fromOptionK)(exports.FromEither);\n/**\n * Use `flatMapOption`.\n *\n * @category legacy\n * @since 2.11.0\n */\nexports.chainOptionK = (0, FromEither_1.chainOptionK)(exports.FromEither, exports.Chain);\n/**\n * Use `flatMapOption`.\n *\n * @category legacy\n * @since 2.13.2\n */\nexports.chainOptionKW = exports.chainOptionK;\n/** @internal */\nvar _FromEither = {\n    fromEither: exports.FromEither.fromEither\n};\n/**\n * @category lifting\n * @since 2.15.0\n */\nexports.liftNullable = _.liftNullable(_FromEither);\n/**\n * @category lifting\n * @since 2.15.0\n */\nexports.liftOption = _.liftOption(_FromEither);\n/** @internal */\nvar _FlatMap = {\n    flatMap: exports.flatMap\n};\n/**\n * @category sequencing\n * @since 2.15.0\n */\nexports.flatMapNullable = _.flatMapNullable(_FromEither, _FlatMap);\n/**\n * @category sequencing\n * @since 2.15.0\n */\nexports.flatMapOption = _.flatMapOption(_FromEither, _FlatMap);\n/**\n * @example\n * import * as E from 'fp-ts/Either'\n * import { pipe } from 'fp-ts/function'\n *\n * assert.deepStrictEqual(\n *   pipe(\n *     E.right(1),\n *     E.filterOrElse(\n *       (n) => n > 0,\n *       () => 'error'\n *     )\n *   ),\n *   E.right(1)\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     E.right(-1),\n *     E.filterOrElse(\n *       (n) => n > 0,\n *       () => 'error'\n *     )\n *   ),\n *   E.left('error')\n * )\n * assert.deepStrictEqual(\n *   pipe(\n *     E.left('a'),\n *     E.filterOrElse(\n *       (n) => n > 0,\n *       () => 'error'\n *     )\n *   ),\n *   E.left('a')\n * )\n *\n * @category filtering\n * @since 2.0.0\n */\nexports.filterOrElse = (0, FromEither_1.filterOrElse)(exports.FromEither, exports.Chain);\n/**\n * Less strict version of [`filterOrElse`](#filterorelse).\n *\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @category filtering\n * @since 2.9.0\n */\nexports.filterOrElseW = exports.filterOrElse;\n/**\n * Returns a `Right` if is a `Left` (and vice versa).\n *\n * @since 2.0.0\n */\nvar swap = function (ma) { return ((0, exports.isLeft)(ma) ? (0, exports.right)(ma.left) : (0, exports.left)(ma.right)); };\nexports.swap = swap;\n/**\n * Less strict version of [`orElse`](#orelse).\n *\n * The `W` suffix (short for **W**idening) means that the return types will be merged.\n *\n * @category error handling\n * @since 2.10.0\n */\nvar orElseW = function (onLeft) {\n    return function (ma) {\n        return (0, exports.isLeft)(ma) ? onLeft(ma.left) : ma;\n    };\n};\nexports.orElseW = orElseW;\n/**\n * Useful for recovering from errors.\n *\n * @category error handling\n * @since 2.0.0\n */\nexports.orElse = exports.orElseW;\n/**\n * Takes a default and a nullable value, if the value is not nully, turn it into a `Right`, if the value is nully use\n * the provided default as a `Left`.\n *\n * @example\n * import { fromNullable, left, right } from 'fp-ts/Either'\n *\n * const parse = fromNullable('nully')\n *\n * assert.deepStrictEqual(parse(1), right(1))\n * assert.deepStrictEqual(parse(null), left('nully'))\n *\n * @category conversions\n * @since 2.0.0\n */\nvar fromNullable = function (e) {\n    return function (a) {\n        return a == null ? (0, exports.left)(e) : (0, exports.right)(a);\n    };\n};\nexports.fromNullable = fromNullable;\n/**\n * Constructs a new `Either` from a function that might throw.\n *\n * See also [`tryCatchK`](#trycatchk).\n *\n * @example\n * import * as E from 'fp-ts/Either'\n *\n * const unsafeHead = <A>(as: ReadonlyArray<A>): A => {\n *   if (as.length > 0) {\n *     return as[0]\n *   } else {\n *     throw new Error('empty array')\n *   }\n * }\n *\n * const head = <A>(as: ReadonlyArray<A>): E.Either<Error, A> =>\n *   E.tryCatch(() => unsafeHead(as), e => (e instanceof Error ? e : new Error('unknown error')))\n *\n * assert.deepStrictEqual(head([]), E.left(new Error('empty array')))\n * assert.deepStrictEqual(head([1, 2, 3]), E.right(1))\n *\n * @category interop\n * @since 2.0.0\n */\nvar tryCatch = function (f, onThrow) {\n    try {\n        return (0, exports.right)(f());\n    }\n    catch (e) {\n        return (0, exports.left)(onThrow(e));\n    }\n};\nexports.tryCatch = tryCatch;\n/**\n * Converts a function that may throw to one returning a `Either`.\n *\n * @category interop\n * @since 2.10.0\n */\nvar tryCatchK = function (f, onThrow) {\n    return function () {\n        var a = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            a[_i] = arguments[_i];\n        }\n        return (0, exports.tryCatch)(function () { return f.apply(void 0, a); }, onThrow);\n    };\n};\nexports.tryCatchK = tryCatchK;\n/**\n * Use `liftNullable`.\n *\n * @category legacy\n * @since 2.9.0\n */\nvar fromNullableK = function (e) {\n    var from = (0, exports.fromNullable)(e);\n    return function (f) { return (0, function_1.flow)(f, from); };\n};\nexports.fromNullableK = fromNullableK;\n/**\n * Use `flatMapNullable`.\n *\n * @category legacy\n * @since 2.9.0\n */\nvar chainNullableK = function (e) {\n    var from = (0, exports.fromNullableK)(e);\n    return function (f) { return (0, exports.flatMap)(from(f)); };\n};\nexports.chainNullableK = chainNullableK;\n/**\n * @category conversions\n * @since 2.10.0\n */\nexports.toUnion = (0, exports.foldW)(function_1.identity, function_1.identity);\n// -------------------------------------------------------------------------------------\n// utils\n// -------------------------------------------------------------------------------------\n/**\n * Default value for the `onError` argument of `tryCatch`\n *\n * @since 2.0.0\n */\nfunction toError(e) {\n    try {\n        return e instanceof Error ? e : new Error(String(e));\n    }\n    catch (error) {\n        return new Error();\n    }\n}\nfunction elem(E) {\n    return function (a, ma) {\n        if (ma === undefined) {\n            var elemE_1 = elem(E);\n            return function (ma) { return elemE_1(a, ma); };\n        }\n        return (0, exports.isLeft)(ma) ? false : E.equals(a, ma.right);\n    };\n}\n/**\n * Returns `false` if `Left` or returns the result of the application of the given predicate to the `Right` value.\n *\n * @example\n * import { exists, left, right } from 'fp-ts/Either'\n *\n * const gt2 = exists((n: number) => n > 2)\n *\n * assert.strictEqual(gt2(left('a')), false)\n * assert.strictEqual(gt2(right(1)), false)\n * assert.strictEqual(gt2(right(3)), true)\n *\n * @since 2.0.0\n */\nvar exists = function (predicate) {\n    return function (ma) {\n        return (0, exports.isLeft)(ma) ? false : predicate(ma.right);\n    };\n};\nexports.exists = exists;\n// -------------------------------------------------------------------------------------\n// do notation\n// -------------------------------------------------------------------------------------\n/**\n * @category do notation\n * @since 2.9.0\n */\nexports.Do = (0, exports.of)(_.emptyRecord);\n/**\n * @category do notation\n * @since 2.8.0\n */\nexports.bindTo = (0, Functor_1.bindTo)(exports.Functor);\nvar let_ = /*#__PURE__*/ (0, Functor_1.let)(exports.Functor);\nexports.let = let_;\n/**\n * @category do notation\n * @since 2.8.0\n */\nexports.bind = chainable.bind(exports.Chain);\n/**\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @category do notation\n * @since 2.8.0\n */\nexports.bindW = exports.bind;\n/**\n * @category do notation\n * @since 2.8.0\n */\nexports.apS = (0, Apply_1.apS)(exports.Apply);\n/**\n * Less strict version of [`apS`](#aps).\n *\n * The `W` suffix (short for **W**idening) means that the error types will be merged.\n *\n * @category do notation\n * @since 2.8.0\n */\nexports.apSW = exports.apS;\n/**\n * @since 2.11.0\n */\nexports.ApT = (0, exports.of)(_.emptyReadonlyArray);\n// -------------------------------------------------------------------------------------\n// array utils\n// -------------------------------------------------------------------------------------\n/**\n * Equivalent to `ReadonlyNonEmptyArray#traverseWithIndex(Applicative)`.\n *\n * @category traversing\n * @since 2.11.0\n */\nvar traverseReadonlyNonEmptyArrayWithIndex = function (f) {\n    return function (as) {\n        var e = f(0, _.head(as));\n        if ((0, exports.isLeft)(e)) {\n            return e;\n        }\n        var out = [e.right];\n        for (var i = 1; i < as.length; i++) {\n            var e_1 = f(i, as[i]);\n            if ((0, exports.isLeft)(e_1)) {\n                return e_1;\n            }\n            out.push(e_1.right);\n        }\n        return (0, exports.right)(out);\n    };\n};\nexports.traverseReadonlyNonEmptyArrayWithIndex = traverseReadonlyNonEmptyArrayWithIndex;\n/**\n * Equivalent to `ReadonlyArray#traverseWithIndex(Applicative)`.\n *\n * @category traversing\n * @since 2.11.0\n */\nvar traverseReadonlyArrayWithIndex = function (f) {\n    var g = (0, exports.traverseReadonlyNonEmptyArrayWithIndex)(f);\n    return function (as) { return (_.isNonEmpty(as) ? g(as) : exports.ApT); };\n};\nexports.traverseReadonlyArrayWithIndex = traverseReadonlyArrayWithIndex;\n/**\n * Equivalent to `ReadonlyArray#traverseWithIndex(Applicative)`.\n *\n * @category traversing\n * @since 2.9.0\n */\nexports.traverseArrayWithIndex = exports.traverseReadonlyArrayWithIndex;\n/**\n * Equivalent to `ReadonlyArray#traverse(Applicative)`.\n *\n * @category traversing\n * @since 2.9.0\n */\nvar traverseArray = function (f) { return (0, exports.traverseReadonlyArrayWithIndex)(function (_, a) { return f(a); }); };\nexports.traverseArray = traverseArray;\n/**\n * Equivalent to `ReadonlyArray#sequence(Applicative)`.\n *\n * @category traversing\n * @since 2.9.0\n */\nexports.sequenceArray = \n/*#__PURE__*/ (0, exports.traverseArray)(function_1.identity);\n// -------------------------------------------------------------------------------------\n// legacy\n// -------------------------------------------------------------------------------------\n/**\n * Alias of `flatMap`.\n *\n * @category legacy\n * @since 2.6.0\n */\nexports.chainW = exports.flatMap;\n/**\n * Alias of `flatMap`.\n *\n * @category legacy\n * @since 2.0.0\n */\nexports.chain = exports.flatMap;\n/**\n * Alias of `tap`.\n *\n * @category legacy\n * @since 2.0.0\n */\nexports.chainFirst = exports.tap;\n/**\n * Alias of `tap`.\n *\n * @category legacy\n * @since 2.8.0\n */\nexports.chainFirstW = exports.tap;\n/**\n * Use [`parse`](./Json.ts.html#parse) instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nfunction parseJSON(s, onError) {\n    return (0, exports.tryCatch)(function () { return JSON.parse(s); }, onError);\n}\n/**\n * Use [`stringify`](./Json.ts.html#stringify) instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nvar stringifyJSON = function (u, onError) {\n    return (0, exports.tryCatch)(function () {\n        var s = JSON.stringify(u);\n        if (typeof s !== 'string') {\n            throw new Error('Converting unsupported structure to JSON');\n        }\n        return s;\n    }, onError);\n};\nexports.stringifyJSON = stringifyJSON;\n/**\n * This instance is deprecated, use small, specific instances instead.\n * For example if a function needs a `Functor` instance, pass `E.Functor` instead of `E.either`\n * (where `E` is from `import E from 'fp-ts/Either'`)\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nexports.either = {\n    URI: exports.URI,\n    map: _map,\n    of: exports.of,\n    ap: _ap,\n    chain: exports.flatMap,\n    reduce: _reduce,\n    foldMap: _foldMap,\n    reduceRight: _reduceRight,\n    traverse: _traverse,\n    sequence: exports.sequence,\n    bimap: _bimap,\n    mapLeft: _mapLeft,\n    alt: _alt,\n    extend: _extend,\n    chainRec: _chainRec,\n    throwError: exports.throwError\n};\n/**\n * Use [`getApplySemigroup`](./Apply.ts.html#getapplysemigroup) instead.\n *\n * Semigroup returning the left-most `Left` value. If both operands are `Right`s then the inner values\n * are concatenated using the provided `Semigroup`\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nexports.getApplySemigroup = \n/*#__PURE__*/ (0, Apply_1.getApplySemigroup)(exports.Apply);\n/**\n * Use [`getApplicativeMonoid`](./Applicative.ts.html#getapplicativemonoid) instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nexports.getApplyMonoid = \n/*#__PURE__*/ (0, Applicative_1.getApplicativeMonoid)(exports.Applicative);\n/**\n * Use [`getApplySemigroup`](./Apply.ts.html#getapplysemigroup) instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nvar getValidationSemigroup = function (SE, SA) {\n    return (0, Apply_1.getApplySemigroup)((0, exports.getApplicativeValidation)(SE))(SA);\n};\nexports.getValidationSemigroup = getValidationSemigroup;\n/**\n * Use [`getApplicativeMonoid`](./Applicative.ts.html#getapplicativemonoid) instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nvar getValidationMonoid = function (SE, MA) {\n    return (0, Applicative_1.getApplicativeMonoid)((0, exports.getApplicativeValidation)(SE))(MA);\n};\nexports.getValidationMonoid = getValidationMonoid;\n/**\n * Use [`getApplicativeValidation`](#getapplicativevalidation) and [`getAltValidation`](#getaltvalidation) instead.\n *\n * @category zone of death\n * @since 2.0.0\n * @deprecated\n */\nfunction getValidation(SE) {\n    var ap = (0, exports.getApplicativeValidation)(SE).ap;\n    var alt = (0, exports.getAltValidation)(SE).alt;\n    return {\n        URI: exports.URI,\n        _E: undefined,\n        map: _map,\n        of: exports.of,\n        chain: exports.flatMap,\n        bimap: _bimap,\n        mapLeft: _mapLeft,\n        reduce: _reduce,\n        foldMap: _foldMap,\n        reduceRight: _reduceRight,\n        extend: _extend,\n        traverse: _traverse,\n        sequence: exports.sequence,\n        chainRec: _chainRec,\n        throwError: exports.throwError,\n        ap: ap,\n        alt: alt\n    };\n}\n","import { unsafeCoerce } from \"fp-ts/lib/function\";\nimport * as t from \"io-ts\";\nimport { ObjectUtils } from \"./utils/object\";\nimport { IArrayElement } from \"./utils/types\";\n\nexport type IDictionaryC<D extends t.Mixed, C extends t.Mixed> = t.DictionaryType<\n  D,\n  C,\n  {\n    [K in t.TypeOf<D>]?: t.TypeOf<C>;\n  },\n  {\n    [K in t.OutputOf<D>]?: t.OutputOf<C>;\n  },\n  unknown\n>;\n\nexport const dictionary = <D extends t.Mixed, C extends t.Mixed>(\n  domain: D,\n  codomain: C,\n  name?: string\n): IDictionaryC<D, C> => {\n  return unsafeCoerce(t.record(t.union([domain, t.undefined]), codomain, name));\n};\n\nexport const equipments = [\n  \"barbell\",\n  \"cable\",\n  \"dumbbell\",\n  \"smith\",\n  \"band\",\n  \"kettlebell\",\n  \"bodyweight\",\n  \"leverageMachine\",\n  \"medicineball\",\n  \"ezbar\",\n  \"trapbar\",\n] as const;\nexport const TBuiltinEquipment = t.keyof(\n  equipments.reduce<Record<IArrayElement<typeof equipments>, null>>(\n    (memo, muscle) => {\n      memo[muscle] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof equipments>, null>\n  ),\n  \"TBuiltinEquipment\"\n);\nexport type IBuiltinEquipment = t.TypeOf<typeof TBuiltinEquipment>;\n\nexport const exerciseTypes = [\n  \"abWheel\",\n  \"arnoldPress\",\n  \"aroundTheWorld\",\n  \"backExtension\",\n  \"ballSlams\",\n  \"battleRopes\",\n  \"benchDip\",\n  \"benchPress\",\n  \"benchPressCloseGrip\",\n  \"benchPressWideGrip\",\n  \"bentOverOneArmRow\",\n  \"bentOverRow\",\n  \"bicepCurl\",\n  \"bicycleCrunch\",\n  \"boxJump\",\n  \"boxSquat\",\n  \"bulgarianSplitSquat\",\n  \"burpee\",\n  \"cableCrossover\",\n  \"cableCrunch\",\n  \"cableKickback\",\n  \"cablePullThrough\",\n  \"cableTwist\",\n  \"calfPressOnLegPress\",\n  \"calfPressOnSeatedLegPress\",\n  \"chestDip\",\n  \"chestFly\",\n  \"chestPress\",\n  \"chinUp\",\n  \"clean\",\n  \"cleanandJerk\",\n  \"concentrationCurl\",\n  \"crossBodyCrunch\",\n  \"crunch\",\n  \"cycling\",\n  \"deadlift\",\n  \"deadliftHighPull\",\n  \"declineBenchPress\",\n  \"declineCrunch\",\n  \"deficitDeadlift\",\n  \"ellipticalMachine\",\n  \"facePull\",\n  \"flatKneeRaise\",\n  \"flatLegRaise\",\n  \"frontRaise\",\n  \"frontSquat\",\n  \"gluteBridge\",\n  \"gluteBridgeMarch\",\n  \"gluteKickback\",\n  \"gobletSquat\",\n  \"goodMorning\",\n  \"hackSquat\",\n  \"hammerCurl\",\n  \"handstandPushUp\",\n  \"hangClean\",\n  \"hangSnatch\",\n  \"hangingLegRaise\",\n  \"highKneeSkips\",\n  \"highRow\",\n  \"hipAbductor\",\n  \"hipAdductor\",\n  \"hipThrust\",\n  \"inclineBenchPress\",\n  \"inclineChestFly\",\n  \"inclineChestPress\",\n  \"inclineCurl\",\n  \"inclineRow\",\n  \"invertedRow\",\n  \"isoLateralChestPress\",\n  \"isoLateralRow\",\n  \"jackknifeSitUp\",\n  \"jumpRope\",\n  \"jumpSquat\",\n  \"jumpingJack\",\n  \"kettlebellSwing\",\n  \"kettlebellTurkishGetUp\",\n  \"kippingPullUp\",\n  \"kneeRaise\",\n  \"kneelingPulldown\",\n  \"kneestoElbows\",\n  \"latPulldown\",\n  \"lateralBoxJump\",\n  \"lateralRaise\",\n  \"legExtension\",\n  \"legPress\",\n  \"lunge\",\n  \"lyingLegCurl\",\n  \"mountainClimber\",\n  \"muscleUp\",\n  \"obliqueCrunch\",\n  \"overheadPress\",\n  \"overheadSquat\",\n  \"pecDeck\",\n  \"pendlayRow\",\n  \"pistolSquat\",\n  \"plank\",\n  \"powerClean\",\n  \"powerSnatch\",\n  \"preacherCurl\",\n  \"pressUnder\",\n  \"pullUp\",\n  \"pullover\",\n  \"pushPress\",\n  \"pushUp\",\n  \"reverseCrunch\",\n  \"reverseCurl\",\n  \"reverseFly\",\n  \"reverseGripConcentrationCurl\",\n  \"reverseHyperextension\",\n  \"reverseWristCurl\",\n  \"reverseLunge\",\n  \"reversePlank\",\n  \"romanianDeadlift\",\n  \"rowing\",\n  \"russianTwist\",\n  \"seatedCalfRaise\",\n  \"seatedLegCurl\",\n  \"seatedLegPress\",\n  \"seatedOverheadPress\",\n  \"seatedPalmsUpWristCurl\",\n  \"seatedRow\",\n  \"seatedWideGripRow\",\n  \"shoulderPress\",\n  \"shrug\",\n  \"sideBend\",\n  \"sideCrunch\",\n  \"sideHipAbductor\",\n  \"sideLyingClam\",\n  \"sidePlank\",\n  \"singleLegBridge\",\n  \"singleLegDeadlift\",\n  \"singleLegGluteBridgeBench\",\n  \"singleLegGluteBridgeStraight\",\n  \"singleLegGluteBridgeBentKnee\",\n  \"singleLegHipThrust\",\n  \"sitUp\",\n  \"skullcrusher\",\n  \"snatch\",\n  \"snatchPull\",\n  \"splitSquat\",\n  \"splitJerk\",\n  \"squat\",\n  \"squatRow\",\n  \"standingCalfRaise\",\n  \"stepUp\",\n  \"stiffLegDeadlift\",\n  \"straightLegDeadlift\",\n  \"sumoDeadlift\",\n  \"sumoDeadliftHighPull\",\n  \"superman\",\n  \"tBarRow\",\n  \"thruster\",\n  \"toesToBar\",\n  \"torsoRotation\",\n  \"trapBarDeadlift\",\n  \"tricepsDip\",\n  \"tricepsExtension\",\n  \"tricepsPushdown\",\n  \"uprightRow\",\n  \"vUp\",\n  \"widePullUp\",\n  \"wristCurl\",\n  \"wristRoller\",\n  \"zercherSquat\",\n] as const;\n\nexport const availableMuscles = [\n  \"Adductor Brevis\",\n  \"Adductor Longus\",\n  \"Adductor Magnus\",\n  \"Biceps Brachii\",\n  \"Brachialis\",\n  \"Brachioradialis\",\n  \"Deltoid Anterior\",\n  \"Deltoid Lateral\",\n  \"Deltoid Posterior\",\n  \"Erector Spinae\",\n  \"Gastrocnemius\",\n  \"Gluteus Maximus\",\n  \"Gluteus Medius\",\n  \"Hamstrings\",\n  \"Iliopsoas\",\n  \"Infraspinatus\",\n  \"Latissimus Dorsi\",\n  \"Levator Scapulae\",\n  \"Obliques\",\n  \"Pectineous\",\n  \"Pectoralis Major Clavicular Head\",\n  \"Pectoralis Major Sternal Head\",\n  \"Quadriceps\",\n  \"Rectus Abdominis\",\n  \"Sartorius\",\n  \"Serratus Anterior\",\n  \"Soleus\",\n  \"Splenius\",\n  \"Sternocleidomastoid\",\n  \"Tensor Fasciae Latae\",\n  \"Teres Major\",\n  \"Teres Minor\",\n  \"Tibialis Anterior\",\n  \"Trapezius Lower Fibers\",\n  \"Trapezius Middle Fibers\",\n  \"Trapezius Upper Fibers\",\n  \"Triceps Brachii\",\n  \"Wrist Extensors\",\n  \"Wrist Flexors\",\n] as const;\n\nexport const TMuscle = t.keyof(\n  availableMuscles.reduce<Record<IArrayElement<typeof availableMuscles>, null>>(\n    (memo, muscle) => {\n      memo[muscle] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof availableMuscles>, null>\n  ),\n  \"TMuscle\"\n);\nexport type IMuscle = t.TypeOf<typeof TMuscle>;\n\nexport const availableBodyParts = [\n  \"Back\",\n  \"Calves\",\n  \"Chest\",\n  \"Forearms\",\n  \"Hips\",\n  \"Shoulders\",\n  \"Thighs\",\n  \"Upper Arms\",\n  \"Waist\",\n];\n\nexport const exerciseKinds = [\"core\", \"pull\", \"push\", \"legs\", \"upper\", \"lower\"] as const;\nexport const TExerciseKind = t.keyof(\n  exerciseKinds.reduce<Record<IArrayElement<typeof exerciseKinds>, null>>(\n    (memo, kind) => {\n      memo[kind] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof exerciseKinds>, null>\n  ),\n  \"TExerciseKind\"\n);\nexport type IExerciseKind = t.TypeOf<typeof TExerciseKind>;\n\nexport const TBodyPart = t.keyof(\n  availableBodyParts.reduce<Record<IArrayElement<typeof availableBodyParts>, null>>(\n    (memo, muscle) => {\n      memo[muscle] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof availableBodyParts>, null>\n  ),\n  \"TBodyPart\"\n);\nexport type IBodyPart = t.TypeOf<typeof TBodyPart>;\n\nexport const graphExerciseSelectedTypes = [\"weight\", \"volume\"] as const;\nexport const TGraphExerciseSelectedType = t.keyof(\n  graphExerciseSelectedTypes.reduce<Record<IArrayElement<typeof graphExerciseSelectedTypes>, null>>(\n    (memo, muscle) => {\n      memo[muscle] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof graphExerciseSelectedTypes>, null>\n  ),\n  \"TGraphExerciseSelectedType\"\n);\nexport type IGraphExerciseSelectedType = t.TypeOf<typeof TGraphExerciseSelectedType>;\n\nexport const graphMuscleGroupSelectedTypes = [\"volume\", \"sets\"] as const;\nexport const TGraphMuscleGroupSelectedType = t.keyof(\n  graphMuscleGroupSelectedTypes.reduce<Record<IArrayElement<typeof graphMuscleGroupSelectedTypes>, null>>(\n    (memo, muscle) => {\n      memo[muscle] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof graphMuscleGroupSelectedTypes>, null>\n  ),\n  \"TGraphMuscleGroupSelectedType\"\n);\nexport type IGraphMuscleGroupSelectedType = t.TypeOf<typeof TGraphMuscleGroupSelectedType>;\n\nexport type IExerciseSelectedType = \"weight\" | \"volume\";\nexport type IVolumeSelectedType = \"sets\" | \"volume\";\n\nexport const TEquipment = t.string;\nexport type IEquipment = t.TypeOf<typeof TEquipment>;\n\nexport const TExerciseId = t.string;\nexport type IExerciseId = t.TypeOf<typeof TExerciseId>;\n\nexport const TMetaExercises = t.intersection(\n  [\n    t.interface({\n      bodyParts: t.array(TBodyPart),\n      targetMuscles: t.array(TMuscle),\n      synergistMuscles: t.array(TMuscle),\n    }),\n    t.partial({\n      sortedEquipment: t.array(TEquipment),\n    }),\n  ],\n  \"TMetaExercises\"\n);\nexport type IMetaExercises = t.TypeOf<typeof TMetaExercises>;\n\nexport const TExerciseType = t.intersection(\n  [\n    t.interface({\n      id: TExerciseId,\n    }),\n    t.partial({\n      equipment: TEquipment,\n    }),\n  ],\n  \"TExerciseType\"\n);\nexport type IExerciseType = t.TypeOf<typeof TExerciseType>;\n\nexport const TCustomExerciseVariation = t.partial(\n  {\n    equipment: TEquipment,\n    largeImageUrl: t.string,\n    smallImageUrl: t.string,\n    nextLevel: TExerciseType,\n    meta: TMetaExercises,\n    types: t.array(TExerciseKind),\n  },\n  \"TCustomExerciseVariation\"\n);\nexport type ICustomExerciseVariation = t.TypeOf<typeof TCustomExerciseVariation>;\n\nexport const TCustomExercise = t.intersection(\n  [\n    t.interface({\n      vtype: t.literal(\"custom_exercise\"),\n      id: TExerciseId,\n      name: t.string,\n      isDeleted: t.boolean,\n      meta: TMetaExercises,\n    }),\n    t.partial({\n      defaultEquipment: TEquipment,\n      types: t.array(TExerciseKind),\n      clonedFrom: TExerciseType,\n      reuseImageFrom: TExerciseType,\n      nextLevel: TExerciseType,\n      movedTo: TExerciseType,\n      largeImageUrl: t.string,\n      smallImageUrl: t.string,\n      variations: t.array(TCustomExerciseVariation),\n    }),\n  ],\n  \"TCustomExercise\"\n);\nexport type ICustomExercise = t.TypeOf<typeof TCustomExercise>;\nexport type IAllCustomExercises = Partial<Record<string, ICustomExercise>>;\n\nexport const units = [\"kg\", \"lb\"] as const;\n\nexport const TUnit = t.keyof(\n  units.reduce<Record<IArrayElement<typeof units>, null>>(\n    (memo, exerciseType) => {\n      memo[exerciseType] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof units>, null>\n  ),\n  \"TUnit\"\n);\nexport type IUnit = t.TypeOf<typeof TUnit>;\n\nexport const TWeight = t.type(\n  {\n    value: t.number,\n    unit: TUnit,\n  },\n  \"TWeight\"\n);\nexport type IWeight = t.TypeOf<typeof TWeight>;\n\n// The body of the custom assessment-test routes: an `IAssessmentTest` without `id` and `isDeleted`.\n// `AssessmentTest.validate` checks the rest of the rules.\nexport const TAssessmentTestInput = t.intersection(\n  [\n    t.type({\n      name: t.string,\n      group: t.keyof({\n        strength: null,\n        endurance: null,\n        flexibility: null,\n        balance: null,\n        cardio: null,\n        power: null,\n        speed: null,\n        function: null,\n        body: null,\n      }),\n      kind: t.keyof({\n        weightReps: null,\n        reps: null,\n        time: null,\n        length: null,\n        mass: null,\n        distance: null,\n        speed: null,\n        score: null,\n        number: null,\n      }),\n      betterIs: t.keyof({ higher: null, lower: null }),\n      howTo: t.string,\n    }),\n    t.partial({\n      sides: t.literal(true),\n      reps: t.number,\n      exercise: TExerciseType,\n      timer: t.union([\n        t.type({ kind: t.literal(\"countdown\"), seconds: t.number }),\n        t.type({ kind: t.literal(\"stopwatch\") }),\n      ]),\n      labels: t.array(t.string),\n      unit: t.string,\n      extras: t.array(\n        t.intersection([\n          t.type({\n            id: t.string,\n            label: t.string,\n            kind: t.keyof({ number: null, time: null, mass: null, length: null, distance: null, speed: null }),\n          }),\n          t.partial({ unit: t.string }),\n        ])\n      ),\n    }),\n  ],\n  \"TAssessmentTestInput\"\n);\n\nexport const TPlate = t.type(\n  {\n    weight: TWeight,\n    num: t.number,\n  },\n  \"TPlate\"\n);\nexport type IPlate = t.TypeOf<typeof TPlate>;\n\nconst barKeys = [\"barbell\", \"ezbar\", \"dumbbell\"] as const;\n\nexport const TBarKey = t.keyof(\n  barKeys.reduce<Record<IArrayElement<typeof barKeys>, null>>(\n    (memo, barKey) => {\n      memo[barKey] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof barKeys>, null>\n  ),\n  \"TBarKey\"\n);\nexport type IBarKey = t.TypeOf<typeof TBarKey>;\n\nexport const TBars = t.record(TBarKey, TWeight, \"TBars\");\nexport type IBars = t.TypeOf<typeof TBars>;\n\nexport const percentageUnits = [\"%\"] as const;\n\nexport const TPercentageUnit = t.keyof(\n  percentageUnits.reduce<Record<IArrayElement<typeof percentageUnits>, null>>(\n    (memo, exerciseType) => {\n      memo[exerciseType] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof percentageUnits>, null>\n  ),\n  \"TPercentageUnit\"\n);\nexport type IPercentageUnit = t.TypeOf<typeof TPercentageUnit>;\n\nexport const TPercentage = t.type({ value: t.number, unit: TPercentageUnit }, \"TPercentage\");\nexport type IPercentage = t.TypeOf<typeof TPercentage>;\n\nexport const TSet = t.partial(\n  {\n    reps: t.number,\n    originalWeight: t.union([TWeight, TPercentage]),\n    weight: TWeight,\n    id: t.string,\n    minReps: t.number,\n    rpe: t.number,\n    logRpe: t.boolean,\n    timestamp: t.number,\n    isAmrap: t.boolean,\n    label: t.string,\n    timer: t.number,\n    setTimer: t.number,\n    isOverflowSetTimer: t.boolean,\n    isAuto: t.boolean,\n    completedSetTimer: t.number,\n    askWeight: t.boolean,\n    // A set that the user adds, when the exercise has no default set type (T43.3b): it shows the\n    // weight input, but the weight is optional to complete the set.\n    isOptionalWeight: t.boolean,\n    isCompleted: t.boolean,\n    isUnilateral: t.boolean,\n    completedRepsLeft: t.number,\n    completedReps: t.number,\n    completedWeight: TWeight,\n    completedRpe: t.number,\n    programSetIndex: t.number,\n  },\n  \"TSet\"\n);\nexport type ISet = t.TypeOf<typeof TSet>;\n\nexport const TProgramState = t.dictionary(t.string, t.union([t.number, TWeight, TPercentage]), \"TProgramState\");\nexport type IProgramState = t.TypeOf<typeof TProgramState>;\n\nexport const TBlockRepsLogging = t.keyof(\n  { none: null, last: null, firstlast: null, avg: null, each: null, check: null },\n  \"TBlockRepsLogging\"\n);\nexport type IBlockRepsLogging = t.TypeOf<typeof TBlockRepsLogging>;\n\nexport const TBlockLogging = t.type({ rpe: t.boolean, reps: TBlockRepsLogging }, \"TBlockLogging\");\nexport type IBlockLogging = t.TypeOf<typeof TBlockLogging>;\n\nexport const TLevelChange = t.type(\n  {\n    from: TExerciseType,\n    to: TExerciseType,\n    fromName: t.string,\n    toName: t.string,\n    direction: t.union([t.literal(\"up\"), t.literal(\"down\")]),\n    cause: t.union([t.literal(\"auto\"), t.literal(\"manual\")]),\n  },\n  \"TLevelChange\"\n);\nexport type ILevelChange = t.TypeOf<typeof TLevelChange>;\n\nexport const THistoryEntry = t.intersection(\n  [\n    t.interface({\n      exercise: TExerciseType,\n      sets: t.array(TSet),\n      warmupSets: t.array(TSet),\n    }),\n    t.partial({\n      id: t.string,\n      programExerciseId: t.string,\n      state: TProgramState,\n      vars: TProgramState,\n      notes: t.string,\n      changed: t.boolean,\n      isSuppressed: t.boolean,\n      superset: t.string,\n      block: t.intersection(\n        [\n          t.type({ type: t.literal(\"circuit\") }),\n          t.partial({ logging: TBlockLogging, loggedAt: t.number, rpeSetIndexes: t.array(t.number) }),\n        ],\n        \"TBlockConfig\"\n      ),\n      updatePrints: t.array(t.array(t.union([t.number, TWeight, TPercentage]))),\n      leftSets: t.array(TSet),\n      levelChange: TLevelChange,\n    }),\n  ],\n  \"THistoryEntry\"\n);\nexport type IHistoryEntry = t.TypeOf<typeof THistoryEntry>;\n\nexport const TProgramStateMetadataValue = t.partial(\n  {\n    userPrompted: t.boolean,\n  },\n  \"TProgramStateMetadataValue\"\n);\nexport type IProgramStateMetadataValue = t.TypeOf<typeof TProgramStateMetadataValue>;\n\nexport const TProgramStateMetadata = dictionary(t.string, TProgramStateMetadataValue);\nexport type IProgramStateMetadata = t.TypeOf<typeof TProgramStateMetadata>;\n\nexport const TProgramSet = t.intersection(\n  [\n    t.interface({\n      repsExpr: t.string,\n      weightExpr: t.string,\n    }),\n    t.partial({\n      isAmrap: t.boolean,\n      rpeExpr: t.string,\n      minRepsExpr: t.string,\n      logRpe: t.boolean,\n      askWeight: t.boolean,\n      label: t.string,\n      timerExpr: t.string,\n    }),\n  ],\n  \"TProgramSet\"\n);\nexport type IProgramSet = t.TypeOf<typeof TProgramSet>;\n\nexport const TProgramExerciseVariation = t.intersection(\n  [\n    t.interface({\n      sets: t.array(TProgramSet),\n    }),\n    t.partial({\n      quickAddSets: t.boolean,\n    }),\n  ],\n  \"TProgramExerciseVariation\"\n);\nexport type IProgramExerciseVariation = Readonly<t.TypeOf<typeof TProgramExerciseVariation>>;\n\nexport const TProgramExerciseWarmupSet = t.intersection(\n  [\n    t.type({\n      reps: t.number,\n      value: t.union([TWeight, t.number]),\n      threshold: TWeight,\n    }),\n    t.partial({\n      minReps: t.number,\n    }),\n  ],\n  \"TProgramExerciseWarmupSet\"\n);\nexport type IProgramExerciseWarmupSet = Readonly<t.TypeOf<typeof TProgramExerciseWarmupSet>>;\n\nexport const TProgramExerciseReuseLogic = t.type(\n  {\n    selected: t.union([t.string, t.undefined]),\n    states: t.record(t.string, TProgramState),\n  },\n  \"TProgramExerciseReuseLogic\"\n);\nexport type IProgramExerciseReuseLogic = Readonly<t.TypeOf<typeof TProgramExerciseReuseLogic>>;\n\nexport const TProgramExercise = t.intersection(\n  [\n    t.interface({\n      exerciseType: TExerciseType,\n      id: t.string,\n      name: t.string,\n      variations: t.array(TProgramExerciseVariation),\n      state: TProgramState,\n      variationExpr: t.string,\n      finishDayExpr: t.string,\n      descriptions: t.array(t.string),\n    }),\n    t.partial({\n      tags: t.array(t.number),\n      updateDayExpr: t.string,\n      diffPaths: t.array(t.string),\n      description: t.string,\n      descriptionExpr: t.string,\n      quickAddSets: t.boolean,\n      enableRepRanges: t.boolean,\n      enableRpe: t.boolean,\n      stateMetadata: TProgramStateMetadata,\n      timerExpr: t.string,\n      reuseLogic: TProgramExerciseReuseLogic,\n      warmupSets: t.array(TProgramExerciseWarmupSet),\n      reuseFinishDayScript: t.string,\n      reuseUpdateDayScript: t.string,\n    }),\n  ],\n  \"TProgramExercise\"\n);\nexport type IProgramExercise = t.TypeOf<typeof TProgramExercise>;\n\nconst exercisePickerScreens = [\"exercisePicker\", \"customExercise\", \"filter\", \"settings\"] as const;\nexport const TExercisePickerScreen = t.keyof(\n  exercisePickerScreens.reduce<Record<IArrayElement<typeof exercisePickerScreens>, null>>(\n    (memo, muscle) => {\n      memo[muscle] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof exercisePickerScreens>, null>\n  ),\n  \"TExercisePickerScreen\"\n);\nexport type IExercisePickerScreen = t.TypeOf<typeof TExercisePickerScreen>;\n\nexport const exercisePickerSorts = [\"name_asc\", \"similar_muscles\"] as const;\nexport const TExercisePickerSort = t.keyof(\n  exercisePickerSorts.reduce<Record<IArrayElement<typeof exercisePickerSorts>, null>>(\n    (memo, muscle) => {\n      memo[muscle] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof exercisePickerSorts>, null>\n  ),\n  \"TExercisePickerSort\"\n);\nexport type IExercisePickerSort = t.TypeOf<typeof TExercisePickerSort>;\n\nexport const TExercisePickerFilters = t.partial(\n  {\n    equipment: t.array(TEquipment),\n    type: t.array(TExerciseKind),\n    muscles: t.array(TMuscle),\n    isStarred: t.boolean,\n  },\n  \"TExercisePickerFilters\"\n);\nexport type IExercisePickerFilters = t.TypeOf<typeof TExercisePickerFilters>;\n\nexport const TExercisePickerProgramExercise = t.type(\n  {\n    type: t.literal(\"program\"),\n    exerciseType: TExerciseType,\n    week: t.number,\n    dayInWeek: t.number,\n  },\n  \"TExercisePickerProgramExercise\"\n);\nexport type IExercisePickerProgramExercise = t.TypeOf<typeof TExercisePickerProgramExercise>;\n\nexport const TExercisePickerAdhocExercise = t.intersection(\n  [\n    t.interface({\n      type: t.literal(\"adhoc\"),\n      exerciseType: TExerciseType,\n    }),\n    t.partial({\n      label: t.string,\n    }),\n  ],\n  \"ExercisePickerAdhocExercise\"\n);\nexport type IExercisePickerAdhocExercise = t.TypeOf<typeof TExercisePickerAdhocExercise>;\n\nexport const TExercisePickerTemplate = t.intersection(\n  [\n    t.interface({\n      type: t.literal(\"template\"),\n      name: t.string,\n    }),\n    t.partial({\n      label: t.string,\n    }),\n  ],\n  \"ExercisePickerTemplate\"\n);\nexport type IExercisePickerTemplate = t.TypeOf<typeof TExercisePickerTemplate>;\n\nexport const TExercisePickerSelectedExercise = t.union([\n  TExercisePickerProgramExercise,\n  TExercisePickerAdhocExercise,\n  TExercisePickerTemplate,\n]);\nexport type IExercisePickerSelectedExercise = t.TypeOf<typeof TExercisePickerSelectedExercise>;\n\nexport const TExercisePickerState = t.intersection([\n  t.interface({\n    screenStack: t.array(TExercisePickerScreen),\n    sort: TExercisePickerSort,\n    filters: TExercisePickerFilters,\n    selectedExercises: t.array(TExercisePickerSelectedExercise),\n    mode: t.union([t.literal(\"workout\"), t.literal(\"program\")]),\n  }),\n  t.partial({\n    showMuscles: t.boolean,\n    customExerciseName: t.string,\n    label: t.string,\n    templateName: t.string,\n    selectedTab: t.number,\n    editCustomExercise: TCustomExercise,\n    // The type (the variation) that the custom exercise form edits. Without it, the form edits the default variation.\n    editCustomExerciseType: TExerciseType,\n    search: t.string,\n    exerciseType: TExerciseType,\n    entryIndex: t.number,\n  }),\n]);\nexport type IExercisePickerState = t.TypeOf<typeof TExercisePickerState>;\n\nexport const TProgressUi = t.partial(\n  {\n    amrapModal: t.intersection([\n      t.interface({\n        entryIndex: t.number,\n        setIndex: t.number,\n      }),\n      t.partial({\n        isAmrap: t.boolean,\n        logRpe: t.boolean,\n        askWeight: t.boolean,\n        userVars: t.boolean,\n      }),\n    ]),\n    editModal: t.type({\n      programExerciseId: t.string,\n      entryIndex: t.number,\n    }),\n    dateModal: t.type({\n      date: t.string,\n      time: t.number,\n    }),\n    exercisePicker: t.partial({\n      state: TExercisePickerState,\n    }),\n    equipmentModal: t.partial({\n      exerciseType: TExerciseType,\n    }),\n    rm1Modal: t.partial({\n      exerciseType: TExerciseType,\n    }),\n    blockLogModal: t.intersection([\n      t.type({\n        blockName: t.string,\n      }),\n      // Set for a single block (`blockName` is \"\"). Optional so a workout in flight still decodes.\n      t.partial({ entryIndex: t.number }),\n    ]),\n    exerciseBottomSheet: t.type({\n      entryIndex: t.number,\n    }),\n    entryIndexEditMode: t.number,\n    currentEntryIndex: t.number,\n    forceUpdateEntryIndex: t.boolean,\n    isExternal: t.boolean,\n    nativeNotificationScheduled: t.boolean,\n  },\n  \"TProgressUi\"\n);\n\nexport type IProgressUi = t.TypeOf<typeof TProgressUi>;\n\nexport const TProgressMode = t.keyof(\n  {\n    warmup: null,\n    workout: null,\n  },\n  \"TProgressMode\"\n);\n\nexport type IProgressMode = t.TypeOf<typeof TProgressMode>;\n\nexport const TIntervals = t.array(t.tuple([t.number, t.union([t.number, t.undefined, t.null])]), \"TIntervals\");\nexport type IIntervals = t.TypeOf<typeof TIntervals>;\n\nexport const TBlockRun = t.intersection(\n  [\n    t.type({\n      name: t.string,\n      startedAt: t.number,\n      isPaused: t.boolean,\n      pausedAt: t.union([t.number, t.undefined]),\n    }),\n    t.partial({\n      // Set for a single exercise run. That run has `name: \"\"`. A circuit run has no `entryIndex`.\n      entryIndex: t.number,\n    }),\n  ],\n  \"TBlockRun\"\n);\nexport type IBlockRun = t.TypeOf<typeof TBlockRun>;\n\nexport const historyRecordChange = [\"order\"] as const;\nexport const THistoryRecordChange = t.keyof(\n  historyRecordChange.reduce<Record<IArrayElement<typeof historyRecordChange>, null>>(\n    (memo, muscle) => {\n      memo[muscle] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof historyRecordChange>, null>\n  ),\n  \"THistoryRecordChange\"\n);\nexport type IHistoryRecordChange = t.TypeOf<typeof THistoryRecordChange>;\n\nexport const TPlannerProgramDay = t.intersection(\n  [\n    t.interface({\n      name: t.string,\n      exerciseText: t.string,\n    }),\n    t.partial({\n      id: t.string,\n      description: t.string,\n      notes: t.string,\n    }),\n  ],\n  \"TPlannerProgramDay\"\n);\nexport type IPlannerProgramDay = t.TypeOf<typeof TPlannerProgramDay>;\n\nexport const TPlannerProgramWeek = t.intersection(\n  [\n    t.interface({\n      name: t.string,\n      days: t.array(TPlannerProgramDay),\n    }),\n    t.partial({\n      id: t.string,\n      description: t.string,\n      notes: t.string,\n      loop: t.literal(\"start\"),\n    }),\n  ],\n  \"TPlannerProgramWeek\"\n);\nexport type IPlannerProgramWeek = Readonly<t.TypeOf<typeof TPlannerProgramWeek>>;\n\nexport const TPlannerProgram = t.type(\n  {\n    vtype: t.literal(\"planner\"),\n    name: t.string,\n    weeks: t.array(TPlannerProgramWeek),\n  },\n  \"TPlannerProgram\"\n);\nexport type IPlannerProgram = Readonly<t.TypeOf<typeof TPlannerProgram>>;\n\nexport const TProgressionSnapshot = t.type(\n  {\n    planner: TPlannerProgram,\n    nextDay: t.number,\n    rm1: dictionary(t.string, t.union([TWeight, t.null])),\n    afterHash: t.string,\n  },\n  \"TProgressionSnapshot\"\n);\nexport type IProgressionSnapshot = t.TypeOf<typeof TProgressionSnapshot>;\n\nexport const TStoredProgressionSnapshot = t.intersection(\n  [t.type({ historyRecordId: t.number }), TProgressionSnapshot],\n  \"TStoredProgressionSnapshot\"\n);\nexport type IStoredProgressionSnapshot = t.TypeOf<typeof TStoredProgressionSnapshot>;\n\nexport const THistoryRecord = t.intersection(\n  [\n    t.interface({\n      vtype: t.literal(\"history_record\"),\n      // ISO8601, like 2020-02-29T18:02:05+00:00\n      date: t.string,\n      programId: t.string,\n      programName: t.string,\n      day: t.number,\n      dayName: t.string,\n      entries: t.array(THistoryEntry),\n      startTime: t.number,\n      id: t.number,\n    }),\n    t.partial({\n      endTime: t.number,\n      week: t.number,\n      dayInWeek: t.number,\n      ui: TProgressUi,\n      intervals: TIntervals,\n      deletedProgramExercises: dictionary(t.string, t.boolean),\n      userPromptedStateVars: dictionary(t.string, TProgramState),\n      changes: t.array(THistoryRecordChange),\n      timerSince: t.number,\n      timerMode: TProgressMode,\n      timer: t.number,\n      timerEntryIndex: t.number,\n      timerSetIndex: t.number,\n      setTimerSince: t.number,\n      setTimerMode: TProgressMode,\n      setTimerEntryIndex: t.number,\n      setTimerSetIndex: t.number,\n      blockRun: TBlockRun,\n      notes: t.string,\n      exertionRating: t.number,\n      updatedAt: t.number,\n      progressionSnapshot: TProgressionSnapshot,\n    }),\n  ],\n  \"THistoryRecord\"\n);\nexport type IHistoryRecord = t.TypeOf<typeof THistoryRecord>;\n\nexport const TProgramDayEntry = t.type(\n  {\n    exercise: TExerciseType,\n    sets: t.array(TProgramSet),\n  },\n  \"TProgramDayEntry\"\n);\nexport type IProgramDayEntry = Readonly<t.TypeOf<typeof TProgramDayEntry>>;\n\nexport const TProgramWeek = t.intersection(\n  [\n    t.interface({\n      id: t.string,\n      name: t.string,\n      days: t.array(\n        t.type({\n          id: t.string,\n        })\n      ),\n    }),\n    t.partial({\n      description: t.string,\n    }),\n  ],\n  \"TProgramWeek\"\n);\nexport type IProgramWeek = Readonly<t.TypeOf<typeof TProgramWeek>>;\n\nexport const TProgramDay = t.intersection(\n  [\n    t.interface({\n      id: t.string,\n      name: t.string,\n      exercises: t.array(\n        t.type({\n          id: t.string,\n        })\n      ),\n    }),\n    t.partial({ description: t.string }),\n  ],\n  \"TProgramDay\"\n);\nexport type IProgramDay = Readonly<t.TypeOf<typeof TProgramDay>>;\n\nexport const TProgram = t.intersection(\n  [\n    t.interface({\n      vtype: t.literal(\"program\"),\n      exercises: t.array(TProgramExercise),\n      id: t.string,\n      name: t.string,\n      description: t.string,\n      url: t.string,\n      author: t.string,\n      nextDay: t.number,\n      days: t.array(TProgramDay),\n      weeks: t.array(TProgramWeek),\n      isMultiweek: t.boolean,\n      // Free-form display labels set via the trainer program editor's plain-text\n      // \"Tags\" input. Not a controlled vocabulary - see git history for the old\n      // TProgramTag keyof, which rejected any value a trainer actually typed\n      // (e.g. \"strength\") and corrupted client storage on the next load.\n      tags: t.array(t.string),\n    }),\n    t.partial({\n      deletedDays: t.array(t.string),\n      deletedWeeks: t.array(t.string),\n      deletedExercises: t.array(t.string),\n      clonedAt: t.number,\n      descriptionFormat: t.literal(\"layered\"),\n      isDraft: t.boolean,\n      planner: TPlannerProgram,\n      updatedAt: t.number,\n      authorid: t.union([t.string, t.null]),\n      source: t.union([t.string, t.null]),\n      frequency: t.union([t.literal(3), t.literal(4), t.literal(5), t.literal(6)]),\n      age: t.union([t.literal(\"less_than_3_months\"), t.literal(\"3_to_12_months\"), t.literal(\"more_than_year\")]),\n      duration: t.union([t.literal(\"30-45\"), t.literal(\"45-60\"), t.literal(\"60-90\"), t.literal(\"90+\")]),\n      goal: t.union([t.literal(\"strength\"), t.literal(\"hypertrophy\"), t.literal(\"strength_and_hypertrophy\")]),\n    }),\n  ],\n  \"TProgram\"\n);\nexport type IProgram = t.TypeOf<typeof TProgram>;\n\nexport const lengthUnits = [\"in\", \"cm\"] as const;\n\nexport const TLengthUnit = t.keyof(\n  lengthUnits.reduce<Record<IArrayElement<typeof lengthUnits>, null>>(\n    (memo, exerciseType) => {\n      memo[exerciseType] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof lengthUnits>, null>\n  ),\n  \"TUnit\"\n);\nexport type ILengthUnit = t.TypeOf<typeof TLengthUnit>;\n\nexport const TLength = t.type({ value: t.number, unit: TLengthUnit }, \"TLength\");\nexport type ILength = t.TypeOf<typeof TLength>;\n\nexport const TStatsWeightValue = t.intersection(\n  [t.interface({ vtype: t.literal(\"stat\"), value: TWeight, timestamp: t.number }), t.partial({ updatedAt: t.number })],\n  \"TStatsWeightValue\"\n);\nexport type IStatsWeightValue = t.TypeOf<typeof TStatsWeightValue>;\n\nexport const statsWeightDef = {\n  weight: t.array(TStatsWeightValue),\n};\nexport const TStatsWeight = t.partial(statsWeightDef, \"TStatsWeight\");\nexport type IStatsWeight = t.TypeOf<typeof TStatsWeight>;\n\nexport const TStatsLengthValue = t.intersection(\n  [t.interface({ vtype: t.literal(\"stat\"), value: TLength, timestamp: t.number }), t.partial({ updatedAt: t.number })],\n  \"TStatsLengthValue\"\n);\nexport type IStatsLengthValue = t.TypeOf<typeof TStatsLengthValue>;\n\nexport const statsLengthDef = {\n  neck: t.array(TStatsLengthValue),\n  shoulders: t.array(TStatsLengthValue),\n  bicepLeft: t.array(TStatsLengthValue),\n  bicepRight: t.array(TStatsLengthValue),\n  forearmLeft: t.array(TStatsLengthValue),\n  forearmRight: t.array(TStatsLengthValue),\n  chest: t.array(TStatsLengthValue),\n  waist: t.array(TStatsLengthValue),\n  hips: t.array(TStatsLengthValue),\n  thighLeft: t.array(TStatsLengthValue),\n  thighRight: t.array(TStatsLengthValue),\n  calfLeft: t.array(TStatsLengthValue),\n  calfRight: t.array(TStatsLengthValue),\n};\nexport const TStatsLength = t.partial(statsLengthDef, \"TStatsLength\");\nexport type IStatsLength = t.TypeOf<typeof TStatsLength>;\n\nexport const TStatsPercentageValue = t.intersection(\n  [\n    t.interface({ vtype: t.literal(\"stat\"), value: TPercentage, timestamp: t.number }),\n    t.partial({ updatedAt: t.number }),\n  ],\n  \"TStatsPercentageValue\"\n);\nexport type IStatsPercentageValue = t.TypeOf<typeof TStatsPercentageValue>;\n\nexport const statsPercentageDef = {\n  bodyfat: t.array(TStatsPercentageValue),\n};\nexport const TStatsPercentage = t.partial(statsPercentageDef, \"TStatsPercentage\");\nexport type IStatsPercentage = t.TypeOf<typeof TStatsPercentage>;\n\nexport type IStatsKey = keyof IStatsLength | keyof IStatsWeight | keyof IStatsPercentage;\n\nexport const TStatsWeightEnabled = t.partial(\n  ObjectUtils.keys(statsWeightDef).reduce<Record<keyof IStatsWeight, t.BooleanC>>(\n    (memo, key) => {\n      memo[key] = t.boolean;\n      return memo;\n    },\n    {} as Record<keyof IStatsWeight, t.BooleanC>\n  ),\n  \"TStatsWeightEnabled\"\n);\nexport type IStatsWeightEnabled = t.TypeOf<typeof TStatsWeightEnabled>;\n\nexport const TStatsLengthEnabled = t.partial(\n  ObjectUtils.keys(statsLengthDef).reduce<Record<keyof IStatsLength, t.BooleanC>>(\n    (memo, key) => {\n      memo[key] = t.boolean;\n      return memo;\n    },\n    {} as Record<keyof IStatsLength, t.BooleanC>\n  ),\n  \"TStatsLengthEnabled\"\n);\nexport type IStatsLengthEnabled = t.TypeOf<typeof TStatsLengthEnabled>;\n\nexport const TStatsPercentageEnabled = t.partial(\n  ObjectUtils.keys(statsPercentageDef).reduce<Record<keyof IStatsPercentage, t.BooleanC>>(\n    (memo, key) => {\n      memo[key] = t.boolean;\n      return memo;\n    },\n    {} as Record<keyof IStatsPercentage, t.BooleanC>\n  ),\n  \"TStatsPercentageEnabled\"\n);\n\nexport const TStatsEnabled = t.type(\n  {\n    weight: TStatsWeightEnabled,\n    length: TStatsLengthEnabled,\n    percentage: TStatsPercentageEnabled,\n  },\n  \"TStatsEnabled\"\n);\nexport type IStatsEnabled = Readonly<t.TypeOf<typeof TStatsEnabled>>;\n\nexport const TSettingsTimers = t.intersection(\n  [\n    t.interface({\n      warmup: t.union([t.number, t.undefined, t.null]),\n      workout: t.union([t.number, t.undefined, t.null]),\n    }),\n    t.partial({\n      reminder: t.number,\n      superset: t.number,\n    }),\n  ],\n  \"TSettingsTimers\"\n);\nexport type ISettingsTimers = t.TypeOf<typeof TSettingsTimers>;\n\nexport const TGraph = t.union([\n  t.type({ vtype: t.literal(\"graph\"), type: t.literal(\"exercise\"), id: TExerciseId }),\n  t.type({ vtype: t.literal(\"graph\"), type: t.literal(\"statsWeight\"), id: t.keyof(statsWeightDef) }),\n  t.type({ vtype: t.literal(\"graph\"), type: t.literal(\"statsLength\"), id: t.keyof(statsLengthDef) }),\n  t.type({ vtype: t.literal(\"graph\"), type: t.literal(\"statsPercentage\"), id: t.keyof(statsPercentageDef) }),\n  t.type({ vtype: t.literal(\"graph\"), type: t.literal(\"muscleGroup\"), id: t.string }),\n]);\nexport type IGraph = t.TypeOf<typeof TGraph>;\n\nexport const TEquipmentData = t.intersection(\n  [\n    t.interface({\n      vtype: t.literal(\"equipment_data\"),\n      bar: t.type({\n        lb: TWeight,\n        kg: TWeight,\n      }),\n      multiplier: t.number,\n      plates: t.array(t.type({ weight: TWeight, num: t.number })),\n      fixed: t.array(TWeight),\n      isFixed: t.boolean,\n    }),\n    t.partial({\n      unit: TUnit,\n      name: t.string,\n      similarTo: t.string,\n      isDeleted: t.boolean,\n      useBodyweightForBar: t.boolean,\n      isAssisting: t.boolean,\n      notes: t.string,\n    }),\n  ],\n  \"TEquipmentData\"\n);\nexport type IEquipmentData = t.TypeOf<typeof TEquipmentData>;\nexport type IAllEquipment = Partial<Record<string, IEquipmentData>>;\n\nexport const TGraphOptions = t.partial({\n  movingAverageWindowSize: t.number,\n});\nexport type IGraphOptions = t.TypeOf<typeof TGraphOptions>;\n\nexport const TMuscleMultiplier = t.type(\n  {\n    muscle: TMuscle,\n    multiplier: t.number,\n  },\n  \"TMuscleMultiplier\"\n);\nexport type IMuscleMultiplier = t.TypeOf<typeof TMuscleMultiplier>;\n\nexport const TExerciseDataValue = t.partial(\n  {\n    rm1: TWeight,\n    rounding: t.number,\n    equipment: dictionary(t.string, t.union([t.string, t.undefined])),\n    notes: t.string,\n    muscleMultipliers: t.array(TMuscleMultiplier),\n    isUnilateral: t.boolean,\n  },\n  \"TExerciseDataValue\"\n);\nexport type IExerciseDataValue = t.TypeOf<typeof TExerciseDataValue>;\nexport type IExerciseData = Partial<Record<string, IExerciseDataValue>>;\n\nexport const screenMuscles: string[] = [\n  \"shoulders\",\n  \"triceps\",\n  \"back\",\n  \"abs\",\n  \"glutes\",\n  \"hamstrings\",\n  \"quadriceps\",\n  \"chest\",\n  \"biceps\",\n  \"calves\",\n  \"forearms\",\n];\n\nexport const TScreenMuscle = t.union(\n  [\n    t.keyof(\n      screenMuscles.reduce<Record<IArrayElement<typeof screenMuscles>, null>>(\n        (memo, muscle) => {\n          memo[muscle] = null;\n          return memo;\n        },\n        {} as Record<IArrayElement<typeof screenMuscles>, null>\n      )\n    ),\n    t.string,\n  ],\n  \"TScreenMuscle\"\n);\nexport type IScreenMuscle = t.TypeOf<typeof TScreenMuscle>;\n\nexport const TPlannerSettings = t.type(\n  {\n    synergistMultiplier: t.number,\n    strengthSetsPct: t.number,\n    hypertrophySetsPct: t.number,\n    weeklyRangeSets: dictionary(TScreenMuscle, t.tuple([t.number, t.number])),\n    weeklyFrequency: dictionary(TScreenMuscle, t.number),\n  },\n  \"TPlannerSettings\"\n);\nexport type IPlannerSettings = t.TypeOf<typeof TPlannerSettings>;\n\nexport const TGym = t.type(\n  {\n    vtype: t.literal(\"gym\"),\n    id: t.string,\n    name: t.string,\n    equipment: dictionary(TEquipment, TEquipmentData),\n  },\n  \"TGym\"\n);\nexport type IGym = t.TypeOf<typeof TGym>;\n\nexport const targetTypes = [\"target\", \"lasttime\", \"platescalculator\", \"e1rm\"] as const;\nexport const TTargetType = t.keyof(\n  targetTypes.reduce<Record<IArrayElement<typeof targetTypes>, null>>(\n    (memo, exerciseType) => {\n      memo[exerciseType] = null;\n      return memo;\n    },\n    {} as Record<IArrayElement<typeof targetTypes>, null>\n  ),\n  \"TTargetType\"\n);\nexport type ITargetType = t.TypeOf<typeof TTargetType>;\n\nexport const TWorkoutSettings = t.intersection(\n  [\n    t.interface({\n      targetType: TTargetType,\n    }),\n    t.partial({\n      shouldHideGraphs: t.boolean,\n      shouldKeepProgramExerciseId: t.boolean,\n    }),\n  ],\n  \"TWorkoutSettings\"\n);\n\nexport type IWorkoutSettings = t.TypeOf<typeof TWorkoutSettings>;\n\nexport const TGraphs = t.type({\n  vtype: t.literal(\"graphs\"),\n  graphs: t.array(TGraph),\n});\n\nexport const TMuscleGroupsSettings = t.type({\n  vtype: t.literal(\"muscle_groups_settings\"),\n  data: t.dictionary(\n    t.string,\n    t.partial({\n      name: t.string,\n      isHidden: t.boolean,\n      muscles: t.array(TMuscle),\n    })\n  ),\n});\nexport type IMuscleGroupsSettings = t.TypeOf<typeof TMuscleGroupsSettings>;\n\nexport const TSettings = t.intersection(\n  [\n    t.interface({\n      timers: TSettingsTimers,\n      gyms: t.array(TGym),\n      deletedGyms: t.array(t.string),\n      graphs: TGraphs,\n      graphOptions: dictionary(t.string, TGraphOptions),\n      graphsSettings: t.partial({\n        isSameXAxis: t.boolean,\n        isWithBodyweight: t.boolean,\n        isWithOneRm: t.boolean,\n        isWithProgramLines: t.boolean,\n        defaultType: TGraphExerciseSelectedType,\n        defaultMuscleGroupType: TGraphMuscleGroupSelectedType,\n      }),\n      exerciseStatsSettings: t.partial({\n        ascendingSort: t.boolean,\n        hideWithoutWorkoutNotes: t.boolean,\n        hideWithoutExerciseNotes: t.boolean,\n      }),\n      exercises: dictionary(t.string, TCustomExercise),\n      statsEnabled: TStatsEnabled,\n      units: TUnit,\n      lengthUnits: TLengthUnit,\n      volume: t.number,\n      exerciseData: dictionary(t.string, TExerciseDataValue),\n      planner: TPlannerSettings,\n      workoutSettings: TWorkoutSettings,\n      muscleGroups: TMuscleGroupsSettings,\n    }),\n    t.partial({\n      ignoreDoNotDisturb: t.boolean,\n      currentGymId: t.string,\n      nickname: t.string,\n      alwaysOnDisplay: t.boolean,\n      vibration: t.boolean,\n      startWeekFromMonday: t.boolean,\n      textSize: t.number,\n      starredExercises: dictionary(TExerciseId, t.boolean),\n      theme: t.union([t.literal(\"dark\"), t.literal(\"light\")]),\n      currentBodyweight: TWeight,\n      // The note that the trainer sent with the last assign. Trainer only.\n      assignMessage: t.type({ programId: t.string, message: t.string, sentAt: t.number }),\n      // When the client saw the assign message (the `sentAt` of it). Client only.\n      assignMessageSeenAt: t.number,\n      // True when the client turned off the in-app timers for timer sets and circuits. Absent means on. Client only.\n      disableInAppTimers: t.boolean,\n      // When the trainer made the program current. Trainer only.\n      programAssignedAt: t.type({ programId: t.string, at: t.number }),\n      // Weekly check-ins. Present: on. Trainer only. See `app/shared/models/checkIn.ts`.\n      checkIn: t.intersection([\n        t.type({ everyWeeks: t.union([t.literal(1), t.literal(2), t.literal(4)]) }),\n        t.partial({ turnedOnAt: t.number, trainerName: t.string, changedAt: t.number }),\n      ]),\n      // The latest due date that the client answered (\"YYYY-MM-DD\"). Client only.\n      checkInAnsweredFor: t.string,\n      // A check-in that the trainer asked for now. Trainer only.\n      checkInRequest: t.type({ requestedAt: t.number }),\n      // The questions on the check-in form. Trainer only. See `app/shared/models/checkInQuestions.ts`.\n      checkInForm: t.type({\n        questionIds: t.array(\n          t.union([\n            t.literal(\"soreness\"),\n            t.literal(\"energy\"),\n            t.literal(\"sleep\"),\n            t.literal(\"stress\"),\n            t.literal(\"progress\"),\n            t.literal(\"note\"),\n          ])\n        ),\n        own: t.boolean,\n      }),\n      // The assessment schedules, 0 to 3. Trainer only. See `app/shared/models/assessment.ts`.\n      assessments: t.array(t.any),\n      // An assessment that the trainer asked for now. Trainer only. See `app/shared/models/assessment.ts`.\n      assessmentRequest: t.any,\n      // The results that the client sent, by id. The phone only adds one. See `app/shared/models/assessmentResult.ts`.\n      assessmentResults: dictionary(t.string, t.any),\n      // The `requestedAt` that the client answered. Client only.\n      checkInRequestAnsweredAt: t.number,\n      // The `changedAt` of the cadence notice that the client saw. Client only.\n      checkInChangeSeenAt: t.number,\n      // The Getting started checklist. Client only. See `app/shared/models/onboarding.ts`.\n      onboarding: t.partial({\n        // Present: show the checklist. Set at invite finish.\n        checklistStartedAt: t.number,\n        // \"I'm all done\" was confirmed.\n        finishedAt: t.number,\n        // \"Skip tour\" was tapped. The tour item stays not done.\n        tourSkippedAt: t.number,\n        doneItems: t.array(\n          t.union([t.literal(\"units\"), t.literal(\"equipment\"), t.literal(\"install\"), t.literal(\"tour\")])\n        ),\n      }),\n      // The day of the check-in. Both sides write it.\n      checkInDay: t.type({\n        day: t.type({ weekday: t.number, anchorDate: t.string }),\n        timeZone: t.string,\n        picked: t.boolean,\n      }),\n    }),\n  ],\n  \"TSettings\"\n);\n\nexport type ISettings = t.TypeOf<typeof TSettings>;\n\nexport const TStats = t.type(\n  {\n    weight: TStatsWeight,\n    length: TStatsLength,\n    percentage: TStatsPercentage,\n  },\n  \"TStats\"\n);\nexport type IStats = t.TypeOf<typeof TStats>;\n\nexport const TStorage = t.intersection(\n  [\n    t.interface({\n      history: t.array(THistoryRecord),\n      deletedHistory: t.array(t.number),\n      stats: TStats,\n      deletedStats: t.array(t.number),\n      settings: TSettings,\n      currentProgramId: t.union([t.string, t.undefined]),\n      version: t.string,\n      programs: t.array(TProgram),\n      deletedPrograms: t.array(t.number),\n      reviewRequests: t.array(t.number),\n      signupRequests: t.array(t.number),\n      helps: t.array(t.string),\n      email: t.union([t.string, t.undefined]),\n    }),\n    t.partial({\n      originalId: t.number,\n      id: t.number,\n      referrer: t.string,\n      attribution: t.string,\n      _versions: t.unknown, // Legacy vector clocks. Kept in stored data until the contract release.\n    }),\n  ],\n  \"TStorage\"\n);\nexport type IStorage = t.TypeOf<typeof TStorage>;\n\nexport type IPartialStorage = Omit<IStorage, \"history\" | \"stats\" | \"programs\"> &\n  Partial<Pick<IStorage, \"history\" | \"stats\" | \"programs\">>;\n\nexport type IProgramContentSettings = Partial<\n  Pick<ISettings, \"units\" | \"planner\" | \"muscleGroups\" | \"exerciseData\"> & { timers: Partial<ISettings[\"timers\"]> }\n>;\n\nexport const TMuscleGeneratorResponse = t.type(\n  {\n    targetMuscles: t.array(TMuscle),\n    synergistMuscles: t.array(TMuscle),\n    types: t.array(TExerciseKind),\n  },\n  \"TMusclesGeneratorResponse\"\n);\nexport type IMuscleGeneratorResponse = t.TypeOf<typeof TMuscleGeneratorResponse>;\n\nexport type IDayData = {\n  week?: number;\n  day: number;\n  dayInWeek?: number;\n};\n\nexport type IShortDayData = {\n  week: number;\n  dayInWeek: number;\n};\n\nexport type IDaySetData = {\n  week: number;\n  dayInWeek: number;\n  setVariation: number;\n  set: number;\n};\n\n// Sync units (see SPEC-sync-ownership.md). A unit is the smallest piece of data with its own revision.\nexport type IUnitKey = string;\nexport type IUnitRevs = { rev: number; trainerRev: number };\nexport type IUnitOwnership = \"trainerOnly\" | \"progression\" | \"shared\" | \"clientOnly\" | \"clientCreated\";\n","import { ICustomExercise, ICustomExerciseVariation, IExerciseType } from \"../types\";\n\nexport namespace CustomExerciseVariation {\n  export const MAX_VARIATIONS = 20;\n\n  export function list(exercise: ICustomExercise): ICustomExerciseVariation[] {\n    if (exercise.variations == null || exercise.variations.length === 0) {\n      throw new Error(`Custom exercise ${exercise.id} has no variations`);\n    }\n    return exercise.variations.map((v) => (v.meta ? v : { ...v, meta: exercise.meta }));\n  }\n\n  export function defaultVariation(exercise: ICustomExercise): ICustomExerciseVariation {\n    const variations = list(exercise);\n    return variations.find((v) => v.equipment == null) ?? variations[0];\n  }\n\n  export function resolve(exercise: ICustomExercise, type: IExerciseType): IExerciseType {\n    if (type.equipment != null) {\n      return type;\n    }\n    const equipment = defaultVariation(exercise).equipment;\n    return equipment != null ? { ...type, equipment } : type;\n  }\n\n  export function find(exercise: ICustomExercise, type: IExerciseType): ICustomExerciseVariation | undefined {\n    const equipment = resolve(exercise, type).equipment;\n    return list(exercise).find((v) => v.equipment === equipment);\n  }\n\n  function applyPatch(\n    target: ICustomExerciseVariation,\n    patch: Partial<ICustomExerciseVariation>\n  ): ICustomExerciseVariation {\n    const result: Record<string, unknown> = { ...(target as Record<string, unknown>) };\n    for (const key of Object.keys(patch) as (keyof ICustomExerciseVariation)[]) {\n      if (patch[key] === undefined) {\n        delete result[key];\n      } else {\n        result[key] = patch[key];\n      }\n    }\n    return result as ICustomExerciseVariation;\n  }\n\n  export function update(\n    exercise: ICustomExercise,\n    equipment: string | undefined,\n    patch: Partial<ICustomExerciseVariation>\n  ): ICustomExercise {\n    const target = equipment ?? defaultVariation(exercise).equipment;\n    const variations = exercise.variations ?? [];\n    if (!variations.some((v) => v.equipment === target)) {\n      return exercise;\n    }\n    return {\n      ...exercise,\n      variations: variations.map((v) => (v.equipment === target ? applyPatch(v, patch) : v)),\n    };\n  }\n\n  export function toStored(exercise: ICustomExercise): ICustomExercise {\n    const variations = list(exercise);\n    const def = defaultVariation(exercise);\n    const result: Record<string, unknown> = { ...exercise };\n    for (const key of [\"largeImageUrl\", \"smallImageUrl\", \"nextLevel\", \"types\", \"defaultSets\", \"defaultEquipment\"]) {\n      delete result[key];\n    }\n    result.variations = variations;\n    result.meta = def.meta ?? exercise.meta;\n    if (def.equipment != null) {\n      result.defaultEquipment = def.equipment;\n    }\n    return result as ICustomExercise;\n  }\n\n  export function validate(exercise: ICustomExercise): string | undefined {\n    const variations = exercise.variations;\n    if (variations == null || variations.length === 0) {\n      return \"An exercise needs at least one variation\";\n    }\n    if (variations.length > MAX_VARIATIONS) {\n      return `An exercise can have at most ${MAX_VARIATIONS} variations`;\n    }\n    const seen = new Set<string | undefined>();\n    for (const v of variations) {\n      if (seen.has(v.equipment)) {\n        return v.equipment == null\n          ? \"An exercise can have only one variation without equipment\"\n          : `Equipment \"${v.equipment}\" is in two variations`;\n      }\n      seen.add(v.equipment);\n    }\n    return undefined;\n  }\n}\n","export class SetUtils {\n  public static areEqual<T>(a: Set<T>, b: Set<T>): boolean {\n    if (a.size !== b.size) {\n      return false;\n    }\n    for (const item of a) {\n      if (!b.has(item)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  public static areAllEqual<T>(sets: Set<T>[]): boolean {\n    if (sets.length < 2) {\n      return true;\n    }\n\n    const [first, ...rest] = sets;\n    for (const set of rest) {\n      if (!this.areEqual(first, set)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  public static containsAnyValues<T>(within: Set<T>, from: Set<T>): boolean {\n    for (const item of from) {\n      if (within.has(item)) {\n        return true;\n      }\n    }\n    return false;\n  }\n}\n","export interface ILayeredSection {\n  level: 1 | 2 | 3;\n  title: string;\n  preview: string;\n  body: string;\n  children: ILayeredSection[];\n}\n\nexport interface ILayeredText {\n  gist: string;\n  sections: ILayeredSection[];\n}\n\nexport type ILayeredTextFormat = \"layered\" | \"html\" | \"legacy\";\n\nexport interface IDescriptionSource {\n  description: string;\n  descriptionFormat?: \"layered\";\n}\n\nconst headingRegex = /^ {0,3}(#{1,3}) +(.*)$/;\nconst fenceOpenRegex = /^ {0,3}(`{3,}|~{3,})(.*)$/;\nconst listItemRegex = /^ {0,3}(?:[-*+]|\\d{1,9}[.)])(?: +|$)/;\nconst imageRegex = /!\\[([^\\]]*)\\]\\((?:[^()\\s]|\\([^()]*\\))*(?:\\s+\"[^\"]*\")?\\s*\\)/g;\n\n// What `linkTerms` needs of a glossary: the keys. `IGlossary` fits.\nexport type ITermLookup = Partial<Record<string, { term: string }>>;\n\nconst termLinkRegex = /^\\[\\[([^[\\]]*)\\]\\]/;\n// ASCII punctuation that can start Markdown syntax. A backslash before it shows the character as text.\nconst markdownSpecialRegex = /[\\\\`*_[\\]<>~!()&|#+.:@-]/g;\n\nconst namedEntities: Partial<Record<string, string>> = {\n  amp: \"&\",\n  lt: \"<\",\n  gt: \">\",\n  quot: '\"',\n  apos: \"'\",\n  nbsp: \" \",\n};\n\nexport namespace LayeredText {\n  export const maxLength = 40000;\n  export const maxBytes = 120000;\n\n  export function isTooLong(text: string): boolean {\n    if (text.length > maxLength) {\n      return true;\n    }\n    return new TextEncoder().encode(text).length > maxBytes;\n  }\n\n  export const tooLongMessage = `The description is too long. The limit is ${maxLength.toLocaleString(\"en-US\")} characters.`;\n\n  export const maxTermLength = 40;\n\n  // NFC, trimmed, runs of spaces become one space, lower case (not the locale-sensitive one). Two terms with the same\n  // key are the same term.\n  export function termKey(term: string): string {\n    return term.normalize(\"NFC\").trim().replace(/ +/g, \" \").toLowerCase();\n  }\n\n  // 1 to 40 characters of letters, combining marks, digits, spaces, `-` and `'`. `/` and `.` are not allowed, so a\n  // term key is safe in a URL path.\n  export function isValidTerm(term: string): boolean {\n    const key = termKey(term);\n    return [...key].length >= 1 && [...key].length <= maxTermLength && /^[\\p{L}\\p{M}\\p{N} '-]+$/u.test(key);\n  }\n\n  // `[[shown|Term]]` becomes `[shown](#glossary-<encoded key>)` for a known term, and the shown words (escaped for\n  // Markdown) for an unknown one. A term with a bad character stays as it is. It runs before micromark. Code fences,\n  // indented code, inline code, link labels and targets and headings are text: nothing changes there.\n  export function linkTerms(markdown: string, glossary: ITermLookup): string {\n    return mapTerms(markdown, (term, shown) => {\n      const key = termKey(term);\n      const words = escapeMarkdown(shown);\n      return Object.prototype.hasOwnProperty.call(glossary, key)\n        ? `[${words}](#glossary-${encodeURIComponent(key)})`\n        : words;\n    });\n  }\n\n  // The terms of a text, once each (by key), as first written. It skips the same places as `linkTerms`.\n  export function termsIn(markdown: string): string[] {\n    const seen = new Set<string>();\n    const terms: string[] = [];\n    mapTerms(markdown, (term, shown) => {\n      const key = termKey(term);\n      if (!seen.has(key)) {\n        seen.add(key);\n        terms.push(term.trim());\n      }\n      return shown;\n    });\n    return terms;\n  }\n\n  // Term links as their shown words, for text that is not Markdown (a preview).\n  export function unlinkTerms(text: string): string {\n    return mapTerms(text, (_term, shown) => shown);\n  }\n\n  function escapeMarkdown(text: string): string {\n    return text.replace(markdownSpecialRegex, \"\\\\$&\");\n  }\n\n  // Calls `replace` for each valid term link outside code, link labels and headings.\n  function mapTerms(markdown: string, replace: (term: string, shown: string) => string): string {\n    const out: string[] = [];\n    let fence: { mark: string; length: number } | undefined;\n    let wasBlank = true;\n    let wasCode = false;\n    let inList = false;\n    for (const line of normalizeNewlines(markdown).split(\"\\n\")) {\n      const blank = line.trim() === \"\";\n      if (fence) {\n        out.push(line);\n        const close = line.match(/^ {0,3}(`{3,}|~{3,})[ \\t]*$/);\n        if (close && close[1][0] === fence.mark && close[1].length >= fence.length) {\n          fence = undefined;\n        }\n        continue;\n      }\n      const open = line.match(fenceOpenRegex);\n      if (open && !(open[1][0] === \"`\" && open[2].includes(\"`\"))) {\n        fence = { mark: open[1][0], length: open[1].length };\n        out.push(line);\n        wasBlank = false;\n        wasCode = false;\n        continue;\n      }\n      const isCode: boolean = !blank && /^( {4}|\\t)/.test(line) && (wasBlank || wasCode) && !inList;\n      if (isCode || /^ {0,3}#{1,6}(?: |$)/.test(line)) {\n        out.push(line);\n      } else {\n        out.push(mapLine(line, replace));\n      }\n      if (!blank) {\n        if (listItemRegex.test(line)) {\n          inList = true;\n        } else if (!/^[ \\t]/.test(line)) {\n          inList = false;\n        }\n      }\n      wasCode = isCode || (blank && wasCode);\n      wasBlank = blank;\n    }\n    return out.join(\"\\n\");\n  }\n\n  function mapLine(line: string, replace: (term: string, shown: string) => string): string {\n    let result = \"\";\n    let i = 0;\n    while (i < line.length) {\n      const ch = line[i];\n      if (ch === \"\\\\\") {\n        result += line.slice(i, i + 2);\n        i += 2;\n      } else if (ch === \"`\") {\n        let end = i;\n        while (line[end] === \"`\") {\n          end += 1;\n        }\n        const ticks = line.slice(i, end);\n        let close = line.indexOf(ticks, end);\n        while (close !== -1 && (line[close - 1] === \"`\" || line[close + ticks.length] === \"`\")) {\n          close = line.indexOf(ticks, close + 1);\n        }\n        const stop = close === -1 ? end : close + ticks.length;\n        result += line.slice(i, stop);\n        i = stop;\n      } else if (ch === \"[\") {\n        const term = line.slice(i).match(termLinkRegex);\n        if (term) {\n          const pipe = term[1].indexOf(\"|\");\n          const name = pipe === -1 ? term[1] : term[1].slice(pipe + 1);\n          const shown = pipe === -1 ? term[1].trim() : term[1].slice(0, pipe).trim();\n          result += isValidTerm(name) ? replace(name, shown === \"\" ? name.trim() : shown) : term[0];\n          i += term[0].length;\n          continue;\n        }\n        const labelEnd = closingIndex(line, i, \"[\", \"]\");\n        let stop = i + 1;\n        if (labelEnd !== -1 && (line[labelEnd + 1] === \"(\" || line[labelEnd + 1] === \"[\")) {\n          const open = line[labelEnd + 1];\n          const targetEnd = closingIndex(line, labelEnd + 1, open, open === \"(\" ? \")\" : \"]\");\n          stop = targetEnd === -1 ? labelEnd + 1 : targetEnd + 1;\n        }\n        result += line.slice(i, stop);\n        i = stop;\n      } else {\n        result += ch;\n        i += 1;\n      }\n    }\n    return result;\n  }\n\n  // The index of the bracket that closes the one at `start`, or -1.\n  function closingIndex(line: string, start: number, open: string, close: string): number {\n    let depth = 0;\n    for (let i = start; i < line.length; i += 1) {\n      if (line[i] === \"\\\\\") {\n        i += 1;\n      } else if (line[i] === open) {\n        depth += 1;\n      } else if (line[i] === close) {\n        depth -= 1;\n        if (depth === 0) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n\n  // CRLF and a lone CR become LF.\n  export function normalizeNewlines(text: string): string {\n    return text.replace(/\\r\\n?/g, \"\\n\");\n  }\n\n  // Only the editor uses this, to tell an old HTML description from an old plain-text one. It never decides how a\n  // description shows: `detect()` does that.\n  export function looksLikeHtml(text: string): boolean {\n    return /<\\/?(?:p|div|br|ul|ol|li|h[1-6]|b|i|em|strong|a|span|table|tr|td|img)\\b[^>]*>/i.test(text);\n  }\n\n  // The client copy text after \"Copy from core program\". \"add\" puts a blank line between the two texts. The result\n  // can be over the cap: the editor shows the error and the save is blocked.\n  export function copyFromCore(current: string, core: string, mode: \"replace\" | \"add\"): string {\n    if (mode === \"replace\" || current.trim() === \"\") {\n      return core;\n    }\n    return `${current.replace(/\\n+$/, \"\")}\\n\\n${core}`;\n  }\n\n  export function detect(program: IDescriptionSource, trusted: boolean): ILayeredTextFormat {\n    if (program.descriptionFormat === \"layered\") {\n      return \"layered\";\n    }\n    return trusted ? \"html\" : \"legacy\";\n  }\n\n  export function parse(source: string): ILayeredText {\n    const lines = source.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n    const sections: ILayeredSection[] = [];\n    const stack: ILayeredSection[] = [];\n    let current: string[] = [];\n    let currentSection: ILayeredSection | undefined;\n    let gist = \"\";\n\n    const flush = (): void => {\n      const text = trimBlankLines(current);\n      if (currentSection) {\n        currentSection.body = text;\n        currentSection.preview = preview(text);\n      } else {\n        gist = text;\n      }\n      current = [];\n    };\n\n    let fence: { mark: string; length: number } | undefined;\n    for (const rawLine of lines) {\n      if (fence) {\n        current.push(rawLine);\n        const close = rawLine.match(/^ {0,3}(`{3,}|~{3,})[ \\t]*$/);\n        if (close && close[1][0] === fence.mark && close[1].length >= fence.length) {\n          fence = undefined;\n        }\n        continue;\n      }\n      const open = rawLine.match(fenceOpenRegex);\n      if (open && !(open[1][0] === \"`\" && open[2].includes(\"`\"))) {\n        fence = { mark: open[1][0], length: open[1].length };\n        current.push(rawLine);\n        continue;\n      }\n      const line = withoutImages(rawLine);\n      const heading = parseHeading(line);\n      if (heading == null) {\n        current.push(line);\n        continue;\n      }\n      flush();\n      const section: ILayeredSection = {\n        level: heading.level,\n        title: heading.title,\n        preview: \"\",\n        body: \"\",\n        children: [],\n      };\n      while (stack.length > 0 && stack[stack.length - 1].level >= section.level) {\n        stack.pop();\n      }\n      const parent = stack[stack.length - 1];\n      (parent ? parent.children : sections).push(section);\n      stack.push(section);\n      currentSection = section;\n    }\n    flush();\n    return { gist, sections };\n  }\n\n  export function summary(program: IDescriptionSource, trusted: boolean, limit: number = 140): string {\n    const format = detect(program, trusted);\n    let text: string;\n    if (format === \"layered\") {\n      const parsed = parse(program.description);\n      const first = parsed.gist !== \"\" ? firstParagraph(parsed.gist) : (parsed.sections[0]?.preview ?? \"\");\n      text = stripMarkdown(first);\n    } else if (format === \"html\") {\n      text = firstParagraph(htmlToText(program.description));\n    } else {\n      text = firstParagraph(program.description);\n    }\n    return cut(collapse(text), limit);\n  }\n\n  function parseHeading(line: string): { level: 1 | 2 | 3; title: string } | undefined {\n    const match = line.match(headingRegex);\n    if (match == null) {\n      return undefined;\n    }\n    const title = match[2].replace(/(?:^|[ \\t]+)#+[ \\t]*$/, \"\").trim();\n    if (title === \"\") {\n      return undefined;\n    }\n    return { level: match[1].length as 1 | 2 | 3, title };\n  }\n\n  function withoutImages(line: string): string {\n    return line.includes(\"![\") ? line.replace(imageRegex, \"$1\") : line;\n  }\n\n  function trimBlankLines(lines: string[]): string {\n    let start = 0;\n    let end = lines.length;\n    while (start < end && lines[start].trim() === \"\") {\n      start += 1;\n    }\n    while (end > start && lines[end - 1].trim() === \"\") {\n      end -= 1;\n    }\n    return lines.slice(start, end).join(\"\\n\");\n  }\n\n  // The first block of a body: a paragraph, the first list item, or the first line of a code block.\n  function preview(body: string): string {\n    if (body === \"\") {\n      return \"\";\n    }\n    const lines = body.split(\"\\n\");\n    const first = lines[0];\n    const fence = first.match(fenceOpenRegex);\n    if (fence) {\n      return lines.length > 1 ? lines[1].trim() : \"\";\n    }\n    if (/^( {4}|\\t)/.test(first)) {\n      return first.replace(/^( {4}|\\t)/, \"\").trim();\n    }\n    if (listItemRegex.test(first)) {\n      const item = [first.replace(listItemRegex, \"\")];\n      for (const line of lines.slice(1)) {\n        if (line.trim() === \"\" || listItemRegex.test(line)) {\n          break;\n        }\n        item.push(line);\n      }\n      return item.map((l) => l.trim()).join(\" \");\n    }\n    const paragraph: string[] = [];\n    for (const line of lines) {\n      if (line.trim() === \"\") {\n        break;\n      }\n      paragraph.push(line.trim());\n    }\n    return paragraph.join(\" \");\n  }\n\n  function firstParagraph(text: string): string {\n    const paragraphs = text.replace(/\\r\\n?/g, \"\\n\").split(/\\n[ \\t]*\\n/);\n    return paragraphs.find((p) => p.trim() !== \"\") ?? \"\";\n  }\n\n  function stripMarkdown(text: string): string {\n    return text\n      .replace(/\\[\\[([^\\]|]*)\\|[^\\]]*\\]\\]/g, \"$1\")\n      .replace(/\\[\\[([^\\]]*)\\]\\]/g, \"$1\")\n      .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\")\n      .replace(/^[ \\t]{0,3}(?:#{1,6}[ \\t]+|>[ \\t]?|(?:[-*+]|\\d{1,9}[.)])[ \\t]+)/gm, \"\")\n      .replace(/(\\*\\*|__|~~)(.+?)\\1/g, \"$2\")\n      .replace(/(\\*|_)(\\S(?:.*?\\S)?)\\1/g, \"$2\")\n      .replace(/`+([^`]*)`+/g, \"$1\");\n  }\n\n  export function htmlToText(html: string): string {\n    return html\n      .replace(/<br\\s*\\/?>/gi, \"\\n\")\n      .replace(/<\\/?(?:p|div|h[1-6]|ul|ol|table|blockquote|pre)(?:\\s[^>]*)?>/gi, \"\\n\\n\")\n      .replace(/<\\/(?:li|tr)\\s*>/gi, \"\\n\")\n      .replace(/<[^>]*>/g, \"\")\n      .replace(/&(#x[0-9a-f]+|#\\d+|[a-z]+);/gi, (whole, name: string) => {\n        if (name[0] === \"#\") {\n          const code = name[1].toLowerCase() === \"x\" ? parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10);\n          return code > 0 && code <= 0x10ffff ? String.fromCodePoint(code) : whole;\n        }\n        return namedEntities[name.toLowerCase()] ?? whole;\n      });\n  }\n\n  function collapse(text: string): string {\n    return text.replace(/\\s+/g, \" \").trim();\n  }\n\n  function cut(text: string, limit: number): string {\n    if (text.length <= limit) {\n      return text;\n    }\n    const head = text.slice(0, Math.max(limit - 1, 0));\n    const space = head.lastIndexOf(\" \");\n    // Cut at a word. If the text has no space in the range, cut at the limit.\n    const nextIsSpace = text[head.length] === \" \";\n    const cutAt = nextIsSpace || space <= 0 ? head : head.slice(0, space);\n    return `${cutAt.trimEnd()}…`;\n  }\n}\n","import { allExercisesList } from \"./exercise\";\nimport { ICustomExercise } from \"../types\";\n\nexport namespace ExerciseId {\n  /**\n   * The id before any suffix: camelCase of the bare name. Accents go, each run of other characters splits words,\n   * and a result that is empty or starts with a digit gets the prefix `exercise`. It never has `_`.\n   */\n  export function baseId(name: string): string {\n    const words = name\n      .normalize(\"NFD\")\n      .replace(/[̀-ͯ]/g, \"\")\n      .split(/[^A-Za-z0-9]+/)\n      .filter((w) => w.length > 0);\n    const camel = words\n      .map((w, i) => (i === 0 ? w.toLowerCase() : w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()))\n      .join(\"\");\n    if (camel.length === 0) {\n      return \"exercise\";\n    }\n    return /^[0-9]/.test(camel) ? `exercise${camel}` : camel;\n  }\n\n  /**\n   * The id for a name. An id is taken when it matches, with no regard to case, a built-in id or an id in `taken`\n   * (the trainer's rows, deleted and moved rows included). `ownId` is never taken. When the base id is taken, the\n   * lowest free number from 2 is added.\n   */\n  export function fromName(name: string, taken: Iterable<string>, ownId?: string): string {\n    const used = new Set<string>();\n    for (const id of Object.keys(allExercisesList)) {\n      used.add(id.toLowerCase());\n    }\n    for (const id of taken) {\n      used.add(id.toLowerCase());\n    }\n    if (ownId != null) {\n      used.delete(ownId.toLowerCase());\n    }\n    const base = baseId(name);\n    if (!used.has(base.toLowerCase())) {\n      return base;\n    }\n    let n = 2;\n    while (used.has(`${base}${n}`.toLowerCase())) {\n      n += 1;\n    }\n    return `${base}${n}`;\n  }\n\n  /**\n   * An exercise that is not in `existing` is new: it gets the id of its trimmed name, with `existing` (deleted and\n   * moved rows included) as the taken ids. `alsoTaken` has the ids of rows that the client does not hold. A stored\n   * exercise keeps its id.\n   */\n  export function forNew(\n    exercise: ICustomExercise,\n    existing: Record<string, unknown>,\n    alsoTaken: Iterable<string> = []\n  ): ICustomExercise {\n    if (existing[exercise.id] != null) {\n      return exercise;\n    }\n    return { ...exercise, id: fromName(exercise.name.trim(), [...Object.keys(existing), ...alsoTaken]) };\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Reducer } from \"preact/hooks\";\nimport { emptyProgramId, Program } from \"@shared/models/program\";\nimport { Progress } from \"@shared/models/progress\";\nimport { IBlockRef } from \"@shared/models/block\";\nimport { StateError } from \"./stateError\";\nimport { History } from \"@shared/models/history\";\nimport { ProgressionSnapshot } from \"@shared/models/progressionSnapshot\";\nimport { Storage } from \"@shared/models/storage\";\nimport { Screen, IScreen, IScreenStack, IScreenParams } from \"@shared/models/screen\";\nimport { ILensRecordingPayload, lb, LensBuilder, lf } from \"lens-shmens\";\nimport {\n  buildState,\n  IEnv,\n  IHeldBase,\n  ILocalStorage,\n  INotification,\n  IPhoneSnapshot,\n  IState,\n  IStateErrors,\n  updateState,\n} from \"@shared/models/state\";\nimport { UidFactory } from \"@shared/utils/generator\";\nimport {\n  THistoryRecord,\n  IStorage,\n  IWeight,\n  IProgressMode,\n  ISettings,\n  IHistoryEntry,\n  IHistoryRecord,\n  IPercentage,\n  IProgramState,\n  IStats,\n  IUnitKey,\n} from \"@shared/types\";\nimport { IndexedDBUtils } from \"../utils/indexeddb\";\nimport { Sync } from \"../utils/sync\";\nimport { basicBeginnerProgram } from \"../programs/basicBeginnerProgram\";\nimport { LogUtils } from \"../utils/log\";\nimport { ProgramExercise } from \"@shared/models/programExercise\";\nimport { Service } from \"../api/service\";\nimport { runMigrations, unrunMigrations } from \"@shared/migrations/runner\";\nimport { ObjectUtils } from \"@shared/utils/object\";\nimport { UrlUtils } from \"@shared/utils/url\";\nimport { DateUtils } from \"@shared/utils/date\";\nimport { IReducerOnAction } from \"./types\";\nimport { Thunk } from \"./thunks\";\nimport { CollectionUtils } from \"@shared/utils/collection\";\nimport { deepMerge } from \"@shared/utils/deepMerge\";\nimport { Exercise } from \"@shared/models/exercise\";\nimport { SendMessage } from \"../utils/sendMessage\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { IByExercise } from \"../pages/planner/plannerEvaluator\";\nimport { EditProgramUiHelpers } from \"../components/editProgram/editProgramUi/editProgramUiHelpers\";\nimport { lg } from \"../utils/posthog\";\nimport { Equipment } from \"@shared/models/equipment\";\nimport { Stats } from \"@shared/models/stats\";\nimport { Weight } from \"@shared/models/weight\";\nimport { LiveActivityManager } from \"../utils/liveActivityManager\";\n\ndeclare let __COMMIT_HASH__: string;\n\nconst isLoggingEnabled =\n  typeof window !== \"undefined\" && window?.location\n    ? !!UrlUtils.build(window.location.href).searchParams.get(\"log\")\n    : false;\n\nexport async function getIdbKey(userId?: string, isAdmin?: boolean): Promise<string> {\n  const currentAccount = await IndexedDBUtils.get(\"current_account\");\n  if (currentAccount) {\n    return `liftosaur_${currentAccount}`;\n  } else {\n    return userId != null && isAdmin ? `liftosaur_${userId}` : \"liftosaur\";\n  }\n}\n\ninterface ILoadedLocalStorage {\n  storage: IStorage;\n  snapshot?: IPhoneSnapshot;\n  heldBases?: Record<IUnitKey, IHeldBase>;\n  lastSyncedStorage?: IStorage;\n  hasUnrunMigrations: boolean;\n}\n\n// Migrates the local state and checks the storage type. Returns undefined when the storage fails the check. The\n// first-start converter (step 1) migrates the old app's `lastSyncedStorage` here too, before the check, and keeps it\n// until the converter loads the snapshot (`Sync.applyConversion`).\nasync function loadLocalStorage(\n  client: Window[\"fetch\"],\n  local: ILocalStorage,\n  rawStorage: IStorage\n): Promise<ILoadedLocalStorage | undefined> {\n  const hasUnrunMigrations = unrunMigrations(rawStorage).length > 0;\n  const migrated =\n    hasUnrunMigrations && local.snapshot != null\n      ? await Sync.migrateSnapshot(client, rawStorage.version, local.snapshot, local.heldBases || {})\n      : { snapshot: local.snapshot, heldBases: local.heldBases };\n  const lastSyncedStorage =\n    local.snapshot == null && local.lastSyncedStorage != null\n      ? await runMigrations(client, local.lastSyncedStorage)\n      : undefined;\n  const maybeStorage = await Storage.get(client, rawStorage, true);\n  if (!maybeStorage.success) {\n    return undefined;\n  }\n  return { storage: maybeStorage.data, ...migrated, lastSyncedStorage, hasUnrunMigrations };\n}\n\nexport async function getInitialState(\n  client: Window[\"fetch\"],\n  args?: {\n    url?: URL;\n    rawStorage?: string;\n    storage?: IStorage;\n    serverUser?: { id: string; email: string };\n    startwizard?: boolean;\n  }\n): Promise<IState> {\n  const url = args?.url || UrlUtils.build(document.location.href);\n  const messageerror = url.searchParams.get(\"messageerror\") || undefined;\n  const messagesuccess = url.searchParams.get(\"messagesuccess\") || undefined;\n  const nosync = url.searchParams.get(\"nosync\") === \"true\";\n  // Use startwizard from args (server-provided) or fall back to URL param\n  const startwizard = args?.startwizard ?? url.searchParams.get(\"startwizard\") === \"true\";\n  // Server-provided user data (from session cookie check)\n  const serverUser = args?.serverUser;\n  let storage: ILocalStorage | undefined;\n  if (args?.storage) {\n    storage = { storage: args.storage };\n  } else if (args?.rawStorage != null) {\n    try {\n      storage = JSON.parse(args.rawStorage);\n    } catch (e) {\n      storage = undefined;\n    }\n  }\n  const notification: INotification | undefined =\n    messageerror || messagesuccess\n      ? {\n          type: messageerror ? (\"error\" as const) : (\"success\" as const),\n          content: messageerror || messagesuccess || \"\",\n        }\n      : undefined;\n\n  if (storage != null && storage.storage != null) {\n    const errors: IStateErrors = {};\n    let loaded: ILoadedLocalStorage | undefined;\n    try {\n      loaded = await loadLocalStorage(client, storage, storage.storage);\n    } catch (e) {\n      console.error(e);\n      loaded = undefined;\n    }\n    let finalStorage: IStorage;\n    if (loaded != null) {\n      finalStorage = loaded.storage;\n    } else {\n      // The load never replaces the local data silently (spec \"Migration\", \"Phones\"): the whole local state is backed\n      // up, and the \"Corrupted Storage\" screen shows. The app does not save or sync until the user resets.\n      const service = new Service(client);\n      const userid = `missing-${UidFactory.generateUid(8)}` as string;\n      const backupKey = await service.postDebug(JSON.stringify(storage), { local: \"true\" });\n      errors.corruptedstorage = {\n        userid: backupKey ?? userid,\n        backup: backupKey != null,\n        confirmed: false,\n        local: true,\n      };\n      finalStorage = Storage.getDefault();\n    }\n\n    const isProgressValid =\n      storage.progress != null\n        ? Storage.validateAndReport(storage.progress, THistoryRecord, \"progress\").success\n        : false;\n\n    const screenStack: IScreenStack = startwizard ? [{ name: \"welcome\" }] : [{ name: \"main\" }];\n    return {\n      storage: finalStorage,\n      snapshot: loaded?.snapshot,\n      heldBases: loaded?.heldBases,\n      removedAt: loaded != null ? storage.removedAt : undefined,\n      notSynced: loaded != null ? storage.notSynced : undefined,\n      lastSyncedStorage: loaded?.lastSyncedStorage,\n      progress: isProgressValid ? { 0: storage.progress } : {},\n      notification,\n      loading: { items: {} },\n      programs: [basicBeginnerProgram],\n      revisions: {},\n      screenStack,\n      user: serverUser,\n      freshMigrations: loaded?.hasUnrunMigrations ?? false,\n      errors,\n      nosync,\n    };\n  }\n  const newState = buildState({\n    notification,\n    nosync,\n  });\n  // Set user from server if provided\n  if (serverUser) {\n    newState.user = serverUser;\n  }\n  // Set screenStack to wizard if startwizard is true\n  if (startwizard) {\n    newState.screenStack = [{ name: \"welcome\" }];\n  }\n  LogUtils.log(newState.user?.id, \"ls-initialize-user\", [], () => undefined);\n  return newState;\n}\n\nexport type IChangeDate = {\n  type: \"ChangeDate\";\n  date: string;\n  time: number;\n};\n\nexport type IConfirmDate = {\n  type: \"ConfirmDate\";\n  date?: string;\n  time?: number;\n};\n\nexport type ILoginAction = {\n  type: \"Login\";\n  email: string;\n  userId: string;\n};\n\nexport type ILogoutAction = {\n  type: \"Logout\";\n};\n\nexport type IPushScreen<T extends IScreen> = {\n  type: \"PushScreen\";\n  screen: T;\n  params?: IScreenParams<T>;\n  shouldResetStack?: boolean;\n};\n\nexport type IPullScreen = {\n  type: \"PullScreen\";\n};\n\nexport type ICancelProgress = {\n  type: \"CancelProgress\";\n};\n\nexport type IDeleteProgress = {\n  type: \"DeleteProgress\";\n  time: number;\n};\n\nexport type ICompleteSetAction = {\n  type: \"CompleteSetAction\";\n  entryIndex: number;\n  setIndex: number;\n  programExercise?: IPlannerProgramExercise;\n  otherStates?: IByExercise<IProgramState>;\n  isPlayground: boolean;\n  mode: IProgressMode;\n  forceUpdateEntryIndex: boolean;\n  isExternal: boolean;\n  timestamp?: number;\n};\n\nexport type IFinishProgramDayAction = {\n  type: \"FinishProgramDayAction\";\n  time: number;\n};\n\nexport type IStartProgramDayAction = {\n  type: \"StartProgramDayAction\";\n  programId?: string;\n};\n\nexport type IChangeAMRAPAction = {\n  type: \"ChangeAMRAPAction\";\n  setIndex: number;\n  isPlayground: boolean;\n  entryIndex: number;\n  amrapValue?: number;\n  amrapLeftValue?: number;\n  rpeValue?: number;\n  weightValue?: IWeight;\n  isAmrap?: boolean;\n  logRpe?: boolean;\n  askWeight?: boolean;\n  programExercise?: IPlannerProgramExercise;\n  otherStates?: IByExercise<IProgramState>;\n  userVars?: Record<string, number | IWeight | IPercentage>;\n  isCancel?: boolean;\n};\n\nexport type IApplyBlockLogAction = {\n  type: \"ApplyBlockLogAction\";\n  ref: IBlockRef;\n  rpeValue?: number;\n  reps: Record<string, Progress.IBlockLogRepsValues>;\n};\n\n// Closes the block log modal and writes nothing. A single block uses it for Close (X).\nexport type ICloseBlockLogAction = {\n  type: \"CloseBlockLogAction\";\n};\n\n// Ends a work step of a run: the set is done, then the rest (or the next step) starts.\nexport type IEndWorkStepAction = {\n  type: \"EndWorkStepAction\";\n  entryIndex: number;\n  setIndex: number;\n  isPlayground: boolean;\n  completedSetTimer?: number;\n  timestamp?: number;\n  programExercise?: IPlannerProgramExercise;\n  otherStates?: IByExercise<IProgramState>;\n};\n\nexport type IPauseBlockAction = {\n  type: \"PauseBlockAction\";\n  now: number;\n};\n\nexport type IResumeBlockAction = {\n  type: \"ResumeBlockAction\";\n  now: number;\n};\n\nexport type IUpdateSettingsAction = {\n  type: \"UpdateSettings\";\n  lensRecording: ILensRecordingPayload<ISettings>;\n  desc: string;\n};\n\nexport type IUpdateStateAction = {\n  type: \"UpdateState\";\n  lensRecording: ILensRecordingPayload<IState>[];\n  desc: string;\n  // Set by the practice screens of the app tour. The change applies, but the storage stays as it was.\n  keepStorage?: boolean;\n};\n\nexport type IReplaceStateAction = {\n  type: \"ReplaceState\";\n  state: IState;\n};\n\nexport type IEditHistoryRecordAction = {\n  type: \"EditHistoryRecord\";\n  historyRecord: IHistoryRecord;\n};\n\nexport type IStartTimer = {\n  type: \"StartTimer\";\n  timestamp: number;\n  mode: IProgressMode;\n  entryIndex: number;\n  setIndex: number;\n  timer?: number;\n};\n\nexport type IStopTimer = {\n  type: \"StopTimer\";\n};\n\nexport type IApplyProgramChangesToProgress = {\n  type: \"ApplyProgramChangesToProgress\";\n  programExerciseIds?: string[];\n};\n\nexport type IUpdateProgressAction = {\n  type: \"UpdateProgress\";\n  lensRecordings: ILensRecordingPayload<IHistoryRecord>[];\n  desc: string;\n};\n\nexport type ICardsAction =\n  | ICompleteSetAction\n  | IChangeAMRAPAction\n  | IEndWorkStepAction\n  | IUpdateProgressAction\n  | IApplyBlockLogAction\n  | ICloseBlockLogAction\n  | IPauseBlockAction\n  | IResumeBlockAction;\n\nexport type IAction =\n  | ICardsAction\n  | IStartProgramDayAction\n  | IFinishProgramDayAction\n  | IEditHistoryRecordAction\n  | ICancelProgress\n  | IDeleteProgress\n  | IPushScreen<any>\n  | IPullScreen\n  | IChangeDate\n  | IConfirmDate\n  | ILoginAction\n  | ILogoutAction\n  | IStartTimer\n  | IStopTimer\n  | IUpdateStateAction\n  | IReplaceStateAction\n  | IUpdateSettingsAction\n  | IApplyProgramChangesToProgress;\n\nlet timerId: number | undefined = undefined;\n\nexport function defaultOnActions(env: IEnv): IReducerOnAction[] {\n  return [\n    (dispatch, action, oldState, newState) => {\n      const isFinishDayAction = \"type\" in action && action.type === \"FinishProgramDayAction\";\n      const isMergingStorage =\n        \"type\" in action && action.type === \"UpdateState\" && action.desc === \"Merge synced storage\";\n      if (!isMergingStorage && Storage.isChanged(oldState.storage, newState.storage)) {\n        dispatch(Thunk.sync2({ log: isFinishDayAction }));\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      if (oldState.storage.programs !== newState.storage.programs) {\n        const newProgramIds = newState.storage.programs.map((p) => p.id);\n        if (Array.from(new Set(newProgramIds)).length !== newProgramIds.length) {\n          lg(\"program-duplicate-ids\", {\n            programIds: JSON.stringify(newProgramIds),\n            lastReducerActions: JSON.stringify(\n              (window.reducerLastActions || []).map((a) => [a.type, \"desc\" in a ? a.desc : undefined])\n            ),\n          });\n          const newPrograms = CollectionUtils.uniqBy(newState.storage.programs, \"id\");\n          updateState(\n            dispatch,\n            [lb<IState>().p(\"storage\").pi(\"programs\").record(newPrograms)],\n            \"Remove duplicate programs\"\n          );\n        }\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      const progress = newState.progress[0];\n      if (progress != null) {\n        const oldProgram = Program.getProgram(oldState, progress.programId);\n        const newProgram = Program.getProgram(newState, progress.programId);\n        if (oldProgram != null && newProgram != null && !ObjectUtils.isEqual(oldProgram, newProgram)) {\n          dispatch({ type: \"ApplyProgramChangesToProgress\" });\n        }\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      if (\n        oldState.storage.stats !== newState.storage.stats ||\n        ((newState.storage.stats.weight.weight ?? []).length > 0 && newState.storage.settings.currentBodyweight == null)\n      ) {\n        const oldBodyweight =\n          Stats.getCurrentMovingAverageBodyweight(oldState.storage.stats, oldState.storage.settings) ??\n          Weight.build(0, oldState.storage.settings.units);\n        const newBodyweight =\n          Stats.getCurrentMovingAverageBodyweight(newState.storage.stats, newState.storage.settings) ??\n          Weight.build(0, newState.storage.settings.units);\n        if (!Weight.eq(oldBodyweight, newBodyweight)) {\n          updateState(\n            dispatch,\n            [lb<IState>().p(\"storage\").p(\"settings\").pi(\"currentBodyweight\").record(newBodyweight)],\n            \"Update current bodyweight\"\n          );\n          dispatch({ type: \"ApplyProgramChangesToProgress\" });\n        }\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      if (\"type\" in action && action.type === \"UpdateState\" && (action.desc === \"undo\" || action.desc === \"redo\")) {\n        const oldScreenData = Screen.current(oldState.screenStack);\n        const newScreenData = Screen.current(newState.screenStack);\n        const oldExerciseKey = oldScreenData.name === \"editProgramExercise\" ? oldScreenData.params?.key : undefined;\n        const oldPlannerState =\n          oldScreenData.name === \"editProgramExercise\" ? oldScreenData.params?.plannerState : undefined;\n        const newExerciseKey = newScreenData.name === \"editProgramExercise\" ? newScreenData.params?.key : undefined;\n        const newPlannerState =\n          newScreenData.name === \"editProgramExercise\" ? newScreenData.params?.plannerState : undefined;\n        if (oldPlannerState != null && newPlannerState != null && oldExerciseKey != null && newExerciseKey != null) {\n          const changedKeys = EditProgramUiHelpers.getChangedKeys(\n            oldPlannerState.current.program.planner!,\n            newPlannerState.current.program.planner!,\n            newState.storage.settings\n          );\n          const newKey = changedKeys[oldExerciseKey];\n          if (newKey) {\n            updateState(\n              dispatch,\n              [\n                (\n                  lb<IState>().p(\"screenStack\").findBy(\"name\", \"editProgramExercise\").p(\"params\") as LensBuilder<\n                    IState,\n                    { key: string },\n                    {}\n                  >\n                )\n                  .pi(\"key\")\n                  .record(newKey),\n              ],\n              \"Update exercise key\"\n            );\n          }\n        }\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      const progress = newState.progress[0];\n      if (progress != null) {\n        const oldExerciseData = oldState.storage.settings.exerciseData;\n        const newExerciseData = newState.storage.settings.exerciseData;\n        if (\n          oldExerciseData != null &&\n          newExerciseData != null &&\n          !ObjectUtils.isEqual(oldExerciseData, newExerciseData)\n        ) {\n          const changes = ObjectUtils.changedKeys(oldExerciseData, newExerciseData);\n          if (ObjectUtils.isNotEmpty(changes)) {\n            const changedExercises = ObjectUtils.keys(changes);\n            const affectedEntries = progress.entries.filter((entry) => {\n              const key = Exercise.toKey(entry.exercise);\n              return changedExercises.indexOf(key) !== -1;\n            });\n            if (affectedEntries.length > 0) {\n              dispatch({\n                type: \"ApplyProgramChangesToProgress\",\n                programExerciseIds: CollectionUtils.compact(affectedEntries.map((e) => e.programExerciseId)),\n              });\n            }\n          }\n        }\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      const progress = newState.progress[0];\n      if (progress != null) {\n        const oldEquipment = Equipment.getCurrentGym(oldState.storage.settings).equipment;\n        const newEquipment = Equipment.getCurrentGym(newState.storage.settings).equipment;\n        if (oldEquipment != null && newEquipment != null && !ObjectUtils.isEqual(oldEquipment, newEquipment)) {\n          const changedEquipmentIds = ObjectUtils.keys(ObjectUtils.changedKeys(oldEquipment, newEquipment));\n          const settings = newState.storage.settings;\n          const affectedEntries = progress.entries.filter((entry) => {\n            const equipmentId = Equipment.getEquipmentIdForExerciseType(settings, entry.exercise);\n            return equipmentId != null && changedEquipmentIds.indexOf(equipmentId) !== -1;\n          });\n          if (affectedEntries.length > 0) {\n            dispatch({\n              type: \"ApplyProgramChangesToProgress\",\n              programExerciseIds: CollectionUtils.compact(affectedEntries.map((e) => e.programExerciseId)),\n            });\n          }\n        }\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      if (Screen.currentName(oldState.screenStack) !== Screen.currentName(newState.screenStack)) {\n        setTimeout(() => {\n          window.scroll(0, 0);\n        }, 0);\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      if (\"type\" in action && action.type === \"UpdateState\" && action.desc === \"stop-is-undoing\") {\n        setTimeout(() => {\n          window.isUndoing = false;\n        }, 200);\n      }\n    },\n  ];\n}\n\nexport const reducerWrapper =\n  (storeToLocalStorage: boolean): Reducer<IState, IAction> =>\n  (state, action) => {\n    if (typeof window !== \"undefined\") {\n      window.reducerLastActions = [\n        { ...action, time: DateUtils.formatHHMMSS(Date.now(), true) },\n        ...(window.reducerLastActions || []).slice(0, 30),\n      ];\n      if (window.localStorage) {\n        const lastHistoryRecordStr = window.localStorage.getItem(\"lastHistoryRecord\");\n        if (lastHistoryRecordStr) {\n          const { time, historyRecord } = JSON.parse(lastHistoryRecordStr);\n          const diffTime = Date.now() - time;\n          if (diffTime > 1000 * 10) {\n            window.localStorage.removeItem(\"lastHistoryRecord\");\n            const fromHistory = state.storage.history.find((hr) => hr.id === historyRecord.id);\n            if (!fromHistory) {\n              lg(\"history-record-lost\", {\n                lastActions: JSON.stringify(\n                  window.reducerLastActions.map((a) => [a.type, \"desc\" in a ? a.desc : undefined])\n                ),\n              });\n            } else {\n              lg(\"history-record-ok\");\n            }\n          }\n        }\n      }\n    }\n    const newState = reducer(state, action);\n    const isMergingStorage =\n      \"type\" in action && action.type === \"UpdateState\" && action.desc === \"Merge synced storage\";\n    const isStorageChanged = !isMergingStorage && Storage.isChanged(state.storage, newState.storage);\n    if (!newState.reportedCorruptedStorage && newState.storage !== state.storage) {\n      const validateResult = Storage.validateAndReportStorage(newState.storage);\n      if (!validateResult.success) {\n        newState.reportedCorruptedStorage = true;\n      }\n    }\n\n    if (SendMessage.isIos()) {\n      newStorageApproach(state, newState, isStorageChanged);\n    } else {\n      if (typeof window !== \"undefined\" && window.setTimeout && window.clearTimeout) {\n        if (timerId != null) {\n          window.clearTimeout(timerId);\n        }\n\n        (window as any).state = newState;\n        if (storeToLocalStorage && newState.errors.corruptedstorage == null) {\n          timerId = window.setTimeout(async () => {\n            clearTimeout(timerId);\n\n            const newState2: IState = (window as any).state;\n            timerId = undefined;\n            await saveLocalStorage(newState2);\n          }, 100);\n        }\n      }\n    }\n    return newState;\n  };\n\n// What the phone keeps in IndexedDB. The snapshot replaces the old `lastSyncedStorage`. The old app's\n// `lastSyncedStorage` stays until the first-start converter has used it, so an offline first start keeps it.\nexport function buildLocalStorage(state: IState): ILocalStorage {\n  return {\n    storage: state.storage,\n    snapshot: state.snapshot,\n    heldBases: state.heldBases,\n    removedAt: state.removedAt,\n    notSynced: state.notSynced,\n    ...(state.lastSyncedStorage != null ? { lastSyncedStorage: state.lastSyncedStorage } : {}),\n    progress: state.progress[0],\n  };\n}\n\n// Saves the local state to IndexedDB. Only a logged-in user has a saved state.\nexport async function saveLocalStorage(state: IState): Promise<void> {\n  const userId = state.user?.id;\n  if (!userId) {\n    return;\n  }\n  const localStorage = buildLocalStorage(state);\n  await Promise.all([\n    IndexedDBUtils.set(\"current_account\", userId),\n    IndexedDBUtils.set(`liftosaur_${userId}`, JSON.stringify(localStorage)),\n  ]);\n}\n\nfunction newStorageApproach(oldState: IState, newState: IState, isStorageChanged: boolean): IState {\n  if (typeof window !== \"undefined\") {\n    (window as any).state = newState;\n    const isLocalStorageChanged =\n      isStorageChanged ||\n      oldState.snapshot !== newState.snapshot ||\n      oldState.heldBases !== newState.heldBases ||\n      oldState.removedAt !== newState.removedAt ||\n      oldState.notSynced !== newState.notSynced ||\n      oldState.lastSyncedStorage !== newState.lastSyncedStorage ||\n      Progress.isChanged(oldState.progress[0], newState.progress[0]);\n    if (isLocalStorageChanged && newState.errors.corruptedstorage == null) {\n      const userId = newState.user?.id;\n      saveLocalStorage(newState).then(() => {\n        if (userId) {\n          lg(\"saved-to-storage\", undefined, undefined, userId);\n        }\n      });\n    }\n  }\n  return newState;\n}\n\ninterface ICompletionEffectsParams {\n  entryIndex: number;\n  setIndex: number;\n  mode: IProgressMode;\n  programExercise?: IPlannerProgramExercise;\n  otherStates?: IByExercise<IProgramState>;\n  isPlayground: boolean;\n  shouldRunScript: boolean;\n  didFinish: boolean;\n}\n\n// The side effects of a set that was just completed: the update script, the end of the workout, the superset\n// move, the timers (`startTimers` decides them), the workout intervals and the Live Activity.\nfunction completionEffects(\n  progress: IHistoryRecord,\n  params: ICompletionEffectsParams,\n  settings: ISettings,\n  stats: IStats,\n  startTimers: (progress: IHistoryRecord) => IHistoryRecord\n): IHistoryRecord {\n  let newProgress = progress;\n  if (params.programExercise && params.shouldRunScript) {\n    newProgress = Progress.runUpdateScript(\n      newProgress,\n      params.programExercise,\n      params.otherStates || {},\n      params.entryIndex,\n      params.setIndex,\n      params.mode,\n      settings,\n      stats\n    );\n  }\n  if (Progress.isFullyFinishedSet(newProgress)) {\n    newProgress = Progress.stopTimer(newProgress);\n  }\n  if (params.didFinish) {\n    newProgress = Progress.maybeApplySuperset(newProgress, params.entryIndex, params.mode);\n  }\n  newProgress = startTimers(newProgress);\n  newProgress.intervals = History.resumeWorkout(newProgress, params.isPlayground, settings.timers.reminder);\n  // The practice workout of the app tour has no Live Activity.\n  if (!Progress.isPractice(newProgress)) {\n    LiveActivityManager.updateLiveActivityForNextEntry(\n      newProgress,\n      params.entryIndex,\n      params.mode,\n      params.programExercise,\n      settings\n    );\n  }\n  return newProgress;\n}\n\nexport function buildCardsReducer(settings: ISettings, stats: IStats): Reducer<IHistoryRecord, ICardsAction> {\n  return (progress, action): IHistoryRecord => {\n    switch (action.type) {\n      case \"CompleteSetAction\": {\n        const hasUserPromptedVars =\n          action.programExercise && ProgramExercise.hasUserPromptedVars(action.programExercise);\n        let newProgress = Progress.completeSet(\n          progress,\n          action.entryIndex,\n          action.setIndex,\n          action.mode,\n          !!hasUserPromptedVars,\n          settings\n        );\n        const oldSet =\n          progress.entries[action.entryIndex][action.mode === \"warmup\" ? \"warmupSets\" : \"sets\"][action.setIndex];\n        const newSet =\n          newProgress.entries[action.entryIndex][action.mode === \"warmup\" ? \"warmupSets\" : \"sets\"][action.setIndex];\n        const didFinish = !oldSet.isCompleted && !!newSet.isCompleted;\n        newProgress = completionEffects(\n          newProgress,\n          {\n            entryIndex: action.entryIndex,\n            setIndex: action.setIndex,\n            mode: action.mode,\n            programExercise: action.programExercise,\n            otherStates: action.otherStates,\n            isPlayground: action.isPlayground,\n            shouldRunScript: !!action.programExercise && newProgress.ui?.amrapModal == null,\n            didFinish,\n          },\n          settings,\n          stats,\n          (aProgress) => {\n            if (action.isPlayground) {\n              return aProgress;\n            }\n            // A rep or weight tick during a run must not touch the run or its timer fields.\n            if (aProgress.blockRun != null) {\n              return aProgress;\n            }\n            if (action.mode === \"workout\" && newSet.setTimer != null) {\n              // A timer set ticked by hand starts no timer. A rest left running from a prior set must not linger.\n              return Progress.stopSetTimer(Progress.stopTimer(aProgress));\n            }\n            return Progress.startTimer(\n              Progress.stopSetTimer(aProgress),\n              action.timestamp ?? new Date().getTime(),\n              action.mode,\n              action.entryIndex,\n              action.setIndex,\n              settings\n            );\n          }\n        );\n        if (action.forceUpdateEntryIndex) {\n          newProgress = {\n            ...newProgress,\n            ui: { ...newProgress.ui, forceUpdateEntryIndex: !newProgress.ui?.forceUpdateEntryIndex },\n          };\n        }\n        if (action.isExternal) {\n          newProgress = {\n            ...newProgress,\n            ui: { ...newProgress.ui, isExternal: true },\n          };\n        }\n        return newProgress;\n      }\n      case \"ChangeAMRAPAction\": {\n        let newProgress = { ...progress };\n        if (action.isCancel) {\n          return { ...newProgress, ui: { ...newProgress.ui, amrapModal: undefined } };\n        }\n        if (action.amrapValue != null) {\n          newProgress = Progress.updateAmrapRepsInExercise(newProgress, action.amrapValue);\n        }\n        if (action.amrapLeftValue != null) {\n          newProgress = Progress.updateAmrapRepsLeftInExercise(newProgress, action.amrapLeftValue);\n        }\n        if (action.logRpe) {\n          newProgress = Progress.updateRpeInExercise(newProgress, action.rpeValue);\n        }\n        if (action.weightValue != null) {\n          newProgress = Progress.updateWeightInExercise(newProgress, action.weightValue);\n        }\n        const programExerciseId = action.programExercise?.key;\n        if (ObjectUtils.keys(action.userVars || {}).length > 0 && programExerciseId != null) {\n          newProgress = Progress.updateUserPromptedStateVars(newProgress, programExerciseId, action.userVars || {});\n        }\n        newProgress = Progress.completeAmrapSet(newProgress, action.entryIndex, action.setIndex, settings);\n        if (action.programExercise) {\n          newProgress = Progress.runUpdateScript(\n            newProgress,\n            action.programExercise,\n            action.otherStates || {},\n            action.entryIndex,\n            action.setIndex,\n            \"workout\",\n            settings,\n            stats\n          );\n        }\n        if (Progress.isFullyFinishedSet(newProgress)) {\n          newProgress = Progress.stopTimer(newProgress);\n        }\n        newProgress = Progress.maybeApplySuperset(newProgress, action.entryIndex, \"workout\");\n        const amrapSet = newProgress.entries[action.entryIndex]?.sets[action.setIndex];\n        if (newProgress.blockRun != null) {\n          // A tick during a run must not touch the run or its timer fields.\n        } else if (amrapSet?.setTimer != null) {\n          // A timer set starts no timer from a tick.\n          newProgress = Progress.stopSetTimer(Progress.stopTimer(newProgress));\n        } else {\n          newProgress = Progress.stopSetTimer(newProgress);\n          newProgress = Progress.startTimer(\n            newProgress,\n            new Date().getTime(),\n            \"workout\",\n            action.entryIndex,\n            action.setIndex,\n            settings\n          );\n        }\n        newProgress.intervals = History.resumeWorkout(newProgress, action.isPlayground, settings.timers.reminder);\n        LiveActivityManager.updateLiveActivityForNextEntry(\n          newProgress,\n          action.entryIndex,\n          \"workout\",\n          action.programExercise,\n          settings\n        );\n        return { ...newProgress, ui: { ...newProgress.ui, amrapModal: undefined } };\n      }\n      case \"EndWorkStepAction\": {\n        const set = progress.entries[action.entryIndex]?.sets[action.setIndex];\n        if (!set || set.isCompleted) {\n          // Reconcile and a Next tap can both end the same step. The second one does nothing.\n          return progress;\n        }\n        const timestamp = action.timestamp ?? new Date().getTime();\n        let newProgress = Progress.stopSetTimer(progress);\n        // The update script reads `completedSetTimer`, so it is written first.\n        newProgress = Progress.completeTimerSet(\n          newProgress,\n          action.entryIndex,\n          action.setIndex,\n          action.completedSetTimer,\n          timestamp,\n          settings\n        );\n        return completionEffects(\n          newProgress,\n          {\n            entryIndex: action.entryIndex,\n            setIndex: action.setIndex,\n            mode: \"workout\",\n            programExercise: action.programExercise,\n            otherStates: action.otherStates,\n            isPlayground: action.isPlayground,\n            shouldRunScript: !!action.programExercise,\n            didFinish: true,\n          },\n          settings,\n          stats,\n          (aProgress) =>\n            action.isPlayground\n              ? aProgress\n              : Progress.keepPaused(\n                  progress,\n                  Progress.startAfterWorkStep(aProgress, timestamp, action.entryIndex, action.setIndex, settings),\n                  timestamp\n                )\n        );\n      }\n      case \"UpdateProgress\": {\n        return action.lensRecordings.reduce((memo, recording) => recording.fn(memo), progress);\n      }\n      case \"ApplyBlockLogAction\": {\n        const newProgress = Progress.applyBlockLog(progress, action.ref, {\n          rpe: action.rpeValue,\n          reps: action.reps,\n        });\n        return { ...newProgress, ui: { ...newProgress.ui, blockLogModal: undefined } };\n      }\n      case \"CloseBlockLogAction\": {\n        return { ...progress, ui: { ...progress.ui, blockLogModal: undefined } };\n      }\n      case \"PauseBlockAction\": {\n        return Progress.pauseBlock(progress, action.now);\n      }\n      case \"ResumeBlockAction\": {\n        return Progress.resumeBlock(progress, action.now);\n      }\n    }\n  };\n}\n\nfunction pushScreen<T extends IScreen>(\n  screenStack: IScreenStack,\n  name: T,\n  params?: IScreenParams<T>,\n  shouldResetStack?: boolean\n): IScreenStack {\n  if (screenStack.length > 0) {\n    const current = Screen.current(screenStack);\n    if (current.name !== name || !ObjectUtils.isEqual(current.params || {}, params || {})) {\n      if (shouldResetStack) {\n        return [{ name, ...(params ? { params } : {}) } as Extract<IScreen, { name: string }>];\n      } else {\n        return Screen.push(screenStack, name, params as any);\n      }\n    }\n  }\n  return screenStack;\n}\n\n// The actions that save, delete, start or cancel a workout. On the practice workout of the app tour they do nothing.\nconst practiceBlockedActions: IAction[\"type\"][] = [\n  \"FinishProgramDayAction\",\n  \"DeleteProgress\",\n  \"CancelProgress\",\n  \"StartProgramDayAction\",\n  \"EditHistoryRecord\",\n];\n\nexport const reducer: Reducer<IState, IAction> = (state, action): IState => {\n  if (\n    state.screenStack[state.screenStack.length - 1]?.name === \"tour\" &&\n    practiceBlockedActions.includes(action.type)\n  ) {\n    return state;\n  }\n  if (action.type === \"CompleteSetAction\") {\n    return Progress.setProgress(\n      state,\n      buildCardsReducer(state.storage.settings, state.storage.stats)(Progress.getProgress(state)!, action)\n    );\n  } else if (action.type === \"ChangeAMRAPAction\") {\n    return Progress.setProgress(\n      state,\n      buildCardsReducer(state.storage.settings, state.storage.stats)(Progress.getProgress(state)!, action)\n    );\n  } else if (action.type === \"UpdateProgress\") {\n    return Progress.setProgress(\n      state,\n      buildCardsReducer(state.storage.settings, state.storage.stats)(Progress.getProgress(state)!, action)\n    );\n  } else if (action.type === \"EndWorkStepAction\") {\n    return Progress.setProgress(\n      state,\n      buildCardsReducer(state.storage.settings, state.storage.stats)(Progress.getProgress(state)!, action)\n    );\n  } else if (action.type === \"ApplyBlockLogAction\") {\n    return Progress.setProgress(\n      state,\n      buildCardsReducer(state.storage.settings, state.storage.stats)(Progress.getProgress(state)!, action)\n    );\n  } else if (action.type === \"CloseBlockLogAction\") {\n    return Progress.setProgress(\n      state,\n      buildCardsReducer(state.storage.settings, state.storage.stats)(Progress.getProgress(state)!, action)\n    );\n  } else if (action.type === \"PauseBlockAction\") {\n    return Progress.setProgress(\n      state,\n      buildCardsReducer(state.storage.settings, state.storage.stats)(Progress.getProgress(state)!, action)\n    );\n  } else if (action.type === \"ResumeBlockAction\") {\n    return Progress.setProgress(\n      state,\n      buildCardsReducer(state.storage.settings, state.storage.stats)(Progress.getProgress(state)!, action)\n    );\n  } else if (action.type === \"StartProgramDayAction\") {\n    const progress = state.progress[0];\n    if (progress != null) {\n      return {\n        ...state,\n        screenStack: pushScreen(state.screenStack, \"progress\", { id: progress.id }, true),\n      };\n    } else if (state.storage.currentProgramId != null) {\n      const program = Program.getProgram(state, action.programId || state.storage.currentProgramId);\n      if (program != null) {\n        const newProgress = Program.nextHistoryRecord(program, state.storage.settings, state.storage.stats);\n        return {\n          ...state,\n          screenStack: pushScreen(state.screenStack, \"progress\", { id: 0 }, true),\n          progress: { ...state.progress, 0: newProgress },\n        };\n      } else {\n        alert(\"No currently selected program\");\n        return state;\n      }\n    } else {\n      return state;\n    }\n  } else if (action.type === \"EditHistoryRecord\") {\n    let newScreenStack = state.screenStack;\n    if (Screen.currentName(state.screenStack) === \"main\") {\n      newScreenStack = Screen.updateParams<\"main\">(state.screenStack, { historyRecordId: action.historyRecord.id });\n    }\n    return {\n      ...state,\n      screenStack: pushScreen(newScreenStack, \"progress\", { id: action.historyRecord.id }),\n      progress: { ...state.progress, [action.historyRecord.id]: action.historyRecord },\n    };\n  } else if (action.type === \"FinishProgramDayAction\") {\n    const settings = state.storage.settings;\n    const progress = Progress.getProgress(state);\n    if (progress == null) {\n      throw new StateError(\"FinishProgramDayAction: no progress\");\n    } else {\n      const programIndex = state.storage.programs.findIndex((p) => p.id === progress.programId)!;\n      const program =\n        progress.programId === emptyProgramId ? Program.createEmptyProgram() : state.storage.programs[programIndex];\n      const evaluatedProgram = program ? Program.evaluate(program, settings) : undefined;\n      Progress.stopTimer(progress);\n      const historyRecord = History.finishProgramDay(\n        progress,\n        state.storage.settings,\n        progress.day,\n        evaluatedProgram,\n        action.time\n      );\n      let newHistory;\n      if (!Progress.isCurrent(progress)) {\n        newHistory = state.storage.history.map((h) => (h.id === progress.id ? historyRecord : h));\n      } else {\n        newHistory = [historyRecord, ...state.storage.history];\n      }\n      const exerciseData = state.storage.settings.exerciseData;\n      const {\n        program: newProgram,\n        exerciseData: newExerciseData,\n        levelChanges,\n      } = Progress.isCurrent(progress) && program != null\n        ? Program.runAllFinishDayScripts(program, progress, state.storage.stats, settings)\n        : { program, exerciseData, levelChanges: [] };\n      // The record is built before the scripts run, so the level change is patched onto the entry afterwards. An auto\n      // change goes on the first entry of the program exercise with a completed set, the one that the finish used\n      // (D10). A manual change goes on the entry that the client changed. A manual change that was not applied (past\n      // workout, suppressed entry, end of chain, D22) is removed, so the record shows applied changes only (R5).\n      const isManualEntry = (e: IHistoryEntry, key: string): boolean =>\n        e.programExerciseId === key && !e.isSuppressed && e.levelChange?.cause === \"manual\";\n      const manualEntryIndexes = new Map<string, number>();\n      for (const { programExerciseKey, cause } of levelChanges) {\n        const manualIndex = historyRecord.entries.findIndex((e) => isManualEntry(e, programExerciseKey));\n        if (cause === \"manual\" && manualIndex !== -1) {\n          manualEntryIndexes.set(programExerciseKey, manualIndex);\n        }\n      }\n      historyRecord.entries = historyRecord.entries.map((e, i) =>\n        e.levelChange?.cause === \"manual\" && !Array.from(manualEntryIndexes.values()).includes(i)\n          ? { ...e, levelChange: undefined }\n          : e\n      );\n      for (const { programExerciseKey, ...levelChange } of levelChanges) {\n        const entryIndex =\n          manualEntryIndexes.get(programExerciseKey) ??\n          historyRecord.entries.findIndex(\n            (e) => e.programExerciseId === programExerciseKey && !e.isSuppressed && e.sets.some((s) => s.isCompleted)\n          );\n        if (entryIndex !== -1) {\n          historyRecord.entries = historyRecord.entries.map((e, i) => (i === entryIndex ? { ...e, levelChange } : e));\n        }\n      }\n      const newPrograms =\n        newProgram != null ? lf(state.storage.programs).i(programIndex).set(newProgram) : state.storage.programs;\n      const newSettingsExerciseData = deepMerge(state.storage.settings.exerciseData, newExerciseData);\n      const shouldSnapshot =\n        Progress.isCurrent(progress) &&\n        progress.programId !== emptyProgramId &&\n        programIndex !== -1 &&\n        program?.planner != null &&\n        newProgram?.planner != null;\n      if (shouldSnapshot) {\n        historyRecord.progressionSnapshot = ProgressionSnapshot.make(\n          { planner: program.planner!, nextDay: program.nextDay, exerciseData },\n          { planner: newProgram!.planner!, nextDay: newProgram!.nextDay, exerciseData: newSettingsExerciseData },\n          historyRecord.entries\n        );\n      }\n      if (typeof window !== \"undefined\" && window.localStorage) {\n        lg(\"saved-last-history-record\");\n        window.localStorage.setItem(\"lastHistoryRecord\", JSON.stringify({ time: Date.now(), historyRecord }));\n      }\n      return {\n        ...state,\n        storage: {\n          ...state.storage,\n          history: newHistory,\n          programs: newPrograms,\n          settings: {\n            ...state.storage.settings,\n            exerciseData: newSettingsExerciseData,\n          },\n        },\n        screenStack: Progress.isCurrent(progress)\n          ? [{ name: \"finishDay\", params: { historyRecordId: historyRecord.id } }]\n          : Screen.pull(state.screenStack),\n        progress: Progress.stop(state.progress, progress.id),\n      };\n    }\n  } else if (action.type === \"ChangeDate\") {\n    return Progress.setProgress(state, Progress.showUpdateDate(Progress.getProgress(state)!, action.date, action.time));\n  } else if (action.type === \"ConfirmDate\") {\n    return Progress.setProgress(state, Progress.changeDate(Progress.getProgress(state)!, action.date, action.time));\n  } else if (action.type === \"CancelProgress\") {\n    const progress = Progress.getProgress(state)!;\n    return {\n      ...state,\n      screenStack: pushScreen(state.screenStack, \"main\", undefined, true),\n      progress: Progress.isCurrent(progress)\n        ? state.progress\n        : Progress.stop(state.progress, Progress.getProgressId(state.screenStack)),\n    };\n  } else if (action.type === \"DeleteProgress\") {\n    const progress = Progress.getProgress(state);\n    if (progress != null) {\n      const history = state.storage.history.filter((h) => h.id !== progress.id);\n      const isRemoval = history.length !== state.storage.history.length;\n      if (Progress.isCurrent(progress)) {\n        SendMessage.toIosAndAndroid({ type: \"pauseWorkout\" });\n      }\n      return {\n        ...state,\n        screenStack: pushScreen(state.screenStack, \"main\", undefined, true),\n        storage: {\n          ...state.storage,\n          history,\n        },\n        progress: Progress.stop(state.progress, progress.id),\n        removedAt: isRemoval ? { ...state.removedAt, [`history.${progress.id}`]: action.time } : state.removedAt,\n      };\n    } else {\n      return state;\n    }\n  } else if (action.type === \"PushScreen\") {\n    const newScreenStack = pushScreen(state.screenStack, action.screen, action.params, action.shouldResetStack);\n    return newScreenStack === state.screenStack ? state : { ...state, screenStack: newScreenStack };\n  } else if (action.type === \"PullScreen\") {\n    return { ...state, screenStack: Screen.pull(state.screenStack) };\n  } else if (action.type === \"Login\") {\n    return {\n      ...state,\n      user: { email: action.email, id: action.userId },\n      storage: { ...state.storage, email: action.email },\n    };\n  } else if (action.type === \"Logout\") {\n    return { ...state, user: undefined, storage: { ...state.storage, email: undefined } };\n  } else if (action.type === \"StopTimer\") {\n    const progress = Progress.getProgress(state);\n    if (progress != null) {\n      return Progress.setProgress(state, Progress.stopTimer(progress));\n    } else {\n      return state;\n    }\n  } else if (action.type === \"StartTimer\") {\n    const progress = Progress.getProgress(state);\n    if (progress) {\n      return Progress.setProgress(\n        state,\n        Progress.startTimer(\n          progress,\n          action.timestamp,\n          action.mode,\n          action.entryIndex,\n          action.setIndex,\n          state.storage.settings,\n          action.timer,\n          true\n        )\n      );\n    } else {\n      return state;\n    }\n  } else if (action.type === \"UpdateSettings\") {\n    if (isLoggingEnabled) {\n      console.log(`%c-------${action.desc ? ` ${action.desc}` : \"\"}`, \"font-weight:bold\");\n    }\n    return {\n      ...state,\n      storage: {\n        ...state.storage,\n        settings: action.lensRecording.fn(state.storage.settings),\n      },\n    };\n  } else if (action.type === \"ReplaceState\") {\n    return action.state;\n  } else if (action.type === \"UpdateState\") {\n    if (isLoggingEnabled) {\n      console.log(`%c-------${action.desc ? ` ${action.desc}` : \"\"}`, \"font-weight:bold\");\n    }\n    const updatedState = action.lensRecording.reduce((memo, recording) => {\n      if (isLoggingEnabled) {\n        recording.log(\"state\");\n      }\n      const newState = recording.fn(memo);\n      if (isLoggingEnabled && recording.type === \"modify\") {\n        console.log(\"New Value: \", recording.value.v);\n      }\n      return newState;\n    }, state);\n    return action.keepStorage ? { ...updatedState, storage: state.storage } : updatedState;\n  } else if (action.type === \"ApplyProgramChangesToProgress\") {\n    const progress = state.progress[0];\n    if (progress != null) {\n      const program = Program.evaluate(Program.getProgram(state, progress.programId)!, state.storage.settings);\n      let newProgress = Progress.applyProgramDay(\n        progress,\n        program,\n        progress.day,\n        state.storage.settings,\n        action.programExerciseIds\n      );\n      newProgress = Progress.runInitialUpdateScripts(\n        newProgress,\n        action.programExerciseIds,\n        progress.day,\n        program,\n        state.storage.settings,\n        state.storage.stats\n      );\n\n      return {\n        ...state,\n        progress: { ...state.progress, 0: newProgress },\n      };\n    } else {\n      return state;\n    }\n  } else {\n    return state;\n  }\n};\n","import { IPercentage, ISettings, IStats, IStatsKey, IWeight } from \"../types\";\nimport { CollectionUtils } from \"../utils/collection\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { Weight } from \"./weight\";\n\nexport namespace Stats {\n  export function name(key: IStatsKey): string {\n    switch (key) {\n      case \"bicepLeft\":\n        return \"Left Bicep\";\n      case \"bicepRight\":\n        return \"Right Bicep\";\n      case \"calfLeft\":\n        return \"Left Calf\";\n      case \"calfRight\":\n        return \"Right Calf\";\n      case \"chest\":\n        return \"Chest\";\n      case \"forearmLeft\":\n        return \"Left Forearm\";\n      case \"forearmRight\":\n        return \"Right Forearm\";\n      case \"hips\":\n        return \"Hips\";\n      case \"neck\":\n        return \"Neck\";\n      case \"shoulders\":\n        return \"Shoulders\";\n      case \"thighLeft\":\n        return \"Left Thigh\";\n      case \"thighRight\":\n        return \"Right Thigh\";\n      case \"waist\":\n        return \"Waist\";\n      case \"weight\":\n        return \"Bodyweight\";\n      case \"bodyfat\":\n        return \"Bodyfat\";\n    }\n  }\n\n  export function getCurrentBodyweight(stats: IStats): IWeight | undefined {\n    const weights = CollectionUtils.sortBy(stats.weight.weight || [], \"timestamp\", true);\n    return weights[0]?.value;\n  }\n\n  export function getCurrentMovingAverageBodyweight(stats: IStats, settings: ISettings): IWeight | undefined {\n    const movingAverageWindowSize = settings.graphOptions.weight?.movingAverageWindowSize;\n    if (!movingAverageWindowSize) {\n      return getCurrentBodyweight(stats);\n    }\n    const weights = CollectionUtils.sortBy(stats.weight.weight || [], \"timestamp\", true);\n    if (weights.length < movingAverageWindowSize) {\n      return getCurrentBodyweight(stats);\n    }\n    const recentWeights = weights.slice(0, movingAverageWindowSize);\n    const totalWeight = recentWeights.reduce(\n      (sum, item) => Weight.add(sum, item.value),\n      Weight.build(0, settings.units)\n    );\n    return Weight.divide(totalWeight, recentWeights.length);\n  }\n\n  export function getCurrentBodyfat(stats: IStats): IPercentage | undefined {\n    const weights = CollectionUtils.sortBy(stats.percentage.bodyfat || [], \"timestamp\", true);\n    return weights[0]?.value;\n  }\n\n  export function getEmpty(): IStats {\n    return {\n      weight: {},\n      percentage: {},\n      length: {},\n    };\n  }\n\n  export function isEmpty(stats: IStats): boolean {\n    const statsKeys: IStatsKey[] = [\n      ...ObjectUtils.keys(stats.weight).filter((k) => (stats.weight[k] || []).length > 0),\n      ...ObjectUtils.keys(stats.percentage).filter((k) => (stats.percentage[k] || []).length > 0),\n      ...ObjectUtils.keys(stats.length).filter((k) => (stats.length[k] || []).length > 0),\n    ];\n    return statsKeys.length === 0;\n  }\n}\n","import { ObjectUtils } from \"../utils/object\";\nimport { ExerciseId } from \"./exerciseId\";\nimport { Weight } from \"./weight\";\nimport {\n  IExerciseId,\n  IEquipment,\n  IBarKey,\n  IWeight,\n  ISet,\n  IExerciseType,\n  equipments,\n  ISettings,\n  IAllCustomExercises,\n  IMuscle,\n  IMetaExercises,\n  IProgramExerciseWarmupSet,\n  IUnit,\n  ICustomExercise,\n  ICustomExerciseVariation,\n  IScreenMuscle,\n  IAllEquipment,\n  IProgram,\n  IMuscleMultiplier,\n} from \"../types\";\nimport { Muscle } from \"./muscle\";\nimport { StringUtils } from \"../utils/string\";\nimport { UidFactory } from \"../utils/generator\";\nimport { CollectionUtils } from \"../utils/collection\";\nimport { ExerciseImageUtils } from \"./exerciseImage\";\nimport { Equipment } from \"./equipment\";\nimport { CustomExerciseVariation } from \"./customExerciseVariation\";\nimport { IDispatch } from \"@client/ducks/types\";\nimport { Program } from \"./program\";\nimport { EditProgram } from \"./editProgram\";\nimport { lb } from \"lens-shmens\";\nimport { updateSettings } from \"./state\";\n\nexport const allExercisesList: Record<IExerciseId, IExercise> = {\n  abWheel: {\n    id: \"abWheel\",\n    name: \"Ab Wheel\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  arnoldPress: {\n    id: \"arnoldPress\",\n    name: \"Arnold Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  aroundTheWorld: {\n    id: \"aroundTheWorld\",\n    name: \"Around The World\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"core\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  backExtension: {\n    id: \"backExtension\",\n    name: \"Back Extension\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"core\"],\n    startingWeightLb: { value: 50, unit: \"lb\" },\n    startingWeightKg: { value: 22.5, unit: \"kg\" },\n  },\n  ballSlams: {\n    id: \"ballSlams\",\n    name: \"Ball Slams\",\n    defaultEquipment: \"medicineball\",\n    types: [\"core\", \"upper\"],\n    startingWeightLb: { value: 10, unit: \"lb\" },\n    startingWeightKg: { value: 4.5, unit: \"kg\" },\n  },\n  battleRopes: {\n    id: \"battleRopes\",\n    name: \"Battle Ropes\",\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  behindTheNeckPress: {\n    id: \"behindTheNeckPress\",\n    name: \"Behind The Neck Press\",\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  benchDip: {\n    id: \"benchDip\",\n    name: \"Bench Dip\",\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  benchPress: {\n    id: \"benchPress\",\n    name: \"Bench Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 135, unit: \"lb\" },\n    startingWeightKg: { value: 60, unit: \"kg\" },\n  },\n  benchPressCloseGrip: {\n    id: \"benchPressCloseGrip\",\n    name: \"Bench Press Close Grip\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 115, unit: \"lb\" },\n    startingWeightKg: { value: 50, unit: \"kg\" },\n  },\n  benchPressWideGrip: {\n    id: \"benchPressWideGrip\",\n    name: \"Bench Press Wide Grip\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 135, unit: \"lb\" },\n    startingWeightKg: { value: 60, unit: \"kg\" },\n  },\n  bentOverOneArmRow: {\n    id: \"bentOverOneArmRow\",\n    name: \"Bent Over One Arm Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  bentOverRow: {\n    id: \"bentOverRow\",\n    name: \"Bent Over Row\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  bicepCurl: {\n    id: \"bicepCurl\",\n    name: \"Bicep Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  bicycleCrunch: {\n    id: \"bicycleCrunch\",\n    name: \"Bicycle Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  boxJump: {\n    id: \"boxJump\",\n    name: \"Box Jump\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  boxSquat: {\n    id: \"boxSquat\",\n    name: \"Box Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 155, unit: \"lb\" },\n    startingWeightKg: { value: 70, unit: \"kg\" },\n  },\n  bulgarianSplitSquat: {\n    id: \"bulgarianSplitSquat\",\n    name: \"Bulgarian Split Squat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  burpee: {\n    id: \"burpee\",\n    name: \"Burpee\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"lower\", \"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  cableCrossover: {\n    id: \"cableCrossover\",\n    name: \"Cable Crossover\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  cableCrunch: {\n    id: \"cableCrunch\",\n    name: \"Cable Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"core\"],\n    startingWeightLb: { value: 50, unit: \"lb\" },\n    startingWeightKg: { value: 22.5, unit: \"kg\" },\n  },\n  cableKickback: {\n    id: \"cableKickback\",\n    name: \"Cable Kickback\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  cablePullThrough: {\n    id: \"cablePullThrough\",\n    name: \"Cable Pull Through\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"lower\", \"pull\"],\n    startingWeightLb: { value: 70, unit: \"lb\" },\n    startingWeightKg: { value: 30, unit: \"kg\" },\n  },\n  cableTwist: {\n    id: \"cableTwist\",\n    name: \"Cable Twist\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"core\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  calfPressOnLegPress: {\n    id: \"calfPressOnLegPress\",\n    name: \"Calf Press on Leg Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 150, unit: \"lb\" },\n    startingWeightKg: { value: 67.5, unit: \"kg\" },\n  },\n  calfPressOnSeatedLegPress: {\n    id: \"calfPressOnSeatedLegPress\",\n    name: \"Calf Press on Seated Leg Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 120, unit: \"lb\" },\n    startingWeightKg: { value: 53.75, unit: \"kg\" },\n  },\n  chestDip: {\n    id: \"chestDip\",\n    name: \"Chest Dip\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  chestFly: {\n    id: \"chestFly\",\n    name: \"Chest Fly\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  chestPress: {\n    id: \"chestPress\",\n    name: \"Chest Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  chestSupportedRow: {\n    id: \"chestSupportedRow\",\n    name: \"Chest-Supported Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 85, unit: \"lb\" },\n    startingWeightKg: { value: 37.5, unit: \"kg\" },\n  },\n  chinUp: {\n    id: \"chinUp\",\n    name: \"Chin Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  clean: {\n    id: \"clean\",\n    name: \"Clean\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"push\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  cleanandJerk: {\n    id: \"cleanandJerk\",\n    name: \"Clean and Jerk\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"push\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  concentrationCurl: {\n    id: \"concentrationCurl\",\n    name: \"Concentration Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  crossBodyCrunch: {\n    id: \"crossBodyCrunch\",\n    name: \"Cross Body Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  crunch: {\n    id: \"crunch\",\n    name: \"Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  cycling: {\n    id: \"cycling\",\n    name: \"Cycling\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  deadlift: {\n    id: \"deadlift\",\n    name: \"Deadlift\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"pull\"],\n    startingWeightLb: { value: 185, unit: \"lb\" },\n    startingWeightKg: { value: 82.5, unit: \"kg\" },\n  },\n  deadliftHighPull: {\n    id: \"deadliftHighPull\",\n    name: \"Deadlift High Pull\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 75, unit: \"lb\" },\n    startingWeightKg: { value: 32.5, unit: \"kg\" },\n  },\n  declineBenchPress: {\n    id: \"declineBenchPress\",\n    name: \"Decline Bench Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 125, unit: \"lb\" },\n    startingWeightKg: { value: 55, unit: \"kg\" },\n  },\n  declineCrunch: {\n    id: \"declineCrunch\",\n    name: \"Decline Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  deficitDeadlift: {\n    id: \"deficitDeadlift\",\n    name: \"Deficit Deadlift\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"pull\"],\n    startingWeightLb: { value: 165, unit: \"lb\" },\n    startingWeightKg: { value: 75, unit: \"kg\" },\n  },\n  ellipticalMachine: {\n    id: \"ellipticalMachine\",\n    name: \"Elliptical Machine\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  facePull: {\n    id: \"facePull\",\n    name: \"Face Pull\",\n    defaultWarmup: 10,\n    defaultEquipment: \"band\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  flatKneeRaise: {\n    id: \"flatKneeRaise\",\n    name: \"Flat Knee Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  flatLegRaise: {\n    id: \"flatLegRaise\",\n    name: \"Flat Leg Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  frontRaise: {\n    id: \"frontRaise\",\n    name: \"Front Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  frontSquat: {\n    id: \"frontSquat\",\n    name: \"Front Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  gobletSquat: {\n    id: \"gobletSquat\",\n    name: \"Goblet Squat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 35, unit: \"lb\" },\n    startingWeightKg: { value: 15, unit: \"kg\" },\n  },\n  goodMorning: {\n    id: \"goodMorning\",\n    name: \"Good Morning\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  gluteBridge: {\n    id: \"gluteBridge\",\n    name: \"Glute Bridge\",\n    defaultWarmup: 45,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 35, unit: \"lb\" },\n    startingWeightKg: { value: 15, unit: \"kg\" },\n  },\n  gluteBridgeMarch: {\n    id: \"gluteBridgeMarch\",\n    name: \"Glute Bridge March\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  gluteKickback: {\n    id: \"gluteKickback\",\n    name: \"Glute Kickback\",\n    defaultWarmup: 45,\n    defaultEquipment: \"cable\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 35, unit: \"lb\" },\n    startingWeightKg: { value: 15, unit: \"kg\" },\n  },\n  hackSquat: {\n    id: \"hackSquat\",\n    name: \"Hack Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 115, unit: \"lb\" },\n    startingWeightKg: { value: 50, unit: \"kg\" },\n  },\n  hammerCurl: {\n    id: \"hammerCurl\",\n    name: \"Hammer Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  handstandPushUp: {\n    id: \"handstandPushUp\",\n    name: \"Handstand Push Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  hangClean: {\n    id: \"hangClean\",\n    name: \"Hang Clean\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 85, unit: \"lb\" },\n    startingWeightKg: { value: 37.5, unit: \"kg\" },\n  },\n  hangSnatch: {\n    id: \"hangSnatch\",\n    name: \"Hang Snatch\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  hangingLegRaise: {\n    id: \"hangingLegRaise\",\n    name: \"Hanging Leg Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  highKneeSkips: {\n    id: \"highKneeSkips\",\n    name: \"High Knee Skips\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  highRow: {\n    id: \"highRow\",\n    name: \"High Row\",\n    defaultWarmup: 45,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  hipAbductor: {\n    id: \"hipAbductor\",\n    name: \"Hip Abductor\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 60, unit: \"lb\" },\n    startingWeightKg: { value: 26.25, unit: \"kg\" },\n  },\n  hipAdductor: {\n    id: \"hipAdductor\",\n    name: \"Hip Adductor\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 60, unit: \"lb\" },\n    startingWeightKg: { value: 26.25, unit: \"kg\" },\n  },\n  hipThrust: {\n    id: \"hipThrust\",\n    name: \"Hip Thrust\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  inclineBenchPress: {\n    id: \"inclineBenchPress\",\n    name: \"Incline Bench Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 115, unit: \"lb\" },\n    startingWeightKg: { value: 50, unit: \"kg\" },\n  },\n  inclineBenchPressWideGrip: {\n    id: \"inclineBenchPressWideGrip\",\n    name: \"Incline Bench Press Wide Grip\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 110, unit: \"lb\" },\n    startingWeightKg: { value: 50, unit: \"kg\" },\n  },\n  inclineChestFly: {\n    id: \"inclineChestFly\",\n    name: \"Incline Chest Fly\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  inclineChestPress: {\n    id: \"inclineChestPress\",\n    name: \"Incline Chest Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  inclineCurl: {\n    id: \"inclineCurl\",\n    name: \"Incline Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  inclineRow: {\n    id: \"inclineRow\",\n    name: \"Incline Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  invertedRow: {\n    id: \"invertedRow\",\n    name: \"Inverted Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  isoLateralChestPress: {\n    id: \"isoLateralChestPress\",\n    name: \"Iso-Lateral Chest Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  isoLateralRow: {\n    id: \"isoLateralRow\",\n    name: \"Iso-Lateral Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  jackknifeSitUp: {\n    id: \"jackknifeSitUp\",\n    name: \"Jackknife Sit Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  jumpRope: {\n    id: \"jumpRope\",\n    name: \"Jump Rope\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  jumpSquat: {\n    id: \"jumpSquat\",\n    name: \"Jump Squat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  jumpingJack: {\n    id: \"jumpingJack\",\n    name: \"Jumping Jack\",\n    defaultWarmup: 10,\n    defaultEquipment: undefined,\n    types: [\"upper\", \"lower\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  kettlebellSwing: {\n    id: \"kettlebellSwing\",\n    name: \"Kettlebell Swing\",\n    defaultWarmup: 10,\n    defaultEquipment: \"kettlebell\",\n    types: [\"upper\", \"lower\", \"core\"],\n    startingWeightLb: { value: 35, unit: \"lb\" },\n    startingWeightKg: { value: 16, unit: \"kg\" },\n  },\n  kettlebellTurkishGetUp: {\n    id: \"kettlebellTurkishGetUp\",\n    name: \"Kettlebell Turkish Get Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"kettlebell\",\n    types: [\"upper\", \"lower\", \"core\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 8, unit: \"kg\" },\n  },\n  kippingPullUp: {\n    id: \"kippingPullUp\",\n    name: \"Kipping Pull Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  kneeRaise: {\n    id: \"kneeRaise\",\n    name: \"Knee Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  kneelingPulldown: {\n    id: \"kneelingPulldown\",\n    name: \"Kneeling Pulldown\",\n    defaultWarmup: 10,\n    defaultEquipment: \"band\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  kneestoElbows: {\n    id: \"kneestoElbows\",\n    name: \"Knees to Elbows\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  latPulldown: {\n    id: \"latPulldown\",\n    name: \"Lat Pulldown\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 70, unit: \"lb\" },\n    startingWeightKg: { value: 30, unit: \"kg\" },\n  },\n  lateralBoxJump: {\n    id: \"lateralBoxJump\",\n    name: \"Lateral Box Jump\",\n    defaultWarmup: 10,\n    defaultEquipment: undefined,\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  lateralRaise: {\n    id: \"lateralRaise\",\n    name: \"Lateral Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  legsUpBenchPress: {\n    id: \"legsUpBenchPress\",\n    name: \"Legs Up Bench Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 135, unit: \"lb\" },\n    startingWeightKg: { value: 60, unit: \"kg\" },\n  },\n  legCurl: {\n    id: \"legCurl\",\n    name: \"Leg Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 60, unit: \"lb\" },\n    startingWeightKg: { value: 26.25, unit: \"kg\" },\n  },\n  legExtension: {\n    id: \"legExtension\",\n    name: \"Leg Extension\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 60, unit: \"lb\" },\n    startingWeightKg: { value: 26.25, unit: \"kg\" },\n  },\n  legPress: {\n    id: \"legPress\",\n    name: \"Leg Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 250, unit: \"lb\" },\n    startingWeightKg: { value: 112.5, unit: \"kg\" },\n  },\n  lunge: {\n    id: \"lunge\",\n    name: \"Lunge\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 75, unit: \"lb\" },\n    startingWeightKg: { value: 32.5, unit: \"kg\" },\n  },\n  lyingBicepCurl: {\n    id: \"lyingBicepCurl\",\n    name: \"Lying Bicep Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  lyingLegCurl: {\n    id: \"lyingLegCurl\",\n    name: \"Lying Leg Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 60, unit: \"lb\" },\n    startingWeightKg: { value: 26.25, unit: \"kg\" },\n  },\n  mountainClimber: {\n    id: \"mountainClimber\",\n    name: \"Mountain Climber\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\", \"lower\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  muscleUp: {\n    id: \"muscleUp\",\n    name: \"Muscle Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  obliqueCrunch: {\n    id: \"obliqueCrunch\",\n    name: \"Oblique Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  overheadPress: {\n    id: \"overheadPress\",\n    name: \"Overhead Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 75, unit: \"lb\" },\n    startingWeightKg: { value: 32.5, unit: \"kg\" },\n  },\n  overheadSquat: {\n    id: \"overheadSquat\",\n    name: \"Overhead Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 55, unit: \"lb\" },\n    startingWeightKg: { value: 25, unit: \"kg\" },\n  },\n  pecDeck: {\n    id: \"pecDeck\",\n    name: \"Pec Deck\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 50, unit: \"lb\" },\n    startingWeightKg: { value: 22.5, unit: \"kg\" },\n  },\n  pendlayRow: {\n    id: \"pendlayRow\",\n    name: \"Pendlay Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  pistolSquat: {\n    id: \"pistolSquat\",\n    name: \"Pistol Squat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  plank: {\n    id: \"plank\",\n    name: \"Plank\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  powerClean: {\n    id: \"powerClean\",\n    name: \"Power Clean\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  powerSnatch: {\n    id: \"powerSnatch\",\n    name: \"Power Snatch\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  preacherCurl: {\n    id: \"preacherCurl\",\n    name: \"Preacher Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  pressUnder: {\n    id: \"pressUnder\",\n    name: \"Press Under\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  pullUp: {\n    id: \"pullUp\",\n    name: \"Pull Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  pullover: {\n    id: \"pullover\",\n    name: \"Pullover\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  pushPress: {\n    id: \"pushPress\",\n    name: \"Push Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"kettlebell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 35, unit: \"lb\" },\n    startingWeightKg: { value: 16, unit: \"kg\" },\n  },\n  pushUp: {\n    id: \"pushUp\",\n    name: \"Push Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  reverseCrunch: {\n    id: \"reverseCrunch\",\n    name: \"Reverse Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  reverseCurl: {\n    id: \"reverseCurl\",\n    name: \"Reverse Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  reverseFly: {\n    id: \"reverseFly\",\n    name: \"Reverse Fly\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  reverseGripConcentrationCurl: {\n    id: \"reverseGripConcentrationCurl\",\n    name: \"Reverse Grip Concentration Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  reversePlank: {\n    id: \"reversePlank\",\n    name: \"Reverse Plank\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  reverseLatPulldown: {\n    id: \"reverseLatPulldown\",\n    name: \"Reverse Lat Pulldown\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 70, unit: \"lb\" },\n    startingWeightKg: { value: 30, unit: \"kg\" },\n  },\n  reverseLunge: {\n    id: \"reverseLunge\",\n    name: \"Reverse Lunge\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  reverseWristCurl: {\n    id: \"reverseWristCurl\",\n    name: \"Reverse Wrist Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  romanianDeadlift: {\n    id: \"romanianDeadlift\",\n    name: \"Romanian Deadlift\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 40, unit: \"lb\" },\n    startingWeightKg: { value: 17.5, unit: \"kg\" },\n  },\n  reverseHyperextension: {\n    id: \"reverseHyperextension\",\n    name: \"Reverse Hyperextension\",\n    defaultWarmup: 45,\n    defaultEquipment: \"band\",\n    types: [\"core\", \"lower\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  rowing: {\n    id: \"rowing\",\n    name: \"Rowing\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  russianTwist: {\n    id: \"russianTwist\",\n    name: \"Russian Twist\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  safetySquatBarSquat: {\n    id: \"safetySquatBarSquat\",\n    name: \"Safety Squat Bar Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 145, unit: \"lb\" },\n    startingWeightKg: { value: 65, unit: \"kg\" },\n  },\n  seatedCalfRaise: {\n    id: \"seatedCalfRaise\",\n    name: \"Seated Calf Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 90, unit: \"lb\" },\n    startingWeightKg: { value: 40, unit: \"kg\" },\n  },\n  seatedFrontRaise: {\n    id: \"seatedFrontRaise\",\n    name: \"Seated Front Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  seatedLegCurl: {\n    id: \"seatedLegCurl\",\n    name: \"Seated Leg Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 60, unit: \"lb\" },\n    startingWeightKg: { value: 26.25, unit: \"kg\" },\n  },\n  seatedLegPress: {\n    id: \"seatedLegPress\",\n    name: \"Seated Leg Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 200, unit: \"lb\" },\n    startingWeightKg: { value: 90, unit: \"kg\" },\n  },\n  seatedOverheadPress: {\n    id: \"seatedOverheadPress\",\n    name: \"Seated Overhead Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 75, unit: \"lb\" },\n    startingWeightKg: { value: 32.5, unit: \"kg\" },\n  },\n  seatedPalmsUpWristCurl: {\n    id: \"seatedPalmsUpWristCurl\",\n    name: \"Seated Palms Up Wrist Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  seatedRow: {\n    id: \"seatedRow\",\n    name: \"Seated Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 70, unit: \"lb\" },\n    startingWeightKg: { value: 30, unit: \"kg\" },\n  },\n  seatedWideGripRow: {\n    id: \"seatedWideGripRow\",\n    name: \"Seated Wide Grip Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  shoulderPress: {\n    id: \"shoulderPress\",\n    name: \"Shoulder Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  shoulderPressParallelGrip: {\n    id: \"shoulderPressParallelGrip\",\n    name: \"Shoulder Press Parallel Grip\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  shrug: {\n    id: \"shrug\",\n    name: \"Shrug\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 45, unit: \"lb\" },\n    startingWeightKg: { value: 20, unit: \"kg\" },\n  },\n  sideBend: {\n    id: \"sideBend\",\n    name: \"Side Bend\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"core\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  sideCrunch: {\n    id: \"sideCrunch\",\n    name: \"Side Crunch\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  sideHipAbductor: {\n    id: \"sideHipAbductor\",\n    name: \"Side Hip Abductor\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  sideLyingClam: {\n    id: \"sideLyingClam\",\n    name: \"Side Lying Clam\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  sidePlank: {\n    id: \"sidePlank\",\n    name: \"Side Plank\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  singleLegBridge: {\n    id: \"singleLegBridge\",\n    name: \"Single Leg Bridge\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  singleLegCalfRaise: {\n    id: \"singleLegCalfRaise\",\n    name: \"Single Leg Calf Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 85, unit: \"lb\" },\n    startingWeightKg: { value: 37.5, unit: \"kg\" },\n  },\n  singleLegDeadlift: {\n    id: \"singleLegDeadlift\",\n    name: \"Single Leg Deadlift\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  singleLegGluteBridgeBench: {\n    id: \"singleLegGluteBridgeBench\",\n    name: \"Single Leg Glute Bridge On Bench\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  singleLegGluteBridgeStraight: {\n    id: \"singleLegGluteBridgeStraight\",\n    name: \"Single Leg Glute Bridge Straight Leg\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  singleLegGluteBridgeBentKnee: {\n    id: \"singleLegGluteBridgeBentKnee\",\n    name: \"Single Leg Glute Bridge Bent Knee\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  singleLegHipThrust: {\n    id: \"singleLegHipThrust\",\n    name: \"Single Leg Hip Thrust\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  sissySquat: {\n    id: \"sissySquat\",\n    name: \"Sissy Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  sitUp: {\n    id: \"sitUp\",\n    name: \"Sit Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  skullcrusher: {\n    id: \"skullcrusher\",\n    name: \"Skullcrusher\",\n    defaultWarmup: 10,\n    defaultEquipment: \"ezbar\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 45, unit: \"lb\" },\n    startingWeightKg: { value: 20, unit: \"kg\" },\n  },\n  slingShotBenchPress: {\n    id: \"slingShotBenchPress\",\n    name: \"Sling Shot Bench Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 140, unit: \"lb\" },\n    startingWeightKg: { value: 62.5, unit: \"kg\" },\n  },\n  snatch: {\n    id: \"snatch\",\n    name: \"Snatch\",\n    defaultWarmup: 45,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  snatchPull: {\n    id: \"snatchPull\",\n    name: \"Snatch Pull\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 85, unit: \"lb\" },\n    startingWeightKg: { value: 37.5, unit: \"kg\" },\n  },\n  splitSquat: {\n    id: \"splitSquat\",\n    name: \"Split Squat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  splitJerk: {\n    id: \"splitJerk\",\n    name: \"Split Jerk\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"push\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  squat: {\n    id: \"squat\",\n    name: \"Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 135, unit: \"lb\" },\n    startingWeightKg: { value: 60, unit: \"kg\" },\n  },\n  squatRow: {\n    id: \"squatRow\",\n    name: \"Squat Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"band\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  standingCalfRaise: {\n    id: \"standingCalfRaise\",\n    name: \"Standing Calf Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 35, unit: \"lb\" },\n    startingWeightKg: { value: 15, unit: \"kg\" },\n  },\n  standingRow: {\n    id: \"standingRow\",\n    name: \"Standing Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 70, unit: \"lb\" },\n    startingWeightKg: { value: 30, unit: \"kg\" },\n  },\n  standingRowCloseGrip: {\n    id: \"standingRowCloseGrip\",\n    name: \"Standing Row Close Grip\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  standingRowRearDeltWithRope: {\n    id: \"standingRowRearDeltWithRope\",\n    name: \"Standing Row Rear Delt With Rope\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  standingRowRearHorizontalDeltWithRope: {\n    id: \"standingRowRearHorizontalDeltWithRope\",\n    name: \"Standing Row Rear Delt, Horizontal, With Rope\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  standingRowVBar: {\n    id: \"standingRowVBar\",\n    name: \"Standing Row V-Bar\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 70, unit: \"lb\" },\n    startingWeightKg: { value: 30, unit: \"kg\" },\n  },\n  stepUp: {\n    id: \"stepUp\",\n    name: \"Step up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  stiffLegDeadlift: {\n    id: \"stiffLegDeadlift\",\n    name: \"Stiff Leg Deadlift\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 115, unit: \"lb\" },\n    startingWeightKg: { value: 50, unit: \"kg\" },\n  },\n  straightLegDeadlift: {\n    id: \"straightLegDeadlift\",\n    name: \"Straight Leg Deadlift\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 110, unit: \"lb\" },\n    startingWeightKg: { value: 50, unit: \"kg\" },\n  },\n  sumoDeadlift: {\n    id: \"sumoDeadlift\",\n    name: \"Sumo Deadlift\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 175, unit: \"lb\" },\n    startingWeightKg: { value: 77.5, unit: \"kg\" },\n  },\n  sumoDeadliftHighPull: {\n    id: \"sumoDeadliftHighPull\",\n    name: \"Sumo Deadlift High Pull\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 85, unit: \"lb\" },\n    startingWeightKg: { value: 37.5, unit: \"kg\" },\n  },\n  superman: {\n    id: \"superman\",\n    name: \"Superman\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  tBarRow: {\n    id: \"tBarRow\",\n    name: \"T Bar Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 90, unit: \"lb\" },\n    startingWeightKg: { value: 40, unit: \"kg\" },\n  },\n  thruster: {\n    id: \"thruster\",\n    name: \"Thruster\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"push\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  toesToBar: {\n    id: \"toesToBar\",\n    name: \"Toes To Bar\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  torsoRotation: {\n    id: \"torsoRotation\",\n    name: \"Torso Rotation\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  trapBarDeadlift: {\n    id: \"trapBarDeadlift\",\n    name: \"Trap Bar Deadlift\",\n    defaultWarmup: 10,\n    defaultEquipment: \"trapbar\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 185, unit: \"lb\" },\n    startingWeightKg: { value: 82.5, unit: \"kg\" },\n  },\n  tricepsDip: {\n    id: \"tricepsDip\",\n    name: \"Triceps Dip\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  tricepsExtension: {\n    id: \"tricepsExtension\",\n    name: \"Triceps Extension\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  tricepsPushdown: {\n    id: \"tricepsPushdown\",\n    name: \"Triceps Pushdown\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 40, unit: \"lb\" },\n    startingWeightKg: { value: 17.5, unit: \"kg\" },\n  },\n  uprightRow: {\n    id: \"uprightRow\",\n    name: \"Upright Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  vUp: {\n    id: \"vUp\",\n    name: \"V Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  widePullUp: {\n    id: \"widePullUp\",\n    name: \"Wide Pull Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  wristCurl: {\n    id: \"wristCurl\",\n    name: \"Wrist Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  wristRoller: {\n    id: \"wristRoller\",\n    name: \"Wrist Roller\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  zercherSquat: {\n    id: \"zercherSquat\",\n    name: \"Zercher Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 105, unit: \"lb\" },\n    startingWeightKg: { value: 47.5, unit: \"kg\" },\n  },\n};\n\nconst nameToIdMapping = ObjectUtils.keys(allExercisesList).reduce<Partial<Record<string, IExerciseId>>>((acc, key) => {\n  acc[allExercisesList[key].name.toLowerCase()] = allExercisesList[key].id;\n  return acc;\n}, {});\n\nexport const metadata: Record<IExerciseId, IMetaExercises> = {\n  abWheel: {\n    targetMuscles: [\"Iliopsoas\"],\n    synergistMuscles: [\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Deltoid Posterior\",\n      \"Latissimus Dorsi\",\n      \"Pectineous\",\n      \"Pectoralis Major Sternal Head\",\n      \"Sartorius\",\n      \"Teres Major\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  arnoldPress: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\"Deltoid Lateral\", \"Serratus Anterior\", \"Triceps Brachii\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"dumbbell\", \"kettlebell\"],\n  },\n  aroundTheWorld: {\n    targetMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Lateral\", \"Deltoid Posterior\", \"Latissimus Dorsi\", \"Serratus Anterior\"],\n    bodyParts: [\"Chest\", \"Shoulders\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  backExtension: {\n    targetMuscles: [\"Erector Spinae\"],\n    synergistMuscles: [\"Gluteus Maximus\", \"Hamstrings\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\", \"leverageMachine\"],\n  },\n  ballSlams: {\n    targetMuscles: [\n      \"Infraspinatus\",\n      \"Latissimus Dorsi\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Rectus Abdominis\"],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"medicineball\"],\n  },\n  battleRopes: {\n    targetMuscles: [\"Deltoid Posterior\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Lateral\",\n      \"Infraspinatus\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  behindTheNeckPress: {\n    targetMuscles: [\"Deltoid Anterior\", \"Deltoid Lateral\", \"Deltoid Posterior\"],\n    synergistMuscles: [\"Triceps Brachii\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  benchDip: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [\n      \"Deltoid Anterior\",\n      \"Latissimus Dorsi\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  benchPress: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"smith\", \"band\", \"kettlebell\"],\n  },\n  benchPressCloseGrip: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Pectoralis Major Sternal Head\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"ezbar\", \"smith\"],\n  },\n  benchPressWideGrip: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\", \"smith\"],\n  },\n  bentOverOneArmRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  bentOverRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Middle Fibers\", \"Trapezius Upper Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"band\", \"leverageMachine\", \"smith\"],\n  },\n  bicepCurl: {\n    targetMuscles: [\"Biceps Brachii\"],\n    synergistMuscles: [\"Brachialis\", \"Brachioradialis\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"band\", \"leverageMachine\", \"cable\", \"ezbar\"],\n  },\n  bicycleCrunch: {\n    targetMuscles: [\"Obliques\", \"Rectus Abdominis\"],\n    synergistMuscles: [\"Gluteus Maximus\", \"Iliopsoas\", \"Quadriceps\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  boxJump: {\n    targetMuscles: [\"Quadriceps\", \"Gluteus Maximus\", \"Gastrocnemius\", \"Soleus\"],\n    synergistMuscles: [\"Hamstrings\", \"Adductor Magnus\", \"Erector Spinae\", \"Rectus Abdominis\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  boxSquat: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  bulgarianSplitSquat: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Hips\", \"Thighs\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  burpee: {\n    targetMuscles: [\n      \"Quadriceps\",\n      \"Gluteus Maximus\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n      \"Triceps Brachii\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Deltoid Posterior\",\n      \"Rectus Abdominis\",\n    ],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Latissimus Dorsi\",\n      \"Obliques\",\n      \"Erector Spinae\",\n      \"Obliques\",\n      \"Soleus\",\n      \"Gastrocnemius\",\n      \"Tibialis Anterior\",\n    ],\n    bodyParts: [\"Chest\", \"Shoulders\", \"Upper Arms\", \"Waist\", \"Thighs\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  cableCrossover: {\n    targetMuscles: [\"Pectoralis Major Clavicular Head\", \"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"cable\"],\n  },\n  cableCrunch: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"cable\"],\n  },\n  cableKickback: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"cable\"],\n  },\n  cablePullThrough: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Erector Spinae\", \"Hamstrings\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"cable\"],\n  },\n  cableTwist: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\"Iliopsoas\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"barbell\", \"bodyweight\", \"cable\", \"leverageMachine\", \"band\"],\n  },\n  calfPressOnLegPress: {\n    targetMuscles: [\"Gastrocnemius\"],\n    synergistMuscles: [\"Soleus\"],\n    bodyParts: [\"Calves\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  calfPressOnSeatedLegPress: {\n    targetMuscles: [\"Gastrocnemius\", \"Quadriceps\"],\n    synergistMuscles: [\"Gluteus Maximus\", \"Hamstrings\", \"Soleus\"],\n    bodyParts: [\"Calves\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  chestDip: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\n      \"Deltoid Anterior\",\n      \"Latissimus Dorsi\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  chestFly: {\n    targetMuscles: [\"Pectoralis Major Clavicular Head\", \"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Deltoid Anterior\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"leverageMachine\"],\n  },\n  chestPress: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Deltoid Lateral\", \"Pectoralis Major Clavicular Head\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"leverageMachine\", \"band\"],\n  },\n  chestSupportedRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Middle Fibers\", \"Trapezius Upper Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  chinUp: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"leverageMachine\", \"bodyweight\"],\n  },\n  clean: {\n    targetMuscles: [\n      \"Gluteus Maximus\",\n      \"Hamstrings\",\n      \"Quadriceps\",\n      \"Latissimus Dorsi\",\n      \"Trapezius Lower Fibers\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n    ],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Erector Spinae\",\n      \"Biceps Brachii\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n      \"Wrist Flexors\",\n    ],\n    bodyParts: [\"Hips\", \"Thighs\", \"Back\", \"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  cleanandJerk: {\n    targetMuscles: [\n      \"Gluteus Maximus\",\n      \"Hamstrings\",\n      \"Quadriceps\",\n      \"Latissimus Dorsi\",\n      \"Trapezius Lower Fibers\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n    ],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Erector Spinae\",\n      \"Biceps Brachii\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n      \"Wrist Flexors\",\n    ],\n    bodyParts: [\"Hips\", \"Thighs\", \"Back\", \"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  concentrationCurl: {\n    targetMuscles: [\"Brachialis\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Brachioradialis\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"band\", \"cable\"],\n  },\n  crossBodyCrunch: {\n    targetMuscles: [\"Obliques\", \"Rectus Abdominis\"],\n    synergistMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  crunch: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"cable\", \"bodyweight\", \"leverageMachine\"],\n  },\n  cycling: {\n    targetMuscles: [\"Quadriceps\", \"Hamstrings\", \"Gluteus Maximus\", \"Gastrocnemius\", \"Soleus\", \"Tibialis Anterior\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Adductor Longus\",\n      \"Adductor Brevis\",\n      \"Iliopsoas\",\n      \"Erector Spinae\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n    ],\n    bodyParts: [\"Hips\", \"Thighs\", \"Calves\", \"Shins\", \"Back\", \"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  deadlift: {\n    targetMuscles: [\"Gluteus Maximus\", \"Erector Spinae\", \"Hamstrings\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Erector Spinae\",\n      \"Hamstrings\",\n      \"Quadriceps\",\n      \"Soleus\",\n      \"Latissimus Dorsi\",\n      \"Obliques\",\n      \"Rectus Abdominis\",\n      \"Gastrocnemius\",\n      \"Brachioradialis\",\n      \"Soleus\",\n    ],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"leverageMachine\", \"smith\", \"band\", \"kettlebell\", \"bodyweight\"],\n  },\n  deadliftHighPull: {\n    targetMuscles: [\"Deltoid Lateral\", \"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Anterior\",\n      \"Gastrocnemius\",\n      \"Infraspinatus\",\n      \"Soleus\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  declineBenchPress: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"dumbbell\", \"smith\"],\n  },\n  declineCrunch: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\", \"Iliopsoas\", \"Tensor Fasciae Latae\", \"Sartorius\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  deficitDeadlift: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Erector Spinae\", \"Hamstrings\", \"Quadriceps\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"trapbar\"],\n  },\n  ellipticalMachine: {\n    targetMuscles: [],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Deltoid Posterior\",\n      \"Gluteus Maximus\",\n      \"Hamstrings\",\n      \"Latissimus Dorsi\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n      \"Quadriceps\",\n      \"Serratus Anterior\",\n    ],\n    bodyParts: [\"Hips\", \"Thighs\", \"Back\", \"Shoulders\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  facePull: {\n    targetMuscles: [\"Deltoid Posterior\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Lateral\",\n      \"Infraspinatus\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"band\"],\n  },\n  flatKneeRaise: {\n    targetMuscles: [\"Iliopsoas\"],\n    synergistMuscles: [\"Adductor Brevis\", \"Adductor Longus\", \"Pectineous\", \"Sartorius\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  flatLegRaise: {\n    targetMuscles: [\"Iliopsoas\", \"Rectus Abdominis\"],\n    synergistMuscles: [\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Adductor Magnus\",\n      \"Obliques\",\n      \"Pectineous\",\n      \"Quadriceps\",\n      \"Sartorius\",\n      \"Tensor Fasciae Latae\",\n    ],\n    bodyParts: [\"Hips\", \"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  frontRaise: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\"Deltoid Lateral\", \"Pectoralis Major Clavicular Head\", \"Serratus Anterior\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"bodyweight\", \"band\"],\n  },\n  gluteBridge: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Hamstrings\", \"Quadriceps\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"band\", \"barbell\", \"dumbbell\"],\n  },\n  gluteBridgeMarch: {\n    targetMuscles: [\"Gluteus Maximus\", \"Rectus Abdominis\"],\n    synergistMuscles: [\"Hamstrings\", \"Quadriceps\", \"Sartorius\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  gluteKickback: {\n    targetMuscles: [\"Gluteus Maximus\", \"Gluteus Medius\"],\n    synergistMuscles: [\"Hamstrings\", \"Tensor Fasciae Latae\", \"Rectus Abdominis\", \"Obliques\"],\n    bodyParts: [\"Glute\"],\n    sortedEquipment: [\"leverageMachine\", \"bodyweight\", \"cable\", \"band\"],\n  },\n  frontSquat: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"kettlebell\", \"dumbbell\", \"cable\", \"smith\"],\n  },\n  gobletSquat: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"kettlebell\", \"dumbbell\"],\n  },\n  goodMorning: {\n    targetMuscles: [\"Hamstrings\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"smith\", \"leverageMachine\"],\n  },\n  hackSquat: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"smith\"],\n  },\n  hammerCurl: {\n    targetMuscles: [\"Brachioradialis\", \"Biceps Brachii\", \"Brachialis\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Wrist Flexors\"],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"cable\", \"dumbbell\", \"band\"],\n  },\n  handstandPushUp: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n      \"Serratus Anterior\",\n      \"Teres Major\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  hangClean: {\n    targetMuscles: [\"Biceps Brachii\", \"Brachialis\", \"Brachioradialis\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\"],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"kettlebell\"],\n  },\n  hangSnatch: {\n    targetMuscles: [\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Trapezius Upper Fibers\",\n      \"Quadriceps\",\n      \"Gluteus Maximus\",\n    ],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Erector Spinae\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Deltoid Posterior\",\n      \"Latissimus Dorsi\",\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Obliques\",\n      \"Rectus Abdominis\",\n    ],\n    bodyParts: [\"Thighs\", \"Back\", \"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  hangingLegRaise: {\n    targetMuscles: [\"Iliopsoas\", \"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\", \"Quadriceps\", \"Sartorius\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"cable\"],\n  },\n  highKneeSkips: {\n    targetMuscles: [\"Quadriceps\", \"Hamstrings\", \"Gluteus Maximus\"],\n    synergistMuscles: [\n      \"Iliopsoas\",\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Tibialis Anterior\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n      \"Adductor Magnus\",\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n    ],\n    bodyParts: [\"Thighs\", \"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  highRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Teres Major\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  hipAbductor: {\n    targetMuscles: [\"Gluteus Maximus\", \"Gluteus Medius\"],\n    synergistMuscles: [\"Tensor Fasciae Latae\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"leverageMachine\", \"bodyweight\", \"cable\", \"band\"],\n  },\n  hipAdductor: {\n    targetMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\"],\n    synergistMuscles: [\"Tensor Fasciae Latae\", \"Pectineous\", \"Adductor Brevis\", \"Adductor Longus\", \"Adductor Magnus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"leverageMachine\", \"cable\", \"band\", \"bodyweight\"],\n  },\n  hipThrust: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Hamstrings\", \"Quadriceps\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"leverageMachine\", \"band\", \"bodyweight\"],\n  },\n  inclineBenchPress: {\n    targetMuscles: [\"Pectoralis Major Clavicular Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"smith\"],\n  },\n  inclineBenchPressWideGrip: {\n    targetMuscles: [\"Pectoralis Major Clavicular Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  inclineChestFly: {\n    targetMuscles: [\"Pectoralis Major Clavicular Head\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Deltoid Anterior\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"cable\", \"dumbbell\"],\n  },\n  inclineChestPress: {\n    targetMuscles: [\"Pectoralis Major Clavicular Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"leverageMachine\", \"band\", \"dumbbell\"],\n  },\n  inclineCurl: {\n    targetMuscles: [\"Biceps Brachii\"],\n    synergistMuscles: [\"Brachialis\", \"Brachioradialis\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  inclineRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Middle Fibers\", \"Trapezius Upper Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  invertedRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  isoLateralChestPress: {\n    targetMuscles: [\"Pectoralis Major Clavicular Head\", \"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Triceps Brachii\", \"Deltoid Anterior\", \"Serratus Anterior\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  isoLateralRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Teres Major\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  jackknifeSitUp: {\n    targetMuscles: [\"Iliopsoas\", \"Rectus Abdominis\"],\n    synergistMuscles: [\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Obliques\",\n      \"Pectineous\",\n      \"Quadriceps\",\n      \"Sartorius\",\n      \"Tensor Fasciae Latae\",\n    ],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  jumpRope: {\n    targetMuscles: [\"Soleus\", \"Gastrocnemius\", \"Quadriceps\", \"Hamstrings\"],\n    synergistMuscles: [\"Gluteus Maximus\", \"Rectus Abdominis\", \"Obliques\", \"Tibialis Anterior\"],\n    bodyParts: [\"Thighs\", \"Calves\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  jumpSquat: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gastrocnemius\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"bodyweight\"],\n  },\n  jumpingJack: {\n    targetMuscles: [\n      \"Gluteus Maximus\",\n      \"Quadriceps\",\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Adductor Magnus\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Deltoid Posterior\",\n    ],\n    synergistMuscles: [\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Hamstrings\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n      \"Trapezius Upper Fibers\",\n      \"Serratus Anterior\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  kettlebellSwing: {\n    targetMuscles: [\"Deltoid Anterior\", \"Gluteus Maximus\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Hamstrings\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Soleus\",\n    ],\n    bodyParts: [\"Hips\", \"Shoulders\"],\n    sortedEquipment: [\"dumbbell\", \"kettlebell\"],\n  },\n  kettlebellTurkishGetUp: {\n    targetMuscles: [\"Deltoid Anterior\", \"Deltoid Lateral\", \"Deltoid Posterior\", \"Quadriceps\", \"Gluteus Maximus\"],\n    synergistMuscles: [\n      \"Obliques\",\n      \"Rectus Abdominis\",\n      \"Latissimus Dorsi\",\n      \"Hamstrings\",\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Adductor Magnus\",\n      \"Triceps Brachii\",\n      \"Erector Spinae\",\n      \"Serratus Anterior\",\n    ],\n    bodyParts: [\"Hips\", \"Shoulders\"],\n    sortedEquipment: [\"kettlebell\"],\n  },\n  kippingPullUp: {\n    targetMuscles: [\n      \"Latissimus Dorsi\",\n      \"Brachialis\",\n      \"Biceps Brachii\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    synergistMuscles: [\n      \"Deltoid Posterior\",\n      \"Brachioradialis\",\n      \"Pectoralis Major Sternal Head\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n      \"Iliopsoas\",\n      \"Tensor Fasciae Latae\",\n      \"Adductor Longus\",\n      \"Adductor Brevis\",\n      \"Erector Spinae\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  kneeRaise: {\n    targetMuscles: [\"Rectus Abdominis\", \"Iliopsoas\"],\n    synergistMuscles: [\"Obliques\", \"Adductor Brevis\", \"Adductor Longus\", \"Adductor Magnus\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  kneelingPulldown: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"band\"],\n  },\n  kneestoElbows: {\n    targetMuscles: [\"Iliopsoas\", \"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\", \"Quadriceps\", \"Sartorius\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  latPulldown: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Obliques\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\"],\n  },\n  lateralBoxJump: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\", \"Hamstrings\"],\n    synergistMuscles: [\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Adductor Magnus\",\n      \"Gluteus Medius\",\n      \"Tensor Fasciae Latae\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n      \"Deltoid Anterior\",\n      \"Deltoid Posterior\",\n      \"Deltoid Lateral\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  lateralRaise: {\n    targetMuscles: [\"Deltoid Lateral\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Serratus Anterior\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"cable\", \"dumbbell\", \"leverageMachine\", \"band\", \"kettlebell\"],\n  },\n  legsUpBenchPress: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  legCurl: {\n    targetMuscles: [\"Hamstrings\"],\n    synergistMuscles: [\"Gastrocnemius\", \"Sartorius\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  legExtension: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Tensor Fasciae Latae\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"leverageMachine\", \"band\"],\n  },\n  legPress: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"smith\", \"leverageMachine\"],\n  },\n  lunge: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"bodyweight\", \"cable\"],\n  },\n  lyingBicepCurl: {\n    targetMuscles: [\"Biceps Brachii\"],\n    synergistMuscles: [\"Brachialis\", \"Brachioradialis\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"band\", \"leverageMachine\", \"cable\", \"ezbar\"],\n  },\n  lyingLegCurl: {\n    targetMuscles: [\"Hamstrings\"],\n    synergistMuscles: [\"Gastrocnemius\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"leverageMachine\", \"band\"],\n  },\n  mountainClimber: {\n    targetMuscles: [\"Rectus Abdominis\", \"Iliopsoas\", \"Quadriceps\"],\n    synergistMuscles: [\n      \"Obliques\",\n      \"Deltoid Anterior\",\n      \"Deltoid Posterior\",\n      \"Deltoid Lateral\",\n      \"Biceps Brachii\",\n      \"Triceps Brachii\",\n      \"Pectoralis Major Sternal Head\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Gluteus Maximus\",\n      \"Hamstrings\",\n    ],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  muscleUp: {\n    targetMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Latissimus Dorsi\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    synergistMuscles: [],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  obliqueCrunch: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\"Rectus Abdominis\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  overheadPress: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\"Deltoid Lateral\", \"Pectoralis Major Clavicular Head\", \"Serratus Anterior\", \"Triceps Brachii\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"ezbar\"],\n  },\n  overheadSquat: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  pecDeck: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Pectoralis Major Clavicular Head\", \"Serratus Anterior\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  pendlayRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  pistolSquat: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"kettlebell\", \"leverageMachine\", \"bodyweight\"],\n  },\n  plank: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\n      \"Deltoid Anterior\",\n      \"Gluteus Maximus\",\n      \"Gluteus Medius\",\n      \"Obliques\",\n      \"Sartorius\",\n      \"Tensor Fasciae Latae\",\n    ],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  powerClean: {\n    targetMuscles: [\"Quadriceps\", \"Gluteus Maximus\", \"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Trapezius Upper Fibers\",\n      \"Latissimus Dorsi\",\n      \"Erector Spinae\",\n      \"Biceps Brachii\",\n      \"Wrist Flexors\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  powerSnatch: {\n    targetMuscles: [\"Quadriceps\", \"Gluteus Maximus\", \"Deltoid Anterior\", \"Deltoid Lateral\", \"Deltoid Posterior\"],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Trapezius Upper Fibers\",\n      \"Latissimus Dorsi\",\n      \"Erector Spinae\",\n      \"Biceps Brachii\",\n      \"Wrist Flexors\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  preacherCurl: {\n    targetMuscles: [\"Brachialis\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Brachioradialis\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"ezbar\", \"leverageMachine\"],\n  },\n  pressUnder: {\n    targetMuscles: [\"Quadriceps\", \"Deltoid Anterior\", \"Deltoid Lateral\", \"Deltoid Posterior\"],\n    synergistMuscles: [\n      \"Gluteus Maximus\",\n      \"Hamstrings\",\n      \"Erector Spinae\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n      \"Triceps Brachii\",\n      \"Biceps Brachii\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  pullUp: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"leverageMachine\", \"bodyweight\", \"band\"],\n  },\n  pullover: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  pushPress: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Deltoid Lateral\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"bodyweight\", \"kettlebell\"],\n  },\n  pushUp: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"bodyweight\", \"band\"],\n  },\n  reverseCrunch: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"cable\"],\n  },\n  reverseCurl: {\n    targetMuscles: [\"Brachioradialis\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Brachialis\"],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"band\"],\n  },\n  reverseFly: {\n    targetMuscles: [\"Deltoid Posterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Infraspinatus\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"dumbbell\", \"leverageMachine\", \"band\"],\n  },\n  reverseGripConcentrationCurl: {\n    targetMuscles: [\"Brachialis\", \"Brachioradialis\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Wrist Flexors\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  reverseLatPulldown: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Obliques\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\"],\n  },\n  reverseLunge: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\", \"Gluteus Maximus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"bodyweight\", \"cable\"],\n  },\n  reverseWristCurl: {\n    targetMuscles: [\"Wrist Extensors\"],\n    synergistMuscles: [],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  reversePlank: {\n    targetMuscles: [\"Gluteus Maximus\", \"Rectus Abdominis\", \"Erector Spinae\"],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Quadriceps\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Deltoid Posterior\",\n      \"Triceps Brachii\",\n      \"Latissimus Dorsi\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  romanianDeadlift: {\n    targetMuscles: [\"Erector Spinae\", \"Gluteus Maximus\", \"Hamstrings\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Latissimus Dorsi\", \"Obliques\", \"Rectus Abdominis\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  reverseHyperextension: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Hamstrings\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"band\", \"leverageMachine\"],\n  },\n  rowing: {\n    targetMuscles: [\"Quadriceps\", \"Latissimus Dorsi\", \"Erector Spinae\"],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Gluteus Maximus\",\n      \"Biceps Brachii\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Deltoid Posterior\",\n      \"Wrist Flexors\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"cable\"],\n  },\n  russianTwist: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\"Iliopsoas\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"dumbbell\", \"cable\"],\n  },\n  safetySquatBarSquat: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Erector Spinae\", \"Hamstrings\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  seatedCalfRaise: {\n    targetMuscles: [\"Gastrocnemius\"],\n    synergistMuscles: [\"Soleus\"],\n    bodyParts: [\"Calves\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"leverageMachine\"],\n  },\n  seatedFrontRaise: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\"Deltoid Lateral\", \"Pectoralis Major Clavicular Head\", \"Serratus Anterior\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  seatedLegCurl: {\n    targetMuscles: [\"Hamstrings\"],\n    synergistMuscles: [\"Gastrocnemius\", \"Sartorius\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  seatedLegPress: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Hips\", \"Thighs\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  seatedOverheadPress: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\"Deltoid Lateral\", \"Serratus Anterior\", \"Triceps Brachii\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  seatedPalmsUpWristCurl: {\n    targetMuscles: [\"Wrist Flexors\"],\n    synergistMuscles: [],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  seatedRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\", \"band\", \"leverageMachine\"],\n  },\n  seatedWideGripRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\"],\n  },\n  shoulderPress: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\"Deltoid Lateral\", \"Pectoralis Major Clavicular Head\", \"Serratus Anterior\", \"Triceps Brachii\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"cable\", \"dumbbell\", \"leverageMachine\", \"band\", \"smith\"],\n  },\n  shoulderPressParallelGrip: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\"Deltoid Lateral\", \"Pectoralis Major Clavicular Head\", \"Serratus Anterior\", \"Triceps Brachii\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  shrug: {\n    targetMuscles: [\"Trapezius Upper Fibers\"],\n    synergistMuscles: [\"Trapezius Middle Fibers\"],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"leverageMachine\", \"band\", \"smith\"],\n  },\n  sideBend: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\"Iliopsoas\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"cable\", \"dumbbell\", \"band\"],\n  },\n  sideCrunch: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\"Iliopsoas\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"band\", \"cable\"],\n  },\n  sideHipAbductor: {\n    targetMuscles: [\"Gluteus Medius\", \"Tensor Fasciae Latae\"],\n    synergistMuscles: [],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\", \"barbell\", \"leverageMachine\"],\n  },\n  sideLyingClam: {\n    targetMuscles: [\"Gluteus Medius\"],\n    synergistMuscles: [\"Tensor Fasciae Latae\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  sidePlank: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  singleLegBridge: {\n    targetMuscles: [\"Gluteus Maximus\", \"Rectus Abdominis\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Hamstrings\", \"Obliques\", \"Serratus Anterior\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  singleLegCalfRaise: {\n    targetMuscles: [\"Gastrocnemius\"],\n    synergistMuscles: [\"Soleus\"],\n    bodyParts: [\"Calves\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"leverageMachine\", \"bodyweight\", \"cable\"],\n  },\n  singleLegDeadlift: {\n    targetMuscles: [\"Erector Spinae\", \"Gluteus Maximus\"],\n    synergistMuscles: [\"Hamstrings\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"dumbbell\", \"bodyweight\"],\n  },\n  singleLegGluteBridgeBench: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  singleLegGluteBridgeStraight: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  singleLegGluteBridgeBentKnee: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  singleLegHipThrust: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Hamstrings\", \"Quadriceps\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"bodyweight\", \"leverageMachine\"],\n  },\n  sissySquat: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  sitUp: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Iliopsoas\", \"Obliques\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"kettlebell\"],\n  },\n  slingShotBenchPress: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  skullcrusher: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"ezbar\"],\n  },\n  snatch: {\n    targetMuscles: [\"Deltoid Anterior\", \"Erector Spinae\", \"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Deltoid Lateral\",\n      \"Gastrocnemius\",\n      \"Serratus Anterior\",\n      \"Soleus\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Hips\", \"Shoulders\", \"Thighs\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  snatchPull: {\n    targetMuscles: [\n      \"Erector Spinae\",\n      \"Gluteus Maximus\",\n      \"Hamstrings\",\n      \"Quadriceps\",\n      \"Latissimus Dorsi\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Trapezius Upper Fibers\",\n    ],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Deltoid Anterior\",\n      \"Deltoid Posterior\",\n      \"Deltoid Lateral\",\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Triceps Brachii\",\n      \"Wrist Flexors\",\n      \"Wrist Extensors\",\n    ],\n    bodyParts: [\"Back\", \"Hips\", \"Thighs\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  splitSquat: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Hips\", \"Thighs\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  splitJerk: {\n    targetMuscles: [\n      \"Deltoid Anterior\",\n      \"Deltoid Posterior\",\n      \"Deltoid Lateral\",\n      \"Triceps Brachii\",\n      \"Quadriceps\",\n      \"Gluteus Maximus\",\n      \"Erector Spinae\",\n    ],\n    synergistMuscles: [\n      \"Pectoralis Major Sternal Head\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Latissimus Dorsi\",\n      \"Hamstrings\",\n      \"Obliques\",\n      \"Rectus Abdominis\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Trapezius Upper Fibers\",\n      \"Adductor Magnus\",\n      \"Tensor Fasciae Latae\",\n      \"Wrist Extensors\",\n      \"Wrist Flexors\",\n    ],\n    bodyParts: [\"Hips\", \"Shoulders\", \"Thighs\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  squat: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Soleus\",\n      \"Hamstrings\",\n      \"Erector Spinae\",\n      \"Obliques\",\n      \"Rectus Abdominis\",\n      \"Gluteus Medius\",\n      \"Gastrocnemius\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"bodyweight\", \"smith\", \"leverageMachine\"],\n  },\n  squatRow: {\n    targetMuscles: [\"Gluteus Maximus\", \"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Adductor Magnus\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n      \"Quadriceps\",\n      \"Soleus\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"band\"],\n  },\n  standingCalfRaise: {\n    targetMuscles: [\"Gastrocnemius\"],\n    synergistMuscles: [\"Soleus\"],\n    bodyParts: [\"Calves\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"leverageMachine\", \"bodyweight\", \"cable\"],\n  },\n  standingRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\"],\n  },\n  standingRowCloseGrip: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Upper Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\"],\n  },\n  standingRowRearDeltWithRope: {\n    targetMuscles: [\"Deltoid Posterior\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Lateral\",\n      \"Infraspinatus\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"cable\"],\n  },\n  standingRowRearHorizontalDeltWithRope: {\n    targetMuscles: [\"Deltoid Posterior\"],\n    synergistMuscles: [\"Infraspinatus\", \"Teres Minor\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"cable\"],\n  },\n  standingRowVBar: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\"],\n  },\n  stepUp: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"bodyweight\", \"band\"],\n  },\n  stiffLegDeadlift: {\n    targetMuscles: [\"Erector Spinae\", \"Gluteus Maximus\", \"Hamstrings\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Quadriceps\", \"Latissimus Dorsi\", \"Obliques\", \"Rectus Abdominis\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"band\"],\n  },\n  straightLegDeadlift: {\n    targetMuscles: [\"Erector Spinae\", \"Hamstrings\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"band\", \"kettlebell\"],\n  },\n  sumoDeadlift: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\", \"Adductor Magnus\", \"Erector Spinae\"],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Latissimus Dorsi\",\n      \"Obliques\",\n      \"Rectus Abdominis\",\n      \"Trapezius Lower Fibers\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n    ],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  sumoDeadliftHighPull: {\n    targetMuscles: [\"Deltoid Lateral\", \"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Anterior\",\n      \"Gastrocnemius\",\n      \"Infraspinatus\",\n      \"Soleus\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  superman: {\n    targetMuscles: [\"Erector Spinae\"],\n    synergistMuscles: [\"Gluteus Maximus\", \"Hamstrings\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"dumbbell\"],\n  },\n  tBarRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  thruster: {\n    targetMuscles: [\"Deltoid Anterior\", \"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Deltoid Lateral\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Soleus\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Shoulders\", \"Thighs\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  toesToBar: {\n    targetMuscles: [\"Iliopsoas\", \"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\", \"Quadriceps\", \"Sartorius\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  torsoRotation: {\n    targetMuscles: [\"Obliques\", \"Rectus Abdominis\"],\n    synergistMuscles: [\"Erector Spinae\", \"Latissimus Dorsi\", \"Serratus Anterior\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"cable\"],\n  },\n  trapBarDeadlift: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"trapbar\"],\n  },\n  tricepsDip: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [\"Latissimus Dorsi\", \"Pectoralis Major Sternal Head\", \"Teres Major\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"bodyweight\", \"leverageMachine\"],\n  },\n  tricepsExtension: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"band\", \"dumbbell\"],\n  },\n  tricepsPushdown: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"cable\"],\n  },\n  uprightRow: {\n    targetMuscles: [\"Deltoid Lateral\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Anterior\",\n      \"Infraspinatus\",\n      \"Serratus Anterior\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"band\"],\n  },\n  vUp: {\n    targetMuscles: [\"Iliopsoas\", \"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\", \"Quadriceps\", \"Sartorius\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"band\", \"dumbbell\"],\n  },\n  widePullUp: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Teres Major\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  wristCurl: {\n    targetMuscles: [\"Wrist Flexors\"],\n    synergistMuscles: [],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  wristRoller: {\n    targetMuscles: [\"Wrist Extensors\", \"Wrist Flexors\"],\n    synergistMuscles: [],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  zercherSquat: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\"],\n  },\n};\n\nexport function equipmentToBarKey(equipment?: IEquipment): IBarKey | undefined {\n  switch (equipment) {\n    case \"barbell\":\n      return \"barbell\";\n    case \"dumbbell\":\n      return \"dumbbell\";\n    case \"ezbar\":\n      return \"ezbar\";\n    default:\n      return undefined;\n  }\n}\n\nexport function equipmentName(equipment: IEquipment | undefined, equipmentSettings?: IAllEquipment): string {\n  const equipmentData = equipment && equipmentSettings ? equipmentSettings[equipment] : undefined;\n  if (equipmentData?.name) {\n    return equipmentData.name.trim();\n  }\n  switch (equipment) {\n    case \"barbell\":\n      return \"Barbell\";\n    case \"cable\":\n      return \"Cable\";\n    case \"dumbbell\":\n      return \"Dumbbell\";\n    case \"smith\":\n      return \"Smith Machine\";\n    case \"band\":\n      return \"Band\";\n    case \"kettlebell\":\n      return \"Kettlebell\";\n    case \"bodyweight\":\n      return \"Bodyweight\";\n    case \"leverageMachine\":\n      return \"Leverage Machine\";\n    case \"medicineball\":\n      return \"Medicine Ball\";\n    case \"ezbar\":\n      return \"EZ Bar\";\n    case \"trapbar\":\n      return \"Trap Bar\";\n    default:\n      return \"\";\n  }\n}\n\n/** The full name of one variation of a custom exercise: \"Swing (Mace)\", or \"Swing (No equipment)\". */\nexport function variationName(name: string, equipment: string | undefined, equipmentSettings?: IAllEquipment): string {\n  const label = equipment == null ? \"No equipment\" : equipmentName(equipment, equipmentSettings) || equipment;\n  return `${name} (${label})`;\n}\n\nexport type IExerciseKind = \"core\" | \"pull\" | \"push\" | \"legs\" | \"upper\" | \"lower\";\n\nexport type IExercise = {\n  id: IExerciseId;\n  name: string;\n  defaultWarmup?: number;\n  equipment?: IEquipment;\n  defaultEquipment?: IEquipment;\n  types: IExerciseKind[];\n  onerm?: number;\n  startingWeightLb: IWeight;\n  startingWeightKg: IWeight;\n};\n\nexport function warmupValues(units: IUnit): Partial<Record<number, IProgramExerciseWarmupSet[]>> {\n  return {\n    10: [\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight.build(60, \"lb\") : Weight.build(30, \"kg\"),\n        value: 0.3,\n      },\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight.build(30, \"lb\") : Weight.build(15, \"kg\"),\n        value: 0.5,\n      },\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight.build(10, \"lb\") : Weight.build(5, \"kg\"),\n        value: 0.8,\n      },\n    ],\n    45: [\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight.build(120, \"lb\") : Weight.build(60, \"kg\"),\n        value: 0.3,\n      },\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight.build(90, \"lb\") : Weight.build(45, \"kg\"),\n        value: 0.5,\n      },\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight.build(45, \"lb\") : Weight.build(20, \"kg\"),\n        value: 0.8,\n      },\n    ],\n    95: [\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight.build(150, \"lb\") : Weight.build(70, \"kg\"),\n        value: 0.3,\n      },\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight.build(125, \"lb\") : Weight.build(60, \"kg\"),\n        value: 0.5,\n      },\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight.build(95, \"lb\") : Weight.build(40, \"kg\"),\n        value: 0.8,\n      },\n    ],\n  };\n}\n\nfunction warmup45(weight: IWeight | undefined, settings: ISettings, exerciseType?: IExerciseType): ISet[] {\n  return warmup(warmupValues(settings.units)[45] || [])(weight, settings, exerciseType);\n}\n\nfunction warmup95(weight: IWeight | undefined, settings: ISettings, exerciseType?: IExerciseType): ISet[] {\n  return warmup(warmupValues(settings.units)[95] || [])(weight, settings, exerciseType);\n}\n\nfunction warmup10(weight: IWeight | undefined, settings: ISettings, exerciseType?: IExerciseType): ISet[] {\n  return warmup(warmupValues(settings.units)[10] || [])(weight, settings, exerciseType);\n}\n\nfunction warmup(\n  programExerciseWarmupSets: IProgramExerciseWarmupSet[],\n  shouldSkipThreshold: boolean = false\n): (weight: IWeight | undefined, settings: ISettings, exerciseType?: IExerciseType) => ISet[] {\n  return (weight: IWeight | undefined, settings: ISettings, exerciseType?: IExerciseType): ISet[] => {\n    return programExerciseWarmupSets.reduce<ISet[]>((memo, programExerciseWarmupSet) => {\n      if (shouldSkipThreshold || (weight != null && Weight.gt(weight, programExerciseWarmupSet.threshold))) {\n        const value = programExerciseWarmupSet.value;\n        const unit = Equipment.getUnitOrDefaultForExerciseType(settings, exerciseType);\n        if (typeof value !== \"number\" || weight != null) {\n          const warmupWeight = typeof value === \"number\" ? Weight.multiply(weight!, value) : value;\n          const roundedWeight = Weight.roundConvertTo(warmupWeight, settings, unit, exerciseType);\n          memo.push({\n            id: UidFactory.generateUid(6),\n            reps: programExerciseWarmupSet.reps,\n            minReps: programExerciseWarmupSet.minReps,\n            isUnilateral: exerciseType ? Exercise.getIsUnilateral(exerciseType, settings) : false,\n            weight: roundedWeight,\n            originalWeight: warmupWeight,\n            isCompleted: false,\n          });\n        }\n      }\n      return memo;\n    }, []);\n  };\n}\n\nfunction warmupEmpty(weight: IWeight | undefined): ISet[] {\n  return [];\n}\n\nfunction maybeGetExercise(\n  id: IExerciseId,\n  customExercises: IAllCustomExercises,\n  type?: IExerciseType\n): IExercise | undefined {\n  const custom = customExercises[id];\n  if (custom == null) {\n    return allExercisesList[id];\n  }\n  // The meta and types of the variation of the type. An equipment that is no variation gives the\n  // default variation.\n  const variation =\n    (type != null ? CustomExerciseVariation.find(custom, type) : undefined) ??\n    CustomExerciseVariation.defaultVariation(custom);\n  return {\n    ...custom,\n    defaultWarmup: 45,\n    types: variation.types || [],\n    startingWeightKg: Weight.build(0, \"kg\"),\n    startingWeightLb: Weight.build(0, \"lb\"),\n  };\n}\n\nfunction variationMeta(custom: ICustomExercise, type: IExerciseType): ICustomExercise[\"meta\"] {\n  const variation = CustomExerciseVariation.find(custom, type) ?? CustomExerciseVariation.defaultVariation(custom);\n  return variation.meta ?? custom.meta;\n}\n\nfunction getExercise(id: IExerciseId, customExercises: IAllCustomExercises, type?: IExerciseType): IExercise {\n  const exercise = maybeGetExercise(id, customExercises, type);\n  return exercise != null ? exercise : allExercisesList.squat;\n}\n\nexport namespace Exercise {\n  export function getMetadata(id: IExerciseId): IMetaExercises {\n    return metadata[id] || {};\n  }\n\n  export function exists(name: string, customExercises: IAllCustomExercises): boolean {\n    let exercise = ObjectUtils.keys(allExercisesList).filter((k) => allExercisesList[k].name === name)[0];\n    if (exercise == null) {\n      exercise = ObjectUtils.keys(customExercises).filter(\n        (k) => !customExercises[k]!.isDeleted && customExercises[k]!.name === name\n      )[0];\n    }\n    return !!exercise;\n  }\n\n  export function isCustom(id: string, customExercises: IAllCustomExercises): boolean {\n    return customExercises[id] != null;\n  }\n\n  export function fullName(exercise: IExercise, settings: ISettings, label?: string): string {\n    let str: string;\n    const custom = settings.exercises[exercise.id];\n    if (custom != null) {\n      str = customFullName(custom, Equipment.currentEquipment(settings), exercise);\n    } else if (exercise.equipment && exercise.defaultEquipment !== exercise.equipment) {\n      const allEquipment = Equipment.currentEquipment(settings);\n      const equipment = equipmentName(exercise.equipment, allEquipment);\n      str = `${exercise.name}, ${equipment}`;\n    } else {\n      str = exercise.name;\n    }\n    if (label) {\n      str = `${label}: ${str}`;\n    }\n    return str;\n  }\n\n  export function reverseName(exercise: IExercise, settings?: ISettings): string {\n    if (exercise.equipment) {\n      const allEquipment = settings ? Equipment.currentEquipment(settings) : {};\n      const equipment = equipmentName(exercise.equipment, allEquipment);\n      return `${equipment} ${exercise.name}`;\n    } else {\n      return exercise.name;\n    }\n  }\n\n  export function nameWithEquipment(exercise: IExercise, settings?: ISettings): string {\n    if (exercise.equipment) {\n      const allEquipment = settings ? Equipment.currentEquipment(settings) : {};\n      const equipment = equipmentName(exercise.equipment, allEquipment);\n      return `${exercise.name}, ${equipment}`;\n    } else {\n      return exercise.name;\n    }\n  }\n\n  // The equipment of the variation that `type` means for a custom exercise: the equipment of `type`, or the default.\n  function variationEquipment(exercise: ICustomExercise, type?: { equipment?: IEquipment }): IEquipment | undefined {\n    return type?.equipment ?? CustomExerciseVariation.defaultVariation(exercise).equipment;\n  }\n\n  // The text of a variation in program text: the bare name for None, \"Name, Equipment\" for every other variation.\n  // Without `type` it is the text of the default variation.\n  export function customFullName(\n    exercise: ICustomExercise,\n    equipment?: IAllEquipment,\n    type?: { equipment?: IEquipment }\n  ): string {\n    const variationEq = variationEquipment(exercise, type);\n    return variationEq ? `${exercise.name}, ${equipmentName(variationEq, equipment)}` : exercise.name;\n  }\n\n  // The label of a variation in lists: \"Mace Swing\", or \"Mace Swing (Mace)\" for a variation with equipment.\n  export function customLabel(\n    exercise: ICustomExercise,\n    equipment?: IAllEquipment,\n    type?: { equipment?: IEquipment }\n  ): string {\n    const variationEq = variationEquipment(exercise, type);\n    return variationEq ? `${exercise.name} (${equipmentName(variationEq, equipment)})` : exercise.name;\n  }\n\n  // The name of an exercise type with its variation, for a custom exercise. A built-in exercise gives the name.\n  export function printedName(name: string, type: IExerciseType | undefined, settings: ISettings): string {\n    const exercise = type != null ? settings.exercises[type.id] : undefined;\n    return type != null && exercise != null ? variationLabel(name, type.equipment, exercise, settings) : name;\n  }\n\n  // The label text of `name` with `equipment`, with the print rule. For a custom exercise: the bare name for None,\n  // \"Name, Equipment\" for every other variation. For a built-in exercise: the suffix shows when the equipment is\n  // not the default one.\n  export function variationLabel(\n    name: string,\n    equipment: IEquipment | undefined,\n    exercise: { id: string; defaultEquipment?: IEquipment } | undefined,\n    settings: ISettings\n  ): string {\n    const allEquipment = Equipment.currentEquipment(settings);\n    const custom = exercise != null ? settings.exercises[exercise.id] : undefined;\n    const variationEq = custom != null ? variationEquipment(custom, { equipment }) : equipment;\n    const show =\n      custom != null ? variationEq != null : variationEq != null && variationEq !== exercise?.defaultEquipment;\n    return show ? `${name}, ${equipmentName(variationEq, allEquipment)}` : name;\n  }\n\n  function normalizeText(str: string): string {\n    return str\n      .trim()\n      .toLowerCase()\n      .replace(/\\s*,\\s*/g, \",\");\n  }\n\n  export function isSameName(a: string, b: string): boolean {\n    return normalizeText(a) === normalizeText(b);\n  }\n\n  // The other custom exercise (not deleted) with the same name. New equipment for that name is a variation of that\n  // exercise, not a second exercise.\n  export function findSameName(\n    exercise: ICustomExercise,\n    customExercises: IAllCustomExercises\n  ): ICustomExercise | undefined {\n    return ObjectUtils.values(customExercises).find(\n      (ce): ce is ICustomExercise =>\n        ce != null && !ce.isDeleted && ce.id !== exercise.id && isSameName(ce.name, exercise.name)\n    );\n  }\n\n  export function sameNameError(name: string): string {\n    return `An exercise named \"${name.trim()}\" already exists. Add the equipment as a variation of that exercise.`;\n  }\n\n  // The texts that a custom exercise answers to: the text of each variation.\n  function variationTexts(exercise: ICustomExercise, equipment?: IAllEquipment): string[] {\n    return CustomExerciseVariation.list(exercise).map((v) => normalizeText(customFullName(exercise, equipment, v)));\n  }\n\n  // The other exercise that has a text of this custom exercise. The texts are the text of each variation. A built-in\n  // exercise counts as a duplicate when its name is the same as a text. A literal name with a comma of another\n  // custom exercise counts too (\"Mace Swing, Racket\").\n  export function findDuplicate(\n    exercise: ICustomExercise,\n    customExercises: IAllCustomExercises,\n    equipment?: IAllEquipment\n  ): string | undefined {\n    const targets = variationTexts(exercise, equipment);\n    const custom = ObjectUtils.values(customExercises).find((ce) => {\n      if (ce == null || ce.isDeleted || ce.id === exercise.id) {\n        return false;\n      }\n      const texts = variationTexts(ce, equipment);\n      if (ce.name.includes(\",\")) {\n        texts.push(normalizeText(ce.name));\n      }\n      return targets.some((t) => texts.includes(t));\n    });\n    if (custom) {\n      return custom.id;\n    }\n    return targets.map((t) => nameToIdMapping[t]).find((id) => id != null);\n  }\n\n  export function searchNames(\n    query: string,\n    customExercises: IAllCustomExercises,\n    equipment?: IAllEquipment\n  ): string[] {\n    const allExercises = allExpanded({});\n    const exerciseNames = allExercises\n      .filter((e) =>\n        StringUtils.fuzzySearch(\n          query.toLowerCase(),\n          `${e.name}${e.equipment ? `, ${equipmentName(e.equipment)}` : \"\"}`.toLowerCase()\n        )\n      )\n      .map((e) => `${e.name}${e.equipment ? `, ${equipmentName(e.equipment)}` : \"\"}`);\n    const customExerciseNames = ObjectUtils.values(customExercises)\n      .filter((ce): ce is ICustomExercise => ce != null)\n      .flatMap((ce) => CustomExerciseVariation.list(ce).map((v) => customFullName(ce, equipment, v)))\n      .filter((text) => StringUtils.fuzzySearch(query.toLowerCase(), text.toLowerCase()));\n    const names = [...exerciseNames, ...customExerciseNames];\n    names.sort();\n    return names;\n  }\n\n  export function findById(\n    id: IExerciseId,\n    customExercises: IAllCustomExercises,\n    equipment?: string\n  ): IExercise | undefined {\n    return maybeGetExercise(id, customExercises, equipment != null ? { id, equipment } : undefined);\n  }\n\n  // The custom exercise that a program text names, and the equipment of the variation it means. A live exercise wins\n  // over a deleted one. Then the bare name wins over \"Name, Equipment\" (an old literal name stays the same). Among bare\n  // names, an exercise with a None variation wins, then the first one.\n  function findCustomMatch(\n    name: string,\n    customExercises: IAllCustomExercises,\n    equipment?: IAllEquipment\n  ): { exercise: ICustomExercise; equipment: IEquipment | undefined } | undefined {\n    const target = normalizeText(name);\n    const customs = ObjectUtils.values(customExercises).filter((ce): ce is ICustomExercise => ce != null);\n    for (const isDeleted of [false, true]) {\n      const tier = customs.filter((ce) => !!ce.isDeleted === isDeleted);\n      const bare = tier.filter((ce) => normalizeText(ce.name || \"\") === target);\n      const preferred = bare.find((ce) => CustomExerciseVariation.defaultVariation(ce).equipment == null) || bare[0];\n      if (preferred) {\n        return { exercise: preferred, equipment: CustomExerciseVariation.defaultVariation(preferred).equipment };\n      }\n      for (const ce of tier) {\n        const variation = CustomExerciseVariation.list(ce).find(\n          (v) => v.equipment != null && normalizeText(customFullName(ce, equipment, v)) === target\n        );\n        if (variation) {\n          return { exercise: ce, equipment: variation.equipment };\n        }\n      }\n    }\n    return undefined;\n  }\n\n  export function findIdByName(\n    name: string,\n    customExercises: IAllCustomExercises,\n    equipment?: IAllEquipment\n  ): IExerciseId | undefined {\n    const builtIn = nameToIdMapping[name.toLowerCase()];\n    if (builtIn) {\n      return builtIn;\n    }\n    return findCustomMatch(name, customExercises, equipment)?.exercise.id;\n  }\n\n  // The type with the equipment of the default variation when a custom exercise has no equipment in `type`.\n  export function resolveType(type: IExerciseType, customExercises: IAllCustomExercises): IExerciseType {\n    const custom = customExercises[type.id];\n    return custom != null ? CustomExerciseVariation.resolve(custom, type) : type;\n  }\n\n  export function get(type: IExerciseType, customExercises: IAllCustomExercises): IExercise {\n    const exercise = getExercise(type.id, customExercises, type);\n    return { ...exercise, equipment: resolveType(type, customExercises).equipment };\n  }\n\n  export function onerm(type: IExerciseType, settings: ISettings): IWeight {\n    const rm = settings.exerciseData[Exercise.toKey(type)]?.rm1;\n    if (rm) {\n      return Weight.convertTo(rm, settings.units);\n    }\n    const exercise = Exercise.get(type, settings.exercises);\n    return settings.units === \"kg\" ? exercise.startingWeightKg : exercise.startingWeightLb;\n  }\n\n  export function defaultRounding(type: IExerciseType, settings: ISettings): number {\n    const units = Equipment.getUnitOrDefaultForExerciseType(settings, type);\n    return Math.max(0.1, settings.exerciseData[Exercise.toKey(type)]?.rounding ?? (units === \"kg\" ? 2.5 : 5));\n  }\n\n  export function find(type: IExerciseType, customExercises: IAllCustomExercises): IExercise | undefined {\n    const exercise = maybeGetExercise(type.id, customExercises, type);\n    return exercise ? { ...exercise, equipment: resolveType(type, customExercises).equipment } : undefined;\n  }\n\n  // The equipment in the key of the exercise when no equipment is given: the equipment of the default variation for a\n  // custom exercise, the default equipment for a built-in one.\n  export function identityEquipment(exercise: IExercise, customExercises: IAllCustomExercises): IEquipment | undefined {\n    const custom = customExercises[exercise.id];\n    return custom != null ? CustomExerciseVariation.defaultVariation(custom).equipment : exercise.defaultEquipment;\n  }\n\n  export function getById(id: IExerciseId, customExercises: IAllCustomExercises): IExercise {\n    const exercise = getExercise(id, customExercises);\n    return { ...exercise, equipment: identityEquipment(exercise, customExercises) };\n  }\n\n  export function findByNameEquipment(\n    customExercises: IAllCustomExercises,\n    name: string,\n    equipment?: string,\n    allEquipment?: IAllEquipment\n  ): IExercise | undefined {\n    const builtInId = nameToIdMapping[name.toLowerCase()];\n    if (builtInId) {\n      const builtIn = findById(builtInId, customExercises);\n      return builtIn ? { ...builtIn, equipment } : undefined;\n    }\n    const match = findCustomMatch(name, customExercises, allEquipment);\n    if (match == null) {\n      return undefined;\n    }\n    const resolved = equipment ?? match.equipment;\n    const exercise = findById(match.exercise.id, customExercises, resolved);\n    return exercise ? { ...exercise, equipment: resolved } : undefined;\n  }\n\n  export function findByNameAndEquipment(\n    nameAndEquipment: string,\n    customExercises: IAllCustomExercises,\n    allEquipment?: IAllEquipment\n  ): IExercise | undefined {\n    const parts = nameAndEquipment.split(\",\").map((p) => p.trim());\n    let name: string | undefined;\n    let equipment: IEquipment | undefined | null;\n    if (parts.length > 1) {\n      const foundEquipment = equipments.filter(\n        (e) => equipmentName(e).toLowerCase() === parts[parts.length - 1].toLowerCase()\n      )[0];\n      if (foundEquipment != null) {\n        equipment = foundEquipment;\n        name = parts.slice(0, parts.length - 1).join(\", \");\n      } else {\n        equipment = null;\n      }\n    }\n    if (name == null) {\n      name = nameAndEquipment;\n    }\n    const exerciseId = findIdByName(name, {});\n    if (exerciseId != null && equipment !== null) {\n      const exercise = findById(exerciseId, {});\n      if (exercise != null) {\n        return { ...exercise, equipment: equipment || exercise.defaultEquipment };\n      }\n    } else {\n      const builtInId = nameToIdMapping[nameAndEquipment.toLowerCase()];\n      const match = builtInId ? undefined : findCustomMatch(nameAndEquipment, customExercises, allEquipment);\n      const id = builtInId || match?.exercise.id;\n      if (id != null) {\n        const exercise = findById(id, customExercises, match?.equipment);\n        if (exercise != null) {\n          return match != null ? { ...exercise, equipment: match.equipment } : { ...exercise };\n        }\n      }\n    }\n    return undefined;\n  }\n\n  export function getIsUnilateral(exerciseType: IExerciseType, settings: ISettings): boolean {\n    const key = Exercise.toKey(exerciseType);\n    const exerciseData = settings.exerciseData[key];\n    if (exerciseData?.isUnilateral !== undefined) {\n      return exerciseData.isUnilateral;\n    }\n\n    switch (exerciseType.id) {\n      case \"bulgarianSplitSquat\":\n      case \"concentrationCurl\":\n      case \"reverseGripConcentrationCurl\":\n      case \"bentOverOneArmRow\":\n      case \"cableKickback\":\n      case \"cableTwist\":\n      case \"russianTwist\":\n      case \"lunge\":\n      case \"reverseLunge\":\n      case \"splitSquat\":\n      case \"stepUp\":\n      case \"pistolSquat\":\n      case \"singleLegBridge\":\n      case \"singleLegDeadlift\":\n      case \"sideBend\":\n      case \"sideCrunch\":\n      case \"sideHipAbductor\":\n      case \"sideLyingClam\":\n      case \"sidePlank\":\n      case \"singleLegBridge\":\n      case \"singleLegCalfRaise\":\n      case \"singleLegDeadlift\":\n      case \"singleLegGluteBridgeBench\":\n      case \"singleLegGluteBridgeStraight\":\n      case \"singleLegGluteBridgeBentKnee\":\n      case \"singleLegHipThrust\":\n        return true;\n      case \"bicepCurl\":\n      case \"wristCurl\":\n      case \"reverseWristCurl\":\n      case \"seatedPalmsUpWristCurl\":\n      case \"hammerCurl\":\n      case \"preacherCurl\":\n      case \"reverseCurl\":\n      case \"lyingBicepCurl\":\n      case \"inclineCurl\":\n        return exerciseType.equipment === \"dumbbell\";\n      default:\n        return false;\n    }\n  }\n\n  export function findByName(\n    name: string,\n    customExercises: IAllCustomExercises,\n    allEquipment?: IAllEquipment\n  ): IExercise | undefined {\n    const trimmed = name.trim();\n    const builtInId = nameToIdMapping[trimmed.toLowerCase()];\n    const match = builtInId ? undefined : findCustomMatch(trimmed, customExercises, allEquipment);\n    const exerciseId = builtInId || match?.exercise.id;\n    if (exerciseId != null) {\n      const exercise = findById(exerciseId, customExercises, match?.equipment);\n      if (exercise != null) {\n        return {\n          ...exercise,\n          equipment: match != null ? match.equipment : identityEquipment(exercise, customExercises),\n        };\n      }\n    }\n    return undefined;\n  }\n\n  export function getByIds(ids: IExerciseId[], customExercises: IAllCustomExercises): IExercise[] {\n    return ids.map((id) => {\n      const exercise = getExercise(id, customExercises);\n      return { ...exercise, equipment: identityEquipment(exercise, customExercises) };\n    });\n  }\n\n  // One item for each variation of each custom exercise.\n  function customVariations(customExercises: IAllCustomExercises): IExercise[] {\n    return ObjectUtils.keys(customExercises).flatMap((id) => {\n      const exercise = getExercise(id, customExercises);\n      return CustomExerciseVariation.list(customExercises[id]!).map((v) => ({ ...exercise, equipment: v.equipment }));\n    });\n  }\n\n  export function all(customExercises: IAllCustomExercises): IExercise[] {\n    return customVariations(customExercises).concat(\n      ObjectUtils.keys(allExercisesList).map((k) => ({\n        ...allExercisesList[k],\n        equipment: allExercisesList[k].defaultEquipment,\n      }))\n    );\n  }\n\n  export function allExpanded(customExercises: IAllCustomExercises): IExercise[] {\n    return customVariations(customExercises).concat(\n      ObjectUtils.keys(allExercisesList).flatMap((k) => {\n        return CollectionUtils.compact(\n          equipments.map((equipment) => {\n            const exerciseType = { id: k, equipment };\n            return ExerciseImageUtils.exists(exerciseType, \"small\") ? { ...allExercisesList[k], equipment } : undefined;\n          })\n        );\n      })\n    );\n  }\n\n  export function eq(a: IExerciseType, b: IExerciseType): boolean {\n    return a.id === b.id && a.equipment === b.equipment;\n  }\n\n  export function filterExercisesByNameAndType(\n    settings: ISettings,\n    filter: string,\n    filterTypes: string[],\n    isSubstitute: boolean,\n    exerciseType?: IExerciseType,\n    length?: number\n  ): IExercise[] {\n    let allExercises = Exercise.allExpanded({});\n    if (filter) {\n      allExercises = Exercise.filterExercises(allExercises, filter);\n    }\n    if (filterTypes && filterTypes.length > 0) {\n      allExercises = Exercise.filterExercisesByType(allExercises, filterTypes, settings);\n    }\n    allExercises = Exercise.sortExercises(allExercises, isSubstitute, settings, filterTypes, exerciseType);\n    if (length != null) {\n      allExercises = allExercises.slice(0, length);\n    }\n    return allExercises;\n  }\n\n  export function getWarmupSets(\n    exercise: IExerciseType,\n    weight: IWeight | undefined,\n    settings: ISettings,\n    programExerciseWarmupSets?: IProgramExerciseWarmupSet[]\n  ): ISet[] {\n    const ex = get(exercise, settings.exercises);\n    if (programExerciseWarmupSets != null) {\n      return warmup(programExerciseWarmupSets, true)(weight, settings, exercise);\n    } else {\n      let warmupSets = warmupEmpty(weight);\n      if (ex.defaultWarmup === 10) {\n        warmupSets = warmup10(weight, settings, exercise);\n      } else if (ex.defaultWarmup === 45) {\n        warmupSets = warmup45(weight, settings, exercise);\n      } else if (ex.defaultWarmup === 95) {\n        warmupSets = warmup95(weight, settings, exercise);\n      }\n      return warmupSets;\n    }\n  }\n\n  export function defaultTargetMuscles(type: IExerciseType, settings: ISettings): IMuscle[] {\n    const customExercise = settings.exercises[type.id];\n    if (customExercise) {\n      return variationMeta(customExercise, type).targetMuscles;\n    } else {\n      const meta = getMetadata(type.id);\n      return meta?.targetMuscles != null ? meta.targetMuscles : [];\n    }\n  }\n\n  export function targetMuscles(type: IExerciseType, settings: ISettings): IMuscle[] {\n    const muscleMultipliers = settings.exerciseData[Exercise.toKey(type)]?.muscleMultipliers;\n    if (muscleMultipliers) {\n      const muscles = muscleMultipliers.filter((m) => m.multiplier === 1);\n      return muscles.map((m) => m.muscle);\n    } else {\n      return defaultTargetMuscles(type, settings);\n    }\n  }\n\n  export function defaultTargetMusclesGroups(type: IExerciseType, settings: ISettings): IScreenMuscle[] {\n    const muscles = defaultTargetMuscles(type, settings);\n    const allMuscleGroups = new Set<IScreenMuscle>();\n    for (const muscle of muscles) {\n      const muscleGroups = Muscle.getScreenMusclesFromMuscle(muscle, settings);\n      for (const muscleGroup of muscleGroups) {\n        allMuscleGroups.add(muscleGroup);\n      }\n    }\n    return Array.from(allMuscleGroups);\n  }\n\n  export function targetMusclesGroups(type: IExerciseType, settings: ISettings): IScreenMuscle[] {\n    const muscles = targetMuscles(type, settings);\n    const allMuscleGroups = new Set<IScreenMuscle>();\n    for (const muscle of muscles) {\n      const muscleGroups = Muscle.getScreenMusclesFromMuscle(muscle, settings);\n      for (const muscleGroup of muscleGroups) {\n        allMuscleGroups.add(muscleGroup);\n      }\n    }\n    return Array.from(allMuscleGroups);\n  }\n\n  export function defaultSynergistMuscleMultipliers(type: IExerciseType, settings: ISettings): IMuscleMultiplier[] {\n    const customExercise = settings.exercises[type.id];\n    if (customExercise) {\n      return variationMeta(customExercise, type).synergistMuscles.map((m) => ({\n        muscle: m,\n        multiplier: settings.planner.synergistMultiplier,\n      }));\n    } else {\n      const meta = getMetadata(type.id);\n      return meta?.synergistMuscles != null\n        ? meta.synergistMuscles.map((m) => {\n            return { muscle: m, multiplier: settings.planner.synergistMultiplier };\n          })\n        : [];\n    }\n  }\n\n  export function defaultSynergistMuscles(type: IExerciseType, settings: ISettings): IMuscle[] {\n    return defaultSynergistMuscleMultipliers(type, settings).map((m) => m.muscle);\n  }\n\n  export function synergistMuscleMultipliers(type: IExerciseType, settings: ISettings): IMuscleMultiplier[] {\n    const muscleMultipliers = settings.exerciseData[Exercise.toKey(type)]?.muscleMultipliers;\n    if (muscleMultipliers) {\n      const muscles = muscleMultipliers.filter((m) => m.multiplier < 1);\n      return muscles;\n    } else {\n      return defaultSynergistMuscleMultipliers(type, settings);\n    }\n  }\n\n  export function synergistMuscles(type: IExerciseType, settings: ISettings): IMuscle[] {\n    const muscleMultipliers = settings.exerciseData[Exercise.toKey(type)]?.muscleMultipliers;\n    if (muscleMultipliers) {\n      const muscles = muscleMultipliers.filter((m) => m.multiplier < 1);\n      return muscles.map((m) => m.muscle);\n    } else {\n      return defaultSynergistMuscles(type, settings);\n    }\n  }\n\n  export function defaultSynergistMusclesGroups(type: IExerciseType, settings: ISettings): IScreenMuscle[] {\n    const muscles = defaultSynergistMuscles(type, settings);\n    const allMuscleGroups = new Set<IScreenMuscle>();\n    for (const muscle of muscles) {\n      const muscleGroups = Muscle.getScreenMusclesFromMuscle(muscle, settings);\n      for (const muscleGroup of muscleGroups) {\n        allMuscleGroups.add(muscleGroup);\n      }\n    }\n    return Array.from(allMuscleGroups);\n  }\n\n  export function synergistMusclesGroupMultipliers(\n    type: IExerciseType,\n    settings: ISettings\n  ): Partial<Record<IScreenMuscle, number>> {\n    return synergistMuscleMultipliers(type, settings).reduce<Partial<Record<IScreenMuscle, number>>>((memo, m) => {\n      for (const muscleGroup of Muscle.getScreenMusclesFromMuscle(m.muscle, settings)) {\n        if (memo[muscleGroup] == null || memo[muscleGroup] < m.multiplier) {\n          memo[muscleGroup] = m.multiplier;\n        }\n      }\n      return memo;\n    }, {});\n  }\n\n  export function synergistMusclesGroups(type: IExerciseType, settings: ISettings): IScreenMuscle[] {\n    const muscles = synergistMuscles(type, settings);\n    const allMuscleGroups = new Set<IScreenMuscle>();\n    for (const muscle of muscles) {\n      const muscleGroups = Muscle.getScreenMusclesFromMuscle(muscle, settings);\n      for (const muscleGroup of muscleGroups) {\n        allMuscleGroups.add(muscleGroup);\n      }\n    }\n    return Array.from(allMuscleGroups);\n  }\n\n  export function toKey(type: IExerciseType): string {\n    return `${type.id}${type.equipment ? `_${type.equipment}` : \"\"}`;\n  }\n\n  export function fromKey(type: string): IExerciseType {\n    const [id, equipment] = type.split(\"_\");\n    return { id: id as IExerciseId, equipment: equipment };\n  }\n\n  export function defaultEquipment(type: IExerciseId, customExercises: IAllCustomExercises): IEquipment | undefined {\n    const priorities: Record<IEquipment, IEquipment[]> = {\n      barbell: [\"ezbar\", \"trapbar\", \"dumbbell\", \"kettlebell\"],\n      cable: [\"band\", \"leverageMachine\"],\n      dumbbell: [\"barbell\", \"kettlebell\", \"bodyweight\"],\n      smith: [\"leverageMachine\", \"dumbbell\", \"barbell\", \"kettlebell\", \"cable\"],\n      band: [\"cable\", \"bodyweight\", \"leverageMachine\", \"smith\"],\n      kettlebell: [\"dumbbell\", \"barbell\", \"cable\"],\n      bodyweight: [\"cable\", \"dumbbell\", \"barbell\", \"band\"],\n      leverageMachine: [\"smith\", \"cable\", \"dumbbell\", \"barbell\", \"kettlebell\"],\n      medicineball: [\"bodyweight\", \"cable\"],\n      ezbar: [\"barbell\", \"dumbbell\", \"cable\"],\n      trapbar: [\"barbell\", \"dumbbell\", \"cable\"],\n    };\n\n    const exercise = getById(type, customExercises);\n    const bar = exercise.defaultEquipment || \"bodyweight\";\n    const sortedEquipment = getMetadata(type).sortedEquipment || [];\n    let equipment: IEquipment | undefined = sortedEquipment.find((b) => b === bar);\n    equipment = equipment || (priorities[bar] || []).find((eqp) => sortedEquipment.indexOf(eqp) !== -1);\n    equipment = equipment || sortedEquipment[0];\n    return equipment;\n  }\n\n  export function similarRating(current: IExerciseType, e: IExercise, settings: ISettings): number {\n    const tm = Exercise.targetMuscles(current, settings);\n    const sm = Exercise.synergistMuscles(current, settings);\n    const etm = Exercise.targetMuscles(e, settings);\n    const esm = Exercise.synergistMuscles(e, settings);\n    let rating = 0;\n    if (e.id === current.id || (etm.length === 0 && esm.length === 0)) {\n      rating = -Infinity;\n    } else {\n      for (const muscle of etm) {\n        if (tm.indexOf(muscle) !== -1) {\n          rating += 60;\n        } else {\n          rating -= 30;\n        }\n        if (sm.indexOf(muscle) !== -1) {\n          rating += 20;\n        }\n      }\n      for (const muscle of tm) {\n        if (etm.indexOf(muscle) === -1) {\n          rating -= 30;\n        }\n      }\n      for (const muscle of esm) {\n        if (sm.indexOf(muscle) !== -1) {\n          rating += 30;\n        } else {\n          rating -= 15;\n        }\n        if (tm.indexOf(muscle) !== -1) {\n          rating += 10;\n        }\n      }\n      for (const muscle of sm) {\n        if (esm.indexOf(muscle) === -1) {\n          rating -= 15;\n        }\n      }\n      if (e.defaultEquipment === \"cable\" || e.defaultEquipment === \"leverageMachine\") {\n        rating -= 20;\n      }\n    }\n    return rating;\n  }\n\n  export function similar(type: IExerciseType, settings: ISettings): [IExercise, number][] {\n    const tm = Exercise.targetMuscles(type, settings);\n    const sm = Exercise.synergistMuscles(type, settings);\n    if (tm.length === 0 && sm.length === 0) {\n      return [];\n    }\n    const rated = Exercise.all(settings.exercises).map<[IExercise, number]>((e) => {\n      const rating = similarRating(type, e, settings);\n      return [e, rating];\n    });\n    rated.sort((a, b) => b[1] - a[1]);\n    return rated.filter(([, r]) => r > 0);\n  }\n\n  export function sortedByScreenMuscle(muscle: IScreenMuscle, settings: ISettings): [IExercise, number][] {\n    const muscles = Muscle.getMusclesFromScreenMuscle(muscle, settings);\n\n    const rated = Exercise.all(settings.exercises).map<[IExercise, number]>((e) => {\n      let rating = 0;\n      const tm = Exercise.targetMuscles(e, settings);\n      const sm = Exercise.synergistMuscles(e, settings);\n      for (const m of tm) {\n        if (muscles.indexOf(m) !== -1) {\n          rating += 100;\n        }\n      }\n      for (const m of sm) {\n        if (muscles.indexOf(m) !== -1) {\n          rating += 10;\n        }\n      }\n      return [e, rating];\n    });\n    rated.sort((a, b) => b[1] - a[1]);\n    return rated.filter(([, r]) => r > 0);\n  }\n\n  export function createCustomExercise(\n    name: string,\n    tMuscles: IMuscle[],\n    sMuscles: IMuscle[],\n    types: IExerciseKind[],\n    smallImageUrl?: string,\n    largeImageUrl?: string,\n    equipment?: string\n  ): ICustomExercise {\n    const id = UidFactory.generateUid(8);\n    const variation: ICustomExerciseVariation = {};\n    if (equipment != null) {\n      variation.equipment = equipment;\n    }\n    if (smallImageUrl != null) {\n      variation.smallImageUrl = smallImageUrl;\n    }\n    if (largeImageUrl != null) {\n      variation.largeImageUrl = largeImageUrl;\n    }\n    if (types.length > 0) {\n      variation.types = types;\n    }\n    const newExercise: ICustomExercise = {\n      vtype: \"custom_exercise\",\n      id,\n      name,\n      isDeleted: false,\n      meta: {\n        targetMuscles: tMuscles,\n        synergistMuscles: sMuscles,\n        bodyParts: [],\n        sortedEquipment: [],\n      },\n      variations: [variation],\n    };\n    if (equipment != null) {\n      newExercise.defaultEquipment = equipment;\n    }\n    return newExercise;\n  }\n\n  export function deleteCustomExercise(\n    allExercises: IAllCustomExercises,\n    exerciseId: IExerciseId\n  ): IAllCustomExercises {\n    const existingExercise = allExercises[exerciseId];\n    if (existingExercise) {\n      return { ...allExercises, [exerciseId]: { ...existingExercise, isDeleted: true } };\n    }\n    return allExercises;\n  }\n\n  export function upsertCustomExercise(\n    allExercises: IAllCustomExercises,\n    exercise: ICustomExercise\n  ): IAllCustomExercises {\n    exercise = { ...exercise, name: exercise.name.trim() };\n    const existingExercise = allExercises[exercise.id];\n    if (existingExercise) {\n      const base = exercise.variations ? {} : existingExercise;\n      return { ...allExercises, [exercise.id]: { ...base, ...exercise, isDeleted: false } };\n    } else {\n      const sameNameDeletedExercise = ObjectUtils.values(allExercises).find(\n        (e) => e?.name === exercise.name && e.isDeleted\n      );\n      if (sameNameDeletedExercise) {\n        return {\n          ...allExercises,\n          [sameNameDeletedExercise.id]: {\n            ...(exercise.variations ? {} : sameNameDeletedExercise),\n            ...exercise,\n            id: sameNameDeletedExercise.id,\n            isDeleted: false,\n          },\n        };\n      } else {\n        return { ...allExercises, [exercise.id]: exercise };\n      }\n    }\n  }\n\n  export function handleCustomExerciseChange(\n    dispatch: IDispatch,\n    action: \"upsert\" | \"delete\",\n    exercise: ICustomExercise,\n    settings: ISettings,\n    program?: IProgram\n  ): void {\n    const oldExercise = settings.exercises[exercise.id];\n    const ex =\n      action === \"upsert\"\n        ? Exercise.upsertCustomExercise(settings.exercises, exercise)\n        : Exercise.deleteCustomExercise(settings.exercises, exercise.id);\n    updateSettings(dispatch, lb<ISettings>().p(\"exercises\").record(ex), \"Create custom exercise\");\n    if (program && oldExercise && oldExercise.name !== exercise.name) {\n      const newProgram = Program.changeExerciseName(oldExercise.name, exercise.name, program, {\n        ...settings,\n        exercises: ex,\n      });\n      EditProgram.updateProgram(dispatch, newProgram);\n    }\n  }\n\n  export function saveCustomExercise(\n    allExercises: IAllCustomExercises,\n    updated: ICustomExercise,\n    program: IProgram,\n    settings: ISettings\n  ): { exercises: IAllCustomExercises; newProgram?: IProgram } {\n    // A new exercise gets its id from its name. One that revives a deleted row of the same name keeps that row's id.\n    const trimmed = updated.name.trim();\n    const isRevive = ObjectUtils.values(allExercises).some((e) => e?.name === trimmed && e.isDeleted);\n    if (!isRevive) {\n      updated = ExerciseId.forNew(updated, allExercises);\n    }\n    const oldExercise = allExercises[updated.id];\n    const exercises = Exercise.upsertCustomExercise(allExercises, updated);\n    const trimmedName = updated.name.trim();\n    if (oldExercise && oldExercise.name !== trimmedName) {\n      const newProgram = Program.changeExerciseName(oldExercise.name, trimmedName, program, {\n        ...settings,\n        exercises,\n      });\n      return { exercises, newProgram };\n    }\n    return { exercises };\n  }\n\n  export function filterExercises<T extends { name: string }>(allExercises: T[], filter: string): T[] {\n    return allExercises.filter((e) => StringUtils.fuzzySearch(filter.toLowerCase(), e.name.toLowerCase()));\n  }\n\n  export function sortExercises(\n    allExercises: IExercise[],\n    isSubstitute: boolean,\n    settings: ISettings,\n    filterTypes?: string[],\n    currentExerciseType?: IExerciseType\n  ): IExercise[] {\n    return CollectionUtils.sort(allExercises, (a, b) => {\n      const exerciseType = currentExerciseType;\n      if (isSubstitute && exerciseType) {\n        const aRating = Exercise.similarRating(exerciseType, a, settings);\n        const bRating = Exercise.similarRating(exerciseType, b, settings);\n        return bRating - aRating;\n      } else if (\n        filterTypes &&\n        Muscle.getAvailableMuscleGroups(settings)\n          .map((m) => m.toLowerCase())\n          .some((t) => filterTypes.map((ft) => ft.toLowerCase()).indexOf(t) !== -1)\n      ) {\n        const lowercaseFilterTypes = filterTypes.map((t) => t.toLowerCase());\n        const aTargetMuscleGroups = Exercise.targetMusclesGroups(a, settings);\n        const bTargetMuscleGroups = Exercise.targetMusclesGroups(b, settings);\n        if (\n          aTargetMuscleGroups.some((m) => lowercaseFilterTypes.indexOf(m) !== -1) &&\n          bTargetMuscleGroups.every((m) => lowercaseFilterTypes.indexOf(m) === -1)\n        ) {\n          return -1;\n        } else if (\n          bTargetMuscleGroups.some((m) => lowercaseFilterTypes.indexOf(m) !== -1) &&\n          aTargetMuscleGroups.every((m) => lowercaseFilterTypes.indexOf(m) === -1)\n        ) {\n          return 1;\n        } else {\n          return a.name.localeCompare(b.name);\n        }\n      } else {\n        return a.name.localeCompare(b.name);\n      }\n    });\n  }\n\n  export function filterExercisesByType<T extends IExerciseType>(\n    allExercises: T[],\n    filterTypes: string[],\n    settings: ISettings\n  ): T[] {\n    return allExercises.filter((e) => {\n      const exercise = get(e, settings.exercises);\n      const targetMuscleGroups = Exercise.targetMusclesGroups(e, settings).map((m) => m.toLowerCase());\n      const synergistMuscleGroups = Exercise.synergistMusclesGroups(e, settings).map((m) => m.toLowerCase());\n      return filterTypes\n        .map((ft) => ft.toLowerCase())\n        .every((ft) => {\n          return (\n            targetMuscleGroups.indexOf(ft) !== -1 ||\n            synergistMuscleGroups.indexOf(ft) !== -1 ||\n            exercise.types.map((t) => t.toLowerCase()).indexOf(ft) !== -1 ||\n            equipmentName(e.equipment).toLowerCase() === ft\n          );\n        });\n    });\n  }\n\n  export function filterCustomExercises(customExercises: IAllCustomExercises, filter: string): IAllCustomExercises {\n    return ObjectUtils.filter(customExercises, (e, v) =>\n      v ? StringUtils.fuzzySearch(filter.toLowerCase(), v.name.toLowerCase()) : true\n    );\n  }\n\n  export function filterCustomExercisesByType(filterTypes: string[], settings: ISettings): IAllCustomExercises {\n    return ObjectUtils.filter(settings.exercises, (_id, exercise) => {\n      if (!exercise) {\n        return false;\n      }\n      const variation = CustomExerciseVariation.defaultVariation(exercise);\n      const meta = variation.meta ?? exercise.meta;\n      const targetMuscleGroups = Array.from(\n        new Set(CollectionUtils.flat(meta.targetMuscles.map((m) => Muscle.getScreenMusclesFromMuscle(m, settings))))\n      ).map((m) => StringUtils.capitalize(m));\n      const synergistMuscleGroups = Array.from(\n        new Set(CollectionUtils.flat(meta.synergistMuscles.map((m) => Muscle.getScreenMusclesFromMuscle(m, settings))))\n      ).map((m) => StringUtils.capitalize(m));\n      return filterTypes.every((ft) => {\n        return (\n          targetMuscleGroups.indexOf(ft) !== -1 ||\n          synergistMuscleGroups.indexOf(ft) !== -1 ||\n          (variation.types || []).map(StringUtils.capitalize).indexOf(ft) !== -1\n        );\n      });\n    });\n  }\n}\n","import { IPlannerProgramExercise } from \"@client/pages/planner/models/types\";\nimport { IPlannerEvalResult } from \"@client/pages/planner/plannerExerciseEvaluator\";\nimport { IEvaluatedProgramWeek } from \"./program\";\nexport class PP {\n  public static iterate2(\n    evaluatedWeeks: IEvaluatedProgramWeek[],\n    cb: (\n      exercise: IPlannerProgramExercise,\n      weekIndex: number,\n      dayInWeekIndex: number,\n      dayIndex: number,\n      exerciseIndex: number\n    ) => boolean | void\n  ): void {\n    let dayIndex = 0;\n    for (let weekIndex = 0; weekIndex < evaluatedWeeks.length; weekIndex++) {\n      const week = evaluatedWeeks[weekIndex];\n      for (let dayInWeekIndex = 0; dayInWeekIndex < week.days.length; dayInWeekIndex++) {\n        const day = week.days[dayInWeekIndex];\n        for (let exerciseIndex = 0; exerciseIndex < day.exercises.length; exerciseIndex++) {\n          const exercise = day.exercises[exerciseIndex];\n          const shouldReturn = cb(exercise, weekIndex, dayInWeekIndex, dayIndex, exerciseIndex);\n          if (!!shouldReturn) {\n            return;\n          }\n        }\n        dayIndex += 1;\n      }\n    }\n  }\n\n  public static iterate(\n    evaluatedWeeks: IPlannerEvalResult[][],\n    cb: (\n      exercise: IPlannerProgramExercise,\n      weekIndex: number,\n      dayInWeekIndex: number,\n      dayIndex: number,\n      exerciseIndex: number\n    ) => boolean | void\n  ): void {\n    let dayIndex = 0;\n    for (let weekIndex = 0; weekIndex < evaluatedWeeks.length; weekIndex++) {\n      const week = evaluatedWeeks[weekIndex];\n      for (let dayInWeekIndex = 0; dayInWeekIndex < week.length; dayInWeekIndex++) {\n        const day = week[dayInWeekIndex];\n        if (day.success) {\n          for (let exerciseIndex = 0; exerciseIndex < day.data.length; exerciseIndex++) {\n            const exercise = day.data[exerciseIndex];\n            const shouldReturn = cb(exercise, weekIndex, dayInWeekIndex, dayIndex, exerciseIndex);\n            if (!!shouldReturn) {\n              return;\n            }\n          }\n        }\n        dayIndex += 1;\n      }\n    }\n  }\n}\n","import { getLatestMigrationVersion, migrations } from \"./migrations\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { IPartialStorage, IStorage } from \"../types\";\nimport { Storage } from \"../models/storage\";\nimport { ErrorReporter } from \"../utils/errorReporter\";\n\nexport function unrunMigrations(storage: { version: string }, maxVersion?: string): Array<keyof typeof migrations> {\n  const currentVersion = storage.version != null ? parseInt(storage.version.toString(), 10) : 0;\n  const keys = ObjectUtils.keys(migrations);\n  keys.sort((a, b) => parseInt(a, 10) - parseInt(b, 10));\n  const maxVersionInt = maxVersion != null ? parseInt(maxVersion, 10) : undefined;\n  return keys.filter((versionStr) => {\n    const version = parseInt(versionStr, 10);\n    return version > currentVersion && (maxVersionInt != null ? version <= maxVersionInt : true);\n  });\n}\n\nexport async function runMigrations(\n  client: Window[\"fetch\"],\n  storage: IStorage | IPartialStorage,\n  maxVersion?: string\n): Promise<IStorage> {\n  const newVersions = unrunMigrations(storage, maxVersion);\n  let result = Storage.partialStorageToStorage(storage);\n  for (const version of newVersions) {\n    try {\n      result = await migrations[version](client, result);\n    } catch (error) {\n      const e = error as Error;\n      ErrorReporter.report(`Error running migration ${version}: ${e}`, e);\n    }\n  }\n  result = { ...result, version: getLatestMigrationVersion() };\n  return result;\n}\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar __spreadArrays = (this && this.__spreadArrays) || function () {\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n            r[k] = a[j];\n    return r;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Lens = exports.lf = exports.lbu = exports.lb = exports.LensBuilder = exports.LensBuilderWithObject = exports.LensError = void 0;\nvar object_1 = require(\"./utils/object\");\nvar LensError = /** @class */ (function (_super) {\n    __extends(LensError, _super);\n    function LensError(m, lens, type, err, value) {\n        var _this = _super.call(this, m) || this;\n        _this.lens = lens;\n        _this.type = type;\n        _this.err = err;\n        _this.value = value;\n        // Set the prototype explicitly.\n        Object.setPrototypeOf(_this, LensError.prototype);\n        return _this;\n    }\n    return LensError;\n}(Error));\nexports.LensError = LensError;\nvar AbstractLensBuilder = /** @class */ (function () {\n    function AbstractLensBuilder(lens) {\n        this.lens = lens;\n    }\n    AbstractLensBuilder.prototype.get = function () {\n        return this.lens;\n    };\n    return AbstractLensBuilder;\n}());\nvar LensBuilderWithObject = /** @class */ (function (_super) {\n    __extends(LensBuilderWithObject, _super);\n    function LensBuilderWithObject(lens, obj) {\n        var _this = _super.call(this, lens) || this;\n        _this.obj = obj;\n        return _this;\n    }\n    LensBuilderWithObject.start = function (lensFactory, obj) {\n        return {\n            p: function (key) {\n                return new LensBuilderWithObject(lensFactory(key), obj);\n            },\n            pi: function (key) {\n                return new LensBuilderWithObject(lensFactory(key), obj);\n            },\n            i: function (index) {\n                // @ts-ignore\n                return new LensBuilderWithObject(lensFactory(index), obj);\n            },\n            find: function (cb) {\n                // @ts-ignore\n                return new LensBuilderWithObject(lensFactory(cb), obj);\n            },\n            findBy: function (key, value, isReverse) {\n                // @ts-ignore\n                return new LensBuilderWithObject(lensFactory(key, value, isReverse), obj);\n            },\n            get: function () {\n                return new Lens(function (s) { return s; }, function (s, v) { return v; }, { from: \"obj\", to: \"obj\" });\n            },\n            record: function (value, name) {\n                return Lens.buildLensRecording(new Lens(function (s) { return s; }, function (s, v) { return v; }, { from: \"obj\", to: \"obj\" }), value, name);\n            },\n            recordModify: function (fn, name) {\n                return Lens.buildLensModifyRecording(new Lens(function (s) { return s; }, function (s, v) { return v; }, { from: \"obj\", to: \"obj\" }), fn, {}, name);\n            },\n        };\n    };\n    LensBuilderWithObject.prototype.p = function (key) {\n        return new LensBuilderWithObject(this.lens.then(Lens.prop()(key)), this.obj);\n    };\n    LensBuilderWithObject.prototype.pi = function (key) {\n        return new LensBuilderWithObject(this.lens.then(Lens.prop()(key)), this.obj);\n    };\n    LensBuilderWithObject.prototype.i = function (index) {\n        // @ts-ignore\n        return new LensBuilderWithObject(this.lens.then(Lens.index()(index)), this.obj);\n    };\n    LensBuilderWithObject.prototype.find = function (cb) {\n        // @ts-ignore\n        return new LensBuilderWithObject(this.lens.then(Lens.find()(cb)), this.obj);\n    };\n    LensBuilderWithObject.prototype.findBy = function (key, value, isReverse) {\n        // @ts-ignore\n        return new LensBuilderWithObject(this.lens.then(Lens.findBy()(key, value, isReverse)), this.obj);\n    };\n    LensBuilderWithObject.prototype.set = function (value) {\n        return this.lens.set(this.obj, value);\n    };\n    LensBuilderWithObject.prototype.modify = function (fn) {\n        return this.lens.modify(this.obj, fn);\n    };\n    return LensBuilderWithObject;\n}(AbstractLensBuilder));\nexports.LensBuilderWithObject = LensBuilderWithObject;\nvar LensBuilder = /** @class */ (function (_super) {\n    __extends(LensBuilder, _super);\n    function LensBuilder(lens, lensGetters) {\n        var _this = _super.call(this, lens) || this;\n        _this.lensGetters = lensGetters;\n        return _this;\n    }\n    LensBuilder.start = function (lensFactory, lensGetters) {\n        var _this = this;\n        return {\n            p: function (key) {\n                return new LensBuilder(lensFactory(key), lensGetters);\n            },\n            pi: function (key) {\n                return new LensBuilder(lensFactory(key), lensGetters);\n            },\n            i: function (index) {\n                // @ts-ignore\n                return new LensBuilder(lensFactory(index), lensGetters);\n            },\n            find: function (cb) {\n                // @ts-ignore\n                return new LensBuilder(lensFactory(cb), _this.lensGetters);\n            },\n            findBy: function (key, value, isReverse) {\n                // @ts-ignore\n                return new LensBuilder(lensFactory(key, value, isReverse), _this.lensGetters);\n            },\n            get: function () {\n                return new Lens(function (s) { return s; }, function (s, v) { return v; }, { from: \"obj\", to: \"obj\" });\n            },\n            record: function (value, name) {\n                return Lens.buildLensRecording(new Lens(function (s) { return s; }, function (s, v) { return v; }, { from: \"obj\", to: \"obj\" }), value, name);\n            },\n            recordModify: function (fn, name) {\n                return Lens.buildLensModifyRecording(new Lens(function (s) { return s; }, function (s, v) { return v; }, { from: \"obj\", to: \"obj\" }), fn, {}, name);\n            },\n        };\n    };\n    LensBuilder.prototype.p = function (key) {\n        return new LensBuilder(this.lens.then(Lens.prop()(key)), this.lensGetters);\n    };\n    LensBuilder.prototype.i = function (index) {\n        // @ts-ignore\n        return new LensBuilder(this.lens.then(Lens.index()(index)), this.lensGetters);\n    };\n    LensBuilder.prototype.pi = function (key) {\n        return new LensBuilder(this.lens.then(Lens.prop()(key)), this.lensGetters);\n    };\n    LensBuilder.prototype.find = function (cb) {\n        // @ts-ignore\n        return new LensBuilder(this.lens.then(Lens.find()(cb)), this.lensGetters);\n    };\n    LensBuilder.prototype.findBy = function (key, value, isReverse) {\n        // @ts-ignore\n        return new LensBuilder(this.lens.then(Lens.findBy()(key, value, isReverse)), this.lensGetters);\n    };\n    LensBuilder.prototype.set = function (obj, value) {\n        return this.lens.set(obj, value);\n    };\n    LensBuilder.prototype.modify = function (obj, fn) {\n        return this.lens.modify(obj, fn);\n    };\n    LensBuilder.prototype.record = function (value, name) {\n        return Lens.buildLensRecording(this.lens, value, name);\n    };\n    LensBuilder.prototype.recordModify = function (fn, name) {\n        return Lens.buildLensModifyRecording(this.lens, fn, this.lensGetters, name);\n    };\n    return LensBuilder;\n}(AbstractLensBuilder));\nexports.LensBuilder = LensBuilder;\nfunction lb() {\n    return Lens.build({});\n}\nexports.lb = lb;\nfunction lbu(lens) {\n    return Lens.build(lens);\n}\nexports.lbu = lbu;\nfunction lf(obj) {\n    return Lens.from(obj);\n}\nexports.lf = lf;\nvar Lens = /** @class */ (function () {\n    function Lens(getter, setter, args) {\n        var _this = this;\n        this.get = function (obj) {\n            try {\n                return getter(obj);\n            }\n            catch (e) {\n                var nestedErr = e instanceof LensError ? e.err : e;\n                throw new LensError(\"LensError: Error when getting \" + args.from + \" -> \" + args.to + \" (\" + nestedErr.message + \")\", _this, \"get\", nestedErr);\n            }\n        };\n        this.set = function (obj, value) {\n            try {\n                return setter(obj, value);\n            }\n            catch (e) {\n                var nestedErr = e instanceof LensError ? e.err : e;\n                throw new LensError(\"LensError: Error when setting \" + args.from + \" -> \" + args.to + \" - \" + value + \" (\" + nestedErr.message + \")\", _this, \"set\", nestedErr, value);\n            }\n        };\n        this.from = Array.isArray(args.from) ? args.from : [args.from];\n        this.to = args.to;\n    }\n    Lens.buildLensModifyRecording = function (aLens, modifyFn, lensGetters, name) {\n        var _this = this;\n        var lens = aLens instanceof Lens ? aLens : aLens.get();\n        var value = { v: undefined };\n        var fn = function (obj) {\n            var getters = object_1.ObjectUtils.keys(lensGetters).reduce(function (memo, key) {\n                // @ts-ignore\n                memo[key] = lensGetters[key].get(obj);\n                return memo;\n            }, {});\n            return lens.modify(obj, function (v) {\n                var newValue = modifyFn(v, getters);\n                value.v = newValue;\n                return newValue;\n            });\n        };\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        fn.toString = function () {\n            return lens.toString() + \" = `modify`\";\n        };\n        var log = function (startName) {\n            for (var _i = 0, _a = Object.keys(lensGetters); _i < _a.length; _i++) {\n                var g = _a[_i];\n                var l = lensGetters[g];\n                var lensGetterStr = __spreadArrays([startName], l.from.slice(1), [l.to]).join(\" -> \");\n                console.log(\"getter: \", lensGetterStr);\n            }\n            if (name != null) {\n                console.log(name + \": \");\n            }\n            console.log(__spreadArrays([startName], lens.from.slice(1), [lens.to]).join(\" -> \"), \"=\", \"`modify`\");\n        };\n        return {\n            fn: fn,\n            str: fn.toString(),\n            lens: lens,\n            lensGetters: lensGetters,\n            value: value,\n            log: log,\n            type: \"modify\",\n            prepend: function (newLensOrBuilder) {\n                var newLens = newLensOrBuilder instanceof Lens ? newLensOrBuilder : newLensOrBuilder.get();\n                var combinedLens = newLens.then(lens);\n                var newLensGetters = object_1.ObjectUtils.keys(lensGetters).reduce(function (memo, key) {\n                    var newGetter = newLens.then(lensGetters[key]);\n                    memo[key] = newGetter;\n                    return memo;\n                }, {});\n                return _this.buildLensModifyRecording(combinedLens, modifyFn, newLensGetters, name);\n            },\n        };\n    };\n    Lens.buildLensRecording = function (aLens, value, name) {\n        var _this = this;\n        var lens = aLens instanceof Lens ? aLens : aLens.get();\n        var fn = function (obj) {\n            return lens.set(obj, value);\n        };\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        fn.toString = function () {\n            return lens.toString() + \" = \" + value;\n        };\n        var log = function (startName) {\n            if (name != null) {\n                console.log(name + \": \");\n            }\n            console.log(__spreadArrays([startName], lens.from.slice(1), [lens.to]).join(\" -> \"), \"=\", value);\n        };\n        return {\n            fn: fn,\n            str: fn.toString(),\n            lens: lens,\n            value: { v: value },\n            log: log,\n            type: \"set\",\n            prepend: function (newLensOrBuilder) {\n                var newLens = newLensOrBuilder instanceof Lens ? newLensOrBuilder : newLensOrBuilder.get();\n                var combinedLens = newLens.then(lens);\n                return _this.buildLensRecording(combinedLens, value, name);\n            },\n        };\n    };\n    Lens.build = function (lens) {\n        return LensBuilder.start(Lens.prop(), lens);\n    };\n    Lens.from = function (obj) {\n        return LensBuilderWithObject.start(Lens.prop(), obj);\n    };\n    Lens.propKey = function (key) {\n        return new Lens(function (s) { return s[key]; }, function (s, v) {\n            var _a;\n            if (Array.isArray(s)) {\n                // @ts-ignore\n                return s.map(function (e, i) { return (i === key ? v : e); });\n            }\n            else {\n                return __assign(__assign({}, s), (_a = {}, _a[key] = v, _a));\n            }\n        }, { from: \"obj\", to: \"\" + key });\n    };\n    Lens.prop = function () {\n        return function (key) { return Lens.propKey(key); };\n    };\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    Lens.index = function () {\n        return function (index) {\n            return new Lens(function (a) { return a[index]; }, function (a, v) { return a.map(function (e, i) { return (i === index ? v : e); }); }, { from: \"obj\", to: \"\" + index });\n        };\n    };\n    Lens.find = function () {\n        return function (cb) {\n            return new Lens(function (a) { return a.filter(cb)[0]; }, function (a, v) { return a.map(function (e) { return (cb(e) ? v : e); }); }, { from: \"obj\", to: \"find()\" });\n        };\n    };\n    Lens.findBy = function () {\n        return function (key, value, isReverse) {\n            return new Lens(function (a) {\n                if (isReverse) {\n                    return a.filter(function (e) { return e[key] === value; }).reverse()[0];\n                }\n                else {\n                    return a.filter(function (e) { return e[key] === value; })[0];\n                }\n            }, function (a, v) {\n                var index = -1;\n                if (isReverse) {\n                    for (var i = a.length - 1; i >= 0; i--) {\n                        if (a[i][key] === value) {\n                            index = i;\n                            break;\n                        }\n                    }\n                }\n                else {\n                    for (var i = 0; i < a.length; i++) {\n                        if (a[i][key] === value) {\n                            index = i;\n                            break;\n                        }\n                    }\n                }\n                return a.map(function (e, i) { return (i === index ? v : e); });\n            }, { from: \"obj\", to: key + \" == \" + value });\n        };\n    };\n    Lens.prototype.modify = function (obj, f) {\n        return this.set(obj, f(this.get(obj)));\n    };\n    Lens.prototype.then = function (lens) {\n        var _this = this;\n        return new Lens(function (obj) {\n            var nextObj = _this.get(obj);\n            return lens.get(nextObj);\n        }, function (obj, value) {\n            var parent = _this.get(obj);\n            var newParent = lens.set(parent, value);\n            var newObj = _this.set(obj, newParent);\n            return newObj;\n        }, {\n            from: __spreadArrays(this.from, [this.to]),\n            to: lens.to,\n        });\n    };\n    Lens.prototype.toString = function () {\n        if (this.from != null && this.to != null) {\n            return this.from.join(\" -> \") + \" -> \" + this.to;\n        }\n        else {\n            return \"Lens\";\n        }\n    };\n    Lens.prototype.record = function (value, name) {\n        return Lens.buildLensRecording(this, value, name);\n    };\n    Lens.prototype.recordModify = function (fn, name) {\n        return Lens.buildLensModifyRecording(this, fn, {}, name);\n    };\n    return Lens;\n}());\nexports.Lens = Lens;\n//# sourceMappingURL=index.js.map","'use strict';\n\nvar common = require('@lezer/common');\n\nlet nextTagID = 0;\n/**\nHighlighting tags are markers that denote a highlighting category.\nThey are [associated](#highlight.styleTags) with parts of a syntax\ntree by a language mode, and then mapped to an actual CSS style by\na [highlighter](#highlight.Highlighter).\n\nBecause syntax tree node types and highlight styles have to be\nable to talk the same language, CodeMirror uses a mostly _closed_\n[vocabulary](#highlight.tags) of syntax tags (as opposed to\ntraditional open string-based systems, which make it hard for\nhighlighting themes to cover all the tokens produced by the\nvarious languages).\n\nIt _is_ possible to [define](#highlight.Tag^define) your own\nhighlighting tags for system-internal use (where you control both\nthe language package and the highlighter), but such tags will not\nbe picked up by regular highlighters (though you can derive them\nfrom standard tags to allow highlighters to fall back to those).\n*/\nclass Tag {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The optional name of the base tag @internal\n    */\n    name, \n    /**\n    The set of this tag and all its parent tags, starting with\n    this one itself and sorted in order of decreasing specificity.\n    */\n    set, \n    /**\n    The base unmodified tag that this one is based on, if it's\n    modified @internal\n    */\n    base, \n    /**\n    The modifiers applied to this.base @internal\n    */\n    modified) {\n        this.name = name;\n        this.set = set;\n        this.base = base;\n        this.modified = modified;\n        /**\n        @internal\n        */\n        this.id = nextTagID++;\n    }\n    toString() {\n        let { name } = this;\n        for (let mod of this.modified)\n            if (mod.name)\n                name = `${mod.name}(${name})`;\n        return name;\n    }\n    static define(nameOrParent, parent) {\n        let name = typeof nameOrParent == \"string\" ? nameOrParent : \"?\";\n        if (nameOrParent instanceof Tag)\n            parent = nameOrParent;\n        if (parent === null || parent === void 0 ? void 0 : parent.base)\n            throw new Error(\"Can not derive from a modified tag\");\n        let tag = new Tag(name, [], null, []);\n        tag.set.push(tag);\n        if (parent)\n            for (let t of parent.set)\n                tag.set.push(t);\n        return tag;\n    }\n    /**\n    Define a tag _modifier_, which is a function that, given a tag,\n    will return a tag that is a subtag of the original. Applying the\n    same modifier to a twice tag will return the same value (`m1(t1)\n    == m1(t1)`) and applying multiple modifiers will, regardless or\n    order, produce the same tag (`m1(m2(t1)) == m2(m1(t1))`).\n    \n    When multiple modifiers are applied to a given base tag, each\n    smaller set of modifiers is registered as a parent, so that for\n    example `m1(m2(m3(t1)))` is a subtype of `m1(m2(t1))`,\n    `m1(m3(t1)`, and so on.\n    */\n    static defineModifier(name) {\n        let mod = new Modifier(name);\n        return (tag) => {\n            if (tag.modified.indexOf(mod) > -1)\n                return tag;\n            return Modifier.get(tag.base || tag, tag.modified.concat(mod).sort((a, b) => a.id - b.id));\n        };\n    }\n}\nlet nextModifierID = 0;\nclass Modifier {\n    constructor(name) {\n        this.name = name;\n        this.instances = [];\n        this.id = nextModifierID++;\n    }\n    static get(base, mods) {\n        if (!mods.length)\n            return base;\n        let exists = mods[0].instances.find(t => t.base == base && sameArray(mods, t.modified));\n        if (exists)\n            return exists;\n        let set = [], tag = new Tag(base.name, set, base, mods);\n        for (let m of mods)\n            m.instances.push(tag);\n        let configs = powerSet(mods);\n        for (let parent of base.set)\n            if (!parent.modified.length)\n                for (let config of configs)\n                    set.push(Modifier.get(parent, config));\n        return tag;\n    }\n}\nfunction sameArray(a, b) {\n    return a.length == b.length && a.every((x, i) => x == b[i]);\n}\nfunction powerSet(array) {\n    let sets = [[]];\n    for (let i = 0; i < array.length; i++) {\n        for (let j = 0, e = sets.length; j < e; j++) {\n            sets.push(sets[j].concat(array[i]));\n        }\n    }\n    return sets.sort((a, b) => b.length - a.length);\n}\n/**\nThis function is used to add a set of tags to a language syntax\nvia [`NodeSet.extend`](#common.NodeSet.extend) or\n[`LRParser.configure`](#lr.LRParser.configure).\n\nThe argument object maps node selectors to [highlighting\ntags](#highlight.Tag) or arrays of tags.\n\nNode selectors may hold one or more (space-separated) node paths.\nSuch a path can be a [node name](#common.NodeType.name), or\nmultiple node names (or `*` wildcards) separated by slash\ncharacters, as in `\"Block/Declaration/VariableName\"`. Such a path\nmatches the final node but only if its direct parent nodes are the\nother nodes mentioned. A `*` in such a path matches any parent,\nbut only a single level—wildcards that match multiple parents\naren't supported, both for efficiency reasons and because Lezer\ntrees make it rather hard to reason about what they would match.)\n\nA path can be ended with `/...` to indicate that the tag assigned\nto the node should also apply to all child nodes, even if they\nmatch their own style (by default, only the innermost style is\nused).\n\nWhen a path ends in `!`, as in `Attribute!`, no further matching\nhappens for the node's child nodes, and the entire node gets the\ngiven style.\n\nIn this notation, node names that contain `/`, `!`, `*`, or `...`\nmust be quoted as JSON strings.\n\nFor example:\n\n```javascript\nparser.configure({props: [\n  styleTags({\n    // Style Number and BigNumber nodes\n    \"Number BigNumber\": tags.number,\n    // Style Escape nodes whose parent is String\n    \"String/Escape\": tags.escape,\n    // Style anything inside Attributes nodes\n    \"Attributes!\": tags.meta,\n    // Add a style to all content inside Italic nodes\n    \"Italic/...\": tags.emphasis,\n    // Style InvalidString nodes as both `string` and `invalid`\n    \"InvalidString\": [tags.string, tags.invalid],\n    // Style the node named \"/\" as punctuation\n    '\"/\"': tags.punctuation\n  })\n]})\n```\n*/\nfunction styleTags(spec) {\n    let byName = Object.create(null);\n    for (let prop in spec) {\n        let tags = spec[prop];\n        if (!Array.isArray(tags))\n            tags = [tags];\n        for (let part of prop.split(\" \"))\n            if (part) {\n                let pieces = [], mode = 2 /* Mode.Normal */, rest = part;\n                for (let pos = 0;;) {\n                    if (rest == \"...\" && pos > 0 && pos + 3 == part.length) {\n                        mode = 1 /* Mode.Inherit */;\n                        break;\n                    }\n                    let m = /^\"(?:[^\"\\\\]|\\\\.)*?\"|[^\\/!]+/.exec(rest);\n                    if (!m)\n                        throw new RangeError(\"Invalid path: \" + part);\n                    pieces.push(m[0] == \"*\" ? \"\" : m[0][0] == '\"' ? JSON.parse(m[0]) : m[0]);\n                    pos += m[0].length;\n                    if (pos == part.length)\n                        break;\n                    let next = part[pos++];\n                    if (pos == part.length && next == \"!\") {\n                        mode = 0 /* Mode.Opaque */;\n                        break;\n                    }\n                    if (next != \"/\")\n                        throw new RangeError(\"Invalid path: \" + part);\n                    rest = part.slice(pos);\n                }\n                let last = pieces.length - 1, inner = pieces[last];\n                if (!inner)\n                    throw new RangeError(\"Invalid path: \" + part);\n                let rule = new Rule(tags, mode, last > 0 ? pieces.slice(0, last) : null);\n                byName[inner] = rule.sort(byName[inner]);\n            }\n    }\n    return ruleNodeProp.add(byName);\n}\nconst ruleNodeProp = new common.NodeProp({\n    combine(a, b) {\n        let cur, root, take;\n        while (a || b) {\n            if (!a || b && a.depth >= b.depth) {\n                take = b;\n                b = b.next;\n            }\n            else {\n                take = a;\n                a = a.next;\n            }\n            if (cur && cur.mode == take.mode && !take.context && !cur.context)\n                continue;\n            let copy = new Rule(take.tags, take.mode, take.context);\n            if (cur)\n                cur.next = copy;\n            else\n                root = copy;\n            cur = copy;\n        }\n        return root;\n    }\n});\nclass Rule {\n    constructor(tags, mode, context, next) {\n        this.tags = tags;\n        this.mode = mode;\n        this.context = context;\n        this.next = next;\n    }\n    get opaque() { return this.mode == 0 /* Mode.Opaque */; }\n    get inherit() { return this.mode == 1 /* Mode.Inherit */; }\n    sort(other) {\n        if (!other || other.depth < this.depth) {\n            this.next = other;\n            return this;\n        }\n        other.next = this.sort(other.next);\n        return other;\n    }\n    get depth() { return this.context ? this.context.length : 0; }\n}\nRule.empty = new Rule([], 2 /* Mode.Normal */, null);\n/**\nDefine a [highlighter](#highlight.Highlighter) from an array of\ntag/class pairs. Classes associated with more specific tags will\ntake precedence.\n*/\nfunction tagHighlighter(tags, options) {\n    let map = Object.create(null);\n    for (let style of tags) {\n        if (!Array.isArray(style.tag))\n            map[style.tag.id] = style.class;\n        else\n            for (let tag of style.tag)\n                map[tag.id] = style.class;\n    }\n    let { scope, all = null } = options || {};\n    return {\n        style: (tags) => {\n            let cls = all;\n            for (let tag of tags) {\n                for (let sub of tag.set) {\n                    let tagClass = map[sub.id];\n                    if (tagClass) {\n                        cls = cls ? cls + \" \" + tagClass : tagClass;\n                        break;\n                    }\n                }\n            }\n            return cls;\n        },\n        scope\n    };\n}\nfunction highlightTags(highlighters, tags) {\n    let result = null;\n    for (let highlighter of highlighters) {\n        let value = highlighter.style(tags);\n        if (value)\n            result = result ? result + \" \" + value : value;\n    }\n    return result;\n}\n/**\nHighlight the given [tree](#common.Tree) with the given\n[highlighter](#highlight.Highlighter). Often, the higher-level\n[`highlightCode`](#highlight.highlightCode) function is easier to\nuse.\n*/\nfunction highlightTree(tree, highlighter, \n/**\nAssign styling to a region of the text. Will be called, in order\nof position, for any ranges where more than zero classes apply.\n`classes` is a space separated string of CSS classes.\n*/\nputStyle, \n/**\nThe start of the range to highlight.\n*/\nfrom = 0, \n/**\nThe end of the range.\n*/\nto = tree.length) {\n    let builder = new HighlightBuilder(from, Array.isArray(highlighter) ? highlighter : [highlighter], putStyle);\n    builder.highlightRange(tree.cursor(), from, to, \"\", builder.highlighters);\n    builder.flush(to);\n}\n/**\nHighlight the given tree with the given highlighter, calling\n`putText` for every piece of text, either with a set of classes or\nwith the empty string when unstyled, and `putBreak` for every line\nbreak.\n*/\nfunction highlightCode(code, tree, highlighter, putText, putBreak, from = 0, to = code.length) {\n    let pos = from;\n    function writeTo(p, classes) {\n        if (p <= pos)\n            return;\n        for (let text = code.slice(pos, p), i = 0;;) {\n            let nextBreak = text.indexOf(\"\\n\", i);\n            let upto = nextBreak < 0 ? text.length : nextBreak;\n            if (upto > i)\n                putText(text.slice(i, upto), classes);\n            if (nextBreak < 0)\n                break;\n            putBreak();\n            i = nextBreak + 1;\n        }\n        pos = p;\n    }\n    highlightTree(tree, highlighter, (from, to, classes) => {\n        writeTo(from, \"\");\n        writeTo(to, classes);\n    }, from, to);\n    writeTo(to, \"\");\n}\nclass HighlightBuilder {\n    constructor(at, highlighters, span) {\n        this.at = at;\n        this.highlighters = highlighters;\n        this.span = span;\n        this.class = \"\";\n    }\n    startSpan(at, cls) {\n        if (cls != this.class) {\n            this.flush(at);\n            if (at > this.at)\n                this.at = at;\n            this.class = cls;\n        }\n    }\n    flush(to) {\n        if (to > this.at && this.class)\n            this.span(this.at, to, this.class);\n    }\n    highlightRange(cursor, from, to, inheritedClass, highlighters) {\n        let { type, from: start, to: end } = cursor;\n        if (start >= to || end <= from)\n            return;\n        if (type.isTop)\n            highlighters = this.highlighters.filter(h => !h.scope || h.scope(type));\n        let cls = inheritedClass;\n        let rule = getStyleTags(cursor) || Rule.empty;\n        let tagCls = highlightTags(highlighters, rule.tags);\n        if (tagCls) {\n            if (cls)\n                cls += \" \";\n            cls += tagCls;\n            if (rule.mode == 1 /* Mode.Inherit */)\n                inheritedClass += (inheritedClass ? \" \" : \"\") + tagCls;\n        }\n        this.startSpan(Math.max(from, start), cls);\n        if (rule.opaque)\n            return;\n        let mounted = cursor.tree && cursor.tree.prop(common.NodeProp.mounted);\n        if (mounted && mounted.overlay) {\n            let inner = cursor.node.enter(mounted.overlay[0].from + start, 1);\n            let innerHighlighters = this.highlighters.filter(h => !h.scope || h.scope(mounted.tree.type));\n            let hasChild = cursor.firstChild();\n            for (let i = 0, pos = start;; i++) {\n                let next = i < mounted.overlay.length ? mounted.overlay[i] : null;\n                let nextPos = next ? next.from + start : end;\n                let rangeFrom = Math.max(from, pos), rangeTo = Math.min(to, nextPos);\n                if (rangeFrom < rangeTo && hasChild) {\n                    while (cursor.from < rangeTo) {\n                        this.highlightRange(cursor, rangeFrom, rangeTo, inheritedClass, highlighters);\n                        this.startSpan(Math.min(rangeTo, cursor.to), cls);\n                        if (cursor.to >= nextPos || !cursor.nextSibling())\n                            break;\n                    }\n                }\n                if (!next || nextPos > to)\n                    break;\n                pos = next.to + start;\n                if (pos > from) {\n                    this.highlightRange(inner.cursor(), Math.max(from, next.from + start), Math.min(to, pos), \"\", innerHighlighters);\n                    this.startSpan(Math.min(to, pos), cls);\n                }\n            }\n            if (hasChild)\n                cursor.parent();\n        }\n        else if (cursor.firstChild()) {\n            if (mounted)\n                inheritedClass = \"\";\n            do {\n                if (cursor.to <= from)\n                    continue;\n                if (cursor.from >= to)\n                    break;\n                this.highlightRange(cursor, from, to, inheritedClass, highlighters);\n                this.startSpan(Math.min(to, cursor.to), cls);\n            } while (cursor.nextSibling());\n            cursor.parent();\n        }\n    }\n}\n/**\nMatch a syntax node's [highlight rules](#highlight.styleTags). If\nthere's a match, return its set of tags, and whether it is\nopaque (uses a `!`) or applies to all child nodes (`/...`).\n*/\nfunction getStyleTags(node) {\n    let rule = node.type.prop(ruleNodeProp);\n    while (rule && rule.context && !node.matchContext(rule.context))\n        rule = rule.next;\n    return rule || null;\n}\nconst t = Tag.define;\nconst comment = t(), name = t(), typeName = t(name), propertyName = t(name), literal = t(), string = t(literal), number = t(literal), content = t(), heading = t(content), keyword = t(), operator = t(), punctuation = t(), bracket = t(punctuation), meta = t();\n/**\nThe default set of highlighting [tags](#highlight.Tag).\n\nThis collection is heavily biased towards programming languages,\nand necessarily incomplete. A full ontology of syntactic\nconstructs would fill a stack of books, and be impractical to\nwrite themes for. So try to make do with this set. If all else\nfails, [open an\nissue](https://github.com/codemirror/codemirror.next) to propose a\nnew tag, or [define](#highlight.Tag^define) a local custom tag for\nyour use case.\n\nNote that it is not obligatory to always attach the most specific\ntag possible to an element—if your grammar can't easily\ndistinguish a certain type of element (such as a local variable),\nit is okay to style it as its more general variant (a variable).\n\nFor tags that extend some parent tag, the documentation links to\nthe parent.\n*/\nconst tags = {\n    /**\n    A comment.\n    */\n    comment,\n    /**\n    A line [comment](#highlight.tags.comment).\n    */\n    lineComment: t(comment),\n    /**\n    A block [comment](#highlight.tags.comment).\n    */\n    blockComment: t(comment),\n    /**\n    A documentation [comment](#highlight.tags.comment).\n    */\n    docComment: t(comment),\n    /**\n    Any kind of identifier.\n    */\n    name,\n    /**\n    The [name](#highlight.tags.name) of a variable.\n    */\n    variableName: t(name),\n    /**\n    A type [name](#highlight.tags.name).\n    */\n    typeName: typeName,\n    /**\n    A tag name (subtag of [`typeName`](#highlight.tags.typeName)).\n    */\n    tagName: t(typeName),\n    /**\n    A property or field [name](#highlight.tags.name).\n    */\n    propertyName: propertyName,\n    /**\n    An attribute name (subtag of [`propertyName`](#highlight.tags.propertyName)).\n    */\n    attributeName: t(propertyName),\n    /**\n    The [name](#highlight.tags.name) of a class.\n    */\n    className: t(name),\n    /**\n    A label [name](#highlight.tags.name).\n    */\n    labelName: t(name),\n    /**\n    A namespace [name](#highlight.tags.name).\n    */\n    namespace: t(name),\n    /**\n    The [name](#highlight.tags.name) of a macro.\n    */\n    macroName: t(name),\n    /**\n    A literal value.\n    */\n    literal,\n    /**\n    A string [literal](#highlight.tags.literal).\n    */\n    string,\n    /**\n    A documentation [string](#highlight.tags.string).\n    */\n    docString: t(string),\n    /**\n    A character literal (subtag of [string](#highlight.tags.string)).\n    */\n    character: t(string),\n    /**\n    An attribute value (subtag of [string](#highlight.tags.string)).\n    */\n    attributeValue: t(string),\n    /**\n    A number [literal](#highlight.tags.literal).\n    */\n    number,\n    /**\n    An integer [number](#highlight.tags.number) literal.\n    */\n    integer: t(number),\n    /**\n    A floating-point [number](#highlight.tags.number) literal.\n    */\n    float: t(number),\n    /**\n    A boolean [literal](#highlight.tags.literal).\n    */\n    bool: t(literal),\n    /**\n    Regular expression [literal](#highlight.tags.literal).\n    */\n    regexp: t(literal),\n    /**\n    An escape [literal](#highlight.tags.literal), for example a\n    backslash escape in a string.\n    */\n    escape: t(literal),\n    /**\n    A color [literal](#highlight.tags.literal).\n    */\n    color: t(literal),\n    /**\n    A URL [literal](#highlight.tags.literal).\n    */\n    url: t(literal),\n    /**\n    A language keyword.\n    */\n    keyword,\n    /**\n    The [keyword](#highlight.tags.keyword) for the self or this\n    object.\n    */\n    self: t(keyword),\n    /**\n    The [keyword](#highlight.tags.keyword) for null.\n    */\n    null: t(keyword),\n    /**\n    A [keyword](#highlight.tags.keyword) denoting some atomic value.\n    */\n    atom: t(keyword),\n    /**\n    A [keyword](#highlight.tags.keyword) that represents a unit.\n    */\n    unit: t(keyword),\n    /**\n    A modifier [keyword](#highlight.tags.keyword).\n    */\n    modifier: t(keyword),\n    /**\n    A [keyword](#highlight.tags.keyword) that acts as an operator.\n    */\n    operatorKeyword: t(keyword),\n    /**\n    A control-flow related [keyword](#highlight.tags.keyword).\n    */\n    controlKeyword: t(keyword),\n    /**\n    A [keyword](#highlight.tags.keyword) that defines something.\n    */\n    definitionKeyword: t(keyword),\n    /**\n    A [keyword](#highlight.tags.keyword) related to defining or\n    interfacing with modules.\n    */\n    moduleKeyword: t(keyword),\n    /**\n    An operator.\n    */\n    operator,\n    /**\n    An [operator](#highlight.tags.operator) that dereferences something.\n    */\n    derefOperator: t(operator),\n    /**\n    Arithmetic-related [operator](#highlight.tags.operator).\n    */\n    arithmeticOperator: t(operator),\n    /**\n    Logical [operator](#highlight.tags.operator).\n    */\n    logicOperator: t(operator),\n    /**\n    Bit [operator](#highlight.tags.operator).\n    */\n    bitwiseOperator: t(operator),\n    /**\n    Comparison [operator](#highlight.tags.operator).\n    */\n    compareOperator: t(operator),\n    /**\n    [Operator](#highlight.tags.operator) that updates its operand.\n    */\n    updateOperator: t(operator),\n    /**\n    [Operator](#highlight.tags.operator) that defines something.\n    */\n    definitionOperator: t(operator),\n    /**\n    Type-related [operator](#highlight.tags.operator).\n    */\n    typeOperator: t(operator),\n    /**\n    Control-flow [operator](#highlight.tags.operator).\n    */\n    controlOperator: t(operator),\n    /**\n    Program or markup punctuation.\n    */\n    punctuation,\n    /**\n    [Punctuation](#highlight.tags.punctuation) that separates\n    things.\n    */\n    separator: t(punctuation),\n    /**\n    Bracket-style [punctuation](#highlight.tags.punctuation).\n    */\n    bracket,\n    /**\n    Angle [brackets](#highlight.tags.bracket) (usually `<` and `>`\n    tokens).\n    */\n    angleBracket: t(bracket),\n    /**\n    Square [brackets](#highlight.tags.bracket) (usually `[` and `]`\n    tokens).\n    */\n    squareBracket: t(bracket),\n    /**\n    Parentheses (usually `(` and `)` tokens). Subtag of\n    [bracket](#highlight.tags.bracket).\n    */\n    paren: t(bracket),\n    /**\n    Braces (usually `{` and `}` tokens). Subtag of\n    [bracket](#highlight.tags.bracket).\n    */\n    brace: t(bracket),\n    /**\n    Content, for example plain text in XML or markup documents.\n    */\n    content,\n    /**\n    [Content](#highlight.tags.content) that represents a heading.\n    */\n    heading,\n    /**\n    A level 1 [heading](#highlight.tags.heading).\n    */\n    heading1: t(heading),\n    /**\n    A level 2 [heading](#highlight.tags.heading).\n    */\n    heading2: t(heading),\n    /**\n    A level 3 [heading](#highlight.tags.heading).\n    */\n    heading3: t(heading),\n    /**\n    A level 4 [heading](#highlight.tags.heading).\n    */\n    heading4: t(heading),\n    /**\n    A level 5 [heading](#highlight.tags.heading).\n    */\n    heading5: t(heading),\n    /**\n    A level 6 [heading](#highlight.tags.heading).\n    */\n    heading6: t(heading),\n    /**\n    A prose [content](#highlight.tags.content) separator (such as a horizontal rule).\n    */\n    contentSeparator: t(content),\n    /**\n    [Content](#highlight.tags.content) that represents a list.\n    */\n    list: t(content),\n    /**\n    [Content](#highlight.tags.content) that represents a quote.\n    */\n    quote: t(content),\n    /**\n    [Content](#highlight.tags.content) that is emphasized.\n    */\n    emphasis: t(content),\n    /**\n    [Content](#highlight.tags.content) that is styled strong.\n    */\n    strong: t(content),\n    /**\n    [Content](#highlight.tags.content) that is part of a link.\n    */\n    link: t(content),\n    /**\n    [Content](#highlight.tags.content) that is styled as code or\n    monospace.\n    */\n    monospace: t(content),\n    /**\n    [Content](#highlight.tags.content) that has a strike-through\n    style.\n    */\n    strikethrough: t(content),\n    /**\n    Inserted text in a change-tracking format.\n    */\n    inserted: t(),\n    /**\n    Deleted text.\n    */\n    deleted: t(),\n    /**\n    Changed text.\n    */\n    changed: t(),\n    /**\n    An invalid or unsyntactic element.\n    */\n    invalid: t(),\n    /**\n    Metadata or meta-instruction.\n    */\n    meta,\n    /**\n    [Metadata](#highlight.tags.meta) that applies to the entire\n    document.\n    */\n    documentMeta: t(meta),\n    /**\n    [Metadata](#highlight.tags.meta) that annotates or adds\n    attributes to a given syntactic element.\n    */\n    annotation: t(meta),\n    /**\n    Processing instruction or preprocessor directive. Subtag of\n    [meta](#highlight.tags.meta).\n    */\n    processingInstruction: t(meta),\n    /**\n    [Modifier](#highlight.Tag^defineModifier) that indicates that a\n    given element is being defined. Expected to be used with the\n    various [name](#highlight.tags.name) tags.\n    */\n    definition: Tag.defineModifier(\"definition\"),\n    /**\n    [Modifier](#highlight.Tag^defineModifier) that indicates that\n    something is constant. Mostly expected to be used with\n    [variable names](#highlight.tags.variableName).\n    */\n    constant: Tag.defineModifier(\"constant\"),\n    /**\n    [Modifier](#highlight.Tag^defineModifier) used to indicate that\n    a [variable](#highlight.tags.variableName) or [property\n    name](#highlight.tags.propertyName) is being called or defined\n    as a function.\n    */\n    function: Tag.defineModifier(\"function\"),\n    /**\n    [Modifier](#highlight.Tag^defineModifier) that can be applied to\n    [names](#highlight.tags.name) to indicate that they belong to\n    the language's standard environment.\n    */\n    standard: Tag.defineModifier(\"standard\"),\n    /**\n    [Modifier](#highlight.Tag^defineModifier) that indicates a given\n    [names](#highlight.tags.name) is local to some scope.\n    */\n    local: Tag.defineModifier(\"local\"),\n    /**\n    A generic variant [modifier](#highlight.Tag^defineModifier) that\n    can be used to tag language-specific alternative variants of\n    some common tag. It is recommended for themes to define special\n    forms of at least the [string](#highlight.tags.string) and\n    [variable name](#highlight.tags.variableName) tags, since those\n    come up a lot.\n    */\n    special: Tag.defineModifier(\"special\")\n};\nfor (let name in tags) {\n    let val = tags[name];\n    if (val instanceof Tag)\n        val.name = name;\n}\n/**\nThis is a highlighter that adds stable, predictable classes to\ntokens, for styling with external CSS.\n\nThe following tags are mapped to their name prefixed with `\"tok-\"`\n(for example `\"tok-comment\"`):\n\n* [`link`](#highlight.tags.link)\n* [`heading`](#highlight.tags.heading)\n* [`emphasis`](#highlight.tags.emphasis)\n* [`strong`](#highlight.tags.strong)\n* [`keyword`](#highlight.tags.keyword)\n* [`atom`](#highlight.tags.atom)\n* [`bool`](#highlight.tags.bool)\n* [`url`](#highlight.tags.url)\n* [`labelName`](#highlight.tags.labelName)\n* [`inserted`](#highlight.tags.inserted)\n* [`deleted`](#highlight.tags.deleted)\n* [`literal`](#highlight.tags.literal)\n* [`string`](#highlight.tags.string)\n* [`number`](#highlight.tags.number)\n* [`variableName`](#highlight.tags.variableName)\n* [`typeName`](#highlight.tags.typeName)\n* [`namespace`](#highlight.tags.namespace)\n* [`className`](#highlight.tags.className)\n* [`macroName`](#highlight.tags.macroName)\n* [`propertyName`](#highlight.tags.propertyName)\n* [`operator`](#highlight.tags.operator)\n* [`comment`](#highlight.tags.comment)\n* [`meta`](#highlight.tags.meta)\n* [`punctuation`](#highlight.tags.punctuation)\n* [`invalid`](#highlight.tags.invalid)\n\nIn addition, these mappings are provided:\n\n* [`regexp`](#highlight.tags.regexp),\n  [`escape`](#highlight.tags.escape), and\n  [`special`](#highlight.tags.special)[`(string)`](#highlight.tags.string)\n  are mapped to `\"tok-string2\"`\n* [`special`](#highlight.tags.special)[`(variableName)`](#highlight.tags.variableName)\n  to `\"tok-variableName2\"`\n* [`local`](#highlight.tags.local)[`(variableName)`](#highlight.tags.variableName)\n  to `\"tok-variableName tok-local\"`\n* [`definition`](#highlight.tags.definition)[`(variableName)`](#highlight.tags.variableName)\n  to `\"tok-variableName tok-definition\"`\n* [`definition`](#highlight.tags.definition)[`(propertyName)`](#highlight.tags.propertyName)\n  to `\"tok-propertyName tok-definition\"`\n*/\nconst classHighlighter = tagHighlighter([\n    { tag: tags.link, class: \"tok-link\" },\n    { tag: tags.heading, class: \"tok-heading\" },\n    { tag: tags.emphasis, class: \"tok-emphasis\" },\n    { tag: tags.strong, class: \"tok-strong\" },\n    { tag: tags.keyword, class: \"tok-keyword\" },\n    { tag: tags.atom, class: \"tok-atom\" },\n    { tag: tags.bool, class: \"tok-bool\" },\n    { tag: tags.url, class: \"tok-url\" },\n    { tag: tags.labelName, class: \"tok-labelName\" },\n    { tag: tags.inserted, class: \"tok-inserted\" },\n    { tag: tags.deleted, class: \"tok-deleted\" },\n    { tag: tags.literal, class: \"tok-literal\" },\n    { tag: tags.string, class: \"tok-string\" },\n    { tag: tags.number, class: \"tok-number\" },\n    { tag: [tags.regexp, tags.escape, tags.special(tags.string)], class: \"tok-string2\" },\n    { tag: tags.variableName, class: \"tok-variableName\" },\n    { tag: tags.local(tags.variableName), class: \"tok-variableName tok-local\" },\n    { tag: tags.definition(tags.variableName), class: \"tok-variableName tok-definition\" },\n    { tag: tags.special(tags.variableName), class: \"tok-variableName2\" },\n    { tag: tags.definition(tags.propertyName), class: \"tok-propertyName tok-definition\" },\n    { tag: tags.typeName, class: \"tok-typeName\" },\n    { tag: tags.namespace, class: \"tok-namespace\" },\n    { tag: tags.className, class: \"tok-className\" },\n    { tag: tags.macroName, class: \"tok-macroName\" },\n    { tag: tags.propertyName, class: \"tok-propertyName\" },\n    { tag: tags.operator, class: \"tok-operator\" },\n    { tag: tags.comment, class: \"tok-comment\" },\n    { tag: tags.meta, class: \"tok-meta\" },\n    { tag: tags.invalid, class: \"tok-invalid\" },\n    { tag: tags.punctuation, class: \"tok-punctuation\" }\n]);\n\nexports.Tag = Tag;\nexports.classHighlighter = classHighlighter;\nexports.getStyleTags = getStyleTags;\nexports.highlightCode = highlightCode;\nexports.highlightTree = highlightTree;\nexports.styleTags = styleTags;\nexports.tagHighlighter = tagHighlighter;\nexports.tags = tags;\n","import { JSX } from \"preact\";\nimport { useEffect, useState } from \"preact/hooks\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\n\ninterface ITrainerEmailLoginFormProps {\n  onLogin: (email: string, password: string) => Promise<void>;\n  onForgotPassword?: (email: string) => void;\n  onSendMagicLink?: (email: string) => Promise<void>;\n  onBack: () => void;\n  initialEmail?: string;\n}\n\nexport function TrainerEmailLoginForm(props: ITrainerEmailLoginFormProps): JSX.Element {\n  const [email, setEmail] = useState(props.initialEmail ?? \"\");\n  const [password, setPassword] = useState(\"\");\n  const [isPasswordLoading, setIsPasswordLoading] = useState(false);\n  const [isMagicLinkLoading, setIsMagicLinkLoading] = useState(false);\n  const [passwordError, setPasswordError] = useState<string | undefined>(undefined);\n  const [magicLinkError, setMagicLinkError] = useState<string | undefined>(undefined);\n  const [successMessage, setSuccessMessage] = useState<string | undefined>(undefined);\n  const [hasSent, setHasSent] = useState(false);\n  const [countdown, setCountdown] = useState(0);\n\n  useEffect(() => {\n    if (countdown <= 0) {\n      return undefined;\n    }\n    const timer = setTimeout(() => {\n      setCountdown((value) => value - 1);\n    }, 1000);\n    return () => clearTimeout(timer);\n  }, [countdown]);\n\n  const handleSubmit = async (e: Event): Promise<void> => {\n    e.preventDefault();\n    setPasswordError(undefined);\n    setIsPasswordLoading(true);\n    try {\n      await props.onLogin(email, password);\n    } catch (err) {\n      setPasswordError(err instanceof Error ? err.message : \"Failed to sign in\");\n    } finally {\n      setIsPasswordLoading(false);\n    }\n  };\n\n  const handleSendMagicLink = async (): Promise<void> => {\n    if (!props.onSendMagicLink || !email || isMagicLinkLoading) {\n      return;\n    }\n    setMagicLinkError(undefined);\n    setSuccessMessage(undefined);\n    setIsMagicLinkLoading(true);\n    try {\n      await props.onSendMagicLink(email);\n      // setSuccessMessage(\n      //   \"If you have an existing account, your magic link has been sent!\\nCheck your email to sign in.\\n\"\n      // );\n      setSuccessMessage(\"Magic link sent!\");\n      setHasSent(true);\n      setCountdown(60);\n    } catch (err) {\n      setMagicLinkError(err instanceof Error ? err.message : \"Failed to send magic link\");\n    } finally {\n      setIsMagicLinkLoading(false);\n    }\n  };\n\n  return (\n    <div>\n      <h2 className=\"mb-4 text-lg font-bold text-center\">Trainer Email Login</h2>\n      <form onSubmit={handleSubmit}>\n        <div className=\"mb-4\">\n          <Input\n            label=\"Email\"\n            type=\"email\"\n            identifier=\"trainer-email-login-email\"\n            isLabelOutside={true}\n            required={true}\n            requiredMessage=\"Email is required\"\n            value={email}\n            changeType=\"oninput\"\n            changeHandler={(result) => {\n              if (result.success) {\n                const nextEmail = result.data;\n                if (nextEmail !== email) {\n                  setHasSent(false);\n                  setCountdown(0);\n                  setSuccessMessage(undefined);\n                  setMagicLinkError(undefined);\n                }\n                setEmail(nextEmail);\n              }\n            }}\n            placeholder=\"coach@email.com\"\n          />\n        </div>\n        {props.onSendMagicLink && (\n          <div className=\"mb-2 text-center\">\n            <Button\n              name=\"trainer-email-login-magic-link\"\n              kind=\"purple\"\n              type=\"button\"\n              data-cy=\"trainer-email-login-magic-link\"\n              disabled={!email || countdown > 0 || isMagicLinkLoading}\n              onClick={handleSendMagicLink}\n            >\n              {isMagicLinkLoading\n                ? \"Sending Magic Link...\"\n                : hasSent\n                  ? countdown > 0\n                    ? `Resend in ${countdown}s`\n                    : \"Resend Magic Link\"\n                  : \"Send Magic Link\"}\n            </Button>\n          </div>\n        )}\n        {/* {!hasSent && props.onSendMagicLink && (\n          <div className=\"mb-4 text-xs text-center text-text-secondary\">\n            We'll send you an email with a link to sign in instantly. No password needed!\n          </div>\n        )} */}\n        {magicLinkError && (\n          <div className=\"mb-4 text-sm text-center text-text-error\" data-cy=\"trainer-email-login-magic-link-error\">\n            {magicLinkError}\n          </div>\n        )}\n        {successMessage && (\n          <div className=\"mb-4 text-sm text-center text-text-purple\" data-cy=\"trainer-email-login-magic-link-success\">\n            {successMessage}\n          </div>\n        )}\n        {/* {successMessage && (\n          <div className=\"mb-4 text-sm text-center text-text-purple whitespace-pre-line\" data-cy=\"trainer-email-login-magic-link-success\">\n            {successMessage}\n          </div>\n        )} */}\n        <div className=\"mt-6 mb-4\">\n          <Input\n            label=\"Password\"\n            type=\"password\"\n            identifier=\"trainer-email-login-password\"\n            isLabelOutside={true}\n            required={true}\n            requiredMessage=\"Password is required\"\n            value={password}\n            changeType=\"oninput\"\n            changeHandler={(result) => {\n              if (result.success) {\n                setPassword(result.data);\n              }\n            }}\n            placeholder=\"Enter your password\"\n          />\n        </div>\n        {passwordError && (\n          <div className=\"mb-4 text-sm text-center text-text-error\" data-cy=\"trainer-email-login-error\">\n            {passwordError}\n          </div>\n        )}\n        <div className=\"mb-4 text-center\">\n          <Button\n            name=\"trainer-email-login-submit\"\n            kind=\"lightgrayv3\"\n            type=\"submit\"\n            data-cy=\"trainer-email-login-submit\"\n            disabled={!email || !password || isPasswordLoading}\n          >\n            {isPasswordLoading ? \"Signing In...\" : \"Sign In with Password\"}\n          </Button>\n        </div>\n        {props.onForgotPassword && (\n          <div className=\"mb-2 text-center\">\n            <button\n              type=\"button\"\n              className=\"text-sm text-text-link underline\"\n              onClick={() => props.onForgotPassword?.(email)}\n              data-cy=\"trainer-email-login-forgot-password\"\n            >\n              Forgot Password?\n            </button>\n          </div>\n        )}\n        <div className=\"mt-4 text-center\">\n          <Button\n            name=\"trainer-email-login-back\"\n            kind=\"grayv2\"\n            buttonSize=\"md\"\n            onClick={props.onBack}\n            data-cy=\"trainer-email-login-back\"\n          >\n            Back\n          </Button>\n        </div>\n      </form>\n    </div>\n  );\n}\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    var desc = Object.getOwnPropertyDescriptor(m, k);\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n    }\n    Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n    __setModuleDefault(result, mod);\n    return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wiltDefault = wiltDefault;\nexports.witherDefault = witherDefault;\nexports.filterE = filterE;\nvar _ = __importStar(require(\"./internal\"));\nfunction wiltDefault(T, C) {\n    return function (F) {\n        var traverseF = T.traverse(F);\n        return function (wa, f) { return F.map(traverseF(wa, f), C.separate); };\n    };\n}\nfunction witherDefault(T, C) {\n    return function (F) {\n        var traverseF = T.traverse(F);\n        return function (wa, f) { return F.map(traverseF(wa, f), C.compact); };\n    };\n}\nfunction filterE(W) {\n    return function (F) {\n        var witherF = W.wither(F);\n        return function (predicate) { return function (ga) { return witherF(ga, function (a) { return F.map(predicate(a), function (b) { return (b ? _.some(a) : _.none); }); }); }; };\n    };\n}\n","import { CollectionUtils } from \"../utils/collection\";\nimport { Weight } from \"./weight\";\nimport { ISet, IHistoryRecord, IHistoryEntry, IWeight, IUnit, ISettings } from \"../types\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { UidFactory } from \"../utils/generator\";\nimport { Progress } from \"./progress\";\nimport { n } from \"../utils/math\";\n\nexport type IProgramReps = number;\n\nexport type ISetsStatus = \"success\" | \"in-range\" | \"failed\" | \"not-finished\";\n\nexport interface IDisplaySet {\n  dimReps?: boolean;\n  dimRpe?: boolean;\n  dimWeight?: boolean;\n  dimTimer?: boolean;\n  reps: string;\n  weight?: string;\n  rpe?: string;\n  askWeight?: boolean;\n  unit?: string;\n  isCompleted?: boolean;\n  isRpeFailed?: boolean;\n  isInRange?: boolean;\n  timer?: number;\n  setTimer?: number;\n  isOverflowSetTimer?: boolean;\n  completedSetTimer?: number;\n}\n\nexport namespace Reps {\n  export function display(sets: ISet[], isNext: boolean = false): string {\n    if (areSameReps(sets, isNext)) {\n      return `${sets.length}x${sets[0].completedReps || sets[0].reps}`;\n    } else {\n      const arr = sets.map((s) => (isNext ? displayReps(s) : displayCompletedReps(s)));\n      const groups = CollectionUtils.inGroupsOf(5, arr);\n      return groups.map((g) => g.join(\"/\")).join(\"/ \");\n    }\n  }\n\n  export function setToDisplaySet(\n    set: ISet,\n    isNext: boolean,\n    settings: ISettings,\n    isBlockSet: boolean = false\n  ): IDisplaySet {\n    const completedOrRequiredWeight = set.completedWeight ?? set.weight;\n    return {\n      reps: isNext ? Reps.displayReps(set) : Reps.displayCompletedReps(set),\n      rpe: set.completedRpe?.toString() ?? set.rpe?.toString(),\n      weight: isNext\n        ? set.weight && set.originalWeight\n          ? Weight.display(set.weight, false)\n          : undefined\n        : completedOrRequiredWeight\n          ? Weight.display(completedOrRequiredWeight, false)\n          : undefined,\n      unit: completedOrRequiredWeight?.unit ?? settings.units,\n      askWeight: set.askWeight,\n      isCompleted: Reps.isCompletedSet(set, isBlockSet),\n      isRpeFailed: set.rpe != null && set.completedRpe != null && set.completedRpe > set.rpe,\n      isInRange: set.minReps != null ? set.completedReps != null && set.completedReps >= set.minReps : undefined,\n      timer: set.timer,\n      setTimer: set.setTimer,\n      isOverflowSetTimer: set.isOverflowSetTimer,\n      completedSetTimer: set.completedSetTimer,\n    };\n  }\n\n  export function isTimerOnlySet(set: ISet): boolean {\n    return set.setTimer != null;\n  }\n\n  export function hasWeightTarget(set: ISet): boolean {\n    // `set.weight` alone isn't enough: RPE-only sets with no weight token (e.g. bodyweight\n    // \"Push Up / 2x8 @8\") still get an evaluated `weight` via RPE-inferred %1RM\n    // (ProgramSet.getEvaluatedWeight -> isEligibleForInferredWeight), even though the program\n    // never specified a real weight target. `originalWeight` mirrors what the program actually\n    // asked for and is what setToDisplaySet already keys off of for the same reason.\n    // `isOptionalWeight`: a set that the user added with no set to copy. It shows the weight\n    // input, but `requiresCompletedWeight` does not need a weight for it.\n    return set.originalWeight != null || !!set.askWeight || !!set.isOptionalWeight;\n  }\n\n  // The completion rules need a weight only for a real weight target: an evaluated `set.weight`\n  // (also an RPE-inferred one) or a program weight. An optional-weight set with no target does not.\n  export function requiresCompletedWeight(set: ISet): boolean {\n    return set.weight != null || set.originalWeight != null || !!set.askWeight;\n  }\n\n  export interface ISetTimerText {\n    setTimerValue: string;\n    setTimerSuffix: string;\n    timerValue: string;\n    timerSuffix: string;\n  }\n\n  export function getSetTimerText(set: ISet): ISetTimerText | undefined {\n    if (set.setTimer == null) {\n      return undefined;\n    }\n    return {\n      setTimerValue: n(Math.max(0, set.setTimer)),\n      setTimerSuffix: set.isOverflowSetTimer ? \"s+\" : \"s\",\n      timerValue: set.timer != null ? n(Math.max(0, set.timer)) : \"?\",\n      timerSuffix: set.timer != null ? \"s\" : \"\",\n    };\n  }\n\n  // With no earlier set to copy, the new set gets `isOptionalWeight`.\n  export function addSet(sets: ISet[], isUnilateral: boolean, lastSet?: ISet, isWarmup?: boolean): ISet[] {\n    lastSet = sets[sets.length - 1] || lastSet;\n    if (lastSet == null) {\n      lastSet = newSet(isUnilateral);\n    } else {\n      if (isWarmup) {\n        lastSet = {\n          ...ObjectUtils.clone(lastSet),\n          reps: lastSet.completedReps ?? lastSet.reps,\n          weight: lastSet.completedWeight ?? lastSet.weight,\n        };\n      } else {\n        lastSet = {\n          ...ObjectUtils.clone(lastSet),\n          reps: lastSet.reps ?? lastSet.completedReps,\n          weight: lastSet.weight ?? lastSet.completedWeight,\n          originalWeight: lastSet.originalWeight ?? lastSet.weight ?? lastSet.completedWeight,\n          completedReps: undefined,\n          completedRepsLeft: undefined,\n          completedWeight: undefined,\n          completedRpe: undefined,\n        };\n      }\n    }\n\n    // A set the client adds never opens the RPE prompt, also when it comes from the exercise default or is a\n    // warmup. A block log can still give it an RPE.\n    return [\n      ...sets,\n      { ...ObjectUtils.clone(lastSet), id: UidFactory.generateUid(6), isCompleted: false, logRpe: false },\n    ];\n  }\n\n  export function isSameSet(set1: ISet, set2: ISet): boolean {\n    return (\n      Weight.eqNull(set1.weight, set2.weight) && set1.completedReps === set2.completedReps && set1.rpe === set2.rpe\n    );\n  }\n\n  export function displayReps(set: ISet): string {\n    const reps = set.minReps != null ? `${set.minReps}-${set.reps}` : `${set.reps}`;\n    return set.isAmrap ? `${reps}+` : `${reps}`;\n  }\n\n  export function displayCompletedReps(set: ISet): string {\n    return set.completedReps != null\n      ? `${set.completedRepsLeft != null ? `${set.completedRepsLeft}/` : \"\"}${set.completedReps}`\n      : \"-\";\n  }\n\n  export function areSameReps(sets: ISet[], isNext: boolean): boolean {\n    const firstRep = sets[0]?.reps;\n    if (sets.length > 0) {\n      return sets.every(\n        (s) => (isNext ? s.reps : s.completedReps) != null && (isNext ? s.reps : s.completedReps) === firstRep\n      );\n    } else {\n      return false;\n    }\n  }\n\n  export function isEmpty(sets: ISet[]): boolean {\n    return sets.every((s) => !s.isCompleted);\n  }\n\n  export function newSet(isUnilateral: boolean): ISet {\n    return {\n      id: UidFactory.generateUid(6),\n      originalWeight: undefined,\n      weight: undefined,\n      isUnilateral,\n      reps: undefined,\n      isAmrap: false,\n      askWeight: false,\n      isOptionalWeight: true,\n      isCompleted: false,\n    };\n  }\n\n  export function isCompleted(sets: ISet[], isBlockSet: boolean = false): boolean {\n    return sets.length > 0 && sets.every((set) => Reps.isCompletedSet(set, isBlockSet));\n  }\n\n  export function setsStatus(sets: ISet[], isBlockSet: boolean = false): ISetsStatus {\n    if (Reps.isCompleted(sets, isBlockSet)) {\n      return \"success\";\n    } else if (Reps.isInRangeCompleted(sets)) {\n      return \"in-range\";\n    } else if (!Reps.isFinished(sets)) {\n      return \"not-finished\";\n    } else {\n      return \"failed\";\n    }\n  }\n\n  export function isCompletedSet(set: ISet, isBlockSet: boolean = false): boolean {\n    // A block round the client legitimately left unreported (decision: plan.md #1) still counts as\n    // done - it is not a failed set, just one with no per-round data.\n    if (isBlockSet && set.completedReps == null) {\n      return !!set.isCompleted;\n    }\n    if (set.completedReps == null) {\n      return false;\n    }\n    // `completedWeight` is only required when the set actually has a weight target. A set with no\n    // weight (a timer set, a bodyweight set) never gets a `completedWeight` written\n    // (Progress.completeAmrapSet), so requiring it unconditionally makes every no-weight set read as\n    // failed. `hasWeightTarget` alone isn't enough either: RPE-only sets get an inferred `set.weight`\n    // via %1RM even with no weight token in the program, and that inferred target still needs to be met.\n    const requiresWeight = Reps.requiresCompletedWeight(set);\n    if (requiresWeight && set.completedWeight == null) {\n      return false;\n    }\n    return (\n      !!set.isCompleted &&\n      (set.reps == null || set.completedReps >= set.reps) &&\n      (set.weight == null || (set.completedWeight != null && Weight.gte(set.completedWeight, set.weight)))\n    );\n  }\n\n  export function isInRangeCompletedSet(set: ISet): boolean {\n    if (set.completedReps == null) {\n      return false;\n    }\n    const requiresWeight = Reps.requiresCompletedWeight(set);\n    if (requiresWeight) {\n      if (set.completedWeight == null) {\n        return false;\n      }\n    } else if (!set.isCompleted) {\n      // A no-weight set has no `completedWeight` to gate on, so use `isCompleted` instead - reps typed\n      // but not yet marked done should not count as in-range.\n      return false;\n    }\n    return (\n      (set.weight == null || (set.completedWeight != null && Weight.gte(set.completedWeight, set.weight))) &&\n      (set.minReps != null ? set.completedReps >= set.minReps : set.reps == null || set.completedReps >= set.reps)\n    );\n  }\n\n  export function isStarted(sets: ISet[]): boolean {\n    return sets.length > 0 && sets.some((s) => isFinishedSet(s));\n  }\n\n  export function isFinished(sets: ISet[]): boolean {\n    return sets.length > 0 && sets.every((s) => isFinishedSet(s));\n  }\n\n  export function isEmptyOrFinished(sets: ISet[]): boolean {\n    return sets.length === 0 || Reps.isFinished(sets);\n  }\n\n  export function isFinishedSet(s: ISet): boolean {\n    return !!s.isCompleted;\n  }\n\n  export function toKey(set: ISet): string {\n    return `${Weight.printNull(set.weight)}-${Weight.printNull(set.completedWeight)}-${set.reps}-${set.minReps}-${set.isAmrap}-${set.rpe}-${set.askWeight}-${set.completedReps}-${set.completedRepsLeft}-${set.completedRpe}-${set.isCompleted}`;\n  }\n\n  export function isInRangeCompleted(sets: ISet[]): boolean {\n    return sets.some((s) => s.minReps != null) && sets.every((s) => Reps.isInRangeCompletedSet(s));\n  }\n\n  export function enforceCompletedSet(set: ISet): ISet {\n    const requiresWeight = Reps.requiresCompletedWeight(set);\n    const hasRequiredData = set.completedReps != null && (!requiresWeight || set.completedWeight != null);\n    return {\n      ...set,\n      isCompleted: hasRequiredData ? !!set.isCompleted : false,\n    };\n  }\n\n  export function maxUnilateralCompletedReps(set: ISet): number | undefined {\n    if (set.isUnilateral) {\n      return Math.max(set.completedReps ?? 0, set.completedRepsLeft ?? 0);\n    } else {\n      return set.completedReps;\n    }\n  }\n\n  export function avgUnilateralCompletedReps(set: ISet): number | undefined {\n    if (set.isUnilateral) {\n      return Math.round(((set.completedReps ?? 0) + (set.completedRepsLeft ?? 0)) / 2);\n    } else {\n      return set.completedReps;\n    }\n  }\n\n  export function setVolume(set: ISet, unit: IUnit): IWeight {\n    const totalReps =\n      set.isUnilateral || set.completedRepsLeft != null\n        ? (set.completedReps ?? 0) + (set.completedRepsLeft ?? 0)\n        : (set.completedReps ?? 0);\n    return Weight.multiply(set.completedWeight ?? set.weight ?? Weight.build(0, unit), totalReps);\n  }\n\n  export function group(sets: ISet[], isNext?: boolean): ISet[][] {\n    return sets.reduce<ISet[][]>(\n      (memo, set) => {\n        let lastGroup = memo[memo.length - 1];\n        const last = lastGroup[lastGroup.length - 1];\n        if (\n          last != null &&\n          (!Weight.eqNull(last.weight, set.weight) ||\n            last.reps !== set.reps ||\n            last.minReps !== set.minReps ||\n            last.completedReps !== set.completedReps ||\n            last.completedRepsLeft !== set.completedRepsLeft ||\n            !Weight.eqNull(last.completedWeight, set.completedWeight) ||\n            last.askWeight !== set.askWeight ||\n            (isNext && last.isAmrap !== set.isAmrap) ||\n            last.rpe !== set.rpe ||\n            last.completedRpe !== set.completedRpe ||\n            last.setTimer !== set.setTimer ||\n            last.isOverflowSetTimer !== set.isOverflowSetTimer)\n        ) {\n          memo.push([]);\n          lastGroup = memo[memo.length - 1];\n        }\n        lastGroup.push(set);\n        return memo;\n      },\n      [[]]\n    );\n  }\n\n  export function findNextSet(entry: IHistoryEntry): ISet | undefined {\n    return [...entry.warmupSets, ...entry.sets].filter((s) => !s.isCompleted)[0];\n  }\n\n  export function findNextSetIndex(entry: IHistoryEntry): number {\n    return [...entry.warmupSets, ...entry.sets].findIndex((s) => !s.isCompleted);\n  }\n\n  export function findNextEntryAndSet(\n    historyRecord: IHistoryRecord,\n    entryIndex: number,\n    mode: \"workout\" | \"warmup\"\n  ):\n    | {\n        entry: IHistoryEntry;\n        set: ISet;\n      }\n    | undefined {\n    const entry = historyRecord.entries[entryIndex];\n    if (entry == null) {\n      return undefined;\n    }\n    const nextEntry = Progress.getNextEntry(historyRecord, entry, mode, true);\n    if (nextEntry == null) {\n      return undefined;\n    }\n\n    const nextSet = findNextSet(nextEntry);\n    if (nextSet != null) {\n      return { entry: nextEntry, set: nextSet };\n    }\n\n    return undefined;\n  }\n\n  export function findNextEntryAndSetIndex(\n    historyRecord: IHistoryRecord,\n    entryIndex: number,\n    mode: \"workout\" | \"warmup\"\n  ):\n    | {\n        entryIndex: number;\n        setIndex: number;\n      }\n    | undefined {\n    const entry = historyRecord.entries[entryIndex];\n    if (entry == null) {\n      return undefined;\n    }\n    const nextEntry = Progress.getNextEntry(historyRecord, entry, mode, true);\n    if (nextEntry == null) {\n      return undefined;\n    }\n\n    // A block's rounds are indexed only into `sets` (`Block.getSteps` never looks at `warmupSets`, and a\n    // block's round-robin never marks a member's warmup complete). Searching warmups+sets combined, as\n    // `findNextSetIndex` does for the non-block case below, would permanently return the ever-incomplete\n    // warmup instead of the next round, un-completing or mis-targeting a set and corrupting\n    // `Block.getCurrentStep`'s lookup (spec C2, candidate 3). Non-block entries keep the combined search.\n    const nextSet =\n      nextEntry.block != null ? nextEntry.sets.findIndex((s) => !s.isCompleted) : findNextSetIndex(nextEntry);\n\n    return { entryIndex: historyRecord.entries.indexOf(nextEntry), setIndex: nextSet };\n  }\n\n  export function volume(sets: ISet[], unit: IUnit): IWeight {\n    return Weight.convertTo(\n      sets.reduce((memo, set) => Weight.add(memo, Reps.setVolume(set, unit)), Weight.build(0, unit)),\n      unit\n    );\n  }\n}\n","import {\n  IEquipment,\n  IEquipmentData,\n  equipments,\n  IAllEquipment,\n  ISettings,\n  IWeight,\n  IUnit,\n  IExerciseType,\n  IGym,\n  IProgram,\n  IAllCustomExercises,\n} from \"../types\";\nimport { CollectionUtils } from \"../utils/collection\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { UidFactory } from \"../utils/generator\";\nimport { equipmentName, Exercise } from \"./exercise\";\nimport { Weight } from \"./weight\";\nimport { Settings } from \"./settings\";\nimport { Program } from \"./program\";\n\nexport namespace Equipment {\n  export function build(name: string): IEquipmentData {\n    return {\n      vtype: \"equipment_data\",\n      name,\n      multiplier: 1,\n      bar: {\n        lb: Weight.build(0, \"lb\"),\n        kg: Weight.build(0, \"kg\"),\n      },\n      plates: [\n        { weight: Weight.build(10, \"lb\"), num: 4 },\n        { weight: Weight.build(5, \"kg\"), num: 4 },\n      ],\n      fixed: [],\n      isFixed: false,\n    };\n  }\n\n  function plateSet(name: string, multiplier: number, barLb: number, barKg: number): IEquipmentData {\n    return {\n      vtype: \"equipment_data\",\n      name,\n      multiplier,\n      bar: { lb: Weight.build(barLb, \"lb\"), kg: Weight.build(barKg, \"kg\") },\n      plates: [\n        { weight: Weight.build(45, \"lb\"), num: 8 },\n        { weight: Weight.build(25, \"lb\"), num: 4 },\n        { weight: Weight.build(10, \"lb\"), num: 4 },\n        { weight: Weight.build(5, \"lb\"), num: 4 },\n        { weight: Weight.build(2.5, \"lb\"), num: 4 },\n        { weight: Weight.build(1.25, \"lb\"), num: 2 },\n        { weight: Weight.build(20, \"kg\"), num: 8 },\n        { weight: Weight.build(10, \"kg\"), num: 4 },\n        { weight: Weight.build(5, \"kg\"), num: 4 },\n        { weight: Weight.build(2.5, \"kg\"), num: 4 },\n        { weight: Weight.build(1.25, \"kg\"), num: 4 },\n        { weight: Weight.build(0.5, \"kg\"), num: 2 },\n      ],\n      fixed: [],\n      isFixed: false,\n    };\n  }\n\n  function fixedSet(name: string, lb: number[], kg: number[]): IEquipmentData {\n    return {\n      vtype: \"equipment_data\",\n      name,\n      multiplier: 1,\n      bar: { lb: Weight.build(0, \"lb\"), kg: Weight.build(0, \"kg\") },\n      plates: [],\n      fixed: [...lb.map((w) => Weight.build(w, \"lb\")), ...kg.map((w) => Weight.build(w, \"kg\"))],\n      isFixed: true,\n    };\n  }\n\n  // The choices for the equipment of a custom exercise: the set types without `isDeleted`, with their names.\n  export function exerciseChoices(set: IAllEquipment): Record<string, string> {\n    const result: Record<string, string> = {};\n    for (const id of Object.keys(set)) {\n      const entry = set[id];\n      if (entry != null && !entry.isDeleted) {\n        result[id] = entry.name || equipmentName(id);\n      }\n    }\n    return result;\n  }\n\n  // The choices, plus the type that the exercise has now (it can be a type that the trainer deleted).\n  export function exerciseChoicesFor(set: IAllEquipment, current: string | undefined): Record<string, string> {\n    const result = exerciseChoices(set);\n    if (current != null && result[current] == null) {\n      result[current] = set[current]?.name || equipmentName(current);\n    }\n    return result;\n  }\n\n  // The choices of the exercise form. Only a new exercise gets them: after the first save, a change of the equipment\n  // would move the key of the exercise.\n  export function exerciseFormChoices(\n    set: IAllEquipment,\n    exercise: { id: string; defaultEquipment?: string },\n    savedExercises: IAllCustomExercises\n  ): Record<string, string> | undefined {\n    return savedExercises[exercise.id] == null ? exerciseChoicesFor(set, exercise.defaultEquipment) : undefined;\n  }\n\n  // The set that a trainer has before the first save: the defaults of a new gym plus more common types.\n  // It has no \"bodyweight\". It gives a new object on each call.\n  export function starterSet(): IAllEquipment {\n    return {\n      ...Settings.defaultEquipment(),\n      trapbar: plateSet(\"Trap Bar\", 2, 45, 20),\n      leverageMachine: plateSet(\"Leverage Machine\", 1, 0, 0),\n      smith: plateSet(\"Smith Machine\", 2, 45, 20),\n      ezbar: plateSet(\"EZ Bar\", 2, 20, 10),\n      cable: {\n        vtype: \"equipment_data\",\n        name: \"Cable\",\n        multiplier: 1,\n        bar: { lb: Weight.build(0, \"lb\"), kg: Weight.build(0, \"kg\") },\n        plates: [\n          { weight: Weight.build(10, \"lb\"), num: 20 },\n          { weight: Weight.build(5, \"lb\"), num: 10 },\n          { weight: Weight.build(5, \"kg\"), num: 20 },\n          { weight: Weight.build(2.5, \"kg\"), num: 10 },\n        ],\n        fixed: [],\n        isFixed: false,\n      },\n      band: fixedSet(\"Band\", [10, 20, 30, 40, 50], [5, 10, 15, 20, 25]),\n      medicineball: fixedSet(\"Medicine Ball\", [4, 6, 8, 10, 12, 15, 20], [2, 3, 4, 5, 6, 8, 10]),\n    };\n  }\n\n  // The types of a trainer set that a list shows: the ones without `isDeleted`.\n  export function visibleTypes(set: IAllEquipment): [string, IEquipmentData][] {\n    const result: [string, IEquipmentData][] = [];\n    for (const [key, value] of Object.entries(set)) {\n      if (value != null && !value.isDeleted) {\n        result.push([key, value]);\n      }\n    }\n    return result;\n  }\n\n  // Adds a new type to a trainer set. The id is random, has only letters (no \"_\"), and is not in the set.\n  export function addTypeToSet(set: IAllEquipment, name: string): { set: IAllEquipment; id: string } {\n    let id = UidFactory.generateUid(8);\n    while (Object.hasOwn(set, id) || id in Object.prototype) {\n      id = UidFactory.generateUid(8);\n    }\n    return { set: { ...set, [id]: build(name) }, id };\n  }\n\n  // The gym of a new client: the given gym with a copy of the visible types of the trainer set.\n  export function gymFromSet(gym: IGym, set: IAllEquipment): IGym {\n    const equipment: IAllEquipment = {};\n    for (const [key, value] of visibleTypes(set)) {\n      equipment[key] = ObjectUtils.clone(value);\n    }\n    return { ...gym, equipment };\n  }\n\n  // A delete keeps the values and sets `isDeleted`, so a custom exercise that uses the type can still copy them.\n  export function deleteTypeFromSet(set: IAllEquipment, id: string): IAllEquipment {\n    const entry = set[id];\n    if (entry == null) {\n      return set;\n    }\n    return { ...set, [id]: { ...entry, isDeleted: true } };\n  }\n\n  export interface IEquipmentRow {\n    id: string;\n    exercises: string[];\n  }\n\n  // The equipment IDs that a program uses, with the names of the exercises. It skips `bodyweight` and empty.\n  // It gives `{ error }` with the day numbers when the program cannot be evaluated.\n  function usedEquipment(\n    program: IProgram,\n    settings: ISettings\n  ): { used: Map<string, string[]> } | { error: { days: number[] } } {\n    let evaluated;\n    try {\n      evaluated = Program.evaluate(program, settings);\n    } catch (e) {\n      return { error: { days: [] } };\n    }\n    if (evaluated.errors.length > 0) {\n      return { error: { days: evaluated.errors.map((e) => e.dayData.day) } };\n    }\n    const used = new Map<string, string[]>();\n    for (const programExercise of Program.getAllProgramExercises(evaluated)) {\n      const id = getEquipmentIdForExerciseType(settings, programExercise.exerciseType);\n      if (id == null || id === \"\" || id === \"bodyweight\") {\n        continue;\n      }\n      const names = used.get(id) ?? [];\n      const name = Exercise.printedName(programExercise.name, programExercise.exerciseType, settings);\n      if (!names.includes(name)) {\n        names.push(name);\n      }\n      used.set(id, names);\n    }\n    return { used };\n  }\n\n  // The equipment of a program that the current gym does not have (`missing`) or has hidden (`hidden`).\n  // With `baseProgram`, it leaves out the IDs that the base program uses. A base that cannot be evaluated\n  // uses nothing. It gives `{ error }` when the program cannot be evaluated.\n  export function findMissing(\n    program: IProgram,\n    settings: ISettings,\n    baseProgram?: IProgram\n  ): { missing: IEquipmentRow[]; hidden: IEquipmentRow[] } | { error: { days: number[] } } {\n    const result = usedEquipment(program, settings);\n    if (\"error\" in result) {\n      return result;\n    }\n    const baseResult = baseProgram != null ? usedEquipment(baseProgram, settings) : undefined;\n    const baseIds = baseResult != null && \"used\" in baseResult ? baseResult.used : new Map<string, string[]>();\n    const gymEquipment = getCurrentGym(settings).equipment;\n    const missing: IEquipmentRow[] = [];\n    const hidden: IEquipmentRow[] = [];\n    for (const [id, exercises] of result.used) {\n      if (baseIds.has(id)) {\n        continue;\n      }\n      const entry = Object.hasOwn(gymEquipment, id) ? gymEquipment[id] : undefined;\n      if (entry == null) {\n        missing.push({ id, exercises });\n      } else if (entry.isDeleted) {\n        hidden.push({ id, exercises });\n      }\n    }\n    return { missing, hidden };\n  }\n\n  // The values to add to a client gym for a missing type: the trainer set entry (also a deleted one) without\n  // `isDeleted`, else the starter set entry, else a new entry.\n  export function valuesToAdd(id: string, trainerSet: IAllEquipment): IEquipmentData {\n    const entry = Object.hasOwn(trainerSet, id) ? trainerSet[id] : undefined;\n    if (entry != null) {\n      const { isDeleted, ...rest } = ObjectUtils.clone(entry);\n      return rest;\n    }\n    const starter = Object.hasOwn(starterSet(), id) ? starterSet()[id] : undefined;\n    return starter != null ? starter : build(equipmentName(id));\n  }\n\n  export interface IAddableType {\n    id: string;\n    name: string;\n    values: IEquipmentData;\n    // The client has the type with `isDeleted`. The trainer cannot add it again.\n    hidden: boolean;\n  }\n\n  // The visible types of the trainer set that a client gym does not have. A type that the gym has hidden is in the\n  // list with `hidden`. A type that the gym has is not in the list.\n  export function addableFromSet(trainerSet: IAllEquipment, gymEquipment: IAllEquipment): IAddableType[] {\n    const result: IAddableType[] = [];\n    for (const [id] of visibleTypes(trainerSet)) {\n      const entry = Object.hasOwn(gymEquipment, id) ? gymEquipment[id] : undefined;\n      if (entry != null && !entry.isDeleted) {\n        continue;\n      }\n      const values = valuesToAdd(id, trainerSet);\n      result.push({ id, name: values.name || equipmentName(id), values, hidden: entry != null });\n    }\n    return result;\n  }\n\n  export function getCurrentGym(settings: ISettings): IGym {\n    return settings.gyms[0];\n  }\n\n  export function getEquipmentIdForExerciseType(settings: ISettings, exerciseType?: IExerciseType): string | undefined {\n    if (exerciseType == null) {\n      return undefined;\n    }\n\n    const exerciseEquipment = settings.exerciseData[Exercise.toKey(exerciseType)]?.equipment;\n    if (exerciseEquipment != null) {\n      // A per-exercise map always wins, also an empty one (a saved \"None\" is an empty map after JSON).\n      return exerciseEquipment[getCurrentGym(settings).id];\n    }\n    // A stored type can have no equipment. The lookup then reads the equipment of the default variation.\n    return Exercise.resolveType(exerciseType, settings.exercises ?? {}).equipment;\n  }\n\n  export function getEquipmentNameForExerciseType(\n    settings: ISettings,\n    exerciseType?: IExerciseType\n  ): string | undefined {\n    const equipment = getEquipmentIdForExerciseType(settings, exerciseType);\n    if (equipment == null) {\n      return undefined;\n    }\n    const currentGym = getCurrentGym(settings);\n    const gymEquipment = currentGym.equipment[equipment];\n    if (gymEquipment == null || gymEquipment.isDeleted) {\n      return undefined;\n    }\n    const name = gymEquipment.name;\n    return name || equipmentName(equipment);\n  }\n\n  export function getEquipmentDataForExerciseType(\n    settings: ISettings,\n    exerciseType?: IExerciseType\n  ): IEquipmentData | undefined {\n    const equipment = getEquipmentIdForExerciseType(settings, exerciseType);\n    const currentGym = getCurrentGym(settings);\n    return equipment ? currentGym.equipment[equipment] : undefined;\n  }\n\n  // Fixed weights (dumbbells, bands) have no sides, so they have no plates per side.\n  export function hasPlatesPerSide(settings: ISettings, exerciseType?: IExerciseType): boolean {\n    return !(getEquipmentDataForExerciseType(settings, exerciseType)?.isFixed ?? false);\n  }\n\n  export function getUnitOrDefaultForExerciseType(settings: ISettings, exerciseType?: IExerciseType): IUnit {\n    const equipment = getEquipmentDataForExerciseType(settings, exerciseType);\n    return equipment?.unit ?? settings.units;\n  }\n\n  export function getUnitForExerciseType(settings: ISettings, exerciseType?: IExerciseType): IUnit | undefined {\n    const equipment = getEquipmentDataForExerciseType(settings, exerciseType);\n    const equipmentUnit = equipment?.unit;\n    return equipmentUnit == null || equipmentUnit === settings.units ? undefined : equipmentUnit;\n  }\n\n  export function getEquipmentData(settings: ISettings, key: string): IEquipmentData | undefined {\n    return currentEquipment(settings)?.[key];\n  }\n\n  export function currentEquipment(settings: ISettings): IAllEquipment {\n    return getCurrentGym(settings)?.equipment;\n  }\n\n  export function smallestPlate(equipmentData: IEquipmentData, unit: IUnit): IWeight {\n    return (\n      CollectionUtils.sort(\n        equipmentData.plates.filter((p) => p.weight.unit === unit),\n        (a, b) => Weight.compare(a.weight, b.weight)\n      )[0]?.weight || Weight.build(1, unit)\n    );\n  }\n\n  export function mergeEquipment(\n    oldEquipment: { [key in IEquipment]?: IEquipmentData },\n    newEquipment: { [key in IEquipment]?: IEquipmentData }\n  ): { [key in IEquipment]?: IEquipmentData } {\n    const newKeys = Array.from(new Set([...ObjectUtils.keys(newEquipment), ...ObjectUtils.keys(oldEquipment)]));\n    return newKeys.reduce<{ [key in IEquipment]?: IEquipmentData }>((acc, name) => {\n      const newEquipmentData = newEquipment[name];\n      const oldEquipmentData = oldEquipment[name];\n      if (newEquipmentData != null && oldEquipmentData == null) {\n        acc[name] = newEquipmentData;\n      } else if (newEquipmentData == null && oldEquipmentData != null) {\n        acc[name] = oldEquipmentData;\n      } else if (newEquipmentData != null && oldEquipmentData != null) {\n        acc[name] = {\n          ...oldEquipmentData,\n          bar: newEquipmentData.bar,\n          isFixed: newEquipmentData.isFixed,\n          plates: CollectionUtils.concatBy(\n            oldEquipmentData.plates,\n            newEquipmentData.plates,\n            (el) => `${el.weight.value}${el.weight.unit}`\n          ),\n          multiplier: newEquipmentData.multiplier,\n          fixed: CollectionUtils.concatBy(\n            oldEquipmentData.fixed,\n            newEquipmentData.fixed,\n            (el) => `${el.value}${el.unit}`\n          ),\n        };\n      }\n      return acc;\n    }, {});\n  }\n\n  export function equipmentKeyByName(name: string, equipmentSettings?: IAllEquipment): string | undefined {\n    const builtInEquipmentKey = equipments.find((eq) => eq === name.toLowerCase());\n    if (builtInEquipmentKey) {\n      return builtInEquipmentKey;\n    }\n\n    const builtInEquipmentName = equipments.find((eq) => equipmentName(eq).toLowerCase() === name.toLowerCase());\n    if (builtInEquipmentName) {\n      return builtInEquipmentName;\n    }\n\n    const customEquipmentKey = ObjectUtils.keys(equipmentSettings || {}).find((eq) => {\n      return equipmentName(eq).toLowerCase() === name.toLowerCase();\n    });\n    return customEquipmentKey;\n  }\n}\n","import { IStorage } from \"@shared/types\";\nimport { DateUtils } from \"@shared/utils/date\";\nimport { Exporter } from \"../utils/exporter\";\n\nexport namespace ImportExporter {\n  export function exportStorage(storage: IStorage): void {\n    Exporter.toFile(`liftosaur-${DateUtils.formatYYYYMMDD(Date.now())}.json`, JSON.stringify(storage, null, 2));\n  }\n}\n","import { JSX } from \"preact\";\nimport { useState, useEffect } from \"preact/hooks\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\n\ninterface IMagicLinkFormProps {\n  onSendMagicLink: (email: string) => Promise<void>;\n  onPasswordLogin?: (email: string) => void;\n  onBack: () => void;\n  isTrainerLogin?: boolean;\n  initialEmail?: string;\n}\n\nexport function MagicLinkForm(props: IMagicLinkFormProps): JSX.Element {\n  const [email, setEmail] = useState(props.initialEmail ?? \"\");\n  const [isLoading, setIsLoading] = useState(false);\n  const [error, setError] = useState<string | undefined>(undefined);\n  const [hasSent, setHasSent] = useState(false);\n  const [countdown, setCountdown] = useState(0);\n\n  useEffect(() => {\n    if (countdown <= 0) {\n      return undefined;\n    }\n    const timer = setTimeout(() => {\n      setCountdown(countdown - 1);\n    }, 1000);\n    return () => clearTimeout(timer);\n  }, [countdown]);\n\n  const handleSubmit = async (e: Event): Promise<void> => {\n    e.preventDefault();\n    setError(undefined);\n    setIsLoading(true);\n    try {\n      await props.onSendMagicLink(email);\n      // const baseMessage = \"If you have an existing account, your magic link has been sent!\\nCheck your email to sign in.\";\n      // const inviteMessage = \"\\n\\nIf you don't have an account, you need to be invited by Kurtis first.\";\n      // setSuccessMessage(props.isTrainerLogin ? baseMessage : baseMessage + inviteMessage);\n      setHasSent(true);\n      setCountdown(60);\n      setIsLoading(false);\n    } catch (err) {\n      setError(err instanceof Error ? err.message : \"Failed to send magic link\");\n      setIsLoading(false);\n    }\n  };\n\n  return (\n    <div>\n      <h2 className=\"mb-4 text-lg font-bold text-center\">Sign In with Magic Link</h2>\n      {isLoading ? (\n        <div className=\"my-4 text-center\">\n          <IconSpinner width={48} height={48} />\n        </div>\n      ) : (\n        <form onSubmit={handleSubmit}>\n          <div className=\"mb-4\">\n            <Input\n              label=\"Email\"\n              type=\"email\"\n              identifier=\"magic-link-email\"\n              isLabelOutside={true}\n              required={true}\n              requiredMessage=\"Email is required\"\n              value={email}\n              changeType=\"oninput\"\n              changeHandler={(result) => {\n                if (result.success) {\n                  setEmail(result.data);\n                }\n              }}\n              placeholder=\"your@email.com\"\n            />\n          </div>\n          {/* {successMessage && (\n            <div className=\"mb-4 text-sm text-center text-text-purple\" data-cy=\"magic-link-success\">\n              {successMessage.split(\"\\n\").map((line, index) => (\n                <Fragment key={index}>\n                  {index > 0 && <br />}\n                  {line}\n                </Fragment>\n              ))}\n            </div>\n          )} */}\n          {error && (\n            <div className=\"mb-4 text-sm text-center text-text-error\" data-cy=\"magic-link-error\">\n              {error}\n            </div>\n          )}\n          <div className=\"mb-4 text-center\">\n            <Button\n              name=\"magic-link-submit\"\n              kind=\"purple\"\n              type=\"submit\"\n              data-cy=\"magic-link-submit\"\n              disabled={!email || countdown > 0}\n            >\n              {hasSent ? (countdown > 0 ? `Resend in ${countdown}s` : \"Resend Magic Link\") : \"Send Magic Link\"}\n            </Button>\n          </div>\n          {/* {!hasSent && (\n            <div className=\"mb-4 text-xs text-center text-text-secondary\">\n              We'll send you an email with a link to sign in instantly. No password needed!\n            </div>\n          )} */}\n          {props.onPasswordLogin && (\n            <div className=\"mb-4 text-center\">\n              <button\n                type=\"button\"\n                className=\"text-sm text-text-purple hover:underline\"\n                onClick={() => props.onPasswordLogin!(email)}\n                data-cy=\"magic-link-password-option\"\n              >\n                OR sign in with your password\n              </button>\n            </div>\n          )}\n          <div className=\"mt-4 text-center\">\n            <Button\n              name=\"magic-link-back\"\n              kind=\"grayv2\"\n              buttonSize=\"md\"\n              onClick={props.onBack}\n              data-cy=\"magic-link-back\"\n            >\n              Back\n            </Button>\n          </div>\n        </form>\n      )}\n    </div>\n  );\n}\n","declare global {\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  interface Window {\n    JSAndroidBridge?: {\n      sendMessage: (message: string) => void;\n    };\n    webkit?: {\n      messageHandlers?: {\n        liftosaurMessage?: {\n          postMessage: (message: Record<string, string | undefined>) => void;\n        };\n      };\n    };\n  }\n}\n\nlet receiveMessage: ((event: MessageEvent) => void) | undefined;\n\nexport namespace SendMessage {\n  export function iosAppVersion(): number {\n    return parseInt(window.lftIosAppVersion || \"0\", 10);\n  }\n\n  export function iosVersion(): number {\n    return parseInt(window.lftIosVersion || \"0\", 10);\n  }\n\n  export function androidAppVersion(): number {\n    return parseInt(window.lftAndroidAppVersion || \"0\", 10);\n  }\n\n  export function print(message: string): void {\n    toIosAndAndroid({ type: \"print\", value: message });\n  }\n\n  export function androidVersion(): number {\n    return parseInt(window.lftAndroidVersion?.toString() || \"0\", 10);\n  }\n\n  export function isIosOrAndroid(): boolean {\n    return isIos() || isAndroid();\n  }\n\n  export function isIos(): boolean {\n    return (\n      typeof window !== \"undefined\" &&\n      !!(window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.liftosaurMessage)\n    );\n  }\n\n  export function toIosWithResult<T>(obj: Record<string, string | undefined>): Promise<T | undefined> {\n    if (!SendMessage.isIos()) {\n      return Promise.resolve(undefined);\n    }\n    return new Promise((resolve) => {\n      toIos(obj);\n      if (receiveMessage != null) {\n        window.removeEventListener(\"message\", receiveMessage);\n      }\n      receiveMessage = (event) => {\n        if (event.data?.type === \"iosResponse\") {\n          if (receiveMessage != null) {\n            window.removeEventListener(\"message\", receiveMessage);\n            receiveMessage = undefined;\n          }\n          resolve(event.data);\n        }\n      };\n      window.addEventListener(\"message\", receiveMessage);\n    });\n  }\n\n  export function toAndroidWithResult<T>(obj: Record<string, string | undefined>): Promise<T | undefined> {\n    if (!SendMessage.isAndroid()) {\n      return Promise.resolve(undefined);\n    }\n    return new Promise((resolve) => {\n      toAndroid(obj);\n      if (receiveMessage != null) {\n        window.removeEventListener(\"message\", receiveMessage);\n      }\n      receiveMessage = (event) => {\n        if (event.data?.type === \"androidResponse\") {\n          if (receiveMessage != null) {\n            window.removeEventListener(\"message\", receiveMessage);\n            receiveMessage = undefined;\n          }\n          resolve(event.data);\n        }\n      };\n      window.addEventListener(\"message\", receiveMessage);\n    });\n  }\n\n  export function toIosAndAndroid(obj: Record<string, string | undefined>): boolean {\n    const toIosResult = toIos(obj);\n    const toAndroidResult = toAndroid(obj);\n    return toIosResult || toAndroidResult;\n  }\n\n  export function toIosAndAndroidWithResult<T>(obj: Record<string, string | undefined>): Promise<T | undefined> {\n    if (SendMessage.isIos()) {\n      return toIosWithResult(obj);\n    } else if (SendMessage.isAndroid()) {\n      return toAndroidWithResult(obj);\n    } else {\n      return Promise.resolve(undefined);\n    }\n  }\n\n  export function toIos(obj: Record<string, string | undefined>): boolean {\n    if (\n      typeof window !== \"undefined\" &&\n      window.webkit &&\n      window.webkit.messageHandlers &&\n      window.webkit.messageHandlers.liftosaurMessage\n    ) {\n      window.webkit.messageHandlers.liftosaurMessage.postMessage(obj);\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  export function toAndroid(obj: Record<string, string | undefined>): boolean {\n    if (typeof window !== \"undefined\" && window.JSAndroidBridge) {\n      window.JSAndroidBridge.sendMessage(JSON.stringify(obj));\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  export function isAndroid(): boolean {\n    return typeof window !== \"undefined\" && !!window.JSAndroidBridge;\n  }\n}\n","import { JSX } from \"preact\";\nimport { useState } from \"preact/hooks\";\nimport { IconHamburger } from \"./icons/iconHamburger\";\nimport { Account } from \"./account\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { BottomSheet } from \"./bottomSheet\";\nimport { IconUser } from \"./icons/iconUser\";\nimport { IAccount } from \"@shared/models/account\";\nimport { Modal } from \"./modal\";\nimport { Service } from \"../api/service\";\n\nexport function TopNavMenu(props: {\n  client: Window[\"fetch\"];\n  mobileRight?: JSX.Element;\n  maxWidth: number;\n  current?: string;\n  account?: IAccount;\n  appUrl?: string;\n  isTrainer?: boolean;\n  trainerEmail?: string;\n}): JSX.Element {\n  const [isMenuOpen, setIsMenuOpen] = useState(false);\n  const [isAccountModalOpen, setIsAccountModalOpen] = useState(false);\n  const service = new Service(props.client);\n\n  return (\n    <nav class=\"w-full mx-auto px-2 my-10\" style={{ maxWidth: `${props.maxWidth}px` }}>\n      <div class=\"flex items-center\">\n        <div className=\"flex items-center w-full mr-2 md:hidden\">\n          <div>\n            <button className=\"p-2 align-middle nm-navbar-hamburger\" onClick={() => setIsMenuOpen(true)}>\n              <IconHamburger />\n            </button>\n          </div>\n          <div>\n            <a href=\"/\" class=\"text-text-primary align-middle no-underline ml-3\">\n              <img\n                className=\"inline align-middle\"\n                style={{ width: \"3.5em\", height: \"3.5em\" }}\n                src=\"/images/pandalogo.svg\"\n                alt=\"TrainWithKurtis logo\"\n              />\n            </a>\n          </div>\n          <div className=\"flex-1 ml-4 text-2xl font-bold align-middle sm:text-3xl\">Train with Kurtis</div>\n          <button onClick={() => setIsAccountModalOpen(true)} className=\"p-2 ml-auto\">\n            <IconUser\n              size={22}\n              color={props.account || props.isTrainer ? \"var(--color-icon-green)\" : \"var(--color-icon-red)\"}\n            />\n          </button>\n          {props.mobileRight && <div className=\"ml-2\">{props.mobileRight}</div>}\n        </div>\n        {isMenuOpen && (\n          <BottomSheet isHidden={!isMenuOpen} onClose={() => setIsMenuOpen(false)}>\n            <div className=\"p-4\">\n              <MenuItemWrapper\n                name=\"Account\"\n                onClick={() => {\n                  setIsMenuOpen(false);\n                  setIsAccountModalOpen(true);\n                }}\n              >\n                <span\n                  className={`inline-block py-4 ${props.account || props.isTrainer ? \"text-text-success\" : \"text-text-error\"}`}\n                >\n                  Account\n                </span>\n              </MenuItemWrapper>\n              {getMenuItemsList(!!props.account, props.appUrl).map(([text, link]) => {\n                return (\n                  <MenuItemWrapper name={text}>\n                    {props.current === link ? (\n                      <span className=\"inline-block py-4 font-bold\">{text}</span>\n                    ) : (\n                      <a className=\"inline-block py-4\" href={link}>\n                        {text}\n                      </a>\n                    )}\n                  </MenuItemWrapper>\n                );\n              })}\n              <ul className=\"mt-4 text-center align-middle list-none\">\n                <SocialIcons />\n              </ul>\n            </div>\n          </BottomSheet>\n        )}\n        <div className=\"items-center flex-1 hidden md:flex\">\n          <div>\n            <a href=\"/\" class=\"text-text-primary no-underline\">\n              <img\n                className=\"inline align-middle\"\n                style={{ width: \"5em\", height: \"5em\" }}\n                src=\"/images/pandalogo.svg\"\n                alt=\"TrainWithKurtis logo\"\n              />\n            </a>\n          </div>\n          <div className=\"flex items-center flex-1\">\n            <ul className=\"flex flex-wrap flex-1 ml-2 font-bold align-middle list-none\">\n              {getMenuItemsList(!!props.account, props.appUrl).map(([text, link]) => {\n                return (\n                  <li className=\"inline-block py-1 mx-4 align-middle list-none\">\n                    {props.current === link ? (\n                      <strong className=\"text-icon-yellow\">{text}</strong>\n                    ) : (\n                      <a className=\"cursor-pointer\" href={link}>\n                        {text}\n                      </a>\n                    )}\n                  </li>\n                );\n              })}\n            </ul>\n            <div className=\"flex items-center justify-center ml-4\">\n              <ul className=\"flex list-none\">\n                <SocialIcons />\n              </ul>\n              <div className=\"mx-3 bg-background-darkgray\" style={{ width: \"1px\", height: \"2rem\" }} />\n              <div className=\"inline-block leading-5 align-middle list-none\">\n                <button onClick={() => setIsAccountModalOpen(true)} className=\"p-3\">\n                  <IconUser\n                    size={22}\n                    color={props.account || props.isTrainer ? \"var(--color-icon-green)\" : \"var(--color-icon-red)\"}\n                  />\n                </button>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      {isAccountModalOpen && (\n        <ModalAccount\n          account={props.account}\n          trainerEmail={props.trainerEmail}\n          service={service}\n          onClose={() => setIsAccountModalOpen(false)}\n        />\n      )}\n    </nav>\n  );\n}\n\nfunction getMenuItemsList(isLoggedIn: boolean, appUrl?: string): readonly (readonly [string, string])[] {\n  const items: (readonly [string, string])[] = [[\"About\", \"/\"]];\n  if (appUrl != null) {\n    items.push([\"App\", appUrl]);\n  }\n  return items;\n}\n\nfunction SocialIcons(): JSX.Element {\n  return (\n    <li className=\"inline-block list-none md:block\">\n      <a\n        href=\"mailto:support@trainwithkurtis.com\"\n        style={{\n          textIndent: \"9999px\",\n          backgroundPosition: \"50%\",\n          backgroundSize: \"60%\",\n          backgroundImage: `url(/images/logo-email.svg)`,\n        }}\n        className=\"inline-block w-10 h-10 px-2 mx-1 overflow-hidden align-middle bg-no-repeat\"\n      >\n        <span>Email</span>\n      </a>\n    </li>\n  );\n}\n\ninterface IModalAccountProps {\n  account?: IAccount;\n  trainerEmail?: string;\n  service: Service;\n  onClose: () => void;\n}\n\nfunction ModalAccount(props: IModalAccountProps): JSX.Element {\n  return (\n    <Modal onClose={props.onClose} shouldShowClose={true}>\n      <Account account={props.account} trainerEmail={props.trainerEmail} client={props.service.client} />\n    </Modal>\n  );\n}\n","\"use strict\";\n/**\n * ```ts\n * interface Separated<E, A> {\n *    readonly left: E\n *    readonly right: A\n * }\n * ```\n *\n * Represents a result of separating a whole into two parts.\n *\n * @since 2.10.0\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.right = exports.left = exports.flap = exports.Functor = exports.Bifunctor = exports.URI = exports.bimap = exports.mapLeft = exports.map = exports.separated = void 0;\nvar function_1 = require(\"./function\");\nvar Functor_1 = require(\"./Functor\");\n// -------------------------------------------------------------------------------------\n// constructors\n// -------------------------------------------------------------------------------------\n/**\n * @category constructors\n * @since 2.10.0\n */\nvar separated = function (left, right) { return ({ left: left, right: right }); };\nexports.separated = separated;\nvar _map = function (fa, f) { return (0, function_1.pipe)(fa, (0, exports.map)(f)); };\nvar _mapLeft = function (fa, f) { return (0, function_1.pipe)(fa, (0, exports.mapLeft)(f)); };\nvar _bimap = function (fa, g, f) { return (0, function_1.pipe)(fa, (0, exports.bimap)(g, f)); };\n/**\n * `map` can be used to turn functions `(a: A) => B` into functions `(fa: F<A>) => F<B>` whose argument and return types\n * use the type constructor `F` to represent some computational context.\n *\n * @category mapping\n * @since 2.10.0\n */\nvar map = function (f) {\n    return function (fa) {\n        return (0, exports.separated)((0, exports.left)(fa), f((0, exports.right)(fa)));\n    };\n};\nexports.map = map;\n/**\n * Map a function over the first type argument of a bifunctor.\n *\n * @category error handling\n * @since 2.10.0\n */\nvar mapLeft = function (f) {\n    return function (fa) {\n        return (0, exports.separated)(f((0, exports.left)(fa)), (0, exports.right)(fa));\n    };\n};\nexports.mapLeft = mapLeft;\n/**\n * Map a pair of functions over the two type arguments of the bifunctor.\n *\n * @category mapping\n * @since 2.10.0\n */\nvar bimap = function (f, g) {\n    return function (fa) {\n        return (0, exports.separated)(f((0, exports.left)(fa)), g((0, exports.right)(fa)));\n    };\n};\nexports.bimap = bimap;\n/**\n * @category type lambdas\n * @since 2.10.0\n */\nexports.URI = 'Separated';\n/**\n * @category instances\n * @since 2.10.0\n */\nexports.Bifunctor = {\n    URI: exports.URI,\n    mapLeft: _mapLeft,\n    bimap: _bimap\n};\n/**\n * @category instances\n * @since 2.10.0\n */\nexports.Functor = {\n    URI: exports.URI,\n    map: _map\n};\n/**\n * @category mapping\n * @since 2.10.0\n */\nexports.flap = (0, Functor_1.flap)(exports.Functor);\n// -------------------------------------------------------------------------------------\n// utils\n// -------------------------------------------------------------------------------------\n/**\n * @since 2.10.0\n */\nvar left = function (s) { return s.left; };\nexports.left = left;\n/**\n * @since 2.10.0\n */\nvar right = function (s) { return s.right; };\nexports.right = right;\n","import { JSX } from \"preact\";\nimport { useEffect, useRef, useState } from \"preact/hooks\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { Modal } from \"./modal\";\n\ninterface IEmailRegisterFormProps {\n  onRegister: (email: string, password: string, nickname: string, termsAccepted: boolean) => Promise<void>;\n  showTerms?: boolean;\n  onSignIn: () => void;\n  onBack: () => void;\n  inviteToken?: string;\n  invitedEmail?: string;\n  invitedNickname?: string;\n  // Makes the invited person a client. The form calls it on the first trusted input and on submit if needed.\n  onClaim?: () => Promise<void>;\n  // The person has a pending session already (magic link), so there is nothing to claim.\n  isClaimed?: boolean;\n}\n\nconst CLAIM_EVENTS = [\"pointerdown\", \"touchstart\", \"keydown\"] as const;\n\nexport function EmailRegisterForm(props: IEmailRegisterFormProps): JSX.Element {\n  const [email, setEmail] = useState(props.invitedEmail || \"\");\n  const [nickname, setNickname] = useState(props.invitedNickname || \"\");\n  const [password, setPassword] = useState(\"\");\n  const [confirmPassword, setConfirmPassword] = useState(\"\");\n  const [termsAccepted, setTermsAccepted] = useState(false);\n  const [isTermsOpen, setIsTermsOpen] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n  const [error, setError] = useState<string | undefined>(undefined);\n  const rootRef = useRef<HTMLDivElement>(null);\n  const claimedRef = useRef(!!props.isClaimed);\n  const claimInFlightRef = useRef<Promise<void> | undefined>(undefined);\n  const onClaimRef = useRef(props.onClaim);\n  onClaimRef.current = props.onClaim;\n\n  // Sends the claim once. A failure leaves the claim open, so the next input or the submit tries again.\n  const ensureClaimed = async (): Promise<void> => {\n    const claim = onClaimRef.current;\n    if (claimedRef.current || !claim) {\n      return;\n    }\n    if (!claimInFlightRef.current) {\n      claimInFlightRef.current = claim()\n        .then(() => {\n          claimedRef.current = true;\n        })\n        .finally(() => {\n          claimInFlightRef.current = undefined;\n        });\n    }\n    await claimInFlightRef.current;\n  };\n\n  useEffect(() => {\n    const root = rootRef.current;\n    if (!root || !props.onClaim || claimedRef.current) {\n      return undefined;\n    }\n    // Only a real person input counts. A page load or a script event (mail scanners) sends nothing.\n    const handler = (event: Event): void => {\n      if (!event.isTrusted || claimedRef.current) {\n        return;\n      }\n      ensureClaimed()\n        .then(() => {\n          CLAIM_EVENTS.forEach((name) => root.removeEventListener(name, handler, true));\n        })\n        .catch(() => undefined);\n    };\n    CLAIM_EVENTS.forEach((name) => root.addEventListener(name, handler, true));\n    return () => {\n      CLAIM_EVENTS.forEach((name) => root.removeEventListener(name, handler, true));\n    };\n  }, []);\n\n  const validatePassword = (pwd: string): string | undefined => {\n    if (pwd.length < 8) {\n      return \"Password must be at least 8 characters\";\n    }\n    if (!/\\d/.test(pwd)) {\n      return \"Password must contain at least one number\";\n    }\n    if (new TextEncoder().encode(pwd).length > 72) {\n      return \"Password must be at most 72 bytes long\";\n    }\n    return undefined;\n  };\n\n  const handleSubmit = async (e: Event): Promise<void> => {\n    e.preventDefault();\n    setError(undefined);\n\n    // Validate nickname\n    if (!nickname.trim()) {\n      setError(\"Nickname is required\");\n      return;\n    }\n\n    // Validate password\n    const passwordError = validatePassword(password);\n    if (passwordError) {\n      setError(passwordError);\n      return;\n    }\n\n    // Check passwords match\n    if (password !== confirmPassword) {\n      setError(\"Passwords do not match\");\n      return;\n    }\n\n    setIsLoading(true);\n    try {\n      await ensureClaimed();\n      await props.onRegister(email, password, nickname.trim(), termsAccepted);\n    } catch (err) {\n      setError(err instanceof Error ? err.message : \"Failed to create account\");\n      setIsLoading(false);\n    }\n  };\n\n  return (\n    <div ref={rootRef}>\n      <h2 className=\"mb-4 text-lg font-bold text-center\">\n        {props.onClaim || props.isClaimed ? \"Finish Your Account\" : \"Create Account\"}\n      </h2>\n      {props.invitedEmail && (\n        <div className=\"mb-4 p-3 text-sm text-center bg-background-cardpurple text-text-purple rounded-lg border border-border-cardpurple\">\n          You've been invited to create an account for workout tracking. Sign up to get started.\n        </div>\n      )}\n      {isLoading ? (\n        <div className=\"my-4 text-center\">\n          <IconSpinner width={48} height={48} />\n        </div>\n      ) : (\n        <form onSubmit={handleSubmit}>\n          {props.invitedEmail ? (\n            <div className=\"mb-4\">\n              <div className=\"text-sm font-semibold\">Email</div>\n              <div className=\"text-sm\" data-cy=\"email-register-email-text\">\n                {props.invitedEmail}\n              </div>\n              <div className=\"text-xs text-text-secondary mt-1\">\n                Email cannot be changed. Contact your trainer if you need to use a different email address.\n              </div>\n            </div>\n          ) : (\n            <div className=\"mb-4\">\n              <Input\n                label=\"Email\"\n                type=\"email\"\n                identifier=\"email-register-email\"\n                isLabelOutside={true}\n                required={true}\n                requiredMessage=\"Email is required\"\n                value={email}\n                changeType=\"oninput\"\n                changeHandler={(result) => {\n                  if (result.success) {\n                    setEmail(result.data);\n                  }\n                }}\n                placeholder=\"your@email.com\"\n              />\n            </div>\n          )}\n          <div className=\"mb-4\">\n            <Input\n              label=\"Nickname *\"\n              type=\"text\"\n              identifier=\"email-register-nickname\"\n              isLabelOutside={true}\n              required={true}\n              requiredMessage=\"Nickname is required\"\n              value={nickname}\n              changeType=\"oninput\"\n              changeHandler={(result) => {\n                if (result.success) {\n                  setNickname(result.data);\n                  setError(undefined);\n                }\n              }}\n              placeholder=\"Your name\"\n            />\n          </div>\n          <div className=\"mb-4\">\n            <Input\n              label=\"Password *\"\n              type=\"password\"\n              identifier=\"email-register-password\"\n              isLabelOutside={true}\n              required={true}\n              requiredMessage=\"Password is required\"\n              value={password}\n              changeType=\"oninput\"\n              changeHandler={(result) => {\n                if (result.success) {\n                  setPassword(result.data);\n                  setError(undefined);\n                }\n              }}\n              placeholder=\"Enter password\"\n            />\n          </div>\n          <div className=\"mb-4\">\n            <Input\n              label=\"Confirm Password *\"\n              type=\"password\"\n              identifier=\"email-register-confirm-password\"\n              isLabelOutside={true}\n              required={true}\n              requiredMessage=\"Please confirm your password\"\n              value={confirmPassword}\n              changeType=\"oninput\"\n              changeHandler={(result) => {\n                if (result.success) {\n                  setConfirmPassword(result.data);\n                  setError(undefined);\n                }\n              }}\n              placeholder=\"Confirm password\"\n            />\n          </div>\n          <div className=\"mb-4 text-xs text-text-secondary\">\n            Password requirements:\n            <ul className=\"ml-4 list-disc\">\n              <li>At least 8 characters</li>\n              <li>At least one number</li>\n            </ul>\n          </div>\n          {props.showTerms && (\n            <div className=\"pt-4 mt-6 mb-6 text-sm border-t border-border-neutral\">\n              <label className=\"flex items-start\">\n                <input\n                  type=\"checkbox\"\n                  className=\"flex-shrink-0 mt-1 checkbox text-text-link\"\n                  data-cy=\"email-register-terms\"\n                  data-testid=\"email-register-terms\"\n                  style={{ borderRadius: \"4px\", marginRight: \"12px\" }}\n                  required={true}\n                  checked={termsAccepted}\n                  onChange={(e) => setTermsAccepted((e.target as HTMLInputElement).checked)}\n                />\n                <span>\n                  I accept the{\" \"}\n                  <button\n                    type=\"button\"\n                    className=\"underline text-text-link\"\n                    data-cy=\"email-register-terms-link\"\n                    onClick={(e) => {\n                      e.preventDefault();\n                      setIsTermsOpen(true);\n                    }}\n                  >\n                    Terms and Conditions\n                  </button>{\" \"}\n                  <span className=\"font-semibold text-text-error\">(required)</span>\n                </span>\n              </label>\n            </div>\n          )}\n          {isTermsOpen && (\n            <Modal\n              name=\"terms\"\n              shouldShowClose={true}\n              isFullWidth={true}\n              isFullHeight={true}\n              noPaddings={true}\n              overflowHidden={true}\n              maxWidth=\"640px\"\n              onClose={() => setIsTermsOpen(false)}\n            >\n              <iframe\n                title=\"Terms and Conditions\"\n                src=\"/terms.html\"\n                className=\"w-full h-full rounded-lg\"\n                data-cy=\"email-register-terms-frame\"\n              />\n            </Modal>\n          )}\n          {error && (\n            <div className=\"mb-4 text-sm text-center text-text-error\" data-cy=\"email-register-error\">\n              {error}\n            </div>\n          )}\n          <div className=\"mb-4 text-center\">\n            <Button\n              name=\"email-register-submit\"\n              kind=\"purple\"\n              type=\"submit\"\n              data-cy=\"email-register-submit\"\n              disabled={!email || !nickname || !password || !confirmPassword || (!!props.showTerms && !termsAccepted)}\n            >\n              Create Account\n            </Button>\n          </div>\n          <div className=\"mt-4 text-center\">\n            <Button\n              name=\"email-register-back\"\n              kind=\"grayv2\"\n              buttonSize=\"md\"\n              onClick={props.onBack}\n              data-cy=\"email-register-back\"\n            >\n              Back\n            </Button>\n          </div>\n        </form>\n      )}\n    </div>\n  );\n}\n","import { IProgram } from \"@shared/types\";\n\nexport const basicBeginnerProgram: IProgram = {\n  vtype: \"program\",\n  weeks: [],\n  author: \"/r/fitness\",\n  clonedAt: 1708563096401,\n  description:\n    \"<div><p>This is a great starting routine for complete beginners.</p><p>It's simple, easy to follow routine, which will introduce you to weight lifting.</p><p>You should run it for ~3 months, and then switch to some other routine, like '5/3/1 for beginners'.</p></div>\",\n  url: \"https://thefitness.wiki/routines/r-fitness-basic-beginner-routine/\",\n  tags: [],\n  exercises: [],\n  name: \"Basic Beginner Routine\",\n  days: [],\n  id: \"basicBeginner\",\n  planner: {\n    vtype: \"planner\",\n    name: \"Basic Beginner Routine\",\n    weeks: [\n      {\n        name: \"Week 1\",\n        days: [\n          {\n            name: \"Workout A\",\n            exerciseText:\n              \"Bent Over Row / 2x5, 1x5+ / 95lb / progress: lp(2.5lb, 1, 0, 10%, 1, 0)\\nBench Press / 2x5, 1x5+ / 45lb / progress: lp(2.5lb, 1, 0, 10%, 1, 0)\\nSquat / 2x5, 1x5+ / 45lb / progress: lp(5lb, 1, 0, 10%, 1, 0)\",\n          },\n          {\n            name: \"Workout B\",\n            exerciseText:\n              \"Chin Up / 2x5, 1x5+ / 0lb / progress: lp(2.5lb, 1, 0, 10%, 1, 0)\\nOverhead Press / 2x5, 1x5+ / 45lb / progress: lp(2.5lb, 1, 0, 10%, 1, 0)\\nDeadlift / 2x5, 1x5+ / 95lb / progress: lp(5lb, 1, 0, 10%, 1, 0)\",\n          },\n          {\n            name: \"Workout A\",\n            exerciseText: \"Bent Over Row / 2x5, 1x5+ / 95lb\\nBench Press / 2x5, 1x5+ / 45lb\\nSquat / 2x5, 1x5+ / 45lb\",\n          },\n        ],\n      },\n      {\n        name: \"Week 2\",\n        days: [\n          {\n            name: \"Workout A\",\n            exerciseText: \"Chin Up / 2x5, 1x5+ / 0lb\\nOverhead Press / 2x5, 1x5+ / 45lb\\nDeadlift / 2x5, 1x5+ / 95lb\",\n          },\n          {\n            name: \"Workout B\",\n            exerciseText: \"Bent Over Row / 2x5, 1x5+ / 95lb\\nBench Press / 2x5, 1x5+ / 45lb\\nSquat / 2x5, 1x5+ / 45lb\",\n          },\n          {\n            name: \"Workout B\",\n            exerciseText: \"Chin Up / 2x5, 1x5+ / 0lb\\nOverhead Press / 2x5, 1x5+ / 45lb\\nDeadlift / 2x5, 1x5+ / 95lb\",\n          },\n        ],\n      },\n    ],\n  },\n  nextDay: 1,\n  isMultiweek: true,\n};\n","import { IPlannerProgram, ISettings, IDayData, IPlannerProgramDay } from \"@shared/types\";\nimport { parser as plannerExerciseParser } from \"./plannerExerciseParser\";\nimport memoize from \"micro-memoize\";\nimport {\n  IPlannerEvalFullResult,\n  IPlannerEvalResult,\n  IPlannerSyntaxPointer,\n  PlannerExerciseEvaluator,\n  PlannerSyntaxError,\n} from \"./plannerExerciseEvaluator\";\nimport {\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseWarmupSet,\n  IProgramExerciseProgress,\n  IProgramExerciseUpdate,\n  IProgramExerciseDescriptions,\n} from \"./models/types\";\nimport { PlannerKey } from \"./plannerKey\";\nimport { ObjectUtils } from \"@shared/utils/object\";\nimport { Weight } from \"@shared/models/weight\";\nimport { PlannerProgram } from \"./models/plannerProgram\";\nimport { ScriptRunner } from \"@shared/parser\";\nimport { Progress } from \"@shared/models/progress\";\nimport { LiftoscriptSyntaxError } from \"@shared/liftoscriptEvaluator\";\nimport { PlannerProgramExercise } from \"./models/plannerProgramExercise\";\nimport { Equipment } from \"@shared/models/equipment\";\n\nexport interface IBlockProblem {\n  rule: number;\n  fullName: string;\n  message: string;\n  point: IPlannerSyntaxPointer;\n}\n\nexport type IByTag<T> = Record<number, T>;\nexport type IByExercise<T> = Record<string, T>;\nexport type IByExerciseWeekDay<T> = Record<string, Record<number, Record<number, T>>>;\nexport type IByWeekDayExercise<T> = Record<number, Record<number, Record<string, T>>>;\n\ninterface IPlannerEvalMetadata {\n  byExerciseWeekDay: IByExerciseWeekDay<IPlannerProgramExercise>;\n  byWeekDayExercise: IByWeekDayExercise<IPlannerProgramExercise>;\n  fullNames: Set<string>;\n  notused: Set<string>;\n  properties: {\n    id: IByExercise<{ property: number[]; dayData: Required<IDayData> }>;\n    progress: IByExercise<{ property: IProgramExerciseProgress; dayData: Required<IDayData> }>;\n    update: IByExercise<{ property: IProgramExerciseUpdate; dayData: Required<IDayData> }>;\n    warmup: IByExercise<{ warmupSets: IPlannerProgramExerciseWarmupSet[]; dayData: Required<IDayData> }>;\n  };\n}\n\nexport class PlannerEvaluator {\n  public static getFirstError(evaluatedWeeks: IPlannerEvalResult[][]): PlannerSyntaxError | undefined {\n    let error: PlannerSyntaxError | undefined;\n    for (const week of evaluatedWeeks) {\n      for (const day of week) {\n        if (!day.success) {\n          error = day.error;\n        }\n      }\n    }\n    return error;\n  }\n\n  private static fillInMetadata(\n    exercise: IPlannerProgramExercise,\n    metadata: IPlannerEvalMetadata,\n    dayData: Required<IDayData>\n  ): void {\n    if (metadata.byWeekDayExercise[dayData.week - 1]?.[dayData.dayInWeek - 1]?.[exercise.key] != null) {\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `Exercise ${exercise.key} is already used in this day. Combine them together, or add a label to separate out.`,\n        exercise.points.fullName\n      );\n    }\n    const tagsProp = exercise.tags;\n    if (tagsProp != null && tagsProp.length > 0) {\n      const existingTags = metadata.properties.id[exercise.key];\n      if (existingTags != null && !ObjectUtils.isEqual(existingTags.property, tagsProp)) {\n        const point = exercise.points.idPoint || exercise.points.fullName;\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `Same property 'id' is specified with different arguments in multiple weeks/days for exercise '${exercise.name}': both in ` +\n            `week ${existingTags.dayData.week + 1}, day ${existingTags.dayData.dayInWeek + 1} ` +\n            `and week ${dayData.week}, day ${dayData.dayInWeek}`,\n          point\n        );\n      }\n      metadata.properties.id[exercise.key] = {\n        property: tagsProp,\n        dayData,\n      };\n    }\n\n    const progressProp = exercise.progress;\n    if (progressProp != null && progressProp.type !== \"none\") {\n      const existingProgress = metadata.properties.progress[exercise.key];\n      if (\n        existingProgress != null &&\n        !PlannerExerciseEvaluator.isEqualProgress(progressProp, existingProgress.property)\n      ) {\n        const point = exercise.points.progressPoint || exercise.points.fullName;\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `Same property 'progress' is specified with different arguments in multiple weeks/days for exercise '${exercise.name}': both in ` +\n            `week ${existingProgress.dayData.week + 1}, day ${existingProgress.dayData.dayInWeek + 1} ` +\n            `and week ${dayData.week}, day ${dayData.dayInWeek}`,\n          point\n        );\n      }\n      metadata.properties.progress[exercise.key] = {\n        property: progressProp,\n        dayData,\n      };\n    }\n\n    const updateProp = exercise.update;\n    if (updateProp != null) {\n      const existingUpdate = metadata.properties.update[exercise.key];\n      if (existingUpdate != null && !PlannerExerciseEvaluator.isEqualUpdate(updateProp, existingUpdate.property)) {\n        const point = exercise.points.updatePoint || exercise.points.fullName;\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `Same property 'update' is specified with different arguments in multiple weeks/days for exercise '${exercise.name}': both in ` +\n            `week ${existingUpdate.dayData.week + 1}, day ${existingUpdate.dayData.dayInWeek + 1} ` +\n            `and week ${dayData.week}, day ${dayData.dayInWeek}`,\n          point\n        );\n      }\n      metadata.properties.update[exercise.key] = {\n        property: updateProp,\n        dayData,\n      };\n    }\n    if (exercise.notused) {\n      metadata.notused.add(exercise.key);\n    }\n    if (exercise.warmupSets != null) {\n      const scheme = JSON.stringify(exercise.warmupSets);\n      const ws = metadata.properties.warmup[exercise.key];\n      if (ws != null && JSON.stringify(ws.warmupSets) !== scheme) {\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `Different warmup sets are specified in multiple weeks/days for exercise '${exercise.name}': both in ` +\n            `week ${ws.dayData.week + 1}, day ${ws.dayData.dayInWeek + 1} ` +\n            `and week ${dayData.week}, day ${dayData.dayInWeek}`,\n          exercise.points.warmupPoint || exercise.points.fullName\n        );\n      }\n      metadata.properties.warmup[exercise.key] = {\n        warmupSets: exercise.warmupSets,\n        dayData,\n      };\n    }\n    this.setByWeekDayExercise(\n      metadata.byWeekDayExercise,\n      exercise.key,\n      dayData.week - 1,\n      dayData.dayInWeek - 1,\n      exercise\n    );\n    this.setByExerciseWeekDay(\n      metadata.byExerciseWeekDay,\n      exercise.key,\n      dayData.week - 1,\n      dayData.dayInWeek - 1,\n      exercise\n    );\n    metadata.fullNames.add(exercise.fullName);\n  }\n\n  public static evaluateDay(\n    day: IPlannerProgramDay,\n    dayData: Required<IDayData>,\n    settings: ISettings\n  ): IPlannerEvalResult {\n    const tree = plannerExerciseParser.parse(day.exerciseText);\n    const evaluator = new PlannerExerciseEvaluator(day.exerciseText, settings, \"perday\", dayData);\n    const result = evaluator.evaluate(tree.topNode);\n    if (result.success) {\n      const exercises = result.data[0]?.days[0]?.exercises || [];\n      return { success: true, data: exercises };\n    } else {\n      return result;\n    }\n  }\n\n  public static getPerDayEvaluatedWeeks(\n    plannerProgram: IPlannerProgram,\n    settings: ISettings\n  ): {\n    evaluatedWeeks: IPlannerEvalResult[][];\n    metadata: IPlannerEvalMetadata;\n  } {\n    let dayIndex = 0;\n    const metadata: IPlannerEvalMetadata = {\n      byExerciseWeekDay: {},\n      byWeekDayExercise: {},\n      fullNames: new Set(),\n      notused: new Set(),\n      properties: { progress: {}, update: {}, warmup: {}, id: {} },\n    };\n    const evaluatedWeeks: IPlannerEvalResult[][] = plannerProgram.weeks.map((week, weekIndex) => {\n      return week.days.map((day, dayInWeekIndex) => {\n        const dayData = {\n          week: weekIndex + 1,\n          dayInWeek: dayInWeekIndex + 1,\n          day: dayIndex + 1,\n        };\n        const result = this.evaluateDay(\n          day,\n          { week: weekIndex + 1, dayInWeek: dayInWeekIndex + 1, day: dayIndex + 1 },\n          settings\n        );\n        dayIndex += 1;\n        if (result.success) {\n          const exercises = result.data;\n          for (const exercise of exercises) {\n            try {\n              this.fillInMetadata(exercise, metadata, dayData);\n            } catch (e) {\n              if (e instanceof PlannerSyntaxError) {\n                return { success: false, error: e };\n              } else {\n                throw e;\n              }\n            }\n          }\n          return { success: true, data: exercises };\n        } else {\n          return result;\n        }\n      });\n    });\n    return { evaluatedWeeks, metadata };\n  }\n\n  public static changeExerciseName(text: string, from: string, to: string, settings: ISettings): string {\n    const evaluator = new PlannerExerciseEvaluator(text, settings, \"perday\");\n    const tree = plannerExerciseParser.parse(text);\n    const result = evaluator.changeExerciseName(tree.topNode, from, to);\n    return result;\n  }\n\n  private static getFullEvaluatedWeeks(\n    fullProgramText: string,\n    settings: ISettings\n  ): {\n    evaluatedWeeks: IPlannerEvalFullResult;\n    metadata: IPlannerEvalMetadata;\n  } {\n    let dayIndex = 0;\n    const metadata: IPlannerEvalMetadata = {\n      byExerciseWeekDay: {},\n      byWeekDayExercise: {},\n      fullNames: new Set(),\n      notused: new Set(),\n      properties: { progress: {}, update: {}, warmup: {}, id: {} },\n    };\n    const evaluator = new PlannerExerciseEvaluator(fullProgramText, settings, \"full\");\n    const tree = plannerExerciseParser.parse(fullProgramText);\n    const result = evaluator.evaluate(tree.topNode);\n    if (result.success) {\n      try {\n        for (let weekIndex = 0; weekIndex < result.data.length; weekIndex += 1) {\n          const week = result.data[weekIndex];\n          for (let dayInWeekIndex = 0; dayInWeekIndex < week.days.length; dayInWeekIndex += 1) {\n            const day = week.days[dayInWeekIndex];\n            const exercises = day.exercises;\n            for (const exercise of exercises) {\n              const dayData = { week: weekIndex + 1, dayInWeek: dayInWeekIndex + 1, day: dayIndex + 1 };\n              this.fillInMetadata(exercise, metadata, dayData);\n            }\n            dayIndex += 1;\n          }\n        }\n      } catch (e) {\n        if (e instanceof PlannerSyntaxError) {\n          return { evaluatedWeeks: { success: false, error: e }, metadata };\n        } else {\n          throw e;\n        }\n      }\n      return { evaluatedWeeks: result, metadata };\n    } else {\n      return { evaluatedWeeks: result, metadata };\n    }\n  }\n\n  private static getDayIndexFromWeekAndDayInWeekIndex(\n    evaluatedWeeks: IPlannerEvalResult[][],\n    weekIndex: number,\n    dayInWeekIndex: number\n  ): number | undefined {\n    let dayIndex = 0;\n    for (let i = 0; i < evaluatedWeeks.length; i += 1) {\n      const week = evaluatedWeeks[i];\n      for (let j = 0; j < week.length; j += 1) {\n        if (i === weekIndex && j === dayInWeekIndex) {\n          return dayIndex;\n        }\n        dayIndex += 1;\n      }\n    }\n    return undefined;\n  }\n\n  private static fillRepeats(\n    exercise: IPlannerProgramExercise,\n    evaluatedWeeks: IPlannerEvalResult[][],\n    dayInWeekIndex: number,\n    byExerciseWeekDay: IByExerciseWeekDay<IPlannerProgramExercise>\n  ): void {\n    for (const repeatWeek of exercise.repeat ?? []) {\n      const repeatWeekIndex = repeatWeek - 1;\n      if (byExerciseWeekDay[exercise.key]?.[repeatWeekIndex]?.[dayInWeekIndex] == null) {\n        const dayData = {\n          week: repeatWeek,\n          dayInWeek: dayInWeekIndex + 1,\n          day: (this.getDayIndexFromWeekAndDayInWeekIndex(evaluatedWeeks, repeatWeekIndex, dayInWeekIndex) ?? 0) + 1,\n        };\n        const repeatedExercise: IPlannerProgramExercise = {\n          ...ObjectUtils.clone(exercise),\n          repeat: [],\n          dayData,\n          isRepeat: true,\n        };\n        this.setByExerciseWeekDay(byExerciseWeekDay, exercise.key, repeatWeekIndex, dayInWeekIndex, repeatedExercise);\n        const day = evaluatedWeeks[repeatWeekIndex]?.[dayInWeekIndex];\n        if (day?.success) {\n          day.data.push(repeatedExercise);\n        }\n      }\n    }\n  }\n\n  private static fillSetReuses(\n    exercise: IPlannerProgramExercise,\n    evaluatedWeeks: IPlannerEvalResult[][],\n    weekIndex: number,\n    settings: ISettings\n  ): void {\n    if (exercise.reuse && exercise.points.reuseSetPoint) {\n      const reuse = exercise.reuse;\n      const originalExercises = this.findOriginalExercisesAtWeekDay(\n        settings,\n        reuse.fullName,\n        evaluatedWeeks,\n        reuse.week ?? weekIndex + 1,\n        reuse.day\n      );\n      if (originalExercises.length > 1) {\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `There're several exercises matching, please be more specific with [week:day] syntax`,\n          exercise.points.reuseSetPoint\n        );\n      }\n      const originalExercise = originalExercises[0];\n      if (!originalExercise) {\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `No such exercise ${reuse.fullName} at week: ${reuse.week ?? weekIndex + 1}${\n            reuse.day != null ? `, day: ${reuse.day}` : \"\"\n          }`,\n          exercise.points.reuseSetPoint\n        );\n      }\n      if (originalExercise.exercise.reuse?.fullName != null) {\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `Original exercise cannot reuse another exercise's sets x reps`,\n          exercise.points.reuseSetPoint\n        );\n      }\n      if (\n        originalExercise.exercise.progress?.reuse != null &&\n        exercise.progress == null &&\n        !originalExercise.exercise.notused\n      ) {\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `This exercise doesn't specify progress - so the original USED exercise's progress cannot reuse another exercise's progress`,\n          exercise.points.reuseSetPoint\n        );\n      }\n      if (\n        originalExercise.exercise.update?.reuse != null &&\n        exercise.update == null &&\n        !originalExercise.exercise.notused\n      ) {\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `This exercise doesn't specify 'update' - so the original exercise's 'update' cannot reuse another exercise's 'update'`,\n          exercise.points.reuseSetPoint\n        );\n      }\n      if (originalExercise.exercise.progress != null && exercise.progress == null) {\n        exercise.progress = {\n          type: originalExercise.exercise.progress.type,\n          state: ObjectUtils.clone(originalExercise.exercise.progress.state),\n          stateMetadata: ObjectUtils.clone(originalExercise.exercise.progress.stateMetadata),\n          reuse: { fullName: originalExercise.exercise.fullName, source: \"overall\" },\n        };\n      }\n      if (originalExercise.exercise.update != null && exercise.update == null) {\n        exercise.update = {\n          type: originalExercise.exercise.update.type,\n          reuse: { fullName: originalExercise.exercise.fullName, source: \"overall\" },\n        };\n      }\n\n      exercise.reuse.exercise = originalExercise.exercise;\n    }\n  }\n\n  private static fillEvaluatedSetVariations(exercise: IPlannerProgramExercise): void {\n    const setVariations = PlannerProgramExercise.setVariations(exercise);\n    const evaluatedSetVariations = PlannerProgramExercise.evaluateSetVariations(exercise, setVariations);\n    exercise.evaluatedSetVariations = evaluatedSetVariations;\n  }\n\n  private static fillDescriptions(\n    exercise: IPlannerProgramExercise,\n    evaluatedWeeks: IPlannerEvalResult[][],\n    weekIndex: number,\n    dayIndex: number\n  ): void {\n    if (exercise.descriptions == null || exercise.descriptions.values.length === 0) {\n      const lastWeekExercise = this.findLastWeekExercise(\n        evaluatedWeeks,\n        weekIndex,\n        dayIndex,\n        exercise,\n        (ex) => ex.descriptions != null\n      );\n      if (lastWeekExercise && lastWeekExercise.descriptions) {\n        exercise.descriptions = ObjectUtils.clone(lastWeekExercise.descriptions);\n      }\n    }\n  }\n\n  private static fillDescriptionReuses(\n    exercise: IPlannerProgramExercise,\n    weekIndex: number,\n    byExerciseWeekDay: IByExerciseWeekDay<IPlannerProgramExercise>,\n    settings: ISettings\n  ): void {\n    if (\n      exercise.descriptions != null &&\n      exercise.descriptions.values.length === 1 &&\n      exercise.descriptions.values[0].value?.startsWith(\"...\")\n    ) {\n      const reusingName = exercise.descriptions.values[0].value.slice(3).trim();\n      const result = this.findReusedDescriptions(reusingName, weekIndex, byExerciseWeekDay, settings);\n      if (result != null) {\n        const { descriptions, exercise: originalExercise } = result;\n        exercise.descriptions = {\n          values: [...ObjectUtils.clone(descriptions.values)],\n          reuse: { fullName: originalExercise.fullName, exercise: originalExercise, source: \"specific\" },\n        };\n      }\n    }\n  }\n\n  private static fillSingleProperties(exercise: IPlannerProgramExercise, metadata: IPlannerEvalMetadata): void {\n    if (metadata.notused.has(exercise.key)) {\n      exercise.notused = true;\n    }\n\n    if (metadata.properties.progress[exercise.key] != null) {\n      const existingProgress = exercise.progress;\n      if (!existingProgress) {\n        exercise.progress = metadata.properties.progress[exercise.key].property;\n      }\n    }\n\n    if (metadata.properties.update[exercise.key] != null && !exercise.update) {\n      exercise.update = metadata.properties.update[exercise.key].property;\n    }\n\n    if (metadata.properties.warmup[exercise.key] != null) {\n      exercise.warmupSets = metadata.properties.warmup[exercise.key].warmupSets;\n    }\n  }\n\n  private static fillProgressReuses(\n    evaluatedWeeks: IPlannerEvalResult[][],\n    exercise: IPlannerProgramExercise,\n    settings: ISettings,\n    metadata: IPlannerEvalMetadata\n  ): void {\n    const progress = exercise.progress;\n    if (progress?.type === \"custom\") {\n      const fullName = progress.reuse?.fullName;\n      if (progress.reuse && fullName) {\n        const key = PlannerKey.fromFullName(fullName, settings.exercises, Equipment.currentEquipment(settings));\n        const point = exercise.points.progressPoint || exercise.points.fullName;\n        if (metadata.byExerciseWeekDay[key] == null) {\n          throw PlannerSyntaxError.fromPoint(exercise.fullName, `No such exercise ${fullName}`, point);\n        }\n        const originalProperty = metadata.properties.progress[key];\n        const dayData = originalProperty?.dayData;\n        const originalProgress = originalProperty?.property;\n        if (!originalProgress || !dayData) {\n          throw PlannerSyntaxError.fromPoint(exercise.fullName, \"Original exercise should specify progress\", point);\n        }\n        if (originalProgress.reuse?.fullName != null && !originalProgress.reuse?.exercise?.notused) {\n          throw PlannerSyntaxError.fromPoint(\n            exercise.fullName,\n            `Original exercise cannot reuse another progress`,\n            point\n          );\n        }\n        if (originalProgress.type !== \"custom\") {\n          throw PlannerSyntaxError.fromPoint(\n            exercise.fullName,\n            \"Original exercise should specify custom progress\",\n            point\n          );\n        }\n        const originalState = originalProgress.state;\n        const state = progress.state;\n        for (const stateKey of ObjectUtils.keys(originalState)) {\n          const value = originalState[stateKey];\n          if (state[key] != null && Weight.type(value) !== Weight.type(state[stateKey])) {\n            throw PlannerSyntaxError.fromPoint(exercise.fullName, `Wrong type of state variable ${stateKey}`, point);\n          }\n        }\n        const originalExercises = this.findOriginalExercisesAtWeekDay(\n          settings,\n          fullName,\n          evaluatedWeeks,\n          dayData.week,\n          dayData.dayInWeek\n        );\n        const originalExercise = originalExercises[0]?.exercise;\n        if (\n          originalExercise?.reuse != null &&\n          (originalExercise.progress == null || originalExercise.progress.reuse != null)\n        ) {\n          throw PlannerSyntaxError.fromPoint(\n            exercise.fullName,\n            `Original exercise '${originalExercise.fullName}' should not reuse other exercise`,\n            point\n          );\n        }\n        progress.reuse.exercise = originalExercise;\n      }\n    }\n  }\n\n  private static checkUpdateScript(exercise: IPlannerProgramExercise, settings: ISettings, dayData: IDayData): void {\n    const update = exercise.update;\n    if (update?.type === \"custom\") {\n      const { script, liftoscriptNode } = update;\n      if (script && liftoscriptNode) {\n        const exerciseType = PlannerProgramExercise.getExercise(exercise, settings);\n        const state = PlannerProgramExercise.getState(exercise);\n        const liftoscriptEvaluator = new ScriptRunner(\n          script,\n          state,\n          {},\n          Progress.createEmptyScriptBindings(dayData, settings),\n          Progress.createScriptFunctions(settings),\n          settings.units,\n          { exerciseType, unit: settings.units, prints: [] },\n          \"update\"\n        );\n        try {\n          liftoscriptEvaluator.parse();\n        } catch (e) {\n          if (e instanceof LiftoscriptSyntaxError && liftoscriptNode) {\n            const [line] = PlannerExerciseEvaluator.getLineAndOffset(script, liftoscriptNode);\n            throw new PlannerSyntaxError(\n              e.message,\n              line + e.line,\n              e.offset,\n              liftoscriptNode.from + e.from,\n              liftoscriptNode.from + e.to\n            );\n          } else {\n            throw e;\n          }\n        }\n      }\n    }\n  }\n\n  private static fillUpdateReuses(\n    evaluatedWeeks: IPlannerEvalResult[][],\n    exercise: IPlannerProgramExercise,\n    settings: ISettings,\n    metadata: IPlannerEvalMetadata\n  ): void {\n    const update = exercise.update;\n    if (update?.type === \"custom\") {\n      const fullName = update.reuse?.fullName;\n      if (update.reuse && fullName) {\n        const key = PlannerKey.fromFullName(fullName, settings.exercises, Equipment.currentEquipment(settings));\n        const point = exercise.points.updatePoint || exercise.points.fullName;\n\n        if (metadata.byExerciseWeekDay[key] == null) {\n          throw PlannerSyntaxError.fromPoint(exercise.fullName, `No such exercise ${fullName}`, point);\n        }\n        const originalProperty = metadata.properties.update[key];\n        const originalUpdate = originalProperty?.property;\n        const dayData = originalProperty?.dayData;\n        if (!originalUpdate || !dayData) {\n          throw PlannerSyntaxError.fromPoint(exercise.fullName, \"Original exercise should specify update\", point);\n        }\n        if (originalUpdate.reuse?.fullName != null && !originalUpdate.reuse?.exercise?.notused) {\n          throw PlannerSyntaxError.fromPoint(exercise.fullName, `Original exercise cannot reuse another update`, point);\n        }\n        if (originalUpdate.type !== \"custom\") {\n          throw PlannerSyntaxError.fromPoint(\n            exercise.fullName,\n            \"Original exercise should specify custom update\",\n            point\n          );\n        }\n        const stateKeys = originalUpdate.meta?.stateKeys || new Set();\n        if (stateKeys.size !== 0) {\n          const progress = exercise.progress;\n          if (progress == null) {\n            throw PlannerSyntaxError.fromPoint(\n              exercise.fullName,\n              \"If 'update' block uses state variables, exercise should define them in 'progress' block\",\n              point\n            );\n          }\n          const state = PlannerProgramExercise.getState(exercise);\n          for (const stateKey of stateKeys) {\n            if (state[stateKey] == null) {\n              throw PlannerSyntaxError.fromPoint(\n                exercise.fullName,\n                `Missing state variable ${stateKey} that's used in the original update block`,\n                point\n              );\n            }\n          }\n        }\n        const originalExercises = this.findOriginalExercisesAtWeekDay(\n          settings,\n          fullName,\n          evaluatedWeeks,\n          dayData.week,\n          dayData.dayInWeek\n        );\n        const originalExercise = originalExercises[0]?.exercise;\n        if (\n          originalExercise?.reuse != null &&\n          (originalExercise.update == null || originalExercise.update.reuse != null)\n        ) {\n          throw PlannerSyntaxError.fromPoint(\n            exercise.fullName,\n            `Original exercise '${originalExercise.fullName}' should not reuse other exercise`,\n            point\n          );\n        }\n        update.reuse.exercise = originalExercise;\n      }\n    }\n  }\n\n  public static postProcess(\n    evaluatedWeeks: IPlannerEvalResult[][],\n    settings: ISettings,\n    metadata: IPlannerEvalMetadata\n  ): void {\n    this.iterateOverExercises(evaluatedWeeks, (weekIndex, dayInWeekIndex, dayIndex, exerciseIndex, exercise) => {\n      this.fillDescriptions(exercise, evaluatedWeeks, weekIndex, dayInWeekIndex);\n      this.fillRepeats(exercise, evaluatedWeeks, dayInWeekIndex, metadata.byExerciseWeekDay);\n      this.fillSingleProperties(exercise, metadata);\n      this.checkUnknownExercises(exercise, metadata);\n    });\n\n    this.iterateOverExercises(evaluatedWeeks, (weekIndex, dayInWeekIndex, dayIndex, exerciseIndex, exercise) => {\n      this.fillSetReuses(exercise, evaluatedWeeks, weekIndex, settings);\n      this.fillDescriptionReuses(exercise, weekIndex, metadata.byExerciseWeekDay, settings);\n      this.fillProgressReuses(evaluatedWeeks, exercise, settings, metadata);\n      this.fillUpdateReuses(evaluatedWeeks, exercise, settings, metadata);\n      this.checkUpdateScript(exercise, settings, {\n        week: weekIndex + 1,\n        dayInWeek: dayInWeekIndex + 1,\n        day: dayInWeekIndex + 1,\n      });\n    });\n    for (const week of evaluatedWeeks) {\n      for (const day of week) {\n        if (day.success) {\n          day.data.sort((ex1, ex2) => {\n            if (ex1.exerciseIndex === ex2.exerciseIndex) {\n              return (ex1.repeating[0] ?? 0) - (ex2.repeating[0] ?? 0);\n            } else {\n              return ex1.exerciseIndex - ex2.exerciseIndex;\n            }\n          });\n        }\n      }\n    }\n\n    this.iterateOverExercises(evaluatedWeeks, (weekIndex, dayInWeekIndex, dayIndex, exerciseIndex, exercise) => {\n      this.fillEvaluatedSetVariations(exercise);\n    });\n\n    this.iterateOverExercises(evaluatedWeeks, (weekIndex, dayInWeekIndex, dayIndex, exerciseIndex, exercise) => {\n      if (exerciseIndex === 0) {\n        const day = evaluatedWeeks[weekIndex][dayInWeekIndex];\n        if (day.success) {\n          this.checkBlocks(day.data, settings);\n        }\n      }\n    });\n  }\n\n  public static checkBlocks(dayExercises: IPlannerProgramExercise[], settings: ISettings): void {\n    const groups = new Map<string, IPlannerProgramExercise[]>();\n    for (const exercise of dayExercises) {\n      const groupName = exercise.superset?.name;\n      if (groupName == null) {\n        if (exercise.block != null) {\n          const first = this.getSingleBlockProblems(exercise)[0];\n          if (first != null) {\n            throw PlannerSyntaxError.fromPoint(first.fullName, first.message, first.point);\n          }\n        }\n        continue;\n      }\n      const members = groups.get(groupName) ?? [];\n      members.push(exercise);\n      groups.set(groupName, members);\n    }\n    for (const [groupName, members] of groups) {\n      if (members.some((m) => m.block != null)) {\n        this.checkBlockGroup(groupName, members, settings);\n      }\n    }\n  }\n\n  public static getSingleBlockProblems(exercise: IPlannerProgramExercise): IBlockProblem[] {\n    const problems: IBlockProblem[] = [];\n    const blockName = exercise.block?.name ?? \"circuit\";\n    const point = exercise.points.blockPoint ?? exercise.points.fullName;\n\n    if (exercise.notused || exercise.exerciseType == null) {\n      problems.push({\n        rule: 8,\n        fullName: exercise.fullName,\n        message: `Exercise '${exercise.fullName}' has a '${blockName}' block but is not used in this day — a block cannot contain an unused exercise`,\n        point,\n      });\n    }\n\n    findMissingWorkTimer: for (const variation of exercise.evaluatedSetVariations) {\n      for (let setIndex = 0; setIndex < variation.sets.length; setIndex += 1) {\n        if (variation.sets[setIndex].setTimer == null) {\n          problems.push({\n            rule: 4,\n            fullName: exercise.fullName,\n            message: `Every set of a '${blockName}' block needs a work timer, e.g. 60s|0s (set ${setIndex + 1} of '${exercise.fullName}' has none)`,\n            point,\n          });\n          break findMissingWorkTimer;\n        }\n      }\n    }\n\n    findQuickAddSet: for (const variation of exercise.evaluatedSetVariations) {\n      if (variation.sets.some((s) => s.isQuickAddSet)) {\n        problems.push({\n          rule: 7,\n          fullName: exercise.fullName,\n          message: `Exercise '${exercise.fullName}' has a '${blockName}' block and cannot use quick-add sets — a block's round count is fixed`,\n          point,\n        });\n        break findQuickAddSet;\n      }\n    }\n\n    return problems;\n  }\n\n  private static checkBlockGroup(groupName: string, members: IPlannerProgramExercise[], settings: ISettings): void {\n    const problems = this.getBlockProblems(members, settings);\n    const first = problems[0];\n    if (first != null) {\n      throw PlannerSyntaxError.fromPoint(first.fullName, first.message, first.point);\n    }\n  }\n\n  public static getBlockProblems(members: IPlannerProgramExercise[], settings: ISettings): IBlockProblem[] {\n    const groupName = members[0]?.superset?.name ?? \"\";\n    const problems: IBlockProblem[] = [];\n\n    const declaring = members.filter((m) => m.block != null);\n    if (declaring.length > 1) {\n      const offending = declaring[1];\n      problems.push({\n        rule: 2,\n        fullName: offending.fullName,\n        message: `Superset group '${groupName}' declares 'block' on more than one exercise — declare it once`,\n        point: offending.points.fullName,\n      });\n    }\n\n    if (members.length < 2) {\n      const offending = members[0];\n      problems.push({\n        rule: 3,\n        fullName: offending.fullName,\n        message: `Superset group '${groupName}' has only one exercise — a block needs at least two. For one exercise, remove 'superset:'`,\n        point: offending.points.fullName,\n      });\n    }\n\n    // `each` and `check` log the sets of one exercise. The group log asks for rounds, so it would ignore them.\n    const singleOnlyReps = declaring.find(\n      (m) => m.block?.logging?.reps === \"each\" || m.block?.logging?.reps === \"check\"\n    );\n    if (singleOnlyReps != null) {\n      problems.push({\n        rule: 13,\n        fullName: singleOnlyReps.fullName,\n        message: `Superset group '${groupName}' uses 'reps: ${singleOnlyReps.block?.logging?.reps}' — it works on one exercise only. For a group, use reps: none|last|firstlast|avg`,\n        point: singleOnlyReps.points.blockPoint ?? singleOnlyReps.points.fullName,\n      });\n    }\n\n    findMissingWorkTimer: for (const member of members) {\n      for (const variation of member.evaluatedSetVariations) {\n        for (let setIndex = 0; setIndex < variation.sets.length; setIndex += 1) {\n          if (variation.sets[setIndex].setTimer == null) {\n            problems.push({\n              rule: 4,\n              fullName: member.fullName,\n              message: `Exercise '${member.fullName}' is in block '${groupName}' but set ${setIndex + 1} has no work timer (e.g. '20s|10s')`,\n              point: member.points.fullName,\n            });\n            break findMissingWorkTimer;\n          }\n        }\n      }\n    }\n\n    const refMember = members[0];\n    findRoundMismatch: for (let v = 0; v < refMember.evaluatedSetVariations.length; v += 1) {\n      const refCount = refMember.evaluatedSetVariations[v].sets.length;\n      for (const member of members.slice(1)) {\n        if (v >= member.evaluatedSetVariations.length) {\n          continue;\n        }\n        const count = member.evaluatedSetVariations[v].sets.length;\n        if (count !== refCount) {\n          problems.push({\n            rule: 5,\n            fullName: member.fullName,\n            message: `Exercises in block '${groupName}' have different numbers of rounds: '${refMember.fullName}' has ${refCount}, '${member.fullName}' has ${count}`,\n            point: member.points.fullName,\n          });\n          break findRoundMismatch;\n        }\n      }\n    }\n\n    for (const member of members.slice(1)) {\n      if (member.evaluatedSetVariations.length !== refMember.evaluatedSetVariations.length) {\n        problems.push({\n          rule: 6,\n          fullName: member.fullName,\n          message: `Exercises in block '${groupName}' have different numbers of set variations`,\n          point: member.points.fullName,\n        });\n        break;\n      }\n    }\n\n    findQuickAddSet: for (const member of members) {\n      for (const variation of member.evaluatedSetVariations) {\n        if (variation.sets.some((s) => s.isQuickAddSet)) {\n          problems.push({\n            rule: 7,\n            fullName: member.fullName,\n            message: `Exercise '${member.fullName}' is in block '${groupName}' and cannot use quick-add sets — a block's round count is fixed`,\n            point: member.points.fullName,\n          });\n          break findQuickAddSet;\n        }\n      }\n    }\n\n    for (const member of members) {\n      if (member.notused || member.exerciseType == null) {\n        problems.push({\n          rule: 8,\n          fullName: member.fullName,\n          message: `Exercise '${member.fullName}' is in block '${groupName}' but is not used in this day — a block cannot contain an unused exercise`,\n          point: member.points.fullName,\n        });\n        break;\n      }\n    }\n\n    findPrompt: for (const member of members) {\n      if (this.hasUserPromptedVars(member)) {\n        problems.push({\n          rule: 9,\n          fullName: member.fullName,\n          message: `Exercise '${member.fullName}' is in block '${groupName}' but set 1 asks the client for input — a block cannot pause for a prompt`,\n          point: member.points.fullName,\n        });\n        break findPrompt;\n      }\n      for (const variation of member.evaluatedSetVariations) {\n        for (let setIndex = 0; setIndex < variation.sets.length; setIndex += 1) {\n          const set = variation.sets[setIndex];\n          if (set.logRpe || set.isAmrap || set.askWeight) {\n            problems.push({\n              rule: 9,\n              fullName: member.fullName,\n              message: `Exercise '${member.fullName}' is in block '${groupName}' but set ${setIndex + 1} asks the client for input — a block cannot pause for a prompt`,\n              point: member.points.fullName,\n            });\n            break findPrompt;\n          }\n        }\n      }\n    }\n\n    findMissingRest: for (const member of members) {\n      for (const variation of member.evaluatedSetVariations) {\n        for (let setIndex = 0; setIndex < variation.sets.length; setIndex += 1) {\n          const set = variation.sets[setIndex];\n          const rest = set.timer || settings.timers.superset || settings.timers.workout;\n          if (!rest) {\n            problems.push({\n              rule: 10,\n              fullName: member.fullName,\n              message: `Exercise '${member.fullName}' is in block '${groupName}' but set ${setIndex + 1} has no rest timer and none is configured`,\n              point: member.points.fullName,\n            });\n            break findMissingRest;\n          }\n        }\n      }\n    }\n\n    const refIndex = PlannerProgramExercise.currentEvaluatedSetVariationIndex(refMember);\n    for (const member of members.slice(1)) {\n      if (PlannerProgramExercise.currentEvaluatedSetVariationIndex(member) !== refIndex) {\n        problems.push({\n          rule: 11,\n          fullName: member.fullName,\n          message: `Exercises in block '${groupName}' have different current set variations`,\n          point: member.points.fullName,\n        });\n        break;\n      }\n    }\n\n    return problems;\n  }\n\n  private static hasUserPromptedVars(exercise: IPlannerProgramExercise): boolean {\n    const stateMetadata = PlannerProgramExercise.getStateMetadata(exercise);\n    return ObjectUtils.keys(stateMetadata).some((key) => stateMetadata[key]?.userPrompted);\n  }\n\n  public static checkUnknownExercises(exercise: IPlannerProgramExercise, metadata: IPlannerEvalMetadata): void {\n    if (exercise.exerciseType == null && !metadata.notused.has(exercise.key)) {\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `Unknown exercise ${exercise.name}`,\n        exercise.points.fullName\n      );\n    }\n  }\n\n  public static findReusedDescriptions(\n    reusingName: string,\n    currentWeekIndex: number,\n    byExerciseWeekDay: IByExerciseWeekDay<IPlannerProgramExercise>,\n    settings: ISettings\n  ): { descriptions: IProgramExerciseDescriptions; exercise: IPlannerProgramExercise } | undefined {\n    const weekDayMatch = reusingName.match(/\\[([^]+)\\]/);\n    let weekIndex: number | undefined;\n    let dayIndex: number | undefined;\n    if (weekDayMatch != null) {\n      const [dayOrWeekStr, dayStr] = weekDayMatch[1].split(\":\");\n      if (dayStr != null) {\n        weekIndex = parseInt(dayOrWeekStr, 10);\n        weekIndex = isNaN(weekIndex) ? undefined : weekIndex - 1;\n        dayIndex = parseInt(dayStr, 10);\n        dayIndex = isNaN(dayIndex) ? undefined : dayIndex - 1;\n      } else {\n        dayIndex = parseInt(dayOrWeekStr, 10);\n        dayIndex = isNaN(dayIndex) ? undefined : dayIndex - 1;\n      }\n    }\n    reusingName = reusingName.replace(/\\[([^]+)\\]/, \"\").trim();\n    const key = PlannerKey.fromFullName(reusingName, settings.exercises, Equipment.currentEquipment(settings));\n    const weekExercises = ObjectUtils.values(byExerciseWeekDay[key]?.[weekIndex ?? currentWeekIndex] || []);\n    const weekDescriptions = weekExercises.map((d) => d.descriptions);\n    const index = dayIndex ?? 0;\n    if (weekDescriptions[index]) {\n      return { descriptions: weekDescriptions[index], exercise: weekExercises[index] };\n    } else {\n      return undefined;\n    }\n  }\n\n  public static findOriginalExercisesAtWeekDay(\n    settings: ISettings,\n    fullName: string,\n    program: IPlannerEvalResult[][],\n    atWeek: number,\n    atDay?: number\n  ): { exercise: IPlannerProgramExercise; dayData: Required<IDayData> }[] {\n    const originalExercises: { exercise: IPlannerProgramExercise; dayData: Required<IDayData> }[] = [];\n    const week = program[atWeek - 1];\n    const candidateDays = atDay != null ? [week[atDay - 1]] : week;\n    for (let dayInWeekIndex = 0; dayInWeekIndex < candidateDays.length; dayInWeekIndex += 1) {\n      const day = candidateDays[dayInWeekIndex];\n      if (day == null || !day.success) {\n        continue;\n      }\n      for (const exercise of day.data) {\n        const reusingKey = PlannerKey.fromPlannerExercise(exercise, settings);\n        const originalKey = PlannerKey.fromFullName(fullName, settings.exercises, Equipment.currentEquipment(settings));\n        if (reusingKey === originalKey) {\n          originalExercises.push({\n            exercise,\n            dayData: {\n              week: atWeek,\n              dayInWeek: dayInWeekIndex + 1,\n              day: 1,\n            },\n          });\n        }\n      }\n    }\n    return originalExercises;\n  }\n\n  public static forceEvaluate = (\n    plannerProgram: IPlannerProgram,\n    settings: ISettings\n  ): {\n    evaluatedWeeks: IPlannerEvalResult[][];\n    exerciseFullNames: string[];\n  } => {\n    const { evaluatedWeeks, metadata } = PlannerEvaluator.getPerDayEvaluatedWeeks(plannerProgram, settings);\n    PlannerEvaluator.postProcess(evaluatedWeeks, settings, metadata);\n    return { evaluatedWeeks, exerciseFullNames: Array.from(metadata.fullNames) };\n  };\n\n  public static evaluate = memoize(this.forceEvaluate, {\n    maxSize: 10,\n    isEqual: (a: IPlannerProgram | ISettings, b: IPlannerProgram | ISettings) => {\n      if (\"weeks\" in a && \"weeks\" in b) {\n        const aText = PlannerProgram.generateFullText(a.weeks);\n        const bText = PlannerProgram.generateFullText(b.weeks);\n        return aText === bText;\n      } else {\n        return a === b;\n      }\n    },\n  });\n\n  public static evaluateFull(\n    fullProgramText: string,\n    settings: ISettings\n  ): { evaluatedWeeks: IPlannerEvalFullResult; exerciseFullNames: string[] } {\n    const { evaluatedWeeks, metadata } = this.getFullEvaluatedWeeks(fullProgramText, settings);\n    if (evaluatedWeeks.success) {\n      const perDayEvaluatedWeeks = PlannerProgram.fullToWeekEvalResult(evaluatedWeeks);\n      this.postProcess(perDayEvaluatedWeeks, settings, metadata);\n      for (const week of perDayEvaluatedWeeks) {\n        for (const day of week) {\n          if (!day.success) {\n            return {\n              evaluatedWeeks: { success: false, error: day.error },\n              exerciseFullNames: Array.from(metadata.fullNames),\n            };\n          }\n        }\n      }\n    }\n    return { evaluatedWeeks, exerciseFullNames: Array.from(metadata.fullNames) };\n  }\n\n  private static findLastWeekExercise(\n    program: IPlannerEvalResult[][],\n    weekIndex: number,\n    dayIndex: number,\n    exercise: IPlannerProgramExercise,\n    cond?: (ex: IPlannerProgramExercise) => boolean\n  ): IPlannerProgramExercise | undefined {\n    for (\n      let i = weekIndex - 1, lastWeekDay = program[i]?.[dayIndex];\n      i >= 0 && lastWeekDay != null;\n      i -= 1, lastWeekDay = program[i]?.[dayIndex]\n    ) {\n      if (lastWeekDay.success) {\n        const lastWeekExercise = lastWeekDay.data.find((ex) => ex.key === exercise.key);\n        if (lastWeekExercise != null && (cond == null || cond(lastWeekExercise))) {\n          return lastWeekExercise;\n        }\n      }\n    }\n    return undefined;\n  }\n\n  private static setByExerciseWeekDay<T, U extends Record<string, Record<number, Record<number, T>>>>(\n    coll: U,\n    exercise: string,\n    weekIndex: number,\n    dayIndex: number,\n    val: T\n  ): void {\n    coll[exercise as keyof U] = coll[exercise as keyof U] || {};\n    coll[exercise as keyof U][weekIndex] = coll[exercise as keyof U][weekIndex] || {};\n    coll[exercise as keyof U][weekIndex][dayIndex] = val;\n  }\n\n  private static setByWeekDayExercise<T, U extends Record<number, Record<number, Record<string, T>>>>(\n    coll: U,\n    exercise: string,\n    weekIndex: number,\n    dayIndex: number,\n    val: T\n  ): void {\n    coll[weekIndex] = coll[weekIndex] || {};\n    coll[weekIndex][dayIndex] = coll[weekIndex][dayIndex] || {};\n    coll[weekIndex][dayIndex][exercise] = val;\n  }\n\n  private static iterateOverExercises(\n    program: IPlannerEvalResult[][],\n    cb: (\n      weekIndex: number,\n      dayInWeekIndex: number,\n      dayIndex: number,\n      exerciseIndex: number,\n      exercise: IPlannerProgramExercise\n    ) => void\n  ): void {\n    let dayIndex = 0;\n    for (let weekIndex = 0; weekIndex < program.length; weekIndex += 1) {\n      const week = program[weekIndex];\n      for (let dayInWeekIndex = 0; dayInWeekIndex < week.length; dayInWeekIndex += 1) {\n        const day = week[dayInWeekIndex];\n        try {\n          if (day?.success) {\n            const exercises = day.data;\n            for (let exerciseIndex = 0; exerciseIndex < exercises.length; exerciseIndex += 1) {\n              cb(weekIndex, dayInWeekIndex, dayIndex, exerciseIndex, exercises[exerciseIndex]);\n            }\n          }\n        } catch (e) {\n          if (e instanceof PlannerSyntaxError) {\n            week[dayInWeekIndex] = { success: false, error: e };\n          } else {\n            throw e;\n          }\n        }\n        dayIndex += 1;\n      }\n    }\n  }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.tailRec = void 0;\n/**\n * @since 2.0.0\n */\nvar tailRec = function (startWith, f) {\n    var ab = f(startWith);\n    while (ab._tag === 'Left') {\n        ab = f(ab.left);\n    }\n    return ab.right;\n};\nexports.tailRec = tailRec;\n","/* eslint-disable no-template-curly-in-string */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport { LRParser } from \"@lezer/lr\";\nconst spec_Keyword: any = { __proto__: null, if: 100, else: 102, for: 104 };\nexport const parser = LRParser.deserialize({\n  version: 14,\n  states:\n    \",fQcQPOOO!iQPO'#C}OOQO'#Cd'#CdO#cQPO'#CdO${QPO'#DXOcQPO'#CiO%SQPO'#CjO%ZQPO'#ClO%`QPO'#CnO%eQQO'#CrO%mQPO'#CuO'ZQPO'#DXOcQPO'#C{OOQO'#DX'#DXQcQPOOOcQPO,58yOcQPO,58yOcQPO,58yOcQPO,58yOcQPO,59VOOQO,59O,59OOOQO,59Q,59QO'eQPO,59TOOQO,59U,59UO'lQPO,59UO'sQPO,59WO'xQPO,59YO'}QPO,59^OcQPO,59^O(SQSO,59aO(ZQPO,59fOcQPO,59]OcQPO,59dOOQO,59g,59gOOQO-E6{-E6{O)uQPO1G.eOOQO1G.e1G.eO)|QPO1G.eO*TQPO1G.eO+hQPO1G.qOOQO1G.o1G.oOOQO1G.p1G.pO+oQPO1G.rO-VQQO1G.tOOQO1G.x1G.xO-[QPO'#CtO-cQPO1G.xO-hQPO'#CvOOQO'#Cw'#CwOOQO'#Cv'#CvO-rQPO1G.{O-zQPO1G/QOcQPO'#DQO.UQPO1G/QOOQO1G/Q1G/QO.^QPO1G.wO/dQPO1G/OOcQPO7+$]O0jQPO7+$^O0rQPO7+$^OcQPO7+$`O2YQQO7+$dO(SQSO'#DPO2_QPO7+$gOOQO7+$g7+$gO2gQPO7+$lOOQO7+$l7+$lO2oQPO,59lOOQO-E7O-E7OO2yQPO<<GwO%ZQPO,59jOOQO<<Gx<<GxO0jQPO<<GxOOQO-E6|-E6|O4PQPO'#CpO4WQPO<<GzO4]QPO<<HOOOQO,59k,59kOOQO-E6}-E6}OOQO<<HR<<HROOQO<<HW<<HWO'sQPO1G/UOOQOAN=dAN=dP0mQPO'#DOO'sQPOAN=fOOQOAN=jAN=jOOQO7+$p7+$pOOQOG23QG23Q\",\n  stateData:\n    \"4m~OwOSPOSxOSyOSzOS~OSROXQO[]OaYOcZOgXOp[O|TO!OUO!SVO!UWO~OS_OT`OUaOVbO!QcO~OXqX[qXaqXcqXgqXpqXuqX|qX!OqX!SqX!UqX!PqX~P!WOXdO~OS{XT{XU{XV{XX{X[{Xa{Xc{Xg{Xp{Xu{X|{X!O{X!Q{X!S{X!U{X}{X!P{X!R{X!X{X!]{X~OZeO~P#hO!PgO~PcO|TO~O|jO~O!WlO!YkO~O|nO!WmOSiXTiXUiXViXXiX[iXaiXciXgiXmiXpiXuiX!OiX!QiX!SiX!UiX![iX}iX!PiX!RiX!XiX!]iX~OmpO![oO~P#hO}xO~P!WO!PyO~PcO!OUO~Oc{O~Oa|O~O!Z!QO~PcO}!WO!]!UO~PcOT`OURiVRiXRi[RiaRicRigRipRiuRi|Ri!ORi!QRi!SRi!URi}Ri!PRi!RRi!XRi!]Ri~OSRi~P(eOS_O~P(eOS_OT`OUaOVRiXRi[RiaRicRigRipRiuRi|Ri!ORi!QRi!SRi!URi}Ri!PRi!RRi!XRi!]Ri~O!R!ZO~P!WO!T![OS`iT`iU`iV`iX`i[`ia`ic`ig`ip`iu`i|`i!O`i!Q`i!S`i!U`i}`i!P`i!R`i!X`i!]`i~O!V!^O~O!XhX~P!WO!X!_O~O!RjX!XjX~P!WO!R!`O!X!bO~O}!dO!]!UO~P!WO}!dO!]!UO~OXei[eiaeiceigeipeiuei|ei!Oei!Sei!Uei}ei!Pei!Rei!Xei!]ei~P!WOXli[lialicliglipliuli|li!Oli!Sli!Uli}li!Pli!Rli!Xli!]li~P!WO!OUO!S!hO~O!T!jOS`qT`qU`qV`qX`q[`qa`qc`qg`qp`qu`q|`q!O`q!Q`q!S`q!U`q}`q!P`q!R`q!X`q!]`q~O!Y!nO~O!R!`O!X!qO~O}!rO!]!UO~O}ta!]ta~P!WOX_y[_ya_yc_yg_yp_yu_y|_y!O_y!S_y!U_y}_y!P_y!R_y!X_y!]_y~P!WO}dX~P!WO}!vO~Oa!wO~OPTg[XScZaZ~\",\n  goto: \"'O|PPP}PPPP!eP}PP!{#i}}P}P$`}$cP$y$c$|%S}P}}P%W%b%h%nPPPPPP%xy]OTU[^_`abchlmnop!U!Z!^!`ySOTU[^_`abchlmnop!U!Z!^!`x]OTU[^_`abchlmnop!U!Z!^!`QiVR!s!hx]OTU[^_`abchlmnop!U!Z!^!`QziQ!i![Q!t!jQ!x!sR!y!vR!m!^yZOTU[^_`abchlmnop!U!Z!^!`R!OlQ!SmR!o!`T!Rm!`Q^OQhUTr^hQ!]zR!k!]Q!a!SR!p!aQ!VnQ!c!TT!f!V!cWPOU^hQfTQq[Qs_Qt`QuaQvbQwcQ}lS!Pm!`Q!TnQ!XoQ!YpQ!e!UQ!g!ZR!l!^\",\n  nodeNames:\n    \"⚠ LineComment Program BinaryExpression Plus Times Cmp AndOr NumberExpression Number WeightExpression Unit Percentage ParenthesisExpression BlockExpression Ternary IfExpression Keyword ForExpression Variable ForInExpression AssignmentExpression StateVariable StateKeyword StateVariableIndex VariableExpression VariableIndex Wildcard IncAssignmentExpression IncAssignment BuiltinFunctionExpression UnaryExpression Not\",\n  maxTerm: 59,\n  skippedNodes: [0, 1],\n  repeatNodeCount: 4,\n  tokenData:\n    \"1S~R}X^$Opq$Oqr$suv%Qvw%Vxy%byz%gz{%l{|%{|}&T}!O%{!O!P&Y!P!Q&r!Q!['f![!](e!]!^(j!^!_(o!_!`(w!`!a(o!a!b)P!c!})U!}#O)g#P#Q)l#T#])U#]#^)q#^#_)U#_#`*m#`#a+i#a#g)U#g#h,Q#h#j)U#j#k.b#k#o)U#o#p0_#p#q0l#q#r0r#r#s0w#y#z$O$f$g$O#BY#BZ$O$IS$I_$O$I|$JO$O$JT$JU$O$KV$KW$O&FU&FV$O~$TYw~X^$Opq$O#y#z$O$f$g$O#BY#BZ$O$IS$I_$O$I|$JO$O$JT$JU$O$KV$KW$O&FU&FV$O~$xPp~!_!`${~%QOU~P%VOTP~%YPvw%]~%bOV~~%gO|~~%lO}~T%sP!ZSTP!_!`%vP%{OmP~&QPS~!_!`%v~&YO!]~V&_P!YQ!Q![&bT&gQXTuv&m!Q![&bT&rO[T~&wQTP!P!Q&}!_!`%v~'SSP~OY&}Z;'S&};'S;=`'`<%lO&}~'cP;=`<%l&}T'kRXTuv&m!O!P't!Q!['fT'yQXTuv&m!Q![(PT(URXTuv&m!O!P(_!Q![(PT(bP!Q![(P~(jO!R~~(oOx~~(tPU~!_!`${~(|P![~!_!`${~)UO!Q~T)ZSaT!Q![)U!c!})U#R#S)U#T#o)U~)lO!W~~)qO!X~V)vUaT!Q![)U!c!})U#R#S)U#T#b)U#b#c*Y#c#o)UV*aS!VQaT!Q![)U!c!})U#R#S)U#T#o)U~*rUaT!Q![)U!c!})U#R#S)U#T#Z)U#Z#[+U#[#o)U~+]SZ~aT!Q![)U!c!})U#R#S)U#T#o)U~+nUaT!Q![)U!c!})U#R#S)U#T#U)U#U#V+U#V#o)U~,VUaT!Q![)U!c!})U#R#S)U#T#h)U#h#i,i#i#o)U~,nTaT!Q![)U!c!})U#R#S)U#T#U,}#U#o)U~-SUaT!Q![)U!c!})U#R#S)U#T#h)U#h#i-f#i#o)U~-kUaT!Q![)U!c!})U#R#S)U#T#X)U#X#Y-}#Y#o)U~.USg~aT!Q![)U!c!})U#R#S)U#T#o)U~.gTaT!Q![)U!c!})U#R#S)U#T#U.v#U#o)U~.{UaT!Q![)U!c!})U#R#S)U#T#f)U#f#g/_#g#o)U~/dTaT!O!P/s!Q![)U!c!})U#R#S)U#T#o)U~/vQ!c!}/|#T#o/|~0RSc~!Q![/|!c!}/|#R#S/|#T#o/|~0dP!O~#r#s0g~0lOy~~0oP#p#q%]~0wO!P~~0zP#q#r0}~1SOz~\",\n  tokenizers: [0, 1, 2],\n  topRules: { Program: [0, 2] },\n  specialized: [{ term: 17, get: (value: any) => spec_Keyword[value] || -1 }],\n  tokenPrec: 892,\n});\n","import { JSX, ComponentChildren } from \"preact\";\nimport { IconArrowRight } from \"./icons/iconArrowRight\";\nimport { IconHandle } from \"./icons/iconHandle\";\nimport { StringUtils } from \"@shared/utils/string\";\n\ninterface IMenuItemProps {\n  prefix?: ComponentChildren;\n  name: string;\n  isBorderless?: boolean;\n  value?: string | JSX.Element;\n  expandName?: boolean;\n  expandValue?: boolean;\n  addons?: ComponentChildren;\n  shouldShowRightArrow?: boolean;\n  handleTouchStart?: (e: TouchEvent | MouseEvent) => void;\n  onClick?: (e: MouseEvent) => void;\n}\n\nexport function MenuItemWrapper(props: {\n  name: string;\n  children: ComponentChildren;\n  isBorderless?: boolean;\n  onClick?: (e: MouseEvent) => void;\n}): JSX.Element {\n  return (\n    <section\n      data-cy={`menu-item-${StringUtils.dashcase(props.name)}`}\n      className=\"w-full text-base text-left\"\n      onClick={props.onClick}\n    >\n      <div className={!props.isBorderless ? \"border-b border-border-neutral\" : \"\"}>{props.children}</div>\n    </section>\n  );\n}\n\nexport function MenuItem(props: IMenuItemProps): JSX.Element {\n  return (\n    <MenuItemWrapper name={props.name} onClick={props.onClick} isBorderless={props.isBorderless}>\n      <section className=\"flex items-center\">\n        {props.handleTouchStart && (\n          <div className=\"p-2 cursor-move\" style={{ marginLeft: \"-16px\", touchAction: \"none\" }}>\n            <span onMouseDown={props.handleTouchStart} onTouchStart={props.handleTouchStart}>\n              <IconHandle />\n            </span>\n          </div>\n        )}\n        <div className=\"flex items-center justify-center\">{props.prefix}</div>\n        <div className={`${props.expandValue ? \"\" : \"flex-1\"}`}>\n          <div className=\"flex items-center pt-3 pb-1 text-left\">{props.name}</div>\n          <div className=\"pb-2\">{props.addons}</div>\n        </div>\n        <div className={`${props.expandName ? \"\" : \"flex-1\"} text-right text-text-link`}>{props.value}</div>\n        {props.shouldShowRightArrow && (\n          <div className=\"flex items-center py-2 pl-2\">\n            <IconArrowRight style={{ color: \"#a0aec0\" }} />\n          </div>\n        )}\n      </section>\n    </MenuItemWrapper>\n  );\n}\n","import { JSX } from \"preact\";\nimport { Tailwind } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  width: number;\n  height: number;\n  color?: string;\n}\n\nexport function IconSpinner(props: IProps): JSX.Element {\n  const color = props.color || Tailwind.semantic().icon.neutral;\n  return (\n    <svg\n      viewBox=\"0 0 512 512\"\n      className=\"inline\"\n      style={{ width: props.width, height: props.height, animation: \"rotation 1s infinite linear\" }}\n    >\n      <path\n        fill={color}\n        d=\"M256,150.6c-9,0-15.1-6-15.1-15.1V15.1C240.9,6,247,0,256,0c9,0,15.1,6,15.1,15.1v120.5C271.1,144.6,265,150.6,256,150.6z\"\n      />\n      <path\n        fill={color}\n        d=\"M256,361.4c-9,0-15.1,6-15.1,15.1v120.5c0,9,6,15.1,15.1,15.1c9,0,15.1-6,15.1-15.1V376.5\n        C271.1,367.4,265,361.4,256,361.4\"\n      />\n      <path\n        fill={color}\n        d=\"M376.6,34c-4.8,0-9.1,2.7-12.2,6.7l-60.2,103.9c-4.5,7.5-1.5,15.1,4.5,19.6c3,1.5,4.5,1.5,7.5,1.5\n        c4.5,0,9-3,12-6l60.2-103.9c4.5-7.5,1.5-15.1-4.5-19.6C381.5,34.6,379,34,376.6,34\"\n      />\n      <path\n        fill={color}\n        d=\"M195.9,347.2c-4.8,0-9.1,2.7-12.2,6.7l-60.2,103.9c-4.5,7.5-1.5,15.1,4.5,19.6c3,1.5,4.5,1.5,7.5,1.5\n        c4.5,0,9-3,12-6l60.2-103.9c4.5-7.5,1.5-15.1-4.5-19.6C200.8,347.9,198.3,347.2,195.9,347.2\"\n      />\n      <path\n        fill={color}\n        d=\"M134.7,32.5c-2.4,0-4.7,0.7-6.7,2.2c-6,4.5-9,13.6-4.5,19.6l60.2,103.9c3,4.5,7.5,7.5,12,7.5c3,0,4.5,0,7.5-3\n        c6-4.5,9-13.6,4.5-19.6L147.6,39.2C144.6,35.1,139.5,32.5,134.7,32.5\"\n      />\n      <path\n        fill={color}\n        d=\"M315.5,345.7c-2.4,0-4.7,0.7-6.7,2.2c-6,4.5-9,13.6-4.5,19.6l60.2,103.9c3,4.5,7.5,7.5,12,7.5\n        c3,0,4.5-1.5,7.5-3c6-4.5,9-13.6,4.5-19.6l-60.2-103.9C325.3,348.4,320.3,345.7,315.5,345.7\"\n      />\n      <path\n        fill={color}\n        d=\"M135.5,240.9H15.1C6,240.9,0,247,0,256c0,9,6,15.1,15.1,15.1h120.5c9,0,15.1-6,15.1-15.1\n        C150.6,247,144.6,240.9,135.5,240.9\"\n      />\n      <path\n        fill={color}\n        d=\"M496.9,240.9H376.5c-9,0-15.1,6-15.1,15.1c0,9,6,15.1,15.1,15.1h120.5c9,0,15.1-6,15.1-15.1\n        C512,247,506,240.9,496.9,240.9\"\n      />\n      <path\n        fill={color}\n        d=\"M48.3,121.3c-4.8,0-9.1,2.7-12.2,6.7c-4.5,7.5-1.5,15.1,4.5,19.6l103.9,60.2c3,1.5,4.5,1.5,7.5,1.5\n        c4.5,0,9-1.5,12-6c4.5-7.5,1.5-15.1-4.5-19.6L55.7,123.5C53.2,122,50.7,121.3,48.3,121.3\"\n      />\n      <path\n        fill={color}\n        d=\"M361.5,302c-4.8,0-9.1,2.7-12.2,6.7c-4.5,7.5-1.5,15.1,4.5,19.6l103.9,60.2c3,1.5,4.5,1.5,7.5,1.5\n        c4.5,0,9-1.5,12.1-6c4.5-7.5,1.5-15.1-4.5-19.6l-103.9-60.2C366.4,302.7,363.9,302,361.5,302\"\n      />\n      <path\n        fill={color}\n        d=\"M149.8,300.5c-2.4,0-4.7,0.7-6.7,2.2L39.2,362.9c-6,4.5-9,13.6-4.5,19.6c3,4.5,7.5,7.5,12.1,7.5c3,0,6,0,7.5-3\n        l103.9-60.2c6-4.5,9-13.6,4.5-19.6C159.6,303.2,154.6,300.5,149.8,300.5\"\n      />\n      <path\n        fill={color}\n        d=\"M463,119.8c-2.4,0-4.7,0.7-6.8,2.2l-103.9,60.2c-6,4.5-9,13.6-4.5,19.6c3,4.5,7.5,7.5,12,7.5c3,0,4.5,0,7.5-3\n        l103.9-60.2c6-4.5,9-13.6,4.5-19.6C472.8,122.5,467.8,119.8,463,119.8\"\n      />\n    </svg>\n  );\n}\n","import { Equipment } from \"@shared/models/equipment\";\nimport {\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseEvaluatedSet,\n  IPlannerProgramExerciseEvaluatedSetVariation,\n  IPlannerProgramExerciseGlobals,\n  IPlannerProgramExerciseSet,\n  IPlannerProgramExerciseSetVariation,\n  IPlannerProgramExerciseWithType,\n  IPlannerProgramExerciseWarmupSet,\n  IProgramExerciseProgress,\n  IProgramExerciseProgressType,\n} from \"./types\";\nimport { IPlannerEvalResult, PlannerExerciseEvaluator } from \"../plannerExerciseEvaluator\";\nimport { ObjectUtils } from \"@shared/utils/object\";\nimport { groupDisplaySets } from \"../../../components/historyRecordSets\";\nimport { Weight } from \"@shared/models/weight\";\nimport {\n  IDayData,\n  IHistoryEntry,\n  IPercentage,\n  IProgramExerciseWarmupSet,\n  IProgramState,\n  IProgramStateMetadata,\n  ISettings,\n  IWeight,\n} from \"@shared/types\";\nimport { equipmentName, Exercise, IExercise, warmupValues } from \"@shared/models/exercise\";\nimport { ProgramExercise } from \"@shared/models/programExercise\";\nimport { MathUtils } from \"@shared/utils/math\";\nimport { UidFactory } from \"@shared/utils/generator\";\nimport { PlannerKey } from \"../plannerKey\";\nimport { CollectionUtils } from \"@shared/utils/collection\";\nimport { IEither } from \"@shared/utils/types\";\nimport { IDisplaySet } from \"@shared/models/set\";\n\nexport type ILinearProgressionType = {\n  type: \"linear\";\n  increase: IWeight | IPercentage;\n  successesRequired?: number;\n  successesCounter?: number;\n  decrease?: IWeight | IPercentage;\n  failuresRequired?: number;\n  failuresCounter?: number;\n};\nexport type IDoubleProgressionType = {\n  type: \"double\";\n  increase: IWeight | IPercentage;\n  minReps: number;\n  maxReps: number;\n};\nexport type ISumRepsProgressionType = {\n  type: \"sumreps\";\n  increase: IWeight | IPercentage;\n  reps: number;\n};\nexport type ICustomProgressionType = {\n  type: \"custom\";\n};\nexport type IProgressionType =\n  | ILinearProgressionType\n  | IDoubleProgressionType\n  | ISumRepsProgressionType\n  | ICustomProgressionType;\n\nexport class PlannerProgramExercise {\n  public static numberOfSets(exercise: IPlannerProgramExercise): number {\n    return PlannerProgramExercise.sets(exercise).reduce((acc, set) => acc + (set.repRange?.numberOfSets || 0), 0);\n  }\n\n  public static getExercise(plannerExercise: IPlannerProgramExercise, settings: ISettings): IExercise | undefined {\n    const exercise = Exercise.findByName(\n      plannerExercise.name,\n      settings.exercises,\n      Equipment.currentEquipment(settings)\n    );\n    if (exercise == null) {\n      return undefined;\n    }\n    exercise.equipment =\n      plannerExercise.equipment || exercise.equipment || Exercise.identityEquipment(exercise, settings.exercises);\n    return exercise;\n  }\n\n  public static setVariations(exercise: IPlannerProgramExercise): IPlannerProgramExerciseSetVariation[] {\n    const originalSetVariations = exercise.setVariations;\n    const reuseSetVariations = exercise.reuse?.exercise?.setVariations;\n    const setVariations = (originalSetVariations?.length > 0 ? originalSetVariations : reuseSetVariations) || [];\n    return setVariations.length === 0\n      ? [{ sets: PlannerProgramExercise.sets(exercise), isCurrent: true }]\n      : setVariations;\n  }\n\n  public static warmups(exercise: IPlannerProgramExercise): IPlannerProgramExerciseWarmupSet[] | undefined {\n    return exercise.warmupSets || exercise.reuse?.exercise?.warmupSets;\n  }\n\n  public static programWarmups(exercise: IPlannerProgramExercise, settings: ISettings): IProgramExerciseWarmupSet[] {\n    // A line with no warmup section has no warmups, the same as `warmup: none`. The exercise's default\n    // warmups do not apply to a program.\n    const exerciseWarmups = PlannerProgramExercise.warmups(exercise) ?? [];\n    const sets: IProgramExerciseWarmupSet[] = [];\n    for (const ws of exerciseWarmups) {\n      for (let i = 0; i < ws.numberOfSets; i += 1) {\n        let value: IWeight | number | undefined = ws.percentage ? ws.percentage / 100 : undefined;\n        if (value == null) {\n          value = ws.weight;\n        }\n        if (value == null) {\n          value = MathUtils.roundTo0005(Weight.rpeMultiplier(ws.reps, 4));\n        }\n        sets.push({\n          reps: ws.reps,\n          minReps: ws.minReps,\n          value,\n          threshold: Weight.build(0, settings.units),\n        });\n      }\n    }\n    return sets;\n  }\n\n  public static toUsed(exercise?: IPlannerProgramExercise): IPlannerProgramExerciseWithType | undefined {\n    if (exercise?.exerciseType != null) {\n      return exercise as IPlannerProgramExerciseWithType;\n    } else {\n      return undefined;\n    }\n  }\n\n  public static evaluateSetVariations(\n    exercise: IPlannerProgramExercise,\n    setVariations: IPlannerProgramExerciseSetVariation[]\n  ): IPlannerProgramExerciseEvaluatedSetVariation[] {\n    const evaluatedSetVariations: IPlannerProgramExerciseEvaluatedSetVariation[] = [];\n    for (let i = 0; i < setVariations.length; i++) {\n      const sets = PlannerProgramExercise.sets(exercise, i);\n      const evaluatedSets: IPlannerProgramExerciseEvaluatedSet[] = [];\n      for (const aSet of sets) {\n        if (aSet.repRange == null) {\n          continue;\n        }\n        for (let j = 0; j < aSet.repRange.numberOfSets; j++) {\n          evaluatedSets.push({\n            maxrep: aSet.repRange.maxrep,\n            minrep: aSet.repRange.minrep,\n            weight: aSet.weight ? aSet.weight : aSet.percentage ? Weight.buildPct(aSet.percentage) : undefined,\n            timer: aSet.timer,\n            setTimer: aSet.setTimer,\n            isOverflowSetTimer: aSet.isOverflowSetTimer,\n            rpe: aSet.rpe,\n            logRpe: !!aSet.logRpe,\n            label: aSet.label,\n            isAmrap: !!aSet.repRange.isAmrap,\n            isQuickAddSet: !!aSet.repRange.isQuickAddSet,\n            askWeight: !!aSet.askWeight,\n            isAuto: aSet.isAuto,\n          });\n        }\n      }\n      evaluatedSetVariations.push({ sets: evaluatedSets, isCurrent: setVariations[i].isCurrent });\n    }\n    return evaluatedSetVariations;\n  }\n\n  public static sets(exercise: IPlannerProgramExercise, variationIndex?: number): IPlannerProgramExerciseSet[] {\n    const reusedSets = exercise.reuse?.exercise\n      ? exercise.reuse?.exercise?.setVariations[\n          variationIndex ?? this.currentSetVariationIndex(exercise.reuse?.exercise)\n        ]?.sets\n      : undefined;\n    const reusedGlobals = exercise.reuse?.exercise?.globals || {};\n    variationIndex = variationIndex ?? this.currentSetVariationIndex(exercise);\n    const currentSets = exercise.setVariations[variationIndex]?.sets;\n    const currentGlobals = exercise.globals;\n    const sets = currentSets || reusedSets || [];\n    return sets.map((aSet) => {\n      const set: IPlannerProgramExerciseSet = ObjectUtils.clone(aSet);\n      set.rpe = currentGlobals.rpe != null ? currentGlobals.rpe : (set.rpe ?? reusedGlobals.rpe);\n      set.timer = currentGlobals.timer != null ? currentGlobals.timer : (set.timer ?? reusedGlobals.timer);\n      const globalSetTimer = currentGlobals.setTimer != null ? currentGlobals : reusedGlobals;\n      if (globalSetTimer.setTimer != null && aSet.setTimer == null && aSet.timer == null) {\n        set.setTimer = globalSetTimer.setTimer;\n        set.isOverflowSetTimer = globalSetTimer.isOverflowSetTimer;\n        set.timer = globalSetTimer.setTimerRest;\n      }\n      if (currentGlobals.weight != null || currentGlobals.percentage != null) {\n        if (currentGlobals.weight != null) {\n          set.weight = currentGlobals.weight;\n          set.percentage = undefined;\n        } else {\n          set.percentage = currentGlobals.percentage;\n          set.weight = undefined;\n        }\n      } else {\n        set.weight = set.weight ?? reusedGlobals.weight;\n        set.percentage = set.percentage ?? reusedGlobals.percentage;\n      }\n\n      set.logRpe = !!(currentGlobals.rpe != null && currentGlobals.logRpe != null\n        ? currentGlobals.logRpe\n        : (set.logRpe ?? reusedGlobals.logRpe));\n      set.askWeight = !!((currentGlobals.weight != null || currentGlobals.percentage != null) &&\n      currentGlobals.askWeight != null\n        ? currentGlobals.askWeight\n        : (set.askWeight ?? reusedGlobals.askWeight));\n      set.isAuto = currentGlobals.isAuto != null ? currentGlobals.isAuto : (set.isAuto ?? reusedGlobals.isAuto);\n      return set;\n    });\n  }\n\n  public static defaultWarmups(exercise: IExercise, settings: ISettings): IPlannerProgramExerciseWarmupSet[] {\n    const warmupSets = (exercise?.defaultWarmup && warmupValues(settings.units)[exercise.defaultWarmup]) || [];\n    const result: IPlannerProgramExerciseWarmupSet[] = [];\n    if (warmupSets) {\n      const groups = ProgramExercise.groupWarmupsSets(warmupSets);\n      for (const group of groups) {\n        const first = group[0];\n        const length = group[1];\n        result.push({\n          type: \"warmup\",\n          numberOfSets: length,\n          reps: first.reps,\n          percentage: typeof first.value === \"number\" ? first.value * 100 : first.value.value,\n        });\n      }\n    }\n    return result;\n  }\n\n  public static repeatToRangeStr(plannerExercise: IPlannerProgramExercise): string {\n    const repeat = plannerExercise.repeating;\n    const ranges: [number, number][] = [];\n    for (const rep of repeat) {\n      if (ranges.length === 0) {\n        ranges.push([rep, rep]);\n      }\n      const lastRep = ranges[ranges.length - 1][1];\n      if (rep <= lastRep + 1) {\n        ranges[ranges.length - 1][1] = rep;\n      } else {\n        ranges.push([rep, rep]);\n      }\n    }\n    return ranges.map((r) => `${r[0]}-${r[1]}`).join(\", \");\n  }\n\n  public static warmupSetsToDisplaySets(sets: IPlannerProgramExerciseWarmupSet[]): IDisplaySet[][] {\n    const displaySets: IDisplaySet[] = [];\n    for (const set of sets) {\n      for (let setIndex = 0; setIndex < (set.numberOfSets || 0); setIndex++) {\n        const weight =\n          set.percentage != null\n            ? `${set.percentage}%`\n            : set.weight?.value != null\n              ? set.weight.value.toString()\n              : `${Math.round(Weight.rpeMultiplier(set.reps, 10) * 100)}%`;\n        displaySets.push({\n          reps: set.minReps != null ? `${set.minReps}-${set.reps}` : `${set.reps}`,\n          weight: weight,\n        });\n      }\n    }\n\n    return groupDisplaySets(displaySets);\n  }\n\n  public static uniqueKey(exercise: IPlannerProgramExercise): string {\n    return `${exercise.key}-${exercise.dayData.week}-${exercise.dayData.dayInWeek}`;\n  }\n\n  public static uniqueSetKey(set: IPlannerProgramExerciseEvaluatedSet): string {\n    return `${set.minrep}-${set.maxrep}-${set.isAmrap}-${set.weight?.value}${set.weight?.unit}${set.askWeight}-${set.rpe}${set.logRpe}-${set.timer}`;\n  }\n\n  public static evaluatedSetsToDisplaySets(\n    sets: IPlannerProgramExerciseEvaluatedSet[],\n    settings: ISettings\n  ): IDisplaySet[][] {\n    const displaySets: IDisplaySet[] = [];\n    for (const set of sets) {\n      const weight = set.weight ? Weight.display(set.weight, false) : undefined;\n      const unit = set.weight?.unit || settings.units;\n      displaySets.push({\n        dimReps: false,\n        dimRpe: !set.logRpe,\n        dimWeight: !set.weight,\n        dimTimer: set.timer == null,\n        reps: `${set.minrep != null ? `${set.minrep}-${set.maxrep}` : `${set.maxrep}`}${set.isAmrap ? \"+\" : \"\"}`,\n        rpe: set.rpe?.toString(),\n        weight,\n        unit,\n        askWeight: set.askWeight,\n        timer: set.timer,\n      });\n    }\n    return groupDisplaySets(displaySets);\n  }\n\n  public static setsToDisplaySets(\n    sets: IPlannerProgramExerciseSet[],\n    hasCurrentSets: boolean,\n    globals: IPlannerProgramExerciseGlobals,\n    settings: ISettings\n  ): IDisplaySet[][] {\n    const displaySets: IDisplaySet[] = [];\n    for (const set of sets) {\n      for (let setIndex = 0; setIndex < (set.repRange?.numberOfSets || 0); setIndex++) {\n        const minReps = set.repRange?.minrep;\n        const maxReps = set.repRange?.maxrep || 0;\n        const weight =\n          set.percentage != null\n            ? `${set.percentage}%`\n            : set.weight?.value != null\n              ? set.weight.value.toString()\n              : undefined;\n        const unit = set.percentage == null ? set.weight?.unit || settings.units : undefined;\n        displaySets.push({\n          dimReps: !hasCurrentSets,\n          dimRpe: !hasCurrentSets && globals.rpe == null,\n          dimWeight: !hasCurrentSets && globals.weight == null && globals.percentage == null,\n          dimTimer: !hasCurrentSets && globals.timer == null,\n          reps: `${minReps != null ? `${minReps}-` : \"\"}${maxReps}${set.repRange?.isAmrap ? \"+\" : \"\"}`,\n          rpe: set.rpe?.toString(),\n          weight: weight,\n          unit,\n          askWeight: set.askWeight,\n          timer: set.timer,\n        });\n      }\n    }\n\n    return groupDisplaySets(displaySets);\n  }\n\n  public static degroupWarmupSets(warmupSets: IPlannerProgramExerciseWarmupSet[]): IPlannerProgramExerciseWarmupSet[] {\n    return warmupSets.reduce<IPlannerProgramExerciseWarmupSet[]>((acc, set) => {\n      for (let i = 0; i < set.numberOfSets; i++) {\n        acc.push({ ...set, numberOfSets: 1 });\n      }\n      return acc;\n    }, []);\n  }\n\n  public static currentSetVariationIndex(exercise: IPlannerProgramExercise): number {\n    const index = exercise.setVariations.findIndex((sv) => sv.isCurrent);\n    return index === -1 ? 0 : index;\n  }\n\n  public static currentEvaluatedSetVariationIndex(exercise: IPlannerProgramExercise): number {\n    const index = exercise.evaluatedSetVariations.findIndex((sv) => sv.isCurrent);\n    return index === -1 ? 0 : index;\n  }\n\n  public static currentEvaluatedSetVariation(\n    exercise: IPlannerProgramExercise\n  ): IPlannerProgramExerciseEvaluatedSetVariation {\n    const index = this.currentEvaluatedSetVariationIndex(exercise);\n    return exercise.evaluatedSetVariations[index];\n  }\n\n  public static currentDescription(exercise: IPlannerProgramExercise): string | undefined {\n    const index = this.currentDescriptionIndex(exercise);\n    return exercise.descriptions.values[index]?.value;\n  }\n\n  public static addSet(\n    ex: IPlannerProgramExercise,\n    setVariationIndex: number,\n    settings: ISettings\n  ): IPlannerProgramExercise {\n    const evaluatedSetVariation = ex.evaluatedSetVariations[setVariationIndex];\n    let lastEvaluatedSet = evaluatedSetVariation.sets[evaluatedSetVariation.sets.length - 1];\n    if (lastEvaluatedSet) {\n      evaluatedSetVariation.sets = [...evaluatedSetVariation.sets, ObjectUtils.clone(lastEvaluatedSet)];\n    } else {\n      const originalSets = PlannerProgramExercise.sets(ex, setVariationIndex);\n      const lastSet = originalSets[originalSets.length - 1];\n      if (lastSet) {\n        lastEvaluatedSet = {\n          maxrep: lastSet.repRange?.maxrep || 1,\n          minrep: lastSet.repRange?.minrep,\n          weight: lastSet.weight || Weight.zero,\n          logRpe: lastSet.logRpe || false,\n          isAmrap: lastSet.repRange?.isAmrap || false,\n          isQuickAddSet: lastSet.repRange?.isQuickAddSet || false,\n          askWeight: lastSet.askWeight || false,\n          rpe: lastSet.rpe,\n          timer: lastSet.timer,\n          label: lastSet.label,\n        };\n        evaluatedSetVariation.sets = [...evaluatedSetVariation.sets, ObjectUtils.clone(lastEvaluatedSet)];\n      } else {\n        evaluatedSetVariation.sets = [\n          ...evaluatedSetVariation.sets,\n          {\n            maxrep: 5,\n            weight: Weight.build(100, settings.units),\n            isAmrap: false,\n            logRpe: false,\n            askWeight: false,\n            isQuickAddSet: false,\n          },\n        ];\n      }\n    }\n    return ex;\n  }\n\n  public static currentDescriptionIndex(exercise: IPlannerProgramExercise): number {\n    const index = exercise.descriptions.values.findIndex((d) => d.isCurrent);\n    return index === -1 ? 0 : index;\n  }\n\n  public static numberOfSetsThisWeek(exerciseName: string, week: IPlannerEvalResult[]): number {\n    return week.reduce((acc, days) => {\n      if (days.success) {\n        const numberOfSetsThisDay = days.data\n          .filter((e) => e.name === exerciseName)\n          .reduce((acc2, e) => acc2 + PlannerProgramExercise.numberOfSets(e), 0);\n        return acc + numberOfSetsThisDay;\n      } else {\n        return acc;\n      }\n    }, 0);\n  }\n\n  public static getProgressScript(exercise: IPlannerProgramExercise): string | undefined {\n    return (\n      exercise.progress?.script ??\n      exercise.progress?.reuse?.exercise?.progress?.script ??\n      exercise.progress?.reuse?.exercise?.progress?.reuse?.exercise?.progress?.script ??\n      exercise.reuse?.exercise?.progress?.script ??\n      exercise.reuse?.exercise?.progress?.reuse?.exercise?.progress?.script\n    );\n  }\n\n  public static isReusingSetsProgress(exercise: IPlannerProgramExercise): boolean {\n    const reuseExercise = exercise.reuse?.exercise;\n    return (\n      reuseExercise?.progress != null &&\n      exercise.progress != null &&\n      exercise.progress.type === reuseExercise.progress?.type &&\n      (exercise.progress.reuse?.fullName === reuseExercise.fullName ||\n        exercise.progress.script === reuseExercise.progress.script) &&\n      Object.keys(PlannerProgramExercise.getOnlyChangedState(exercise)).length === 0\n    );\n  }\n\n  public static getState(exercise: IPlannerProgramExercise): IProgramState {\n    if (exercise.progress?.state && !exercise.progress.reuse) {\n      return exercise.progress.state;\n    } else {\n      const originalState = exercise.progress?.reuse?.exercise\n        ? this.getState(exercise.progress.reuse.exercise)\n        : exercise.reuse?.exercise\n          ? this.getState(exercise.reuse.exercise)\n          : {};\n\n      return { ...originalState, ...exercise.progress?.state };\n    }\n  }\n\n  public static getOnlyChangedState(exercise: IPlannerProgramExercise): IProgramState {\n    const originalState = exercise.progress?.reuse?.exercise\n      ? exercise.progress.reuse.exercise.progress?.state || {}\n      : exercise.reuse?.exercise\n        ? exercise.reuse.exercise.progress?.state || {}\n        : {};\n    const originalStateMetadata = exercise.progress?.reuse?.exercise\n      ? exercise.progress.reuse.exercise.progress?.stateMetadata || {}\n      : exercise.reuse?.exercise\n        ? exercise.reuse.exercise.progress?.stateMetadata || {}\n        : {};\n    const state = exercise.progress?.state || {};\n    const stateMetadata = exercise.progress?.stateMetadata || {};\n    return ObjectUtils.filter(\n      state,\n      (key, value) =>\n        originalState[key] == null ||\n        !Weight.eq(originalState[key], value) ||\n        originalStateMetadata[key]?.userPrompted !== stateMetadata[key]?.userPrompted\n    ) as IProgramState;\n  }\n\n  public static getStateMetadata(exercise: IPlannerProgramExercise): IProgramStateMetadata {\n    if (exercise.progress?.stateMetadata && !exercise.progress.reuse) {\n      return exercise.progress.stateMetadata;\n    } else {\n      const originalState = exercise.progress?.reuse?.exercise\n        ? this.getStateMetadata(exercise.progress.reuse.exercise)\n        : exercise.reuse?.exercise\n          ? this.getStateMetadata(exercise.reuse.exercise)\n          : {};\n\n      return { ...originalState, ...exercise.progress?.stateMetadata };\n    }\n  }\n\n  public static getUpdateScript(exercise: IPlannerProgramExercise): string | undefined {\n    return (\n      exercise.update?.script ??\n      exercise.update?.reuse?.exercise?.update?.script ??\n      exercise.update?.reuse?.exercise?.update?.reuse?.exercise?.update?.script ??\n      exercise.reuse?.exercise?.update?.script ??\n      exercise.reuse?.exercise?.update?.reuse?.exercise?.update?.script\n    );\n  }\n\n  public static getEnableRpe(exercise: IPlannerProgramExercise): boolean {\n    return exercise.setVariations.some((sv, i) => this.sets(exercise, i).some((s) => s.rpe != null));\n  }\n\n  public static getEnableRepRanges(exercise: IPlannerProgramExercise): boolean {\n    return exercise.setVariations.some((sv, i) =>\n      this.sets(exercise, i).some((s) => s.repRange != null && s.repRange.minrep === s.repRange.maxrep)\n    );\n  }\n\n  public static getProgressDefaultArgs(type: IProgramExerciseProgressType): string[] {\n    switch (type) {\n      case \"none\":\n        return [];\n      case \"lp\":\n        return [\"5lb\"];\n      case \"dp\":\n        return [\"5lb\", \"8\", \"12\"];\n      case \"sum\":\n        return [\"30\", \"5lb\"];\n      case \"custom\":\n        return [];\n    }\n  }\n\n  public static buildProgress(\n    type: IProgramExerciseProgressType,\n    args: string[],\n    opts: {\n      reuseFullname?: string;\n      script?: string;\n    } = {}\n  ): IEither<IProgramExerciseProgress, string> {\n    switch (type) {\n      case \"none\": {\n        return {\n          success: true,\n          data: {\n            type: \"none\",\n            state: {},\n            stateMetadata: {},\n          },\n        };\n      }\n      case \"lp\": {\n        const increment = args[0] ? Weight.parsePct(args[0]) : Weight.build(0, \"lb\");\n        const decrement = args[3] ? Weight.parsePct(args[3]) : Weight.build(0, \"lb\");\n        const state: IProgramState = {\n          increment: increment ?? Weight.build(0, \"lb\"),\n          successes: args[1] ? parseInt(args[1], 10) : 1,\n          successCounter: args[2] ? parseInt(args[2], 10) : 0,\n          decrement: decrement ?? Weight.build(0, \"lb\"),\n          failures: args[4] ? parseInt(args[4], 10) : (decrement?.value ?? 0) > 0 ? 1 : 0,\n          failureCounter: args[5] ? parseInt(args[5], 10) : 0,\n        };\n        const script = `if (completedReps >= reps && completedRPE <= RPE) {\n    state.successCounter += 1\n    if (state.successCounter >= state.successes) {\n      weights += state.increment\n      state.successCounter = 0\n      state.failureCounter = 0\n    }\n  }\n  if (state.decrement > 0 && state.failures > 0) {\n    if (!(completedReps >= minReps && completedRPE <= RPE)) {\n      state.failureCounter += 1\n      if (state.failureCounter >= state.failures) {\n        weights -= state.decrement\n        state.failureCounter = 0\n        state.successCounter = 0\n      }\n    }\n  }`;\n        return {\n          success: true,\n          data: {\n            type: \"lp\",\n            state,\n            stateMetadata: {},\n            script,\n          },\n        };\n      }\n      case \"dp\": {\n        const increment = args[0] ? Weight.parsePct(args[0]) : Weight.build(0, \"lb\");\n        const state: IProgramState = {\n          increment: increment ?? Weight.build(0, \"lb\"),\n          minReps: args[1] ? parseInt(args[1], 10) : 0,\n          maxReps: args[2] ? parseInt(args[2], 10) : 0,\n        };\n        const script = `\nif (completedReps >= reps && completedRPE <= RPE) {\n  if (reps[ns] < state.maxReps) {\n    reps += 1\n  } else {\n    reps = state.minReps\n    weights += state.increment\n  }\n}`;\n        return {\n          success: true,\n          data: {\n            type: \"dp\",\n            state,\n            stateMetadata: {},\n            script,\n          },\n        };\n      }\n      case \"sum\": {\n        const increment = args[1] ? Weight.parsePct(args[1]) : Weight.build(0, \"lb\");\n        const state: IProgramState = {\n          reps: args[0] ? parseInt(args[0], 10) : 0,\n          increment: increment ?? Weight.build(0, \"lb\"),\n        };\n        const script = `if (sum(completedReps) >= state.reps) {\n        weights += state.increment\n      }`;\n        return {\n          success: true,\n          data: {\n            type: \"sum\",\n            state,\n            stateMetadata: {},\n            script,\n          },\n        };\n      }\n      case \"custom\": {\n        const script = opts.script;\n        let errorMessage: string | undefined;\n        const { state, stateMetadata } = PlannerExerciseEvaluator.fnArgsToStateVars(args, (message) => {\n          errorMessage = message;\n        });\n        if (errorMessage) {\n          return {\n            success: false,\n            error: errorMessage,\n          };\n        }\n        return {\n          success: true,\n          data: {\n            type: \"custom\",\n            state,\n            stateMetadata,\n            script,\n            reuse: opts.reuseFullname ? { fullName: opts.reuseFullname, source: \"specific\" } : undefined,\n          },\n        };\n      }\n    }\n  }\n\n  public static progressionType(exercise: IPlannerProgramExercise): IProgressionType | undefined {\n    const progress = exercise.progress;\n    if (!progress) {\n      return undefined;\n    }\n    const name = progress.type;\n    const state = PlannerProgramExercise.getState(exercise);\n    if (name === \"lp\") {\n      return {\n        type: \"linear\",\n        increase: state.increment as IWeight,\n        successesRequired: state.successes as number,\n        successesCounter: state.successCounter as number,\n        decrease: state.decrement as IWeight,\n        failuresRequired: state.failures as number,\n        failuresCounter: state.failureCounter as number,\n      };\n    } else if (name === \"dp\") {\n      return {\n        type: \"double\",\n        increase: state.increment as IWeight,\n        minReps: state.minReps as number,\n        maxReps: state.maxReps as number,\n      };\n    } else if (name === \"sum\") {\n      return {\n        type: \"sumreps\",\n        increase: state.increment as IWeight,\n        reps: state.reps as number,\n      };\n    } else if (name === \"custom\") {\n      return { type: \"custom\" };\n    }\n    return undefined;\n  }\n\n  public static shortNameFromFullName(fullName: string, settings: ISettings): string {\n    const allEquipment = Equipment.currentEquipment(settings);\n    const { name, equipment } = PlannerExerciseEvaluator.extractNameParts(fullName, settings.exercises, allEquipment);\n    const exercise = Exercise.findByName(name, settings.exercises, allEquipment);\n    if (exercise != null && Exercise.isCustom(exercise.id, settings.exercises)) {\n      return Exercise.variationLabel(name, equipment, exercise, settings);\n    }\n    return `${name}${equipment ? `, ${equipmentName(equipment)}` : \"\"}`;\n  }\n\n  public static createExerciseFromEntry(\n    entry: IHistoryEntry,\n    dayData: Required<IDayData>,\n    settings: ISettings,\n    index: number\n  ): IPlannerProgramExercise {\n    const exerciseType = entry.exercise;\n    const exercise = Exercise.get(exerciseType, settings.exercises);\n    const fullName = Exercise.fullName(exercise, settings);\n    const shortName = this.shortNameFromFullName(fullName, settings);\n    const { name, equipment } = PlannerExerciseEvaluator.extractNameParts(\n      fullName,\n      settings.exercises,\n      Equipment.currentEquipment(settings)\n    );\n    const setVariations: IPlannerProgramExerciseSetVariation[] = [\n      {\n        isCurrent: false,\n        sets: entry.sets.map((set) => ({\n          repRange: {\n            numberOfSets: 1,\n            maxrep: set.completedReps ?? set.reps,\n            minrep: set.minReps,\n            isAmrap: !!set.isAmrap,\n            isQuickAddSet: false,\n          },\n          timer: set.timer,\n          rpe: set.rpe,\n          logRpe: set.logRpe,\n          percentage: Weight.isPct(set.originalWeight) ? set.originalWeight.value : undefined,\n          weight: !Weight.isPct(set.originalWeight) ? (set.completedWeight ?? set.weight) : undefined,\n          askWeight: set.askWeight,\n        })),\n      },\n    ];\n    const groupedWarmupSets = CollectionUtils.compact(\n      ObjectUtils.values(\n        CollectionUtils.groupByExpr(entry.warmupSets, (set) => {\n          return `${set.completedReps ?? set.reps}-${(set.completedWeight ?? set.weight ?? { value: \"\" }).value}`;\n        })\n      )\n    );\n    const plannerExercise: IPlannerProgramExercise = {\n      id: UidFactory.generateUid(8),\n      key: PlannerKey.fromExerciseType(exercise),\n      fullName,\n      shortName,\n      dayData,\n      exerciseType,\n      repeat: [],\n      repeating: [],\n      exerciseIndex: index,\n      order: 0,\n      text: \"\",\n      tags: [],\n      equipment,\n      name,\n      line: 1,\n      evaluatedSetVariations: [],\n      setVariations: setVariations,\n      warmupSets: groupedWarmupSets.map((group) => ({\n        type: \"warmup\",\n        numberOfSets: group.length,\n        reps: group[0]?.completedReps ?? group[0]?.reps ?? 1,\n        weight: group[0]?.completedWeight ?? group[0]?.weight,\n      })),\n      descriptions: { values: [] },\n      globals: {},\n      points: {\n        fullName: { line: 1, offset: 0, from: 0, to: 0 },\n      },\n    };\n    const evaluatedSetVariations = this.evaluateSetVariations(plannerExercise, setVariations);\n    plannerExercise.evaluatedSetVariations = evaluatedSetVariations;\n    return plannerExercise;\n  }\n}\n","export namespace DateUtils {\n  export function format(dateStr: string | Date | number, hideWeekday?: boolean, hideYear?: boolean): string {\n    let date;\n    if (typeof dateStr === \"string\") {\n      date = new Date(Date.parse(dateStr));\n    } else if (typeof dateStr === \"number\") {\n      date = new Date(dateStr);\n    } else {\n      date = dateStr;\n    }\n    return date.toLocaleDateString(undefined, {\n      weekday: !hideWeekday ? \"short\" : undefined,\n      year: !hideYear ? \"numeric\" : undefined,\n      month: \"short\",\n      day: \"numeric\",\n    });\n  }\n\n  export function formatWithTime(dateStr: string | Date | number): string {\n    let date;\n    if (typeof dateStr === \"string\") {\n      date = new Date(Date.parse(dateStr));\n    } else if (typeof dateStr === \"number\") {\n      date = new Date(dateStr);\n    } else {\n      date = dateStr;\n    }\n    return date.toLocaleDateString(undefined, {\n      weekday: \"short\",\n      year: \"numeric\",\n      month: \"short\",\n      day: \"numeric\",\n      hour: \"numeric\",\n      minute: \"numeric\",\n    });\n  }\n\n  export function formatYYYYMMDD(date: Date | string | number, separator: string = \"-\"): string {\n    const d = new Date(date);\n    let month = `${d.getMonth() + 1}`;\n    let day = `${d.getDate()}`;\n    const year = `${d.getFullYear()}`;\n\n    if (month.length < 2) {\n      month = `0${month}`;\n    }\n    if (day.length < 2) {\n      day = `0${day}`;\n    }\n\n    return [year, month, day].join(separator);\n  }\n\n  export function formatUTCYYYYMMDD(date: Date | string | number): string {\n    const d = new Date(date);\n    let month = `${d.getUTCMonth() + 1}`;\n    let day = `${d.getUTCDate()}`;\n    const year = `${d.getUTCFullYear()}`;\n\n    if (month.length < 2) {\n      month = `0${month}`;\n    }\n    if (day.length < 2) {\n      day = `0${day}`;\n    }\n\n    return [year, month, day].join(\"-\");\n  }\n\n  export function formatUTCYYYYMMDDHHMM(date: Date | string | number): string {\n    const d = new Date(date);\n    let minutes = `${d.getUTCMinutes()}`;\n    let hours = `${d.getUTCHours()}`;\n    let day = `${d.getUTCDate()}`;\n    let month = `${d.getUTCMonth() + 1}`;\n    const year = `${d.getUTCFullYear()}`;\n\n    if (minutes.length < 2) {\n      minutes = `0${minutes}`;\n    }\n    if (hours.length < 2) {\n      hours = `0${hours}`;\n    }\n    if (month.length < 2) {\n      month = `0${month}`;\n    }\n    if (day.length < 2) {\n      day = `0${day}`;\n    }\n\n    return `${[year, month, day].join(\"-\")} ${hours}:${minutes}`;\n  }\n\n  export function parseYYYYMMDDHHMM(dateStr: string): Date | undefined {\n    const match = dateStr.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})$/);\n    if (match != null) {\n      const [, year, month, day, hours, minutes, seconds] = match;\n      return new Date(\n        new Date(\n          parseInt(year, 10),\n          parseInt(month, 10) - 1,\n          parseInt(day, 10),\n          parseInt(hours, 10),\n          parseInt(minutes, 10),\n          parseInt(seconds, 10)\n        )\n      );\n    }\n    return undefined;\n  }\n\n  export function formatYYYYMMDDHHMM(date: Date | string | number, separator: string = \"\"): string {\n    const d = new Date(date);\n    let seconds = `${d.getSeconds()}`;\n    let minutes = `${d.getMinutes()}`;\n    let hours = `${d.getHours()}`;\n    let day = `${d.getDate()}`;\n    let month = `${d.getMonth() + 1}`;\n    const year = `${d.getFullYear()}`;\n\n    if (seconds.length < 2) {\n      seconds = `0${seconds}`;\n    }\n    if (minutes.length < 2) {\n      minutes = `0${minutes}`;\n    }\n    if (hours.length < 2) {\n      hours = `0${hours}`;\n    }\n    if (month.length < 2) {\n      month = `0${month}`;\n    }\n    if (day.length < 2) {\n      day = `0${day}`;\n    }\n\n    return [year, month, day, hours, minutes, seconds].join(separator);\n  }\n\n  export function firstDayOfWeekTimestamp(date: Date | number, startWeekFromMonday?: boolean): number {\n    const d = new Date(date);\n    let weekDay = d.getDay();\n    if (startWeekFromMonday && weekDay === 0) {\n      weekDay = 7;\n    }\n    const currentDay = d.getDate();\n    const beginningOfWeekDay = currentDay - weekDay + (startWeekFromMonday ? 1 : 0);\n    const newDate = new Date(d.getFullYear(), d.getMonth(), beginningOfWeekDay);\n    return newDate.getTime();\n  }\n\n  export function lastDayOfWeekTimestamp(date: Date | number, startWeekFromMonday?: boolean): number {\n    const d = new Date(date);\n    let weekDay = d.getDay();\n    if (startWeekFromMonday && weekDay === 0) {\n      weekDay = 7;\n    }\n    const currentDay = d.getDate();\n    const endOfWeekDay = currentDay + (7 - weekDay) + (startWeekFromMonday ? 1 : 0);\n    const newDate = new Date(d.getFullYear(), d.getMonth(), endOfWeekDay, 23, 59, 59);\n    return newDate.getTime();\n  }\n\n  export function formatHHMMSS(date: Date | string | number, withMs: boolean = false): string {\n    const d = new Date(date);\n    let seconds = `${d.getSeconds()}`;\n    let minutes = `${d.getMinutes()}`;\n    let hours = `${d.getHours()}`;\n\n    if (seconds.length < 2) {\n      seconds = `0${seconds}`;\n    }\n    if (minutes.length < 2) {\n      minutes = `0${minutes}`;\n    }\n    if (hours.length < 2) {\n      hours = `0${hours}`;\n    }\n    let result = [hours, minutes, seconds].join(\":\");\n    if (withMs) {\n      result += `.${d.getMilliseconds()}`;\n    }\n    return result;\n  }\n\n  export function fromYYYYMMDD(dateStr: string, separator: string = \"-\"): Date {\n    const regexp = new RegExp(`^(\\\\d{4})${separator}(\\\\d{2})${separator}(\\\\d{2})$`);\n    const regexpMatchArray = dateStr.match(regexp);\n    if (regexpMatchArray) {\n      const [, year, month, day] = regexpMatchArray;\n      const date = new Date(parseInt(year, 10), parseInt(month, 10) - 1, parseInt(day, 10));\n      return date;\n    } else {\n      return new Date(Date.UTC(1970, 1, 1));\n    }\n  }\n\n  export function fromYYYYMMDDStr(dateStr: string, separator: string = \"-\"): string {\n    return DateUtils.fromYYYYMMDD(dateStr, separator).toISOString();\n  }\n\n  export function yearAndMonth(date: Date | string | number): [number, number] {\n    const d = new Date(date);\n    return [d.getUTCFullYear(), d.getUTCMonth()];\n  }\n\n  export function dayOfWeekStr(date: string): string {\n    const d = new Date(fromYYYYMMDDStr(date));\n    return d.toLocaleDateString(undefined, { weekday: \"long\" });\n  }\n\n  export function formatRange(start: Date | string | number, end: Date | string | number): string {\n    const startDate = new Date(start);\n    const endDate = new Date(end);\n    if (startDate.getFullYear() !== endDate.getFullYear()) {\n      return `${format(startDate, true)} - ${format(endDate, true)}`;\n    } else {\n      if (startDate.getMonth() !== endDate.getMonth()) {\n        const formattedStart = startDate.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n        const formattedEnd = endDate.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n        return `${formattedStart} - ${formattedEnd}, ${startDate.getFullYear()}`;\n      } else {\n        const month = startDate.toLocaleDateString(undefined, { month: \"short\" });\n        return `${month} ${startDate.getDate()}-${endDate.getDate()}, ${startDate.getFullYear()}`;\n      }\n    }\n  }\n}\n","import { lb } from \"lens-shmens\";\nimport { emptyProgramId, IEvaluatedProgram, Program } from \"./program\";\nimport { IDispatch } from \"@client/ducks/types\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { updateState, IState } from \"./state\";\nimport { IProgram, IDayData, IProgramState, ISettings } from \"../types\";\nimport { updateStateVariable } from \"./editProgramLenses\";\nimport { IPlannerProgramExercise, IPlannerExerciseState, IPlannerState } from \"@client/pages/planner/models/types\";\nimport { PP } from \"./pp\";\nimport { PlannerProgramExercise } from \"@client/pages/planner/models/plannerProgramExercise\";\nimport { ProgramToPlanner } from \"./programToPlanner\";\nimport { Thunk } from \"@client/ducks/thunks\";\n\nexport namespace EditProgram {\n  export function properlyUpdateStateVariableInPlace(\n    program: IEvaluatedProgram,\n    programExercise: IPlannerProgramExercise,\n    values: Partial<IProgramState>\n  ): IEvaluatedProgram {\n    const state = PlannerProgramExercise.getState(programExercise);\n    values = ObjectUtils.diff(state, values);\n    if (ObjectUtils.keys(values).length === 0) {\n      return program;\n    }\n    if (!programExercise.progress) {\n      return program;\n    }\n    const newEvalutedProgram = ObjectUtils.clone(program);\n    PP.iterate2(newEvalutedProgram.weeks, (ex) => {\n      if (ex.key === programExercise.key) {\n        const progress = ex.progress;\n        if (progress) {\n          for (const [stateKey, newValue] of ObjectUtils.entries(values)) {\n            if (newValue == null) {\n              delete progress.stateMetadata?.[stateKey];\n            }\n            if (newValue == null || typeof newValue === \"string\") {\n              progress.state = updateStateVariable(state, stateKey, newValue);\n            } else {\n              progress.state = { ...progress.state, [stateKey]: newValue };\n            }\n          }\n        }\n      }\n    });\n    return newEvalutedProgram;\n  }\n\n  export function deleteProgram(dispatch: IDispatch, program: IProgram, customPrograms: IProgram[]): void {\n    updateState(\n      dispatch,\n      [\n        lb<IState>()\n          .p(\"storage\")\n          .p(\"programs\")\n          .recordModify((pgms) => pgms.filter((p) => p.id !== program.id)),\n        lb<IState>()\n          .p(\"storage\")\n          .p(\"currentProgramId\")\n          .recordModify((id) =>\n            id === program.id ? (customPrograms.filter((p) => p.id !== program.id)[0]?.id ?? emptyProgramId) : id\n          ),\n      ],\n      \"Delete program\"\n    );\n  }\n\n  export function setName(dispatch: IDispatch, program: IProgram, name: string): void {\n    updateState(\n      dispatch,\n      [\n        lb<IState>().p(\"storage\").p(\"programs\").findBy(\"id\", program.id).p(\"name\").record(name),\n        lb<IState>().p(\"storage\").p(\"programs\").findBy(\"id\", program.id).pi(\"planner\").p(\"name\").record(name),\n      ],\n      \"Update program name\"\n    );\n  }\n\n  export function initPlannerState(id: string, program: IProgram, focusedDay?: IDayData, key?: string): IPlannerState {\n    return {\n      id,\n      current: { program: { ...program } },\n      ui: {\n        weekIndex: focusedDay?.week != null ? focusedDay.week - 1 : 0,\n        focusedDay: focusedDay ? { ...focusedDay, key } : undefined,\n        mode: \"ui\",\n        exerciseUi: { edit: new Set(), collapsed: new Set() },\n        dayUi: { collapsed: new Set() },\n        weekUi: { collapsed: new Set() },\n      },\n      history: { past: [], future: [] },\n    };\n  }\n\n  export function initPlannerProgramExerciseState(\n    program: IProgram,\n    settings: ISettings,\n    key: string,\n    dayData: Required<IDayData>,\n    fromWorkout: boolean\n  ): IPlannerExerciseState {\n    const evaluatedProgram = Program.evaluate(program, settings);\n    const programExercise = Program.getFirstProgramExercise(evaluatedProgram, key);\n    return {\n      current: { program: ObjectUtils.clone(program) },\n      history: { past: [], future: [] },\n      ui: {\n        weekIndex: dayData.week - 1,\n        isProgressEnabled: !!programExercise?.progress,\n        isUpdateEnabled: !!programExercise?.update,\n        modeTabIndex: fromWorkout ? 1 : 0,\n        acrossWeeksTabIndex: fromWorkout ? 1 : undefined,\n      },\n    };\n  }\n\n  export function create(dispatch: IDispatch, name: string): void {\n    const newProgram: IProgram = {\n      ...Program.create(name),\n      planner: {\n        vtype: \"planner\",\n        name,\n        weeks: [{ name: \"Week 1\", days: [{ name: \"Day 1\", exerciseText: \"\" }] }],\n      },\n    };\n\n    updateState(\n      dispatch,\n      [\n        lb<IState>()\n          .p(\"storage\")\n          .p(\"programs\")\n          .recordModify((pgms) => [...pgms, newProgram]),\n        lb<IState>().p(\"storage\").p(\"currentProgramId\").record(newProgram.id),\n      ],\n      \"Create program\"\n    );\n    dispatch(Thunk.pushToEditProgram());\n  }\n\n  export function updateProgram(dispatch: IDispatch, program: IProgram): void {\n    updateState(\n      dispatch,\n      [lb<IState>().p(\"storage\").p(\"programs\").findBy(\"id\", program.id).record(program)],\n      \"Update program\"\n    );\n  }\n\n  export function regenerateProgram(\n    program: IProgram,\n    evaluatedProgram: IEvaluatedProgram,\n    settings: ISettings\n  ): IProgram {\n    const newPlanner = new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner();\n    return { ...program, planner: newPlanner };\n  }\n}\n","export namespace MathUtils {\n  export function round(value: number, to: number): number {\n    return roundFloat(Math.round(value / to) * to, 4);\n  }\n\n  export function roundTo05(value: number): number {\n    return round(value, 0.5);\n  }\n\n  export function roundTo005(value: number): number {\n    return round(value, 0.05);\n  }\n\n  export function roundTo0005(value: number): number {\n    return round(value, 0.005);\n  }\n\n  export function roundTo00005(value: number): number {\n    return round(value, 0.0005);\n  }\n\n  export function roundTo000005(value: number): number {\n    return round(value, 0.00005);\n  }\n\n  export function roundFloat(value: number, precision: number): number {\n    return +value.toFixed(precision);\n  }\n\n  export function applyOp(a: number, b: number, opr: \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"=\"): number {\n    if (opr === \"=\") {\n      return b;\n    } else if (opr === \"+=\") {\n      return a + b;\n    } else if (opr === \"-=\") {\n      return a - b;\n    } else if (opr === \"*=\") {\n      return MathUtils.roundTo005(a * b);\n    } else {\n      return MathUtils.roundTo005(a / b);\n    }\n  }\n\n  export function clamp(value: number, min?: number, max?: number): number {\n    if (min != null && max != null) {\n      return Math.max(min, Math.min(max, value));\n    } else if (min != null) {\n      return Math.max(min, value);\n    } else if (max != null) {\n      return Math.min(max, value);\n    } else {\n      return value;\n    }\n  }\n\n  export function toWord(num?: number): string | undefined {\n    if (num == null) {\n      return undefined;\n    }\n    return [\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"ten\", \"eleven\", \"twelve\"][\n      num\n    ];\n  }\n\n  export function parse(value?: string): number | undefined {\n    if (value == null) {\n      return undefined;\n    }\n    const num = Number(value);\n    return isNaN(num) ? undefined : num;\n  }\n}\n\nexport function n(value: number, precision: number = 2): string {\n  return `${MathUtils.roundFloat(value, precision)}`;\n}\n","/* eslint-disable no-bitwise */\nexport namespace StringUtils {\n  export function pad(str: string, width: number, fill: string = \"0\"): string {\n    return str.length >= width ? str : new Array(width - str.length + 1).join(fill) + str;\n  }\n\n  export function capitalize(string: string): string {\n    return string[0].toUpperCase() + string.slice(1);\n  }\n\n  export function pluralize(string: string, count: number): string {\n    return `${string}${count !== 1 ? \"s\" : \"\"}`;\n  }\n\n  export function dashcase(string: string): string {\n    return string.replace(/[:,]/g, \"\").replace(/\\s+/g, \"-\").toLowerCase();\n  }\n\n  export function undashcase(string: string): string {\n    return string.replace(/-/g, \" \");\n  }\n\n  export function uncamelCase(string: string): string {\n    return string.replace(/([a-z])([A-Z])/g, \"$1 $2\");\n  }\n\n  export function camelCase(string: string): string {\n    return string\n      .replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (letter, index) => (index === 0 ? letter.toLowerCase() : letter.toUpperCase()))\n      .replace(/\\s+/g, \"\");\n  }\n\n  export function snakecase(string: string): string {\n    return string.replace(/[:,]/g, \"\").replace(/\\s+/g, \"_\").toLowerCase();\n  }\n\n  export function truncate(string: string, length: number): string {\n    if (string.length > length) {\n      return `${string.slice(0, length - 3)}...`;\n    } else {\n      return string;\n    }\n  }\n\n  export function unindent(string: string): string {\n    const indent2 = string.split(\"\\n\").reduce<number | undefined>((memo, line) => {\n      const match = line.match(/^(\\s*)\\S/);\n      if (match != null) {\n        const spaces = match[1];\n        if (memo == null || memo > spaces.length) {\n          return spaces.length;\n        }\n      }\n      return memo;\n    }, undefined);\n    if (indent2 != null) {\n      return string\n        .split(\"\\n\")\n        .filter((s) => s.trim() !== \"\")\n        .map((s) => s.slice(indent2, s.length).trimEnd())\n        .join(\"\\n\");\n    } else {\n      return string;\n    }\n  }\n\n  export function indent(string: string, spaces: number): string {\n    const indent2 = new Array(spaces + 1).join(\" \");\n    return string\n      .split(\"\\n\")\n      .map((s) => (s.trim() !== \"\" ? `${indent2}${s}` : s))\n      .join(\"\\n\");\n  }\n\n  export function fuzzySearch(needle: string, haystack: string): boolean {\n    if (needle.length > haystack.length) {\n      return false;\n    } else if (needle === haystack) {\n      return true;\n    } else {\n      outer: for (let i = 0, j = 0; i < needle.length; i++) {\n        const nch = needle.charCodeAt(i);\n        while (j < haystack.length) {\n          // eslint-disable-next-line no-plusplus\n          if (haystack.charCodeAt(j++) === nch) {\n            continue outer;\n          }\n        }\n        return false;\n      }\n      return true;\n    }\n  }\n\n  export function nextName(name: string): string {\n    const match = name.match(/(\\d+)$/);\n    if (match) {\n      const number = parseInt(match[0], 10);\n      return name.replace(/\\d+$/, (number + 1).toString());\n    }\n    return name + \" 2\";\n  }\n\n  export function hashCode(str: string): number {\n    let hash = 0;\n    for (let i = 0; i < str.length; i++) {\n      hash = (hash << 5) - hash + str.charCodeAt(i);\n      hash |= 0; // Convert to 32bit integer\n    }\n    return hash;\n  }\n\n  export function hashString(str: string): string {\n    return new Uint32Array([hashCode(str)])[0].toString(16);\n  }\n\n  export function hashCode0To1(str: string): number {\n    const hash = Math.abs(hashCode(str));\n    return (hash % 10000) / 10000;\n  }\n\n  export function cleanJson(str: string): string {\n    return str.trim().replace(/^[\\s\\S]*?(\\{[\\s\\S]*\\})[\\s\\S]*?$/, \"$1\");\n  }\n}\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    var desc = Object.getOwnPropertyDescriptor(m, k);\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n    }\n    Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n    __setModuleDefault(result, mod);\n    return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ap = ap;\nexports.apFirst = apFirst;\nexports.apSecond = apSecond;\nexports.apS = apS;\nexports.getApplySemigroup = getApplySemigroup;\nexports.sequenceT = sequenceT;\nexports.sequenceS = sequenceS;\n/**\n * The `Apply` class provides the `ap` which is used to apply a function to an argument under a type constructor.\n *\n * `Apply` can be used to lift functions of two or more arguments to work on values wrapped with the type constructor\n * `f`.\n *\n * Instances must satisfy the following law in addition to the `Functor` laws:\n *\n * 1. Associative composition: `F.ap(F.ap(F.map(fbc, bc => ab => a => bc(ab(a))), fab), fa) <-> F.ap(fbc, F.ap(fab, fa))`\n *\n * Formally, `Apply` represents a strong lax semi-monoidal endofunctor.\n *\n * @example\n * import * as O from 'fp-ts/Option'\n * import { pipe } from 'fp-ts/function'\n *\n * const f = (a: string) => (b: number) => (c: boolean) => a + String(b) + String(c)\n * const fa: O.Option<string> = O.some('s')\n * const fb: O.Option<number> = O.some(1)\n * const fc: O.Option<boolean> = O.some(true)\n *\n * assert.deepStrictEqual(\n *   pipe(\n *     // lift a function\n *     O.some(f),\n *     // apply the first argument\n *     O.ap(fa),\n *     // apply the second argument\n *     O.ap(fb),\n *     // apply the third argument\n *     O.ap(fc)\n *   ),\n *   O.some('s1true')\n * )\n *\n * @since 2.0.0\n */\nvar function_1 = require(\"./function\");\nvar _ = __importStar(require(\"./internal\"));\nfunction ap(F, G) {\n    return function (fa) {\n        return function (fab) {\n            return F.ap(F.map(fab, function (gab) { return function (ga) { return G.ap(gab, ga); }; }), fa);\n        };\n    };\n}\nfunction apFirst(A) {\n    return function (second) { return function (first) {\n        return A.ap(A.map(first, function (a) { return function () { return a; }; }), second);\n    }; };\n}\nfunction apSecond(A) {\n    return function (second) {\n        return function (first) {\n            return A.ap(A.map(first, function () { return function (b) { return b; }; }), second);\n        };\n    };\n}\nfunction apS(F) {\n    return function (name, fb) {\n        return function (fa) {\n            return F.ap(F.map(fa, function (a) { return function (b) {\n                var _a;\n                return Object.assign({}, a, (_a = {}, _a[name] = b, _a));\n            }; }), fb);\n        };\n    };\n}\nfunction getApplySemigroup(F) {\n    return function (S) { return ({\n        concat: function (first, second) {\n            return F.ap(F.map(first, function (x) { return function (y) { return S.concat(x, y); }; }), second);\n        }\n    }); };\n}\nfunction curried(f, n, acc) {\n    return function (x) {\n        var combined = Array(acc.length + 1);\n        for (var i = 0; i < acc.length; i++) {\n            combined[i] = acc[i];\n        }\n        combined[acc.length] = x;\n        return n === 0 ? f.apply(null, combined) : curried(f, n - 1, combined);\n    };\n}\nvar tupleConstructors = {\n    1: function (a) { return [a]; },\n    2: function (a) { return function (b) { return [a, b]; }; },\n    3: function (a) { return function (b) { return function (c) { return [a, b, c]; }; }; },\n    4: function (a) { return function (b) { return function (c) { return function (d) { return [a, b, c, d]; }; }; }; },\n    5: function (a) { return function (b) { return function (c) { return function (d) { return function (e) { return [a, b, c, d, e]; }; }; }; }; }\n};\nfunction getTupleConstructor(len) {\n    if (!_.has.call(tupleConstructors, len)) {\n        tupleConstructors[len] = curried(function_1.tuple, len - 1, []);\n    }\n    return tupleConstructors[len];\n}\nfunction sequenceT(F) {\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var len = args.length;\n        var f = getTupleConstructor(len);\n        var fas = F.map(args[0], f);\n        for (var i = 1; i < len; i++) {\n            fas = F.ap(fas, args[i]);\n        }\n        return fas;\n    };\n}\nfunction getRecordConstructor(keys) {\n    var len = keys.length;\n    switch (len) {\n        case 1:\n            return function (a) {\n                var _a;\n                return (_a = {}, _a[keys[0]] = a, _a);\n            };\n        case 2:\n            return function (a) { return function (b) {\n                var _a;\n                return (_a = {}, _a[keys[0]] = a, _a[keys[1]] = b, _a);\n            }; };\n        case 3:\n            return function (a) { return function (b) { return function (c) {\n                var _a;\n                return (_a = {}, _a[keys[0]] = a, _a[keys[1]] = b, _a[keys[2]] = c, _a);\n            }; }; };\n        case 4:\n            return function (a) { return function (b) { return function (c) { return function (d) {\n                var _a;\n                return (_a = {},\n                    _a[keys[0]] = a,\n                    _a[keys[1]] = b,\n                    _a[keys[2]] = c,\n                    _a[keys[3]] = d,\n                    _a);\n            }; }; }; };\n        case 5:\n            return function (a) { return function (b) { return function (c) { return function (d) { return function (e) {\n                var _a;\n                return (_a = {},\n                    _a[keys[0]] = a,\n                    _a[keys[1]] = b,\n                    _a[keys[2]] = c,\n                    _a[keys[3]] = d,\n                    _a[keys[4]] = e,\n                    _a);\n            }; }; }; }; };\n        default:\n            return curried(function () {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments[_i];\n                }\n                var r = {};\n                for (var i = 0; i < len; i++) {\n                    r[keys[i]] = args[i];\n                }\n                return r;\n            }, len - 1, []);\n    }\n}\nfunction sequenceS(F) {\n    return function (r) {\n        var keys = Object.keys(r);\n        var len = keys.length;\n        var f = getRecordConstructor(keys);\n        var fr = F.map(r[keys[0]], f);\n        for (var i = 1; i < len; i++) {\n            fr = F.ap(fr, r[keys[i]]);\n        }\n        return fr;\n    };\n}\n","import {\n  ISettings,\n  IPlannerSettings,\n  IAllEquipment,\n  IAllCustomExercises,\n  ITargetType,\n  targetTypes,\n  IProgram,\n  IExerciseType,\n  IWeight,\n} from \"../types\";\nimport { Weight } from \"./weight\";\nimport { IExportedProgram, Program } from \"./program\";\nimport { ObjectUtils } from \"../utils/object\";\nimport { lb } from \"lens-shmens\";\nimport { updateSettings } from \"./state\";\nimport { IDispatch } from \"@client/ducks/types\";\nimport { Exercise, IExercise } from \"./exercise\";\nimport { CollectionUtils } from \"../utils/collection\";\nimport { ProgramExercise } from \"./programExercise\";\nimport { IExercisePickerSettings } from \"@client/components/exercisePicker/exercisePickerSettings\";\nimport { SendMessage } from \"@client/utils/sendMessage\";\n\nexport namespace Settings {\n  export function programContentBuild(): Pick<ISettings, \"timers\" | \"units\" | \"planner\"> {\n    return {\n      timers: {\n        warmup: 90,\n        workout: 180,\n        reminder: 900,\n      },\n      units: \"kg\",\n      planner: buildPlannerSettings(),\n    };\n  }\n\n  export function defaultEquipment(): IAllEquipment {\n    return {\n      barbell: {\n        vtype: \"equipment_data\",\n        name: \"Barbell\",\n        multiplier: 2,\n        bar: {\n          lb: Weight.build(45, \"lb\"),\n          kg: Weight.build(20, \"kg\"),\n        },\n        plates: [\n          { weight: Weight.build(45, \"lb\"), num: 8 },\n          { weight: Weight.build(25, \"lb\"), num: 4 },\n          { weight: Weight.build(10, \"lb\"), num: 4 },\n          { weight: Weight.build(5, \"lb\"), num: 4 },\n          { weight: Weight.build(2.5, \"lb\"), num: 4 },\n          { weight: Weight.build(1.25, \"lb\"), num: 2 },\n          { weight: Weight.build(20, \"kg\"), num: 8 },\n          { weight: Weight.build(10, \"kg\"), num: 4 },\n          { weight: Weight.build(5, \"kg\"), num: 4 },\n          { weight: Weight.build(2.5, \"kg\"), num: 4 },\n          { weight: Weight.build(1.25, \"kg\"), num: 4 },\n          { weight: Weight.build(0.5, \"kg\"), num: 2 },\n        ],\n        fixed: [],\n        isFixed: false,\n      },\n      dumbbell: {\n        vtype: \"equipment_data\",\n        name: \"Dumbbell\",\n        multiplier: 2,\n        bar: {\n          lb: Weight.build(10, \"lb\"),\n          kg: Weight.build(5, \"kg\"),\n        },\n        plates: [\n          { weight: Weight.build(10, \"lb\"), num: 8 },\n          { weight: Weight.build(5, \"lb\"), num: 4 },\n          { weight: Weight.build(2.5, \"lb\"), num: 4 },\n          { weight: Weight.build(1.25, \"lb\"), num: 2 },\n          { weight: Weight.build(5, \"kg\"), num: 8 },\n          { weight: Weight.build(2.5, \"kg\"), num: 4 },\n          { weight: Weight.build(1.25, \"kg\"), num: 4 },\n          { weight: Weight.build(0.5, \"kg\"), num: 2 },\n        ],\n        fixed: [\n          Weight.build(10, \"lb\"),\n          Weight.build(15, \"lb\"),\n          Weight.build(20, \"lb\"),\n          Weight.build(25, \"lb\"),\n          Weight.build(30, \"lb\"),\n          Weight.build(35, \"lb\"),\n          Weight.build(40, \"lb\"),\n          Weight.build(4, \"kg\"),\n          Weight.build(6, \"kg\"),\n          Weight.build(8, \"kg\"),\n          Weight.build(10, \"kg\"),\n          Weight.build(12, \"kg\"),\n          Weight.build(14, \"kg\"),\n          Weight.build(20, \"kg\"),\n        ],\n        isFixed: false,\n      },\n      kettlebell: {\n        vtype: \"equipment_data\",\n        name: \"Kettlebell\",\n        multiplier: 1,\n        bar: {\n          lb: Weight.build(0, \"lb\"),\n          kg: Weight.build(0, \"kg\"),\n        },\n        plates: [],\n        fixed: [\n          Weight.build(10, \"lb\"),\n          Weight.build(15, \"lb\"),\n          Weight.build(20, \"lb\"),\n          Weight.build(25, \"lb\"),\n          Weight.build(30, \"lb\"),\n          Weight.build(35, \"lb\"),\n          Weight.build(40, \"lb\"),\n          Weight.build(4, \"kg\"),\n          Weight.build(8, \"kg\"),\n          Weight.build(12, \"kg\"),\n          Weight.build(16, \"kg\"),\n          Weight.build(24, \"kg\"),\n        ],\n        isFixed: true,\n      },\n    };\n  }\n\n  export function build(): ISettings {\n    return {\n      ...programContentBuild(),\n      graphsSettings: {\n        isSameXAxis: false,\n        isWithBodyweight: false,\n        isWithOneRm: true,\n      },\n      exerciseData: {},\n      assessmentResults: {},\n      graphOptions: {},\n      exerciseStatsSettings: {\n        ascendingSort: false,\n      },\n      gyms: [\n        {\n          vtype: \"gym\",\n          id: \"default\",\n          name: \"Main\",\n          equipment: defaultEquipment(),\n        },\n      ],\n      deletedGyms: [],\n      volume: 1.0,\n      vibration: false,\n      startWeekFromMonday: false,\n      lengthUnits: \"cm\",\n      workoutSettings: {\n        targetType: \"target\",\n        shouldHideGraphs: true,\n      },\n      statsEnabled: { weight: { weight: true }, length: {}, percentage: {} },\n      exercises: {},\n      graphs: { graphs: [], vtype: \"graphs\" },\n      planner: buildPlannerSettings(),\n      muscleGroups: {\n        vtype: \"muscle_groups_settings\",\n        data: {},\n      },\n    };\n  }\n\n  export function buildPlannerSettings(): IPlannerSettings {\n    return {\n      strengthSetsPct: 30,\n      hypertrophySetsPct: 70,\n      weeklyRangeSets: {\n        shoulders: [10, 12],\n        triceps: [10, 12],\n        back: [10, 12],\n        abs: [10, 12],\n        glutes: [10, 12],\n        hamstrings: [10, 12],\n        quadriceps: [10, 12],\n        chest: [10, 12],\n        biceps: [10, 12],\n        calves: [10, 12],\n        forearms: [10, 12],\n      },\n      weeklyFrequency: {\n        shoulders: 2,\n        triceps: 2,\n        back: 2,\n        abs: 2,\n        glutes: 2,\n        hamstrings: 2,\n        quadriceps: 2,\n        chest: 2,\n        biceps: 2,\n        calves: 2,\n        forearms: 2,\n      },\n      synergistMultiplier: 0.5,\n    };\n  }\n\n  export function applyExportedProgram(settings: ISettings, exportedProgram: IExportedProgram): ISettings {\n    return {\n      ...settings,\n      exercises: {\n        ...settings.exercises,\n        ...exportedProgram.customExercises,\n      },\n      units: exportedProgram.settings.units || settings.units,\n      timers: {\n        ...settings.timers,\n        workout: exportedProgram.settings.timers?.workout || settings.timers.workout,\n        warmup: exportedProgram.settings.timers?.warmup || settings.timers.warmup,\n      },\n      planner: exportedProgram.settings.planner || settings.planner,\n      muscleGroups: exportedProgram.settings.muscleGroups || settings.muscleGroups,\n      exerciseData: { ...exportedProgram.settings.exerciseData, ...settings.exerciseData },\n    };\n  }\n\n  export function activeCustomExercises(settings: ISettings): IAllCustomExercises {\n    return ObjectUtils.filter(settings.exercises, (k, v) => !v?.isDeleted);\n  }\n\n  export function getNextTargetType(type: ITargetType, skipPlatesCalculator: boolean): ITargetType {\n    const index = targetTypes.indexOf(type);\n    let nextTargetType: ITargetType;\n    if (index === -1) {\n      nextTargetType = targetTypes[0];\n    } else if (index === targetTypes.length - 1) {\n      nextTargetType = targetTypes[0];\n    } else {\n      nextTargetType = targetTypes[index + 1];\n    }\n    if (nextTargetType === \"platescalculator\" && skipPlatesCalculator) {\n      nextTargetType = getNextTargetType(\"platescalculator\", skipPlatesCalculator);\n    }\n    return nextTargetType;\n  }\n\n  export function toggleStarredExercise(dispatch: IDispatch, key: string): void {\n    updateSettings(\n      dispatch,\n      lb<ISettings>()\n        .p(\"starredExercises\")\n        .recordModify((starred) => {\n          if (starred?.[key]) {\n            delete starred[key];\n          } else {\n            starred = starred || {};\n            starred[key] = true;\n          }\n          return starred;\n        }),\n      `Toggle starred exercise ${key}`\n    );\n  }\n\n  export function changePickerSettings(dispatch: IDispatch, settings: IExercisePickerSettings): void {\n    updateSettings(\n      dispatch,\n      lb<ISettings>()\n        .p(\"workoutSettings\")\n        .recordModify((workoutSettings) => {\n          return { ...workoutSettings, shouldKeepProgramExerciseId: !!settings.shouldKeepProgramExerciseId };\n        }),\n      `Change picker settings`\n    );\n  }\n\n  export function doesProgramHaveUnset1RMs(program: IProgram, settings: ISettings): boolean {\n    return getExercisesWithUnset1RMs(program, settings).length > 0;\n  }\n\n  export function getExercisesWithUnset1RMs(program: IProgram, settings: ISettings): IExercise[] {\n    const evalutedProgram = Program.evaluate(program, settings);\n    const plannerExercises = Program.getAllUsedProgramExercises(evalutedProgram).filter((exercise) => {\n      return ProgramExercise.doesUse1RM(exercise);\n    });\n    const exerciseTypes = CollectionUtils.uniqByExpr(\n      plannerExercises\n        .filter((exercise) => {\n          return settings.exerciseData[Exercise.toKey(exercise.exerciseType)]?.rm1 == null;\n        })\n        .map((exercise) => exercise.exerciseType),\n      (e) => Exercise.toKey(e)\n    );\n    const exercises = exerciseTypes.map((e) => Exercise.get(e, settings.exercises));\n    return CollectionUtils.sort(exercises, (a, b) => {\n      return Exercise.nameWithEquipment(a, settings).localeCompare(Exercise.nameWithEquipment(b, settings));\n    });\n  }\n\n  export function setOneRM(\n    dispatch: IDispatch,\n    exerciseType: IExerciseType,\n    value: IWeight,\n    settings: ISettings\n  ): void {\n    updateSettings(\n      dispatch,\n      lb<ISettings>()\n        .p(\"exerciseData\")\n        .recordModify((data) => {\n          const key = Exercise.toKey(exerciseType);\n          return { ...data, [key]: { ...data[key], rm1: value } };\n        }),\n      `Set 1RM for ${Exercise.nameWithEquipment(Exercise.get(exerciseType, settings.exercises), settings)} to ${Weight.print(value)}`\n    );\n  }\n\n  export function getTheme(settings: ISettings): \"dark\" | \"light\" {\n    return settings.theme ? settings.theme : window.lftSystemDarkMode ? \"dark\" : \"light\";\n  }\n\n  export function applyTheme(theme?: \"dark\" | \"light\"): void {\n    if (theme === \"dark\") {\n      document.body.classList.add(\"dark\");\n      SendMessage.toIosAndAndroid({ type: \"theme\", value: \"dark\" });\n    } else {\n      document.body.classList.remove(\"dark\");\n      SendMessage.toIosAndAndroid({ type: \"theme\", value: \"light\" });\n    }\n  }\n}\n","const hour = 60 * 60 * 1000;\n\nexport interface IWorkoutTimes {\n  startTime: number;\n  endTime?: number;\n}\n\nexport namespace WorkoutLockText {\n  export const locked =\n    \"This workout is locked. Only your trainer can change it now. If there is a problem, contact your trainer.\";\n  export const nowLocked =\n    \"This workout is now locked. Your changes were not saved. Only your trainer can change it now. If there is a problem, contact your trainer.\";\n  export const future = \"A workout cannot end in the future.\";\n}\n\nexport namespace WorkoutLock {\n  export const lockHours = 72;\n\n  export function isOlderThan(record: IWorkoutTimes, time: number, limitMs: number): boolean {\n    return time - (record.endTime ?? record.startTime) > limitMs;\n  }\n\n  export function isLocked(serverRecord: IWorkoutTimes, time: number): boolean {\n    return isOlderThan(serverRecord, time, lockHours * hour);\n  }\n}\n","import { RefObject } from \"preact\";\nimport { useEffect, useRef } from \"preact/hooks\";\n\nconst focusableSelector =\n  'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n// Dialogs open now, oldest first. Only the last one handles keys, so Escape closes one dialog at a time.\nconst openDialogs: HTMLElement[] = [];\n\nfunction focusableIn(container: HTMLElement): HTMLElement[] {\n  return Array.from(container.querySelectorAll<HTMLElement>(focusableSelector)).filter(\n    (el) => el.getClientRects().length > 0\n  );\n}\n\n/**\n * Keyboard behaviour for a modal dialog while `isOpen`: moves focus into the dialog (unless something\n * inside already has it), keeps Tab inside, calls `onEscape` on Escape, and gives focus back to the\n * element that had it before the dialog opened. The dialog element needs `tabIndex={-1}`.\n */\nexport function useDialogFocus(\n  dialogRef: RefObject<HTMLElement>,\n  isOpen: boolean,\n  onEscape: (() => void) | undefined\n): void {\n  const onEscapeRef = useRef(onEscape);\n  onEscapeRef.current = onEscape;\n\n  useEffect(() => {\n    const dialog = dialogRef.current;\n    if (!isOpen || dialog == null) {\n      return undefined;\n    }\n    const previouslyFocused = document.activeElement as HTMLElement | null;\n    openDialogs.push(dialog);\n    if (!dialog.contains(document.activeElement)) {\n      dialog.focus({ preventScroll: true });\n    }\n\n    const keydownHandler = (event: KeyboardEvent): void => {\n      if (openDialogs[openDialogs.length - 1] !== dialog) {\n        return;\n      }\n      if (event.key === \"Escape\") {\n        // The custom number input uses Escape to close its keyboard; let it keep that key.\n        const active = document.activeElement as HTMLElement | null;\n        if (onEscapeRef.current && !active?.closest(\".input-number\")) {\n          event.preventDefault();\n          onEscapeRef.current();\n        }\n      } else if (event.key === \"Tab\") {\n        const focusable = focusableIn(dialog);\n        if (focusable.length === 0) {\n          event.preventDefault();\n          dialog.focus();\n          return;\n        }\n        const first = focusable[0];\n        const last = focusable[focusable.length - 1];\n        const active = document.activeElement;\n        if (!dialog.contains(active)) {\n          event.preventDefault();\n          first.focus();\n        } else if (event.shiftKey && (active === first || active === dialog)) {\n          event.preventDefault();\n          last.focus();\n        } else if (!event.shiftKey && active === last) {\n          event.preventDefault();\n          first.focus();\n        }\n      }\n    };\n    document.addEventListener(\"keydown\", keydownHandler);\n\n    return () => {\n      document.removeEventListener(\"keydown\", keydownHandler);\n      const index = openDialogs.indexOf(dialog);\n      if (index !== -1) {\n        openDialogs.splice(index, 1);\n      }\n      const active = document.activeElement;\n      const focusIsLost = active == null || active === document.body || dialog.contains(active);\n      if (\n        focusIsLost &&\n        previouslyFocused != null &&\n        previouslyFocused !== document.body &&\n        previouslyFocused.isConnected\n      ) {\n        previouslyFocused.focus({ preventScroll: true });\n      }\n    };\n  }, [isOpen]);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nexport namespace CollectionUtils {\n  // inGroupsOf([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3).forEach((e) => print(e));\n  //\n  // [\"1\", \"2\", \"3\"]\n  // [\"4\", \"5\", \"6\"]\n  // [\"7\", \"8\", \"9\"]\n  // [\"10\"]\n  export function inGroupsOf<T>(length: number, collection: T[]): T[][] {\n    if (collection.length > 0) {\n      const result: T[][] = [[]];\n      collection.forEach((item) => {\n        let lastColl = result[result.length - 1];\n        if (lastColl.length >= length) {\n          lastColl = [];\n          result.push(lastColl);\n        }\n        lastColl.push(item);\n      });\n\n      return result;\n    } else {\n      return [];\n    }\n  }\n\n  export function splitIntoNGroups<T>(coll: T[], numberOfGroups: number): T[][] {\n    const result: T[][] = [];\n    for (let i = 0; i < numberOfGroups; i += 1) {\n      result.push([]);\n    }\n    let index = 0;\n    for (const item of coll) {\n      result[index].push(item);\n      index += 1;\n      if (index >= numberOfGroups) {\n        index = 0;\n      }\n    }\n    return result;\n  }\n\n  export function inGroupsOfFilled<T>(length: number, collection: T[], shouldFill?: boolean): (T | undefined)[][] {\n    const result = inGroupsOf(length, collection) as (T | undefined)[][];\n    if (result.length > 0) {\n      const lastColl = result[result.length - 1];\n      if (lastColl != null) {\n        for (let i = 0; i < length; i += 1) {\n          lastColl[i] = lastColl[i] ?? undefined;\n        }\n      }\n    }\n    return result;\n  }\n\n  export function groupBy<T>(items: T[], cond: (last: T, item: T) => boolean): T[][] {\n    return items.reduce<T[][]>(\n      (memo, set) => {\n        let lastGroup = memo[memo.length - 1];\n        const last = lastGroup[lastGroup.length - 1];\n        if (last != null && cond(last, set)) {\n          memo.push([]);\n          lastGroup = memo[memo.length - 1];\n        }\n        lastGroup.push(set);\n        return memo;\n      },\n      [[]]\n    );\n  }\n\n  export function repeat<T>(el: T, length: number): T[] {\n    const arr: T[] = [];\n    for (let i = 0; i < length; i += 1) {\n      arr.push(el);\n    }\n    return arr;\n  }\n\n  export function concatBy<T>(from: T[], to: T[], condition: (el: T) => string): T[] {\n    const map = [...from, ...to].reduce<Record<string, T>>((memo, item) => {\n      memo[condition(item)] = item;\n      return memo;\n    }, {});\n    return Object.keys(map).map((key) => map[key]);\n  }\n\n  export function compatBy<T>(arr: T[], condition: (el: T) => string): T[] {\n    const map = arr.reduce<Record<string, T>>((memo, item) => {\n      memo[condition(item)] = item;\n      return memo;\n    }, {});\n    return Object.keys(map).map((key) => map[key]);\n  }\n\n  export function compact<T>(arr: (T | undefined)[]): T[] {\n    return arr.filter((i) => i) as T[];\n  }\n\n  export function groupByKey<\n    T,\n    K extends keyof T,\n    U extends T[K] extends string ? string : T[K] extends number ? number : never,\n  >(arr: T[], key: K): Partial<Record<U, T[]>> {\n    return arr.reduce<Partial<Record<U, T[]>>>((memo, item) => {\n      const value = item[key] as unknown as U;\n      memo[value] = memo[value] || [];\n      memo[value]!.push(item);\n      return memo;\n    }, {});\n  }\n\n  export function groupByExpr<T>(arr: T[], expr: (item: T) => string): Partial<Record<string, T[]>> {\n    return arr.reduce<Partial<Record<string, T[]>>>((memo, item) => {\n      const value = expr(item);\n      memo[value] = memo[value] || [];\n      memo[value]!.push(item);\n      return memo;\n    }, {});\n  }\n\n  export function groupByKeyUniq<\n    T,\n    K extends keyof T,\n    U extends T[K] extends string ? string : T[K] extends number ? number : never,\n  >(arr: T[], key: K): Partial<Record<U, T>> {\n    return arr.reduce<Partial<Record<U, T>>>((memo, item) => {\n      const value = item[key] as unknown as U;\n      memo[value] = item;\n      return memo;\n    }, {});\n  }\n\n  export function groupByExprUniq<T>(arr: T[], expr: (item: T) => string): Partial<Record<string, T>> {\n    return arr.reduce<Partial<Record<string, T>>>((memo, item) => {\n      const value = expr(item);\n      memo[value] = item;\n      return memo;\n    }, {});\n  }\n\n  export function collectToSet<T, K extends keyof T>(arr: T[], key: K): Set<T[K]> {\n    const set = new Set<T[K]>();\n    for (const el of arr) {\n      set.add(el[key]);\n    }\n    return set;\n  }\n\n  export function collectToSetTransform<T, K extends keyof T, U>(\n    arr: T[],\n    key: K,\n    transformer: (val: T[K]) => U\n  ): Set<U> {\n    const set = new Set<U>();\n    for (const el of arr) {\n      set.add(transformer(el[key]));\n    }\n    return set;\n  }\n\n  export function flat<T>(from: T[][]): T[] {\n    return from.reduce((acc, val) => acc.concat(val), []);\n  }\n\n  export function sort<T>(arr: T[], compareFn?: (a: T, b: T) => number): T[] {\n    const arrCopy = [...arr];\n    arrCopy.sort(compareFn);\n    return arrCopy;\n  }\n\n  export function reorder<T>(arr: T[], start: number, end: number): T[] {\n    const newDays = [...arr];\n    const [daysToMove] = newDays.splice(start, 1);\n    newDays.splice(end, 0, daysToMove);\n    return newDays;\n  }\n\n  export function sortInOrder<T extends {}, K extends keyof T>(arr: T[], key: K, order: T[K][]): T[] {\n    const arrCopy = [...arr];\n    arrCopy.sort((a, b) => {\n      const aIndex = order.indexOf(a[key]);\n      const bIndex = order.indexOf(b[key]);\n      if (aIndex === -1) {\n        return 1;\n      } else if (bIndex === -1) {\n        return -1;\n      } else {\n        return aIndex - bIndex;\n      }\n    });\n    return arrCopy;\n  }\n\n  export function sortByMultiple<T extends {}, K extends keyof T>(arr: T[], keys: K[], isReverse?: boolean): T[] {\n    const arrCopy = [...arr];\n    arrCopy.sort((a, b) => {\n      for (const key of keys) {\n        const aVal = a[key] as any;\n        const bVal = b[key] as any;\n        if (aVal === bVal) {\n          continue;\n        } else {\n          if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n            return isReverse ? bVal - aVal : aVal - bVal;\n          } else if (typeof aVal === \"string\" && typeof bVal === \"string\") {\n            return isReverse ? bVal.localeCompare(aVal) : aVal.localeCompare(bVal);\n          } else if (typeof aVal === \"boolean\" && typeof bVal === \"boolean\") {\n            return isReverse ? (bVal ? -1 : 1) : aVal ? -1 : 1;\n          } else if (aVal == null || bVal == null) {\n            return isReverse ? (bVal == null ? -1 : 1) : aVal == null ? -1 : 1;\n          }\n        }\n      }\n      return 0;\n    });\n\n    return arrCopy as any;\n  }\n\n  export function sortBy<T extends {}, K extends keyof T>(\n    arr: T[],\n    key: K,\n    isReverse?: boolean\n  ): T[K] extends number ? T[] : never {\n    const arrCopy = [...arr];\n    arrCopy.sort((a, b) => {\n      const aVal = a[key] as any;\n\n      const bVal = b[key] as any;\n      return isReverse ? bVal - aVal : aVal - bVal;\n    });\n\n    return arrCopy as any;\n  }\n\n  export function sortByExpr<T extends {}>(arr: T[], fn: (item: T) => number, isReverse?: boolean): T[] {\n    const arrCopy = [...arr];\n    arrCopy.sort((a, b) => {\n      const aVal = fn(a) as any;\n\n      const bVal = fn(b) as any;\n      return isReverse ? bVal - aVal : aVal - bVal;\n    });\n\n    return arrCopy as any;\n  }\n\n  export function diff<T>(from: T[], to: T[]): T[] {\n    return from.filter((x) => !to.includes(x)).concat(to.filter((x) => !from.includes(x)));\n  }\n\n  export function diffBy<T extends {}>(from: T[], to: T[], key: keyof T): T[] {\n    return from\n      .filter((x) => !to.some((y) => x[key] === y[key]))\n      .concat(to.filter((x) => !from.some((y) => x[key] === y[key])));\n  }\n\n  export function remove<T>(from: T[], item: T): T[] {\n    return from.filter((t) => t !== item);\n  }\n\n  export function removeAll<T>(from: T[], item: T[]): T[] {\n    return from.filter((t) => !item.includes(t));\n  }\n\n  export function removeAt<T>(from: T[], index: number): T[] {\n    const result = [...from];\n    result.splice(index, 1);\n    return result;\n  }\n\n  export function setAt<T>(from: T[], index: number, item: T): T[] {\n    return from.map((e, i) => (i === index ? item : e));\n  }\n\n  export function setBy<T extends {}, K extends keyof T, V extends T[K]>(from: T[], key: K, value: V, newItem: T): T[] {\n    return from.map((e) => (e[key] === value ? newItem : e));\n  }\n\n  export function setOrAddBy<T extends {}, K extends keyof T, V extends T[K]>(\n    from: T[],\n    key: K,\n    value: V,\n    newItem: T\n  ): T[] {\n    const hasKeyValue = from.some((e) => e[key] === value);\n    if (hasKeyValue) {\n      return setBy(from, key, value, newItem);\n    } else {\n      return [...from, newItem];\n    }\n  }\n\n  export function removeBy<T extends {}, K extends keyof T, V extends T[K]>(from: T[], key: K, value: V): T[] {\n    return from.filter((t) => t[key] !== value);\n  }\n\n  export function nonnull<T>(from: (T | undefined)[]): T[] {\n    return from.filter((t) => t != null) as T[];\n  }\n\n  export function uniqBy<T extends {}>(from: T[], key: keyof T): T[] {\n    const set = new Set();\n    const result = [];\n    for (const el of from) {\n      const id = el[key];\n      if (!set.has(id)) {\n        result.push(el);\n        set.add(id);\n      }\n    }\n    return result;\n  }\n\n  export function uniqByExpr<T extends {}, V>(from: T[], fn: (item: T) => V): T[] {\n    const set = new Set();\n    const result = [];\n    for (const el of from) {\n      const id = fn(el);\n      if (!set.has(id)) {\n        result.push(el);\n        set.add(id);\n      }\n    }\n    return result;\n  }\n\n  export function findBy<T extends {}, K extends keyof T>(from: T[], key: K, value: T[K]): T | undefined {\n    let result: T | undefined = undefined;\n    for (const el of from) {\n      if (el[key] === value) {\n        result = el;\n        break;\n      }\n    }\n    return result;\n  }\n\n  export function findIndexReverse<T>(from: T[], cb: (item: T) => boolean): number {\n    for (let i = from.length - 1; i >= 0; i -= 1) {\n      if (cb(from[i])) {\n        return i;\n      }\n    }\n    return -1;\n  }\n\n  export function merge<T>(from: T[], to: T[]): T[] {\n    return Array.from(new Set([...from, ...to]));\n  }\n\n  export function compressArray(arr: number[], threshold: number): string[] {\n    const result: string[] = [];\n    let count = 1;\n\n    for (let i = 1; i <= arr.length; i++) {\n      if (arr[i] === arr[i - 1]) {\n        count += 1;\n      } else {\n        if (count >= threshold) {\n          result.push(`${count}x${arr[i - 1]}`);\n        } else {\n          while (count > 0) {\n            result.push(`${arr[i - 1]}`);\n            count -= 1;\n          }\n        }\n        count = 1;\n      }\n    }\n\n    return result;\n  }\n\n  export function areSortedInSameOrder<T, U>(coll1: T[], coll2: U[], areEqual: (a: T, b: U) => boolean): boolean {\n    if (coll1.length !== coll2.length) {\n      return false;\n    }\n    for (let i = 0; i < coll1.length; i += 1) {\n      if (!areEqual(coll1[i], coll2[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n","import { ICustomExercise, IExerciseType, IHistoryEntry, ILevelChange, ISettings } from \"../types\";\nimport { CustomExerciseVariation } from \"./customExerciseVariation\";\nimport { Exercise } from \"./exercise\";\n\nexport type IExerciseLevelError = \"self\" | \"loop\" | \"second_previous\" | \"built_in\" | \"deleted\" | \"missing_variation\";\n\nexport interface IManualLevelOption {\n  direction: \"up\" | \"down\";\n  label: string;\n  // The exercise that the entry gets when the client taps the action.\n  exerciseType: IExerciseType;\n  // The level change to record on the entry. Undefined for an undo (the entry drops its `levelChange`).\n  change?: ILevelChange;\n  isUndo: boolean;\n}\n\nexport namespace ExerciseLevel {\n  function liveCustom(id: string, settings: ISettings): ISettings[\"exercises\"][string] {\n    const custom = settings.exercises[id];\n    return custom != null && !custom.isDeleted ? custom : undefined;\n  }\n\n  // A bare {id, equipment} type, with the equipment of the default variation when a custom exercise has no equipment in `type`.\n  function resolved(type: IExerciseType, settings: ISettings): IExerciseType {\n    const custom = settings.exercises[type.id];\n    const equipment = custom != null ? CustomExerciseVariation.resolve(custom, type).equipment : type.equipment;\n    return makeType(type.id, equipment);\n  }\n\n  function makeType(id: string, equipment: string | undefined): IExerciseType {\n    return equipment != null ? { id, equipment } : { id };\n  }\n\n  function key(type: IExerciseType): string {\n    return `${type.id}\\u0000${type.equipment ?? \"\"}`;\n  }\n\n  // Each variation of each custom exercise, as a type.\n  function allTypes(settings: ISettings): IExerciseType[] {\n    const result: IExerciseType[] = [];\n    for (const custom of Object.values(settings.exercises)) {\n      if (custom != null) {\n        for (const variation of CustomExerciseVariation.list(custom)) {\n          result.push(makeType(custom.id, variation.equipment));\n        }\n      }\n    }\n    return result;\n  }\n\n  // The type that the link of the variation of `exerciseType` points to. The link is ignored when its target is\n  // deleted or is not a variation of the target.\n  export function next(exerciseType: IExerciseType, settings: ISettings): IExerciseType | undefined {\n    const custom = liveCustom(exerciseType.id, settings);\n    const link = custom != null ? CustomExerciseVariation.find(custom, exerciseType)?.nextLevel : undefined;\n    if (link == null) {\n      return undefined;\n    }\n    const target = liveCustom(link.id, settings);\n    if (target == null || CustomExerciseVariation.find(target, link) == null) {\n      return undefined;\n    }\n    return resolved(link, settings);\n  }\n\n  export function previous(exerciseType: IExerciseType, settings: ISettings): IExerciseType | undefined {\n    const type = resolved(exerciseType, settings);\n    for (const candidate of allTypes(settings)) {\n      if (Exercise.eq(candidate, type)) {\n        continue;\n      }\n      const upper = next(candidate, settings);\n      if (upper != null && Exercise.eq(upper, type)) {\n        return candidate;\n      }\n    }\n    return undefined;\n  }\n\n  export function chain(exerciseType: IExerciseType, settings: ISettings): IExerciseType[] {\n    if (liveCustom(exerciseType.id, settings) == null) {\n      return [];\n    }\n    let bottom = resolved(exerciseType, settings);\n    const seen = new Set<string>([key(bottom)]);\n    for (let prev = previous(bottom, settings); prev != null && !seen.has(key(prev)); prev = previous(prev, settings)) {\n      seen.add(key(prev));\n      bottom = prev;\n    }\n    const result: IExerciseType[] = [bottom];\n    const visited = new Set<string>([key(bottom)]);\n    for (let n = next(bottom, settings); n != null && !visited.has(key(n)); n = next(n, settings)) {\n      visited.add(key(n));\n      result.push(n);\n    }\n    return result;\n  }\n\n  export function validateLink(\n    fromType: IExerciseType,\n    toType: IExerciseType,\n    settings: ISettings\n  ): IExerciseLevelError | undefined {\n    const from = resolved(fromType, settings);\n    const to = resolved(toType, settings);\n    if (Exercise.eq(from, to)) {\n      return \"self\";\n    }\n    const toCustom = settings.exercises[to.id];\n    if (settings.exercises[from.id] == null || toCustom == null) {\n      return \"built_in\";\n    }\n    if (toCustom.isDeleted) {\n      return \"deleted\";\n    }\n    if (CustomExerciseVariation.find(toCustom, to) == null) {\n      return \"missing_variation\";\n    }\n    const seen = new Set<string>([key(from)]);\n    for (let n: IExerciseType | undefined = to; n != null; n = next(n, settings)) {\n      if (Exercise.eq(n, from)) {\n        return \"loop\";\n      }\n      if (seen.has(key(n))) {\n        break;\n      }\n      seen.add(key(n));\n    }\n    for (const candidate of allTypes(settings)) {\n      if (!Exercise.eq(candidate, from)) {\n        const upper = next(candidate, settings);\n        if (upper != null && Exercise.eq(upper, to)) {\n          return \"second_previous\";\n        }\n      }\n    }\n    return undefined;\n  }\n\n  type IWorking = Record<string, ICustomExercise | undefined>;\n\n  // Sets the link of one variation in a working copy of the exercises. An undefined link removes it.\n  function relink(working: IWorking, from: IExerciseType, link: IExerciseType | undefined): void {\n    const exercise = working[from.id];\n    if (exercise != null) {\n      working[from.id] = CustomExerciseVariation.update(exercise, from.equipment, { nextLevel: link });\n    }\n  }\n\n  function withExercises(settings: ISettings, exercises: IWorking): ISettings {\n    return { ...settings, exercises: exercises as ISettings[\"exercises\"] };\n  }\n\n  function stripLinks(exercise: ICustomExercise): ICustomExercise {\n    const { nextLevel: _removed, ...rest } = exercise;\n    if (rest.variations == null) {\n      return rest;\n    }\n    return {\n      ...rest,\n      variations: rest.variations.map((v) => {\n        const { nextLevel: _link, ...variation } = v;\n        return variation;\n      }),\n    };\n  }\n\n  // The exercises to write when `deleted` is deleted (D24). The deleted exercise always loses the link of each of\n  // its variations. The level below each variation links to the level above it, or loses its link when there is no\n  // level above. The variations run one after another on the updated settings. There is one item for each exercise.\n  export function splice(deleted: ICustomExercise, settings: ISettings): ICustomExercise[] {\n    const result: ICustomExercise[] = [{ ...stripLinks(deleted), isDeleted: true }];\n    const stored = settings.exercises[deleted.id];\n    if (stored == null || stored.isDeleted) {\n      return result;\n    }\n    const working: IWorking = { ...settings.exercises };\n    const changed: string[] = [];\n    for (const variation of CustomExerciseVariation.list(stored)) {\n      const type = makeType(stored.id, variation.equipment);\n      const current = withExercises(settings, working);\n      const lower = previous(type, current);\n      if (lower == null) {\n        continue;\n      }\n      relink(working, lower, next(type, current));\n      if (lower.id !== deleted.id && !changed.includes(lower.id)) {\n        changed.push(lower.id);\n      }\n    }\n    for (const id of changed) {\n      const written = working[id];\n      if (written != null) {\n        result.push(written);\n      }\n    }\n    return result;\n  }\n\n  // The exercises to write when the variation `equipment` of `exercise` is removed. Each link to the removed\n  // variation gets the removed variation's own link. A link inside `exercise` counts too. The removed variation\n  // itself is not changed here. There is one item for each exercise.\n  export function spliceVariation(\n    exercise: ICustomExercise,\n    equipment: string | undefined,\n    settings: ISettings\n  ): ICustomExercise[] {\n    const removed = resolved(makeType(exercise.id, equipment), settings);\n    const own = next(removed, settings);\n    const working: IWorking = { ...settings.exercises };\n    const changed: string[] = [];\n    for (const candidate of allTypes(settings)) {\n      if (Exercise.eq(candidate, removed)) {\n        continue;\n      }\n      const upper = next(candidate, settings);\n      if (upper != null && Exercise.eq(upper, removed)) {\n        relink(working, candidate, own);\n        if (!changed.includes(candidate.id)) {\n          changed.push(candidate.id);\n        }\n      }\n    }\n    return changed.map((id) => working[id] as ICustomExercise);\n  }\n\n  // The level change record from `from` to the type `to`, or undefined when one of them is not a custom exercise.\n  export function buildChange(\n    from: IExerciseType,\n    to: IExerciseType,\n    direction: \"up\" | \"down\",\n    cause: \"auto\" | \"manual\",\n    settings: ISettings\n  ): ILevelChange | undefined {\n    const fromCustom = settings.exercises[from.id];\n    const toCustom = settings.exercises[to.id];\n    if (fromCustom == null || toCustom == null) {\n      return undefined;\n    }\n    const fromType = resolved(from, settings);\n    const toType = resolved(to, settings);\n    return {\n      from: fromType,\n      to: toType,\n      fromName: Exercise.variationLabel(fromCustom.name, fromType.equipment, fromCustom, settings),\n      toName: Exercise.variationLabel(toCustom.name, toType.equipment, toCustom, settings),\n      direction,\n      cause,\n    };\n  }\n\n  // The level actions of the exercise menu in the workout (R5, D21). They show for a program exercise entry that still\n  // has the program's exercise, or the level that the client chose in this workout. After a manual change only the\n  // undo shows: one step per workout (A10).\n  export function manualOptions(\n    entry: IHistoryEntry,\n    programExerciseType: IExerciseType | undefined,\n    settings: ISettings\n  ): IManualLevelOption[] {\n    if (entry.programExerciseId == null || entry.isSuppressed) {\n      return [];\n    }\n    const entryType = resolved(entry.exercise, settings);\n    const applied = entry.levelChange;\n    if (applied?.cause === \"manual\") {\n      if (!Exercise.eq(entryType, resolved(applied.to, settings))) {\n        return [];\n      }\n      const direction = applied.direction === \"up\" ? \"down\" : \"up\";\n      return [\n        {\n          direction,\n          label: `${direction === \"up\" ? \"Progression\" : \"Regression\"}: ${applied.fromName}`,\n          exerciseType: applied.from,\n          isUndo: true,\n        },\n      ];\n    }\n    if (programExerciseType == null || !Exercise.eq(entryType, resolved(programExerciseType, settings))) {\n      return [];\n    }\n    const options: IManualLevelOption[] = [];\n    const candidates: [\"up\" | \"down\", IExerciseType | undefined][] = [\n      [\"up\", next(entry.exercise, settings)],\n      [\"down\", previous(entry.exercise, settings)],\n    ];\n    for (const [direction, target] of candidates) {\n      const change = target != null ? buildChange(entry.exercise, target, direction, \"manual\", settings) : undefined;\n      if (change != null) {\n        options.push({\n          direction,\n          label: `${direction === \"up\" ? \"Progression\" : \"Regression\"}: ${change.toName}`,\n          exerciseType: change.to,\n          change,\n          isUndo: false,\n        });\n      }\n    }\n    return options;\n  }\n}\n","export namespace CSV {\n  export function toString(data: (number | string | null)[][]): string {\n    return data\n      .map((line) => {\n        return line\n          .map((value) => {\n            let shouldWrapIntoQuotes = false;\n            if (typeof value === \"string\") {\n              if (value.indexOf(\",\") !== -1) {\n                shouldWrapIntoQuotes = true;\n              }\n              if (value.indexOf('\"') !== -1) {\n                shouldWrapIntoQuotes = true;\n                value = value.replace(/\"/g, '\\\\\"');\n              }\n              if (shouldWrapIntoQuotes) {\n                value = `\"${value}\"`;\n              }\n            }\n            if (value === null) {\n              value = \"\";\n            }\n            return value;\n          })\n          .join(\",\");\n      })\n      .join(\"\\n\");\n  }\n}\n","import {\n  IGym,\n  IHistoryRecord,\n  IPlannerProgram,\n  IProgram,\n  ISettings,\n  IStorage,\n  IUnitKey,\n  IUnitOwnership,\n  statsLengthDef,\n  statsPercentageDef,\n  statsWeightDef,\n  IGraph,\n} from \"../types\";\n\ntype IRecord = Record<string, unknown>;\n\n// Storage keys that are not units: the server sets them, or they are collections, or the sync no longer uses them.\nconst storageNotUnits = [\n  \"id\",\n  \"originalId\",\n  \"version\",\n  \"_versions\",\n  \"history\",\n  \"stats\",\n  \"settings\",\n  \"programs\",\n  \"deletedHistory\",\n  \"deletedStats\",\n  \"deletedPrograms\",\n];\n\n// Settings keys that are collections. Their entries are units.\nconst settingsCollections = [\"gyms\", \"deletedGyms\", \"graphs\", \"exercises\", \"exerciseData\", \"assessmentResults\"];\n\nconst trainerOnlyStorage = [\"currentProgramId\", \"email\"];\nconst clientOnlyStorage = [\"helps\", \"reviewRequests\", \"signupRequests\", \"referrer\", \"attribution\"];\nconst trainerOnlySettings = [\n  \"planner\",\n  \"muscleGroups\",\n  \"assignMessage\",\n  \"programAssignedAt\",\n  \"checkIn\",\n  \"checkInRequest\",\n  \"checkInForm\",\n  \"assessments\",\n  \"assessmentRequest\",\n];\nconst clientOnlySettings = [\n  \"theme\",\n  \"textSize\",\n  \"vibration\",\n  \"alwaysOnDisplay\",\n  \"ignoreDoNotDisturb\",\n  \"startWeekFromMonday\",\n  \"starredExercises\",\n  \"currentGymId\",\n  \"workoutSettings\",\n  \"assignMessageSeenAt\",\n  \"disableInAppTimers\",\n  \"checkInAnsweredFor\",\n  \"checkInRequestAnsweredAt\",\n  \"checkInChangeSeenAt\",\n  \"onboarding\",\n];\nconst sharedSettings = [\n  \"nickname\",\n  \"currentBodyweight\",\n  \"timers\",\n  \"units\",\n  \"lengthUnits\",\n  \"volume\",\n  \"graphOptions\",\n  \"graphsSettings\",\n  \"exerciseStatsSettings\",\n  \"statsEnabled\",\n  \"checkInDay\",\n];\n\n// A unit that is not an object has one field. This is its name.\nconst valueField = \"value\";\n\nconst statsDefs: Array<{ category: \"weight\" | \"length\" | \"percentage\"; keys: string[] }> = [\n  { category: \"weight\", keys: Object.keys(statsWeightDef) },\n  { category: \"length\", keys: Object.keys(statsLengthDef) },\n  { category: \"percentage\", keys: Object.keys(statsPercentageDef) },\n];\n\nfunction isPlainObject(value: unknown): value is IRecord {\n  return typeof value === \"object\" && value != null && !Array.isArray(value);\n}\n\nfunction isMissing(value: unknown): boolean {\n  return value == null;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n  if (a === b) {\n    return true;\n  }\n  if (Array.isArray(a) || Array.isArray(b)) {\n    if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {\n      return false;\n    }\n    return a.every((item, i) => deepEqual(item, b[i]));\n  }\n  if (isPlainObject(a) && isPlainObject(b)) {\n    const aKeys = Object.keys(a);\n    const bKeys = Object.keys(b);\n    if (aKeys.length !== bKeys.length) {\n      return false;\n    }\n    return aKeys.every((key) => key in b && deepEqual(a[key], b[key]));\n  }\n  return false;\n}\n\nexport namespace SyncUnits {\n  // The unit of one assessment result: `settings.assessmentResults.<id>`.\n  export function isAssessmentResult(unitKey: string): boolean {\n    return /^settings\\.assessmentResults\\..+$/.test(unitKey);\n  }\n\n  // The planner without week ids, day ids and `planner.name`. Ids are not data (see the spec, \"Units\").\n  export function normalizePlanner(planner: IPlannerProgram): IRecord {\n    const { name: _name, ...rest } = planner;\n    return {\n      ...rest,\n      weeks: planner.weeks.map((week) => {\n        const { id: _weekId, ...weekRest } = week;\n        return {\n          ...weekRest,\n          days: week.days.map((day) => {\n            const { id: _dayId, ...dayRest } = day;\n            return dayRest;\n          }),\n        };\n      }),\n    };\n  }\n\n  function isPlanner(value: unknown): value is IPlannerProgram {\n    return isPlainObject(value) && value.vtype === \"planner\" && Array.isArray(value.weeks);\n  }\n\n  function comparable(field: string, value: unknown): unknown {\n    if (field === \"planner\" && isPlanner(value)) {\n      return normalizePlanner(value);\n    }\n    return value;\n  }\n\n  function asFields(value: unknown): IRecord {\n    if (isMissing(value)) {\n      return {};\n    }\n    return isPlainObject(value) ? value : { [valueField]: value };\n  }\n\n  // The top-level fields of a unit that differ. `null` and a missing value are equal.\n  export function changedFields(base: unknown, next: unknown): string[] {\n    const baseFields = asFields(base);\n    const nextFields = asFields(next);\n    const names = Array.from(new Set([...Object.keys(baseFields), ...Object.keys(nextFields)]));\n    return names.filter((name) => {\n      const a = baseFields[name];\n      const b = nextFields[name];\n      if (isMissing(a) && isMissing(b)) {\n        return false;\n      }\n      return !deepEqual(comparable(name, a), comparable(name, b));\n    });\n  }\n\n  export function isSentByPhone(unitKey: IUnitKey): boolean {\n    return [\"storage.id\", \"storage.version\", \"storage.email\"].indexOf(unitKey) === -1;\n  }\n\n  export function statCategory(type: string): \"weight\" | \"length\" | \"percentage\" | undefined {\n    return statsDefs.filter((d) => d.keys.indexOf(type) !== -1)[0]?.category;\n  }\n\n  export function toUnits(storage: IStorage): Record<IUnitKey, unknown> {\n    const units: Record<IUnitKey, unknown> = {};\n    const put = (key: IUnitKey, value: unknown): void => {\n      if (value !== undefined) {\n        units[key] = value;\n      }\n    };\n\n    const storageRecord = storage as unknown as IRecord;\n    for (const key of Object.keys(storageRecord)) {\n      if (storageNotUnits.indexOf(key) === -1) {\n        put(`storage.${key}`, storageRecord[key]);\n      }\n    }\n\n    const settings = storage.settings;\n    const settingsRecord = settings as unknown as IRecord;\n    for (const key of Object.keys(settingsRecord)) {\n      if (settingsCollections.indexOf(key) === -1) {\n        put(`settings.${key}`, settingsRecord[key]);\n      }\n    }\n    for (const gym of settings.gyms) {\n      const { equipment, ...gymRest } = gym;\n      put(`settings.gyms.${gym.id}`, gymRest);\n      for (const equipmentKey of Object.keys(equipment)) {\n        put(`settings.gyms.${gym.id}.equipment.${equipmentKey}`, (equipment as IRecord)[equipmentKey]);\n      }\n    }\n    put(\n      \"settings.gyms.order\",\n      settings.gyms.map((g) => g.id)\n    );\n    for (const key of Object.keys(settings.exerciseData)) {\n      put(`settings.exerciseData.${key}`, settings.exerciseData[key]);\n    }\n    for (const key of Object.keys(settings.assessmentResults ?? {})) {\n      put(`settings.assessmentResults.${key}`, (settings.assessmentResults ?? {})[key]);\n    }\n    for (const key of Object.keys(settings.exercises)) {\n      put(`settings.exercises.${key}`, settings.exercises[key]);\n    }\n    for (const graph of settings.graphs.graphs) {\n      put(`settings.graphs.${graph.id}`, graph);\n    }\n    put(\n      \"settings.graphs.order\",\n      settings.graphs.graphs.map((g) => g.id)\n    );\n\n    for (const program of storage.programs) {\n      const { planner, nextDay, ...body } = program;\n      put(`program.${program.id}.body`, body);\n      if (planner != null) {\n        put(`program.${program.id}.planner`, { planner });\n      }\n      put(`program.${program.id}.nextDay`, { nextDay });\n    }\n\n    for (const record of storage.history) {\n      put(`history.${record.id}`, record);\n    }\n\n    const stats = storage.stats as unknown as Record<string, Record<string, Array<{ timestamp: number }>>>;\n    for (const category of Object.keys(stats)) {\n      for (const type of Object.keys(stats[category])) {\n        for (const stat of stats[category][type] || []) {\n          put(`stat.${stat.timestamp}_${type}`, stat);\n        }\n      }\n    }\n    return units;\n  }\n\n  function orderBy<T>(items: Array<[string, T]>, order: string[] | undefined): T[] {\n    if (order == null) {\n      return items.map(([, item]) => item);\n    }\n    const byId = new Map(items);\n    const result: T[] = [];\n    for (const id of order) {\n      if (byId.has(id)) {\n        result.push(byId.get(id)!);\n        byId.delete(id);\n      }\n    }\n    byId.forEach((item) => result.push(item));\n    return result;\n  }\n\n  // `meta.id` and `meta.version` are not units. The server sets them.\n  export function fromUnits(units: Record<IUnitKey, unknown>, meta: { id?: number; version: string }): IStorage {\n    const topLevel: IRecord = {};\n    const settings: IRecord = {};\n    const gyms: Array<[string, IGym]> = [];\n    const equipments: Record<string, IRecord> = {};\n    let gymOrder: string[] | undefined;\n    const exerciseData: IRecord = {};\n    const exercises: IRecord = {};\n    const assessmentResults: IRecord = {};\n    const graphs: Array<[string, IGraph]> = [];\n    let graphOrder: string[] | undefined;\n    const programBodies: Array<[string, IRecord]> = [];\n    const programPlanners: Record<string, unknown> = {};\n    const programNextDays: Record<string, unknown> = {};\n    const history: IHistoryRecord[] = [];\n    // Like `Storage.getDefault`, every stat type has a list, also when it is empty.\n    const stats: Record<string, Record<string, unknown[]>> = {};\n    for (const def of statsDefs) {\n      stats[def.category] = {};\n      for (const type of def.keys) {\n        stats[def.category][type] = [];\n      }\n    }\n\n    for (const key of Object.keys(units)) {\n      const value = units[key];\n      let m: RegExpMatchArray | null;\n      if (key === \"settings.gyms.order\") {\n        gymOrder = value as string[];\n      } else if (key === \"settings.graphs.order\") {\n        graphOrder = value as string[];\n      } else if ((m = key.match(/^settings\\.gyms\\.(.+?)\\.equipment\\.(.+)$/))) {\n        equipments[m[1]] = { ...(equipments[m[1]] || {}), [m[2]]: value };\n      } else if ((m = key.match(/^settings\\.gyms\\.(.+)$/))) {\n        gyms.push([m[1], value as IGym]);\n      } else if ((m = key.match(/^settings\\.exerciseData\\.(.+)$/))) {\n        exerciseData[m[1]] = value;\n      } else if ((m = key.match(/^settings\\.assessmentResults\\.(.+)$/))) {\n        assessmentResults[m[1]] = value;\n      } else if ((m = key.match(/^settings\\.exercises\\.(.+)$/))) {\n        exercises[m[1]] = value;\n      } else if ((m = key.match(/^settings\\.graphs\\.(.+)$/))) {\n        graphs.push([m[1], value as IGraph]);\n      } else if ((m = key.match(/^settings\\.(.+)$/))) {\n        settings[m[1]] = value;\n      } else if ((m = key.match(/^storage\\.(.+)$/))) {\n        topLevel[m[1]] = value;\n      } else if ((m = key.match(/^program\\.(.+)\\.(body|planner|nextDay)$/))) {\n        if (m[2] === \"body\") {\n          programBodies.push([m[1], value as IRecord]);\n        } else if (m[2] === \"planner\") {\n          programPlanners[m[1]] = (value as IRecord).planner;\n        } else {\n          programNextDays[m[1]] = (value as IRecord).nextDay;\n        }\n      } else if (key.match(/^history\\.\\d+$/)) {\n        history.push(value as IHistoryRecord);\n      } else if ((m = key.match(/^stat\\.(\\d+)_(.+)$/))) {\n        const category = statCategory(m[2]);\n        if (category != null) {\n          stats[category][m[2]].push(value);\n        }\n      } else {\n        throw new Error(`Unknown unit key: ${key}`);\n      }\n    }\n\n    const programs = programBodies.map(([id, body]) => {\n      const program: IRecord = { ...body };\n      if (id in programPlanners) {\n        program.planner = programPlanners[id];\n      }\n      if (id in programNextDays) {\n        program.nextDay = programNextDays[id];\n      }\n      return program as unknown as IProgram;\n    });\n\n    const builtSettings = {\n      ...settings,\n      gyms: orderBy(gyms, gymOrder).map((gym) => ({ ...gym, equipment: equipments[gym.id] || {} })),\n      deletedGyms: [],\n      graphs: { vtype: \"graphs\", graphs: orderBy(graphs, graphOrder) },\n      exercises,\n      exerciseData,\n      assessmentResults,\n    } as unknown as ISettings;\n\n    return {\n      currentProgramId: undefined,\n      email: undefined,\n      reviewRequests: [],\n      signupRequests: [],\n      helps: [],\n      ...topLevel,\n      ...(meta.id != null ? { id: meta.id } : {}),\n      version: meta.version,\n      history,\n      stats: stats as unknown as IStorage[\"stats\"],\n      programs,\n      settings: builtSettings,\n      deletedHistory: [],\n      deletedStats: [],\n      deletedPrograms: [],\n    } as IStorage;\n  }\n\n  export function ownership(unitKey: IUnitKey): IUnitOwnership {\n    let m: RegExpMatchArray | null;\n    if ((m = unitKey.match(/^storage\\.(.+)$/))) {\n      if (trainerOnlyStorage.indexOf(m[1]) !== -1) {\n        return \"trainerOnly\";\n      }\n      if (clientOnlyStorage.indexOf(m[1]) !== -1) {\n        return \"clientOnly\";\n      }\n    } else if ((m = unitKey.match(/^program\\.(.+)\\.(body|planner|nextDay)$/))) {\n      return m[2] === \"body\" ? \"trainerOnly\" : \"progression\";\n    } else if (unitKey.match(/^history\\.\\d+$/) || unitKey.match(/^stat\\.\\d+_.+$/)) {\n      return \"clientCreated\";\n    } else if (isAssessmentResult(unitKey)) {\n      return \"clientCreated\";\n    } else if (unitKey.match(/^settings\\.exercises\\./)) {\n      return \"trainerOnly\";\n    } else if (unitKey.match(/^settings\\.gyms\\.(.+?)\\.equipment\\.(.+)$/)) {\n      // Matches before the gym rule below, because `^settings\\.gyms\\.(.+)$` also matches an equipment key.\n      return \"shared\";\n    } else if (unitKey.match(/^settings\\.gyms\\./)) {\n      // A gym and the gym order: the trainer owns them. A client has one gym, `settings.gyms[0]`.\n      return \"trainerOnly\";\n    } else if (unitKey.match(/^settings\\.(exerciseData|graphs)\\./)) {\n      return \"shared\";\n    } else if ((m = unitKey.match(/^settings\\.(.+)$/))) {\n      if (trainerOnlySettings.indexOf(m[1]) !== -1) {\n        return \"trainerOnly\";\n      }\n      if (clientOnlySettings.indexOf(m[1]) !== -1) {\n        return \"clientOnly\";\n      }\n      if (sharedSettings.indexOf(m[1]) !== -1) {\n        return \"shared\";\n      }\n    }\n    throw new Error(`Unknown unit key: ${unitKey}`);\n  }\n\n  // The class of one field of a unit. A trainer only field can sit inside a shared unit.\n  export function fieldOwnership(unitKey: IUnitKey, field: string): IUnitOwnership {\n    if (unitKey.match(/^settings\\.exerciseData\\./) && field === \"muscleMultipliers\") {\n      return \"trainerOnly\";\n    }\n    if (\n      unitKey.match(/^settings\\.gyms\\.(.+?)\\.equipment\\.(.+)$/) &&\n      (field === \"useBodyweightForBar\" || field === \"isAssisting\")\n    ) {\n      return \"trainerOnly\";\n    }\n    return ownership(unitKey);\n  }\n}\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.partial = exports.PartialType = exports.type = exports.InterfaceType = exports.array = exports.ArrayType = exports.recursion = exports.RecursiveType = exports.Int = exports.brand = exports.RefinementType = exports.keyof = exports.KeyofType = exports.literal = exports.LiteralType = exports.void = exports.undefined = exports.null = exports.UnknownRecord = exports.AnyDictionaryType = exports.UnknownArray = exports.AnyArrayType = exports.boolean = exports.BooleanType = exports.bigint = exports.BigIntType = exports.number = exports.NumberType = exports.string = exports.StringType = exports.unknown = exports.UnknownType = exports.voidType = exports.VoidType = exports.UndefinedType = exports.nullType = exports.NullType = exports.getIndex = exports.getTags = exports.emptyTags = exports.mergeAll = exports.getDomainKeys = exports.appendContext = exports.getContextEntry = exports.getFunctionName = exports.identity = exports.Type = exports.success = exports.failure = exports.failures = void 0;\nexports.alias = exports.clean = exports.StrictType = exports.dictionary = exports.object = exports.ObjectType = exports.Dictionary = exports.getDefaultContext = exports.getValidationError = exports.interface = exports.Array = exports.taggedUnion = exports.TaggedUnionType = exports.Integer = exports.refinement = exports.any = exports.AnyType = exports.never = exports.NeverType = exports.Function = exports.FunctionType = exports.exact = exports.ExactType = exports.strict = exports.readonlyArray = exports.ReadonlyArrayType = exports.readonly = exports.ReadonlyType = exports.tuple = exports.TupleType = exports.intersection = exports.IntersectionType = exports.union = exports.UnionType = exports.record = exports.DictionaryType = void 0;\n/**\n * @since 1.0.0\n */\nvar Either_1 = require(\"fp-ts/lib/Either\");\n/**\n * @category Decode error\n * @since 1.0.0\n */\nexports.failures = Either_1.left;\n/**\n * @category Decode error\n * @since 1.0.0\n */\nvar failure = function (value, context, message) {\n    return (0, exports.failures)([{ value: value, context: context, message: message }]);\n};\nexports.failure = failure;\n/**\n * @category Decode error\n * @since 1.0.0\n */\nexports.success = Either_1.right;\n/**\n * @category Codec\n * @since 1.0.0\n */\nvar Type = /** @class */ (function () {\n    function Type(\n    /** a unique name for this codec */\n    name, \n    /** a custom type guard */\n    is, \n    /** succeeds if a value of type I can be decoded to a value of type A */\n    validate, \n    /** converts a value of type A to a value of type O */\n    encode) {\n        this.name = name;\n        this.is = is;\n        this.validate = validate;\n        this.encode = encode;\n        this.decode = this.decode.bind(this);\n    }\n    /**\n     * @since 1.0.0\n     */\n    Type.prototype.pipe = function (ab, name) {\n        var _this = this;\n        if (name === void 0) { name = \"pipe(\".concat(this.name, \", \").concat(ab.name, \")\"); }\n        return new Type(name, ab.is, function (i, c) {\n            var e = _this.validate(i, c);\n            if ((0, Either_1.isLeft)(e)) {\n                return e;\n            }\n            return ab.validate(e.right, c);\n        }, this.encode === exports.identity && ab.encode === exports.identity ? exports.identity : function (b) { return _this.encode(ab.encode(b)); });\n    };\n    /**\n     * @since 1.0.0\n     */\n    Type.prototype.asDecoder = function () {\n        return this;\n    };\n    /**\n     * @since 1.0.0\n     */\n    Type.prototype.asEncoder = function () {\n        return this;\n    };\n    /**\n     * a version of `validate` with a default context\n     * @since 1.0.0\n     */\n    Type.prototype.decode = function (i) {\n        return this.validate(i, [{ key: '', type: this, actual: i }]);\n    };\n    return Type;\n}());\nexports.Type = Type;\n// -------------------------------------------------------------------------------------\n// utils\n// -------------------------------------------------------------------------------------\n/**\n * @since 1.0.0\n */\nvar identity = function (a) { return a; };\nexports.identity = identity;\n/**\n * @since 1.0.0\n */\nfunction getFunctionName(f) {\n    return f.displayName || f.name || \"<function\".concat(f.length, \">\");\n}\nexports.getFunctionName = getFunctionName;\n/**\n * @since 1.0.0\n */\nfunction getContextEntry(key, decoder) {\n    return { key: key, type: decoder };\n}\nexports.getContextEntry = getContextEntry;\n/**\n * @since 1.0.0\n */\nfunction appendContext(c, key, decoder, actual) {\n    var len = c.length;\n    var r = Array(len + 1);\n    for (var i = 0; i < len; i++) {\n        r[i] = c[i];\n    }\n    r[len] = { key: key, type: decoder, actual: actual };\n    return r;\n}\nexports.appendContext = appendContext;\nfunction pushAll(xs, ys) {\n    var l = ys.length;\n    for (var i = 0; i < l; i++) {\n        xs.push(ys[i]);\n    }\n}\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction getNameFromProps(props) {\n    return Object.keys(props)\n        .map(function (k) { return \"\".concat(k, \": \").concat(props[k].name); })\n        .join(', ');\n}\nfunction useIdentity(codecs) {\n    for (var i = 0; i < codecs.length; i++) {\n        if (codecs[i].encode !== exports.identity) {\n            return false;\n        }\n    }\n    return true;\n}\nfunction getInterfaceTypeName(props) {\n    return \"{ \".concat(getNameFromProps(props), \" }\");\n}\nfunction getPartialTypeName(inner) {\n    return \"Partial<\".concat(inner, \">\");\n}\nfunction enumerableRecord(keys, domain, codomain, name) {\n    if (name === void 0) { name = \"{ [K in \".concat(domain.name, \"]: \").concat(codomain.name, \" }\"); }\n    var len = keys.length;\n    var props = {};\n    for (var i = 0; i < len; i++) {\n        props[keys[i]] = codomain;\n    }\n    var exactCodec = (0, exports.strict)(props, name);\n    return new DictionaryType(name, function (u) { return exactCodec.is(u); }, exactCodec.validate, exactCodec.encode, domain, codomain);\n}\n/**\n * @internal\n */\nfunction getDomainKeys(domain) {\n    var _a;\n    if (isLiteralC(domain)) {\n        var literal_1 = domain.value;\n        if (exports.string.is(literal_1)) {\n            return _a = {}, _a[literal_1] = null, _a;\n        }\n    }\n    else if (isKeyofC(domain)) {\n        return domain.keys;\n    }\n    else if (isUnionC(domain)) {\n        var keys = domain.types.map(function (type) { return getDomainKeys(type); });\n        return keys.some(undefinedType.is) ? undefined : Object.assign.apply(Object, __spreadArray([{}], keys, false));\n    }\n    return undefined;\n}\nexports.getDomainKeys = getDomainKeys;\nfunction stripNonDomainKeys(o, domain) {\n    var keys = Object.keys(o);\n    var len = keys.length;\n    var shouldStrip = false;\n    var r = {};\n    for (var i = 0; i < len; i++) {\n        var k = keys[i];\n        if (domain.is(k)) {\n            r[k] = o[k];\n        }\n        else {\n            shouldStrip = true;\n        }\n    }\n    return shouldStrip ? r : o;\n}\nfunction nonEnumerableRecord(domain, codomain, name) {\n    if (name === void 0) { name = \"{ [K in \".concat(domain.name, \"]: \").concat(codomain.name, \" }\"); }\n    return new DictionaryType(name, function (u) {\n        if (exports.UnknownRecord.is(u)) {\n            return Object.keys(u).every(function (k) { return !domain.is(k) || codomain.is(u[k]); });\n        }\n        return isAnyC(codomain) && Array.isArray(u);\n    }, function (u, c) {\n        if (exports.UnknownRecord.is(u)) {\n            var a = {};\n            var errors = [];\n            var keys = Object.keys(u);\n            var len = keys.length;\n            var changed = false;\n            for (var i = 0; i < len; i++) {\n                var k = keys[i];\n                var ok = u[k];\n                var domainResult = domain.validate(k, appendContext(c, k, domain, k));\n                if ((0, Either_1.isLeft)(domainResult)) {\n                    changed = true;\n                }\n                else {\n                    var vk = domainResult.right;\n                    changed = changed || vk !== k;\n                    k = vk;\n                    var codomainResult = codomain.validate(ok, appendContext(c, k, codomain, ok));\n                    if ((0, Either_1.isLeft)(codomainResult)) {\n                        pushAll(errors, codomainResult.left);\n                    }\n                    else {\n                        var vok = codomainResult.right;\n                        changed = changed || vok !== ok;\n                        a[k] = vok;\n                    }\n                }\n            }\n            return errors.length > 0 ? (0, exports.failures)(errors) : (0, exports.success)((changed ? a : u));\n        }\n        if (isAnyC(codomain) && Array.isArray(u)) {\n            return (0, exports.success)(u);\n        }\n        return (0, exports.failure)(u, c);\n    }, domain.encode === exports.identity && codomain.encode === exports.identity\n        ? function (a) { return stripNonDomainKeys(a, domain); }\n        : function (a) {\n            var s = {};\n            var keys = Object.keys(stripNonDomainKeys(a, domain));\n            var len = keys.length;\n            for (var i = 0; i < len; i++) {\n                var k = keys[i];\n                s[String(domain.encode(k))] = codomain.encode(a[k]);\n            }\n            return s;\n        }, domain, codomain);\n}\nfunction getUnionName(codecs) {\n    return '(' + codecs.map(function (type) { return type.name; }).join(' | ') + ')';\n}\n/**\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nfunction mergeAll(base, us) {\n    var equal = true;\n    var primitive = true;\n    var baseIsNotADictionary = !exports.UnknownRecord.is(base);\n    for (var _i = 0, us_1 = us; _i < us_1.length; _i++) {\n        var u = us_1[_i];\n        if (u !== base) {\n            equal = false;\n        }\n        if (exports.UnknownRecord.is(u)) {\n            primitive = false;\n        }\n    }\n    if (equal) {\n        return base;\n    }\n    else if (primitive) {\n        return us[us.length - 1];\n    }\n    var r = {};\n    for (var _a = 0, us_2 = us; _a < us_2.length; _a++) {\n        var u = us_2[_a];\n        for (var k in u) {\n            if (!hasOwnProperty.call(r, k) || baseIsNotADictionary || u[k] !== base[k]) {\n                r[k] = u[k];\n            }\n        }\n    }\n    return r;\n}\nexports.mergeAll = mergeAll;\nfunction getProps(codec) {\n    switch (codec._tag) {\n        case 'RefinementType':\n        case 'ReadonlyType':\n            return getProps(codec.type);\n        case 'InterfaceType':\n        case 'StrictType':\n        case 'PartialType':\n            return codec.props;\n        case 'IntersectionType':\n            return codec.types.reduce(function (props, type) { return Object.assign(props, getProps(type)); }, {});\n    }\n}\nfunction stripKeys(o, props) {\n    var keys = Object.getOwnPropertyNames(o);\n    var shouldStrip = false;\n    var r = {};\n    for (var i = 0; i < keys.length; i++) {\n        var key = keys[i];\n        if (!hasOwnProperty.call(props, key)) {\n            shouldStrip = true;\n        }\n        else {\n            r[key] = o[key];\n        }\n    }\n    return shouldStrip ? r : o;\n}\nfunction getExactTypeName(codec) {\n    if (isTypeC(codec)) {\n        return \"{| \".concat(getNameFromProps(codec.props), \" |}\");\n    }\n    else if (isPartialC(codec)) {\n        return getPartialTypeName(\"{| \".concat(getNameFromProps(codec.props), \" |}\"));\n    }\n    return \"Exact<\".concat(codec.name, \">\");\n}\nfunction isNonEmpty(as) {\n    return as.length > 0;\n}\n/**\n * @internal\n */\nexports.emptyTags = {};\nfunction intersect(a, b) {\n    var r = [];\n    for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {\n        var v = a_1[_i];\n        if (b.indexOf(v) !== -1) {\n            r.push(v);\n        }\n    }\n    return r;\n}\nfunction mergeTags(a, b) {\n    if (a === exports.emptyTags) {\n        return b;\n    }\n    if (b === exports.emptyTags) {\n        return a;\n    }\n    var r = Object.assign({}, a);\n    for (var k in b) {\n        if (hasOwnProperty.call(a, k)) {\n            var intersection_1 = intersect(a[k], b[k]);\n            if (isNonEmpty(intersection_1)) {\n                r[k] = intersection_1;\n            }\n            else {\n                r = exports.emptyTags;\n                break;\n            }\n        }\n        else {\n            r[k] = b[k];\n        }\n    }\n    return r;\n}\nfunction intersectTags(a, b) {\n    if (a === exports.emptyTags || b === exports.emptyTags) {\n        return exports.emptyTags;\n    }\n    var r = exports.emptyTags;\n    for (var k in a) {\n        if (hasOwnProperty.call(b, k)) {\n            var intersection_2 = intersect(a[k], b[k]);\n            if (intersection_2.length === 0) {\n                if (r === exports.emptyTags) {\n                    r = {};\n                }\n                r[k] = a[k].concat(b[k]);\n            }\n        }\n    }\n    return r;\n}\n// tslint:disable-next-line: deprecation\nfunction isAnyC(codec) {\n    return codec._tag === 'AnyType';\n}\nfunction isLiteralC(codec) {\n    return codec._tag === 'LiteralType';\n}\nfunction isKeyofC(codec) {\n    return codec._tag === 'KeyofType';\n}\nfunction isTypeC(codec) {\n    return codec._tag === 'InterfaceType';\n}\nfunction isPartialC(codec) {\n    return codec._tag === 'PartialType';\n}\n// tslint:disable-next-line: deprecation\nfunction isStrictC(codec) {\n    return codec._tag === 'StrictType';\n}\nfunction isExactC(codec) {\n    return codec._tag === 'ExactType';\n}\n// tslint:disable-next-line: deprecation\nfunction isRefinementC(codec) {\n    return codec._tag === 'RefinementType';\n}\nfunction isIntersectionC(codec) {\n    return codec._tag === 'IntersectionType';\n}\nfunction isUnionC(codec) {\n    return codec._tag === 'UnionType';\n}\nfunction isRecursiveC(codec) {\n    return codec._tag === 'RecursiveType';\n}\nfunction isReadonlyC(codec) {\n    return codec._tag === 'ReadonlyType';\n}\nvar lazyCodecs = [];\n/**\n * @internal\n */\nfunction getTags(codec) {\n    if (lazyCodecs.indexOf(codec) !== -1) {\n        return exports.emptyTags;\n    }\n    if (isTypeC(codec) || isStrictC(codec)) {\n        var index = exports.emptyTags;\n        // tslint:disable-next-line: forin\n        for (var k in codec.props) {\n            var prop = codec.props[k];\n            if (isLiteralC(prop)) {\n                if (index === exports.emptyTags) {\n                    index = {};\n                }\n                index[k] = [prop.value];\n            }\n        }\n        return index;\n    }\n    else if (isExactC(codec) || isRefinementC(codec) || isReadonlyC(codec)) {\n        return getTags(codec.type);\n    }\n    else if (isIntersectionC(codec)) {\n        return codec.types.reduce(function (tags, codec) { return mergeTags(tags, getTags(codec)); }, exports.emptyTags);\n    }\n    else if (isUnionC(codec)) {\n        return codec.types.slice(1).reduce(function (tags, codec) { return intersectTags(tags, getTags(codec)); }, getTags(codec.types[0]));\n    }\n    else if (isRecursiveC(codec)) {\n        lazyCodecs.push(codec);\n        var tags = getTags(codec.type);\n        lazyCodecs.pop();\n        return tags;\n    }\n    return exports.emptyTags;\n}\nexports.getTags = getTags;\n/**\n * @internal\n */\nfunction getIndex(codecs) {\n    var tags = getTags(codecs[0]);\n    var keys = Object.keys(tags);\n    var len = codecs.length;\n    var _loop_1 = function (k) {\n        var all = tags[k].slice();\n        var index = [tags[k]];\n        for (var i = 1; i < len; i++) {\n            var codec = codecs[i];\n            var ctags = getTags(codec);\n            var values = ctags[k];\n            // tslint:disable-next-line: strict-type-predicates\n            if (values === undefined) {\n                return \"continue-keys\";\n            }\n            else {\n                if (values.some(function (v) { return all.indexOf(v) !== -1; })) {\n                    return \"continue-keys\";\n                }\n                else {\n                    all.push.apply(all, values);\n                    index.push(values);\n                }\n            }\n        }\n        return { value: [k, index] };\n    };\n    keys: for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n        var k = keys_1[_i];\n        var state_1 = _loop_1(k);\n        if (typeof state_1 === \"object\")\n            return state_1.value;\n        switch (state_1) {\n            case \"continue-keys\": continue keys;\n        }\n    }\n    return undefined;\n}\nexports.getIndex = getIndex;\n// -------------------------------------------------------------------------------------\n// primitives\n// -------------------------------------------------------------------------------------\n/**\n * @since 1.0.0\n */\nvar NullType = /** @class */ (function (_super) {\n    __extends(NullType, _super);\n    function NullType() {\n        var _this = _super.call(this, 'null', function (u) { return u === null; }, function (u, c) { return (_this.is(u) ? (0, exports.success)(u) : (0, exports.failure)(u, c)); }, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'NullType';\n        return _this;\n    }\n    return NullType;\n}(Type));\nexports.NullType = NullType;\n/**\n * @category primitives\n * @since 1.0.0\n */\nexports.nullType = new NullType();\nexports.null = exports.nullType;\n/**\n * @since 1.0.0\n */\nvar UndefinedType = /** @class */ (function (_super) {\n    __extends(UndefinedType, _super);\n    function UndefinedType() {\n        var _this = _super.call(this, 'undefined', function (u) { return u === void 0; }, function (u, c) { return (_this.is(u) ? (0, exports.success)(u) : (0, exports.failure)(u, c)); }, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'UndefinedType';\n        return _this;\n    }\n    return UndefinedType;\n}(Type));\nexports.UndefinedType = UndefinedType;\nvar undefinedType = new UndefinedType();\nexports.undefined = undefinedType;\n/**\n * @since 1.2.0\n */\nvar VoidType = /** @class */ (function (_super) {\n    __extends(VoidType, _super);\n    function VoidType() {\n        var _this = _super.call(this, 'void', undefinedType.is, undefinedType.validate, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'VoidType';\n        return _this;\n    }\n    return VoidType;\n}(Type));\nexports.VoidType = VoidType;\n/**\n * @category primitives\n * @since 1.2.0\n */\nexports.voidType = new VoidType();\nexports.void = exports.voidType;\n/**\n * @since 1.5.0\n */\nvar UnknownType = /** @class */ (function (_super) {\n    __extends(UnknownType, _super);\n    function UnknownType() {\n        var _this = _super.call(this, 'unknown', function (_) { return true; }, exports.success, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'UnknownType';\n        return _this;\n    }\n    return UnknownType;\n}(Type));\nexports.UnknownType = UnknownType;\n/**\n * @category primitives\n * @since 1.5.0\n */\nexports.unknown = new UnknownType();\n/**\n * @since 1.0.0\n */\nvar StringType = /** @class */ (function (_super) {\n    __extends(StringType, _super);\n    function StringType() {\n        var _this = _super.call(this, 'string', function (u) { return typeof u === 'string'; }, function (u, c) { return (_this.is(u) ? (0, exports.success)(u) : (0, exports.failure)(u, c)); }, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'StringType';\n        return _this;\n    }\n    return StringType;\n}(Type));\nexports.StringType = StringType;\n/**\n * @category primitives\n * @since 1.0.0\n */\nexports.string = new StringType();\n/**\n * @since 1.0.0\n */\nvar NumberType = /** @class */ (function (_super) {\n    __extends(NumberType, _super);\n    function NumberType() {\n        var _this = _super.call(this, 'number', function (u) { return typeof u === 'number'; }, function (u, c) { return (_this.is(u) ? (0, exports.success)(u) : (0, exports.failure)(u, c)); }, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'NumberType';\n        return _this;\n    }\n    return NumberType;\n}(Type));\nexports.NumberType = NumberType;\n/**\n * @category primitives\n * @since 1.0.0\n */\nexports.number = new NumberType();\n/**\n * @since 2.1.0\n */\nvar BigIntType = /** @class */ (function (_super) {\n    __extends(BigIntType, _super);\n    function BigIntType() {\n        var _this = _super.call(this, 'bigint', \n        // tslint:disable-next-line: valid-typeof\n        function (u) { return typeof u === 'bigint'; }, function (u, c) { return (_this.is(u) ? (0, exports.success)(u) : (0, exports.failure)(u, c)); }, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'BigIntType';\n        return _this;\n    }\n    return BigIntType;\n}(Type));\nexports.BigIntType = BigIntType;\n/**\n * @category primitives\n * @since 2.1.0\n */\nexports.bigint = new BigIntType();\n/**\n * @since 1.0.0\n */\nvar BooleanType = /** @class */ (function (_super) {\n    __extends(BooleanType, _super);\n    function BooleanType() {\n        var _this = _super.call(this, 'boolean', function (u) { return typeof u === 'boolean'; }, function (u, c) { return (_this.is(u) ? (0, exports.success)(u) : (0, exports.failure)(u, c)); }, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'BooleanType';\n        return _this;\n    }\n    return BooleanType;\n}(Type));\nexports.BooleanType = BooleanType;\n/**\n * @category primitives\n * @since 1.0.0\n */\nexports.boolean = new BooleanType();\n/**\n * @since 1.0.0\n */\nvar AnyArrayType = /** @class */ (function (_super) {\n    __extends(AnyArrayType, _super);\n    function AnyArrayType() {\n        var _this = _super.call(this, 'UnknownArray', Array.isArray, function (u, c) { return (_this.is(u) ? (0, exports.success)(u) : (0, exports.failure)(u, c)); }, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'AnyArrayType';\n        return _this;\n    }\n    return AnyArrayType;\n}(Type));\nexports.AnyArrayType = AnyArrayType;\n/**\n * @category primitives\n * @since 1.7.1\n */\nexports.UnknownArray = new AnyArrayType();\nexports.Array = exports.UnknownArray;\n/**\n * @since 1.0.0\n */\nvar AnyDictionaryType = /** @class */ (function (_super) {\n    __extends(AnyDictionaryType, _super);\n    function AnyDictionaryType() {\n        var _this = _super.call(this, 'UnknownRecord', function (u) { return u !== null && typeof u === 'object' && !Array.isArray(u); }, function (u, c) { return (_this.is(u) ? (0, exports.success)(u) : (0, exports.failure)(u, c)); }, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'AnyDictionaryType';\n        return _this;\n    }\n    return AnyDictionaryType;\n}(Type));\nexports.AnyDictionaryType = AnyDictionaryType;\n/**\n * @category primitives\n * @since 1.7.1\n */\nexports.UnknownRecord = new AnyDictionaryType();\n/**\n * @since 1.0.0\n */\nvar LiteralType = /** @class */ (function (_super) {\n    __extends(LiteralType, _super);\n    function LiteralType(name, is, validate, encode, value) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.value = value;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'LiteralType';\n        return _this;\n    }\n    return LiteralType;\n}(Type));\nexports.LiteralType = LiteralType;\n/**\n * @category constructors\n * @since 1.0.0\n */\nfunction literal(value, name) {\n    if (name === void 0) { name = JSON.stringify(value); }\n    var is = function (u) { return u === value; };\n    return new LiteralType(name, is, function (u, c) { return (is(u) ? (0, exports.success)(value) : (0, exports.failure)(u, c)); }, exports.identity, value);\n}\nexports.literal = literal;\n/**\n * @since 1.0.0\n */\nvar KeyofType = /** @class */ (function (_super) {\n    __extends(KeyofType, _super);\n    function KeyofType(name, is, validate, encode, keys) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.keys = keys;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'KeyofType';\n        return _this;\n    }\n    return KeyofType;\n}(Type));\nexports.KeyofType = KeyofType;\n/**\n * @category constructors\n * @since 1.0.0\n */\nfunction keyof(keys, name) {\n    if (name === void 0) { name = Object.keys(keys)\n        .map(function (k) { return JSON.stringify(k); })\n        .join(' | '); }\n    var is = function (u) { return exports.string.is(u) && hasOwnProperty.call(keys, u); };\n    return new KeyofType(name, is, function (u, c) { return (is(u) ? (0, exports.success)(u) : (0, exports.failure)(u, c)); }, exports.identity, keys);\n}\nexports.keyof = keyof;\n// -------------------------------------------------------------------------------------\n// combinators\n// -------------------------------------------------------------------------------------\n/**\n * @since 1.0.0\n */\nvar RefinementType = /** @class */ (function (_super) {\n    __extends(RefinementType, _super);\n    function RefinementType(name, is, validate, encode, type, predicate) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.type = type;\n        _this.predicate = predicate;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'RefinementType';\n        return _this;\n    }\n    return RefinementType;\n}(Type));\nexports.RefinementType = RefinementType;\n/**\n * @category combinators\n * @since 1.8.1\n */\nfunction brand(codec, predicate, name) {\n    return refinement(codec, predicate, name);\n}\nexports.brand = brand;\n/**\n * A branded codec representing an integer\n *\n * @category primitives\n * @since 1.8.1\n */\nexports.Int = brand(exports.number, function (n) { return Number.isInteger(n); }, 'Int');\n/**\n * @since 1.0.0\n */\nvar RecursiveType = /** @class */ (function (_super) {\n    __extends(RecursiveType, _super);\n    function RecursiveType(name, is, validate, encode, runDefinition) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.runDefinition = runDefinition;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'RecursiveType';\n        return _this;\n    }\n    return RecursiveType;\n}(Type));\nexports.RecursiveType = RecursiveType;\nObject.defineProperty(RecursiveType.prototype, 'type', {\n    get: function () {\n        return this.runDefinition();\n    },\n    enumerable: true,\n    configurable: true\n});\n/**\n * @category combinators\n * @since 1.0.0\n */\nfunction recursion(name, definition) {\n    var cache;\n    var runDefinition = function () {\n        if (!cache) {\n            cache = definition(Self);\n            cache.name = name;\n        }\n        return cache;\n    };\n    var Self = new RecursiveType(name, function (u) { return runDefinition().is(u); }, function (u, c) { return runDefinition().validate(u, c); }, function (a) { return runDefinition().encode(a); }, runDefinition);\n    return Self;\n}\nexports.recursion = recursion;\n/**\n * @since 1.0.0\n */\nvar ArrayType = /** @class */ (function (_super) {\n    __extends(ArrayType, _super);\n    function ArrayType(name, is, validate, encode, type) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.type = type;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'ArrayType';\n        return _this;\n    }\n    return ArrayType;\n}(Type));\nexports.ArrayType = ArrayType;\n/**\n * @category combinators\n * @since 1.0.0\n */\nfunction array(item, name) {\n    if (name === void 0) { name = \"Array<\".concat(item.name, \">\"); }\n    return new ArrayType(name, function (u) { return exports.UnknownArray.is(u) && u.every(item.is); }, function (u, c) {\n        var e = exports.UnknownArray.validate(u, c);\n        if ((0, Either_1.isLeft)(e)) {\n            return e;\n        }\n        var us = e.right;\n        var len = us.length;\n        var as = us;\n        var errors = [];\n        for (var i = 0; i < len; i++) {\n            var ui = us[i];\n            var result = item.validate(ui, appendContext(c, String(i), item, ui));\n            if ((0, Either_1.isLeft)(result)) {\n                pushAll(errors, result.left);\n            }\n            else {\n                var ai = result.right;\n                if (ai !== ui) {\n                    if (as === us) {\n                        as = us.slice();\n                    }\n                    as[i] = ai;\n                }\n            }\n        }\n        return errors.length > 0 ? (0, exports.failures)(errors) : (0, exports.success)(as);\n    }, item.encode === exports.identity ? exports.identity : function (a) { return a.map(item.encode); }, item);\n}\nexports.array = array;\n/**\n * @since 1.0.0\n */\nvar InterfaceType = /** @class */ (function (_super) {\n    __extends(InterfaceType, _super);\n    function InterfaceType(name, is, validate, encode, props) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.props = props;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'InterfaceType';\n        return _this;\n    }\n    return InterfaceType;\n}(Type));\nexports.InterfaceType = InterfaceType;\n/**\n * @category combinators\n * @since 1.0.0\n */\nfunction type(props, name) {\n    if (name === void 0) { name = getInterfaceTypeName(props); }\n    var keys = Object.keys(props);\n    var types = keys.map(function (key) { return props[key]; });\n    var len = keys.length;\n    return new InterfaceType(name, function (u) {\n        if (exports.UnknownRecord.is(u)) {\n            for (var i = 0; i < len; i++) {\n                var k = keys[i];\n                var uk = u[k];\n                if ((uk === undefined && !hasOwnProperty.call(u, k)) || !types[i].is(uk)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        return false;\n    }, function (u, c) {\n        var e = exports.UnknownRecord.validate(u, c);\n        if ((0, Either_1.isLeft)(e)) {\n            return e;\n        }\n        var o = e.right;\n        var a = o;\n        var errors = [];\n        for (var i = 0; i < len; i++) {\n            var k = keys[i];\n            var ak = a[k];\n            var type_1 = types[i];\n            var result = type_1.validate(ak, appendContext(c, k, type_1, ak));\n            if ((0, Either_1.isLeft)(result)) {\n                pushAll(errors, result.left);\n            }\n            else {\n                var vak = result.right;\n                if (vak !== ak || (vak === undefined && !hasOwnProperty.call(a, k))) {\n                    /* istanbul ignore next */\n                    if (a === o) {\n                        a = __assign({}, o);\n                    }\n                    a[k] = vak;\n                }\n            }\n        }\n        return errors.length > 0 ? (0, exports.failures)(errors) : (0, exports.success)(a);\n    }, useIdentity(types)\n        ? exports.identity\n        : function (a) {\n            var s = __assign({}, a);\n            for (var i = 0; i < len; i++) {\n                var k = keys[i];\n                var encode = types[i].encode;\n                if (encode !== exports.identity) {\n                    s[k] = encode(a[k]);\n                }\n            }\n            return s;\n        }, props);\n}\nexports.type = type;\nexports.interface = type;\n/**\n * @since 1.0.0\n */\nvar PartialType = /** @class */ (function (_super) {\n    __extends(PartialType, _super);\n    function PartialType(name, is, validate, encode, props) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.props = props;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'PartialType';\n        return _this;\n    }\n    return PartialType;\n}(Type));\nexports.PartialType = PartialType;\n/**\n * @category combinators\n * @since 1.0.0\n */\nfunction partial(props, name) {\n    if (name === void 0) { name = getPartialTypeName(getInterfaceTypeName(props)); }\n    var keys = Object.keys(props);\n    var types = keys.map(function (key) { return props[key]; });\n    var len = keys.length;\n    return new PartialType(name, function (u) {\n        if (exports.UnknownRecord.is(u)) {\n            for (var i = 0; i < len; i++) {\n                var k = keys[i];\n                var uk = u[k];\n                if (uk !== undefined && !props[k].is(uk)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        return false;\n    }, function (u, c) {\n        var e = exports.UnknownRecord.validate(u, c);\n        if ((0, Either_1.isLeft)(e)) {\n            return e;\n        }\n        var o = e.right;\n        var a = o;\n        var errors = [];\n        for (var i = 0; i < len; i++) {\n            var k = keys[i];\n            var ak = a[k];\n            var type_2 = props[k];\n            var result = type_2.validate(ak, appendContext(c, k, type_2, ak));\n            if ((0, Either_1.isLeft)(result)) {\n                if (ak !== undefined) {\n                    pushAll(errors, result.left);\n                }\n            }\n            else {\n                var vak = result.right;\n                if (vak !== ak) {\n                    /* istanbul ignore next */\n                    if (a === o) {\n                        a = __assign({}, o);\n                    }\n                    a[k] = vak;\n                }\n            }\n        }\n        return errors.length > 0 ? (0, exports.failures)(errors) : (0, exports.success)(a);\n    }, useIdentity(types)\n        ? exports.identity\n        : function (a) {\n            var s = __assign({}, a);\n            for (var i = 0; i < len; i++) {\n                var k = keys[i];\n                var ak = a[k];\n                if (ak !== undefined) {\n                    s[k] = types[i].encode(ak);\n                }\n            }\n            return s;\n        }, props);\n}\nexports.partial = partial;\n/**\n * @since 1.0.0\n */\nvar DictionaryType = /** @class */ (function (_super) {\n    __extends(DictionaryType, _super);\n    function DictionaryType(name, is, validate, encode, domain, codomain) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.domain = domain;\n        _this.codomain = codomain;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'DictionaryType';\n        return _this;\n    }\n    return DictionaryType;\n}(Type));\nexports.DictionaryType = DictionaryType;\n/**\n * @category combinators\n * @since 1.7.1\n */\nfunction record(domain, codomain, name) {\n    var keys = getDomainKeys(domain);\n    return keys\n        ? enumerableRecord(Object.keys(keys), domain, codomain, name)\n        : nonEnumerableRecord(domain, codomain, name);\n}\nexports.record = record;\n/**\n * @since 1.0.0\n */\nvar UnionType = /** @class */ (function (_super) {\n    __extends(UnionType, _super);\n    function UnionType(name, is, validate, encode, types) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.types = types;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'UnionType';\n        return _this;\n    }\n    return UnionType;\n}(Type));\nexports.UnionType = UnionType;\n/**\n * @category combinators\n * @since 1.0.0\n */\nfunction union(codecs, name) {\n    if (name === void 0) { name = getUnionName(codecs); }\n    var index = getIndex(codecs);\n    if (index !== undefined && codecs.length > 0) {\n        var tag_1 = index[0], groups_1 = index[1];\n        var len_1 = groups_1.length;\n        var find_1 = function (value) {\n            for (var i = 0; i < len_1; i++) {\n                if (groups_1[i].indexOf(value) !== -1) {\n                    return i;\n                }\n            }\n            return undefined;\n        };\n        // tslint:disable-next-line: deprecation\n        return new TaggedUnionType(name, function (u) {\n            if (exports.UnknownRecord.is(u)) {\n                var i = find_1(u[tag_1]);\n                return i !== undefined ? codecs[i].is(u) : false;\n            }\n            return false;\n        }, function (u, c) {\n            var e = exports.UnknownRecord.validate(u, c);\n            if ((0, Either_1.isLeft)(e)) {\n                return e;\n            }\n            var r = e.right;\n            var i = find_1(r[tag_1]);\n            if (i === undefined) {\n                return (0, exports.failure)(u, c);\n            }\n            var codec = codecs[i];\n            return codec.validate(r, appendContext(c, String(i), codec, r));\n        }, useIdentity(codecs)\n            ? exports.identity\n            : function (a) {\n                var i = find_1(a[tag_1]);\n                if (i === undefined) {\n                    // https://github.com/gcanti/io-ts/pull/305\n                    throw new Error(\"no codec found to encode value in union codec \".concat(name));\n                }\n                else {\n                    return codecs[i].encode(a);\n                }\n            }, codecs, tag_1);\n    }\n    else {\n        return new UnionType(name, function (u) { return codecs.some(function (type) { return type.is(u); }); }, function (u, c) {\n            var errors = [];\n            for (var i = 0; i < codecs.length; i++) {\n                var codec = codecs[i];\n                var result = codec.validate(u, appendContext(c, String(i), codec, u));\n                if ((0, Either_1.isLeft)(result)) {\n                    pushAll(errors, result.left);\n                }\n                else {\n                    return (0, exports.success)(result.right);\n                }\n            }\n            return (0, exports.failures)(errors);\n        }, useIdentity(codecs)\n            ? exports.identity\n            : function (a) {\n                for (var _i = 0, codecs_1 = codecs; _i < codecs_1.length; _i++) {\n                    var codec = codecs_1[_i];\n                    if (codec.is(a)) {\n                        return codec.encode(a);\n                    }\n                }\n                // https://github.com/gcanti/io-ts/pull/305\n                throw new Error(\"no codec found to encode value in union type \".concat(name));\n            }, codecs);\n    }\n}\nexports.union = union;\n/**\n * @since 1.0.0\n */\nvar IntersectionType = /** @class */ (function (_super) {\n    __extends(IntersectionType, _super);\n    function IntersectionType(name, is, validate, encode, types) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.types = types;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'IntersectionType';\n        return _this;\n    }\n    return IntersectionType;\n}(Type));\nexports.IntersectionType = IntersectionType;\nfunction intersection(codecs, name) {\n    if (name === void 0) { name = \"(\".concat(codecs.map(function (type) { return type.name; }).join(' & '), \")\"); }\n    var len = codecs.length;\n    return new IntersectionType(name, function (u) { return codecs.every(function (type) { return type.is(u); }); }, codecs.length === 0\n        ? exports.success\n        : function (u, c) {\n            var us = [];\n            var errors = [];\n            for (var i = 0; i < len; i++) {\n                var codec = codecs[i];\n                var result = codec.validate(u, appendContext(c, String(i), codec, u));\n                if ((0, Either_1.isLeft)(result)) {\n                    pushAll(errors, result.left);\n                }\n                else {\n                    us.push(result.right);\n                }\n            }\n            return errors.length > 0 ? (0, exports.failures)(errors) : (0, exports.success)(mergeAll(u, us));\n        }, codecs.length === 0\n        ? exports.identity\n        : function (a) {\n            return mergeAll(a, codecs.map(function (codec) { return codec.encode(a); }));\n        }, codecs);\n}\nexports.intersection = intersection;\n/**\n * @since 1.0.0\n */\nvar TupleType = /** @class */ (function (_super) {\n    __extends(TupleType, _super);\n    function TupleType(name, is, validate, encode, types) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.types = types;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'TupleType';\n        return _this;\n    }\n    return TupleType;\n}(Type));\nexports.TupleType = TupleType;\nfunction tuple(codecs, name) {\n    if (name === void 0) { name = \"[\".concat(codecs.map(function (type) { return type.name; }).join(', '), \"]\"); }\n    var len = codecs.length;\n    return new TupleType(name, function (u) { return exports.UnknownArray.is(u) && u.length === len && codecs.every(function (type, i) { return type.is(u[i]); }); }, function (u, c) {\n        var e = exports.UnknownArray.validate(u, c);\n        if ((0, Either_1.isLeft)(e)) {\n            return e;\n        }\n        var us = e.right;\n        var as = us.length > len ? us.slice(0, len) : us; // strip additional components\n        var errors = [];\n        for (var i = 0; i < len; i++) {\n            var a = us[i];\n            var type_3 = codecs[i];\n            var result = type_3.validate(a, appendContext(c, String(i), type_3, a));\n            if ((0, Either_1.isLeft)(result)) {\n                pushAll(errors, result.left);\n            }\n            else {\n                var va = result.right;\n                if (va !== a) {\n                    /* istanbul ignore next */\n                    if (as === us) {\n                        as = us.slice();\n                    }\n                    as[i] = va;\n                }\n            }\n        }\n        return errors.length > 0 ? (0, exports.failures)(errors) : (0, exports.success)(as);\n    }, useIdentity(codecs) ? exports.identity : function (a) { return codecs.map(function (type, i) { return type.encode(a[i]); }); }, codecs);\n}\nexports.tuple = tuple;\n/**\n * @since 1.0.0\n */\nvar ReadonlyType = /** @class */ (function (_super) {\n    __extends(ReadonlyType, _super);\n    function ReadonlyType(name, is, validate, encode, type) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.type = type;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'ReadonlyType';\n        return _this;\n    }\n    return ReadonlyType;\n}(Type));\nexports.ReadonlyType = ReadonlyType;\n/**\n * @category combinators\n * @since 1.0.0\n */\nfunction readonly(codec, name) {\n    if (name === void 0) { name = \"Readonly<\".concat(codec.name, \">\"); }\n    return new ReadonlyType(name, codec.is, codec.validate, codec.encode, codec);\n}\nexports.readonly = readonly;\n/**\n * @since 1.0.0\n */\nvar ReadonlyArrayType = /** @class */ (function (_super) {\n    __extends(ReadonlyArrayType, _super);\n    function ReadonlyArrayType(name, is, validate, encode, type) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.type = type;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'ReadonlyArrayType';\n        return _this;\n    }\n    return ReadonlyArrayType;\n}(Type));\nexports.ReadonlyArrayType = ReadonlyArrayType;\n/**\n * @category combinators\n * @since 1.0.0\n */\nfunction readonlyArray(item, name) {\n    if (name === void 0) { name = \"ReadonlyArray<\".concat(item.name, \">\"); }\n    var codec = array(item);\n    return new ReadonlyArrayType(name, codec.is, codec.validate, codec.encode, item);\n}\nexports.readonlyArray = readonlyArray;\n/**\n * Strips additional properties, equivalent to `exact(type(props))`.\n *\n * @category combinators\n * @since 1.0.0\n */\nvar strict = function (props, name) { return exact(type(props), name); };\nexports.strict = strict;\n/**\n * @since 1.1.0\n */\nvar ExactType = /** @class */ (function (_super) {\n    __extends(ExactType, _super);\n    function ExactType(name, is, validate, encode, type) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.type = type;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'ExactType';\n        return _this;\n    }\n    return ExactType;\n}(Type));\nexports.ExactType = ExactType;\n/**\n * Strips additional properties.\n *\n * @category combinators\n * @since 1.1.0\n */\nfunction exact(codec, name) {\n    if (name === void 0) { name = getExactTypeName(codec); }\n    var props = getProps(codec);\n    return new ExactType(name, codec.is, function (u, c) {\n        var e = exports.UnknownRecord.validate(u, c);\n        if ((0, Either_1.isLeft)(e)) {\n            return e;\n        }\n        var ce = codec.validate(u, c);\n        if ((0, Either_1.isLeft)(ce)) {\n            return ce;\n        }\n        return (0, Either_1.right)(stripKeys(ce.right, props));\n    }, function (a) { return codec.encode(stripKeys(a, props)); }, codec);\n}\nexports.exact = exact;\n/**\n * @since 1.0.0\n */\nvar FunctionType = /** @class */ (function (_super) {\n    __extends(FunctionType, _super);\n    function FunctionType() {\n        var _this = _super.call(this, 'Function', \n        // tslint:disable-next-line:strict-type-predicates\n        function (u) { return typeof u === 'function'; }, function (u, c) { return (_this.is(u) ? (0, exports.success)(u) : (0, exports.failure)(u, c)); }, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'FunctionType';\n        return _this;\n    }\n    return FunctionType;\n}(Type));\nexports.FunctionType = FunctionType;\n/**\n * @category primitives\n * @since 1.0.0\n */\nexports.Function = new FunctionType();\n/**\n * @since 1.0.0\n */\nvar NeverType = /** @class */ (function (_super) {\n    __extends(NeverType, _super);\n    function NeverType() {\n        var _this = _super.call(this, 'never', function (_) { return false; }, function (u, c) { return (0, exports.failure)(u, c); }, \n        /* istanbul ignore next */\n        function () {\n            throw new Error('cannot encode never');\n        }) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'NeverType';\n        return _this;\n    }\n    return NeverType;\n}(Type));\nexports.NeverType = NeverType;\n/**\n * @category primitives\n * @since 1.0.0\n */\nexports.never = new NeverType();\n/**\n * @since 1.0.0\n */\nvar AnyType = /** @class */ (function (_super) {\n    __extends(AnyType, _super);\n    function AnyType() {\n        var _this = _super.call(this, 'any', function (_) { return true; }, exports.success, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'AnyType';\n        return _this;\n    }\n    return AnyType;\n}(Type));\nexports.AnyType = AnyType;\n/**\n * @category primitives\n * @since 1.0.0\n */\nexports.any = new AnyType();\nfunction refinement(codec, predicate, name) {\n    if (name === void 0) { name = \"(\".concat(codec.name, \" | \").concat(getFunctionName(predicate), \")\"); }\n    return new RefinementType(name, function (u) { return codec.is(u) && predicate(u); }, function (i, c) {\n        var e = codec.validate(i, c);\n        if ((0, Either_1.isLeft)(e)) {\n            return e;\n        }\n        var a = e.right;\n        return predicate(a) ? (0, exports.success)(a) : (0, exports.failure)(a, c);\n    }, codec.encode, codec, predicate);\n}\nexports.refinement = refinement;\n/**\n * @category primitives\n * @since 1.0.0\n */\nexports.Integer = refinement(exports.number, Number.isInteger, 'Integer');\n// -------------------------------------------------------------------------------------\n// deprecated\n// -------------------------------------------------------------------------------------\n/**\n * @since 1.3.0\n * @deprecated\n */\nvar TaggedUnionType = /** @class */ (function (_super) {\n    __extends(TaggedUnionType, _super);\n    function TaggedUnionType(name, \n    // tslint:disable-next-line: deprecation\n    is, \n    // tslint:disable-next-line: deprecation\n    validate, \n    // tslint:disable-next-line: deprecation\n    encode, codecs, tag) {\n        var _this = _super.call(this, name, is, validate, encode, codecs) /* istanbul ignore next */ // <= workaround for https://github.com/Microsoft/TypeScript/issues/13455\n         || this;\n        _this.tag = tag;\n        return _this;\n    }\n    return TaggedUnionType;\n}(UnionType));\nexports.TaggedUnionType = TaggedUnionType;\n/**\n * Use `union` instead.\n *\n * @category combinators\n * @since 1.3.0\n * @deprecated\n */\nvar taggedUnion = function (tag, codecs, name\n// tslint:disable-next-line: deprecation\n) {\n    if (name === void 0) { name = getUnionName(codecs); }\n    var U = union(codecs, name);\n    // tslint:disable-next-line: deprecation\n    if (U instanceof TaggedUnionType) {\n        return U;\n    }\n    else {\n        console.warn(\"[io-ts] Cannot build a tagged union for \".concat(name, \", returning a de-optimized union\"));\n        // tslint:disable-next-line: deprecation\n        return new TaggedUnionType(name, U.is, U.validate, U.encode, codecs, tag);\n    }\n};\nexports.taggedUnion = taggedUnion;\n/**\n * @since 1.0.0\n * @deprecated\n */\nvar getValidationError /* istanbul ignore next */ = function (value, context) { return ({\n    value: value,\n    context: context\n}); };\nexports.getValidationError /* istanbul ignore next */ = getValidationError;\n/**\n * @since 1.0.0\n * @deprecated\n */\nvar getDefaultContext /* istanbul ignore next */ = function (decoder) { return [\n    { key: '', type: decoder }\n]; };\nexports.getDefaultContext /* istanbul ignore next */ = getDefaultContext;\n/**\n * Use `UnknownRecord` instead.\n *\n * @category primitives\n * @since 1.0.0\n * @deprecated\n */\nexports.Dictionary = exports.UnknownRecord;\n/**\n * @since 1.0.0\n * @deprecated\n */\nvar ObjectType = /** @class */ (function (_super) {\n    __extends(ObjectType, _super);\n    function ObjectType() {\n        var _this = _super.call(this, 'object', function (u) { return u !== null && typeof u === 'object'; }, function (u, c) { return (_this.is(u) ? (0, exports.success)(u) : (0, exports.failure)(u, c)); }, exports.identity) || this;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'ObjectType';\n        return _this;\n    }\n    return ObjectType;\n}(Type));\nexports.ObjectType = ObjectType;\n/**\n * Use `UnknownRecord` instead.\n *\n * @category primitives\n * @since 1.0.0\n * @deprecated\n */\n// tslint:disable-next-line: deprecation\nexports.object = new ObjectType();\n/**\n * Use `record` instead.\n *\n * @category combinators\n * @since 1.0.0\n * @deprecated\n */\nexports.dictionary = record;\n/**\n * @since 1.0.0\n * @deprecated\n */\nvar StrictType = /** @class */ (function (_super) {\n    __extends(StrictType, _super);\n    function StrictType(name, \n    // tslint:disable-next-line: deprecation\n    is, \n    // tslint:disable-next-line: deprecation\n    validate, \n    // tslint:disable-next-line: deprecation\n    encode, props) {\n        var _this = _super.call(this, name, is, validate, encode) || this;\n        _this.props = props;\n        /**\n         * @since 1.0.0\n         */\n        _this._tag = 'StrictType';\n        return _this;\n    }\n    return StrictType;\n}(Type));\nexports.StrictType = StrictType;\n/**\n * Drops the codec \"kind\".\n *\n * @category combinators\n * @since 1.1.0\n * @deprecated\n */\nfunction clean(codec) {\n    return codec;\n}\nexports.clean = clean;\nfunction alias(codec) {\n    return function () { return codec; };\n}\nexports.alias = alias;\n","import { StringUtils } from \"./string\";\n\nexport namespace UidFactory {\n  export function generateUid(length: number): string {\n    const domain = \"abcdefghijklmnopqrstuvwxyz\";\n    let uid = \"\";\n    for (let i = 0; i < length; i += 1) {\n      uid += domain[Math.floor(Math.random() * domain.length)];\n    }\n    return uid;\n  }\n\n  // The same seed gives the same id, on the phone and on the server.\n  export function uidFromSeed(seed: string, length: number): string {\n    const domain = \"abcdefghijklmnopqrstuvwxyz\";\n    let uid = \"\";\n    for (let i = 0; i < length; i += 1) {\n      uid += domain[Math.abs(StringUtils.hashCode(`${seed}:${i}`)) % domain.length];\n    }\n    return uid;\n  }\n}\n","import { JSX } from \"preact\";\nimport { Tailwind } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  width?: number;\n  height?: number;\n  className?: string;\n  color?: string;\n}\n\nexport function IconDoc(props: IProps): JSX.Element {\n  const color = props.color || Tailwind.semantic().icon.neutral;\n  const width = props.width || 17;\n  const height = props.height || 22;\n  return (\n    <svg\n      style={props.style}\n      className={`inline-block ${props.className}`}\n      width={width}\n      height={height}\n      viewBox=\"0 0 17 22\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        fill-rule=\"evenodd\"\n        clip-rule=\"evenodd\"\n        d=\"M13.1195 20.807H3.88537C2.29826 20.807 1 19.4965 1 17.8944V3.91333C1 2.31123 2.29826 1 3.88537 1H8.06936C8.50281 1 9.00786 1.21825 9.36866 1.43649L15.5725 7.69895C15.9333 8.06281 16.0049 8.50035 16.0049 9.01053V17.894C16.0049 19.4965 14.7793 20.807 13.1195 20.807Z\"\n        stroke={color}\n        stroke-width=\"1.6\"\n        stroke-linecap=\"round\"\n        stroke-linejoin=\"round\"\n      />\n      <path\n        d=\"M8.50246 1.27441V5.68669C8.50246 5.68669 8.42252 8.66424 10.9655 8.61336H15.6448\"\n        stroke={color}\n        stroke-width=\"1.6\"\n        stroke-linecap=\"round\"\n        stroke-linejoin=\"round\"\n      />\n      <path\n        d=\"M4.46238 12.4861H12.5425\"\n        stroke={color}\n        stroke-width=\"1.6\"\n        stroke-linecap=\"round\"\n        stroke-linejoin=\"round\"\n      />\n      <path\n        d=\"M4.42206 16.3123H12.5019\"\n        stroke={color}\n        stroke-width=\"1.6\"\n        stroke-linecap=\"round\"\n        stroke-linejoin=\"round\"\n      />\n    </svg>\n  );\n}\n","import { JSX } from \"preact\";\nimport { Tailwind } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  className?: string;\n  color?: string;\n  width?: number;\n  height?: number;\n}\n\nexport function IconDumbbell(props: IProps): JSX.Element {\n  const width = props.width || 32;\n  const height = props.height || 21;\n  const color = props.color || Tailwind.semantic().icon.neutral;\n  return (\n    <svg\n      style={props.style}\n      className={`inline-block ${props.className}`}\n      width={width}\n      height={height}\n      viewBox=\"0 0 32 21\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M9.09267 8.46919L22.7291 8.46919M22.7291 13.0846L9.09272 13.0846\" stroke={color} />\n      <path\n        d=\"M9.09286 6.16169C9.09286 4.88719 8.17708 3.854 7.04741 3.854C5.91773 3.854 5.00195 4.88719 5.00195 6.16169L5.00195 15.3924C5.00195 16.667 5.91773 17.7001 7.04741 17.7001C8.17708 17.7001 9.09286 16.667 9.09286 15.3924L9.09286 6.16169Z\"\n        stroke={color}\n      />\n      <path\n        d=\"M5.00156 8.46882C5.00156 7.19432 4.08577 6.16113 2.9561 6.16113C1.82643 6.16113 0.910644 7.19432 0.910644 8.46882L0.910644 13.0842C0.910643 14.3587 1.82643 15.3919 2.9561 15.3919C4.08577 15.3919 5.00156 14.3587 5.00156 13.0842L5.00156 8.46882Z\"\n        stroke={color}\n      />\n      <path\n        d=\"M30.9105 8.46882C30.9105 7.19432 29.9947 6.16113 28.865 6.16113C27.7354 6.16113 26.8196 7.19432 26.8196 8.46882L26.8196 13.0842C26.8196 14.3587 27.7354 15.3919 28.865 15.3919C29.9947 15.3919 30.9105 14.3587 30.9105 13.0842L30.9105 8.46882Z\"\n        stroke={color}\n      />\n      <path\n        d=\"M26.8199 6.16169C26.8199 4.88719 25.9041 3.854 24.7745 3.854C23.6448 3.854 22.729 4.88719 22.729 6.16169L22.729 15.3924C22.729 16.667 23.6448 17.7001 24.7745 17.7001C25.9041 17.7001 26.8199 16.667 26.8199 15.3925L26.8199 6.16169Z\"\n        stroke={color}\n      />\n    </svg>\n  );\n}\n","import { JSX, ComponentChildren } from \"preact\";\nimport { useEffect, useRef, useState } from \"preact/hooks\";\nimport { IconCloseCircleOutline } from \"./icons/iconCloseCircleOutline\";\nimport { createPortal } from \"preact/compat\";\nimport { useDialogFocus } from \"../hooks/useDialogFocus\";\n\ninterface IProps {\n  isHidden: boolean;\n  shouldShowClose?: boolean;\n  // Replaces the close icon. The button shows without `shouldShowClose`. Escape calls `onClose`, as the icon does.\n  closeIcon?: JSX.Element;\n  // The `aria-label` of the close button. The default is \"Close\".\n  closeLabel?: string;\n  // A tap on the overlay does nothing.\n  isOutsideTapDisabled?: boolean;\n  children?: ComponentChildren;\n  zIndex?: number;\n  onClose: () => void;\n}\n\nexport function BottomSheet(props: IProps): JSX.Element {\n  const [bottomShift, setBottomShift] = useState(typeof window !== \"undefined\" ? window.innerHeight : 0);\n  const bottomSheetRef = useRef<HTMLDivElement>(null);\n  useDialogFocus(bottomSheetRef, !props.isHidden, props.onClose);\n\n  useEffect(() => {\n    if (!props.isHidden) {\n      window.setTimeout(() => document.body.classList.add(`stop-scrolling-bottom-sheet`), 1000);\n    } else {\n      window.setTimeout(() => document.body.classList.remove(\"stop-scrolling-bottom-sheet\"), 1000);\n    }\n    return () => {\n      document.body.classList.remove(\"stop-scrolling-bottom-sheet\");\n    };\n  }, [props.isHidden]);\n\n  useEffect(() => {\n    const bottomSheet = bottomSheetRef.current;\n    const height = bottomSheet?.clientHeight ?? 0;\n    setBottomShift(height);\n  }, []);\n\n  useEffect(() => {\n    setBottomShift(props.isHidden ? (bottomSheetRef.current?.clientHeight ?? 0) : 0);\n  }, [props.isHidden]);\n  const containerRef = typeof window !== \"undefined\" ? window.document.getElementById(\"bottomsheet\") : undefined;\n\n  const element = (\n    <div\n      className={`fixed inset-0 ${!props.zIndex ? \"z-40\" : \"\"} pointer-events-none`}\n      style={{ zIndex: props.zIndex }}\n      data-cy=\"bottom-sheet-container\"\n    >\n      <div\n        data-name=\"overlay\"\n        className={`bottom-sheet-overlay pointer-events-auto absolute inset-0 bg-text-secondary ${\n          props.isHidden ? \"invisible opacity-0\" : \"visible opacity-50\"\n        }`}\n        onClick={props.isOutsideTapDisabled ? undefined : props.onClose}\n      ></div>\n      <div\n        ref={bottomSheetRef}\n        role=\"dialog\"\n        aria-modal=\"true\"\n        tabIndex={-1}\n        className={`bottom-sheet-panel bottom-sticked absolute bottom-0 left-0 flex w-full overflow-y-auto bg-background-default pointer-events-auto focus:outline-none ${\n          props.isHidden ? \"invisible\" : \"visible will-change-transform\"\n        }`}\n        data-cy=\"bottom-sheet\"\n        style={{\n          transform: `translateY(${bottomShift}px)`,\n          borderRadius: \"16px 16px 0 0\",\n          boxShadow: \"0 -5px 15px rgb(0 0 0 / 30%)\",\n        }}\n      >\n        {(props.shouldShowClose || props.closeIcon != null) && (\n          <button\n            data-cy={`bottom-sheet-close`}\n            onClick={props.onClose}\n            aria-label={props.closeLabel ?? \"Close\"}\n            className=\"absolute top-0 right-0 z-20 p-2 rounded-full nm-bottom-sheet-close focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-button-primarybackground\"\n          >\n            {props.closeIcon ?? <IconCloseCircleOutline size={28} />}\n          </button>\n        )}\n        <div className=\"flex flex-col w-full safe-area-inset-bottom\" style={{ maxHeight: \"90vh\" }}>\n          <div className=\"z-10 flex items-center justify-center pt-2 bg-background-default\">\n            <div className=\"w-8 rounded-sm bg-text-disabled\" style={{ height: \"3px\" }} />\n          </div>\n          {props.children}\n        </div>\n      </div>\n    </div>\n  );\n\n  if (containerRef) {\n    return createPortal(element, containerRef) as unknown as JSX.Element;\n  }\n  return element;\n}\n","import { UidFactory } from \"@shared/utils/generator\";\nimport { SendMessage } from \"./sendMessage\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ninterface IPendingRequest<T = any> {\n  resolve: (value: T) => void;\n  reject: (error: Error) => void;\n  timeout: NodeJS.Timeout;\n}\n\ntype IStorageResponseGetResult = {\n  type: \"storageGetResult\";\n  key: string;\n  requestId: string;\n  value: string;\n};\n\ntype IStorageResponseSetResult = {\n  type: \"storageSetResult\";\n  key: string;\n  requestId: string;\n  success: boolean;\n};\n\ntype IStorageResponseDeleteResult = {\n  type: \"storageDeleteResult\";\n  key: string;\n  requestId: string;\n  success: boolean;\n};\n\ntype IStorageResponseHasResult = {\n  type: \"storageHasResult\";\n  key: string;\n  requestId: string;\n  exists: boolean;\n};\n\ntype IStorageResponseGetAllKeysResult = {\n  type: \"storageGetAllKeysResult\";\n  requestId: string;\n  keys: string[];\n};\n\ntype IStorageResponse =\n  | IStorageResponseGetResult\n  | IStorageResponseSetResult\n  | IStorageResponseDeleteResult\n  | IStorageResponseHasResult\n  | IStorageResponseGetAllKeysResult;\n\nexport class NativeStorage {\n  private readonly pendingRequests: Map<string, IPendingRequest>;\n\n  constructor() {\n    this.pendingRequests = new Map();\n    window.addEventListener(\"message\", (event) => {\n      this.handleResponse(event.data);\n    });\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  public async set<T = any>(key: string, value: T): Promise<boolean> {\n    const requestId = this.generateRequestId();\n    const promise = this.createPromise<boolean>(requestId);\n\n    SendMessage.toIosAndAndroid({\n      type: \"storageSet\",\n      key: key,\n      value: typeof value === \"string\" ? value : JSON.stringify(value),\n      requestId: requestId,\n    });\n\n    return promise;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  public async get<T = any>(key: string): Promise<T | undefined> {\n    const requestId = this.generateRequestId();\n    const promise = this.createPromise<T | undefined>(requestId);\n\n    SendMessage.toIosAndAndroid({\n      type: \"storageGet\",\n      key: key,\n      requestId: requestId,\n    });\n\n    return promise;\n  }\n\n  public async delete(key: string): Promise<boolean> {\n    const requestId = this.generateRequestId();\n    const promise = this.createPromise<boolean>(requestId);\n\n    SendMessage.toIosAndAndroid({\n      type: \"storageDelete\",\n      key: key,\n      requestId: requestId,\n    });\n\n    return promise;\n  }\n\n  public async has(key: string): Promise<boolean> {\n    const requestId = this.generateRequestId();\n    const promise = this.createPromise<boolean>(requestId);\n\n    SendMessage.toIosAndAndroid({\n      type: \"storageHas\",\n      key: key,\n      requestId: requestId,\n    });\n\n    return promise;\n  }\n\n  public async getAllKeys(): Promise<string[]> {\n    const requestId = this.generateRequestId();\n    const promise = this.createPromise<string[]>(requestId);\n\n    SendMessage.toIosAndAndroid({\n      type: \"storageGetAllKeys\",\n      requestId: requestId,\n    });\n\n    return promise;\n  }\n\n  public async clear(): Promise<boolean> {\n    const keys = await this.getAllKeys();\n    await Promise.all(keys.map((key) => this.delete(key)));\n    return true;\n  }\n\n  public static isAvailable(): boolean {\n    return (\n      (SendMessage.isIos() && SendMessage.iosAppVersion() >= 12) ||\n      (SendMessage.isAndroid() && SendMessage.androidAppVersion() >= 21)\n    );\n  }\n\n  private generateRequestId(): string {\n    return `req_${UidFactory.generateUid(8)}`;\n  }\n\n  private handleResponse(data: IStorageResponse): void {\n    if (!data.requestId) {\n      return;\n    }\n\n    const pendingRequest = this.pendingRequests.get(data.requestId);\n    if (!pendingRequest) {\n      return;\n    }\n\n    clearTimeout(pendingRequest.timeout);\n    this.pendingRequests.delete(data.requestId);\n\n    if (data.type === \"storageSetResult\") {\n      pendingRequest.resolve(data.success ?? false);\n    } else if (data.type === \"storageGetResult\") {\n      const value = data.value;\n      pendingRequest.resolve(value);\n    } else if (data.type === \"storageDeleteResult\") {\n      pendingRequest.resolve(data.success ?? false);\n    } else if (data.type === \"storageHasResult\") {\n      pendingRequest.resolve(data.exists ?? false);\n    } else if (data.type === \"storageGetAllKeysResult\") {\n      pendingRequest.resolve(data.keys || []);\n    }\n  }\n\n  private createPromise<T>(requestId: string, timeoutMs: number = 5000): Promise<T> {\n    return new Promise((resolve, reject) => {\n      const timeout = setTimeout(() => {\n        if (this.pendingRequests.has(requestId)) {\n          this.pendingRequests.delete(requestId);\n          reject(new Error(`Native storage operation timed out (requestId: ${requestId})`));\n        }\n      }, timeoutMs);\n\n      this.pendingRequests.set(requestId, { resolve, reject, timeout });\n    });\n  }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getApplicativeMonoid = getApplicativeMonoid;\nexports.getApplicativeComposition = getApplicativeComposition;\n/**\n * The `Applicative` type class extends the `Apply` type class with a `of` function, which can be used to create values\n * of type `f a` from values of type `a`.\n *\n * Where `Apply` provides the ability to lift functions of two or more arguments to functions whose arguments are\n * wrapped using `f`, and `Functor` provides the ability to lift functions of one argument, `pure` can be seen as the\n * function which lifts functions of _zero_ arguments. That is, `Applicative` functors support a lifting operation for\n * any number of function arguments.\n *\n * Instances must satisfy the following laws in addition to the `Apply` laws:\n *\n * 1. Identity: `A.ap(A.of(a => a), fa) <-> fa`\n * 2. Homomorphism: `A.ap(A.of(ab), A.of(a)) <-> A.of(ab(a))`\n * 3. Interchange: `A.ap(fab, A.of(a)) <-> A.ap(A.of(ab => ab(a)), fab)`\n *\n * Note. `Functor`'s `map` can be derived: `A.map(x, f) = A.ap(A.of(f), x)`\n *\n * @since 2.0.0\n */\nvar Apply_1 = require(\"./Apply\");\nvar function_1 = require(\"./function\");\nvar Functor_1 = require(\"./Functor\");\nfunction getApplicativeMonoid(F) {\n    var f = (0, Apply_1.getApplySemigroup)(F);\n    return function (M) { return ({\n        concat: f(M).concat,\n        empty: F.of(M.empty)\n    }); };\n}\n/** @deprecated */\nfunction getApplicativeComposition(F, G) {\n    var map = (0, Functor_1.getFunctorComposition)(F, G).map;\n    var _ap = (0, Apply_1.ap)(F, G);\n    return {\n        map: map,\n        of: function (a) { return F.of(G.of(a)); },\n        ap: function (fgab, fga) { return (0, function_1.pipe)(fgab, _ap(fga)); }\n    };\n}\n","import { ComponentChildren, JSX, RefObject } from \"preact\";\nimport { useRef, useEffect, useState } from \"preact/hooks\";\nimport { IconCloseCircleOutline } from \"./icons/iconCloseCircleOutline\";\nimport { createPortal } from \"preact/compat\";\nimport { useDialogFocus } from \"../hooks/useDialogFocus\";\n\ninterface IProps {\n  name?: string;\n  children: ComponentChildren;\n  autofocusInputRef?: RefObject<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>;\n  preautofocus?: [RefObject<HTMLElement>, (el: HTMLElement) => void][];\n  isHidden?: boolean;\n  isFullWidth?: boolean;\n  isFullHeight?: boolean;\n  noPaddings?: boolean;\n  shouldShowClose?: boolean;\n  // Replaces the close icon. The button shows without `shouldShowClose`. Escape calls `onClose`, as the icon does.\n  closeIcon?: JSX.Element;\n  // The `aria-label` of the close button. The default is \"Close\".\n  closeLabel?: string;\n  // A tap on the overlay does nothing.\n  isOutsideTapDisabled?: boolean;\n  overflowHidden?: boolean;\n  innerClassName?: string;\n  zIndex?: number;\n  maxWidth?: string;\n  style?: Record<string, string | undefined>;\n  onClose?: () => void;\n}\n\nexport function Modal(props: IProps): JSX.Element {\n  const modalRef = useRef<HTMLElement>(null);\n  const dialogRef = useRef<HTMLDivElement>(null);\n  const [isMounted, setIsMounted] = useState(false);\n  const hasClose = !!props.shouldShowClose || props.closeIcon != null;\n  useDialogFocus(dialogRef, isMounted && !props.isHidden, hasClose ? props.onClose : undefined);\n\n  let className = \"fixed inset-0 flex items-center justify-center bottom-sticked\";\n  if (props.isHidden) {\n    className += \" invisible\";\n  }\n\n  const prevProps = useRef<IProps>(props);\n  useEffect(() => {\n    prevProps.current = props;\n  });\n\n  useEffect(() => {\n    setIsMounted(true);\n  }, []);\n\n  useEffect(() => {\n    if (typeof document !== \"undefined\") {\n      if (!props.isHidden) {\n        document.body.classList.add(\"stop-scrolling-modal\");\n      } else {\n        document.body.classList.remove(\"stop-scrolling-modal\");\n      }\n      return () => {\n        document.body.classList.remove(\"stop-scrolling-modal\");\n      };\n    }\n    return undefined;\n  }, [props.isHidden]);\n\n  if (modalRef.current != null && prevProps.current.isHidden && !props.isHidden) {\n    for (const [ref, callback] of props.preautofocus ?? []) {\n      if (ref.current != null) {\n        callback(ref.current);\n      }\n    }\n    if (props.autofocusInputRef?.current != null) {\n      modalRef.current.classList.remove(\"invisible\");\n      props.autofocusInputRef.current.focus();\n    }\n  }\n\n  if (typeof document === \"undefined\" || !isMounted) {\n    return null as unknown as JSX.Element;\n  }\n\n  return createPortal(\n    <section ref={modalRef} className={className} style={{ zIndex: props.zIndex ?? 40 }}>\n      <div\n        data-name=\"overlay\"\n        onClick={hasClose && !props.isOutsideTapDisabled ? props.onClose : undefined}\n        className=\"absolute inset-0 z-10 overflow-scroll scrolling-touch opacity-50 bg-background-darkgray\"\n      ></div>\n      <div\n        ref={dialogRef}\n        role=\"dialog\"\n        aria-modal=\"true\"\n        tabIndex={-1}\n        data-name=\"modal\"\n        data-cy={`modal${props.name ? `-${props.name}` : \"\"}`}\n        className={`relative z-20 flex flex-col focus:outline-none ${props.noPaddings ? \"\" : \"py-6\"} bg-background-default rounded-lg shadow-lg text-text-primary`}\n        style={{\n          maxWidth: props.maxWidth ?? \"92%\",\n          maxHeight: \"90%\",\n          width: props.isFullWidth ? \"92%\" : \"auto\",\n          height: props.isFullHeight ? \"90%\" : \"auto\",\n          ...props.style,\n        }}\n      >\n        <div\n          className={`relative h-full ${props.noPaddings ? \"\" : \"px-6\"} ${\n            props.overflowHidden ? \"overflow-hidden\" : \"overflow-auto\"\n          } ${props.innerClassName}`}\n        >\n          {props.children}\n        </div>\n        {hasClose && (\n          <button\n            data-cy={`modal-close${props.name ? `-${props.name}` : \"\"}`}\n            onClick={props.onClose}\n            aria-label={props.closeLabel ?? \"Close\"}\n            className=\"absolute p-2 rounded-full tap-target nm-modal-close focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-button-primarybackground\"\n            style={{ top: \"-3px\", right: \"-3px\" }}\n          >\n            {props.closeIcon ?? <IconCloseCircleOutline />}\n          </button>\n        )}\n      </div>\n    </section>,\n    document.getElementById(\"modal\")!\n  ) as unknown as JSX.Element;\n}\n","import { SendMessage } from \"./sendMessage\";\n\nexport namespace Exporter {\n  export function toFile(filename: string, contents: string): void {\n    if (\n      !SendMessage.toAndroid({ type: \"export\", filename, contents }) &&\n      !SendMessage.toIos({ type: \"export\", filename, contents })\n    ) {\n      const blob = new Blob([contents], { type: \"text/plain\" });\n      const objectUrl = URL.createObjectURL(blob);\n      const a = document.createElement(\"a\");\n      a.href = objectUrl;\n      a.setAttribute(\"download\", filename);\n      document.body.appendChild(a);\n      a.click();\n      document.body.removeChild(a);\n    }\n  }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { IMainContentProps, MainContent } from \"./pages/main/mainContent\";\nimport { HydrateUtils } from \"./utils/hydrate\";\n\nfunction main(): void {\n  HydrateUtils.hydratePage<IMainContentProps>((pageWrapperProps, data) => (\n    <MainContent {...data} client={window.fetch.bind(window)} />\n  ));\n}\n\nmain();\n"],"names":["__spreadArray","this","to","from","pack","arguments","length","ar","i","l","Array","prototype","slice","call","concat","Object","defineProperty","exports","value","flatMapReader","flatMapTask","flatMapIO","flatMapEither","flatMapOption","flatMapNullable","liftOption","liftNullable","fromReadonlyNonEmptyArray","has","emptyRecord","emptyReadonlyArray","tail","head","isNonEmpty","singleton","right","left","isRight","isLeft","some","none","isSome","isNone","function_1","__webpack_require__","fa","_tag","a","ma","e","as","hasOwnProperty","F","f","onNullable","_i","o","apply","fromEither","onNone","M","dual","self","flatMap","fromIO","fromTask","fromReader","Either_1","types_1","syncUnits_1","ProgressionSnapshot","exerciseKey","entry","id","equipment","exercise","sortKeys","isArray","map","source","keys","sort","reduce","memo","key","hash","planner","nextDay","rm1","input","SyncUnits","normalizePlanner","text","h1","h2","code","charCodeAt","Math","imul","toString","cyrb53","JSON","stringify","rm1Of","exerciseData","_b","_a","sameWeight","b","unit","rm1Map","make","before","after","entries","changedKeys","Set","filter","afterHash","validate","snapshot","record","TProgressionSnapshot","decode","ok","reason","decoded","every","beforeMatches","normalize","rollbackDecision","program","programId","rollback","progressionSnapshot","historyRecordId","remap","old","oldExerciseData","newExerciseData","latestRecordId","mapRm1","result","assign","updateStateVariable","object_1","exercise_1","weight_1","EditProgramLenses","state","stateKey","newValue","v","parseFloat","isNaN","newState","Weight","is","build","isPct","buildPct","editStateVariable","prefix","pi","p","recordModify","removeStateVariableMetadata","changeExercise","settings","oldExerciseType","newExerciseType","oldExercise","Exercise","get","exercises","oldState","weight","units","startingWeightKg","startingWeightLb","oldName","replace","name","properlyUpdateStateVariable","values","ObjectUtils","groupDisplaySets","displaySets","collection_1","CollectionUtils","groupBy","last","set","isSameDisplaySet","HistoryRecordSetsView","props","sets","isNext","displayGroups","set_1","Reps","group","g","setToDisplaySet","isBlockSet","jsx_runtime_1","jsx","className","children","HistoryRecordSet","prs","showPrDetails","time_1","reps","rpe","askWeight","timer","setTimer","isOverflowSetTimer","prTypes","compact","k","prset","displayPrSet","undefined","isPr","repsColor","isCompleted","isInRange","rpeColor","isRpeFailed","timerColor","jsxs","join","Fragment","completedSetTimer","TimeUtils","formatMMSS","preact_1","HydrateUtils","hydratePage","cb","escapedRawData","document","querySelector","innerHTML","escapedPageWrapperProps","parser","DOMParser","unescapedRawData","parseFromString","documentElement","textContent","unescapedPageWrapperProps","data","parse","pageWrapperProps","hydrate","client","window","fetch","bind","getElementById","block_1","BlockLogging","DEFAULT","PROMOTE_DEFAULT","REPS_VALUES","ALL_REPS_VALUES","SINGLE_REPS_VALUES","repsValuesFor","isSingle","withRpe","logging","normalizeForSheet","evaluateArgs","args","rpeSeen","repsSeen","index","arg","type","success","problem","message","includes","serialize","push","describe","parts","getQuestions","ref","customExercises","entryIndex","block","logRpe","exerciseName","entryId","doneIndexes","ask","kind","setIndex","current","completedReps","currentLeft","completedRepsLeft","isUnilateral","first","getSingleQuestions","members","Block","getBlockMembers","m","_c","_d","PathReporter","failure","_1","getMessage","getFunctionName","isFinite","context","es","report","fold","selectInputOnFocus","compat_1","generator_1","string_1","target","HTMLInputElement","handleNumber","setSelectionRange","err","inputClassName","InputInner","forwardRef","inputSize","label","changeHandler","errorMessage","patternMessage","requiredMessage","otherProps","__rest","changeType","identifier","StringUtils","dashcase","UidFactory","generateUid","toLowerCase","validationErrors","setValidationErrors","useState","size","uid","labelId","errorId","onInputHandler","useCallback","errors","validity","patternMismatch","add","valueMissing","error","errorMessages","containerClassName","indexOf","labelSize","a11yProps","isLabelOutside","style","minHeight","marginTop","marginBottom","top","multiline","onBlur","onInput","onFocus","fontSize","height","Input","displayName","lr_1","spec_Keyword","__proto__","auto","LRParser","deserialize","version","states","stateData","goto","nodeNames","maxTerm","skippedNodes","repeatNodeCount","tokenData","tokenizers","topRules","Program","specialized","term","tokenPrec","url_1","migrations_1","Service","constructor","trainerApiUrl","path","startsWith","getAllHistoryRecords","historyResponse","history","alreadyFetchedHistory","historyLimit","getHistory","limit","uniqBy","url","UrlUtils","searchParams","response","credentials","json","dateOfBirthResult","fallback","errorBody","Error","dateOfBirth","postCheckIn","answer","method","body","status","getMessages","since","query","getMessagesUnread","postMessage","deleteMessage","encodeURIComponent","postMessagesSeen","getTrainerMessages","clientId","getTrainerCurrentClients","currentClients","getTrainerInbox","getTrainerInboxUnread","postTrainerMessage","headers","deleteTrainerMessage","postTrainerMessagesSeen","getDateOfBirth","updateDateOfBirth","changePassword","currentPassword","newPassword","requestEmailChange","newEmail","confirmEmailChange","token","email","validateInvite","inviteToken","invite_token","claimInvite","errorText","finishInvite","password","termsAccepted","nickname","user_id","is_new_user","emailSignIn","historylimit","requestMagicLink","verifyMagicLink","needsFinish","requestPasswordReset","validateResetToken","resetPassword","signout","trainerEmailRegister","trainerEmailSignIn","trainerRequestMagicLink","trainerVerifyMagicLink","trainerRequestPasswordReset","trainerResetPassword","trainerSignout","trainerGetPrograms","programs","isDraft","trainerSendInvite","email_1","details","trainerUpdateInvite","changes","trainerResendInvite","trainerDeleteInvite","trainerDeleteProgram","trainerSaveProgram","trainerSaveProgramDraft","trainerPublishProgram","programId_1","force","trainerDiscardProgramDraft","trainerSaveClientDraft","trainerDiscardClientDraft","draftId","trainerUpsertExercise","trainerDeleteExercise","exerciseId","trainerGetGlossary","glossary","trainerPutGlossaryTerm","termKey","definition","catch","trainerDeleteGlossaryTerm","trainerGetExerciseDescriptions","trainerPutExerciseDescription","description","trainerDeleteExerciseDescription","trainerGetExerciseTags","tags","trainerPutExerciseTags","getProgramRevisions","getProgramRevision","revision","postSync3","request","signal","getSnapshot","getLatestMigrationVersion","getTrainerTexts","String","texts","postDebug","meta","postAddFreeUser","userid","adminKey","getStorage","userId","storageId","storage","postEvent","event","location","href","postGoalEvents","events","getUploadedImages","images","postImageUploadUrl","fileName","contentType","deleteAccount","publishProgram","getMuscles","streamAiLiftoscriptProgram","__await","statusText","reader","getReader","decoder","TextDecoder","buffer","done","read","stream","lines","split","pop","line","trim","console","progress_1","workoutLock_1","RecordLock","isLocked","time","Progress","isCurrent","notSynced","snapshotRecord","WorkoutLock","highlight_1","PlannerNodeName","plannerExerciseStyles","SetPart","atom","WarmupSetPart","Rpe","number","Timer","keyword","SetTimer","Auto","Percentage","LineComment","lineComment","TripleLineComment","blockComment","SupersetKeyword","SectionSeparator","ExercisePropertyName","FunctionName","attributeName","FunctionArgument","attributeValue","None","Week","annotation","WeekProperty","Day","docComment","WeekDay","Repeat","t","n","r","test","u","c","__k","__","__b","__e","__c","__v","__i","__u","__source","__self","defaultProps","preact__WEBPACK_IMPORTED_MODULE_0__","options","vnode","tpl","exprs","attr","valueOf","s","exerciseImage_1","programExercise_1","math_1","sendMessage_1","LiveActivityManager","getLiveActivityEntry","progress","programExercise","allSets","warmupSets","isNextSetWarmup","plates","calculatePlates","exerciseImageUrl","ExerciseImageUtils","hasUserPromptedVars","ProgramExercise","canCompleteFromLiveActivity","shouldShowAmrapModal","currentReps","getIsUnilateral","_e","currentWeight","_f","completedWeight","fullName","currentSet","totalSets","completedSets","setsStatus","isWarmup","targetReps","isAmrap","targetWeight","print","targetRPE","targetTimer","formatOneSide","updateLiveActivity","restTimer","restTimerSince","liveActivityEntry","attributes","workoutStartTimestamp","startTime","historyEntryState","timerSince","ignoreDoNotDisturb","SendMessage","toIosAndAndroid","updateLiveActivityForNextEntry","mode","currentEntry","nextEntry","getNextEntry","nextEntryIndex","nextSetIndex","findNextSetIndex","MainContent","setErrorMessage","hooks_1","useEffect","errorType","URLSearchParams","search","maxWidth","topNavMenu_1","TopNavMenu","account","appUrl","isTrainer","trainerEmail","onClick","URL","delete","replaceState","About","ExistingClients","footerPage_1","FooterPage","withoutBg","withAcknowledgement","EmailLoginForm","setEmail","initialEmail","setPassword","isLoading","setIsLoading","setError","notice","iconSpinner_1","IconSpinner","width","onSubmit","__awaiter","preventDefault","onLogin","input_1","required","placeholder","button_1","Button","disabled","onForgotPassword","onSendMagicLink","buttonSize","onBack","formatHHMM","ms","minutes","floor","hours","pad","formatHOrMin","formatHH","formatMM","formatSS","seconds","formatUTCHHMM","date","Date","getUTCHours","getUTCMinutes","identity","constant","flow","ab","bc","cd","de","ef","fg","gh","hi","ij","absurd","_","getEndomorphismMonoid","SK","hole","constVoid","constUndefined","constNull","constFalse","constTrue","unsafeCoerce","getRing","getSemiring","getMonoid","getSemigroup","getBooleanAlgebra","flip","tuple","increment","decrement","tupled","untupled","pipe","ret","not","predicate","B","meet","x","y","zero","one","implies","S","getSemigroupM","empty","mul","R","sub","second","arity","isDataFirst","program_1","programSet_1","parser_1","plannerProgramExercise_1","pp_1","warmupSetToKey","minReps","threshold","printOrNumber","operation","op","loggedWeight","onerm","exerciseType","oldValue","ProgramSet","isEligibleForInferredWeight","getEvaluatedWeight","applyOp","stateMetadata","PlannerProgramExercise","getStateMetadata","userPrompted","getQuickAddSets","repRange","isQuickAddSet","getEnableRpe","groupWarmupsSets","lastKey","groups","approxTimeMs","currentEvaluatedSetVariation","doesUse1RM","usesPercentageWeights","evaluatedSetVariations","usesRM1Var","isUsingVariable","getProgressScript","getUpdateScript","ScriptRunner","hasKeyword","weightChanges","programExerciseKey","results","PP","iterate2","weeks","currentVariationIndex","currentEvaluatedSetVariationIndex","variationIndex","variation","originalWeight","sortBy","applyVariables","updates","loggedWeights","firstLoggedWeight","find","w","update","week","day","dayIndex","weekIndex","programWeek","dayInWeekIndex","days","programDay","dayExercises","getProgramDayExercises","MathUtils","defaultSet","maxrep","lastSet","splice","clone","indexValue","currentSetVariationIndex","forEach","sv","currentDescriptionIndex","descriptions","d","IconUser","color","tailwindConfig_1","Tailwind","semantic","icon","neutral","viewBox","fill","xmlns","E","C","preact_hooks__WEBPACK_IMPORTED_MODULE_1__","useLayoutEffect","I","N","shouldComponentUpdate","createElement","isReactComponent","__f","Component","isPureReactComponent","T","A","Symbol","for","D","$$typeof","render","L","toChildArray","O","count","only","toArray","U","then","unmount","V","__H","__P","W","appendChild","P","j","__a","z","default","__z","__R","__O","setState","forceUpdate","componentWillUnmount","H","revealOrder","Z","getChildContext","Y","h","__m","nodeType","parentNode","childNodes","contains","namespaceURI","insertBefore","removeChild","$","containerInfo","Map","reverse","componentDidUpdate","componentDidMount","q","G","J","K","Q","X","nn","tn","configurable","writable","en","rn","un","cancelBubble","on","defaultPrevented","persist","isPropagationStopped","isDefaultPrevented","nativeEvent","ln","cn","enumerable","class","fn","multiple","selected","defaultValue","an","__r","sn","diffed","hn","ReactCurrentDispatcher","readContext","__n","useContext","useDebugValue","useDeferredValue","useId","useImperativeHandle","useInsertionEffect","useMemo","useReducer","useRef","useSyncExternalStore","useTransition","vn","dn","mn","pn","yn","_n","cloneElement","bn","Sn","base","gn","En","Cn","Rn","xn","startTransition","Children","unmountComponentAtNode","createPortal","createContext","createFactory","createRef","isValidElement","isElement","isFragment","isMemo","findDOMNode","PureComponent","flushSync","unstable_batchedUpdates","StrictMode","Suspense","SuspenseList","lazy","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","tap","chain","chainFirst","tapM","IconHamburger","IconArrowRight","stroke","IconCloseCircleOutline","bgColor","background","subtle","rx","ForgotPasswordForm","successMessage","setSuccessMessage","onSendResetLink","onBackToLogin","micro_memoize_1","__importDefault","equipment_1","plannerExerciseEvaluator_1","PlannerKey","fromPlannerExercise","plannerExercise","fromExerciseType","fromFullName","Equipment","currentEquipment","toKey","allEquipment","PlannerExerciseEvaluator","extractNameParts","fromLabelNameAndEquipment","maxSize","findByNameEquipment","iter","tar","dequal","foo","bar","ctor","len","tmp","getTime","RegExp","ArrayBuffer","Uint8Array","DataView","byteLength","getInt8","isView","TrainerLoginEmail","defaultFor","host","service_1","lens_shmens_1","state_1","sync_1","importexporter_1","storage_1","history_1","csv_1","exporter_1","date_1","reducer_1","indexeddb_1","screen_1","log_1","posthog_1","errorReporter_1","plannerProgram_1","editProgram_1","liveActivityManager_1","recordLock_1","trainerTextsCache_1","NoRetryError","noretry","Thunk","load","dispatch","Promise","resolve","reject","_load","attempt","updateState","lb","now","ErrorReporter","setTimeout","handleLogin","getState","env","oldUserId","service","postevent","Storage","getDefault","storageResult","local","old_userid","new_userid","log","getInitialState","user","loadSnapshot","fetchInitial","isNowLocked","getProgress","action","extra","lg","updatePhoneSync","next","isConverted","heldBases","removedAt","phoneSyncState","page","aborted","alertOutdatedStorage","serverRev","syncEpoch","full","Sync","applySnapshot","lastSyncedStorage","applyConversion","markNotSynced","unitKeys","unitKey","handleSync3Error","alert","runSync3","sentKeys","maxChanges","Infinity","isCarrierDropped","snapshotLoads","isFirst","localChanges","lastRev","applyResponse","invalidNewWorkouts","decisions","change","bytes","changeBytes","notSyncedBytes","sync2","isProcessing","queue","getIsProcessing","queueLength","corruptedstorage","nosync","enqueue","args2","getProgramExerciseForEntry","getFullProgram","evaluatedProgram","evaluate","getProgramExercise","programExerciseId","otherStates","runFromFirstNotDone","steps","getSteps","firstIndex","firstNotDoneStep","firstStep","startRunWorkStep","blockRun","startedAt","isPaused","pausedAt","cleanup","progresses","stop","editHistoryRecord","historyRecord","WorkoutLockText","locked","saveWorkout","nowLocked","deleteWorkout","onError","onNeedsFinish","LogUtils","referrer","logOut","TrainerTextsCache","clearAll","content","resetCorruptedStorage","saveLocalStorage","getProgram","completeSetExternal","adjustedSetIndex","isPlayground","forceUpdateEntryIndex","isExternal","autoAdvanceSet","shouldAutoAdvance","timestamp","aProgress","timerMode","startBlock","started","restartBlock","blockName","superset","completedRpe","confirm","cleared","resetBlock","nextBlock","setTimerSince","setTimerEntryIndex","setTimerSetIndex","max","round","stepElapsedMs","skipBlock","keepPaused","skipWorkStep","backBlock","backStep","skipRest","timerEntryIndex","timerSetIndex","skipRunRest","redoSet","step","runEntryIndex","clearTimerSet","reconcileBlock","initialState","initialProgress","maxIterations","iteration","nextDueEvent","at","newProgress","endBlockRun","openLog","shouldOpenRunLog","cancelBlock","stopBlock","setInAppTimers","isOn","updateSettings","pauseBlock","sendNativeStopTimer","resumeBlock","timeLeft","sendNativeTimer","playAudioNotification","isMuted","vibration","isIosOrAndroid","audio","play","volume","fetchStorage","userIdFromUrl","pushToEditProgram","dayData","currentProgram","currentProgramId","isEmpty","pushScreen","editAction","startProgramDay","nextHistoryRecord","stats","pushToEditProgramExercise","programScreen","screenStack","params","plannerState","EditProgram","initPlannerProgramExerciseState","screen","shouldResetStack","confirmation","Screen","shouldConfirmNavigation","isAllowedWithoutProgram","scroll","updateScreenParams","stack","updateParams","maybeRequestReview","reviewRequests","lastReviewRequest","toIos","toAndroid","pullScreen","author","newProgram","descriptionFormat","fetchPrograms","lensRecording","desc","exportStorage","ImportExporter","exportProgramToFile","exportHistoryToCSV","csv","CSV","History","exportAsCSV","Exporter","toFile","DateUtils","formatYYYYMMDD","exportProgramsToText","PlannerProgram","generateFullText","createAccount","IndexedDBUtils","remove","deleteAccountRemote","switchAccount","rawStorage","prebuiltWeights","str","match","roundFloat","prebuiltWeight","roundTo005","totalWeight","convertTo","comparison","display","withUnit","toFixed","rpePct","rpeMultiplier","evaluateWeight","multiply","getUnitOrDefaultForExerciseType","smartConvert","toUnit","oppositeUnit","printNull","parsePct","buildAny","isOrPct","object","objWeight","equipmentData","getEquipmentDataForExerciseType","roundWeight","isFixed","items","fixed","compare","item","gt","smallestPlate","multiplier","newWeight","rounded","eq","rounding","defaultRounding","compareReverse","lt","subtracted","subtract","getOneRepMax","divide","getNRepMax","oneRepMax","getTrainingMax","platesWeight","plate","num","platesArr","equipmentSettings","arr","compressArray","roundTo000005","allWeight","absAllWeight","abs","inverted","roundedWeight","lte","invert","availablePlatesArr","barWeight","useBodyweightForBar","currentBodyweight","isAssisting","availablePlates","total","availablePlate","potentialPlate","multipliedWeight","weightToCompare","gte","calculatePlatesInternalFast","weightToAdd","eqNull","eqeq","weights","roundConvertTo","opr","aWeight","bWeight","convertToWeight","calculateRepMax","knownReps","knownRpe","knownWeight","targetRpe","targetRpeMultiplier","min","tailwind_colors_json_1","tailwind_semantic_generated_json_1","colors","theme","classList","customExerciseVariation_1","availableSmallImages","availableLargeImages","exists","customImages","customExercise","CustomExerciseVariation","existsCustom","smallImageUrl","largeImageUrl","parseWeekHeading","fullTextLineToWeekdayDescription","splitWeekDayOngoingLines","plannerExerciseStyles_1","weekLoopMarker","rawHeading","heading","loop","ongoingLines","firstCommentIndex","findIndex","headEnd","blockStart","noteIndexes","noteLines","anyCommentStarted","commentStarted","linesToPreviousExercise","nextLines","PlannerExerciseEvaluatorText","script","getValue","node","getWeekDayDescriptionAndFillLastDay","notes","trimEnd","lastDay","getLastDay","unshift","lastWeek","evaluateLine","expr","hasLoop","dayName","EmptyExpression","ExerciseExpression","child","cur","cursor","firstChild","nextSibling","getChildren","rest","flap","fab","bindTo","getFunctorComposition","_map","fga","asUnit","asM","ga","plannerEvaluator_1","plannerKey_1","programToPlanner_1","EditProgramUiHelpers","changeFirstInstance","shouldValidate","create","aKey","ProgramToPlanner","convertToPlanner","changeLabel","modalExerciseUi","onProgramChange","onUiChange","newKey","changeAllInstances","changeCurrentInstance3","newModalExercise","newFullName","changeCurrentInstanceExercise","changeCurrentInstance2","onDaysChange","plannerDispatch","ui","lbUi","collapsedOrder","dayUi","collapsed","newCollapsed","changeSets","daySets","exerciseIndex","daySet","dayInWeek","setVariationIndex","setVariation","isRepeat","getWeeks2","getErrorMessages","evaluatedWeeks","PlannerEvaluator","messages","setSuperset","disableSuperset","unchanged","applied","newPlanner","clearSuperset","added","oldPlanner","getFirstError","ignoreRepeats","repeating","duplicateCurrentInstance","targetDay","previousExercise","newExercise","shortName","notused","changeRepeating","repeatTo","repeatingExercise","newRepeating","repeat","deleteCurrentInstance","allowDeleteEverywhere","newEvaluatedProgram","getFirstProgramExercise","addInstance","order","setVariations","numberOfSets","globals","points","offset","changeCurrentInstancePosition","fromIndex","toIndex","reorder","getChangedKeys","oldEvaluatedWeeks","newEvaluatedWeeks","oldWeek","newWeek","oldDay","newDay","liftoscript_1","NodeName","LiftoscriptSyntaxError","SyntaxError","super","comparing","operator","comparator","assert","LiftoscriptEvaluator","bindings","fns","fnContext","vars","getValueRaw","getLineAndOffset","isAssignmentTarget","parent","AssignmentExpression","IncAssignmentExpression","linesLengths","lineLength","Keyword","getWeight","WeightExpression","numberNode","getChild","NumberExpression","unitNode","Unit","switchWeightsToUnit","programNode","shift","oldWeightStr","newWeightStr","substring","getStateVariableKeys","stateKeys","StateVariable","getStateKey","StateVariableIndex","stateKeyNode","isError","BuiltinFunctionExpression","fnArgs","ForExpression","variableNode","Variable","VariableExpression","nameNode","indexExprs","VariableIndex","variableKey","indexExpr","changeWeightsToCompleteWeights","oldScript","keywordNode","evaluateToNumber","v1","evaluateToNumberOrWeightOrPercentage","changeNumberOfSets","expression","oldNumberOfSets","evaluatedValue","originalWeights","RPE","mr","timers","setTimers","completedSetTimers","amraps","logrpes","askweights","cr","cw","completedWeights","completedRPE","ns","_g","recordLevelUpdate","opNode","Number","isInteger","changeBinding","indexes","ie","indexValues","calculateIndexValues","normalizedIndexValues","normalizeTarget","evalutedValue","clamp","recordVariableUpdate","maxTargetLength","descriptionIndex","Wildcard","newTarget","toNumber","BlockExpression","isSkipped","BinaryExpression","evalLeft","evalRight","modulo","plusNode","Plus","Ternary","condition","or","forInExpression","ForInExpression","blockNode","forIn","varKey","IfExpression","parenthesisNodes","ParenthesisExpression","blockNodes","parenthesisNode","lastBlock","indexNode","indexEval","variable","stateVar","incAssignmentExpr","currentValue","argValues","UnaryExpression","Current","binding","two","keyPrefix","localStorage","keysOf","isTexts","trainerId","memory","parsed","getItem","write","other","removeItem","TextEncoder","encode","setItem","removeError","clearOthers","runner_1","isHistory","hasEvent","withoutCarrier","_carrier","hasCarrier","isLocalChange","isSentByPhone","revs","changedFields","PhoneUnits","isStorageChanged","toUnits","take","setSnapshot","rev","applyServer","rebuild","fromUnits","originalId","_versions","utf8Bytes","withoutCarrierChange","companions","ordered","inPage","records","fitsGroup","groupRecords","groupItems","sum","groupBytes","single","sent","decision","rule","phone","sentByKey","tombstone","hasTombstone","isAsSent","baseRev","baseValue","converted","isUnsynced","original","newWorkouts","ownership","migrateSnapshot","migrate","runMigrations","heldKeys","baseValues","migratedBases","migratedHeld","hasRev","updatedAt","inSnapshot","isAssessmentResult","held","deepMerge","mergeInternal","blockedMergeKeys","isPlainObject","proto","getPrototypeOf","cloneValue","copy","sourceValue","targetValue","StateError","Account","removeQueryParam","useEmailChangeConfirm","minWidth","EmailChangeConfirmView","hasSession","AccountLoggedInView","TrainerLoggedInView","AccountLoggedOutView","redirectUrl","iconDoc_1","iconDumbbell_1","thunks_1","emailLoginForm_1","emailRegisterForm_1","magicLinkForm_1","forgotPasswordForm_1","resetPasswordForm_1","trainerEmailLoginForm_1","trainerDefaultEmail","currentUrl","pathname","numberOfPrograms","IconDoc","numberOfWorkouts","IconDumbbell","reload","setMode","prefillEmail","setPrefillEmail","resetToken","setResetToken","trainerResetToken","setTrainerResetToken","setInviteToken","invitedEmail","setInvitedEmail","invitedNickname","setInvitedNickname","alreadyRegistered","setAlreadyRegistered","pendingFinishEmail","setPendingFinishEmail","isMountedRef","urlParams","handleResetTokenValidation","magicLinkToken","handleMagicLinkVerification","trainerResetTokenParam","handleTrainerResetToken","inviteTokenParam","invitedEmailParam","handleInviteValidation","valid","showPendingFinish","EmailRegisterForm","showTerms","isClaimed","onClaim","onRegister","onSignIn","MagicLinkForm","onPasswordLogin","ResetPasswordForm","onResetPassword","onSuccess","TrainerEmailLoginForm","isTrainerLogin","tokenValue","boxShadow","pyramid_1","blockLogging_1","getCurrentDescriptionExercise","getCurrentDescriptionIndex","shouldReuseSets","reuse","getDereuseDecisions","dereuseDecisions","reuseExercise","getGlobals","reusedGlobals","getOnlyChangedState","programVariation","reuseVariation","programSet","reuseSet","minrep","reorderGroupedTopLine","groupedTopLine","reorders","groupedDay","indexMap","addGroupedTopLine","adds","getRenamedValue","opts","renamedValue","renameMapping","addExerciseDescriptions","addedCurrentDescription","isEqual","currentIndex","part","reusedExercise","reusedDayData","plannerWeeks","plannerProgram","msg","topLineMap","topLineItems","groupedTopLineMap","groupedTopLines","addedProgressMap","addedUpdateMap","addedWarmupsMap","addedIdMap","plannerWeek","plannerDay","exerciseText","finishedToAddDescription","groupTextArr","groupLoop","groupIndex","exerciseTextArr","lineIndex","evalExercise","getExerciseName","variations","reuseToStr","variationToString","overriddenGlobals","weightExprToStr","pyramid","Pyramid","matches","pyramidToStr","globalsStr","globalSetTimerToStr","getWarmupSets","getId","updateStr","getUpdate","progressStr","vtype","repeatingExercises","hideScript","onlyChangedState","successes","successCounter","failures","failureCounter","maxReps","setTimerRest","getGlobalSetTimer","firstWeight","_j","_h","firstRpe","_l","_k","firstLogRpe","_o","_m","firstAskWeight","_q","_p","firstTimer","_s","_r","hasAnySetTimer","groupVariationSets","originalSets","setToKey","strs","percentage","weightExpr","groupedVariationSets","setStr","weightValue","isAuto","resultStr","getSingleEntryIndex","singleIndex","durationSeconds","isOverflow","workout","afterEntryIndex","afterSetIndex","getSingleSteps","roundsCount","roundIndex","resolveBreakDuration","isStepSetDone","nextStep","passedOver","isBlockMember","remaining","confirmText","sibling","getNextRunTarget","getCurrentStep","getSummary","rounds","stations","workDurations","work","firstBreak","restSeconds","totalSeconds","getWorkoutPages","entryIndexes","pages","emittedBlocks","memberIndexes","pageToEntryIndex","entryIndexToPage","__createBinding","k2","getOwnPropertyDescriptor","__esModule","__setModuleDefault","__importStar","mod","fromOption","fromPredicate","onFalse","fromOptionK","chainOptionK","fromOptionKF","fromEitherK","chainEitherK","fromEitherKF","chainFirstEitherK","tapEitherM","tapEither","filterOrElse","Chain_1","fromOptionF","plannerExerciseParser_1","plannerExerciseEvaluatorText_1","liftoscriptEvaluator_1","PlannerSyntaxError","fromPoint","point","latestDescriptions","getValueTrim","applyChangesToScript","ranges","replacement","isEqualProperty","fnName","isEqualProgress","pickA","pick","pickB","isEqualUpdate","getPoint","checkNoTimerArguments","argNodes","argNode","timerNode","KeyValue","checkNoKeywordArguments","bareKeywordNode","keyValueNode","keyValueValueKeywordNode","keyValueValueNoneNode","getWarmupReps","setParts","numberOfSetsStr","repsStr","minRepsStr","maxRepsStr","parseInt","getRepRange","repRangeStr","reprange","minrepStr","maxrepStr","endsWith","WeightWithPlus","evaluateWarmupSet","WarmupExerciseSet","setPartNode","percentageNode","weightNode","ExerciseSection","fnArgsToStateVars","fnArgKey","fnArgValStr","fnArgVal","evaluateSet","ExerciseSet","rpeNode","setTimerNode","PercentageWithPlus","labelNode","SetLabel","workPart","restPart","evaluateId","ExerciseProperty","valueNode","FunctionExpression","fnNameNode","fnArgNodes","evaluateUpdate","liftoscriptNode","Liftoscript","reuseLiftoscriptNode","ReuseLiftoscript","ReuseSection","ExerciseName","createEmptyScriptBindings","createScriptFunctions","prints","validateProgress","evaluateProgress","evaluateProgressImpl","buildProgress","liftoscriptEvaluator","reuseFullname","evaluateWarmup","setsNode","WarmupExerciseSets","evaluateSuperset","Superset","exerciseNameNode","evaluateBlock","keywordNodes","keyNode","valueNode2","evaluatePyramid","argNodesByKey","rawKey","spec","problems","argument","evaluateProperty","getReuseWeekDay","weekDayNode","WeekOrDay","Int","evaluateReuseNode","ReuseSectionWithWeekDay","evaluateSection","reuseNode","ExerciseSets","CurrentVariation","property","addDescription","getOrder","repeatNode","childNode","Rep","getRepeat","RepRange","getRepeatRanges","numbers","rangeStart","rangeEnd","getIsNotUsed","sections","section","properties","takeWeekDayDescription","evaluateExercise","shortNameFromFullName","findByNameAndEquipment","sectionNodes","allWarmupSets","pyramidSectionNode","secondPyramidSectionNode","explicitSetsSectionNode","restTimerSectionNode","sectionNode","expand","globalSetTimerSet","rawDescriptions","fullNamePoint","reuseSetsNode","reuseSetPoint","progressNode","flat","progressPoint","updateNode","updatePoint","idNode","idPoint","warmupNode","warmupPoint","supersetNode","supersetPoint","blockPoint","pyramidNameNode","pyramidPoint","evaluateProgram","hasWeightInUnit","oldLiftoscript","newLiftoscript","changeExerciseName","variationNames","equipmentName","newName","fromNode","toNode","changeWeightsToCompletedWeights","lastDescriptions","ongoingDescriptions","repeatRanges","isUsed","sectionsNode","sectionsToReuse","propertyNameNode","nameEquipmentItems","nameEquipment","matchingExercise","TypeError","buildSafe","classNameStr","isMobile","isIos","isAndroid","commithash","iOSVersion","iosAppVersion","androidVersion","androidAppVersion","muscle_1","getMaxWeightSetFromEntry","getMaxWeightSet","getMax1RMSetFromEntry","getMax1RMSet","weightDiff","avgUnilateralCompletedReps","totalEntryWeight","setVolume","totalEntryReps","totalEntrySets","getFinishedSets","isFinishedSet","pauseWorkout","intervals","newIntervals","lastInterval","resumeWorkout","reminder","workoutTime","endTime","interval","buildFromEntry","toISOString","programName","createCustomEntry","edit","fields","finishProgramDay","forceEndTime","deletedProgramExercises","getProgramExerciseForKeyAndDay","updatePrints","useRm1","findAllPersonalRecords","findPersonalRecord","findAllUsedExerciseTypes","collectMinAndMaxTime","acc","hr","maxTime","minTime","initial","collectProgramChangeTimes","changeProgramTimes","collectMuscleGroups","targetMuscleGroups","targetMusclesGroups","synergistMuscleGroups","synergistMusclesGroups","synergistMuscleGroupToMultiplier","synergistMusclesGroupMultipliers","muscleGroup","Muscle","getAvailableMuscleGroups","synergistMultiplier","muscleGroupAcc","lastTs","finishedSets","lastDate","firstDayOfWeekTimestamp","startWeekFromMonday","collectAllUsedExerciseTypes","collectAllHistoryRecordsOfExerciseType","collectLastEntry","isStarted","lastHistoryEntry","lastHistoryRecord","collectLastNote","lastNote","collectWeightPersonalRecord","maxSet","maxWeight","maxWeightHistoryRecord","collect1RMPersonalRecord","all1RMs","max1RM","max1RMHistoryRecord","max1RMSet","findAllMaxSetsPerId","maxSets","entryMaxSet","getDateToHistory","getNumberOfPersonalRecords","getPersonalRecords","sortedHistory","max1RMSets","maxWeightSets","thisMaxWeightSet","thisMaxWeight","lastMaxWeight","prevMaxWeightSet","maxWeightSet","thisMax1RMSet","thisMax1RM","lastMax1RMSet","lastMax1RM","prevMax1RMSet","findMaxSet","isMax","totalRecordWeight","totalRecordReps","totalRecordSets","getStartedEntries","getHistoricalSameDay","getHistoricalLastDay","calories","timeMs","getHistoricalAmrapSets","nextSet","warmupSet","targetMuscles","synergistMuscles","_u","_t","_w","_v","_y","_x","_0","_z","pauseWorkoutAction","lensGetters","lbu","getters","resumeWorkoutAction","latestMigrationVersion","migrations","basicBeginnerProgram_1","settings_1","aStorage","deletedGyms","basicBeginnerProgram","uidFromSeed","customExerciseKey","defaultEquipment","graphs","graph","workoutSettings","targetType","newExerciseStr","gym","gyms","clonedAt","hashCode","Settings","muscleGroups","trainerMessage","fixedNames","barbell","cable","dumbbell","smith","band","kettlebell","bodyweight","leverageMachine","medicineball","ezbar","trapbar","defaultSets","dequal_1","SCREENS_WITHOUT_PROGRAM","tab","currentName","topStack","newTopStack","pull","previous","enablePtr","curr","isPush","oldHistoryRecord","currentScreen","screens","editProgramState","oldCleanedProgram","cleanPlannerProgram","newCleanedProgram","editProgramExerciseState","editProgramScreen","findBy","isSameTab","prev","ev","isEvaluatedProgram","exerciseLevel_1","stats_1","layeredText_1","emptyProgramId","createEmptyProgram","nextHistoryEntry","programSets","programWarmups","programSetIndex","getEntryBlock","runUpdateScriptForEntry","dayApproxTimeMs","getProgramDayUsedExercises","getProgramDay","pe","getAllProgramExercisesWithType","getDayData","levelSteps","buildLevelChange","cause","levels","ExerciseLevel","fromType","resolveType","targetIndex","fromCustom","toCustom","evaluated","isInProgram","buildChange","createVariation","useStateWeight","repsExpr","isMultiweek","cloneProgramData","newProgramId","LayeredText","htmlToText","switchToUnit","getAllProgramExercises","forceEvaluate","dayNum","carriedDayDescriptions","evaluatedWeek","evaluatedDay","evaluatedExercises","iterate","tag","numberOfDays","exerciseRangeFormat","minExs","maxExs","pluralize","getDayNumber","getWeekFromDay","getDayInWeek","getDayName","aDay","exportProgram","aFullProgram","customExerciseIds","findById","getReusingCustomProgressExercises","getReusingSetProgressExercises","fullProgram","omit","deletedDays","deletedWeeks","deletedExercises","getProgramExercisesFromExerciseType","getAllUsedProgramExercises","getProgramIndex","getCurrentProgram","stateValue","numValue","aProgram","fullDayName","getSupersetGroups","excludeExercise","getBlock","getSupersetExercises","_name","evalutedProgram","runExerciseFinishDayScript","userPromptedStateVars","createScriptBindings","Stats","getCurrentMovingAverageBodyweight","runner","execute","getUpdates","diff","runFinishDayScript","levelChange","manualLevel","direction","diffOtherStates","diffState","memo2","key2","dayAverageTimeMs","dayApproxTimes","getProgramExerciseForKeyAndShortDayData","runAllFinishDayScripts","levelChanges","wantedSteps","manualChanges","isSuppressed","newStateResult","theNextDay","replaceExercise","createExercise","defaultWarmup","warmupValues","allExercisesList","squat","finishDayExpr","variationExpr","reuseLogic","previewProgram","showCustomPrograms","cloneProgram","selectProgram","getProgramExerciseByTypeWeekAndDay","getNumberOfExerciseInstances","weeksRange","daysRange","minDays","maxDays","exerciseRange","daysTotal","getExerciseTypesForWeekDay","exerciseTypes","exType","et","getListOfDays","isReallyMultiweek","getProgramWeek","applyEvaluatedProgram","getProgramExerciseFromDay","getEvaluatedExercise","plannerProgramExercise","weeksSummary","loopIndex","loopLength","loopWeekIndex","loopDay","nd","resetStack","initPlannerState","payload","exportedPlannerProgramToExportedProgram","exportedPlannerProgram","aNextDay","plannerSettings","isChanged","bProgram","cleanedAProgram","cleanedBProgram","diffPaths","mergePrograms","oldProgram","enforceNew","createFromHistoryRecord","createExerciseFromEntry","addDayFromHistoryRecord","afterDay","newDayData","getReusingSetsExercises","getReusingDescriptionsExercises","getReusingProgressExercises","reusingCustomProgressExercises","reusingSetProgressExercises","getReusingUpdateExercises","setUtils_1","screenMuscleToMuscleMapping","shoulders","triceps","back","glutes","hamstrings","quadriceps","chest","biceps","calves","forearms","muscleToScreenMuscleMapping","screenMuscle","muscles","muscle","obj","maxValue","screenMuscles","sm","isHidden","getPointsForDay","mergePoints","getPointsForExercise","screenMusclePoints","strength","hypertrophy","exercisePoints","getUnifiedPointsForExercise","historyEntry","screenTargetMuscles","screenSynergistMuscles","_set","mergeScreenMusclePoints","combinedKeys","mergeExercisePoints","points1","points2","oldPoints","newPoints","getEmptyScreenMusclesPoints","imageUrl","normalizePoints","maxValues","findMaxValue","normalizeUnifiedPoints","combinePoints","getScreenMusclesFromMuscle","mg","getMuscleGroupName","capitalize","isDefaultMuscles","defaultMuscles","SetUtils","areEqual","getBuiltinMuscleGroups","getHiddenMuscleGroups","getMusclesFromScreenMuscle","isBuiltInMuscleGroup","getPointsForProgram","getUnifiedPointsForDay","createMuscleGroup","muscleGroupSettings","updateMuscleGroup","isDefault","newMuscleGroups","deleteMuscleGroup","restoreMuscleGroup","setNewPassword","confirmPassword","setConfirmPassword","passwordError","pwd","lastGroup","rpeExpr","evaluatedWeight","common","Stack","reducePos","pos","score","bufferBase","curContext","lookAhead","start","cx","StackContext","pushState","depth","lookaheadRecord","setLookAhead","dPrec","dynamicPrecedence","getGoto","minRepeatTerm","storeNode","reduceContext","nodeSet","types","isAnonymous","lastBigReductionStart","bigReductionCount","lastBigReductionSize","stateFlag","baseStateID","end","mustSink","mustMove","scan","shiftContext","maxNode","nextState","nextStart","nextEnd","useNode","reused","updateContext","tracker","reset","off","recoverByDelete","isNode","canShift","sim","SimulatedStack","stateSlot","hasAction","recoverByInsert","nextStates","best","forceReduce","validAction","backup","findForcedReduction","seen","explore","allActions","rDepth","found","forceAll","deadEnd","restart","sameState","dialectEnabled","dialectID","dialect","flags","emitContext","emitLookAhead","newCx","close","strict","StackBufferCursor","maybeNext","fork","decodeArray","Type","Uint16Array","array","out","digit","CachedToken","extended","mask","nullToken","InputStream","chunk","chunkOff","chunk2","chunk2Pos","rangeIndex","chunkPos","range","readNext","resolveOffset","assoc","clipPos","peek","idx","resolved","acceptToken","endOffset","RangeError","acceptTokenTo","endPos","getChunk","nextChunk","advance","setDone","TokenGroup","readToken","tokenPrecTable","contextual","extend","LocalTokenGroup","precTable","elseToken","skipped","atEof","nextPos","precOffset","groupMask","accEnd","allows","overrides","low","high","mid","findOffset","tableData","tableOffset","iPrev","verbose","process","LOG","stackIDs","cutAt","tree","side","IterMode","IncludeAnonymous","moveTo","childBefore","childAfter","prevSibling","FragmentCursor","fragments","fragment","safeFrom","safeTo","trees","nextFragment","fr","openStart","openEnd","nodeAt","positions","Tree","prop","NodeProp","TokenCache","tokens","mainToken","actions","getActions","actionIndex","main","tokenizer","updateCachedToken","startIndex","addActions","eofTerm","getMainToken","specializers","putAction","pair","Parse","recovering","nextStackID","minStackPos","stoppedAt","topTerm","stacks","bufferLength","parsedPos","stopped","stoppedTokens","newStacks","advanceStack","tok","finished","findFinished","stackID","stackToTree","getName","runRecovery","maxRemaining","outer","stopAt","strictCx","cxHash","cached","contextHash","inner","defaultReduce","localStack","advanceFully","pushStackDedup","restarted","tokenEnd","forceBase","insert","topID","maxBufferLength","minRepeatType","WeakMap","fromCodePoint","Dialect","Parser","wrappers","topTerms","nodeProps","setProp","nodeID","propSpec","NodeSet","NodeType","define","propSources","DefaultBufferLength","tokenArray","specializerSpecs","getSpecializer","Uint32Array","dialects","dynamicPrecedences","termNames","parseDialect","createParse","loose","table","groupTag","terminal","slot","flag","deflt","configure","config","info","external","contextTracker","wrap","hasWrappers","topNode","prec","ContextTracker","ExternalTokenizer","nativeStorage_1","withTransaction","promise","db","initialize","transaction","objectStore","addEventListener","errorDetails","withNative","nativeStorage","NativeStorage","isAvailable","connection","indexedDB","open","createObjectStore","initializeForSafari","handler","getAllKeys","getAll","all","put","function_pipe","function_dual","Either_left","Either_right","Either_isLeft","Either_map","URI","Functor","ap","extendStatics","__extends","setPrototypeOf","__assign","_this","es6_identity","asDecoder","asEncoder","actual","getContextEntry","appendContext","pushAll","xs","ys","es6_hasOwnProperty","getNameFromProps","useIdentity","codecs","getInterfaceTypeName","getPartialTypeName","getDomainKeys","domain","isLiteralC","literal_1","string","isUnionC","undefinedType","es6_spreadArray","stripNonDomainKeys","shouldStrip","getUnionName","mergeAll","us","equal","primitive","baseIsNotADictionary","UnknownRecord","us_1","us_2","getProps","codec","stripKeys","getOwnPropertyNames","es6_isNonEmpty","emptyTags","intersect","a_1","isAnyC","isTypeC","lazyCodecs","getTags","isStrictC","isExactC","isRefinementC","isReadonlyC","isIntersectionC","intersection_1","mergeTags","intersectTags","isRecursiveC","getIndex","_loop_1","keys_1","NullType","_super","nullType","UndefinedType","VoidType","voidType","UnknownType","unknown","StringType","NumberType","BigIntType","bigint","BooleanType","es6_boolean","AnyArrayType","UnknownArray","AnyDictionaryType","LiteralType","literal","KeyofType","keyof","RefinementType","brand","refinement","RecursiveType","runDefinition","recursion","cache","Self","ArrayType","ai","InterfaceType","uk","ak","type_1","vak","PartialType","partial","type_2","DictionaryType","codomain","exactCodec","enumerableRecord","changed","domainResult","vk","codomainResult","vok","nonEnumerableRecord","UnionType","union","tag_1","groups_1","len_1","find_1","TaggedUnionType","codecs_1","IntersectionType","intersection","TupleType","es6_tuple","type_3","va","ReadonlyType","readonly","ReadonlyArrayType","readonlyArray","exact","ExactType","isPartialC","getExactTypeName","ce","FunctionType","Function","NeverType","never","AnyType","any","Integer","taggedUnion","warn","getValidationError","getDefaultContext","Dictionary","ObjectType","dictionary","StrictType","clean","alias","PlannerDayDataError","isValid","replaceWeight","wc","newEvalutedProgram","ex","weightChange","newLabel","toExerciseType","allExercises","labelSuffix","noConflicts","getLabel","newLabel2","renamed","follow","replaceAndValidateExercise","modifyTopLineItems","aPlannerProgram","firstPass","mapping","evaluator","newLine","topLineItemToText","used","repeatStr","repeatParts","newPlannerProgram","oldPlannerProgram","additionalRepeatingExercises","repeatWeekIndex","repeatedExercises","topLine","topLineWeek","topLineDay","group1","group2","ex1","ex2","reuseDay","di","evaluateFull","fullProgramText","evaluateText","fullToWeekEvalResult","fullResult","isWeekNameReserved","setLoopWeek","_loop","fullText","usedExercises","_id","usedEquipment","buildExportedProgram","getExportedPlannerProgram","newStorage","__h","__N","componentWillUpdate","__s","componentDidCatch","requestAnimationFrame","clearTimeout","cancelAnimationFrame","lastAlertDisplayedTs","liftoscriptTree","hasStateVariable","safe","errorMsg","lastAlertTs","reportError","rawResult","output","convertResult","module","DEFAULT_OPTIONS_KEYS","isMatchingKey","isPromise","onCacheAdd","onCacheChange","onCacheHit","transformKey","cloneArray","arrayLike","isSameValueZero","object1","object2","mergeOptions","existingOptions","newOptions","Cache","isMatchingKeyFunction","getKeyIndex","_getKeyIndexFromMatchingKey","_getKeyIndexForMany","_getKeyIndexForSingle","canTransformKey","shouldCloneArguments","shouldUpdateOnAdd","shouldUpdateOnChange","shouldUpdateOnHit","keyToMatch","keysLength","existingKey","argIndex","keyLength","orderByLru","startingIndex","currentLength","updateAsyncCache","memoized","firstKey","firstValue","keyIndex","createMemoizedFunction","isMemoized","normalizedOptions","customOptions","getCustomOptions","factory","ramp","rungValues","orientFor","ascends","rungs","rung","PathReporter_1","validateAndReport","lastActions","reducerLastActions","coerceProgramTags","validateStorage","TStorage","validateAndReportStorage","maybeStorage","shouldReportError","finalStorage","dateNow","signupRequests","deletedHistory","deletedPrograms","deletedStats","neck","bicepLeft","bicepRight","forearmLeft","forearmRight","waist","hips","thighLeft","thighRight","calfLeft","calfRight","bodyfat","helps","bStorage","_aOriginalId","_aId","_aVersions","cleanedAStorage","_bOriginalId","_bId","_bVersions","cleanedBStorage","isFullStorage","partialStorageToStorage","partialStorage","__d","debounceRendering","setProperty","cssText","removeEventListener","removeAttribute","setAttribute","contextType","__E","_sb","getDerivedStateFromProps","componentWillMount","componentWillReceiveProps","getSnapshotBeforeUpdate","localName","createTextNode","createElementNS","__html","Provider","__l","Consumer","getDerivedStateFromError","nextPropID","Range","perNode","combine","closedBy","openedBy","isolate","mounted","MountedTree","overlay","bracketed","noProps","src","isTop","direct","newTypes","newProps","CachedNode","CachedInnerNode","ch","TreeCursor","cursorAt","scope","_tree","TreeNode","resolveNode","resolveInner","resolveStack","layers","mount","root","iterStack","stackIterator","enter","leave","anon","entered","propValues","balance","balanceRange","makeTree","FlatBufferCursor","takeNode","parentStart","minPos","inRepeat","lookAheadAtStart","contextAtStart","startPos","skip","minStart","nodeSize","localSkipped","nodeStart","findBufferSize","copyToBuffer","TreeBuffer","localChildren","localPositions","localInRepeat","lastEnd","makeRepeatLeaf","takeFlatNode","lookAheadProp","lastI","makeBalanced","nodes","nodeCount","bufferStart","buildTree","childString","endIndex","findChild","dir","checkSide","startI","endI","overlays","IgnoreOverlays","BaseNode","matchContext","matchNodeContext","enterUnfinishedNodesBefore","lastChild","_parent","nextChild","EnterBracketed","ExcludeBuffers","BufferNode","BufferContext","hasChild","IgnoreMounts","rPos","enterBracketed","nextSignificantParent","val","toTree","externalSibling","heads","picked","newHeads","StackIterator","bufferNode","yieldNode","yieldBuf","yield","enterChild","atLastNode","move","mustLeave","nodeSizeCache","balanceType","mkTop","mkTree","maxChild","ceil","groupFrom","groupStart","groupSize","nextSize","TreeFragment","addTree","applyChanges","minGap","fI","nextF","cI","nextC","fromA","cut","fFrom","fTo","toA","toB","StringInput","lineChunks","InnerParse","checkRanges","ActiveOverlay","mounts","stoppedInner","MixedParse","nest","innerDone","baseTree","baseParse","startInner","fragmentCursor","covered","isCovered","hasNode","frag","checkCover","materialize","oldMounts","findMounts","punchRanges","startParse","enterFragments","sliceBuf","buf","newStack","innerOffset","stackPos","targetI","StructureCursor","curTo","fragI","curFrag","nextFrag","gapFrom","gapTo","findCoverChanges","iA","iB","inA","inB","nextA","nextB","NodeWeakMap","setBuffer","getBuffer","cursorSet","cursorGet","parseMixed","vals","firstElement","zeroOrGte","aVal","bVal","programNumberOfSets","completedNumberOfSets","shouldGoToNextEntry","isFullyEmptyOrFinishedSet","visitedAndFinished","isInitial","supersetGroups","isEmptyOrFinished","supersetGroup","supersetIndex","getNextEntryIndex","isCompletedSet","isFinished","isEmptyOrFinishedSet","dateTimes","dateStr","startTimeDate","fromYYYYMMDD","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getProgressId","PRACTICE_ID","newEntry","applyBindings","completeAmrapSet","lf","modify","progressSet","roundRpe","keepBlockLog","loggedAt","rpeSetIndexes","applyProgramExercise","progressEntry","forceWarmupSets","programExerciseWarmupSets","newSetsNum","newSets","newWarmupSets","getUnitForExerciseType","calculateTrainingMax","calculate1RM","repsRaw","rpeRawOrContext","startTimer","isAdjusting","timerForPush","nativeNotificationScheduled","title","subtitle","subtitleHeader","bodyHeader","nextRunTarget","nextRunEntry","nextRunSet","nextEntryAndSet","findNextEntryAndSet","aSet","hasPlatesPerSide","duration","startSetTimer","setTimerMode","stopTimer","completeTimerSet","startAfterWorkStep","following","stopSetTimer","backRestartWindowMs","stepIndex","startBackTarget","addedIndexes","_loggedAt","_rpeSetIndexes","clearSingleBlockLog","modal","blockLogModal","isMember","findNextEntryAndSetIndex","targetEntry","getNextSupersetEntry","updateTimer","newTimer","liveActivityEntryIndex","liveActivitySetIndex","skipLiveActivityUpdate","maybeApplySuperset","currentEntryIndex","findEntryByExercise","isFullyCompletedSet","isFullyFinishedSet","isFullyEmptySet","hasLastUnfinishedSet","bProgress","showUpdateDate","dateModal","getColorToSupersetGroup","entriesNonnull","changeDate","fromYYYYMMDDStr","isPractice","setProgress","runInitialUpdateScripts","programExerciseIds","programExercises","runUpdateScript","oldEntry","lastCompletedIndex","findIndexReverse","shouldAskWeight","shouldLogRpe","shouldPromptUserVars","completeSet","amrapUi","amrapModal","userVars","getIsRpeEnabled","getIsMinRepsEnabled","updateAmrapRepsInExercise","updateAmrapRepsLeftInExercise","updateRpeInExercise","updateWeightInExercise","getBlockLogRef","openBlockLog","shouldOpenSingleLog","asksReps","canShowLogButton","pausedDurationMs","applyBlockLog","rpeValue","answers","writeReps","lastLeft","firstLeft","avg","avgLeft","each","newBlock","applySingleBlockLog","repsAnswers","lastIndex","isLast","newSet","updateUserPromptedStateVars","editExerciseNotes","updateProgress","addExercise","numberOfEntries","updateSetWeights","progressId","shouldKeepProgramExerciseId","levelAction","changeEquipment","editNotes","applyProgramDay","newEntries","isNotEmpty","obj1","obj2","ignoreKeys","currentObj1","currentObj2","keys1","keys2","obj1original","obj2original","newPath","oldObj","newObj","chKeys","oldKeys","newKeys","oldKey","mapValues","fromEntries","sortedByKeys","sortedKeys","copyObj","theKeys","structuredClone","fromArray","paddingBottom","backgroundSize","backgroundImage","backgroundColor","link","textIndent","backgroundPosition","subscriptions","onClear","enforce","platform","lftAndroidVersion","lftIosVersion","lftAndroidAppVersion","lftIosAppVersion","res","clear","exceptionIgnores","sentAt","resetForTests","isIgnored","allow","IconHandle","buildState","loading","notification","revisions","freshMigrations","lensRecordings","foldW","matchW","FromEither","MonadThrow","throwError","ChainRec","Extend","Alt","alt","altW","Bifunctor","mapLeft","bimap","Traversable","sequence","traverse","Foldable","reduceRight","foldMap","Monad","Chain","Applicative","Apply","apW","Pointed","of","getAltValidation","getApplicativeValidation","getWitherable","getFilterable","getCompactable","getEq","getShow","either","stringifyJSON","chainFirstW","chainW","sequenceArray","traverseArray","traverseArrayWithIndex","traverseReadonlyArrayWithIndex","traverseReadonlyNonEmptyArrayWithIndex","ApT","apSW","apS","bindW","Do","toUnion","chainNullableK","fromNullableK","tryCatchK","tryCatch","fromNullable","orElse","orElseW","swap","filterOrElseW","chainOptionKW","duplicate","flatten","flattenW","apSecondW","apSecond","apFirstW","apFirst","getOrElse","getOrElseW","getValidationMonoid","getValidationSemigroup","getApplyMonoid","getApplySemigroup","toError","elem","elemE_1","equals","parseJSON","getValidation","SE","_E","_bimap","_mapLeft","_reduce","_foldMap","_reduceRight","_extend","_traverse","chainRec","_chainRec","Applicative_1","Apply_1","chainable","ChainRec_1","FromEither_1","Functor_1","Separated_1","Witherable_1","_ap","foldMapM","traverseF","ta","_alt","that","wa","tailRec","SA","show","EL","EA","separate","separated","filterMap","ob","partition","partitionMap","F_","wither","witherDefault","wilt","wiltDefault","me","ea","onLeft","onRight","_FromEither","_FlatMap","onThrow","let_","let","e_1","getApplicativeMonoid","MA","equipments","TBuiltinEquipment","availableMuscles","TMuscle","availableBodyParts","exerciseKinds","TExerciseKind","TBodyPart","graphExerciseSelectedTypes","TGraphExerciseSelectedType","graphMuscleGroupSelectedTypes","TGraphMuscleGroupSelectedType","TEquipment","TExerciseId","TMetaExercises","interface","bodyParts","sortedEquipment","TExerciseType","TCustomExerciseVariation","nextLevel","TCustomExercise","isDeleted","boolean","clonedFrom","reuseImageFrom","movedTo","TUnit","TWeight","TAssessmentTestInput","endurance","flexibility","cardio","power","speed","function","weightReps","mass","distance","betterIs","higher","lower","howTo","sides","labels","extras","TPlate","TBarKey","barKey","TBars","percentageUnits","TPercentageUnit","TPercentage","TSet","isOptionalWeight","TProgramState","TBlockRepsLogging","firstlast","check","TBlockLogging","TLevelChange","fromName","toName","THistoryEntry","leftSets","TProgramStateMetadataValue","TProgramStateMetadata","TProgramSet","minRepsExpr","timerExpr","TProgramExerciseVariation","quickAddSets","TProgramExerciseWarmupSet","TProgramExerciseReuseLogic","TProgramExercise","updateDayExpr","descriptionExpr","enableRepRanges","enableRpe","reuseFinishDayScript","reuseUpdateDayScript","TExercisePickerScreen","exercisePickerSorts","TExercisePickerSort","TExercisePickerFilters","isStarred","TExercisePickerProgramExercise","TExercisePickerAdhocExercise","TExercisePickerTemplate","TExercisePickerSelectedExercise","TExercisePickerState","filters","selectedExercises","showMuscles","customExerciseName","templateName","selectedTab","editCustomExercise","editCustomExerciseType","TProgressUi","editModal","exercisePicker","equipmentModal","rm1Modal","exerciseBottomSheet","entryIndexEditMode","TProgressMode","warmup","TIntervals","null","TBlockRun","historyRecordChange","THistoryRecordChange","TPlannerProgramDay","TPlannerProgramWeek","TPlannerProgram","TStoredProgressionSnapshot","THistoryRecord","exertionRating","TProgramDayEntry","TProgramWeek","TProgramDay","TProgram","authorid","frequency","age","goal","lengthUnits","TLengthUnit","TLength","TStatsWeightValue","statsWeightDef","TStatsWeight","TStatsLengthValue","statsLengthDef","TStatsLength","TStatsPercentageValue","statsPercentageDef","TStatsPercentage","TStatsWeightEnabled","TStatsLengthEnabled","TStatsPercentageEnabled","TStatsEnabled","TSettingsTimers","TGraph","TEquipmentData","kg","similarTo","TGraphOptions","movingAverageWindowSize","TMuscleMultiplier","TExerciseDataValue","muscleMultipliers","TScreenMuscle","TPlannerSettings","strengthSetsPct","hypertrophySetsPct","weeklyRangeSets","weeklyFrequency","TGym","targetTypes","TTargetType","TWorkoutSettings","shouldHideGraphs","TGraphs","TMuscleGroupsSettings","TSettings","graphOptions","graphsSettings","isSameXAxis","isWithBodyweight","isWithOneRm","isWithProgramLines","defaultType","defaultMuscleGroupType","exerciseStatsSettings","ascendingSort","hideWithoutWorkoutNotes","hideWithoutExerciseNotes","statsEnabled","currentGymId","alwaysOnDisplay","textSize","starredExercises","assignMessage","assignMessageSeenAt","disableInAppTimers","programAssignedAt","checkIn","everyWeeks","turnedOnAt","trainerName","changedAt","checkInAnsweredFor","checkInRequest","requestedAt","checkInForm","questionIds","own","assessments","assessmentRequest","assessmentResults","checkInRequestAnsweredAt","checkInChangeSeenAt","onboarding","checklistStartedAt","finishedAt","tourSkippedAt","doneItems","checkInDay","weekday","anchorDate","timeZone","TStats","attribution","TMuscleGeneratorResponse","list","defaultVariation","MAX_VARIATIONS","patch","applyPatch","toStored","def","areAllEqual","containsAnyValues","within","headingRegex","fenceOpenRegex","listItemRegex","imageRegex","termLinkRegex","markdownSpecialRegex","namedEntities","amp","quot","apos","nbsp","isValidTerm","maxTermLength","mapTerms","markdown","fence","wasBlank","wasCode","inList","normalizeNewlines","blank","mark","isCode","mapLine","ticks","shown","labelEnd","closingIndex","targetEnd","detect","trusted","currentSection","gist","flush","trimBlankLines","preview","paragraph","rawLine","withoutImages","parseHeading","level","firstParagraph","html","whole","maxLength","maxBytes","isTooLong","tooLongMessage","toLocaleString","linkTerms","words","termsIn","terms","unlinkTerms","_term","looksLikeHtml","copyFromCore","core","summary","format","stripMarkdown","space","lastIndexOf","collapse","ExerciseId","baseId","camel","charAt","toUpperCase","taken","ownId","forNew","existing","alsoTaken","getIdbKey","isAdmin","currentAccount","messageerror","messagesuccess","startwizard","serverUser","loaded","hasUnrunMigrations","unrunMigrations","migrated","loadLocalStorage","backupKey","confirmed","isProgressValid","defaultOnActions","isFinishDayAction","newProgramIds","programIds","lastReducerActions","newPrograms","oldBodyweight","newBodyweight","oldScreenData","newScreenData","oldExerciseKey","oldPlannerState","newExerciseKey","newPlannerState","editProgramUiHelpers_1","changedExercises","affectedEntries","oldEquipment","getCurrentGym","newEquipment","changedEquipmentIds","equipmentId","getEquipmentIdForExerciseType","isUndoing","buildLocalStorage","buildCardsReducer","stateError_1","progressionSnapshot_1","deepMerge_1","isLoggingEnabled","timerId","completionEffects","startTimers","shouldRunScript","didFinish","oldSet","isCancel","amrapValue","amrapLeftValue","amrapSet","recording","reducerWrapper","storeToLocalStorage","formatHHMMSS","lastHistoryRecordStr","reducer","reportedCorruptedStorage","newStorageApproach","newState2","practiceBlockedActions","newScreenStack","programIndex","newHistory","isManualEntry","manualEntryIndexes","manualIndex","newSettingsExerciseData","isRemoval","updatedState","keepStorage","getCurrentBodyweight","recentWeights","getCurrentBodyfat","getEmpty","equipmentToBarKey","variationName","exerciseId_1","abWheel","arnoldPress","aroundTheWorld","backExtension","ballSlams","battleRopes","behindTheNeckPress","benchDip","benchPress","benchPressCloseGrip","benchPressWideGrip","bentOverOneArmRow","bentOverRow","bicepCurl","bicycleCrunch","boxJump","boxSquat","bulgarianSplitSquat","burpee","cableCrossover","cableCrunch","cableKickback","cablePullThrough","cableTwist","calfPressOnLegPress","calfPressOnSeatedLegPress","chestDip","chestFly","chestPress","chestSupportedRow","chinUp","cleanandJerk","concentrationCurl","crossBodyCrunch","crunch","cycling","deadlift","deadliftHighPull","declineBenchPress","declineCrunch","deficitDeadlift","ellipticalMachine","facePull","flatKneeRaise","flatLegRaise","frontRaise","frontSquat","gobletSquat","goodMorning","gluteBridge","gluteBridgeMarch","gluteKickback","hackSquat","hammerCurl","handstandPushUp","hangClean","hangSnatch","hangingLegRaise","highKneeSkips","highRow","hipAbductor","hipAdductor","hipThrust","inclineBenchPress","inclineBenchPressWideGrip","inclineChestFly","inclineChestPress","inclineCurl","inclineRow","invertedRow","isoLateralChestPress","isoLateralRow","jackknifeSitUp","jumpRope","jumpSquat","jumpingJack","kettlebellSwing","kettlebellTurkishGetUp","kippingPullUp","kneeRaise","kneelingPulldown","kneestoElbows","latPulldown","lateralBoxJump","lateralRaise","legsUpBenchPress","legCurl","legExtension","legPress","lunge","lyingBicepCurl","lyingLegCurl","mountainClimber","muscleUp","obliqueCrunch","overheadPress","overheadSquat","pecDeck","pendlayRow","pistolSquat","plank","powerClean","powerSnatch","preacherCurl","pressUnder","pullUp","pullover","pushPress","pushUp","reverseCrunch","reverseCurl","reverseFly","reverseGripConcentrationCurl","reversePlank","reverseLatPulldown","reverseLunge","reverseWristCurl","romanianDeadlift","reverseHyperextension","rowing","russianTwist","safetySquatBarSquat","seatedCalfRaise","seatedFrontRaise","seatedLegCurl","seatedLegPress","seatedOverheadPress","seatedPalmsUpWristCurl","seatedRow","seatedWideGripRow","shoulderPress","shoulderPressParallelGrip","shrug","sideBend","sideCrunch","sideHipAbductor","sideLyingClam","sidePlank","singleLegBridge","singleLegCalfRaise","singleLegDeadlift","singleLegGluteBridgeBench","singleLegGluteBridgeStraight","singleLegGluteBridgeBentKnee","singleLegHipThrust","sissySquat","sitUp","skullcrusher","slingShotBenchPress","snatch","snatchPull","splitSquat","splitJerk","squatRow","standingCalfRaise","standingRow","standingRowCloseGrip","standingRowRearDeltWithRope","standingRowRearHorizontalDeltWithRope","standingRowVBar","stepUp","stiffLegDeadlift","straightLegDeadlift","sumoDeadlift","sumoDeadliftHighPull","superman","tBarRow","thruster","toesToBar","torsoRotation","trapBarDeadlift","tricepsDip","tricepsExtension","tricepsPushdown","uprightRow","vUp","widePullUp","wristCurl","wristRoller","zercherSquat","nameToIdMapping","shouldSkipThreshold","programExerciseWarmupSet","warmupWeight","maybeGetExercise","custom","variationMeta","getExercise","metadata","getMetadata","variationEquipment","customFullName","variationEq","variationLabel","normalizeText","isSameName","variationTexts","findCustomMatch","customs","tier","bare","preferred","findIdByName","identityEquipment","getById","customVariations","allExpanded","defaultTargetMuscles","defaultSynergistMuscleMultipliers","defaultSynergistMuscles","synergistMuscleMultipliers","similarRating","tm","etm","esm","rating","isCustom","reverseName","nameWithEquipment","customLabel","printedName","findSameName","sameNameError","findDuplicate","targets","searchNames","names","fuzzySearch","rm","builtInId","builtIn","nameAndEquipment","foundEquipment","findByName","trimmed","getByIds","ids","filterExercisesByNameAndType","filterTypes","isSubstitute","filterExercises","filterExercisesByType","sortExercises","warmup10","warmup45","warmup95","defaultTargetMusclesGroups","allMuscleGroups","defaultSynergistMusclesGroups","fromKey","eqp","similar","rated","sortedByScreenMuscle","createCustomExercise","tMuscles","sMuscles","deleteCustomExercise","existingExercise","upsertCustomExercise","sameNameDeletedExercise","handleCustomExerciseChange","updateProgram","saveCustomExercise","updated","trimmedName","currentExerciseType","aRating","ft","lowercaseFilterTypes","aTargetMuscleGroups","bTargetMuscleGroups","localeCompare","filterCustomExercises","filterCustomExercisesByType","maxVersion","newVersions","currentVersion","maxVersionInt","versionStr","__spreadArrays","il","jl","Lens","LensBuilder","LensBuilderWithObject","LensError","lens","AbstractLensBuilder","lensFactory","isReverse","buildLensRecording","buildLensModifyRecording","getter","setter","nestedErr","aLens","modifyFn","startName","lensGetterStr","prepend","newLensOrBuilder","newLens","combinedLens","newLensGetters","newGetter","propKey","nextObj","newParent","nextTagID","Tag","modified","nameOrParent","defineModifier","Modifier","nextModifierID","instances","mods","configs","powerSet","ruleNodeProp","Rule","opaque","inherit","tagHighlighter","cls","tagClass","highlightTree","highlighter","putStyle","builder","HighlightBuilder","highlightRange","highlighters","span","startSpan","inheritedClass","getStyleTags","tagCls","highlightTags","innerHighlighters","rangeFrom","rangeTo","comment","typeName","propertyName","punctuation","bracket","variableName","tagName","labelName","namespace","macroName","docString","character","integer","float","bool","regexp","escape","modifier","operatorKeyword","controlKeyword","definitionKeyword","moduleKeyword","derefOperator","arithmeticOperator","logicOperator","bitwiseOperator","compareOperator","updateOperator","definitionOperator","typeOperator","controlOperator","separator","angleBracket","squareBracket","paren","brace","heading1","heading2","heading3","heading4","heading5","heading6","contentSeparator","quote","emphasis","strong","monospace","strikethrough","inserted","deleted","invalid","documentMeta","processingInstruction","standard","special","classHighlighter","highlightCode","putText","putBreak","writeTo","classes","nextBreak","upto","styleTags","byName","pieces","exec","isPasswordLoading","setIsPasswordLoading","isMagicLinkLoading","setIsMagicLinkLoading","setPasswordError","magicLinkError","setMagicLinkError","hasSent","setHasSent","countdown","setCountdown","nextEmail","filterE","witherF","displayReps","displayCompletedReps","areSameReps","firstRep","findNextSet","inGroupsOf","completedOrRequiredWeight","isTimerOnlySet","hasWeightTarget","requiresCompletedWeight","getSetTimerText","setTimerValue","setTimerSuffix","timerValue","timerSuffix","addSet","isSameSet","set1","set2","isInRangeCompleted","isInRangeCompletedSet","enforceCompletedSet","requiresWeight","hasRequiredData","maxUnilateralCompletedReps","totalReps","plateSet","barLb","barKg","fixedSet","exerciseChoices","exerciseChoicesFor","starterSet","visibleTypes","valuesToAdd","trainerSet","hasOwn","starter","exerciseEquipment","currentGym","exerciseFormChoices","savedExercises","addTypeToSet","gymFromSet","deleteTypeFromSet","findMissing","baseProgram","baseResult","baseIds","gymEquipment","missing","hidden","addableFromSet","getEquipmentNameForExerciseType","equipmentUnit","getEquipmentData","mergeEquipment","newEquipmentData","oldEquipmentData","concatBy","el","equipmentKeyByName","builtInEquipmentKey","receiveMessage","webkit","messageHandlers","liftosaurMessage","toIosWithResult","toAndroidWithResult","toIosResult","toAndroidResult","JSAndroidBridge","sendMessage","iosVersion","toIosAndAndroidWithResult","isMenuOpen","setIsMenuOpen","isAccountModalOpen","setIsAccountModalOpen","iconHamburger_1","iconUser_1","mobileRight","bottomSheet_1","BottomSheet","onClose","menuItem_1","MenuItemWrapper","getMenuItemsList","SocialIcons","ModalAccount","account_1","modal_1","isLoggedIn","Modal","shouldShowClose","setNickname","setTermsAccepted","isTermsOpen","setIsTermsOpen","rootRef","claimedRef","claimInFlightRef","onClaimRef","ensureClaimed","claim","finally","isTrusted","CLAIM_EVENTS","borderRadius","marginRight","checked","onChange","isFullWidth","isFullHeight","noPaddings","overflowHidden","fillInMetadata","byWeekDayExercise","tagsProp","existingTags","progressProp","existingProgress","updateProp","existingUpdate","scheme","ws","setByWeekDayExercise","setByExerciseWeekDay","byExerciseWeekDay","fullNames","evaluateDay","getPerDayEvaluatedWeeks","getFullEvaluatedWeeks","getDayIndexFromWeekAndDayInWeekIndex","fillRepeats","repeatWeek","repeatedExercise","fillSetReuses","originalExercises","findOriginalExercisesAtWeekDay","originalExercise","fillEvaluatedSetVariations","evaluateSetVariations","fillDescriptions","lastWeekExercise","findLastWeekExercise","fillDescriptionReuses","reusingName","findReusedDescriptions","fillSingleProperties","fillProgressReuses","originalProperty","originalProgress","originalState","checkUpdateScript","fillUpdateReuses","originalUpdate","postProcess","iterateOverExercises","checkUnknownExercises","checkBlocks","groupName","getSingleBlockProblems","checkBlockGroup","findMissingWorkTimer","findQuickAddSet","getBlockProblems","declaring","offending","singleOnlyReps","member","refMember","findRoundMismatch","refCount","findPrompt","findMissingRest","refIndex","currentWeekIndex","weekDayMatch","dayOrWeekStr","dayStr","weekExercises","weekDescriptions","atWeek","atDay","candidateDays","perDayEvaluatedWeeks","exerciseFullNames","cond","lastWeekDay","coll","startWith","if","else","MenuItem","isBorderless","handleTouchStart","marginLeft","touchAction","onMouseDown","onTouchStart","iconHandle_1","expandValue","addons","expandName","shouldShowRightArrow","iconArrowRight_1","animation","historyRecordSets_1","originalSetVariations","reuseSetVariations","warmups","exerciseWarmups","roundTo0005","toUsed","evaluatedSets","reusedSets","currentSets","currentGlobals","globalSetTimer","defaultWarmups","repeatToRangeStr","rep","warmupSetsToDisplaySets","uniqueKey","uniqueSetKey","evaluatedSetsToDisplaySets","dimReps","dimRpe","dimWeight","dimTimer","setsToDisplaySets","hasCurrentSets","degroupWarmupSets","currentDescription","evaluatedSetVariation","lastEvaluatedSet","numberOfSetsThisWeek","acc2","isReusingSetsProgress","originalStateMetadata","getEnableRepRanges","getProgressDefaultArgs","progressionType","increase","successesRequired","successesCounter","decrease","failuresRequired","failuresCounter","groupedWarmupSets","groupByExpr","hideWeekday","hideYear","toLocaleDateString","year","month","formatWithTime","hour","minute","formatUTCYYYYMMDD","getUTCMonth","getUTCDate","getUTCFullYear","formatUTCYYYYMMDDHHMM","parseYYYYMMDDHHMM","formatYYYYMMDDHHMM","weekDay","getDay","beginningOfWeekDay","lastDayOfWeekTimestamp","endOfWeekDay","withMs","getMilliseconds","regexpMatchArray","UTC","yearAndMonth","dayOfWeekStr","formatRange","startDate","endDate","editProgramLenses_1","properlyUpdateStateVariableInPlace","deleteProgram","customPrograms","pgms","setName","focusedDay","exerciseUi","weekUi","past","future","fromWorkout","isProgressEnabled","isUpdateEnabled","modeTabIndex","acrossWeeksTabIndex","regenerateProgram","precision","roundTo05","roundTo00005","toWord","undashcase","uncamelCase","camelCase","letter","snakecase","truncate","unindent","indent2","spaces","indent","needle","haystack","nch","nextName","hashString","hashCode0To1","cleanJson","gab","fb","sequenceT","tupleConstructors","curried","getTupleConstructor","fas","sequenceS","getRecordConstructor","combined","getExercisesWithUnset1RMs","plannerExercises","uniqByExpr","programContentBuild","buildPlannerSettings","applyExportedProgram","exportedProgram","activeCustomExercises","getNextTargetType","skipPlatesCalculator","nextTargetType","toggleStarredExercise","starred","changePickerSettings","doesProgramHaveUnset1RMs","setOneRM","getTheme","lftSystemDarkMode","applyTheme","isOlderThan","limitMs","lockHours","serverRecord","useDialogFocus","dialogRef","isOpen","onEscape","onEscapeRef","dialog","previouslyFocused","activeElement","openDialogs","focus","preventScroll","keydownHandler","container","active","closest","focusable","querySelectorAll","focusableSelector","getClientRects","shiftKey","isConnected","collection","lastColl","setBy","newItem","splitIntoNGroups","numberOfGroups","inGroupsOfFilled","shouldFill","compatBy","groupByKey","groupByKeyUniq","groupByExprUniq","collectToSet","collectToSetTransform","transformer","compareFn","arrCopy","newDays","daysToMove","sortInOrder","aIndex","bIndex","sortByMultiple","sortByExpr","diffBy","removeAll","removeAt","setAt","setOrAddBy","removeBy","nonnull","merge","areSortedInSameOrder","coll1","coll2","liveCustom","makeType","allTypes","candidate","upper","relink","working","withExercises","stripLinks","_removed","_link","toType","bottom","visited","validateLink","stored","written","spliceVariation","removed","manualOptions","programExerciseType","entryType","isUndo","candidates","shouldWrapIntoQuotes","storageNotUnits","settingsCollections","trainerOnlyStorage","clientOnlyStorage","trainerOnlySettings","clientOnlySettings","sharedSettings","valueField","statsDefs","category","isMissing","deepEqual","aKeys","bKeys","_weekId","weekRest","_dayId","comparable","field","isPlanner","asFields","statCategory","orderBy","byId","baseFields","nextFields","storageRecord","settingsRecord","gymRest","equipmentKey","stat","topLevel","gymOrder","graphOrder","programBodies","programPlanners","programNextDays","builtSettings","fieldOwnership","random","seed","bottomShift","setBottomShift","innerHeight","bottomSheetRef","useDialogFocus_1","bottomSheet","clientHeight","containerRef","element","zIndex","isOutsideTapDisabled","role","tabIndex","transform","closeIcon","closeLabel","iconCloseCircleOutline_1","maxHeight","pendingRequests","handleResponse","requestId","generateRequestId","createPromise","pendingRequest","timeout","timeoutMs","getApplicativeComposition","fgab","modalRef","isMounted","setIsMounted","hasClose","prevProps","callback","preautofocus","autofocusInputRef","innerClassName","filename","contents","blob","Blob","objectUrl","createObjectURL","click","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","toStringTag","mainContent_1"],"ignoreList":[],"sourceRoot":""}