diff --git a/application/src/main/data/json/system/widget_bundles/cards.json b/application/src/main/data/json/system/widget_bundles/cards.json index 1289923667..858d816338 100644 --- a/application/src/main/data/json/system/widget_bundles/cards.json +++ b/application/src/main/data/json/system/widget_bundles/cards.json @@ -229,43 +229,43 @@ { "alias": "value_card", "name": "Value card", - "image": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyNyIgZmlsbD0ibm9uZSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTI4IDEyNyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfMTE0Ml8yMDM5NTQpIj4KICA8cmVjdCB4PSI1LjUiIHk9IjIuNSIgd2lkdGg9IjExNyIgaGVpZ2h0PSIxMTciIHJ4PSIyLjI5NDEiIGZpbGw9IiNmZmYiIHNoYXBlLXJlbmRlcmluZz0iY3Jpc3BFZGdlcyIvPgogIDxwYXRoIGQ9Im0zMy42MDMgMjkuMjIxdi03LjY0NzFjMC0xLjU4NjgtMS4yODA4LTIuODY3Ni0yLjg2NzYtMi44Njc2cy0yLjg2NzcgMS4yODA4LTIuODY3NyAyLjg2NzZ2Ny42NDcxYy0xLjE1NjYgMC44Njk4LTEuOTExNyAyLjI2NTQtMS45MTE3IDMuODIzNSAwIDIuNjM4MiAyLjE0MTIgNC43Nzk0IDQuNzc5NCA0Ljc3OTRzNC43Nzk0LTIuMTQxMiA0Ljc3OTQtNC43Nzk0YzAtMS41NTgxLTAuNzU1MS0yLjk1MzctMS45MTE4LTMuODIzNXptLTMuODIzNS03LjY0NzFjMC0wLjUyNTcgMC40MzAyLTAuOTU1OSAwLjk1NTktMC45NTU5czAuOTU1OSAwLjQzMDIgMC45NTU5IDAuOTU1OWgtMC45NTU5djAuOTU1OWgwLjk1NTl2MS45MTE3aC0wLjk1NTl2MC45NTU5aDAuOTU1OXYxLjkxMThoLTEuOTExOHYtNS43MzUzeiIgZmlsbD0iIzU0NjlGRiIvPgogIDxnIGZpbGw9IiMwMDAiPgogICA8cGF0aCBkPSJtNTAuMTQxIDE5Ljc0MXY2LjUyMzhoLTEuMTE1N3YtNi41MjM4aDEuMTE1N3ptMi4wNDc3IDB2MC44OTYxaC01LjE5MzJ2LTAuODk2MWg1LjE5MzJ6bTIuNjAzMyA2LjYxMzVjLTAuMzU4NSAwLTAuNjgyNi0wLjA1ODMtMC45NzIzLTAuMTc0OC0wLjI4NjgtMC4xMTk1LTAuNTMxOC0wLjI4NTMtMC43MzQ5LTAuNDk3My0wLjIwMDEtMC4yMTIxLTAuMzU0LTAuNDYxNi0wLjQ2MTUtMC43NDgzLTAuMTA3NS0wLjI4NjgtMC4xNjEzLTAuNTk2LTAuMTYxMy0wLjkyNzV2LTAuMTc5M2MwLTAuMzc5MyAwLjA1NTMtMC43MjI4IDAuMTY1OC0xLjAzMDVzMC4yNjQzLTAuNTcwNiAwLjQ2MTUtMC43ODg2YzAuMTk3MS0wLjIyMTEgMC40MzAxLTAuMzg5OCAwLjY5OS0wLjUwNjMgMC4yNjg4LTAuMTE2NSAwLjU2MDEtMC4xNzQ4IDAuODczNy0wLjE3NDggMC4zNDY1IDAgMC42NDk3IDAuMDU4MyAwLjkwOTYgMC4xNzQ4czAuNDc1IDAuMjgwOCAwLjY0NTIgMC40OTI4YzAuMTczMyAwLjIwOTEgMC4zMDE3IDAuNDU4NiAwLjM4NTQgMC43NDgzIDAuMDg2NiAwLjI4OTggMC4xMjk5IDAuNjA5NCAwLjEyOTkgMC45NTg5djAuNDYxNWgtMy43NDU5di0wLjc3NTJoMi42Nzk1di0wLjA4NTFjLTZlLTMgLTAuMTk0Mi0wLjA0NDgtMC4zNzY0LTAuMTE2NS0wLjU0NjYtMC4wNjg3LTAuMTcwMy0wLjE3NDctMC4zMDc3LTAuMzE4MS0wLjQxMjMtMC4xNDM0LTAuMTA0NS0wLjMzNDYtMC4xNTY4LTAuNTczNi0wLjE1NjgtMC4xNzkyIDAtMC4zMzkgMC4wMzg4LTAuNDc5NCAwLjExNjUtMC4xMzc0IDAuMDc0Ny0wLjI1MjQgMC4xODM3LTAuMzQ1IDAuMzI3MXMtMC4xNjQzIDAuMzE2Ni0wLjIxNTEgMC41MTk4Yy0wLjA0NzggMC4yMDAxLTAuMDcxNyAwLjQyNTYtMC4wNzE3IDAuNjc2NXYwLjE3OTNjMCAwLjIxMjEgMC4wMjg0IDAuNDA5MiAwLjA4NTIgMC41OTE0IDAuMDU5NyAwLjE3OTMgMC4xNDYzIDAuMzM2MSAwLjI1OTggMC40NzA1IDAuMTEzNiAwLjEzNDQgMC4yNTEgMC4yNDA1IDAuNDEyMyAwLjMxODEgMC4xNjEzIDAuMDc0NyAwLjM0NSAwLjExMiAwLjU1MTEgMC4xMTIgMC4yNTk5IDAgMC40OTE0LTAuMDUyMiAwLjY5NDUtMC4xNTY4IDAuMjAzMS0wLjEwNDUgMC4zNzk0LTAuMjUyNCAwLjUyODctMC40NDM2bDAuNTY5MSAwLjU1MTJjLTAuMTA0NiAwLjE1MjMtMC4yNDA1IDAuMjk4Ny0wLjQwNzggMC40MzkxLTAuMTY3MyAwLjEzNzQtMC4zNzE5IDAuMjQ5NC0wLjYxMzggMC4zMzYtMC4yMzkgMC4wODY2LTAuNTE2OCAwLjEzLTAuODMzNCAwLjEzem00LjAwNTctMy45NTJ2My44NjIzaC0xLjA3OTh2LTQuODQ4MWgxLjAxNzFsMC4wNjI3IDAuOTg1OHptLTAuMTc0NyAxLjI1OTEtMC4zNjc1LTAuMDA0NWMwLTAuMzM0NiAwLjA0MTktMC42NDM3IDAuMTI1NS0wLjkyNzVzMC4yMDYxLTAuNTMwMiAwLjM2NzQtMC43MzkzYzAuMTYxMy0wLjIxMjEgMC4zNjE1LTAuMzc0OSAwLjYwMDQtMC40ODg0IDAuMjQyLTAuMTE2NSAwLjUyMTMtMC4xNzQ4IDAuODM3OS0wLjE3NDggMC4yMjExIDAgMC40MjI3IDAuMDMyOSAwLjYwNDkgMC4wOTg2IDAuMTg1MiAwLjA2MjcgMC4zNDUgMC4xNjI4IDAuNDc5NSAwLjMwMDIgMC4xMzc0IDAuMTM3NCAwLjI0MTkgMC4zMTM2IDAuMzEzNiAwLjUyODcgMC4wNzQ3IDAuMjE1MSAwLjExMiAwLjQ3NSAwLjExMiAwLjc3OTd2My4yMzA1aC0xLjA3OTh2LTMuMTM2NGMwLTAuMjM2LTAuMDM1OS0wLjQyMTItMC4xMDc2LTAuNTU1Ni0wLjA2ODctMC4xMzQ1LTAuMTY4Ny0wLjIzMDEtMC4zMDAyLTAuMjg2OC0wLjEyODQtMC4wNTk4LTAuMjgyMy0wLjA4OTYtMC40NjE1LTAuMDg5Ni0wLjIwMzEgMC0wLjM3NjQgMC4wMzg4LTAuNTE5NyAwLjExNjUtMC4xNDA0IDAuMDc3Ni0wLjI1NTQgMC4xODM3LTAuMzQ1MSAwLjMxODEtMC4wODk2IDAuMTM0NC0wLjE1NTMgMC4yODk4LTAuMTk3MSAwLjQ2NnMtMC4wNjI3IDAuMzY0NC0wLjA2MjcgMC41NjQ2em0zLjAwNjUtMC4yODY4LTAuNTA2MyAwLjExMmMwLTAuMjkyNyAwLjA0MDMtMC41NjkgMC4xMjEtMC44Mjg5IDAuMDgzNi0wLjI2MjkgMC4yMDQ2LTAuNDkyOSAwLjM2MjktMC42OSAwLjE2MTMtMC4yMDAyIDAuMzYtMC4zNTcgMC41OTU5LTAuNDcwNSAwLjIzNi0wLjExMzUgMC41MDY0LTAuMTcwMyAwLjgxMS0wLjE3MDMgMC4yNDggMCAwLjQ2OSAwLjAzNDQgMC42NjMyIDAuMTAzMSAwLjE5NzEgMC4wNjU3IDAuMzY0NCAwLjE3MDIgMC41MDE4IDAuMzEzNnMwLjI0MiAwLjMzMDEgMC4zMTM3IDAuNTYwMWMwLjA3MTcgMC4yMjcgMC4xMDc1IDAuNTAxOCAwLjEwNzUgMC44MjQ1djMuMTM2NGgtMS4wODQzdi0zLjE0MDljMC0wLjI0NS0wLjAzNTktMC40MzQ2LTAuMTA3Ni0wLjU2OTEtMC4wNjg3LTAuMTM0NC0wLjE2NzItMC4yMjctMC4yOTU3LTAuMjc3OC0wLjEyODQtMC4wNTM3LTAuMjgyMy0wLjA4MDYtMC40NjE1LTAuMDgwNi0wLjE2NzMgMC0wLjMxNTEgMC4wMzEzLTAuNDQzNiAwLjA5NDEtMC4xMjU0IDAuMDU5Ny0wLjIzMTUgMC4xNDQ4LTAuMzE4MSAwLjI1NTQtMC4wODY2IDAuMTA3NS0wLjE1MjQgMC4yMzE1LTAuMTk3MiAwLjM3MTktMC4wNDE4IDAuMTQwNC0wLjA2MjcgMC4yOTI3LTAuMDYyNyAwLjQ1N3ptNS4zMDk2LTEuMDI2MXY1Ljc4MDFoLTEuMDc5OHYtNi43MTIxaDAuOTk0N2wwLjA4NTEgMC45MzJ6bTMuMTU4OSAxLjQ0NzN2MC4wOTQxYzAgMC4zNTI1LTAuMDQxOCAwLjY3OTYtMC4xMjU0IDAuOTgxMy0wLjA4MDcgMC4yOTg3LTAuMjAxNyAwLjU2LTAuMzYzIDAuNzg0MS0wLjE1ODMgMC4yMjEtMC4zNTM5IDAuMzkyOC0wLjU4NjkgMC41MTUzLTAuMjMzIDAuMTIyNC0wLjUwMTkgMC4xODM3LTAuODA2NiAwLjE4MzctMC4zMDE3IDAtMC41NjYtMC4wNTUzLTAuNzkzLTAuMTY1OC0wLjIyNDEtMC4xMTM1LTAuNDEzOC0wLjI3MzMtMC41NjkxLTAuNDc5NS0wLjE1NTMtMC4yMDYxLTAuMjgwOC0wLjQ0OC0wLjM3NjQtMC43MjU4LTAuMDkyNi0wLjI4MDgtMC4xNTgzLTAuNTg4NS0wLjE5NzEtMC45MjMxdi0wLjM2MjljMC4wMzg4LTAuMzU1NSAwLjEwNDUtMC42NzgxIDAuMTk3MS0wLjk2NzggMC4wOTU2LTAuMjg5OCAwLjIyMTEtMC41MzkyIDAuMzc2NC0wLjc0ODNzMC4zNDUtMC4zNzA0IDAuNTY5MS0wLjQ4MzljMC4yMjQtMC4xMTM1IDAuNDg1NC0wLjE3MDMgMC43ODQxLTAuMTcwMyAwLjMwNDcgMCAwLjU3NSAwLjA1OTggMC44MTEgMC4xNzkyIDAuMjM2IDAuMTE2NSAwLjQzNDYgMC4yODM4IDAuNTk1OSAwLjUwMTkgMC4xNjEzIDAuMjE1MSAwLjI4MjMgMC40NzQ5IDAuMzYyOSAwLjc3OTYgMC4wODA3IDAuMzAxNyAwLjEyMSAwLjYzNzggMC4xMjEgMS4wMDgyem0tMS4wNzk4IDAuMDk0MXYtMC4wOTQxYzAtMC4yMjQxLTAuMDIwOS0wLjQzMTctMC4wNjI3LTAuNjIyOC0wLjA0MTktMC4xOTQyLTAuMTA3Ni0wLjM2NDUtMC4xOTcyLTAuNTEwOC0wLjA4OTYtMC4xNDY0LTAuMjA0Ni0wLjI1OTktMC4zNDUtMC4zNDA2LTAuMTM3NC0wLjA4MzYtMC4zMDMyLTAuMTI1NC0wLjQ5NzQtMC4xMjU0LTAuMTkxMSAwLTAuMzU1NCAwLjAzMjgtMC40OTI4IDAuMDk4NS0wLjEzNzUgMC4wNjI4LTAuMjUyNSAwLjE1MDktMC4zNDUxIDAuMjY0NHMtMC4xNjQzIDAuMjQ2NC0wLjIxNSAwLjM5ODhjLTAuMDUwOCAwLjE0OTMtMC4wODY3IDAuMzEyMS0wLjEwNzYgMC40ODg0djAuODY5MmMwLjAzNTkgMC4yMTUxIDAuMDk3MSAwLjQxMjMgMC4xODM3IDAuNTkxNSAwLjA4NjcgMC4xNzkyIDAuMjA5MSAwLjMyMjYgMC4zNjc1IDAuNDMwMSAwLjE2MTMgMC4xMDQ2IDAuMzY3NCAwLjE1NjkgMC42MTgzIDAuMTU2OSAwLjE5NDIgMCAwLjM1OTktMC4wNDE5IDAuNDk3My0wLjEyNTUgMC4xMzc1LTAuMDgzNiAwLjI0OTUtMC4xOTg2IDAuMzM2MS0wLjM0NSAwLjA4OTYtMC4xNDk0IDAuMTU1My0wLjMyMTEgMC4xOTcyLTAuNTE1MyAwLjA0MTgtMC4xOTQxIDAuMDYyNy0wLjQwMDMgMC4wNjI3LTAuNjE4M3ptNC4yNzkgMi40NjQ0Yy0wLjM1ODQgMC0wLjY4MjUtMC4wNTgzLTAuOTcyMy0wLjE3NDgtMC4yODY3LTAuMTE5NS0wLjUzMTctMC4yODUzLTAuNzM0OC0wLjQ5NzMtMC4yMDAxLTAuMjEyMS0wLjM1NC0wLjQ2MTYtMC40NjE1LTAuNzQ4My0wLjEwNzUtMC4yODY4LTAuMTYxMy0wLjU5Ni0wLjE2MTMtMC45Mjc1di0wLjE3OTNjMC0wLjM3OTMgMC4wNTUyLTAuNzIyOCAwLjE2NTgtMS4wMzA1IDAuMTEwNS0wLjMwNzcgMC4yNjQzLTAuNTcwNiAwLjQ2MTUtMC43ODg2IDAuMTk3MS0wLjIyMTEgMC40MzAxLTAuMzg5OCAwLjY5OS0wLjUwNjMgMC4yNjg4LTAuMTE2NSAwLjU2MDEtMC4xNzQ4IDAuODczNy0wLjE3NDggMC4zNDY1IDAgMC42NDk3IDAuMDU4MyAwLjkwOTYgMC4xNzQ4czAuNDc0OSAwLjI4MDggMC42NDUyIDAuNDkyOGMwLjE3MzMgMC4yMDkxIDAuMzAxNyAwLjQ1ODYgMC4zODUzIDAuNzQ4MyAwLjA4NjcgMC4yODk4IDAuMTMgMC42MDk0IDAuMTMgMC45NTg5djAuNDYxNWgtMy43NDU5di0wLjc3NTJoMi42Nzk1di0wLjA4NTFjLTZlLTMgLTAuMTk0Mi0wLjA0NDgtMC4zNzY0LTAuMTE2NS0wLjU0NjYtMC4wNjg3LTAuMTcwMy0wLjE3NDgtMC4zMDc3LTAuMzE4MS0wLjQxMjMtMC4xNDM0LTAuMTA0NS0wLjMzNDYtMC4xNTY4LTAuNTczNi0wLjE1NjgtMC4xNzkyIDAtMC4zMzkgMC4wMzg4LTAuNDc5NCAwLjExNjUtMC4xMzc0IDAuMDc0Ny0wLjI1MjQgMC4xODM3LTAuMzQ1IDAuMzI3MXMtMC4xNjQzIDAuMzE2Ni0wLjIxNTEgMC41MTk4Yy0wLjA0NzggMC4yMDAxLTAuMDcxNyAwLjQyNTYtMC4wNzE3IDAuNjc2NXYwLjE3OTNjMCAwLjIxMjEgMC4wMjg0IDAuNDA5MiAwLjA4NTEgMC41OTE0IDAuMDU5OCAwLjE3OTMgMC4xNDY0IDAuMzM2MSAwLjI1OTkgMC40NzA1czAuMjUwOSAwLjI0MDUgMC40MTIzIDAuMzE4MWMwLjE2MTMgMC4wNzQ3IDAuMzQ1IDAuMTEyIDAuNTUxMSAwLjExMiAwLjI1OTkgMCAwLjQ5MTQtMC4wNTIyIDAuNjk0NS0wLjE1NjggMC4yMDMxLTAuMTA0NSAwLjM3OTQtMC4yNTI0IDAuNTI4Ny0wLjQ0MzZsMC41NjkxIDAuNTUxMmMtMC4xMDQ2IDAuMTUyMy0wLjI0MDUgMC4yOTg3LTAuNDA3OCAwLjQzOTEtMC4xNjczIDAuMTM3NC0wLjM3MTkgMC4yNDk0LTAuNjEzOCAwLjMzNi0wLjIzOSAwLjA4NjYtMC41MTY4IDAuMTMtMC44MzM1IDAuMTN6bTQuMDEwMy00LjAxNDd2My45MjVoLTEuMDc5OXYtNC44NDgxaDEuMDMwNmwwLjA0OTMgMC45MjMxem0xLjQ4MzEtMC45NTQ0LTllLTMgMS4wMDM2Yy0wLjA2NTctMC4wMTE5LTAuMTM3NC0wLjAyMDktMC4yMTUxLTAuMDI2OC0wLjA3NDYtNmUtMyAtMC4xNDkzLTllLTMgLTAuMjI0LTllLTMgLTAuMTg1MiAwLTAuMzQ4IDAuMDI2OS0wLjQ4ODQgMC4wODA3LTAuMTQwNCAwLjA1MDctMC4yNTg0IDAuMTI1NC0wLjM1NCAwLjIyNC0wLjA5MjYgMC4wOTU2LTAuMTY0MyAwLjIxMjEtMC4yMTUgMC4zNDk1LTAuMDUwOCAwLjEzNzQtMC4wODA3IDAuMjkxMi0wLjA4OTYgMC40NjE1bC0wLjI0NjUgMC4wMTc5YzAtMC4zMDQ3IDAuMDI5OS0wLjU4NyAwLjA4OTYtMC44NDY4IDAuMDU5OC0wLjI1OTkgMC4xNDk0LTAuNDg4NCAwLjI2ODktMC42ODU2IDAuMTIyNC0wLjE5NzEgMC4yNzQ4LTAuMzUxIDAuNDU3LTAuNDYxNSAwLjE4NTItMC4xMTA1IDAuMzk4OC0wLjE2NTggMC42NDA3LTAuMTY1OCAwLjA2NTggMCAwLjEzNiA2ZS0zIDAuMjEwNiAwLjAxNzkgMC4wNzc3IDAuMDEyIDAuMTM2IDAuMDI1NCAwLjE3NDggMC4wNDA0em0zLjM5MTkgMy45MDcxdi0yLjMxMmMwLTAuMTczMy0wLjAzMTQtMC4zMjI2LTAuMDk0MS0wLjQ0ODEtMC4wNjI4LTAuMTI1NC0wLjE1ODMtMC4yMjI1LTAuMjg2OC0wLjI5MTItMC4xMjU0LTAuMDY4Ny0wLjI4MzgtMC4xMDMxLTAuNDc0OS0wLjEwMzEtMC4xNzYzIDAtMC4zMjg2IDAuMDI5OS0wLjQ1NzEgMC4wODk2LTAuMTI4NCAwLjA1OTgtMC4yMjg1IDAuMTQwNC0wLjMwMDIgMC4yNDJzLTAuMTA3NSAwLjIxNjYtMC4xMDc1IDAuMzQ1aC0xLjA3NTRjMC0wLjE5MTIgMC4wNDYzLTAuMzc2NCAwLjEzODktMC41NTU2czAuMjI3LTAuMzM5IDAuNDAzMy0wLjQ3OTRjMC4xNzYyLTAuMTQwNCAwLjM4NjgtMC4yNTA5IDAuNjMxOC0wLjMzMTYgMC4yNDQ5LTAuMDgwNyAwLjUxOTctMC4xMjEgMC44MjQ0LTAuMTIxIDAuMzY0NCAwIDAuNjg3IDAuMDYxMyAwLjk2NzggMC4xODM3IDAuMjgzOCAwLjEyMjUgMC41MDY0IDAuMzA3NyAwLjY2NzcgMC41NTU2IDAuMTY0MyAwLjI0NSAwLjI0NjQgMC41NTI3IDAuMjQ2NCAwLjkyMzF2Mi4xNTUyYzAgMC4yMjEgMC4wMTQ5IDAuNDE5NyAwLjA0NDggMC41OTU5IDAuMDMyOSAwLjE3MzMgMC4wNzkyIDAuMzI0MSAwLjEzODkgMC40NTI2djAuMDcxNmgtMS4xMDY3Yy0wLjA1MDgtMC4xMTY0LTAuMDkxMS0wLjI2NDMtMC4xMjEtMC40NDM1LTAuMDI2OS0wLjE4MjMtMC4wNDAzLTAuMzU4NS0wLjA0MDMtMC41Mjg4em0wLjE1NjgtMS45NzYgOWUtMyAwLjY2NzdoLTAuNzc1MmMtMC4yMDAxIDAtMC4zNzY0IDAuMDE5NC0wLjUyODcgMC4wNTgyLTAuMTUyNCAwLjAzNTktMC4yNzkzIDAuMDg5Ni0wLjM4MDkgMC4xNjEzLTAuMTAxNSAwLjA3MTctMC4xNzc3IDAuMTU4My0wLjIyODUgMC4yNTk5cy0wLjA3NjIgMC4yMTY2LTAuMDc2MiAwLjM0NWMwIDAuMTI4NSAwLjAyOTkgMC4yNDY1IDAuMDg5NiAwLjM1NCAwLjA1OTggMC4xMDQ1IDAuMTQ2NCAwLjE4NjcgMC4yNTk5IDAuMjQ2NCAwLjExNjUgMC4wNTk4IDAuMjU2OSAwLjA4OTYgMC40MjEyIDAuMDg5NiAwLjIyMTEgMCAwLjQxMzctMC4wNDQ4IDAuNTc4LTAuMTM0NCAwLjE2NzMtMC4wOTI2IDAuMjk4Ny0wLjIwNDYgMC4zOTQzLTAuMzM2IDAuMDk1Ni0wLjEzNDQgMC4xNDY0LTAuMjYxNCAwLjE1MjQtMC4zODA5bDAuMzQ5NSAwLjQ3OTVjLTAuMDM1OSAwLjEyMjQtMC4wOTcxIDAuMjUzOS0wLjE4MzggMC4zOTQzLTAuMDg2NiAwLjE0MDMtMC4yMDAxIDAuMjc0OC0wLjM0MDUgMC40MDMyLTAuMTM3NCAwLjEyNTUtMC4zMDMyIDAuMjI4NS0wLjQ5NzMgMC4zMDkyLTAuMTkxMiAwLjA4MDYtMC40MTIzIDAuMTIxLTAuNjYzMiAwLjEyMS0wLjMxNjYgMC0wLjU5ODktMC4wNjI4LTAuODQ2OC0wLjE4ODItMC4yNDgtMC4xMjg1LTAuNDQyMS0wLjMwMDItMC41ODI1LTAuNTE1My0wLjE0MDQtMC4yMTgxLTAuMjEwNi0wLjQ2NDUtMC4yMTA2LTAuNzM5MyAwLTAuMjU2OSAwLjA0NzgtMC40ODM5IDAuMTQzNC0wLjY4MTEgMC4wOTg1LTAuMjAwMSAwLjI0MTktMC4zNjc0IDAuNDMwMS0wLjUwMTggMC4xOTEyLTAuMTM0NCAwLjQyNDItMC4yMzYgMC42OTktMC4zMDQ3IDAuMjc0OC0wLjA3MTcgMC41ODg1LTAuMTA3NiAwLjk0MDktMC4xMDc2aDAuODQ2OXptNC40MjI0LTEuODk5OHYwLjc4ODZoLTIuNzMzMnYtMC43ODg2aDIuNzMzMnptLTEuOTQ0Ni0xLjE4NzRoMS4wNzk5djQuNjk1OGMwIDAuMTQ5NCAwLjAyMDkgMC4yNjQ0IDAuMDYyNyAwLjM0NSAwLjA0NDggMC4wNzc3IDAuMTA2IDAuMTMgMC4xODM3IDAuMTU2OSAwLjA3NzcgMC4wMjY4IDAuMTY4OCAwLjA0MDMgMC4yNzMzIDAuMDQwMyAwLjA3NDcgMCAwLjE0NjQtMC4wMDQ1IDAuMjE1MS0wLjAxMzUgMC4wNjg3LTAuMDA4OSAwLjEyNC0wLjAxNzkgMC4xNjU4LTAuMDI2OGwwLjAwNDUgMC44MjQ0Yy0wLjA4OTYgMC4wMjY5LTAuMTk0MiAwLjA1MDgtMC4zMTM3IDAuMDcxNy0wLjExNjUgMC4wMjA5LTAuMjUwOSAwLjAzMTQtMC40MDMyIDAuMDMxNC0wLjI0OCAwLTAuNDY3NS0wLjA0MzQtMC42NTg3LTAuMTMtMC4xOTEyLTAuMDg5Ni0wLjM0MDUtMC4yMzQ1LTAuNDQ4MS0wLjQzNDYtMC4xMDc1LTAuMjAwMS0wLjE2MTMtMC40NjYtMC4xNjEzLTAuNzk3NnYtNC43NjN6bTUuODM4NCA0Ljg5M3YtMy43MDU2aDEuMDg0M3Y0Ljg0ODFoLTEuMDIxNmwtMC4wNjI3LTEuMTQyNXptMC4xNTIzLTEuMDA4MiAwLjM2My0wLjAwODljMCAwLjMyNTUtMC4wMzU5IDAuNjI1OC0wLjEwNzYgMC45MDA2LTAuMDcxNyAwLjI3MTgtMC4xODIyIDAuNTA5My0wLjMzMTYgMC43MTI0LTAuMTQ5MyAwLjIwMDEtMC4zNDA1IDAuMzU3LTAuNTczNSAwLjQ3MDUtMC4yMzMgMC4xMTA1LTAuNTEyMyAwLjE2NTgtMC44Mzc5IDAuMTY1OC0wLjIzNiAwLTAuNDUyNS0wLjAzNDQtMC42NDk3LTAuMTAzMS0wLjE5NzEtMC4wNjg3LTAuMzY3NC0wLjE3NDctMC41MTA4LTAuMzE4MS0wLjE0MDQtMC4xNDM0LTAuMjQ5NC0wLjMzMDEtMC4zMjcxLTAuNTYwMS0wLjA3NzYtMC4yMy0wLjExNjUtMC41MDQ4LTAuMTE2NS0wLjgyNDV2LTMuMTMyaDEuMDc5OXYzLjE0MWMwIDAuMTc2MiAwLjAyMDkgMC4zMjQxIDAuMDYyNyAwLjQ0MzYgMC4wNDE4IDAuMTE2NSAwLjA5ODYgMC4yMTA2IDAuMTcwMyAwLjI4MjNzMC4xNTUzIDAuMTIyNCAwLjI1MDkgMC4xNTIzIDAuMTk3MSAwLjA0NDggMC4zMDQ3IDAuMDQ0OGMwLjMwNzcgMCAwLjU0OTYtMC4wNTk3IDAuNzI1OS0wLjE3OTIgMC4xNzkyLTAuMTIyNSAwLjMwNjEtMC4yODY4IDAuMzgwOC0wLjQ5MjkgMC4wNzc3LTAuMjA2MSAwLjExNjUtMC40Mzc2IDAuMTE2NS0wLjY5NDV6bTMuMjY2NC0xLjc3NDN2My45MjVoLTEuMDc5OHYtNC44NDgxaDEuMDMwNmwwLjA0OTIgMC45MjMxem0xLjQ4MzItMC45NTQ0LTllLTMgMS4wMDM2Yy0wLjA2NTctMC4wMTE5LTAuMTM3NC0wLjAyMDktMC4yMTUxLTAuMDI2OC0wLjA3NDctNmUtMyAtMC4xNDkzLTllLTMgLTAuMjI0LTllLTMgLTAuMTg1MiAwLTAuMzQ4IDAuMDI2OS0wLjQ4ODQgMC4wODA3LTAuMTQwNCAwLjA1MDctMC4yNTg0IDAuMTI1NC0wLjM1NCAwLjIyNC0wLjA5MjYgMC4wOTU2LTAuMTY0MyAwLjIxMjEtMC4yMTUxIDAuMzQ5NS0wLjA1MDcgMC4xMzc0LTAuMDgwNiAwLjI5MTItMC4wODk2IDAuNDYxNWwtMC4yNDY0IDAuMDE3OWMwLTAuMzA0NyAwLjAyOTktMC41ODcgMC4wODk2LTAuODQ2OCAwLjA1OTctMC4yNTk5IDAuMTQ5NC0wLjQ4ODQgMC4yNjg4LTAuNjg1NiAwLjEyMjUtMC4xOTcxIDAuMjc0OS0wLjM1MSAwLjQ1NzEtMC40NjE1IDAuMTg1Mi0wLjExMDUgMC4zOTg4LTAuMTY1OCAwLjY0MDctMC4xNjU4IDAuMDY1NyAwIDAuMTM1OSA2ZS0zIDAuMjEwNiAwLjAxNzkgMC4wNzc3IDAuMDEyIDAuMTM1OSAwLjAyNTQgMC4xNzQ4IDAuMDQwNHptMi44Njc2IDQuOTY5MWMtMC4zNTg1IDAtMC42ODI2LTAuMDU4My0wLjk3MjMtMC4xNzQ4LTAuMjg2OC0wLjExOTUtMC41MzE3LTAuMjg1My0wLjczNDgtMC40OTczLTAuMjAwMi0wLjIxMjEtMC4zNTQtMC40NjE2LTAuNDYxNi0wLjc0ODMtMC4xMDc1LTAuMjg2OC0wLjE2MTMtMC41OTYtMC4xNjEzLTAuOTI3NXYtMC4xNzkzYzAtMC4zNzkzIDAuMDU1My0wLjcyMjggMC4xNjU4LTEuMDMwNSAwLjExMDYtMC4zMDc3IDAuMjY0NC0wLjU3MDYgMC40NjE1LTAuNzg4NiAwLjE5NzItMC4yMjExIDAuNDMwMi0wLjM4OTggMC42OTktMC41MDYzIDAuMjY4OS0wLjExNjUgMC41NjAxLTAuMTc0OCAwLjg3MzgtMC4xNzQ4IDAuMzQ2NSAwIDAuNjQ5NyAwLjA1ODMgMC45MDk1IDAuMTc0OCAwLjI1OTkgMC4xMTY1IDAuNDc1IDAuMjgwOCAwLjY0NTMgMC40OTI4IDAuMTcyOSAwLjIwOTEgMC4zMDE5IDAuNDU4NiAwLjM4NDkgMC43NDgzIDAuMDg3IDAuMjg5OCAwLjEzIDAuNjA5NCAwLjEzIDAuOTU4OXYwLjQ2MTVoLTMuNzQ1NXYtMC43NzUyaDIuNjc5NHYtMC4wODUxYy0wLjAwNTktMC4xOTQyLTAuMDQ0OC0wLjM3NjQtMC4xMTY1LTAuNTQ2Ni0wLjA2ODctMC4xNzAzLTAuMTc0Ny0wLjMwNzctMC4zMTgxLTAuNDEyMy0wLjE0MzQtMC4xMDQ1LTAuMzM0NS0wLjE1NjgtMC41NzM1LTAuMTU2OC0wLjE3OTIgMC0wLjMzOTEgMC4wMzg4LTAuNDc5NSAwLjExNjUtMC4xMzc0IDAuMDc0Ny0wLjI1MjQgMC4xODM3LTAuMzQ1IDAuMzI3MXMtMC4xNjQzIDAuMzE2Ni0wLjIxNSAwLjUxOThjLTAuMDQ3OCAwLjIwMDEtMC4wNzE3IDAuNDI1Ni0wLjA3MTcgMC42NzY1djAuMTc5M2MwIDAuMjEyMSAwLjAyODMgMC40MDkyIDAuMDg1MSAwLjU5MTQgMC4wNTk3IDAuMTc5MyAwLjE0NjQgMC4zMzYxIDAuMjU5OSAwLjQ3MDVzMC4yNTA5IDAuMjQwNSAwLjQxMjIgMC4zMTgxYzAuMTYxMyAwLjA3NDcgMC4zNDUgMC4xMTIgMC41NTExIDAuMTEyIDAuMjU5OSAwIDAuNDkxNC0wLjA1MjIgMC42OTQ1LTAuMTU2OCAwLjIwMzItMC4xMDQ1IDAuMzc5NC0wLjI1MjQgMC41Mjg4LTAuNDQzNmwwLjU2ODggMC41NTEyYy0wLjEwNCAwLjE1MjMtMC4yNCAwLjI5ODctMC40MDc1IDAuNDM5MS0wLjE2NzMgMC4xMzc0LTAuMzcxOSAwLjI0OTQtMC42MTM5IDAuMzM2LTAuMjM5IDAuMDg2Ni0wLjUxNjggMC4xMy0wLjgzMzQgMC4xM3oiIGZpbGwtb3BhY2l0eT0iLjg3Ii8+CiAgIDxwYXRoIGQ9Im01MC4zNTYgMzYuNTk2djAuNjY4N2gtMi40NTY2di0wLjY2ODdoMi40NTY2em0tMi4yMjEzLTQuMjI0MnY0Ljg5MjloLTAuODQzNXYtNC44OTI5aDAuODQzNXptNC45ODU5IDQuMTYzN3YtMS43MzRjMC0wLjEzLTAuMDIzNi0wLjI0Mi0wLjA3MDYtMC4zMzYxLTAuMDQ3MS0wLjA5NDEtMC4xMTg3LTAuMTY2OS0wLjIxNTEtMC4yMTg0LTAuMDk0MS0wLjA1MTUtMC4yMTI4LTAuMDc3My0wLjM1NjItMC4wNzczLTAuMTMyMiAwLTAuMjQ2NCAwLjAyMjQtMC4zNDI4IDAuMDY3Mi0wLjA5NjMgMC4wNDQ4LTAuMTcxNCAwLjEwNTMtMC4yMjUxIDAuMTgxNS0wLjA1MzggMC4wNzYyLTAuMDgwNyAwLjE2MjQtMC4wODA3IDAuMjU4N2gtMC44MDY1YzAtMC4xNDMzIDAuMDM0Ny0wLjI4MjIgMC4xMDQyLTAuNDE2NyAwLjA2OTQtMC4xMzQ0IDAuMTcwMi0wLjI1NDIgMC4zMDI0LTAuMzU5NXMwLjI5MDEtMC4xODgyIDAuNDczOS0wLjI0ODdjMC4xODM3LTAuMDYwNSAwLjM4OTgtMC4wOTA3IDAuNjE4My0wLjA5MDcgMC4yNzMzIDAgMC41MTUzIDAuMDQ1OSAwLjcyNTkgMC4xMzc3IDAuMjEyOCAwLjA5MTkgMC4zNzk3IDAuMjMwOCAwLjUwMDcgMC40MTY3IDAuMTIzMiAwLjE4MzcgMC4xODQ4IDAuNDE0NSAwLjE4NDggMC42OTIzdjEuNjE2NGMwIDAuMTY1OCAwLjAxMTIgMC4zMTQ4IDAuMDMzNiAwLjQ0NyAwLjAyNDcgMC4xMjk5IDAuMDU5NCAwLjI0MyAwLjEwNDIgMC4zMzk0djAuMDUzN2gtMC44MzAxYy0wLjAzOC0wLjA4NzMtMC4wNjgzLTAuMTk4Mi0wLjA5MDctMC4zMzI2LTAuMDIwMi0wLjEzNjctMC4wMzAyLTAuMjY4OS0wLjAzMDItMC4zOTY2em0wLjExNzYtMS40ODIgMC4wMDY3IDAuNTAwN2gtMC41ODE0Yy0wLjE1MDEgMC0wLjI4MjMgMC4wMTQ2LTAuMzk2NSAwLjA0MzctMC4xMTQzIDAuMDI2OS0wLjIwOTUgMC4wNjcyLTAuMjg1NyAwLjEyMS0wLjA3NjEgMC4wNTM4LTAuMTMzMyAwLjExODctMC4xNzEzIDAuMTk0OS0wLjAzODEgMC4wNzYyLTAuMDU3MiAwLjE2MjQtMC4wNTcyIDAuMjU4OCAwIDAuMDk2MyAwLjAyMjQgMC4xODQ4IDAuMDY3MiAwLjI2NTUgMC4wNDQ4IDAuMDc4NCAwLjEwOTggMC4xNCAwLjE5NDkgMC4xODQ4IDAuMDg3NCAwLjA0NDggMC4xOTI3IDAuMDY3MiAwLjMxNTkgMC4wNjcyIDAuMTY1OCAwIDAuMzEwMy0wLjAzMzYgMC40MzM1LTAuMTAwOCAwLjEyNTUtMC4wNjk1IDAuMjI0MS0wLjE1MzUgMC4yOTU4LTAuMjUyMSAwLjA3MTctMC4xMDA4IDAuMTA5Ny0wLjE5NiAwLjExNDItMC4yODU2bDAuMjYyMiAwLjM1OTZjLTAuMDI2OSAwLjA5MTgtMC4wNzI5IDAuMTkwNC0wLjEzNzggMC4yOTU3LTAuMDY1IDAuMTA1My0wLjE1MDEgMC4yMDYxLTAuMjU1NCAwLjMwMjQtMC4xMDMxIDAuMDk0MS0wLjIyNzQgMC4xNzE0LTAuMzczIDAuMjMxOS0wLjE0MzQgMC4wNjA1LTAuMzA5MiAwLjA5MDgtMC40OTc0IDAuMDkwOC0wLjIzNzUgMC0wLjQ0OTItMC4wNDcxLTAuNjM1MS0wLjE0MTItMC4xODYtMC4wOTYzLTAuMzMxNi0wLjIyNTEtMC40MzY5LTAuMzg2NC0wLjEwNTMtMC4xNjM2LTAuMTU4LTAuMzQ4NC0wLjE1OC0wLjU1NDUgMC0wLjE5MjcgMC4wMzU5LTAuMzYzIDAuMTA3Ni0wLjUxMDggMC4wNzM5LTAuMTUwMSAwLjE4MTQtMC4yNzU2IDAuMzIyNi0wLjM3NjQgMC4xNDM0LTAuMTAwOCAwLjMxODEtMC4xNzcgMC41MjQyLTAuMjI4NSAwLjIwNjEtMC4wNTM4IDAuNDQxNC0wLjA4MDcgMC43MDU3LTAuMDgwN2gwLjYzNTJ6bTMuNzI1NyAxLjIyNjZjMC0wLjA4MDYtMC4wMjAyLTAuMTUzNC0wLjA2MDUtMC4yMTg0LTAuMDQwMy0wLjA2NzItMC4xMTc2LTAuMTI3Ny0wLjIzMTktMC4xODE1LTAuMTEyLTAuMDUzOC0wLjI3NzgtMC4xMDMtMC40OTczLTAuMTQ3OS0wLjE5MjctMC4wNDI1LTAuMzY5Ny0wLjA5MjktMC41MzEtMC4xNTEyLTAuMTU5MS0wLjA2MDUtMC4yOTU3LTAuMTMzMy0wLjQxLTAuMjE4NC0wLjExNDItMC4wODUxLTAuMjAyNy0wLjE4Ni0wLjI2NTUtMC4zMDI1LTAuMDYyNy0wLjExNjUtMC4wOTQxLTAuMjUwOS0wLjA5NDEtMC40MDMyIDAtMC4xNDc5IDAuMDMyNS0wLjI4NzkgMC4wOTc1LTAuNDIwMXMwLjE1NzktMC4yNDg3IDAuMjc4OS0wLjM0OTUgMC4yNjc3LTAuMTgwMyAwLjQ0MDItMC4yMzg2YzAuMTc0OC0wLjA1ODIgMC4zNjk3LTAuMDg3MyAwLjU4NDgtMC4wODczIDAuMzA0NyAwIDAuNTY1NyAwLjA1MTUgMC43ODMgMC4xNTQ1IDAuMjE5NSAwLjEwMDkgMC4zODc2IDAuMjM4NiAwLjUwNDEgMC40MTM0IDAuMTE2NSAwLjE3MjUgMC4xNzQ3IDAuMzY3NCAwLjE3NDcgMC41ODQ3aC0wLjgwOTljMC0wLjA5NjMtMC4wMjQ2LTAuMTg1OS0wLjA3MzktMC4yNjg4LTAuMDQ3MS0wLjA4NTItMC4xMTg4LTAuMTUzNS0wLjIxNTEtMC4yMDUtMC4wOTYzLTAuMDUzOC0wLjIxNzMtMC4wODA3LTAuMzYyOS0wLjA4MDctMC4xMzg5IDAtMC4yNTQzIDAuMDIyNC0wLjM0NjIgMC4wNjcyLTAuMDg5NiAwLjA0MjYtMC4xNTY4IDAuMDk4Ni0wLjIwMTYgMC4xNjgxLTAuMDQyNiAwLjA2OTQtMC4wNjM4IDAuMTQ1Ni0wLjA2MzggMC4yMjg1IDAgMC4wNjA1IDAuMDExMiAwLjExNTQgMC4wMzM2IDAuMTY0NiAwLjAyNDYgMC4wNDcxIDAuMDY0OSAwLjA5MDggMC4xMjA5IDAuMTMxMSAwLjA1NjEgMC4wMzgxIDAuMTMyMiAwLjA3MzkgMC4yMjg2IDAuMTA3NSAwLjA5ODUgMC4wMzM2IDAuMjIxOCAwLjA2NjEgMC4zNjk2IDAuMDk3NSAwLjI3NzggMC4wNTgyIDAuNTE2NCAwLjEzMzMgMC43MTU4IDAuMjI1MSAwLjIwMTYgMC4wODk3IDAuMzU2MiAwLjIwNjIgMC40NjM4IDAuMzQ5NSAwLjEwNzUgMC4xNDEyIDAuMTYxMyAwLjMyMDQgMC4xNjEzIDAuNTM3NyAwIDAuMTYxMy0wLjAzNDggMC4zMDkyLTAuMTA0MiAwLjQ0MzYtMC4wNjcyIDAuMTMyMi0wLjE2NTggMC4yNDc2LTAuMjk1NyAwLjM0NjItMC4xMyAwLjA5NjMtMC4yODU3IDAuMTcxMy0wLjQ2NzIgMC4yMjUxLTAuMTc5MiAwLjA1MzgtMC4zODA4IDAuMDgwNy0wLjYwNDggMC4wODA3LTAuMzI5NCAwLTAuNjA4My0wLjA1ODMtMC44MzY4LTAuMTc0OC0wLjIyODUtMC4xMTg3LTAuNDAyMi0wLjI3LTAuNTIwOS0wLjQ1MzctMC4xMTY1LTAuMTg1OS0wLjE3NDctMC4zNzg2LTAuMTc0Ny0wLjU3OGgwLjc4M2MwLjAwODkgMC4xNTAxIDAuMDUwNCAwLjI3IDAuMTI0MyAwLjM1OTYgMC4wNzYyIDAuMDg3NCAwLjE3MDMgMC4xNTEyIDAuMjgyMyAwLjE5MTYgMC4xMTQyIDAuMDM4IDAuMjMxOSAwLjA1NzEgMC4zNTI4IDAuMDU3MSAwLjE0NTcgMCAwLjI2NzgtMC4wMTkxIDAuMzY2My0wLjA1NzEgMC4wOTg2LTAuMDQwNCAwLjE3MzctMC4wOTQxIDAuMjI1Mi0wLjE2MTMgMC4wNTE1LTAuMDY5NSAwLjA3NzMtMC4xNDc5IDAuMDc3My0wLjIzNTN6bTMuMzEyMy0yLjY1MTR2MC41OTE0aC0yLjA0OTl2LTAuNTkxNGgyLjA0OTl6bS0xLjQ1ODQtMC44OTA2aDAuODA5OXYzLjUyMTljMCAwLjExMiAwLjAxNTYgMC4xOTgyIDAuMDQ3IDAuMjU4NyAwLjAzMzYgMC4wNTgzIDAuMDc5NSAwLjA5NzUgMC4xMzc4IDAuMTE3NiAwLjA1ODIgMC4wMjAyIDAuMTI2NiAwLjAzMDMgMC4yMDUgMC4wMzAzIDAuMDU2IDAgMC4xMDk4LTAuMDAzNCAwLjE2MTMtMC4wMTAxczAuMDkzLTAuMDEzNCAwLjEyNDMtMC4wMjAybDAuMDAzNCAwLjYxODRjLTAuMDY3MiAwLjAyMDEtMC4xNDU2IDAuMDM4MS0wLjIzNTMgMC4wNTM3LTAuMDg3MyAwLjAxNTctMC4xODgxIDAuMDIzNi0wLjMwMjQgMC4wMjM2LTAuMTg2IDAtMC4zNTA2LTAuMDMyNS0wLjQ5NC0wLjA5NzUtMC4xNDM0LTAuMDY3Mi0wLjI1NTQtMC4xNzU5LTAuMzM2MS0wLjMyNi0wLjA4MDYtMC4xNTAxLTAuMTIwOS0wLjM0OTUtMC4xMjA5LTAuNTk4MXYtMy41NzIzem02LjI3MTggMy42Njk3di0yLjc3OTFoMC44MTMzdjMuNjM2aC0wLjc2NjJsLTAuMDQ3MS0wLjg1Njl6bTAuMTE0My0wLjc1NjEgMC4yNzIyLTAuMDA2N2MwIDAuMjQ0Mi0wLjAyNjkgMC40NjkzLTAuMDgwNyAwLjY3NTQtMC4wNTM3IDAuMjAzOS0wLjEzNjYgMC4zODItMC4yNDg2IDAuNTM0NC0wLjExMjEgMC4xNTAxLTAuMjU1NCAwLjI2NzctMC40MzAyIDAuMzUyOC0wLjE3NDcgMC4wODI5LTAuMzg0MiAwLjEyNDQtMC42Mjg0IDAuMTI0NC0wLjE3NyAwLTAuMzM5NC0wLjAyNTgtMC40ODczLTAuMDc3My0wLjE0NzgtMC4wNTE2LTAuMjc1NS0wLjEzMTEtMC4zODMxLTAuMjM4Ni0wLjEwNTMtMC4xMDc2LTAuMTg3MS0wLjI0NzYtMC4yNDUzLTAuNDIwMS0wLjA1ODMtMC4xNzI1LTAuMDg3NC0wLjM3ODYtMC4wODc0LTAuNjE4M3YtMi4zNDloMC44MDk5djIuMzU1N2MwIDAuMTMyMiAwLjAxNTcgMC4yNDMxIDAuMDQ3MSAwLjMzMjcgMC4wMzEzIDAuMDg3NCAwLjA3MzkgMC4xNTc5IDAuMTI3NyAwLjIxMTcgMC4wNTM3IDAuMDUzOCAwLjExNjUgMC4wOTE4IDAuMTg4MSAwLjExNDMgMC4wNzE3IDAuMDIyNCAwLjE0NzkgMC4wMzM2IDAuMjI4NiAwLjAzMzYgMC4yMzA3IDAgMC40MTIyLTAuMDQ0OSAwLjU0NDQtMC4xMzQ1IDAuMTM0NC0wLjA5MTggMC4yMjk2LTAuMjE1IDAuMjg1Ni0wLjM2OTYgMC4wNTgzLTAuMTU0NiAwLjA4NzQtMC4zMjgyIDAuMDg3NC0wLjUyMDl6bTIuNDg1Ny0xLjMyNHY0LjMzNWgtMC44MDk5di01LjAzNGgwLjc0NmwwLjA2MzkgMC42OTl6bTIuMzY5MSAxLjA4NTR2MC4wNzA2YzAgMC4yNjQzLTAuMDMxMyAwLjUwOTctMC4wOTQxIDAuNzM1OS0wLjA2MDUgMC4yMjQxLTAuMTUxMiAwLjQyMDEtMC4yNzIyIDAuNTg4MS0wLjExODcgMC4xNjU4LTAuMjY1NSAwLjI5NDYtMC40NDAyIDAuMzg2NS0wLjE3NDggMC4wOTE4LTAuMzc2NCAwLjEzNzgtMC42MDQ5IDAuMTM3OC0wLjIyNjMgMC0wLjQyNDUtMC4wNDE1LTAuNTk0OC0wLjEyNDQtMC4xNjgtMC4wODUxLTAuMzEwMy0wLjIwNS0wLjQyNjgtMC4zNTk2LTAuMTE2NS0wLjE1NDUtMC4yMTA2LTAuMzM2LTAuMjgyMy0wLjU0NDQtMC4wNjk0LTAuMjEwNi0wLjExODctMC40NDEzLTAuMTQ3OC0wLjY5MjJ2LTAuMjcyMmMwLjAyOTEtMC4yNjY2IDAuMDc4NC0wLjUwODYgMC4xNDc4LTAuNzI1OSAwLjA3MTctMC4yMTczIDAuMTY1OC0wLjQwNDQgMC4yODIzLTAuNTYxMnMwLjI1ODgtMC4yNzc4IDAuNDI2OC0wLjM2MjljMC4xNjgtMC4wODUyIDAuMzY0LTAuMTI3NyAwLjU4ODEtMC4xMjc3IDAuMjI4NSAwIDAuNDMxMiAwLjA0NDggMC42MDgyIDAuMTM0NCAwLjE3NyAwLjA4NzMgMC4zMjYgMC4yMTI4IDAuNDQ3IDAuMzc2NCAwLjEyMSAwLjE2MTMgMC4yMTE3IDAuMzU2MiAwLjI3MjIgMC41ODQ3IDAuMDYwNSAwLjIyNjMgMC4wOTA3IDAuNDc4MyAwLjA5MDcgMC43NTYxem0tMC44MDk5IDAuMDcwNnYtMC4wNzA2YzAtMC4xNjgtMC4wMTU2LTAuMzIzNy0wLjA0Ny0wLjQ2NzEtMC4wMzE0LTAuMTQ1Ni0wLjA4MDctMC4yNzMzLTAuMTQ3OS0wLjM4MzFzLTAuMTUzNC0wLjE5NDktMC4yNTg3LTAuMjU1NGMtMC4xMDMxLTAuMDYyNy0wLjIyNzQtMC4wOTQxLTAuMzczMS0wLjA5NDEtMC4xNDMzIDAtMC4yNjY2IDAuMDI0Ni0wLjM2OTYgMC4wNzM5LTAuMTAzMSAwLjA0NzEtMC4xODkzIDAuMTEzMi0wLjI1ODggMC4xOTgzLTAuMDY5NCAwLjA4NTEtMC4xMjMyIDAuMTg0OC0wLjE2MTMgMC4yOTkxLTAuMDM4MSAwLjExMi0wLjA2NDkgMC4yMzQxLTAuMDgwNiAwLjM2NjN2MC42NTE5YzAuMDI2OSAwLjE2MTMgMC4wNzI4IDAuMzA5MiAwLjEzNzggMC40NDM2IDAuMDY0OSAwLjEzNDQgMC4xNTY4IDAuMjQyIDAuMjc1NSAwLjMyMjYgMC4xMjEgMC4wNzg0IDAuMjc1NiAwLjExNzYgMC40NjM4IDAuMTE3NiAwLjE0NTYgMCAwLjI2OTktMC4wMzEzIDAuMzczLTAuMDk0MSAwLjEwMy0wLjA2MjcgMC4xODcxLTAuMTQ4OSAwLjI1Mi0wLjI1ODcgMC4wNjcyLTAuMTEyIDAuMTE2NS0wLjI0MDkgMC4xNDc5LTAuMzg2NXMwLjA0Ny0wLjMwMDIgMC4wNDctMC40NjM3em0zLjg2MDIgMS4wMjgzdi00LjQwOWgwLjgxMzJ2NS4xNjE3aC0wLjczNTlsLTAuMDc3My0wLjc1Mjd6bS0yLjM2NTktMS4wMjV2LTAuMDcwNWMwLTAuMjc1NiAwLjAzMjUtMC41MjY1IDAuMDk3NS0wLjc1MjggMC4wNjUtMC4yMjg1IDAuMTU5MS0wLjQyNDUgMC4yODIzLTAuNTg4MSAwLjEyMzItMC4xNjU4IDAuMjczMy0wLjI5MjQgMC40NTAzLTAuMzc5NyAwLjE3Ny0wLjA4OTYgMC4zNzY0LTAuMTM0NCAwLjU5ODItMC4xMzQ0IDAuMjE5NSAwIDAuNDEyMiAwLjA0MjUgMC41NzggMC4xMjc3IDAuMTY1OCAwLjA4NTEgMC4zMDY5IDAuMjA3MiAwLjQyMzQgMC4zNjYyIDAuMTE2NSAwLjE1NjkgMC4yMDk1IDAuMzQ1MSAwLjI3ODkgMC41NjQ2IDAuMDY5NSAwLjIxNzMgMC4xMTg4IDAuNDU5MyAwLjE0NzkgMC43MjU5djAuMjI1MWMtMC4wMjkxIDAuMjU5OS0wLjA3ODQgMC40OTc0LTAuMTQ3OSAwLjcxMjUtMC4wNjk0IDAuMjE1LTAuMTYyNCAwLjQwMS0wLjI3ODkgMC41NTc4cy0wLjI1ODggMC4yNzc4LTAuNDI2OCAwLjM2M2MtMC4xNjU4IDAuMDg1MS0wLjM1OTYgMC4xMjc3LTAuNTgxMyAwLjEyNzctMC4yMTk2IDAtMC40MTc5LTAuMDQ2LTAuNTk0OS0wLjEzNzgtMC4xNzQ3LTAuMDkxOS0wLjMyMzctMC4yMjA3LTAuNDQ2OS0wLjM4NjVzLTAuMjE3My0wLjM2MDctMC4yODIzLTAuNTg0N2MtMC4wNjUtMC4yMjYzLTAuMDk3NS0wLjQ3MTYtMC4wOTc1LTAuNzM2em0wLjgwOTktMC4wNzA1djAuMDcwNWMwIDAuMTY1OCAwLjAxNDYgMC4zMjA0IDAuMDQzNyAwLjQ2MzggMC4wMzE0IDAuMTQzNCAwLjA3OTYgMC4yNjk5IDAuMTQ0NSAwLjM3OTcgMC4wNjUgMC4xMDc2IDAuMTQ5IDAuMTkyNyAwLjI1MjEgMC4yNTU0IDAuMTA1MyAwLjA2MDUgMC4yMzA3IDAuMDkwOCAwLjM3NjMgMC4wOTA4IDAuMTgzOCAwIDAuMzM1LTAuMDQwNCAwLjQ1MzctMC4xMjEgMC4xMTg4LTAuMDgwNyAwLjIxMTctMC4xODkzIDAuMjc4OS0wLjMyNiAwLjA2OTUtMC4xMzg5IDAuMTE2NS0wLjI5MzUgMC4xNDEyLTAuNDYzN3YtMC42MDgzYy0wLjAxMzUtMC4xMzIyLTAuMDQxNS0wLjI1NTQtMC4wODQtMC4zNjk3LTAuMDQwNC0wLjExNDItMC4wOTUyLTAuMjEzOS0wLjE2NDctMC4yOTktMC4wNjk1LTAuMDg3NC0wLjE1NTctMC4xNTQ2LTAuMjU4OC0wLjIwMTctMC4xMDA4LTAuMDQ5My0wLjIyMDYtMC4wNzM5LTAuMzU5NS0wLjA3MzktMC4xNDc5IDAtMC4yNzM0IDAuMDMxNC0wLjM3NjQgMC4wOTQxLTAuMTAzMSAwLjA2MjctMC4xODgyIDAuMTQ5LTAuMjU1NCAwLjI1ODctMC4wNjUgMC4xMDk4LTAuMTEzMiAwLjIzNzUtMC4xNDQ1IDAuMzgzMS0wLjAzMTQgMC4xNDU3LTAuMDQ3MSAwLjMwMTQtMC4wNDcxIDAuNDY3MnptNS40MDk0IDEuMTE5di0xLjczNGMwLTAuMTMtMC4wMjM2LTAuMjQyLTAuMDcwNi0wLjMzNjEtMC4wNDcxLTAuMDk0MS0wLjExODgtMC4xNjY5LTAuMjE1MS0wLjIxODQtMC4wOTQxLTAuMDUxNS0wLjIxMjgtMC4wNzczLTAuMzU2Mi0wLjA3NzMtMC4xMzIyIDAtMC4yNDY0IDAuMDIyNC0wLjM0MjggMC4wNjcyLTAuMDk2MyAwLjA0NDgtMC4xNzE0IDAuMTA1My0wLjIyNTEgMC4xODE1LTAuMDUzOCAwLjA3NjItMC4wODA3IDAuMTYyNC0wLjA4MDcgMC4yNTg3aC0wLjgwNjVjMC0wLjE0MzMgMC4wMzQ3LTAuMjgyMiAwLjEwNDItMC40MTY3IDAuMDY5NC0wLjEzNDQgMC4xNzAyLTAuMjU0MiAwLjMwMjQtMC4zNTk1czAuMjkwMS0wLjE4ODIgMC40NzM4LTAuMjQ4N2MwLjE4MzgtMC4wNjA1IDAuMzg5OS0wLjA5MDcgMC42MTg0LTAuMDkwNyAwLjI3MzMgMCAwLjUxNTMgMC4wNDU5IDAuNzI1OSAwLjEzNzcgMC4yMTI4IDAuMDkxOSAwLjM3OTcgMC4yMzA4IDAuNTAwNyAwLjQxNjcgMC4xMjMyIDAuMTgzNyAwLjE4NDggMC40MTQ1IDAuMTg0OCAwLjY5MjN2MS42MTY0YzAgMC4xNjU4IDAuMDExMiAwLjMxNDggMC4wMzM2IDAuNDQ3IDAuMDI0NyAwLjEyOTkgMC4wNTk0IDAuMjQzIDAuMTA0MiAwLjMzOTR2MC4wNTM3aC0wLjgzMDFjLTAuMDM4LTAuMDg3My0wLjA2ODMtMC4xOTgyLTAuMDkwNy0wLjMzMjYtMC4wMjAyLTAuMTM2Ny0wLjAzMDItMC4yNjg5LTAuMDMwMi0wLjM5NjZ6bTAuMTE3Ni0xLjQ4MiAwLjAwNjcgMC41MDA3aC0wLjU4MTRjLTAuMTUwMSAwLTAuMjgyMyAwLjAxNDYtMC4zOTY1IDAuMDQzNy0wLjExNDMgMC4wMjY5LTAuMjA5NSAwLjA2NzItMC4yODU3IDAuMTIxLTAuMDc2MSAwLjA1MzgtMC4xMzMzIDAuMTE4Ny0wLjE3MTMgMC4xOTQ5LTAuMDM4MSAwLjA3NjItMC4wNTcyIDAuMTYyNC0wLjA1NzIgMC4yNTg4IDAgMC4wOTYzIDAuMDIyNCAwLjE4NDggMC4wNjcyIDAuMjY1NSAwLjA0NDggMC4wNzg0IDAuMTA5OCAwLjE0IDAuMTk0OSAwLjE4NDggMC4wODc0IDAuMDQ0OCAwLjE5MjcgMC4wNjcyIDAuMzE1OSAwLjA2NzIgMC4xNjU4IDAgMC4zMTAzLTAuMDMzNiAwLjQzMzUtMC4xMDA4IDAuMTI1NS0wLjA2OTUgMC4yMjQxLTAuMTUzNSAwLjI5NTgtMC4yNTIxIDAuMDcxNy0wLjEwMDggMC4xMDk3LTAuMTk2IDAuMTE0Mi0wLjI4NTZsMC4yNjIxIDAuMzU5NmMtMC4wMjY4IDAuMDkxOC0wLjA3MjggMC4xOTA0LTAuMTM3NyAwLjI5NTctMC4wNjUgMC4xMDUzLTAuMTUwMSAwLjIwNjEtMC4yNTU0IDAuMzAyNC0wLjEwMzEgMC4wOTQxLTAuMjI3NCAwLjE3MTQtMC4zNzMxIDAuMjMxOS0wLjE0MzMgMC4wNjA1LTAuMzA5MSAwLjA5MDgtMC40OTczIDAuMDkwOC0wLjIzNzUgMC0wLjQ0OTItMC4wNDcxLTAuNjM1MS0wLjE0MTItMC4xODYtMC4wOTYzLTAuMzMxNi0wLjIyNTEtMC40MzY5LTAuMzg2NC0wLjEwNTMtMC4xNjM2LTAuMTU4LTAuMzQ4NC0wLjE1OC0wLjU1NDUgMC0wLjE5MjcgMC4wMzU5LTAuMzYzIDAuMTA3Ni0wLjUxMDggMC4wNzM5LTAuMTUwMSAwLjE4MTQtMC4yNzU2IDAuMzIyNi0wLjM3NjQgMC4xNDM0LTAuMTAwOCAwLjMxODEtMC4xNzcgMC41MjQyLTAuMjI4NSAwLjIwNjEtMC4wNTM4IDAuNDQxNC0wLjA4MDcgMC43MDU3LTAuMDgwN2gwLjYzNTJ6bTMuMzUyNy0xLjQyNDh2MC41OTE0aC0yLjA1di0wLjU5MTRoMi4wNXptLTEuNDU4NS0wLjg5MDZoMC44MDk5djMuNTIxOWMwIDAuMTEyIDAuMDE1NyAwLjE5ODIgMC4wNDcgMC4yNTg3IDAuMDMzNiAwLjA1ODMgMC4wNzk2IDAuMDk3NSAwLjEzNzggMC4xMTc2IDAuMDU4MyAwLjAyMDIgMC4xMjY2IDAuMDMwMyAwLjIwNSAwLjAzMDMgMC4wNTYgMCAwLjEwOTgtMC4wMDM0IDAuMTYxMy0wLjAxMDFzMC4wOTMtMC4wMTM0IDAuMTI0My0wLjAyMDJsMC4wMDM0IDAuNjE4NGMtMC4wNjcyIDAuMDIwMS0wLjE0NTYgMC4wMzgxLTAuMjM1MiAwLjA1MzctMC4wODc0IDAuMDE1Ny0wLjE4ODIgMC4wMjM2LTAuMzAyNSAwLjAyMzYtMC4xODU5IDAtMC4zNTA2LTAuMDMyNS0wLjQ5NC0wLjA5NzUtMC4xNDM0LTAuMDY3Mi0wLjI1NTQtMC4xNzU5LTAuMzM2LTAuMzI2LTAuMDgwNy0wLjE1MDEtMC4xMjEtMC4zNDk1LTAuMTIxLTAuNTk4MXYtMy41NzIzem0zLjgyOTkgNC41OTM5Yy0wLjI2ODkgMC0wLjUxMi0wLjA0MzctMC43MjkzLTAuMTMxMS0wLjIxNS0wLjA4OTYtMC4zOTg3LTAuMjE0LTAuNTUxMS0wLjM3My0wLjE1MDEtMC4xNTkxLTAuMjY1NS0wLjM0NjItMC4zNDYxLTAuNTYxMi0wLjA4MDctMC4yMTUxLTAuMTIxLTAuNDQ3LTAuMTIxLTAuNjk1N3YtMC4xMzQ0YzAtMC4yODQ1IDAuMDQxNC0wLjU0MjEgMC4xMjQzLTAuNzcyOXMwLjE5ODMtMC40Mjc5IDAuMzQ2Mi0wLjU5MTRjMC4xNDc4LTAuMTY1OCAwLjMyMjYtMC4yOTI0IDAuNTI0Mi0wLjM3OThzMC40MjAxLTAuMTMxIDAuNjU1My0wLjEzMWMwLjI1OTkgMCAwLjQ4NzMgMC4wNDM2IDAuNjgyMiAwLjEzMXMwLjM1NjIgMC4yMTA2IDAuNDgzOSAwLjM2OTdjMC4xMyAwLjE1NjggMC4yMjYzIDAuMzQzOSAwLjI4OSAwLjU2MTIgMC4wNjUgMC4yMTczIDAuMDk3NSAwLjQ1NyAwLjA5NzUgMC43MTkxdjAuMzQ2MmgtMi44MDk0di0wLjU4MTRoMi4wMDk2di0wLjA2MzljLTAuMDA0NS0wLjE0NTYtMC4wMzM2LTAuMjgyMi0wLjA4NzQtMC40MDk5LTAuMDUxNS0wLjEyNzctMC4xMzExLTAuMjMwOC0wLjIzODYtMC4zMDkycy0wLjI1MDktMC4xMTc2LTAuNDMwMS0wLjExNzZjLTAuMTM0NSAwLTAuMjU0MyAwLjAyOTEtMC4zNTk2IDAuMDg3My0wLjEwMzEgMC4wNTYxLTAuMTg5MyAwLjEzNzgtMC4yNTg4IDAuMjQ1NC0wLjA2OTQgMC4xMDc1LTAuMTIzMiAwLjIzNzQtMC4xNjEzIDAuMzg5OC0wLjAzNTggMC4xNTAxLTAuMDUzOCAwLjMxOTItMC4wNTM4IDAuNTA3NHYwLjEzNDRjMCAwLjE1OTEgMC4wMjEzIDAuMzA3IDAuMDYzOSAwLjQ0MzYgMC4wNDQ4IDAuMTM0NSAwLjEwOTggMC4yNTIxIDAuMTk0OSAwLjM1MjlzMC4xODgyIDAuMTgwMyAwLjMwOTIgMC4yMzg2YzAuMTIwOSAwLjA1NiAwLjI1ODcgMC4wODQgMC40MTMzIDAuMDg0IDAuMTk0OSAwIDAuMzY4Ni0wLjAzOTIgMC41MjA5LTAuMTE3NnMwLjI4NDUtMC4xODkzIDAuMzk2NS0wLjMzMjdsMC40MjY4IDAuNDEzM2MtMC4wNzg0IDAuMTE0My0wLjE4MDMgMC4yMjQxLTAuMzA1OCAwLjMyOTQtMC4xMjU0IDAuMTAzLTAuMjc4OSAwLjE4Ny0wLjQ2MDQgMC4yNTItMC4xNzkyIDAuMDY1LTAuMzg3NiAwLjA5NzUtMC42MjUgMC4wOTc1em02LjI1MTctNC45Nzd2NC45MDk3aC0wLjgwOTl2LTMuOTQ4NmwtMS4xOTk3IDAuNDA2N3YtMC42Njg4bDEuOTEyMS0wLjY5OWgwLjA5NzV6bTQuMTA4OCA0LjE1N3YtNC40MDloMC44MTMydjUuMTYxN2gtMC43MzU5bC0wLjA3NzMtMC43NTI3em0tMi4zNjU4LTEuMDI1di0wLjA3MDVjMC0wLjI3NTYgMC4wMzI0LTAuNTI2NSAwLjA5NzQtMC43NTI4IDAuMDY1LTAuMjI4NSAwLjE1OTEtMC40MjQ1IDAuMjgyMy0wLjU4ODEgMC4xMjMyLTAuMTY1OCAwLjI3MzMtMC4yOTI0IDAuNDUwMy0wLjM3OTcgMC4xNzctMC4wODk2IDAuMzc2NC0wLjEzNDQgMC41OTgyLTAuMTM0NCAwLjIxOTUgMCAwLjQxMjIgMC4wNDI1IDAuNTc4IDAuMTI3NyAwLjE2NTggMC4wODUxIDAuMzA2OSAwLjIwNzIgMC40MjM0IDAuMzY2MiAwLjExNjUgMC4xNTY5IDAuMjA5NSAwLjM0NTEgMC4yNzg5IDAuNTY0NiAwLjA2OTUgMC4yMTczIDAuMTE4OCAwLjQ1OTMgMC4xNDc5IDAuNzI1OXYwLjIyNTFjLTAuMDI5MSAwLjI1OTktMC4wNzg0IDAuNDk3NC0wLjE0NzkgMC43MTI1LTAuMDY5NCAwLjIxNS0wLjE2MjQgMC40MDEtMC4yNzg5IDAuNTU3OHMtMC4yNTg3IDAuMjc3OC0wLjQyNjggMC4zNjNjLTAuMTY1OCAwLjA4NTEtMC4zNTk1IDAuMTI3Ny0wLjU4MTMgMC4xMjc3LTAuMjE5NiAwLTAuNDE3OS0wLjA0Ni0wLjU5NDktMC4xMzc4LTAuMTc0Ny0wLjA5MTktMC4zMjM3LTAuMjIwNy0wLjQ0NjktMC4zODY1cy0wLjIxNzMtMC4zNjA3LTAuMjgyMy0wLjU4NDdjLTAuMDY1LTAuMjI2My0wLjA5NzQtMC40NzE2LTAuMDk3NC0wLjczNnptMC44MDk4LTAuMDcwNXYwLjA3MDVjMCAwLjE2NTggMC4wMTQ2IDAuMzIwNCAwLjA0MzcgMC40NjM4IDAuMDMxNCAwLjE0MzQgMC4wNzk2IDAuMjY5OSAwLjE0NDUgMC4zNzk3IDAuMDY1IDAuMTA3NiAwLjE0OSAwLjE5MjcgMC4yNTIxIDAuMjU1NCAwLjEwNTMgMC4wNjA1IDAuMjMwNyAwLjA5MDggMC4zNzYzIDAuMDkwOCAwLjE4MzggMCAwLjMzNS0wLjA0MDQgMC40NTM3LTAuMTIxIDAuMTE4OC0wLjA4MDcgMC4yMTE3LTAuMTg5MyAwLjI3ODktMC4zMjYgMC4wNjk1LTAuMTM4OSAwLjExNjUtMC4yOTM1IDAuMTQxMi0wLjQ2Mzd2LTAuNjA4M2MtMC4wMTM1LTAuMTMyMi0wLjA0MTUtMC4yNTU0LTAuMDg0LTAuMzY5Ny0wLjA0MDQtMC4xMTQyLTAuMDk1Mi0wLjIxMzktMC4xNjQ3LTAuMjk5LTAuMDY5NC0wLjA4NzQtMC4xNTU3LTAuMTU0Ni0wLjI1ODgtMC4yMDE3LTAuMTAwOC0wLjA0OTMtMC4yMjA2LTAuMDczOS0wLjM1OTUtMC4wNzM5LTAuMTQ3OSAwLTAuMjczNCAwLjAzMTQtMC4zNzY0IDAuMDk0MS0wLjEwMzEgMC4wNjI3LTAuMTg4MiAwLjE0OS0wLjI1NTQgMC4yNTg3LTAuMDY1IDAuMTA5OC0wLjExMzEgMC4yMzc1LTAuMTQ0NSAwLjM4MzEtMC4wMzE0IDAuMTQ1Ny0wLjA0NzEgMC4zMDE0LTAuMDQ3MSAwLjQ2NzJ6bTcuMjY2NiAxLjExOXYtMS43MzRjMC0wLjEzLTAuMDIzNS0wLjI0Mi0wLjA3MDYtMC4zMzYxLTAuMDQ3LTAuMDk0MS0wLjExODctMC4xNjY5LTAuMjE1LTAuMjE4NC0wLjA5NDEtMC4wNTE1LTAuMjEyOS0wLjA3NzMtMC4zNTYyLTAuMDc3My0wLjEzMjIgMC0wLjI0NjUgMC4wMjI0LTAuMzQyOCAwLjA2NzItMC4wOTY0IDAuMDQ0OC0wLjE3MTQgMC4xMDUzLTAuMjI1MiAwLjE4MTUtMC4wNTM3IDAuMDc2Mi0wLjA4MDYgMC4xNjI0LTAuMDgwNiAwLjI1ODdoLTAuODA2NmMwLTAuMTQzMyAwLjAzNDgtMC4yODIyIDAuMTA0Mi0wLjQxNjcgMC4wNjk1LTAuMTM0NCAwLjE3MDMtMC4yNTQyIDAuMzAyNS0wLjM1OTUgMC4xMzIxLTAuMTA1MyAwLjI5MDEtMC4xODgyIDAuNDczOC0wLjI0ODdzMC4zODk4LTAuMDkwNyAwLjYxODMtMC4wOTA3YzAuMjczNCAwIDAuNTE1MyAwLjA0NTkgMC43MjU5IDAuMTM3NyAwLjIxMjggMC4wOTE5IDAuMzc5OCAwLjIzMDggMC41MDA3IDAuNDE2NyAwLjEyMzIgMC4xODM3IDAuMTg0OSAwLjQxNDUgMC4xODQ5IDAuNjkyM3YxLjYxNjRjMCAwLjE2NTggMC4wMTEyIDAuMzE0OCAwLjAzMzYgMC40NDcgMC4wMjQ2IDAuMTI5OSAwLjA1OTMgMC4yNDMgMC4xMDQxIDAuMzM5NHYwLjA1MzdoLTAuODNjLTAuMDM4MS0wLjA4NzMtMC4wNjgzLTAuMTk4Mi0wLjA5MDctMC4zMzI2LTAuMDIwMi0wLjEzNjctMC4wMzAzLTAuMjY4OS0wLjAzMDMtMC4zOTY2em0wLjExNzYtMS40ODIgMC4wMDY4IDAuNTAwN2gtMC41ODE0Yy0wLjE1MDEgMC0wLjI4MjMgMC4wMTQ2LTAuMzk2NiAwLjA0MzctMC4xMTQyIDAuMDI2OS0wLjIwOTQgMC4wNjcyLTAuMjg1NiAwLjEyMXMtMC4xMzMzIDAuMTE4Ny0wLjE3MTQgMC4xOTQ5LTAuMDU3MSAwLjE2MjQtMC4wNTcxIDAuMjU4OGMwIDAuMDk2MyAwLjAyMjQgMC4xODQ4IDAuMDY3MiAwLjI2NTUgMC4wNDQ4IDAuMDc4NCAwLjEwOTggMC4xNCAwLjE5NDkgMC4xODQ4IDAuMDg3NCAwLjA0NDggMC4xOTI3IDAuMDY3MiAwLjMxNTkgMC4wNjcyIDAuMTY1OCAwIDAuMzEwMy0wLjAzMzYgMC40MzM1LTAuMTAwOCAwLjEyNTUtMC4wNjk1IDAuMjI0LTAuMTUzNSAwLjI5NTctMC4yNTIxIDAuMDcxNy0wLjEwMDggMC4xMDk4LTAuMTk2IDAuMTE0My0wLjI4NTZsMC4yNjIxIDAuMzU5NmMtMC4wMjY5IDAuMDkxOC0wLjA3MjggMC4xOTA0LTAuMTM3OCAwLjI5NTdzLTAuMTUwMSAwLjIwNjEtMC4yNTU0IDAuMzAyNGMtMC4xMDMgMC4wOTQxLTAuMjI3NCAwLjE3MTQtMC4zNzMgMC4yMzE5LTAuMTQzNCAwLjA2MDUtMC4zMDkyIDAuMDkwOC0wLjQ5NzQgMC4wOTA4LTAuMjM3NCAwLTAuNDQ5MS0wLjA0NzEtMC42MzUxLTAuMTQxMi0wLjE4NTktMC4wOTYzLTAuMzMxNi0wLjIyNTEtMC40MzY5LTAuMzg2NC0wLjEwNTMtMC4xNjM2LTAuMTU3OS0wLjM0ODQtMC4xNTc5LTAuNTU0NSAwLTAuMTkyNyAwLjAzNTgtMC4zNjMgMC4xMDc1LTAuNTEwOCAwLjA3NC0wLjE1MDEgMC4xODE1LTAuMjc1NiAwLjMyMjYtMC4zNzY0IDAuMTQzNC0wLjEwMDggMC4zMTgyLTAuMTc3IDAuNTI0My0wLjIyODUgMC4yMDYxLTAuMDUzOCAwLjQ0MTMtMC4wODA3IDAuNzA1Ny0wLjA4MDdoMC42MzUxem00LjAxNDktMS40MjQ4aDAuNzM2djMuNTM1MmMwIDAuMzI3MS0wLjA3IDAuNjA0OS0wLjIwOSAwLjgzMzQtMC4xMzggMC4yMjg2LTAuMzMyIDAuNDAyMi0wLjU4MSAwLjUyMDktMC4yNDkgMC4xMjEtMC41MzYgMC4xODE1LTAuODY0IDAuMTgxNS0wLjEzOCAwLTAuMjkzLTAuMDIwMi0wLjQ2My0wLjA2MDUtMC4xNjgtMC4wNDAzLTAuMzMyLTAuMTA1My0wLjQ5MS0wLjE5NDktMC4xNTctMC4wODc0LTAuMjg4LTAuMjAyOC0wLjM5My0wLjM0NjFsMC4zOC0wLjQ3NzJjMC4xMyAwLjE1NDUgMC4yNzMgMC4yNjc3IDAuNDMgMC4zMzk0czAuMzIxIDAuMTA3NSAwLjQ5NCAwLjEwNzVjMC4xODYgMCAwLjM0NC0wLjAzNDcgMC40NzQtMC4xMDQyIDAuMTMyLTAuMDY3MiAwLjIzNC0wLjE2NjkgMC4zMDUtMC4yOTkgMC4wNzItMC4xMzIyIDAuMTA4LTAuMjkzNSAwLjEwOC0wLjQ4NHYtMi43Mjg3bDAuMDc0LTAuODIzM3ptLTIuNDcgMS44NTgzdi0wLjA3MDVjMC0wLjI3NTYgMC4wMzMtMC41MjY1IDAuMTAxLTAuNzUyOCAwLjA2Ny0wLjIyODUgMC4xNjMtMC40MjQ1IDAuMjg5LTAuNTg4MSAwLjEyNS0wLjE2NTggMC4yNzctMC4yOTI0IDAuNDU3LTAuMzc5NyAwLjE3OS0wLjA4OTYgMC4zODItMC4xMzQ0IDAuNjA4LTAuMTM0NCAwLjIzNSAwIDAuNDM2IDAuMDQyNSAwLjYwMSAwLjEyNzcgMC4xNjkgMC4wODUxIDAuMzA5IDAuMjA3MiAwLjQyMSAwLjM2NjIgMC4xMTIgMC4xNTY5IDAuMTk5IDAuMzQ1MSAwLjI2MiAwLjU2NDYgMC4wNjUgMC4yMTczIDAuMTEzIDAuNDU5MyAwLjE0NCAwLjcyNTl2MC4yMjUxYy0wLjAyOSAwLjI1OTktMC4wNzggMC40OTc0LTAuMTQ4IDAuNzEyNS0wLjA2OSAwLjIxNS0wLjE2MSAwLjQwMS0wLjI3NSAwLjU1NzgtMC4xMTUgMC4xNTY4LTAuMjU2IDAuMjc3OC0wLjQyNCAwLjM2My0wLjE2NSAwLjA4NTEtMC4zNjEgMC4xMjc3LTAuNTg4IDAuMTI3Ny0wLjIyMiAwLTAuNDIyLTAuMDQ2LTAuNjAxLTAuMTM3OC0wLjE3Ny0wLjA5MTktMC4zMy0wLjIyMDctMC40NTctMC4zODY1LTAuMTI2LTAuMTY1OC0wLjIyMi0wLjM2MDctMC4yODktMC41ODQ3LTAuMDY4LTAuMjI2My0wLjEwMS0wLjQ3MTYtMC4xMDEtMC43MzZ6bTAuODEtMC4wNzA1djAuMDcwNWMwIDAuMTY1OCAwLjAxNSAwLjMyMDQgMC4wNDcgMC40NjM4IDAuMDMzIDAuMTQzNCAwLjA4NCAwLjI2OTkgMC4xNTEgMC4zNzk3IDAuMDY5IDAuMTA3NiAwLjE1NyAwLjE5MjcgMC4yNjIgMC4yNTU0IDAuMTA4IDAuMDYwNSAwLjIzNCAwLjA5MDggMC4zOCAwLjA5MDggMC4xOSAwIDAuMzQ2LTAuMDQwNCAwLjQ2Ny0wLjEyMSAwLjEyMy0wLjA4MDcgMC4yMTctMC4xODkzIDAuMjgyLTAuMzI2IDAuMDY3LTAuMTM4OSAwLjExNS0wLjI5MzUgMC4xNDEtMC40NjM3di0wLjYwODNjLTAuMDEzLTAuMTMyMi0wLjA0MS0wLjI1NTQtMC4wODQtMC4zNjk3LTAuMDQtMC4xMTQyLTAuMDk1LTAuMjEzOS0wLjE2NC0wLjI5OS0wLjA3LTAuMDg3NC0wLjE1Ny0wLjE1NDYtMC4yNjItMC4yMDE3LTAuMTA2LTAuMDQ5My0wLjIzLTAuMDczOS0wLjM3My0wLjA3MzktMC4xNDYgMC0wLjI3MyAwLjAzMTQtMC4zOCAwLjA5NDEtMC4xMDggMC4wNjI3LTAuMTk2IDAuMTQ5LTAuMjY2IDAuMjU4Ny0wLjA2NyAwLjEwOTgtMC4xMTcgMC4yMzc1LTAuMTUxIDAuMzgzMS0wLjAzMyAwLjE0NTctMC4wNSAwLjMwMTQtMC4wNSAwLjQ2NzJ6bTMuMjI1IDAuMDcwNXYtMC4wNzczYzAtMC4yNjIxIDAuMDM4LTAuNTA1MiAwLjExNC0wLjcyOTIgMC4wNzYtMC4yMjYzIDAuMTg2LTAuNDIyMyAwLjMyOS0wLjU4ODEgMC4xNDYtMC4xNjggMC4zMjMtMC4yOTggMC41MzEtMC4zODk4IDAuMjExLTAuMDk0MSAwLjQ0OC0wLjE0MTEgMC43MTMtMC4xNDExIDAuMjY2IDAgMC41MDQgMC4wNDcgMC43MTIgMC4xNDExIDAuMjExIDAuMDkxOCAwLjM4OSAwLjIyMTggMC41MzQgMC4zODk4IDAuMTQ2IDAuMTY1OCAwLjI1NyAwLjM2MTggMC4zMzMgMC41ODgxIDAuMDc2IDAuMjI0IDAuMTE0IDAuNDY3MSAwLjExNCAwLjcyOTJ2MC4wNzczYzAgMC4yNjIyLTAuMDM4IDAuNTA1Mi0wLjExNCAwLjcyOTMtMC4wNzYgMC4yMjQtMC4xODcgMC40Mi0wLjMzMyAwLjU4ODEtMC4xNDUgMC4xNjU3LTAuMzIyIDAuMjk1Ny0wLjUzMSAwLjM4OTgtMC4yMDggMC4wOTE4LTAuNDQ0IDAuMTM3OC0wLjcwOSAwLjEzNzgtMC4yNjYgMC0wLjUwNS0wLjA0Ni0wLjcxNS0wLjEzNzgtMC4yMDktMC4wOTQxLTAuMzg2LTAuMjI0MS0wLjUzMS0wLjM4OTgtMC4xNDYtMC4xNjgxLTAuMjU3LTAuMzY0MS0wLjMzMy0wLjU4ODEtMC4wNzYtMC4yMjQxLTAuMTE0LTAuNDY3MS0wLjExNC0wLjcyOTN6bTAuODEtMC4wNzczdjAuMDc3M2MwIDAuMTYzNiAwLjAxNiAwLjMxODIgMC4wNSAwLjQ2MzhzMC4wODYgMC4yNzMzIDAuMTU4IDAuMzgzMSAwLjE2NCAwLjE5NiAwLjI3NiAwLjI1ODdjMC4xMTIgMC4wNjI4IDAuMjQ1IDAuMDk0MSAwLjM5OSAwLjA5NDEgMC4xNTEgMCAwLjI4LTAuMDMxMyAwLjM5LTAuMDk0MSAwLjExMi0wLjA2MjcgMC4yMDQtMC4xNDg5IDAuMjc2LTAuMjU4N3MwLjEyNC0wLjIzNzUgMC4xNTgtMC4zODMxYzAuMDM2LTAuMTQ1NiAwLjA1NC0wLjMwMDIgMC4wNTQtMC40NjM4di0wLjA3NzNjMC0wLjE2MTMtMC4wMTgtMC4zMTM2LTAuMDU0LTAuNDU3LTAuMDM0LTAuMTQ1Ni0wLjA4OC0wLjI3NDQtMC4xNjItMC4zODY1LTAuMDcxLTAuMTEyLTAuMTYzLTAuMTk5My0wLjI3NS0wLjI2MjEtMC4xMS0wLjA2NDktMC4yNDEtMC4wOTc0LTAuMzkzLTAuMDk3NC0wLjE1MyAwLTAuMjg1IDAuMDMyNS0wLjM5NyAwLjA5NzQtMC4xMSAwLjA2MjgtMC4yIDAuMTUwMS0wLjI3MiAwLjI2MjEtMC4wNzIgMC4xMTIxLTAuMTI0IDAuMjQwOS0wLjE1OCAwLjM4NjUtMC4wMzQgMC4xNDM0LTAuMDUgMC4yOTU3LTAuMDUgMC40NTd6IiBmaWxsLW9wYWNpdHk9Ii4zOCIvPgogICA8cGF0aCBkPSJtNDguMTk2IDgwLjQ2OXYyLjc5NTloLTE0LjIxM3YtMi40MDI3bDYuOTAyNS03LjUyODdjMC43NTcyLTAuODU0MyAxLjM1NDMtMS41OTIyIDEuNzkxMS0yLjIxMzUgMC40MzY5LTAuNjIxMyAwLjc0MjctMS4xNzk1IDAuOTE3NS0xLjY3NDYgMC4xODQ0LTAuNTA0OSAwLjI3NjYtMC45OTUxIDAuMjc2Ni0xLjQ3MDggMC0wLjY2OTktMC4xMjYyLTEuMjU3Mi0wLjM3ODYtMS43NjIxLTAuMjQyNy0wLjUxNDUtMC42MDE5LTAuOTE3NC0xLjA3NzYtMS4yMDg2LTAuNDc1Ny0wLjMwMS0xLjA1MzMtMC40NTE1LTEuNzMyOS0wLjQ1MTUtMC43ODY0IDAtMS40NDY1IDAuMTY5OS0xLjk4MDUgMC41MDk3LTAuNTMzOSAwLjMzOTgtMC45MzY4IDAuODEwNi0xLjIwODYgMS40MTI2LTAuMjcxOSAwLjU5MjEtMC40MDc4IDEuMjcxNy0wLjQwNzggMi4wMzg3aC0zLjUwOTVjMC0xLjIzMyAwLjI4MTYtMi4zNTkxIDAuODQ0Ni0zLjM3ODUgMC41NjMxLTEuMDI5IDEuMzc4Ni0xLjg0NDUgMi40NDY1LTIuNDQ2NCAxLjA2NzktMC42MTE3IDIuMzU0Mi0wLjkxNzUgMy44NTktMC45MTc1IDEuNDE3NCAwIDIuNjIxMiAwLjIzNzkgMy42MTE0IDAuNzEzNiAwLjk5MDMgMC40NzU3IDEuNzQyNyAxLjE1MDQgMi4yNTcyIDIuMDI0MSAwLjUyNDIgMC44NzM4IDAuNzg2NCAxLjkwNzcgMC43ODY0IDMuMTAxOCAwIDAuNjYwMi0wLjEwNjggMS4zMTU1LTAuMzIwNCAxLjk2NTktMC4yMTM2IDAuNjUwNS0wLjUxOTQgMS4zMDA5LTAuOTE3NCAxLjk1MTQtMC4zODg0IDAuNjQwNy0wLjg0OTUgMS4yODYzLTEuMzgzNSAxLjkzNjctMC41MzM5IDAuNjQwOC0xLjEyMTIgMS4yOTEyLTEuNzYyIDEuOTUxNGwtNC41ODcxIDUuMDUzMWg5Ljc4NTh6bTE2LjQyOSAwdjIuNzk1OWgtMTQuMjEzdi0yLjQwMjdsNi45MDI2LTcuNTI4N2MwLjc1NzItMC44NTQzIDEuMzU0Mi0xLjU5MjIgMS43OTExLTIuMjEzNXMwLjc0MjctMS4xNzk1IDAuOTE3NC0xLjY3NDZjMC4xODQ1LTAuNTA0OSAwLjI3NjctMC45OTUxIDAuMjc2Ny0xLjQ3MDggMC0wLjY2OTktMC4xMjYyLTEuMjU3Mi0wLjM3ODYtMS43NjIxLTAuMjQyNy0wLjUxNDUtMC42MDE5LTAuOTE3NC0xLjA3NzYtMS4yMDg2LTAuNDc1Ny0wLjMwMS0xLjA1MzMtMC40NTE1LTEuNzMyOS0wLjQ1MTUtMC43ODY0IDAtMS40NDY1IDAuMTY5OS0xLjk4MDUgMC41MDk3LTAuNTMzOSAwLjMzOTgtMC45MzY4IDAuODEwNi0xLjIwODcgMS40MTI2LTAuMjcxOCAwLjU5MjEtMC40MDc3IDEuMjcxNy0wLjQwNzcgMi4wMzg3aC0zLjUwOTVjMC0xLjIzMyAwLjI4MTUtMi4zNTkxIDAuODQ0Ni0zLjM3ODUgMC41NjMxLTEuMDI5IDEuMzc4Ni0xLjg0NDUgMi40NDY1LTIuNDQ2NCAxLjA2NzktMC42MTE3IDIuMzU0Mi0wLjkxNzUgMy44NTktMC45MTc1IDEuNDE3NCAwIDIuNjIxMiAwLjIzNzkgMy42MTE0IDAuNzEzNnMxLjc0MjYgMS4xNTA0IDIuMjU3MiAyLjAyNDFjMC41MjQyIDAuODczOCAwLjc4NjMgMS45MDc3IDAuNzg2MyAzLjEwMTggMCAwLjY2MDItMC4xMDY4IDEuMzE1NS0wLjMyMDMgMS45NjU5LTAuMjEzNiAwLjY1MDUtMC41MTk0IDEuMzAwOS0wLjkxNzUgMS45NTE0LTAuMzg4MyAwLjY0MDctMC44NDk0IDEuMjg2My0xLjM4MzQgMS45MzY3LTAuNTMzOSAwLjY0MDgtMS4xMjEzIDEuMjkxMi0xLjc2MiAxLjk1MTRsLTQuNTg3MSA1LjA1MzFoOS43ODU4em0yLjQ5MjUtMTQuODFjMC0wLjcwODcgMC4xNzQ3LTEuMzU5MiAwLjUyNDItMS45NTE0czAuODE1NS0xLjA2MyAxLjM5OC0xLjQxMjVjMC41OTIyLTAuMzU5MiAxLjIzMjktMC41Mzg4IDEuOTIyMi0wLjUzODggMC42OTkgMCAxLjMzNDkgMC4xNzk2IDEuOTA3NyAwLjUzODggMC41NzI4IDAuMzQ5NSAxLjAyOTEgMC44MjAzIDEuMzY4OCAxLjQxMjUgMC4zNDk1IDAuNTkyMiAwLjUyNDMgMS4yNDI3IDAuNTI0MyAxLjk1MTRzLTAuMTc0OCAxLjM1OTEtMC41MjQzIDEuOTUxM2MtMC4zMzk3IDAuNTgyNS0wLjc5NiAxLjA0MzYtMS4zNjg4IDEuMzgzNHMtMS4yMDg3IDAuNTA5Ny0xLjkwNzcgMC41MDk3Yy0wLjY4OTMgMC0xLjMzLTAuMTY5OS0xLjkyMjItMC41MDk3LTAuNTgyNS0wLjMzOTgtMS4wNDg1LTAuODAwOS0xLjM5OC0xLjM4MzQtMC4zNDk1LTAuNTkyMi0wLjUyNDItMS4yNDI2LTAuNTI0Mi0xLjk1MTN6bTEuOTY1OSAwYzAgMC41MjQyIDAuMTg0NSAwLjk2NTkgMC41NTM0IDEuMzI1MSAwLjM2ODkgMC4zNDk1IDAuODEwNiAwLjUyNDMgMS4zMjUxIDAuNTI0MyAwLjUxNDYgMCAwLjk0NjYtMC4xNzQ4IDEuMjk2MS0wLjUyNDNzMC41MjQyLTAuNzkxMiAwLjUyNDItMS4zMjUxYzAtMC41NDM3LTAuMTc0Ny0wLjk5NTEtMC41MjQyLTEuMzU0M3MtMC43ODE1LTAuNTM4OC0xLjI5NjEtMC41Mzg4Yy0wLjUxNDUgMC0wLjk1NjIgMC4xNzk2LTEuMzI1MSAwLjUzODhzLTAuNTUzNCAwLjgxMDYtMC41NTM0IDEuMzU0M3ptMjEuNzI5IDEwLjcwM2gzLjY0MDZjLTAuMTE2NSAxLjM4ODMtMC41MDQ4IDIuNjI2MS0xLjE2NSAzLjcxMzQtMC42NjAxIDEuMDc3Ni0xLjU4NzMgMS45MjcxLTIuNzgxNCAyLjU0ODRzLTIuNjQ1NCAwLjkzMi00LjM1NDEgMC45MzJjLTEuMzEwNiAwLTIuNDkwMS0wLjIzMy0zLjUzODYtMC42OTktMS4wNDg1LTAuNDc1Ny0xLjk0NjUtMS4xNDU2LTIuNjk0LTIuMDA5Ni0wLjc0NzYtMC44NzM3LTEuMzIwNC0xLjkyNzEtMS43MTg0LTMuMTYtMC4zODgzLTEuMjMyOS0wLjU4MjUtMi42MTE1LTAuNTgyNS00LjEzNTd2LTEuNzYyYzAtMS41MjQyIDAuMTk5LTIuOTAyOCAwLjU5NzEtNC4xMzU3IDAuNDA3Ny0xLjIzMjkgMC45OTAyLTIuMjg2MyAxLjc0NzQtMy4xNiAwLjc1NzMtMC44ODM1IDEuNjY1LTEuNTU4MiAyLjcyMzItMi4wMjQyIDEuMDY3OS0wLjQ2NiAyLjI2NjktMC42OTkgMy41OTY5LTAuNjk5IDEuNjg5MiAwIDMuMTE2MyAwLjMxMDcgNC4yODEzIDAuOTMyczIuMDY3OCAxLjQ4MDUgMi43MDg2IDIuNTc3NWMwLjY1MDQgMS4wOTcxIDEuMDQ4NCAyLjM1NDMgMS4xOTQxIDMuNzcxN2gtMy42NDA2Yy0wLjA5NzEtMC45MTI2LTAuMzEwNy0xLjY5NDEtMC42NDA3LTIuMzQ0Ni0wLjMyMDQtMC42NTA0LTAuNzk2MS0xLjE0NTUtMS40MjcxLTEuNDg1My0wLjYzMTEtMC4zNDk1LTEuNDU2My0wLjUyNDItMi40NzU2LTAuNTI0Mi0wLjgzNDkgMC0xLjU2MyAwLjE1NTMtMi4xODQ0IDAuNDY1OS0wLjYyMTMgMC4zMTA3LTEuMTQwNyAwLjc2Ny0xLjU1ODEgMS4zNjg5LTAuNDE3NSAwLjYwMTktMC43MzMgMS4zNDQ2LTAuOTQ2NiAyLjIyOC0wLjIwMzkgMC44NzM4LTAuMzA1OCAxLjg3MzctMC4zMDU4IDIuOTk5OXYxLjc5MTFjMCAxLjA2NzkgMC4wOTIyIDIuMDM4NyAwLjI3NjcgMi45MTI1IDAuMTk0MiAwLjg2NCAwLjQ4NTQgMS42MDY3IDAuODczNyAyLjIyOCAwLjM5ODEgMC42MjEzIDAuOTAyOSAxLjEwMTkgMS41MTQ1IDEuNDQxNyAwLjYxMTYgMC4zMzk3IDEuMzQ0NiAwLjUwOTYgMi4xOTg5IDAuNTA5NiAxLjAzODggMCAxLjg3ODUtMC4xNjUgMi41MTkzLTAuNDk1MSAwLjY1MDQtMC4zMzAxIDEuMTQwNy0wLjgxMDYgMS40NzA4LTEuNDQxNiAwLjMzOTgtMC42NDA4IDAuNTYzLTEuNDIyMyAwLjY2OTgtMi4zNDQ2eiIgZmlsbC1vcGFjaXR5PSIuODciLz4KICA8L2c+CiA8L2c+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIwX2RfMTE0Ml8yMDM5NTQiIHg9Ii45MTE3NiIgeT0iLjIwNTg4IiB3aWR0aD0iMTI2LjE4IiBoZWlnaHQ9IjEyNi4xOCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgogICA8ZmVDb2xvck1hdHJpeCBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0iaGFyZEFscGhhIiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+CiAgIDxmZU9mZnNldCBkeT0iMi4yOTQxMiIvPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjI5NDEyIi8+CiAgIDxmZUNvbXBvc2l0ZSBpbjI9ImhhcmRBbHBoYSIgb3BlcmF0b3I9Im91dCIvPgogICA8ZmVDb2xvck1hdHJpeCB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMDQgMCIvPgogICA8ZmVCbGVuZCBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3dfMTE0Ml8yMDM5NTQiLz4KICAgPGZlQmxlbmQgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93XzExNDJfMjAzOTU0IiByZXN1bHQ9InNoYXBlIi8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+Cjwvc3ZnPgo=", + "image": "data:image/png;base64,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", "description": "Designed to display single value of the selected attribute or timeseries data. Widget styles are customizable.", "descriptor": { "type": "latest", "sizeX": 3, "sizeY": 3, "resources": [], - "templateHtml": "\n", + "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n absoluteHeader: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", "hasBasicMode": true, "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temperature\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\"},\"title\":\"Value card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"°C\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\"}" + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temperature\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"thermostat\",\"iconColor\":{\"type\":\"constant\",\"color\":\"#5469FF\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":52,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"valueColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Value card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"°C\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" } }, { "alias": "horizontal_value_card", "name": "Horizontal value card", - "image": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzk5IiBoZWlnaHQ9IjEwOCIgdmlld0JveD0iMCAwIDM5OSAxMDgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfMTI0Nl80NDQ0NykiPgo8cmVjdCB4PSI4IiB5PSI0IiB3aWR0aD0iMzgzIiBoZWlnaHQ9IjkyIiByeD0iNCIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU3LjAwMDEgNTEuNjY2N1YzOC4zMzM0QzU3LjAwMDEgMzUuNTY2NyA1NC43NjY3IDMzLjMzMzQgNTIuMDAwMSAzMy4zMzM0QzQ5LjIzMzQgMzMuMzMzNCA0Ny4wMDAxIDM1LjU2NjcgNDcuMDAwMSAzOC4zMzM0VjUxLjY2NjdDNDQuOTgzNCA1My4xODM0IDQzLjY2NjcgNTUuNjE2NyA0My42NjY3IDU4LjMzMzRDNDMuNjY2NyA2Mi45MzM0IDQ3LjQwMDEgNjYuNjY2NyA1Mi4wMDAxIDY2LjY2NjdDNTYuNjAwMSA2Ni42NjY3IDYwLjMzMzQgNjIuOTMzNCA2MC4zMzM0IDU4LjMzMzRDNjAuMzMzNCA1NS42MTY3IDU5LjAxNjcgNTMuMTgzNCA1Ny4wMDAxIDUxLjY2NjdaTTUwLjMzMzQgMzguMzMzNEM1MC4zMzM0IDM3LjQxNjcgNTEuMDgzNCAzNi42NjY3IDUyLjAwMDEgMzYuNjY2N0M1Mi45MTY3IDM2LjY2NjcgNTMuNjY2NyAzNy40MTY3IDUzLjY2NjcgMzguMzMzNEg1Mi4wMDAxVjQwSDUzLjY2NjdWNDMuMzMzNEg1Mi4wMDAxVjQ1SDUzLjY2NjdWNDguMzMzNEg1MC4zMzM0VjM4LjMzMzRaIiBmaWxsPSIjNTQ2OUZGIi8+CjxwYXRoIGQ9Ik04NS44MzU5IDM1LjYyNVY0N0g4My44OTA2VjM1LjYyNUg4NS44MzU5Wk04OS40MDYyIDM1LjYyNVYzNy4xODc1SDgwLjM1MTZWMzUuNjI1SDg5LjQwNjJaTTkzLjk0NTMgNDcuMTU2MkM5My4zMjAzIDQ3LjE1NjIgOTIuNzU1MiA0Ny4wNTQ3IDkyLjI1IDQ2Ljg1MTZDOTEuNzUgNDYuNjQzMiA5MS4zMjI5IDQ2LjM1NDIgOTAuOTY4OCA0NS45ODQ0QzkwLjYxOTggNDUuNjE0NiA5MC4zNTE2IDQ1LjE3OTcgOTAuMTY0MSA0NC42Nzk3Qzg5Ljk3NjYgNDQuMTc5NyA4OS44ODI4IDQzLjY0MDYgODkuODgyOCA0My4wNjI1VjQyLjc1Qzg5Ljg4MjggNDIuMDg4NSA4OS45NzkyIDQxLjQ4OTYgOTAuMTcxOSA0MC45NTMxQzkwLjM2NDYgNDAuNDE2NyA5MC42MzI4IDM5Ljk1ODMgOTAuOTc2NiAzOS41NzgxQzkxLjMyMDMgMzkuMTkyNyA5MS43MjY2IDM4Ljg5ODQgOTIuMTk1MyAzOC42OTUzQzkyLjY2NDEgMzguNDkyMiA5My4xNzE5IDM4LjM5MDYgOTMuNzE4OCAzOC4zOTA2Qzk0LjMyMjkgMzguMzkwNiA5NC44NTE2IDM4LjQ5MjIgOTUuMzA0NyAzOC42OTUzQzk1Ljc1NzggMzguODk4NCA5Ni4xMzI4IDM5LjE4NDkgOTYuNDI5NyAzOS41NTQ3Qzk2LjczMTggMzkuOTE5MyA5Ni45NTU3IDQwLjM1NDIgOTcuMTAxNiA0MC44NTk0Qzk3LjI1MjYgNDEuMzY0NiA5Ny4zMjgxIDQxLjkyMTkgOTcuMzI4MSA0Mi41MzEyVjQzLjMzNTlIOTAuNzk2OVY0MS45ODQ0SDk1LjQ2ODhWNDEuODM1OUM5NS40NTgzIDQxLjQ5NzQgOTUuMzkwNiA0MS4xNzk3IDk1LjI2NTYgNDAuODgyOEM5NS4xNDU4IDQwLjU4NTkgOTQuOTYwOSA0MC4zNDY0IDk0LjcxMDkgNDAuMTY0MUM5NC40NjA5IDM5Ljk4MTggOTQuMTI3NiAzOS44OTA2IDkzLjcxMDkgMzkuODkwNkM5My4zOTg0IDM5Ljg5MDYgOTMuMTE5OCAzOS45NTgzIDkyLjg3NSA0MC4wOTM4QzkyLjYzNTQgNDAuMjI0IDkyLjQzNDkgNDAuNDE0MSA5Mi4yNzM0IDQwLjY2NDFDOTIuMTEyIDQwLjkxNDEgOTEuOTg3IDQxLjIxNjEgOTEuODk4NCA0MS41NzAzQzkxLjgxNTEgNDEuOTE5MyA5MS43NzM0IDQyLjMxMjUgOTEuNzczNCA0Mi43NVY0My4wNjI1QzkxLjc3MzQgNDMuNDMyMyA5MS44MjI5IDQzLjc3NiA5MS45MjE5IDQ0LjA5MzhDOTIuMDI2IDQ0LjQwNjIgOTIuMTc3MSA0NC42Nzk3IDkyLjM3NSA0NC45MTQxQzkyLjU3MjkgNDUuMTQ4NCA5Mi44MTI1IDQ1LjMzMzMgOTMuMDkzOCA0NS40Njg4QzkzLjM3NSA0NS41OTkgOTMuNjk1MyA0NS42NjQxIDk0LjA1NDcgNDUuNjY0MUM5NC41MDc4IDQ1LjY2NDEgOTQuOTExNSA0NS41NzI5IDk1LjI2NTYgNDUuMzkwNkM5NS42MTk4IDQ1LjIwODMgOTUuOTI3MSA0NC45NTA1IDk2LjE4NzUgNDQuNjE3Mkw5Ny4xNzk3IDQ1LjU3ODFDOTYuOTk3NCA0NS44NDM4IDk2Ljc2MDQgNDYuMDk5IDk2LjQ2ODggNDYuMzQzOEM5Ni4xNzcxIDQ2LjU4MzMgOTUuODIwMyA0Ni43Nzg2IDk1LjM5ODQgNDYuOTI5N0M5NC45ODE4IDQ3LjA4MDcgOTQuNDk3NCA0Ny4xNTYyIDkzLjk0NTMgNDcuMTU2MlpNMTAwLjkzIDQwLjI2NTZWNDdIOTkuMDQ2OVYzOC41NDY5SDEwMC44MkwxMDAuOTMgNDAuMjY1NlpNMTAwLjYyNSA0Mi40NjA5TDk5Ljk4NDQgNDIuNDUzMUM5OS45ODQ0IDQxLjg2OTggMTAwLjA1NyA0MS4zMzA3IDEwMC4yMDMgNDAuODM1OUMxMDAuMzQ5IDQwLjM0MTEgMTAwLjU2MiAzOS45MTE1IDEwMC44NDQgMzkuNTQ2OUMxMDEuMTI1IDM5LjE3NzEgMTAxLjQ3NCAzOC44OTMyIDEwMS44OTEgMzguNjk1M0MxMDIuMzEyIDM4LjQ5MjIgMTAyLjc5OSAzOC4zOTA2IDEwMy4zNTIgMzguMzkwNkMxMDMuNzM3IDM4LjM5MDYgMTA0LjA4OSAzOC40NDc5IDEwNC40MDYgMzguNTYyNUMxMDQuNzI5IDM4LjY3MTkgMTA1LjAwOCAzOC44NDY0IDEwNS4yNDIgMzkuMDg1OUMxMDUuNDgyIDM5LjMyNTUgMTA1LjY2NCAzOS42MzI4IDEwNS43ODkgNDAuMDA3OEMxMDUuOTE5IDQwLjM4MjggMTA1Ljk4NCA0MC44MzU5IDEwNS45ODQgNDEuMzY3MlY0N0gxMDQuMTAyVjQxLjUzMTJDMTA0LjEwMiA0MS4xMTk4IDEwNC4wMzkgNDAuNzk2OSAxMDMuOTE0IDQwLjU2MjVDMTAzLjc5NCA0MC4zMjgxIDEwMy42MiA0MC4xNjE1IDEwMy4zOTEgNDAuMDYyNUMxMDMuMTY3IDM5Ljk1ODMgMTAyLjg5OCAzOS45MDYyIDEwMi41ODYgMzkuOTA2MkMxMDIuMjMyIDM5LjkwNjIgMTAxLjkzIDM5Ljk3NCAxMDEuNjggNDAuMTA5NEMxMDEuNDM1IDQwLjI0NDggMTAxLjIzNCA0MC40Mjk3IDEwMS4wNzggNDAuNjY0MUMxMDAuOTIyIDQwLjg5ODQgMTAwLjgwNyA0MS4xNjkzIDEwMC43MzQgNDEuNDc2NkMxMDAuNjYxIDQxLjc4MzkgMTAwLjYyNSA0Mi4xMTIgMTAwLjYyNSA0Mi40NjA5Wk0xMDUuODY3IDQxLjk2MDlMMTA0Ljk4NCA0Mi4xNTYyQzEwNC45ODQgNDEuNjQ1OCAxMDUuMDU1IDQxLjE2NDEgMTA1LjE5NSA0MC43MTA5QzEwNS4zNDEgNDAuMjUyNiAxMDUuNTUyIDM5Ljg1MTYgMTA1LjgyOCAzOS41MDc4QzEwNi4xMDkgMzkuMTU4OSAxMDYuNDU2IDM4Ljg4NTQgMTA2Ljg2NyAzOC42ODc1QzEwNy4yNzkgMzguNDg5NiAxMDcuNzUgMzguMzkwNiAxMDguMjgxIDM4LjM5MDZDMTA4LjcxNCAzOC4zOTA2IDEwOS4wOTkgMzguNDUwNSAxMDkuNDM4IDM4LjU3MDNDMTA5Ljc4MSAzOC42ODQ5IDExMC4wNzMgMzguODY3MiAxMTAuMzEyIDM5LjExNzJDMTEwLjU1MiAzOS4zNjcyIDExMC43MzQgMzkuNjkyNyAxMTAuODU5IDQwLjA5MzhDMTEwLjk4NCA0MC40ODk2IDExMS4wNDcgNDAuOTY4OCAxMTEuMDQ3IDQxLjUzMTJWNDdIMTA5LjE1NlY0MS41MjM0QzEwOS4xNTYgNDEuMDk2NCAxMDkuMDk0IDQwLjc2NTYgMTA4Ljk2OSA0MC41MzEyQzEwOC44NDkgNDAuMjk2OSAxMDguNjc3IDQwLjEzNTQgMTA4LjQ1MyA0MC4wNDY5QzEwOC4yMjkgMzkuOTUzMSAxMDcuOTYxIDM5LjkwNjIgMTA3LjY0OCAzOS45MDYyQzEwNy4zNTcgMzkuOTA2MiAxMDcuMDk5IDM5Ljk2MDkgMTA2Ljg3NSA0MC4wNzAzQzEwNi42NTYgNDAuMTc0NSAxMDYuNDcxIDQwLjMyMjkgMTA2LjMyIDQwLjUxNTZDMTA2LjE2OSA0MC43MDMxIDEwNi4wNTUgNDAuOTE5MyAxMDUuOTc3IDQxLjE2NDFDMTA1LjkwNCA0MS40MDg5IDEwNS44NjcgNDEuNjc0NSAxMDUuODY3IDQxLjk2MDlaTTExNS4xMjUgNDAuMTcxOVY1MC4yNUgxMTMuMjQyVjM4LjU0NjlIMTE0Ljk3N0wxMTUuMTI1IDQwLjE3MTlaTTEyMC42MzMgNDIuNjk1M1Y0Mi44NTk0QzEyMC42MzMgNDMuNDc0IDEyMC41NiA0NC4wNDQzIDEyMC40MTQgNDQuNTcwM0MxMjAuMjczIDQ1LjA5MTEgMTIwLjA2MiA0NS41NDY5IDExOS43ODEgNDUuOTM3NUMxMTkuNTA1IDQ2LjMyMjkgMTE5LjE2NCA0Ni42MjI0IDExOC43NTggNDYuODM1OUMxMTguMzUyIDQ3LjA0OTUgMTE3Ljg4MyA0Ny4xNTYyIDExNy4zNTIgNDcuMTU2MkMxMTYuODI2IDQ3LjE1NjIgMTE2LjM2NSA0Ny4wNTk5IDExNS45NjkgNDYuODY3MkMxMTUuNTc4IDQ2LjY2OTMgMTE1LjI0NyA0Ni4zOTA2IDExNC45NzcgNDYuMDMxMkMxMTQuNzA2IDQ1LjY3MTkgMTE0LjQ4NyA0NS4yNSAxMTQuMzIgNDQuNzY1NkMxMTQuMTU5IDQ0LjI3NiAxMTQuMDQ0IDQzLjczOTYgMTEzLjk3NyA0My4xNTYyVjQyLjUyMzRDMTE0LjA0NCA0MS45MDM2IDExNC4xNTkgNDEuMzQxMSAxMTQuMzIgNDAuODM1OUMxMTQuNDg3IDQwLjMzMDcgMTE0LjcwNiAzOS44OTU4IDExNC45NzcgMzkuNTMxMkMxMTUuMjQ3IDM5LjE2NjcgMTE1LjU3OCAzOC44ODU0IDExNS45NjkgMzguNjg3NUMxMTYuMzU5IDM4LjQ4OTYgMTE2LjgxNSAzOC4zOTA2IDExNy4zMzYgMzguMzkwNkMxMTcuODY3IDM4LjM5MDYgMTE4LjMzOSAzOC40OTQ4IDExOC43NSAzOC43MDMxQzExOS4xNjEgMzguOTA2MiAxMTkuNTA4IDM5LjE5NzkgMTE5Ljc4OSAzOS41NzgxQzEyMC4wNyAzOS45NTMxIDEyMC4yODEgNDAuNDA2MiAxMjAuNDIyIDQwLjkzNzVDMTIwLjU2MiA0MS40NjM1IDEyMC42MzMgNDIuMDQ5NSAxMjAuNjMzIDQyLjY5NTNaTTExOC43NSA0Mi44NTk0VjQyLjY5NTNDMTE4Ljc1IDQyLjMwNDcgMTE4LjcxNCA0MS45NDI3IDExOC42NDEgNDEuNjA5NEMxMTguNTY4IDQxLjI3MDggMTE4LjQ1MyA0MC45NzQgMTE4LjI5NyA0MC43MTg4QzExOC4xNDEgNDAuNDYzNSAxMTcuOTQgNDAuMjY1NiAxMTcuNjk1IDQwLjEyNUMxMTcuNDU2IDM5Ljk3OTIgMTE3LjE2NyAzOS45MDYyIDExNi44MjggMzkuOTA2MkMxMTYuNDk1IDM5LjkwNjIgMTE2LjIwOCAzOS45NjM1IDExNS45NjkgNDAuMDc4MUMxMTUuNzI5IDQwLjE4NzUgMTE1LjUyOSA0MC4zNDExIDExNS4zNjcgNDAuNTM5MUMxMTUuMjA2IDQwLjczNyAxMTUuMDgxIDQwLjk2ODggMTE0Ljk5MiA0MS4yMzQ0QzExNC45MDQgNDEuNDk0OCAxMTQuODQxIDQxLjc3ODYgMTE0LjgwNSA0Mi4wODU5VjQzLjYwMTZDMTE0Ljg2NyA0My45NzY2IDExNC45NzQgNDQuMzIwMyAxMTUuMTI1IDQ0LjYzMjhDMTE1LjI3NiA0NC45NDUzIDExNS40OSA0NS4xOTUzIDExNS43NjYgNDUuMzgyOEMxMTYuMDQ3IDQ1LjU2NTEgMTE2LjQwNiA0NS42NTYyIDExNi44NDQgNDUuNjU2MkMxMTcuMTgyIDQ1LjY1NjIgMTE3LjQ3MSA0NS41ODMzIDExNy43MTEgNDUuNDM3NUMxMTcuOTUxIDQ1LjI5MTcgMTE4LjE0NiA0NS4wOTExIDExOC4yOTcgNDQuODM1OUMxMTguNDUzIDQ0LjU3NTUgMTE4LjU2OCA0NC4yNzYgMTE4LjY0MSA0My45Mzc1QzExOC43MTQgNDMuNTk5IDExOC43NSA0My4yMzk2IDExOC43NSA0Mi44NTk0Wk0xMjYuMjExIDQ3LjE1NjJDMTI1LjU4NiA0Ny4xNTYyIDEyNS4wMjEgNDcuMDU0NyAxMjQuNTE2IDQ2Ljg1MTZDMTI0LjAxNiA0Ni42NDMyIDEyMy41ODkgNDYuMzU0MiAxMjMuMjM0IDQ1Ljk4NDRDMTIyLjg4NSA0NS42MTQ2IDEyMi42MTcgNDUuMTc5NyAxMjIuNDMgNDQuNjc5N0MxMjIuMjQyIDQ0LjE3OTcgMTIyLjE0OCA0My42NDA2IDEyMi4xNDggNDMuMDYyNVY0Mi43NUMxMjIuMTQ4IDQyLjA4ODUgMTIyLjI0NSA0MS40ODk2IDEyMi40MzggNDAuOTUzMUMxMjIuNjMgNDAuNDE2NyAxMjIuODk4IDM5Ljk1ODMgMTIzLjI0MiAzOS41NzgxQzEyMy41ODYgMzkuMTkyNyAxMjMuOTkyIDM4Ljg5ODQgMTI0LjQ2MSAzOC42OTUzQzEyNC45MyAzOC40OTIyIDEyNS40MzggMzguMzkwNiAxMjUuOTg0IDM4LjM5MDZDMTI2LjU4OSAzOC4zOTA2IDEyNy4xMTcgMzguNDkyMiAxMjcuNTcgMzguNjk1M0MxMjguMDIzIDM4Ljg5ODQgMTI4LjM5OCAzOS4xODQ5IDEyOC42OTUgMzkuNTU0N0MxMjguOTk3IDM5LjkxOTMgMTI5LjIyMSA0MC4zNTQyIDEyOS4zNjcgNDAuODU5NEMxMjkuNTE4IDQxLjM2NDYgMTI5LjU5NCA0MS45MjE5IDEyOS41OTQgNDIuNTMxMlY0My4zMzU5SDEyMy4wNjJWNDEuOTg0NEgxMjcuNzM0VjQxLjgzNTlDMTI3LjcyNCA0MS40OTc0IDEyNy42NTYgNDEuMTc5NyAxMjcuNTMxIDQwLjg4MjhDMTI3LjQxMSA0MC41ODU5IDEyNy4yMjcgNDAuMzQ2NCAxMjYuOTc3IDQwLjE2NDFDMTI2LjcyNyAzOS45ODE4IDEyNi4zOTMgMzkuODkwNiAxMjUuOTc3IDM5Ljg5MDZDMTI1LjY2NCAzOS44OTA2IDEyNS4zODUgMzkuOTU4MyAxMjUuMTQxIDQwLjA5MzhDMTI0LjkwMSA0MC4yMjQgMTI0LjcwMSA0MC40MTQxIDEyNC41MzkgNDAuNjY0MUMxMjQuMzc4IDQwLjkxNDEgMTI0LjI1MyA0MS4yMTYxIDEyNC4xNjQgNDEuNTcwM0MxMjQuMDgxIDQxLjkxOTMgMTI0LjAzOSA0Mi4zMTI1IDEyNC4wMzkgNDIuNzVWNDMuMDYyNUMxMjQuMDM5IDQzLjQzMjMgMTI0LjA4OSA0My43NzYgMTI0LjE4OCA0NC4wOTM4QzEyNC4yOTIgNDQuNDA2MiAxMjQuNDQzIDQ0LjY3OTcgMTI0LjY0MSA0NC45MTQxQzEyNC44MzkgNDUuMTQ4NCAxMjUuMDc4IDQ1LjMzMzMgMTI1LjM1OSA0NS40Njg4QzEyNS42NDEgNDUuNTk5IDEyNS45NjEgNDUuNjY0MSAxMjYuMzIgNDUuNjY0MUMxMjYuNzczIDQ1LjY2NDEgMTI3LjE3NyA0NS41NzI5IDEyNy41MzEgNDUuMzkwNkMxMjcuODg1IDQ1LjIwODMgMTI4LjE5MyA0NC45NTA1IDEyOC40NTMgNDQuNjE3MkwxMjkuNDQ1IDQ1LjU3ODFDMTI5LjI2MyA0NS44NDM4IDEyOS4wMjYgNDYuMDk5IDEyOC43MzQgNDYuMzQzOEMxMjguNDQzIDQ2LjU4MzMgMTI4LjA4NiA0Ni43Nzg2IDEyNy42NjQgNDYuOTI5N0MxMjcuMjQ3IDQ3LjA4MDcgMTI2Ljc2MyA0Ny4xNTYyIDEyNi4yMTEgNDcuMTU2MlpNMTMzLjIwMyA0MC4xNTYyVjQ3SDEzMS4zMlYzOC41NDY5SDEzMy4xMTdMMTMzLjIwMyA0MC4xNTYyWk0xMzUuNzg5IDM4LjQ5MjJMMTM1Ljc3MyA0MC4yNDIyQzEzNS42NTkgNDAuMjIxNCAxMzUuNTM0IDQwLjIwNTcgMTM1LjM5OCA0MC4xOTUzQzEzNS4yNjggNDAuMTg0OSAxMzUuMTM4IDQwLjE3OTcgMTM1LjAwOCA0MC4xNzk3QzEzNC42ODUgNDAuMTc5NyAxMzQuNDAxIDQwLjIyNjYgMTM0LjE1NiA0MC4zMjAzQzEzMy45MTEgNDAuNDA4OSAxMzMuNzA2IDQwLjUzOTEgMTMzLjUzOSA0MC43MTA5QzEzMy4zNzggNDAuODc3NiAxMzMuMjUzIDQxLjA4MDcgMTMzLjE2NCA0MS4zMjAzQzEzMy4wNzYgNDEuNTU5OSAxMzMuMDIzIDQxLjgyODEgMTMzLjAwOCA0Mi4xMjVMMTMyLjU3OCA0Mi4xNTYyQzEzMi41NzggNDEuNjI1IDEzMi42MyA0MS4xMzI4IDEzMi43MzQgNDAuNjc5N0MxMzIuODM5IDQwLjIyNjYgMTMyLjk5NSAzOS44MjgxIDEzMy4yMDMgMzkuNDg0NEMxMzMuNDE3IDM5LjE0MDYgMTMzLjY4MiAzOC44NzI0IDEzNCAzOC42Nzk3QzEzNC4zMjMgMzguNDg3IDEzNC42OTUgMzguMzkwNiAxMzUuMTE3IDM4LjM5MDZDMTM1LjIzMiAzOC4zOTA2IDEzNS4zNTQgMzguNDAxIDEzNS40ODQgMzguNDIxOUMxMzUuNjIgMzguNDQyNyAxMzUuNzIxIDM4LjQ2NjEgMTM1Ljc4OSAzOC40OTIyWk0xNDEuNzAzIDQ1LjMwNDdWNDEuMjczNEMxNDEuNzAzIDQwLjk3MTQgMTQxLjY0OCA0MC43MTA5IDE0MS41MzkgNDAuNDkyMkMxNDEuNDMgNDAuMjczNCAxNDEuMjYzIDQwLjEwNDIgMTQxLjAzOSAzOS45ODQ0QzE0MC44MiAzOS44NjQ2IDE0MC41NDQgMzkuODA0NyAxNDAuMjExIDM5LjgwNDdDMTM5LjkwNCAzOS44MDQ3IDEzOS42MzggMzkuODU2OCAxMzkuNDE0IDM5Ljk2MDlDMTM5LjE5IDQwLjA2NTEgMTM5LjAxNiA0MC4yMDU3IDEzOC44OTEgNDAuMzgyOEMxMzguNzY2IDQwLjU1OTkgMTM4LjcwMyA0MC43NjA0IDEzOC43MDMgNDAuOTg0NEgxMzYuODI4QzEzNi44MjggNDAuNjUxIDEzNi45MDkgNDAuMzI4MSAxMzcuMDcgNDAuMDE1NkMxMzcuMjMyIDM5LjcwMzEgMTM3LjQ2NiAzOS40MjQ1IDEzNy43NzMgMzkuMTc5N0MxMzguMDgxIDM4LjkzNDkgMTM4LjQ0OCAzOC43NDIyIDEzOC44NzUgMzguNjAxNkMxMzkuMzAyIDM4LjQ2MDkgMTM5Ljc4MSAzOC4zOTA2IDE0MC4zMTIgMzguMzkwNkMxNDAuOTQ4IDM4LjM5MDYgMTQxLjUxIDM4LjQ5NzQgMTQyIDM4LjcxMDlDMTQyLjQ5NSAzOC45MjQ1IDE0Mi44ODMgMzkuMjQ3NCAxNDMuMTY0IDM5LjY3OTdDMTQzLjQ1MSA0MC4xMDY4IDE0My41OTQgNDAuNjQzMiAxNDMuNTk0IDQxLjI4OTFWNDUuMDQ2OUMxNDMuNTk0IDQ1LjQzMjMgMTQzLjYyIDQ1Ljc3ODYgMTQzLjY3MiA0Ni4wODU5QzE0My43MjkgNDYuMzg4IDE0My44MSA0Ni42NTEgMTQzLjkxNCA0Ni44NzVWNDdIMTQxLjk4NEMxNDEuODk2IDQ2Ljc5NjkgMTQxLjgyNiA0Ni41MzkxIDE0MS43NzMgNDYuMjI2NkMxNDEuNzI3IDQ1LjkwODkgMTQxLjcwMyA0NS42MDE2IDE0MS43MDMgNDUuMzA0N1pNMTQxLjk3NyA0MS44NTk0TDE0MS45OTIgNDMuMDIzNEgxNDAuNjQxQzE0MC4yOTIgNDMuMDIzNCAxMzkuOTg0IDQzLjA1NzMgMTM5LjcxOSA0My4xMjVDMTM5LjQ1MyA0My4xODc1IDEzOS4yMzIgNDMuMjgxMiAxMzkuMDU1IDQzLjQwNjJDMTM4Ljg3OCA0My41MzEyIDEzOC43NDUgNDMuNjgyMyAxMzguNjU2IDQzLjg1OTRDMTM4LjU2OCA0NC4wMzY1IDEzOC41MjMgNDQuMjM3IDEzOC41MjMgNDQuNDYwOUMxMzguNTIzIDQ0LjY4NDkgMTM4LjU3NiA0NC44OTA2IDEzOC42OCA0NS4wNzgxQzEzOC43ODQgNDUuMjYwNCAxMzguOTM1IDQ1LjQwMzYgMTM5LjEzMyA0NS41MDc4QzEzOS4zMzYgNDUuNjEyIDEzOS41ODEgNDUuNjY0MSAxMzkuODY3IDQ1LjY2NDFDMTQwLjI1MyA0NS42NjQxIDE0MC41ODkgNDUuNTg1OSAxNDAuODc1IDQ1LjQyOTdDMTQxLjE2NyA0NS4yNjgyIDE0MS4zOTYgNDUuMDcyOSAxNDEuNTYyIDQ0Ljg0MzhDMTQxLjcyOSA0NC42MDk0IDE0MS44MTggNDQuMzg4IDE0MS44MjggNDQuMTc5N0wxNDIuNDM4IDQ1LjAxNTZDMTQyLjM3NSA0NS4yMjkyIDE0Mi4yNjggNDUuNDU4MyAxNDIuMTE3IDQ1LjcwMzFDMTQxLjk2NiA0NS45NDc5IDE0MS43NjggNDYuMTgyMyAxNDEuNTIzIDQ2LjQwNjJDMTQxLjI4NCA0Ni42MjUgMTQwLjk5NSA0Ni44MDQ3IDE0MC42NTYgNDYuOTQ1M0MxNDAuMzIzIDQ3LjA4NTkgMTM5LjkzOCA0Ny4xNTYyIDEzOS41IDQ3LjE1NjJDMTM4Ljk0OCA0Ny4xNTYyIDEzOC40NTYgNDcuMDQ2OSAxMzguMDIzIDQ2LjgyODFDMTM3LjU5MSA0Ni42MDQyIDEzNy4yNTMgNDYuMzA0NyAxMzcuMDA4IDQ1LjkyOTdDMTM2Ljc2MyA0NS41NDk1IDEzNi42NDEgNDUuMTE5OCAxMzYuNjQxIDQ0LjY0MDZDMTM2LjY0MSA0NC4xOTI3IDEzNi43MjQgNDMuNzk2OSAxMzYuODkxIDQzLjQ1MzFDMTM3LjA2MiA0My4xMDQyIDEzNy4zMTIgNDIuODEyNSAxMzcuNjQxIDQyLjU3ODFDMTM3Ljk3NCA0Mi4zNDM4IDEzOC4zOCA0Mi4xNjY3IDEzOC44NTkgNDIuMDQ2OUMxMzkuMzM5IDQxLjkyMTkgMTM5Ljg4NSA0MS44NTk0IDE0MC41IDQxLjg1OTRIMTQxLjk3N1pNMTQ5LjY4OCAzOC41NDY5VjM5LjkyMTlIMTQ0LjkyMlYzOC41NDY5SDE0OS42ODhaTTE0Ni4yOTcgMzYuNDc2NkgxNDguMThWNDQuNjY0MUMxNDguMTggNDQuOTI0NSAxNDguMjE2IDQ1LjEyNSAxNDguMjg5IDQ1LjI2NTZDMTQ4LjM2NyA0NS40MDEgMTQ4LjQ3NCA0NS40OTIyIDE0OC42MDkgNDUuNTM5MUMxNDguNzQ1IDQ1LjU4NTkgMTQ4LjkwNCA0NS42MDk0IDE0OS4wODYgNDUuNjA5NEMxNDkuMjE2IDQ1LjYwOTQgMTQ5LjM0MSA0NS42MDE2IDE0OS40NjEgNDUuNTg1OUMxNDkuNTgxIDQ1LjU3MDMgMTQ5LjY3NyA0NS41NTQ3IDE0OS43NSA0NS41MzkxTDE0OS43NTggNDYuOTc2NkMxNDkuNjAyIDQ3LjAyMzQgMTQ5LjQxOSA0Ny4wNjUxIDE0OS4yMTEgNDcuMTAxNkMxNDkuMDA4IDQ3LjEzOCAxNDguNzczIDQ3LjE1NjIgMTQ4LjUwOCA0Ny4xNTYyQzE0OC4wNzYgNDcuMTU2MiAxNDcuNjkzIDQ3LjA4MDcgMTQ3LjM1OSA0Ni45Mjk3QzE0Ny4wMjYgNDYuNzczNCAxNDYuNzY2IDQ2LjUyMDggMTQ2LjU3OCA0Ni4xNzE5QzE0Ni4zOTEgNDUuODIyOSAxNDYuMjk3IDQ1LjM1OTQgMTQ2LjI5NyA0NC43ODEyVjM2LjQ3NjZaTTE1Ni40NzcgNDUuMDA3OFYzOC41NDY5SDE1OC4zNjdWNDdIMTU2LjU4NkwxNTYuNDc3IDQ1LjAwNzhaTTE1Ni43NDIgNDMuMjVMMTU3LjM3NSA0My4yMzQ0QzE1Ny4zNzUgNDMuODAyMSAxNTcuMzEyIDQ0LjMyNTUgMTU3LjE4OCA0NC44MDQ3QzE1Ny4wNjIgNDUuMjc4NiAxNTYuODcgNDUuNjkyNyAxNTYuNjA5IDQ2LjA0NjlDMTU2LjM0OSA0Ni4zOTU4IDE1Ni4wMTYgNDYuNjY5MyAxNTUuNjA5IDQ2Ljg2NzJDMTU1LjIwMyA0Ny4wNTk5IDE1NC43MTYgNDcuMTU2MiAxNTQuMTQ4IDQ3LjE1NjJDMTUzLjczNyA0Ny4xNTYyIDE1My4zNTkgNDcuMDk2NCAxNTMuMDE2IDQ2Ljk3NjZDMTUyLjY3MiA0Ni44NTY4IDE1Mi4zNzUgNDYuNjcxOSAxNTIuMTI1IDQ2LjQyMTlDMTUxLjg4IDQ2LjE3MTkgMTUxLjY5IDQ1Ljg0NjQgMTUxLjU1NSA0NS40NDUzQzE1MS40MTkgNDUuMDQ0MyAxNTEuMzUyIDQ0LjU2NTEgMTUxLjM1MiA0NC4wMDc4VjM4LjU0NjlIMTUzLjIzNFY0NC4wMjM0QzE1My4yMzQgNDQuMzMwNyAxNTMuMjcxIDQ0LjU4ODUgMTUzLjM0NCA0NC43OTY5QzE1My40MTcgNDUgMTUzLjUxNiA0NS4xNjQxIDE1My42NDEgNDUuMjg5MUMxNTMuNzY2IDQ1LjQxNDEgMTUzLjkxMSA0NS41MDI2IDE1NC4wNzggNDUuNTU0N0MxNTQuMjQ1IDQ1LjYwNjggMTU0LjQyMiA0NS42MzI4IDE1NC42MDkgNDUuNjMyOEMxNTUuMTQ2IDQ1LjYzMjggMTU1LjU2OCA0NS41Mjg2IDE1NS44NzUgNDUuMzIwM0MxNTYuMTg4IDQ1LjEwNjggMTU2LjQwOSA0NC44MjAzIDE1Ni41MzkgNDQuNDYwOUMxNTYuNjc0IDQ0LjEwMTYgMTU2Ljc0MiA0My42OTc5IDE1Ni43NDIgNDMuMjVaTTE2Mi40MzggNDAuMTU2MlY0N0gxNjAuNTU1VjM4LjU0NjlIMTYyLjM1MkwxNjIuNDM4IDQwLjE1NjJaTTE2NS4wMjMgMzguNDkyMkwxNjUuMDA4IDQwLjI0MjJDMTY0Ljg5MyA0MC4yMjE0IDE2NC43NjggNDAuMjA1NyAxNjQuNjMzIDQwLjE5NTNDMTY0LjUwMyA0MC4xODQ5IDE2NC4zNzIgNDAuMTc5NyAxNjQuMjQyIDQwLjE3OTdDMTYzLjkxOSA0MC4xNzk3IDE2My42MzUgNDAuMjI2NiAxNjMuMzkxIDQwLjMyMDNDMTYzLjE0NiA0MC40MDg5IDE2Mi45NCA0MC41MzkxIDE2Mi43NzMgNDAuNzEwOUMxNjIuNjEyIDQwLjg3NzYgMTYyLjQ4NyA0MS4wODA3IDE2Mi4zOTggNDEuMzIwM0MxNjIuMzEgNDEuNTU5OSAxNjIuMjU4IDQxLjgyODEgMTYyLjI0MiA0Mi4xMjVMMTYxLjgxMiA0Mi4xNTYyQzE2MS44MTIgNDEuNjI1IDE2MS44NjUgNDEuMTMyOCAxNjEuOTY5IDQwLjY3OTdDMTYyLjA3MyA0MC4yMjY2IDE2Mi4yMjkgMzkuODI4MSAxNjIuNDM4IDM5LjQ4NDRDMTYyLjY1MSAzOS4xNDA2IDE2Mi45MTcgMzguODcyNCAxNjMuMjM0IDM4LjY3OTdDMTYzLjU1NyAzOC40ODcgMTYzLjkzIDM4LjM5MDYgMTY0LjM1MiAzOC4zOTA2QzE2NC40NjYgMzguMzkwNiAxNjQuNTg5IDM4LjQwMSAxNjQuNzE5IDM4LjQyMTlDMTY0Ljg1NCAzOC40NDI3IDE2NC45NTYgMzguNDY2MSAxNjUuMDIzIDM4LjQ5MjJaTTE3MC4wMjMgNDcuMTU2MkMxNjkuMzk4IDQ3LjE1NjIgMTY4LjgzMyA0Ny4wNTQ3IDE2OC4zMjggNDYuODUxNkMxNjcuODI4IDQ2LjY0MzIgMTY3LjQwMSA0Ni4zNTQyIDE2Ny4wNDcgNDUuOTg0NEMxNjYuNjk4IDQ1LjYxNDYgMTY2LjQzIDQ1LjE3OTcgMTY2LjI0MiA0NC42Nzk3QzE2Ni4wNTUgNDQuMTc5NyAxNjUuOTYxIDQzLjY0MDYgMTY1Ljk2MSA0My4wNjI1VjQyLjc1QzE2NS45NjEgNDIuMDg4NSAxNjYuMDU3IDQxLjQ4OTYgMTY2LjI1IDQwLjk1MzFDMTY2LjQ0MyA0MC40MTY3IDE2Ni43MTEgMzkuOTU4MyAxNjcuMDU1IDM5LjU3ODFDMTY3LjM5OCAzOS4xOTI3IDE2Ny44MDUgMzguODk4NCAxNjguMjczIDM4LjY5NTNDMTY4Ljc0MiAzOC40OTIyIDE2OS4yNSAzOC4zOTA2IDE2OS43OTcgMzguMzkwNkMxNzAuNDAxIDM4LjM5MDYgMTcwLjkzIDM4LjQ5MjIgMTcxLjM4MyAzOC42OTUzQzE3MS44MzYgMzguODk4NCAxNzIuMjExIDM5LjE4NDkgMTcyLjUwOCAzOS41NTQ3QzE3Mi44MSAzOS45MTkzIDE3My4wMzQgNDAuMzU0MiAxNzMuMTggNDAuODU5NEMxNzMuMzMxIDQxLjM2NDYgMTczLjQwNiA0MS45MjE5IDE3My40MDYgNDIuNTMxMlY0My4zMzU5SDE2Ni44NzVWNDEuOTg0NEgxNzEuNTQ3VjQxLjgzNTlDMTcxLjUzNiA0MS40OTc0IDE3MS40NjkgNDEuMTc5NyAxNzEuMzQ0IDQwLjg4MjhDMTcxLjIyNCA0MC41ODU5IDE3MS4wMzkgNDAuMzQ2NCAxNzAuNzg5IDQwLjE2NDFDMTcwLjUzOSAzOS45ODE4IDE3MC4yMDYgMzkuODkwNiAxNjkuNzg5IDM5Ljg5MDZDMTY5LjQ3NyAzOS44OTA2IDE2OS4xOTggMzkuOTU4MyAxNjguOTUzIDQwLjA5MzhDMTY4LjcxNCA0MC4yMjQgMTY4LjUxMyA0MC40MTQxIDE2OC4zNTIgNDAuNjY0MUMxNjguMTkgNDAuOTE0MSAxNjguMDY1IDQxLjIxNjEgMTY3Ljk3NyA0MS41NzAzQzE2Ny44OTMgNDEuOTE5MyAxNjcuODUyIDQyLjMxMjUgMTY3Ljg1MiA0Mi43NVY0My4wNjI1QzE2Ny44NTIgNDMuNDMyMyAxNjcuOTAxIDQzLjc3NiAxNjggNDQuMDkzOEMxNjguMTA0IDQ0LjQwNjIgMTY4LjI1NSA0NC42Nzk3IDE2OC40NTMgNDQuOTE0MUMxNjguNjUxIDQ1LjE0ODQgMTY4Ljg5MSA0NS4zMzMzIDE2OS4xNzIgNDUuNDY4OEMxNjkuNDUzIDQ1LjU5OSAxNjkuNzczIDQ1LjY2NDEgMTcwLjEzMyA0NS42NjQxQzE3MC41ODYgNDUuNjY0MSAxNzAuOTkgNDUuNTcyOSAxNzEuMzQ0IDQ1LjM5MDZDMTcxLjY5OCA0NS4yMDgzIDE3Mi4wMDUgNDQuOTUwNSAxNzIuMjY2IDQ0LjYxNzJMMTczLjI1OCA0NS41NzgxQzE3My4wNzYgNDUuODQzOCAxNzIuODM5IDQ2LjA5OSAxNzIuNTQ3IDQ2LjM0MzhDMTcyLjI1NSA0Ni41ODMzIDE3MS44OTggNDYuNzc4NiAxNzEuNDc3IDQ2LjkyOTdDMTcxLjA2IDQ3LjA4MDcgMTcwLjU3NiA0Ny4xNTYyIDE3MC4wMjMgNDcuMTU2MloiIGZpbGw9ImJsYWNrIiBmaWxsLW9wYWNpdHk9IjAuODciLz4KPHBhdGggZD0iTTg2LjIxMDkgNjQuODM0VjY2SDgxLjkyNzdWNjQuODM0SDg2LjIxMDlaTTgyLjMzNzkgNTcuNDY4OFY2Nkg4MC44NjcyVjU3LjQ2ODhIODIuMzM3OVpNOTEuMDMxMiA2NC43Mjg1VjYxLjcwNTFDOTEuMDMxMiA2MS40Nzg1IDkwLjk5MDIgNjEuMjgzMiA5MC45MDgyIDYxLjExOTFDOTAuODI2MiA2MC45NTUxIDkwLjcwMTIgNjAuODI4MSA5MC41MzMyIDYwLjczODNDOTAuMzY5MSA2MC42NDg0IDkwLjE2MjEgNjAuNjAzNSA4OS45MTIxIDYwLjYwMzVDODkuNjgxNiA2MC42MDM1IDg5LjQ4MjQgNjAuNjQyNiA4OS4zMTQ1IDYwLjcyMDdDODkuMTQ2NSA2MC43OTg4IDg5LjAxNTYgNjAuOTA0MyA4OC45MjE5IDYxLjAzNzFDODguODI4MSA2MS4xNjk5IDg4Ljc4MTIgNjEuMzIwMyA4OC43ODEyIDYxLjQ4ODNIODcuMzc1Qzg3LjM3NSA2MS4yMzgzIDg3LjQzNTUgNjAuOTk2MSA4Ny41NTY2IDYwLjc2MTdDODcuNjc3NyA2MC41MjczIDg3Ljg1MzUgNjAuMzE4NCA4OC4wODQgNjAuMTM0OEM4OC4zMTQ1IDU5Ljk1MTIgODguNTg5OCA1OS44MDY2IDg4LjkxMDIgNTkuNzAxMkM4OS4yMzA1IDU5LjU5NTcgODkuNTg5OCA1OS41NDMgODkuOTg4MyA1OS41NDNDOTAuNDY0OCA1OS41NDMgOTAuODg2NyA1OS42MjMgOTEuMjUzOSA1OS43ODMyQzkxLjYyNSA1OS45NDM0IDkxLjkxNiA2MC4xODU1IDkyLjEyNyA2MC41MDk4QzkyLjM0MTggNjAuODMwMSA5Mi40NDkyIDYxLjIzMjQgOTIuNDQ5MiA2MS43MTY4VjY0LjUzNTJDOTIuNDQ5MiA2NC44MjQyIDkyLjQ2ODggNjUuMDg0IDkyLjUwNzggNjUuMzE0NUM5Mi41NTA4IDY1LjU0MSA5Mi42MTEzIDY1LjczODMgOTIuNjg5NSA2NS45MDYyVjY2SDkxLjI0MjJDOTEuMTc1OCA2NS44NDc3IDkxLjEyMyA2NS42NTQzIDkxLjA4NCA2NS40MTk5QzkxLjA0ODggNjUuMTgxNiA5MS4wMzEyIDY0Ljk1MTIgOTEuMDMxMiA2NC43Mjg1Wk05MS4yMzYzIDYyLjE0NDVMOTEuMjQ4IDYzLjAxNzZIOTAuMjM0NEM4OS45NzI3IDYzLjAxNzYgODkuNzQyMiA2My4wNDMgODkuNTQzIDYzLjA5MzhDODkuMzQzOCA2My4xNDA2IDg5LjE3NzcgNjMuMjEwOSA4OS4wNDQ5IDYzLjMwNDdDODguOTEyMSA2My4zOTg0IDg4LjgxMjUgNjMuNTExNyA4OC43NDYxIDYzLjY0NDVDODguNjc5NyA2My43NzczIDg4LjY0NjUgNjMuOTI3NyA4OC42NDY1IDY0LjA5NTdDODguNjQ2NSA2NC4yNjM3IDg4LjY4NTUgNjQuNDE4IDg4Ljc2MzcgNjQuNTU4NkM4OC44NDE4IDY0LjY5NTMgODguOTU1MSA2NC44MDI3IDg5LjEwMzUgNjQuODgwOUM4OS4yNTU5IDY0Ljk1OSA4OS40Mzk1IDY0Ljk5OCA4OS42NTQzIDY0Ljk5OEM4OS45NDM0IDY0Ljk5OCA5MC4xOTUzIDY0LjkzOTUgOTAuNDEwMiA2NC44MjIzQzkwLjYyODkgNjQuNzAxMiA5MC44MDA4IDY0LjU1NDcgOTAuOTI1OCA2NC4zODI4QzkxLjA1MDggNjQuMjA3IDkxLjExNzIgNjQuMDQxIDkxLjEyNSA2My44ODQ4TDkxLjU4MiA2NC41MTE3QzkxLjUzNTIgNjQuNjcxOSA5MS40NTUxIDY0Ljg0MzggOTEuMzQxOCA2NS4wMjczQzkxLjIyODUgNjUuMjEwOSA5MS4wODAxIDY1LjM4NjcgOTAuODk2NSA2NS41NTQ3QzkwLjcxNjggNjUuNzE4OCA5MC41IDY1Ljg1MzUgOTAuMjQ2MSA2NS45NTlDODkuOTk2MSA2Ni4wNjQ1IDg5LjcwNyA2Ni4xMTcyIDg5LjM3ODkgNjYuMTE3MkM4OC45NjQ4IDY2LjExNzIgODguNTk1NyA2Ni4wMzUyIDg4LjI3MTUgNjUuODcxMUM4Ny45NDczIDY1LjcwMzEgODcuNjkzNCA2NS40Nzg1IDg3LjUwOTggNjUuMTk3M0M4Ny4zMjYyIDY0LjkxMjEgODcuMjM0NCA2NC41ODk4IDg3LjIzNDQgNjQuMjMwNUM4Ny4yMzQ0IDYzLjg5NDUgODcuMjk2OSA2My41OTc3IDg3LjQyMTkgNjMuMzM5OEM4Ny41NTA4IDYzLjA3ODEgODcuNzM4MyA2Mi44NTk0IDg3Ljk4NDQgNjIuNjgzNkM4OC4yMzQ0IDYyLjUwNzggODguNTM5MSA2Mi4zNzUgODguODk4NCA2Mi4yODUyQzg5LjI1NzggNjIuMTkxNCA4OS42NjggNjIuMTQ0NSA5MC4xMjg5IDYyLjE0NDVIOTEuMjM2M1pNOTcuNzMyNCA2NC4yODMyQzk3LjczMjQgNjQuMTQyNiA5Ny42OTczIDY0LjAxNTYgOTcuNjI3IDYzLjkwMjNDOTcuNTU2NiA2My43ODUyIDk3LjQyMTkgNjMuNjc5NyA5Ny4yMjI3IDYzLjU4NTlDOTcuMDI3MyA2My40OTIyIDk2LjczODMgNjMuNDA2MiA5Ni4zNTU1IDYzLjMyODFDOTYuMDE5NSA2My4yNTM5IDk1LjcxMDkgNjMuMTY2IDk1LjQyOTcgNjMuMDY0NUM5NS4xNTIzIDYyLjk1OSA5NC45MTQxIDYyLjgzMiA5NC43MTQ4IDYyLjY4MzZDOTQuNTE1NiA2Mi41MzUyIDk0LjM2MTMgNjIuMzU5NCA5NC4yNTIgNjIuMTU2MkM5NC4xNDI2IDYxLjk1MzEgOTQuMDg3OSA2MS43MTg4IDk0LjA4NzkgNjEuNDUzMUM5NC4wODc5IDYxLjE5NTMgOTQuMTQ0NSA2MC45NTEyIDk0LjI1NzggNjAuNzIwN0M5NC4zNzExIDYwLjQ5MDIgOTQuNTMzMiA2MC4yODcxIDk0Ljc0NDEgNjAuMTExM0M5NC45NTUxIDU5LjkzNTUgOTUuMjEwOSA1OS43OTY5IDk1LjUxMTcgNTkuNjk1M0M5NS44MTY0IDU5LjU5MzggOTYuMTU2MiA1OS41NDMgOTYuNTMxMiA1OS41NDNDOTcuMDYyNSA1OS41NDMgOTcuNTE3NiA1OS42MzI4IDk3Ljg5NjUgNTkuODEyNUM5OC4yNzkzIDU5Ljk4ODMgOTguNTcyMyA2MC4yMjg1IDk4Ljc3NTQgNjAuNTMzMkM5OC45Nzg1IDYwLjgzNCA5OS4wODAxIDYxLjE3MzggOTkuMDgwMSA2MS41NTI3SDk3LjY2OEM5Ny42NjggNjEuMzg0OCA5Ny42MjUgNjEuMjI4NSA5Ny41MzkxIDYxLjA4NEM5Ny40NTcgNjAuOTM1NSA5Ny4zMzIgNjAuODE2NCA5Ny4xNjQxIDYwLjcyNjZDOTYuOTk2MSA2MC42MzI4IDk2Ljc4NTIgNjAuNTg1OSA5Ni41MzEyIDYwLjU4NTlDOTYuMjg5MSA2MC41ODU5IDk2LjA4NzkgNjAuNjI1IDk1LjkyNzcgNjAuNzAzMUM5NS43NzE1IDYwLjc3NzMgOTUuNjU0MyA2MC44NzUgOTUuNTc2MiA2MC45OTYxQzk1LjUwMiA2MS4xMTcyIDk1LjQ2NDggNjEuMjUgOTUuNDY0OCA2MS4zOTQ1Qzk1LjQ2NDggNjEuNSA5NS40ODQ0IDYxLjU5NTcgOTUuNTIzNCA2MS42ODE2Qzk1LjU2NjQgNjEuNzYzNyA5NS42MzY3IDYxLjgzOTggOTUuNzM0NCA2MS45MTAyQzk1LjgzMiA2MS45NzY2IDk1Ljk2NDggNjIuMDM5MSA5Ni4xMzI4IDYyLjA5NzdDOTYuMzA0NyA2Mi4xNTYyIDk2LjUxOTUgNjIuMjEyOSA5Ni43NzczIDYyLjI2NzZDOTcuMjYxNyA2Mi4zNjkxIDk3LjY3NzcgNjIuNSA5OC4wMjU0IDYyLjY2MDJDOTguMzc3IDYyLjgxNjQgOTguNjQ2NSA2My4wMTk1IDk4LjgzNCA2My4yNjk1Qzk5LjAyMTUgNjMuNTE1NiA5OS4xMTUyIDYzLjgyODEgOTkuMTE1MiA2NC4yMDdDOTkuMTE1MiA2NC40ODgzIDk5LjA1NDcgNjQuNzQ2MSA5OC45MzM2IDY0Ljk4MDVDOTguODE2NCA2NS4yMTA5IDk4LjY0NDUgNjUuNDEyMSA5OC40MTggNjUuNTg0Qzk4LjE5MTQgNjUuNzUyIDk3LjkxOTkgNjUuODgyOCA5Ny42MDM1IDY1Ljk3NjZDOTcuMjkxIDY2LjA3MDMgOTYuOTM5NSA2Ni4xMTcyIDk2LjU0ODggNjYuMTE3MkM5NS45NzQ2IDY2LjExNzIgOTUuNDg4MyA2Ni4wMTU2IDk1LjA4OTggNjUuODEyNUM5NC42OTE0IDY1LjYwNTUgOTQuMzg4NyA2NS4zNDE4IDk0LjE4MTYgNjUuMDIxNUM5My45Nzg1IDY0LjY5NzMgOTMuODc3IDY0LjM2MTMgOTMuODc3IDY0LjAxMzdIOTUuMjQyMkM5NS4yNTc4IDY0LjI3NTQgOTUuMzMwMSA2NC40ODQ0IDk1LjQ1OSA2NC42NDA2Qzk1LjU5MTggNjQuNzkzIDk1Ljc1NTkgNjQuOTA0MyA5NS45NTEyIDY0Ljk3NDZDOTYuMTUwNCA2NS4wNDEgOTYuMzU1NSA2NS4wNzQyIDk2LjU2NjQgNjUuMDc0MkM5Ni44MjAzIDY1LjA3NDIgOTcuMDMzMiA2NS4wNDEgOTcuMjA1MSA2NC45NzQ2Qzk3LjM3NyA2NC45MDQzIDk3LjUwNzggNjQuODEwNSA5Ny41OTc3IDY0LjY5MzRDOTcuNjg3NSA2NC41NzIzIDk3LjczMjQgNjQuNDM1NSA5Ny43MzI0IDY0LjI4MzJaTTEwMy41MDggNTkuNjYwMlY2MC42OTE0SDk5LjkzMzZWNTkuNjYwMkgxMDMuNTA4Wk0xMDAuOTY1IDU4LjEwNzRIMTAyLjM3N1Y2NC4yNDhDMTAyLjM3NyA2NC40NDM0IDEwMi40MDQgNjQuNTkzOCAxMDIuNDU5IDY0LjY5OTJDMTAyLjUxOCA2NC44MDA4IDEwMi41OTggNjQuODY5MSAxMDIuNjk5IDY0LjkwNDNDMTAyLjgwMSA2NC45Mzk1IDEwMi45MiA2NC45NTcgMTAzLjA1NyA2NC45NTdDMTAzLjE1NCA2NC45NTcgMTAzLjI0OCA2NC45NTEyIDEwMy4zMzggNjQuOTM5NUMxMDMuNDI4IDY0LjkyNzcgMTAzLjUgNjQuOTE2IDEwMy41NTUgNjQuOTA0M0wxMDMuNTYxIDY1Ljk4MjRDMTAzLjQ0MyA2Ni4wMTc2IDEwMy4zMDcgNjYuMDQ4OCAxMDMuMTUgNjYuMDc2MkMxMDIuOTk4IDY2LjEwMzUgMTAyLjgyMiA2Ni4xMTcyIDEwMi42MjMgNjYuMTE3MkMxMDIuMjk5IDY2LjExNzIgMTAyLjAxMiA2Ni4wNjA1IDEwMS43NjIgNjUuOTQ3M0MxMDEuNTEyIDY1LjgzMDEgMTAxLjMxNiA2NS42NDA2IDEwMS4xNzYgNjUuMzc4OUMxMDEuMDM1IDY1LjExNzIgMTAwLjk2NSA2NC43Njk1IDEwMC45NjUgNjQuMzM1OVY1OC4xMDc0Wk0xMTEuOSA2NC41MDU5VjU5LjY2MDJIMTEzLjMxOFY2NkgxMTEuOTgyTDExMS45IDY0LjUwNTlaTTExMi4xIDYzLjE4NzVMMTEyLjU3NCA2My4xNzU4QzExMi41NzQgNjMuNjAxNiAxMTIuNTI3IDYzLjk5NDEgMTEyLjQzNCA2NC4zNTM1QzExMi4zNCA2NC43MDkgMTEyLjE5NSA2NS4wMTk1IDExMiA2NS4yODUyQzExMS44MDUgNjUuNTQ2OSAxMTEuNTU1IDY1Ljc1MiAxMTEuMjUgNjUuOTAwNEMxMTAuOTQ1IDY2LjA0NDkgMTEwLjU4IDY2LjExNzIgMTEwLjE1NCA2Ni4xMTcyQzEwOS44NDYgNjYuMTE3MiAxMDkuNTYyIDY2LjA3MjMgMTA5LjMwNSA2NS45ODI0QzEwOS4wNDcgNjUuODkyNiAxMDguODI0IDY1Ljc1MzkgMTA4LjYzNyA2NS41NjY0QzEwOC40NTMgNjUuMzc4OSAxMDguMzExIDY1LjEzNDggMTA4LjIwOSA2NC44MzRDMTA4LjEwNyA2NC41MzMyIDEwOC4wNTcgNjQuMTczOCAxMDguMDU3IDYzLjc1NTlWNTkuNjYwMkgxMDkuNDY5VjYzLjc2NzZDMTA5LjQ2OSA2My45OTggMTA5LjQ5NiA2NC4xOTE0IDEwOS41NTEgNjQuMzQ3N0MxMDkuNjA1IDY0LjUgMTA5LjY4IDY0LjYyMyAxMDkuNzczIDY0LjcxNjhDMTA5Ljg2NyA2NC44MTA1IDEwOS45NzcgNjQuODc3IDExMC4xMDIgNjQuOTE2QzExMC4yMjcgNjQuOTU1MSAxMTAuMzU5IDY0Ljk3NDYgMTEwLjUgNjQuOTc0NkMxMTAuOTAyIDY0Ljk3NDYgMTExLjIxOSA2NC44OTY1IDExMS40NDkgNjQuNzQwMkMxMTEuNjg0IDY0LjU4MDEgMTExLjg1IDY0LjM2NTIgMTExLjk0NyA2NC4wOTU3QzExMi4wNDkgNjMuODI2MiAxMTIuMSA2My41MjM0IDExMi4xIDYzLjE4NzVaTTExNi40MzQgNjAuODc4OVY2OC40Mzc1SDExNS4wMjFWNTkuNjYwMkgxMTYuMzIyTDExNi40MzQgNjAuODc4OVpNMTIwLjU2NCA2Mi43NzE1VjYyLjg5NDVDMTIwLjU2NCA2My4zNTU1IDEyMC41MSA2My43ODMyIDEyMC40IDY0LjE3NzdDMTIwLjI5NSA2NC41Njg0IDEyMC4xMzcgNjQuOTEwMiAxMTkuOTI2IDY1LjIwMzFDMTE5LjcxOSA2NS40OTIyIDExOS40NjMgNjUuNzE2OCAxMTkuMTU4IDY1Ljg3N0MxMTguODU0IDY2LjAzNzEgMTE4LjUwMiA2Ni4xMTcyIDExOC4xMDQgNjYuMTE3MkMxMTcuNzA5IDY2LjExNzIgMTE3LjM2MyA2Ni4wNDQ5IDExNy4wNjYgNjUuOTAwNEMxMTYuNzczIDY1Ljc1MiAxMTYuNTI1IDY1LjU0MyAxMTYuMzIyIDY1LjI3MzRDMTE2LjExOSA2NS4wMDM5IDExNS45NTUgNjQuNjg3NSAxMTUuODMgNjQuMzI0MkMxMTUuNzA5IDYzLjk1NyAxMTUuNjIzIDYzLjU1NDcgMTE1LjU3MiA2My4xMTcyVjYyLjY0MjZDMTE1LjYyMyA2Mi4xNzc3IDExNS43MDkgNjEuNzU1OSAxMTUuODMgNjEuMzc3QzExNS45NTUgNjAuOTk4IDExNi4xMTkgNjAuNjcxOSAxMTYuMzIyIDYwLjM5ODRDMTE2LjUyNSA2MC4xMjUgMTE2Ljc3MyA1OS45MTQxIDExNy4wNjYgNTkuNzY1NkMxMTcuMzU5IDU5LjYxNzIgMTE3LjcwMSA1OS41NDMgMTE4LjA5MiA1OS41NDNDMTE4LjQ5IDU5LjU0MyAxMTguODQ0IDU5LjYyMTEgMTE5LjE1MiA1OS43NzczQzExOS40NjEgNTkuOTI5NyAxMTkuNzIxIDYwLjE0ODQgMTE5LjkzMiA2MC40MzM2QzEyMC4xNDMgNjAuNzE0OCAxMjAuMzAxIDYxLjA1NDcgMTIwLjQwNiA2MS40NTMxQzEyMC41MTIgNjEuODQ3NyAxMjAuNTY0IDYyLjI4NzEgMTIwLjU2NCA2Mi43NzE1Wk0xMTkuMTUyIDYyLjg5NDVWNjIuNzcxNUMxMTkuMTUyIDYyLjQ3ODUgMTE5LjEyNSA2Mi4yMDcgMTE5LjA3IDYxLjk1N0MxMTkuMDE2IDYxLjcwMzEgMTE4LjkzIDYxLjQ4MDUgMTE4LjgxMiA2MS4yODkxQzExOC42OTUgNjEuMDk3NyAxMTguNTQ1IDYwLjk0OTIgMTE4LjM2MSA2MC44NDM4QzExOC4xODIgNjAuNzM0NCAxMTcuOTY1IDYwLjY3OTcgMTE3LjcxMSA2MC42Nzk3QzExNy40NjEgNjAuNjc5NyAxMTcuMjQ2IDYwLjcyMjcgMTE3LjA2NiA2MC44MDg2QzExNi44ODcgNjAuODkwNiAxMTYuNzM2IDYxLjAwNTkgMTE2LjYxNSA2MS4xNTQzQzExNi40OTQgNjEuMzAyNyAxMTYuNCA2MS40NzY2IDExNi4zMzQgNjEuNjc1OEMxMTYuMjY4IDYxLjg3MTEgMTE2LjIyMSA2Mi4wODQgMTE2LjE5MyA2Mi4zMTQ1VjYzLjQ1MTJDMTE2LjI0IDYzLjczMjQgMTE2LjMyIDYzLjk5MDIgMTE2LjQzNCA2NC4yMjQ2QzExNi41NDcgNjQuNDU5IDExNi43MDcgNjQuNjQ2NSAxMTYuOTE0IDY0Ljc4NzFDMTE3LjEyNSA2NC45MjM4IDExNy4zOTUgNjQuOTkyMiAxMTcuNzIzIDY0Ljk5MjJDMTE3Ljk3NyA2NC45OTIyIDExOC4xOTMgNjQuOTM3NSAxMTguMzczIDY0LjgyODFDMTE4LjU1MyA2NC43MTg4IDExOC42OTkgNjQuNTY4NCAxMTguODEyIDY0LjM3N0MxMTguOTMgNjQuMTgxNiAxMTkuMDE2IDYzLjk1NyAxMTkuMDcgNjMuNzAzMUMxMTkuMTI1IDYzLjQ0OTIgMTE5LjE1MiA2My4xNzk3IDExOS4xNTIgNjIuODk0NVpNMTI1Ljg4MyA2NC42ODc1VjU3SDEyNy4zMDFWNjZIMTI2LjAxOEwxMjUuODgzIDY0LjY4NzVaTTEyMS43NTggNjIuOTAwNFY2Mi43NzczQzEyMS43NTggNjIuMjk2OSAxMjEuODE0IDYxLjg1OTQgMTIxLjkyOCA2MS40NjQ4QzEyMi4wNDEgNjEuMDY2NCAxMjIuMjA1IDYwLjcyNDYgMTIyLjQyIDYwLjQzOTVDMTIyLjYzNSA2MC4xNTA0IDEyMi44OTYgNTkuOTI5NyAxMjMuMjA1IDU5Ljc3NzNDMTIzLjUxNCA1OS42MjExIDEyMy44NjEgNTkuNTQzIDEyNC4yNDggNTkuNTQzQzEyNC42MzEgNTkuNTQzIDEyNC45NjcgNTkuNjE3MiAxMjUuMjU2IDU5Ljc2NTZDMTI1LjU0NSA1OS45MTQxIDEyNS43OTEgNjAuMTI3IDEyNS45OTQgNjAuNDA0M0MxMjYuMTk3IDYwLjY3NzcgMTI2LjM1OSA2MS4wMDU5IDEyNi40OCA2MS4zODg3QzEyNi42MDIgNjEuNzY3NiAxMjYuNjg4IDYyLjE4OTUgMTI2LjczOCA2Mi42NTQzVjYzLjA0NjlDMTI2LjY4OCA2My41IDEyNi42MDIgNjMuOTE0MSAxMjYuNDggNjQuMjg5MUMxMjYuMzU5IDY0LjY2NDEgMTI2LjE5NyA2NC45ODgzIDEyNS45OTQgNjUuMjYxN0MxMjUuNzkxIDY1LjUzNTIgMTI1LjU0MyA2NS43NDYxIDEyNS4yNSA2NS44OTQ1QzEyNC45NjEgNjYuMDQzIDEyNC42MjMgNjYuMTE3MiAxMjQuMjM2IDY2LjExNzJDMTIzLjg1NCA2Ni4xMTcyIDEyMy41MDggNjYuMDM3MSAxMjMuMTk5IDY1Ljg3N0MxMjIuODk1IDY1LjcxNjggMTIyLjYzNSA2NS40OTIyIDEyMi40MiA2NS4yMDMxQzEyMi4yMDUgNjQuOTE0MSAxMjIuMDQxIDY0LjU3NDIgMTIxLjkyOCA2NC4xODM2QzEyMS44MTQgNjMuNzg5MSAxMjEuNzU4IDYzLjM2MTMgMTIxLjc1OCA2Mi45MDA0Wk0xMjMuMTcgNjIuNzc3M1Y2Mi45MDA0QzEyMy4xNyA2My4xODk1IDEyMy4xOTUgNjMuNDU5IDEyMy4yNDYgNjMuNzA5QzEyMy4zMDEgNjMuOTU5IDEyMy4zODUgNjQuMTc5NyAxMjMuNDk4IDY0LjM3MTFDMTIzLjYxMSA2NC41NTg2IDEyMy43NTggNjQuNzA3IDEyMy45MzggNjQuODE2NEMxMjQuMTIxIDY0LjkyMTkgMTI0LjM0IDY0Ljk3NDYgMTI0LjU5NCA2NC45NzQ2QzEyNC45MTQgNjQuOTc0NiAxMjUuMTc4IDY0LjkwNDMgMTI1LjM4NSA2NC43NjM3QzEyNS41OTIgNjQuNjIzIDEyNS43NTQgNjQuNDMzNiAxMjUuODcxIDY0LjE5NTNDMTI1Ljk5MiA2My45NTMxIDEyNi4wNzQgNjMuNjgzNiAxMjYuMTE3IDYzLjM4NjdWNjIuMzI2MkMxMjYuMDk0IDYyLjA5NTcgMTI2LjA0NSA2MS44ODA5IDEyNS45NzEgNjEuNjgxNkMxMjUuOSA2MS40ODI0IDEyNS44MDUgNjEuMzA4NiAxMjUuNjg0IDYxLjE2MDJDMTI1LjU2MiA2MS4wMDc4IDEyNS40MTIgNjAuODkwNiAxMjUuMjMyIDYwLjgwODZDMTI1LjA1NyA2MC43MjI3IDEyNC44NDggNjAuNjc5NyAxMjQuNjA1IDYwLjY3OTdDMTI0LjM0OCA2MC42Nzk3IDEyNC4xMjkgNjAuNzM0NCAxMjMuOTQ5IDYwLjg0MzhDMTIzLjc3IDYwLjk1MzEgMTIzLjYyMSA2MS4xMDM1IDEyMy41MDQgNjEuMjk0OUMxMjMuMzkxIDYxLjQ4NjMgMTIzLjMwNyA2MS43MDkgMTIzLjI1MiA2MS45NjI5QzEyMy4xOTcgNjIuMjE2OCAxMjMuMTcgNjIuNDg4MyAxMjMuMTcgNjIuNzc3M1pNMTMyLjYwMiA2NC43Mjg1VjYxLjcwNTFDMTMyLjYwMiA2MS40Nzg1IDEzMi41NjEgNjEuMjgzMiAxMzIuNDc5IDYxLjExOTFDMTMyLjM5NiA2MC45NTUxIDEzMi4yNzEgNjAuODI4MSAxMzIuMTA0IDYwLjczODNDMTMxLjkzOSA2MC42NDg0IDEzMS43MzIgNjAuNjAzNSAxMzEuNDgyIDYwLjYwMzVDMTMxLjI1MiA2MC42MDM1IDEzMS4wNTMgNjAuNjQyNiAxMzAuODg1IDYwLjcyMDdDMTMwLjcxNyA2MC43OTg4IDEzMC41ODYgNjAuOTA0MyAxMzAuNDkyIDYxLjAzNzFDMTMwLjM5OCA2MS4xNjk5IDEzMC4zNTIgNjEuMzIwMyAxMzAuMzUyIDYxLjQ4ODNIMTI4Ljk0NUMxMjguOTQ1IDYxLjIzODMgMTI5LjAwNiA2MC45OTYxIDEyOS4xMjcgNjAuNzYxN0MxMjkuMjQ4IDYwLjUyNzMgMTI5LjQyNCA2MC4zMTg0IDEyOS42NTQgNjAuMTM0OEMxMjkuODg1IDU5Ljk1MTIgMTMwLjE2IDU5LjgwNjYgMTMwLjQ4IDU5LjcwMTJDMTMwLjgwMSA1OS41OTU3IDEzMS4xNiA1OS41NDMgMTMxLjU1OSA1OS41NDNDMTMyLjAzNSA1OS41NDMgMTMyLjQ1NyA1OS42MjMgMTMyLjgyNCA1OS43ODMyQzEzMy4xOTUgNTkuOTQzNCAxMzMuNDg2IDYwLjE4NTUgMTMzLjY5NyA2MC41MDk4QzEzMy45MTIgNjAuODMwMSAxMzQuMDIgNjEuMjMyNCAxMzQuMDIgNjEuNzE2OFY2NC41MzUyQzEzNC4wMiA2NC44MjQyIDEzNC4wMzkgNjUuMDg0IDEzNC4wNzggNjUuMzE0NUMxMzQuMTIxIDY1LjU0MSAxMzQuMTgyIDY1LjczODMgMTM0LjI2IDY1LjkwNjJWNjZIMTMyLjgxMkMxMzIuNzQ2IDY1Ljg0NzcgMTMyLjY5MyA2NS42NTQzIDEzMi42NTQgNjUuNDE5OUMxMzIuNjE5IDY1LjE4MTYgMTMyLjYwMiA2NC45NTEyIDEzMi42MDIgNjQuNzI4NVpNMTMyLjgwNyA2Mi4xNDQ1TDEzMi44MTggNjMuMDE3NkgxMzEuODA1QzEzMS41NDMgNjMuMDE3NiAxMzEuMzEyIDYzLjA0MyAxMzEuMTEzIDYzLjA5MzhDMTMwLjkxNCA2My4xNDA2IDEzMC43NDggNjMuMjEwOSAxMzAuNjE1IDYzLjMwNDdDMTMwLjQ4MiA2My4zOTg0IDEzMC4zODMgNjMuNTExNyAxMzAuMzE2IDYzLjY0NDVDMTMwLjI1IDYzLjc3NzMgMTMwLjIxNyA2My45Mjc3IDEzMC4yMTcgNjQuMDk1N0MxMzAuMjE3IDY0LjI2MzcgMTMwLjI1NiA2NC40MTggMTMwLjMzNCA2NC41NTg2QzEzMC40MTIgNjQuNjk1MyAxMzAuNTI1IDY0LjgwMjcgMTMwLjY3NCA2NC44ODA5QzEzMC44MjYgNjQuOTU5IDEzMS4wMSA2NC45OTggMTMxLjIyNSA2NC45OThDMTMxLjUxNCA2NC45OTggMTMxLjc2NiA2NC45Mzk1IDEzMS45OCA2NC44MjIzQzEzMi4xOTkgNjQuNzAxMiAxMzIuMzcxIDY0LjU1NDcgMTMyLjQ5NiA2NC4zODI4QzEzMi42MjEgNjQuMjA3IDEzMi42ODggNjQuMDQxIDEzMi42OTUgNjMuODg0OEwxMzMuMTUyIDY0LjUxMTdDMTMzLjEwNSA2NC42NzE5IDEzMy4wMjUgNjQuODQzOCAxMzIuOTEyIDY1LjAyNzNDMTMyLjc5OSA2NS4yMTA5IDEzMi42NSA2NS4zODY3IDEzMi40NjcgNjUuNTU0N0MxMzIuMjg3IDY1LjcxODggMTMyLjA3IDY1Ljg1MzUgMTMxLjgxNiA2NS45NTlDMTMxLjU2NiA2Ni4wNjQ1IDEzMS4yNzcgNjYuMTE3MiAxMzAuOTQ5IDY2LjExNzJDMTMwLjUzNSA2Ni4xMTcyIDEzMC4xNjYgNjYuMDM1MiAxMjkuODQyIDY1Ljg3MTFDMTI5LjUxOCA2NS43MDMxIDEyOS4yNjQgNjUuNDc4NSAxMjkuMDggNjUuMTk3M0MxMjguODk2IDY0LjkxMjEgMTI4LjgwNSA2NC41ODk4IDEyOC44MDUgNjQuMjMwNUMxMjguODA1IDYzLjg5NDUgMTI4Ljg2NyA2My41OTc3IDEyOC45OTIgNjMuMzM5OEMxMjkuMTIxIDYzLjA3ODEgMTI5LjMwOSA2Mi44NTk0IDEyOS41NTUgNjIuNjgzNkMxMjkuODA1IDYyLjUwNzggMTMwLjEwOSA2Mi4zNzUgMTMwLjQ2OSA2Mi4yODUyQzEzMC44MjggNjIuMTkxNCAxMzEuMjM4IDYyLjE0NDUgMTMxLjY5OSA2Mi4xNDQ1SDEzMi44MDdaTTEzOC42NTIgNTkuNjYwMlY2MC42OTE0SDEzNS4wNzhWNTkuNjYwMkgxMzguNjUyWk0xMzYuMTA5IDU4LjEwNzRIMTM3LjUyMVY2NC4yNDhDMTM3LjUyMSA2NC40NDM0IDEzNy41NDkgNjQuNTkzOCAxMzcuNjA0IDY0LjY5OTJDMTM3LjY2MiA2NC44MDA4IDEzNy43NDIgNjQuODY5MSAxMzcuODQ0IDY0LjkwNDNDMTM3Ljk0NSA2NC45Mzk1IDEzOC4wNjQgNjQuOTU3IDEzOC4yMDEgNjQuOTU3QzEzOC4yOTkgNjQuOTU3IDEzOC4zOTMgNjQuOTUxMiAxMzguNDgyIDY0LjkzOTVDMTM4LjU3MiA2NC45Mjc3IDEzOC42NDUgNjQuOTE2IDEzOC42OTkgNjQuOTA0M0wxMzguNzA1IDY1Ljk4MjRDMTM4LjU4OCA2Ni4wMTc2IDEzOC40NTEgNjYuMDQ4OCAxMzguMjk1IDY2LjA3NjJDMTM4LjE0MyA2Ni4xMDM1IDEzNy45NjcgNjYuMTE3MiAxMzcuNzY4IDY2LjExNzJDMTM3LjQ0MyA2Ni4xMTcyIDEzNy4xNTYgNjYuMDYwNSAxMzYuOTA2IDY1Ljk0NzNDMTM2LjY1NiA2NS44MzAxIDEzNi40NjEgNjUuNjQwNiAxMzYuMzIgNjUuMzc4OUMxMzYuMTggNjUuMTE3MiAxMzYuMTA5IDY0Ljc2OTUgMTM2LjEwOSA2NC4zMzU5VjU4LjEwNzRaTTE0Mi43ODcgNjYuMTE3MkMxNDIuMzE4IDY2LjExNzIgMTQxLjg5NSA2Ni4wNDEgMTQxLjUxNiA2NS44ODg3QzE0MS4xNDEgNjUuNzMyNCAxNDAuODIgNjUuNTE1NiAxNDAuNTU1IDY1LjIzODNDMTQwLjI5MyA2NC45NjA5IDE0MC4wOTIgNjQuNjM0OCAxMzkuOTUxIDY0LjI1OThDMTM5LjgxMSA2My44ODQ4IDEzOS43NCA2My40ODA1IDEzOS43NCA2My4wNDY5VjYyLjgxMjVDMTM5Ljc0IDYyLjMxNjQgMTM5LjgxMiA2MS44NjcyIDEzOS45NTcgNjEuNDY0OEMxNDAuMTAyIDYxLjA2MjUgMTQwLjMwMyA2MC43MTg4IDE0MC41NjEgNjAuNDMzNkMxNDAuODE4IDYwLjE0NDUgMTQxLjEyMyA1OS45MjM4IDE0MS40NzUgNTkuNzcxNUMxNDEuODI2IDU5LjYxOTEgMTQyLjIwNyA1OS41NDMgMTQyLjYxNyA1OS41NDNDMTQzLjA3IDU5LjU0MyAxNDMuNDY3IDU5LjYxOTEgMTQzLjgwNyA1OS43NzE1QzE0NC4xNDYgNTkuOTIzOCAxNDQuNDI4IDYwLjEzODcgMTQ0LjY1IDYwLjQxNkMxNDQuODc3IDYwLjY4OTUgMTQ1LjA0NSA2MS4wMTU2IDE0NS4xNTQgNjEuMzk0NUMxNDUuMjY4IDYxLjc3MzQgMTQ1LjMyNCA2Mi4xOTE0IDE0NS4zMjQgNjIuNjQ4NFY2My4yNTJIMTQwLjQyNlY2Mi4yMzgzSDE0My45M1Y2Mi4xMjdDMTQzLjkyMiA2MS44NzMgMTQzLjg3MSA2MS42MzQ4IDE0My43NzcgNjEuNDEyMUMxNDMuNjg4IDYxLjE4OTUgMTQzLjU0OSA2MS4wMDk4IDE0My4zNjEgNjAuODczQzE0My4xNzQgNjAuNzM2MyAxNDIuOTI0IDYwLjY2OCAxNDIuNjExIDYwLjY2OEMxNDIuMzc3IDYwLjY2OCAxNDIuMTY4IDYwLjcxODggMTQxLjk4NCA2MC44MjAzQzE0MS44MDUgNjAuOTE4IDE0MS42NTQgNjEuMDYwNSAxNDEuNTMzIDYxLjI0OEMxNDEuNDEyIDYxLjQzNTUgMTQxLjMxOCA2MS42NjIxIDE0MS4yNTIgNjEuOTI3N0MxNDEuMTg5IDYyLjE4OTUgMTQxLjE1OCA2Mi40ODQ0IDE0MS4xNTggNjIuODEyNVY2My4wNDY5QzE0MS4xNTggNjMuMzI0MiAxNDEuMTk1IDYzLjU4MiAxNDEuMjcgNjMuODIwM0MxNDEuMzQ4IDY0LjA1NDcgMTQxLjQ2MSA2NC4yNTk4IDE0MS42MDkgNjQuNDM1NUMxNDEuNzU4IDY0LjYxMTMgMTQxLjkzOCA2NC43NSAxNDIuMTQ4IDY0Ljg1MTZDMTQyLjM1OSA2NC45NDkyIDE0Mi42IDY0Ljk5OCAxNDIuODY5IDY0Ljk5OEMxNDMuMjA5IDY0Ljk5OCAxNDMuNTEyIDY0LjkyOTcgMTQzLjc3NyA2NC43OTNDMTQ0LjA0MyA2NC42NTYyIDE0NC4yNzMgNjQuNDYyOSAxNDQuNDY5IDY0LjIxMjlMMTQ1LjIxMyA2NC45MzM2QzE0NS4wNzYgNjUuMTMyOCAxNDQuODk4IDY1LjMyNDIgMTQ0LjY4IDY1LjUwNzhDMTQ0LjQ2MSA2NS42ODc1IDE0NC4xOTMgNjUuODM0IDE0My44NzcgNjUuOTQ3M0MxNDMuNTY0IDY2LjA2MDUgMTQzLjIwMSA2Ni4xMTcyIDE0Mi43ODcgNjYuMTE3MlpNMTUzLjY4OCA1Ny40Mzk1VjY2SDE1Mi4yNzVWNTkuMTE1MkwxNTAuMTg0IDU5LjgyNDJWNTguNjU4MkwxNTMuNTE4IDU3LjQzOTVIMTUzLjY4OFpNMTYwLjg1MiA2NC42ODc1VjU3SDE2Mi4yN1Y2NkgxNjAuOTg2TDE2MC44NTIgNjQuNjg3NVpNMTU2LjcyNyA2Mi45MDA0VjYyLjc3NzNDMTU2LjcyNyA2Mi4yOTY5IDE1Ni43ODMgNjEuODU5NCAxNTYuODk2IDYxLjQ2NDhDMTU3LjAxIDYxLjA2NjQgMTU3LjE3NCA2MC43MjQ2IDE1Ny4zODkgNjAuNDM5NUMxNTcuNjA0IDYwLjE1MDQgMTU3Ljg2NSA1OS45Mjk3IDE1OC4xNzQgNTkuNzc3M0MxNTguNDgyIDU5LjYyMTEgMTU4LjgzIDU5LjU0MyAxNTkuMjE3IDU5LjU0M0MxNTkuNiA1OS41NDMgMTU5LjkzNiA1OS42MTcyIDE2MC4yMjUgNTkuNzY1NkMxNjAuNTE0IDU5LjkxNDEgMTYwLjc2IDYwLjEyNyAxNjAuOTYzIDYwLjQwNDNDMTYxLjE2NiA2MC42Nzc3IDE2MS4zMjggNjEuMDA1OSAxNjEuNDQ5IDYxLjM4ODdDMTYxLjU3IDYxLjc2NzYgMTYxLjY1NiA2Mi4xODk1IDE2MS43MDcgNjIuNjU0M1Y2My4wNDY5QzE2MS42NTYgNjMuNSAxNjEuNTcgNjMuOTE0MSAxNjEuNDQ5IDY0LjI4OTFDMTYxLjMyOCA2NC42NjQxIDE2MS4xNjYgNjQuOTg4MyAxNjAuOTYzIDY1LjI2MTdDMTYwLjc2IDY1LjUzNTIgMTYwLjUxMiA2NS43NDYxIDE2MC4yMTkgNjUuODk0NUMxNTkuOTMgNjYuMDQzIDE1OS41OTIgNjYuMTE3MiAxNTkuMjA1IDY2LjExNzJDMTU4LjgyMiA2Ni4xMTcyIDE1OC40NzcgNjYuMDM3MSAxNTguMTY4IDY1Ljg3N0MxNTcuODYzIDY1LjcxNjggMTU3LjYwNCA2NS40OTIyIDE1Ny4zODkgNjUuMjAzMUMxNTcuMTc0IDY0LjkxNDEgMTU3LjAxIDY0LjU3NDIgMTU2Ljg5NiA2NC4xODM2QzE1Ni43ODMgNjMuNzg5MSAxNTYuNzI3IDYzLjM2MTMgMTU2LjcyNyA2Mi45MDA0Wk0xNTguMTM5IDYyLjc3NzNWNjIuOTAwNEMxNTguMTM5IDYzLjE4OTUgMTU4LjE2NCA2My40NTkgMTU4LjIxNSA2My43MDlDMTU4LjI3IDYzLjk1OSAxNTguMzU0IDY0LjE3OTcgMTU4LjQ2NyA2NC4zNzExQzE1OC41OCA2NC41NTg2IDE1OC43MjcgNjQuNzA3IDE1OC45MDYgNjQuODE2NEMxNTkuMDkgNjQuOTIxOSAxNTkuMzA5IDY0Ljk3NDYgMTU5LjU2MiA2NC45NzQ2QzE1OS44ODMgNjQuOTc0NiAxNjAuMTQ2IDY0LjkwNDMgMTYwLjM1NCA2NC43NjM3QzE2MC41NjEgNjQuNjIzIDE2MC43MjMgNjQuNDMzNiAxNjAuODQgNjQuMTk1M0MxNjAuOTYxIDYzLjk1MzEgMTYxLjA0MyA2My42ODM2IDE2MS4wODYgNjMuMzg2N1Y2Mi4zMjYyQzE2MS4wNjIgNjIuMDk1NyAxNjEuMDE0IDYxLjg4MDkgMTYwLjkzOSA2MS42ODE2QzE2MC44NjkgNjEuNDgyNCAxNjAuNzczIDYxLjMwODYgMTYwLjY1MiA2MS4xNjAyQzE2MC41MzEgNjEuMDA3OCAxNjAuMzgxIDYwLjg5MDYgMTYwLjIwMSA2MC44MDg2QzE2MC4wMjUgNjAuNzIyNyAxNTkuODE2IDYwLjY3OTcgMTU5LjU3NCA2MC42Nzk3QzE1OS4zMTYgNjAuNjc5NyAxNTkuMDk4IDYwLjczNDQgMTU4LjkxOCA2MC44NDM4QzE1OC43MzggNjAuOTUzMSAxNTguNTkgNjEuMTAzNSAxNTguNDczIDYxLjI5NDlDMTU4LjM1OSA2MS40ODYzIDE1OC4yNzUgNjEuNzA5IDE1OC4yMjEgNjEuOTYyOUMxNTguMTY2IDYyLjIxNjggMTU4LjEzOSA2Mi40ODgzIDE1OC4xMzkgNjIuNzc3M1pNMTcwLjgwOSA2NC43Mjg1VjYxLjcwNTFDMTcwLjgwOSA2MS40Nzg1IDE3MC43NjggNjEuMjgzMiAxNzAuNjg2IDYxLjExOTFDMTcwLjYwNCA2MC45NTUxIDE3MC40NzkgNjAuODI4MSAxNzAuMzExIDYwLjczODNDMTcwLjE0NiA2MC42NDg0IDE2OS45MzkgNjAuNjAzNSAxNjkuNjg5IDYwLjYwMzVDMTY5LjQ1OSA2MC42MDM1IDE2OS4yNiA2MC42NDI2IDE2OS4wOTIgNjAuNzIwN0MxNjguOTI0IDYwLjc5ODggMTY4Ljc5MyA2MC45MDQzIDE2OC42OTkgNjEuMDM3MUMxNjguNjA1IDYxLjE2OTkgMTY4LjU1OSA2MS4zMjAzIDE2OC41NTkgNjEuNDg4M0gxNjcuMTUyQzE2Ny4xNTIgNjEuMjM4MyAxNjcuMjEzIDYwLjk5NjEgMTY3LjMzNCA2MC43NjE3QzE2Ny40NTUgNjAuNTI3MyAxNjcuNjMxIDYwLjMxODQgMTY3Ljg2MSA2MC4xMzQ4QzE2OC4wOTIgNTkuOTUxMiAxNjguMzY3IDU5LjgwNjYgMTY4LjY4OCA1OS43MDEyQzE2OS4wMDggNTkuNTk1NyAxNjkuMzY3IDU5LjU0MyAxNjkuNzY2IDU5LjU0M0MxNzAuMjQyIDU5LjU0MyAxNzAuNjY0IDU5LjYyMyAxNzEuMDMxIDU5Ljc4MzJDMTcxLjQwMiA1OS45NDM0IDE3MS42OTMgNjAuMTg1NSAxNzEuOTA0IDYwLjUwOThDMTcyLjExOSA2MC44MzAxIDE3Mi4yMjcgNjEuMjMyNCAxNzIuMjI3IDYxLjcxNjhWNjQuNTM1MkMxNzIuMjI3IDY0LjgyNDIgMTcyLjI0NiA2NS4wODQgMTcyLjI4NSA2NS4zMTQ1QzE3Mi4zMjggNjUuNTQxIDE3Mi4zODkgNjUuNzM4MyAxNzIuNDY3IDY1LjkwNjJWNjZIMTcxLjAyQzE3MC45NTMgNjUuODQ3NyAxNzAuOSA2NS42NTQzIDE3MC44NjEgNjUuNDE5OUMxNzAuODI2IDY1LjE4MTYgMTcwLjgwOSA2NC45NTEyIDE3MC44MDkgNjQuNzI4NVpNMTcxLjAxNCA2Mi4xNDQ1TDE3MS4wMjUgNjMuMDE3NkgxNzAuMDEyQzE2OS43NSA2My4wMTc2IDE2OS41MiA2My4wNDMgMTY5LjMyIDYzLjA5MzhDMTY5LjEyMSA2My4xNDA2IDE2OC45NTUgNjMuMjEwOSAxNjguODIyIDYzLjMwNDdDMTY4LjY4OSA2My4zOTg0IDE2OC41OSA2My41MTE3IDE2OC41MjMgNjMuNjQ0NUMxNjguNDU3IDYzLjc3NzMgMTY4LjQyNCA2My45Mjc3IDE2OC40MjQgNjQuMDk1N0MxNjguNDI0IDY0LjI2MzcgMTY4LjQ2MyA2NC40MTggMTY4LjU0MSA2NC41NTg2QzE2OC42MTkgNjQuNjk1MyAxNjguNzMyIDY0LjgwMjcgMTY4Ljg4MSA2NC44ODA5QzE2OS4wMzMgNjQuOTU5IDE2OS4yMTcgNjQuOTk4IDE2OS40MzIgNjQuOTk4QzE2OS43MjEgNjQuOTk4IDE2OS45NzMgNjQuOTM5NSAxNzAuMTg4IDY0LjgyMjNDMTcwLjQwNiA2NC43MDEyIDE3MC41NzggNjQuNTU0NyAxNzAuNzAzIDY0LjM4MjhDMTcwLjgyOCA2NC4yMDcgMTcwLjg5NSA2NC4wNDEgMTcwLjkwMiA2My44ODQ4TDE3MS4zNTkgNjQuNTExN0MxNzEuMzEyIDY0LjY3MTkgMTcxLjIzMiA2NC44NDM4IDE3MS4xMTkgNjUuMDI3M0MxNzEuMDA2IDY1LjIxMDkgMTcwLjg1NyA2NS4zODY3IDE3MC42NzQgNjUuNTU0N0MxNzAuNDk0IDY1LjcxODggMTcwLjI3NyA2NS44NTM1IDE3MC4wMjMgNjUuOTU5QzE2OS43NzMgNjYuMDY0NSAxNjkuNDg0IDY2LjExNzIgMTY5LjE1NiA2Ni4xMTcyQzE2OC43NDIgNjYuMTE3MiAxNjguMzczIDY2LjAzNTIgMTY4LjA0OSA2NS44NzExQzE2Ny43MjUgNjUuNzAzMSAxNjcuNDcxIDY1LjQ3ODUgMTY3LjI4NyA2NS4xOTczQzE2Ny4xMDQgNjQuOTEyMSAxNjcuMDEyIDY0LjU4OTggMTY3LjAxMiA2NC4yMzA1QzE2Ny4wMTIgNjMuODk0NSAxNjcuMDc0IDYzLjU5NzcgMTY3LjE5OSA2My4zMzk4QzE2Ny4zMjggNjMuMDc4MSAxNjcuNTE2IDYyLjg1OTQgMTY3Ljc2MiA2Mi42ODM2QzE2OC4wMTIgNjIuNTA3OCAxNjguMzE2IDYyLjM3NSAxNjguNjc2IDYyLjI4NTJDMTY5LjAzNSA2Mi4xOTE0IDE2OS40NDUgNjIuMTQ0NSAxNjkuOTA2IDYyLjE0NDVIMTcxLjAxNFpNMTc4LjAxNCA1OS42NjAySDE3OS4yOTdWNjUuODI0MkMxNzkuMjk3IDY2LjM5NDUgMTc5LjE3NiA2Ni44Nzg5IDE3OC45MzQgNjcuMjc3M0MxNzguNjkxIDY3LjY3NTggMTc4LjM1NCA2Ny45Nzg1IDE3Ny45MiA2OC4xODU1QzE3Ny40ODYgNjguMzk2NSAxNzYuOTg0IDY4LjUwMiAxNzYuNDE0IDY4LjUwMkMxNzYuMTcyIDY4LjUwMiAxNzUuOTAyIDY4LjQ2NjggMTc1LjYwNSA2OC4zOTY1QzE3NS4zMTIgNjguMzI2MiAxNzUuMDI3IDY4LjIxMjkgMTc0Ljc1IDY4LjA1NjZDMTc0LjQ3NyA2Ny45MDQzIDE3NC4yNDggNjcuNzAzMSAxNzQuMDY0IDY3LjQ1MzFMMTc0LjcyNyA2Ni42MjExQzE3NC45NTMgNjYuODkwNiAxNzUuMjAzIDY3LjA4NzkgMTc1LjQ3NyA2Ny4yMTI5QzE3NS43NSA2Ny4zMzc5IDE3Ni4wMzcgNjcuNDAwNCAxNzYuMzM4IDY3LjQwMDRDMTc2LjY2MiA2Ny40MDA0IDE3Ni45MzggNjcuMzM5OCAxNzcuMTY0IDY3LjIxODhDMTc3LjM5NSA2Ny4xMDE2IDE3Ny41NzIgNjYuOTI3NyAxNzcuNjk3IDY2LjY5NzNDMTc3LjgyMiA2Ni40NjY4IDE3Ny44ODUgNjYuMTg1NSAxNzcuODg1IDY1Ljg1MzVWNjEuMDk1N0wxNzguMDE0IDU5LjY2MDJaTTE3My43MDcgNjIuOTAwNFY2Mi43NzczQzE3My43MDcgNjIuMjk2OSAxNzMuNzY2IDYxLjg1OTQgMTczLjg4MyA2MS40NjQ4QzE3NCA2MS4wNjY0IDE3NC4xNjggNjAuNzI0NiAxNzQuMzg3IDYwLjQzOTVDMTc0LjYwNSA2MC4xNTA0IDE3NC44NzEgNTkuOTI5NyAxNzUuMTg0IDU5Ljc3NzNDMTc1LjQ5NiA1OS42MjExIDE3NS44NSA1OS41NDMgMTc2LjI0NCA1OS41NDNDMTc2LjY1NCA1OS41NDMgMTc3LjAwNCA1OS42MTcyIDE3Ny4yOTMgNTkuNzY1NkMxNzcuNTg2IDU5LjkxNDEgMTc3LjgzIDYwLjEyNyAxNzguMDI1IDYwLjQwNDNDMTc4LjIyMSA2MC42Nzc3IDE3OC4zNzMgNjEuMDA1OSAxNzguNDgyIDYxLjM4ODdDMTc4LjU5NiA2MS43Njc2IDE3OC42OCA2Mi4xODk1IDE3OC43MzQgNjIuNjU0M1Y2My4wNDY5QzE3OC42ODQgNjMuNSAxNzguNTk4IDYzLjkxNDEgMTc4LjQ3NyA2NC4yODkxQzE3OC4zNTUgNjQuNjY0MSAxNzguMTk1IDY0Ljk4ODMgMTc3Ljk5NiA2NS4yNjE3QzE3Ny43OTcgNjUuNTM1MiAxNzcuNTUxIDY1Ljc0NjEgMTc3LjI1OCA2NS44OTQ1QzE3Ni45NjkgNjYuMDQzIDE3Ni42MjcgNjYuMTE3MiAxNzYuMjMyIDY2LjExNzJDMTc1Ljg0NiA2Ni4xMTcyIDE3NS40OTYgNjYuMDM3MSAxNzUuMTg0IDY1Ljg3N0MxNzQuODc1IDY1LjcxNjggMTc0LjYwOSA2NS40OTIyIDE3NC4zODcgNjUuMjAzMUMxNzQuMTY4IDY0LjkxNDEgMTc0IDY0LjU3NDIgMTczLjg4MyA2NC4xODM2QzE3My43NjYgNjMuNzg5MSAxNzMuNzA3IDYzLjM2MTMgMTczLjcwNyA2Mi45MDA0Wk0xNzUuMTE5IDYyLjc3NzNWNjIuOTAwNEMxNzUuMTE5IDYzLjE4OTUgMTc1LjE0NiA2My40NTkgMTc1LjIwMSA2My43MDlDMTc1LjI2IDYzLjk1OSAxNzUuMzQ4IDY0LjE3OTcgMTc1LjQ2NSA2NC4zNzExQzE3NS41ODYgNjQuNTU4NiAxNzUuNzM4IDY0LjcwNyAxNzUuOTIyIDY0LjgxNjRDMTc2LjEwOSA2NC45MjE5IDE3Ni4zMyA2NC45NzQ2IDE3Ni41ODQgNjQuOTc0NkMxNzYuOTE2IDY0Ljk3NDYgMTc3LjE4OCA2NC45MDQzIDE3Ny4zOTggNjQuNzYzN0MxNzcuNjEzIDY0LjYyMyAxNzcuNzc3IDY0LjQzMzYgMTc3Ljg5MSA2NC4xOTUzQzE3OC4wMDggNjMuOTUzMSAxNzguMDkgNjMuNjgzNiAxNzguMTM3IDYzLjM4NjdWNjIuMzI2MkMxNzguMTEzIDYyLjA5NTcgMTc4LjA2NCA2MS44ODA5IDE3Ny45OSA2MS42ODE2QzE3Ny45MiA2MS40ODI0IDE3Ny44MjQgNjEuMzA4NiAxNzcuNzAzIDYxLjE2MDJDMTc3LjU4MiA2MS4wMDc4IDE3Ny40MyA2MC44OTA2IDE3Ny4yNDYgNjAuODA4NkMxNzcuMDYyIDYwLjcyMjcgMTc2Ljg0NiA2MC42Nzk3IDE3Ni41OTYgNjAuNjc5N0MxNzYuMzQyIDYwLjY3OTcgMTc2LjEyMSA2MC43MzQ0IDE3NS45MzQgNjAuODQzOEMxNzUuNzQ2IDYwLjk1MzEgMTc1LjU5MiA2MS4xMDM1IDE3NS40NzEgNjEuMjk0OUMxNzUuMzU0IDYxLjQ4NjMgMTc1LjI2NiA2MS43MDkgMTc1LjIwNyA2MS45NjI5QzE3NS4xNDggNjIuMjE2OCAxNzUuMTE5IDYyLjQ4ODMgMTc1LjExOSA2Mi43NzczWk0xODAuNzQyIDYyLjkwMDRWNjIuNzY1NkMxODAuNzQyIDYyLjMwODYgMTgwLjgwOSA2MS44ODQ4IDE4MC45NDEgNjEuNDk0MUMxODEuMDc0IDYxLjA5OTYgMTgxLjI2NiA2MC43NTc4IDE4MS41MTYgNjAuNDY4OEMxODEuNzcgNjAuMTc1OCAxODIuMDc4IDU5Ljk0OTIgMTgyLjQ0MSA1OS43ODkxQzE4Mi44MDkgNTkuNjI1IDE4My4yMjMgNTkuNTQzIDE4My42ODQgNTkuNTQzQzE4NC4xNDggNTkuNTQzIDE4NC41NjIgNTkuNjI1IDE4NC45MjYgNTkuNzg5MUMxODUuMjkzIDU5Ljk0OTIgMTg1LjYwNCA2MC4xNzU4IDE4NS44NTcgNjAuNDY4OEMxODYuMTExIDYwLjc1NzggMTg2LjMwNSA2MS4wOTk2IDE4Ni40MzggNjEuNDk0MUMxODYuNTcgNjEuODg0OCAxODYuNjM3IDYyLjMwODYgMTg2LjYzNyA2Mi43NjU2VjYyLjkwMDRDMTg2LjYzNyA2My4zNTc0IDE4Ni41NyA2My43ODEyIDE4Ni40MzggNjQuMTcxOUMxODYuMzA1IDY0LjU2MjUgMTg2LjExMSA2NC45MDQzIDE4NS44NTcgNjUuMTk3M0MxODUuNjA0IDY1LjQ4NjMgMTg1LjI5NSA2NS43MTI5IDE4NC45MzIgNjUuODc3QzE4NC41NjggNjYuMDM3MSAxODQuMTU2IDY2LjExNzIgMTgzLjY5NSA2Ni4xMTcyQzE4My4yMyA2Ni4xMTcyIDE4Mi44MTQgNjYuMDM3MSAxODIuNDQ3IDY1Ljg3N0MxODIuMDg0IDY1LjcxMjkgMTgxLjc3NSA2NS40ODYzIDE4MS41MjEgNjUuMTk3M0MxODEuMjY4IDY0LjkwNDMgMTgxLjA3NCA2NC41NjI1IDE4MC45NDEgNjQuMTcxOUMxODAuODA5IDYzLjc4MTIgMTgwLjc0MiA2My4zNTc0IDE4MC43NDIgNjIuOTAwNFpNMTgyLjE1NCA2Mi43NjU2VjYyLjkwMDRDMTgyLjE1NCA2My4xODU1IDE4Mi4xODQgNjMuNDU1MSAxODIuMjQyIDYzLjcwOUMxODIuMzAxIDYzLjk2MjkgMTgyLjM5MyA2NC4xODU1IDE4Mi41MTggNjQuMzc3QzE4Mi42NDMgNjQuNTY4NCAxODIuODAzIDY0LjcxODggMTgyLjk5OCA2NC44MjgxQzE4My4xOTMgNjQuOTM3NSAxODMuNDI2IDY0Ljk5MjIgMTgzLjY5NSA2NC45OTIyQzE4My45NTcgNjQuOTkyMiAxODQuMTg0IDY0LjkzNzUgMTg0LjM3NSA2NC44MjgxQzE4NC41NyA2NC43MTg4IDE4NC43MyA2NC41Njg0IDE4NC44NTUgNjQuMzc3QzE4NC45OCA2NC4xODU1IDE4NS4wNzIgNjMuOTYyOSAxODUuMTMxIDYzLjcwOUMxODUuMTkzIDYzLjQ1NTEgMTg1LjIyNSA2My4xODU1IDE4NS4yMjUgNjIuOTAwNFY2Mi43NjU2QzE4NS4yMjUgNjIuNDg0NCAxODUuMTkzIDYyLjIxODggMTg1LjEzMSA2MS45Njg4QzE4NS4wNzIgNjEuNzE0OCAxODQuOTc5IDYxLjQ5MDIgMTg0Ljg1IDYxLjI5NDlDMTg0LjcyNSA2MS4wOTk2IDE4NC41NjQgNjAuOTQ3MyAxODQuMzY5IDYwLjgzNzlDMTg0LjE3OCA2MC43MjQ2IDE4My45NDkgNjAuNjY4IDE4My42ODQgNjAuNjY4QzE4My40MTggNjAuNjY4IDE4My4xODggNjAuNzI0NiAxODIuOTkyIDYwLjgzNzlDMTgyLjgwMSA2MC45NDczIDE4Mi42NDMgNjEuMDk5NiAxODIuNTE4IDYxLjI5NDlDMTgyLjM5MyA2MS40OTAyIDE4Mi4zMDEgNjEuNzE0OCAxODIuMjQyIDYxLjk2ODhDMTgyLjE4NCA2Mi4yMTg4IDE4Mi4xNTQgNjIuNDg0NCAxODIuMTU0IDYyLjc2NTZaIiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjM4Ii8+CjxwYXRoIGQ9Ik0yODMuNTc0IDYzLjEyNVY2OEgyNTguNzkzVjYzLjgxMDVMMjcwLjgyOCA1MC42ODM2QzI3Mi4xNDggNDkuMTk0IDI3My4xODkgNDcuOTA3NiAyNzMuOTUxIDQ2LjgyNDJDMjc0LjcxMyA0NS43NDA5IDI3NS4yNDYgNDQuNzY3NiAyNzUuNTUxIDQzLjkwNDNDMjc1Ljg3MiA0My4wMjQxIDI3Ni4wMzMgNDIuMTY5MyAyNzYuMDMzIDQxLjMzOThDMjc2LjAzMyA0MC4xNzE5IDI3NS44MTMgMzkuMTQ3OCAyNzUuMzczIDM4LjI2NzZDMjc0Ljk1IDM3LjM3MDQgMjc0LjMyNCAzNi42NjggMjczLjQ5NCAzNi4xNjAyQzI3Mi42NjUgMzUuNjM1NCAyNzEuNjU4IDM1LjM3MyAyNzAuNDczIDM1LjM3M0MyNjkuMTAyIDM1LjM3MyAyNjcuOTUxIDM1LjY2OTMgMjY3LjAyIDM2LjI2MTdDMjY2LjA4OSAzNi44NTQyIDI2NS4zODYgMzcuNjc1MSAyNjQuOTEyIDM4LjcyNDZDMjY0LjQzOCAzOS43NTcyIDI2NC4yMDEgNDAuOTQyMSAyNjQuMjAxIDQyLjI3OTNIMjU4LjA4MkMyNTguMDgyIDQwLjEyOTYgMjU4LjU3MyAzOC4xNjYgMjU5LjU1NSAzNi4zODg3QzI2MC41MzYgMzQuNTk0NCAyNjEuOTU4IDMzLjE3MjUgMjYzLjgyIDMyLjEyM0MyNjUuNjgyIDMxLjA1NjYgMjY3LjkyNSAzMC41MjM0IDI3MC41NDkgMzAuNTIzNEMyNzMuMDIgMzAuNTIzNCAyNzUuMTE5IDMwLjkzODIgMjc2Ljg0NiAzMS43Njc2QzI3OC41NzIgMzIuNTk3IDI3OS44ODQgMzMuNzczNCAyODAuNzgxIDM1LjI5NjlDMjgxLjY5NSAzNi44MjAzIDI4Mi4xNTIgMzguNjIzIDI4Mi4xNTIgNDAuNzA1MUMyODIuMTUyIDQxLjg1NjEgMjgxLjk2NiA0Mi45OTg3IDI4MS41OTQgNDQuMTMyOEMyODEuMjIxIDQ1LjI2NjkgMjgwLjY4OCA0Ni40MDEgMjc5Ljk5NCA0Ny41MzUyQzI3OS4zMTcgNDguNjUyMyAyNzguNTEzIDQ5Ljc3OCAyNzcuNTgyIDUwLjkxMjFDMjc2LjY1MSA1Mi4wMjkzIDI3NS42MjcgNTMuMTYzNCAyNzQuNTEgNTQuMzE0NUwyNjYuNTEyIDYzLjEyNUgyODMuNTc0Wk0zMTIuMjE5IDYzLjEyNVY2OEgyODcuNDM4VjYzLjgxMDVMMjk5LjQ3MyA1MC42ODM2QzMwMC43OTMgNDkuMTk0IDMwMS44MzQgNDcuOTA3NiAzMDIuNTk2IDQ2LjgyNDJDMzAzLjM1OCA0NS43NDA5IDMwMy44OTEgNDQuNzY3NiAzMDQuMTk1IDQzLjkwNDNDMzA0LjUxNyA0My4wMjQxIDMwNC42NzggNDIuMTY5MyAzMDQuNjc4IDQxLjMzOThDMzA0LjY3OCA0MC4xNzE5IDMwNC40NTggMzkuMTQ3OCAzMDQuMDE4IDM4LjI2NzZDMzAzLjU5NSAzNy4zNzA0IDMwMi45NjggMzYuNjY4IDMwMi4xMzkgMzYuMTYwMkMzMDEuMzA5IDM1LjYzNTQgMzAwLjMwMiAzNS4zNzMgMjk5LjExNyAzNS4zNzNDMjk3Ljc0NiAzNS4zNzMgMjk2LjU5NSAzNS42NjkzIDI5NS42NjQgMzYuMjYxN0MyOTQuNzMzIDM2Ljg1NDIgMjk0LjAzMSAzNy42NzUxIDI5My41NTcgMzguNzI0NkMyOTMuMDgzIDM5Ljc1NzIgMjkyLjg0NiA0MC45NDIxIDI5Mi44NDYgNDIuMjc5M0gyODYuNzI3QzI4Ni43MjcgNDAuMTI5NiAyODcuMjE4IDM4LjE2NiAyODguMTk5IDM2LjM4ODdDMjg5LjE4MSAzNC41OTQ0IDI5MC42MDMgMzMuMTcyNSAyOTIuNDY1IDMyLjEyM0MyOTQuMzI3IDMxLjA1NjYgMjk2LjU3IDMwLjUyMzQgMjk5LjE5NCAzMC41MjM0QzMwMS42NjUgMzAuNTIzNCAzMDMuNzY0IDMwLjkzODIgMzA1LjQ5IDMxLjc2NzZDMzA3LjIxNyAzMi41OTcgMzA4LjUyOSAzMy43NzM0IDMwOS40MjYgMzUuMjk2OUMzMTAuMzQgMzYuODIwMyAzMTAuNzk3IDM4LjYyMyAzMTAuNzk3IDQwLjcwNTFDMzEwLjc5NyA0MS44NTYxIDMxMC42MTEgNDIuOTk4NyAzMTAuMjM4IDQ0LjEzMjhDMzA5Ljg2NiA0NS4yNjY5IDMwOS4zMzMgNDYuNDAxIDMwOC42MzkgNDcuNTM1MkMzMDcuOTYyIDQ4LjY1MjMgMzA3LjE1OCA0OS43NzggMzA2LjIyNyA1MC45MTIxQzMwNS4yOTYgNTIuMDI5MyAzMDQuMjcyIDUzLjE2MzQgMzAzLjE1NCA1NC4zMTQ1TDI5NS4xNTYgNjMuMTI1SDMxMi4yMTlaTTMxNi41NjUgMzcuMzAyN0MzMTYuNTY1IDM2LjA2NzEgMzE2Ljg2OSAzNC45MzI5IDMxNy40NzkgMzMuOTAwNEMzMTguMDg4IDMyLjg2NzggMzE4LjkwMSAzMi4wNDY5IDMxOS45MTYgMzEuNDM3NUMzMjAuOTQ5IDMwLjgxMTIgMzIyLjA2NiAzMC40OTggMzIzLjI2OCAzMC40OThDMzI0LjQ4NyAzMC40OTggMzI1LjU5NSAzMC44MTEyIDMyNi41OTQgMzEuNDM3NUMzMjcuNTkzIDMyLjA0NjkgMzI4LjM4OCAzMi44Njc4IDMyOC45ODEgMzMuOTAwNEMzMjkuNTkgMzQuOTMyOSAzMjkuODk1IDM2LjA2NzEgMzI5Ljg5NSAzNy4zMDI3QzMyOS44OTUgMzguNTM4NCAzMjkuNTkgMzkuNjcyNSAzMjguOTgxIDQwLjcwNTFDMzI4LjM4OCA0MS43MjA3IDMyNy41OTMgNDIuNTI0NyAzMjYuNTk0IDQzLjExNzJDMzI1LjU5NSA0My43MDk2IDMyNC40ODcgNDQuMDA1OSAzMjMuMjY4IDQ0LjAwNTlDMzIyLjA2NiA0NC4wMDU5IDMyMC45NDkgNDMuNzA5NiAzMTkuOTE2IDQzLjExNzJDMzE4LjkwMSA0Mi41MjQ3IDMxOC4wODggNDEuNzIwNyAzMTcuNDc5IDQwLjcwNTFDMzE2Ljg2OSAzOS42NzI1IDMxNi41NjUgMzguNTM4NCAzMTYuNTY1IDM3LjMwMjdaTTMxOS45OTMgMzcuMzAyN0MzMTkuOTkzIDM4LjIxNjggMzIwLjMxNCAzOC45ODcgMzIwLjk1NyAzOS42MTMzQzMyMS42MDEgNDAuMjIyNyAzMjIuMzcxIDQwLjUyNzMgMzIzLjI2OCA0MC41MjczQzMyNC4xNjUgNDAuNTI3MyAzMjQuOTE4IDQwLjIyMjcgMzI1LjUyOCAzOS42MTMzQzMyNi4xMzcgMzkuMDAzOSAzMjYuNDQyIDM4LjIzMzcgMzI2LjQ0MiAzNy4zMDI3QzMyNi40NDIgMzYuMzU0OCAzMjYuMTM3IDM1LjU2NzcgMzI1LjUyOCAzNC45NDE0QzMyNC45MTggMzQuMzE1MSAzMjQuMTY1IDM0LjAwMiAzMjMuMjY4IDM0LjAwMkMzMjIuMzcxIDM0LjAwMiAzMjEuNjAxIDM0LjMxNTEgMzIwLjk1NyAzNC45NDE0QzMyMC4zMTQgMzUuNTY3NyAzMTkuOTkzIDM2LjM1NDggMzE5Ljk5MyAzNy4zMDI3Wk0zNTcuODc5IDU1Ljk2NDhIMzY0LjIyN0MzNjQuMDI0IDU4LjM4NTQgMzYzLjM0NyA2MC41NDM2IDM2Mi4xOTYgNjIuNDM5NUMzNjEuMDQ1IDY0LjMxODQgMzU5LjQyOCA2NS43OTk1IDM1Ny4zNDYgNjYuODgyOEMzNTUuMjY0IDY3Ljk2NjEgMzUyLjczNCA2OC41MDc4IDM0OS43NTQgNjguNTA3OEMzNDcuNDY5IDY4LjUwNzggMzQ1LjQxMyA2OC4xMDE2IDM0My41ODQgNjcuMjg5MUMzNDEuNzU2IDY2LjQ1OTYgMzQwLjE5MSA2NS4yOTE3IDMzOC44ODcgNjMuNzg1MkMzMzcuNTg0IDYyLjI2MTcgMzM2LjU4NSA2MC40MjUxIDMzNS44OTEgNTguMjc1NEMzMzUuMjE0IDU2LjEyNTcgMzM0Ljg3NSA1My43MjIgMzM0Ljg3NSA1MS4wNjQ1VjQ3Ljk5MjJDMzM0Ljg3NSA0NS4zMzQ2IDMzNS4yMjIgNDIuOTMxIDMzNS45MTYgNDAuNzgxMkMzMzYuNjI3IDM4LjYzMTUgMzM3LjY0MyAzNi43OTQ5IDMzOC45NjMgMzUuMjcxNUMzNDAuMjg0IDMzLjczMTEgMzQxLjg2NiAzMi41NTQ3IDM0My43MTEgMzEuNzQyMkMzNDUuNTczIDMwLjkyOTcgMzQ3LjY2NCAzMC41MjM0IDM0OS45ODMgMzAuNTIzNEMzNTIuOTI4IDMwLjUyMzQgMzU1LjQxNiAzMS4wNjUxIDM1Ny40NDggMzIuMTQ4NEMzNTkuNDc5IDMzLjIzMTggMzYxLjA1MyAzNC43Mjk4IDM2Mi4xNyAzNi42NDI2QzM2My4zMDUgMzguNTU1MyAzNjMuOTk5IDQwLjc0NzQgMzY0LjI1MiA0My4yMTg4SDM1Ny45MDVDMzU3LjczNSA0MS42Mjc2IDM1Ny4zNjMgNDAuMjY1IDM1Ni43ODggMzkuMTMwOUMzNTYuMjI5IDM3Ljk5NjcgMzU1LjQgMzcuMTMzNSAzNTQuMjk5IDM2LjU0MUMzNTMuMTk5IDM1LjkzMTYgMzUxLjc2IDM1LjYyNyAzNDkuOTgzIDM1LjYyN0MzNDguNTI3IDM1LjYyNyAzNDcuMjU4IDM1Ljg5NzggMzQ2LjE3NCAzNi40Mzk1QzM0NS4wOTEgMzYuOTgxMSAzNDQuMTg1IDM3Ljc3NjcgMzQzLjQ1NyAzOC44MjYyQzM0Mi43MyAzOS44NzU3IDM0Mi4xOCA0MS4xNzA2IDM0MS44MDcgNDIuNzEwOUMzNDEuNDUyIDQ0LjIzNDQgMzQxLjI3NCA0NS45Nzc5IDM0MS4yNzQgNDcuOTQxNFY1MS4wNjQ1QzM0MS4yNzQgNTIuOTI2NCAzNDEuNDM1IDU0LjYxOTEgMzQxLjc1NiA1Ni4xNDI2QzM0Mi4wOTUgNTcuNjQ5MSAzNDIuNjAzIDU4Ljk0NCAzNDMuMjggNjAuMDI3M0MzNDMuOTc0IDYxLjExMDcgMzQ0Ljg1NCA2MS45NDg2IDM0NS45MiA2Mi41NDFDMzQ2Ljk4NyA2My4xMzM1IDM0OC4yNjUgNjMuNDI5NyAzNDkuNzU0IDYzLjQyOTdDMzUxLjU2NiA2My40Mjk3IDM1My4wMyA2My4xNDE5IDM1NC4xNDcgNjIuNTY2NEMzNTUuMjgxIDYxLjk5MDkgMzU2LjEzNiA2MS4xNTMgMzU2LjcxMSA2MC4wNTI3QzM1Ny4zMDQgNTguOTM1NSAzNTcuNjkzIDU3LjU3MjkgMzU3Ljg3OSA1NS45NjQ4WiIgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMC44NyIvPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2RfMTI0Nl80NDQ0NyIgeD0iMCIgeT0iMCIgd2lkdGg9IjM5OSIgaGVpZ2h0PSIxMDgiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIi8+CjxmZU9mZnNldCBkeT0iNCIvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0Ii8+CjxmZUNvbXBvc2l0ZSBpbjI9ImhhcmRBbHBoYSIgb3BlcmF0b3I9Im91dCIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4wNCAwIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93XzEyNDZfNDQ0NDciLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfMTI0Nl80NDQ0NyIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPC9kZWZzPgo8L3N2Zz4K", + "image": "data:image/png;base64,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", "description": "Designed to display single value of the selected attribute or timeseries data. Widget styles are customizable.", "descriptor": { "type": "latest", "sizeX": 5, "sizeY": 1.5, "resources": [], - "templateHtml": "\n", + "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '130px',\n absoluteHeader: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '130px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", "hasBasicMode": true, "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temperature\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\"},\"title\":\"Horizontal value card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"°C\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\"}" + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temperature\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"thermostat\",\"iconColor\":{\"type\":\"constant\",\"color\":\"#5469FF\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":52,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"valueColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Horizontal value card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"°C\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" } } ] diff --git a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java index b337612011..bffd60f029 100644 --- a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java +++ b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java @@ -57,6 +57,8 @@ public class TbUtils { List.class))); parserConfig.addImport("decodeToJson", new MethodStub(TbUtils.class.getMethod("decodeToJson", ExecutionContext.class, List.class))); + parserConfig.addImport("decodeToJson", new MethodStub(TbUtils.class.getMethod("decodeToJson", + ExecutionContext.class, String.class))); parserConfig.addImport("stringToBytes", new MethodStub(TbUtils.class.getMethod("stringToBytes", ExecutionContext.class, String.class))); parserConfig.addImport("stringToBytes", new MethodStub(TbUtils.class.getMethod("stringToBytes", @@ -174,6 +176,9 @@ public class TbUtils { public static Object decodeToJson(ExecutionContext ctx, List bytesList) throws IOException { return TbJson.parse(ctx, bytesToString(bytesList)); } + public static Object decodeToJson(ExecutionContext ctx, String jsonStr) throws IOException { + return TbJson.parse(ctx, jsonStr); + } public static String bytesToString(List bytesList) { byte[] bytes = bytesFromList(bytesList); diff --git a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java index b6d5395af8..a16a70b962 100644 --- a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java +++ b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java @@ -27,6 +27,7 @@ import org.mvel2.SandboxedParserConfiguration; import org.mvel2.execution.ExecutionArrayList; import org.mvel2.execution.ExecutionHashMap; +import java.io.IOException; import java.math.BigInteger; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -348,6 +349,24 @@ public class TbUtilsTest { Assert.assertEquals(0, Double.compare(doubleValRev, TbUtils.parseBytesToDouble(doubleVaList, 0, false))); } + @Test + public void parseBytesDecodeToJson() throws IOException { + String expectedStr = "{\"hello\": \"world\"}"; + ExecutionHashMap expectedJson = new ExecutionHashMap<>(1, ctx); + expectedJson.put("hello", "world"); + List expectedBytes = TbUtils.stringToBytes(ctx, expectedStr); + Object actualJson = TbUtils.decodeToJson(ctx, expectedBytes); + Assert.assertEquals(expectedJson,actualJson); + } + @Test + public void parseStringDecodeToJson() throws IOException { + String expectedStr = "{\"hello\": \"world\"}"; + ExecutionHashMap expectedJson = new ExecutionHashMap<>(1, ctx); + expectedJson.put("hello", "world"); + Object actualJson = TbUtils.decodeToJson(ctx, expectedStr); + Assert.assertEquals(expectedJson,actualJson); + } + private static List toList(byte[] data) { List result = new ArrayList<>(data.length); for (Byte b : data) { diff --git a/ui-ngx/src/app/core/api/widget-api.models.ts b/ui-ngx/src/app/core/api/widget-api.models.ts index 115bf6e222..d0de3481ed 100644 --- a/ui-ngx/src/app/core/api/widget-api.models.ts +++ b/ui-ngx/src/app/core/api/widget-api.models.ts @@ -284,6 +284,8 @@ export interface IWidgetSubscription { legendData: LegendData; + readonly firstDatasource?: Datasource; + datasourcePages?: PageData[]; dataPages?: PageData>[]; datasources?: Array; diff --git a/ui-ngx/src/app/core/api/widget-subscription.ts b/ui-ngx/src/app/core/api/widget-subscription.ts index 440e61148e..f9a79d8f76 100644 --- a/ui-ngx/src/app/core/api/widget-subscription.ts +++ b/ui-ngx/src/app/core/api/widget-subscription.ts @@ -160,6 +160,16 @@ export class WidgetSubscription implements IWidgetSubscription { warnOnPageDataOverflow: boolean; ignoreDataUpdateOnIntervalTick: boolean; + get firstDatasource(): Datasource { + if (this.type === widgetType.alarm) { + return this.alarmSource; + } else if (this.datasources?.length) { + return this.datasources[0]; + } else { + return null; + } + } + datasourcePages: PageData[]; dataPages: PageData>[]; entityDataListeners: Array; diff --git a/ui-ngx/src/app/core/services/dialog.service.ts b/ui-ngx/src/app/core/services/dialog.service.ts index 6ba2687278..c5f54f9cf0 100644 --- a/ui-ngx/src/app/core/services/dialog.service.ts +++ b/ui-ngx/src/app/core/services/dialog.service.ts @@ -21,11 +21,11 @@ import { TranslateService } from '@ngx-translate/core'; import { AuthService } from '@core/auth/auth.service'; import { ColorPickerDialogComponent, - ColorPickerDialogData + ColorPickerDialogData, ColorPickerDialogResult } from '@shared/components/dialog/color-picker-dialog.component'; import { MaterialIconsDialogComponent, - MaterialIconsDialogData + MaterialIconsDialogData, MaterialIconsDialogResult } from '@shared/components/dialog/material-icons-dialog.component'; import { ConfirmDialogComponent } from '@shared/components/dialog/confirm-dialog.component'; import { AlertDialogComponent } from '@shared/components/dialog/alert-dialog.component'; @@ -96,8 +96,8 @@ export class DialogService { return dialogRef.afterClosed(); } - colorPicker(color: string, colorClearButton = false): Observable { - return this.dialog.open(ColorPickerDialogComponent, + colorPicker(color: string, colorClearButton = false): Observable { + return this.dialog.open(ColorPickerDialogComponent, { disableClose: true, panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], @@ -109,13 +109,14 @@ export class DialogService { }).afterClosed(); } - materialIconPicker(icon: string): Observable { - return this.dialog.open(MaterialIconsDialogComponent, + materialIconPicker(icon: string, iconClearButton = false): Observable { + return this.dialog.open(MaterialIconsDialogComponent, { disableClose: true, panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], data: { - icon + icon, + iconClearButton }, autoFocus: false }).afterClosed(); diff --git a/ui-ngx/src/app/core/services/dynamic-component-factory.service.ts b/ui-ngx/src/app/core/services/dynamic-component-factory.service.ts index 84134f04a9..b7e21f7b22 100644 --- a/ui-ngx/src/app/core/services/dynamic-component-factory.service.ts +++ b/ui-ngx/src/app/core/services/dynamic-component-factory.service.ts @@ -33,11 +33,17 @@ import { catchError, map, mergeMap } from 'rxjs/operators'; @NgModule() export abstract class DynamicComponentModule implements OnDestroy { + // eslint-disable-next-line @angular-eslint/contextual-lifecycle ngOnDestroy(): void { } } +interface DynamicComponentData { + componentType: Type; + componentModuleRef: NgModuleRef; +} + interface DynamicComponentModuleData { moduleRef: NgModuleRef; moduleType: Type; @@ -48,22 +54,22 @@ interface DynamicComponentModuleData { }) export class DynamicComponentFactoryService { - private dynamicComponentModulesMap = new Map, DynamicComponentModuleData>(); + private dynamicComponentModulesMap = new Map, DynamicComponentModuleData>(); constructor(private compiler: Compiler, private injector: Injector) { } - public createDynamicComponentFactory( + public createDynamicComponent( componentType: Type, template: string, modules?: Type[], preserveWhitespaces?: boolean, compileAttempt = 1, - styles?: string[]): Observable> { + styles?: string[]): Observable> { return from(import('@angular/compiler')).pipe( mergeMap(() => { - const comp = this.createDynamicComponent(componentType, template, preserveWhitespaces, styles); + const comp = this._createDynamicComponent(componentType, template, preserveWhitespaces, styles); let moduleImports: Type[] = [CommonModule]; if (modules) { moduleImports = [...moduleImports, ...modules]; @@ -82,17 +88,19 @@ export class DynamicComponentFactoryService { this.compiler.clearCacheFor(module.moduleType); throw e; } - const factory = moduleRef.componentFactoryResolver.resolveComponentFactory(comp); - this.dynamicComponentModulesMap.set(factory, { + this.dynamicComponentModulesMap.set(comp, { moduleRef, moduleType: module.moduleType }); - return factory; + return { + componentType: comp, + componentModuleRef: moduleRef + }; }), catchError((error) => { if (compileAttempt === 1) { ɵresetCompiledComponents(); - return this.createDynamicComponentFactory(componentType, template, modules, preserveWhitespaces, ++compileAttempt, styles); + return this.createDynamicComponent(componentType, template, modules, preserveWhitespaces, ++compileAttempt, styles); } else { throw error; } @@ -102,16 +110,16 @@ export class DynamicComponentFactoryService { ); } - public destroyDynamicComponentFactory(factory: ComponentFactory) { - const moduleData = this.dynamicComponentModulesMap.get(factory); + public destroyDynamicComponent(componentType: Type) { + const moduleData = this.dynamicComponentModulesMap.get(componentType); if (moduleData) { moduleData.moduleRef.destroy(); this.compiler.clearCacheFor(moduleData.moduleType); - this.dynamicComponentModulesMap.delete(factory); + this.dynamicComponentModulesMap.delete(componentType); } } - private createDynamicComponent(componentType: Type, template: string, preserveWhitespaces?: boolean, styles?: string[]): Type { + private _createDynamicComponent(componentType: Type, template: string, preserveWhitespaces?: boolean, styles?: string[]): Type { // noinspection AngularMissingOrInvalidDeclarationInModule return Component({ template, diff --git a/ui-ngx/src/app/core/utils.ts b/ui-ngx/src/app/core/utils.ts index 9a369cb5aa..2a2f664c3a 100644 --- a/ui-ngx/src/app/core/utils.ts +++ b/ui-ngx/src/app/core/utils.ts @@ -180,9 +180,7 @@ export function objToBase64(obj: any): string { } export function base64toString(b64Encoded: string): string { - return decodeURIComponent(atob(b64Encoded).split('').map((c) => { - return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); - }).join('')); + return decodeURIComponent(atob(b64Encoded).split('').map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join('')); } export function objToBase64URI(obj: any): string { @@ -190,9 +188,7 @@ export function objToBase64URI(obj: any): string { } export function base64toObj(b64Encoded: string): any { - const json = decodeURIComponent(atob(b64Encoded).split('').map((c) => { - return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); - }).join('')); + const json = decodeURIComponent(atob(b64Encoded).split('').map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join('')); return JSON.parse(json); } @@ -355,9 +351,7 @@ const SNAKE_CASE_REGEXP = /[A-Z]/g; export function snakeCase(name: string, separator: string): string { separator = separator || '_'; - return name.replace(SNAKE_CASE_REGEXP, (letter, pos) => { - return (pos ? separator : '') + letter.toLowerCase(); - }); + return name.replace(SNAKE_CASE_REGEXP, (letter, pos) => (pos ? separator : '') + letter.toLowerCase()); } export function getDescendantProp(obj: any, path: string): any { @@ -381,7 +375,7 @@ export function insertVariable(pattern: string, name: string, value: any): strin return result; } -export function createLabelFromDatasource(datasource: Datasource, pattern: string): string { +export const createLabelFromDatasource = (datasource: Datasource, pattern: string): string => { let label = pattern; if (!datasource) { return label; @@ -406,7 +400,9 @@ export function createLabelFromDatasource(datasource: Datasource, pattern: strin match = varsRegex.exec(pattern); } return label; -} +}; + +export const hasDatasourceLabelsVariables = (pattern: string): boolean => varsRegex.test(pattern) !== null; export function formattedDataFormDatasourceData(input: DatasourceData[], dataIndex?: number): FormattedData[] { return _(input).groupBy(el => el.datasource.entityName + el.datasource.entityType) @@ -694,7 +690,7 @@ export function getEntityDetailsPageURL(id: string, entityType: EntityType): str } export function parseHttpErrorMessage(errorResponse: HttpErrorResponse, - translate: TranslateService, responseType?: string): {message: string, timeout: number} { + translate: TranslateService, responseType?: string): {message: string; timeout: number} { let error = null; let errorMessage: string; let timeout = 0; diff --git a/ui-ngx/src/app/modules/home/components/attribute/add-attribute-dialog.component.html b/ui-ngx/src/app/modules/home/components/attribute/add-attribute-dialog.component.html index c48299986e..17e31854cc 100644 --- a/ui-ngx/src/app/modules/home/components/attribute/add-attribute-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/attribute/add-attribute-dialog.component.html @@ -17,7 +17,7 @@ -->
-

{{ 'attribute.add' | translate }}

+

{{ title | translate }}

+ + + diff --git a/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style-panel.component.scss b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style-panel.component.scss new file mode 100644 index 0000000000..d3c2dfb4fb --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style-panel.component.scss @@ -0,0 +1,54 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@import '../../../../../../scss/constants'; + +.tb-timewindow-style-panel { + width: 100%; + display: flex; + flex-direction: column; + gap: 16px; + @media #{$mat-gt-xs} { + min-width: 320px; + } + .tb-timewindow-style-title { + font-size: 16px; + font-weight: 500; + line-height: 24px; + letter-spacing: 0.25px; + color: rgba(0, 0, 0, 0.87); + } + .tb-form-row { + .fixed-title-width { + min-width: 120px; + } + &.timewindow-preview { + align-items: flex-start; + tb-timewindow { + font-size: 14px; + opacity: .85; + } + } + } + .tb-timewindow-style-panel-buttons { + height: 60px; + display: flex; + flex-direction: row; + gap: 16px; + justify-content: flex-end; + align-items: flex-end; + } +} diff --git a/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style-panel.component.ts new file mode 100644 index 0000000000..e0e4ee5615 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style-panel.component.ts @@ -0,0 +1,108 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core'; +import { PageComponent } from '@shared/components/page.component'; +import { defaultTimewindowStyle, TimewindowStyle } from '@shared/models/widget-settings.models'; +import { TbPopoverComponent } from '@shared/components/popover.component'; +import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { Timewindow } from '@shared/models/time/time.models'; +import { deepClone } from '@core/utils'; + +@Component({ + selector: 'tb-timewindow-style-panel', + templateUrl: './timewindow-style-panel.component.html', + providers: [], + styleUrls: ['./timewindow-style-panel.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class TimewindowStylePanelComponent extends PageComponent implements OnInit { + + @Input() + timewindowStyle: TimewindowStyle; + + @Input() + previewValue: Timewindow; + + @Input() + popover: TbPopoverComponent; + + @Output() + timewindowStyleApplied = new EventEmitter(); + + timewindowStyleFormGroup: UntypedFormGroup; + + previewTimewindowStyle: TimewindowStyle; + + constructor(private fb: UntypedFormBuilder, + protected store: Store) { + super(store); + } + + ngOnInit(): void { + const computedTimewindowStyle = {...defaultTimewindowStyle, ...(this.timewindowStyle || {})}; + this.timewindowStyleFormGroup = this.fb.group( + { + showIcon: [computedTimewindowStyle.showIcon, []], + iconSize: [computedTimewindowStyle.iconSize, []], + icon: [computedTimewindowStyle.icon, []], + iconPosition: [computedTimewindowStyle.iconPosition, []], + font: [computedTimewindowStyle.font, []], + color: [computedTimewindowStyle.color, []] + } + ); + this.updatePreviewStyle(this.timewindowStyle); + this.updateTimewindowStyleEnabledState(); + this.timewindowStyleFormGroup.valueChanges.subscribe((timewindowStyle: TimewindowStyle) => { + if (this.timewindowStyleFormGroup.valid) { + this.updatePreviewStyle(timewindowStyle); + setTimeout(() => {this.popover?.updatePosition();}, 0); + } + }); + this.timewindowStyleFormGroup.get('showIcon').valueChanges.subscribe(() => { + this.updateTimewindowStyleEnabledState(); + }); + } + + cancel() { + this.popover?.hide(); + } + + applyTimewindowStyle() { + const timewindowStyle = this.timewindowStyleFormGroup.getRawValue(); + this.timewindowStyleApplied.emit(timewindowStyle); + } + + private updateTimewindowStyleEnabledState() { + const showIcon: boolean = this.timewindowStyleFormGroup.get('showIcon').value; + if (showIcon) { + this.timewindowStyleFormGroup.get('iconSize').enable({emitEvent: false}); + this.timewindowStyleFormGroup.get('icon').enable({emitEvent: false}); + this.timewindowStyleFormGroup.get('iconPosition').enable({emitEvent: false}); + } else { + this.timewindowStyleFormGroup.get('iconSize').disable({emitEvent: false}); + this.timewindowStyleFormGroup.get('icon').disable({emitEvent: false}); + this.timewindowStyleFormGroup.get('iconPosition').disable({emitEvent: false}); + } + } + + private updatePreviewStyle(timewindowStyle: TimewindowStyle) { + this.previewTimewindowStyle = deepClone(timewindowStyle); + } + +} diff --git a/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style.component.html b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style.component.html new file mode 100644 index 0000000000..2bd981fffc --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style.component.html @@ -0,0 +1,25 @@ + + diff --git a/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style.component.ts new file mode 100644 index 0000000000..ad6d3e1b85 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/config/timewindow-style.component.ts @@ -0,0 +1,97 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { Component, forwardRef, Input, OnInit, Renderer2, ViewContainerRef } from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { TimewindowStyle } from '@shared/models/widget-settings.models'; +import { MatButton } from '@angular/material/button'; +import { TbPopoverService } from '@shared/components/popover.service'; +import { Timewindow } from '@shared/models/time/time.models'; +import { TimewindowStylePanelComponent } from '@home/components/widget/config/timewindow-style-panel.component'; + +@Component({ + selector: 'tb-timewindow-style', + templateUrl: './timewindow-style.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TimewindowStyleComponent), + multi: true + } + ] +}) +export class TimewindowStyleComponent implements OnInit, ControlValueAccessor { + + @Input() + disabled: boolean; + + @Input() + previewValue: Timewindow; + + private modelValue: TimewindowStyle; + + private propagateChange = null; + + constructor(private popoverService: TbPopoverService, + private renderer: Renderer2, + private viewContainerRef: ViewContainerRef) {} + + ngOnInit(): void { + } + + registerOnChange(fn: any): void { + this.propagateChange = fn; + } + + registerOnTouched(fn: any): void { + } + + setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; + } + + writeValue(value: TimewindowStyle): void { + this.modelValue = value; + } + + openTimewindowStylePopup($event: Event, matButton: MatButton) { + if ($event) { + $event.stopPropagation(); + } + const trigger = matButton._elementRef.nativeElement; + if (this.popoverService.hasPopover(trigger)) { + this.popoverService.hidePopover(trigger); + } else { + const ctx: any = { + timewindowStyle: this.modelValue, + previewValue: this.previewValue + }; + const timewindowStylePanelPopover = this.popoverService.displayPopover(trigger, this.renderer, + this.viewContainerRef, TimewindowStylePanelComponent, 'left', true, null, + ctx, + {}, + {}, {}, true); + timewindowStylePanelPopover.tbComponentRef.instance.popover = timewindowStylePanelPopover; + timewindowStylePanelPopover.tbComponentRef.instance.timewindowStyleApplied.subscribe((timewindowStyle) => { + timewindowStylePanelPopover.hide(); + this.modelValue = timewindowStyle; + this.propagateChange(this.modelValue); + }); + } + } + +} diff --git a/ui-ngx/src/app/modules/home/components/widget/config/widget-config-components.module.ts b/ui-ngx/src/app/modules/home/components/widget/config/widget-config-components.module.ts index 392a829955..ea0d27dcf6 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/widget-config-components.module.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/widget-config-components.module.ts @@ -30,6 +30,8 @@ import { WidgetSettingsModule } from '@home/components/widget/lib/settings/widge import { WidgetSettingsComponent } from '@home/components/widget/config/widget-settings.component'; import { TimewindowConfigPanelComponent } from '@home/components/widget/config/timewindow-config-panel.component'; import { WidgetSettingsCommonModule } from '@home/components/widget/lib/settings/common/widget-settings-common.module'; +import { TimewindowStyleComponent } from '@home/components/widget/config/timewindow-style.component'; +import { TimewindowStylePanelComponent } from '@home/components/widget/config/timewindow-style-panel.component'; @NgModule({ declarations: @@ -43,6 +45,8 @@ import { WidgetSettingsCommonModule } from '@home/components/widget/lib/settings DatasourcesComponent, EntityAliasSelectComponent, FilterSelectComponent, + TimewindowStyleComponent, + TimewindowStylePanelComponent, TimewindowConfigPanelComponent, WidgetSettingsComponent ], @@ -62,6 +66,8 @@ import { WidgetSettingsCommonModule } from '@home/components/widget/lib/settings DatasourcesComponent, EntityAliasSelectComponent, FilterSelectComponent, + TimewindowStyleComponent, + TimewindowStylePanelComponent, TimewindowConfigPanelComponent, WidgetSettingsComponent, WidgetSettingsCommonModule diff --git a/ui-ngx/src/app/modules/home/components/widget/dialog/custom-dialog-container.component.ts b/ui-ngx/src/app/modules/home/components/widget/dialog/custom-dialog-container.component.ts index dc3e9c7ac2..3c20317b13 100644 --- a/ui-ngx/src/app/modules/home/components/widget/dialog/custom-dialog-container.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/dialog/custom-dialog-container.component.ts @@ -20,8 +20,8 @@ import { ComponentFactory, ComponentRef, HostBinding, Inject, - Injector, - OnDestroy, + Injector, NgModuleRef, + OnDestroy, Type, ViewContainerRef } from '@angular/core'; import { DialogComponent } from '@shared/components/dialog.component'; @@ -35,11 +35,13 @@ import { } from '@home/components/widget/dialog/custom-dialog.component'; import { DialogService } from '@core/services/dialog.service'; import { TranslateService } from '@ngx-translate/core'; +import { DynamicComponentModule } from '@core/services/dynamic-component-factory.service'; export interface CustomDialogContainerData { controller: (instance: CustomDialogComponent) => void; data?: any; - customComponentFactory: ComponentFactory; + customComponentType: Type; + customComponentModuleRef: NgModuleRef; } @Component({ @@ -77,7 +79,8 @@ export class CustomDialogContainerComponent extends DialogComponent> + private customModules: Array>; constructor( private translate: TranslateService, @@ -56,12 +56,13 @@ export class CustomDialogService { if (Array.isArray(this.customModules)) { modules.push(...this.customModules); } - return this.dynamicComponentFactoryService.createDynamicComponentFactory( + return this.dynamicComponentFactoryService.createDynamicComponent( class CustomDialogComponentInstance extends CustomDialogComponent {}, template, modules).pipe( - mergeMap((factory) => { + mergeMap((componentData) => { const dialogData: CustomDialogContainerData = { controller, - customComponentFactory: factory, + customComponentType: componentData.componentType, + customComponentModuleRef: componentData.componentModuleRef, data }; let dialogConfig: MatDialogConfig = { @@ -76,7 +77,7 @@ export class CustomDialogService { CustomDialogContainerComponent, dialogConfig).afterClosed().pipe( tap(() => { - this.dynamicComponentFactoryService.destroyDynamicComponentFactory(factory); + this.dynamicComponentFactoryService.destroyDynamicComponent(componentData.componentType); }) ); } diff --git a/ui-ngx/src/app/modules/home/components/widget/dynamic-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/dynamic-widget.component.ts index 22fac750b5..feeb1fe802 100644 --- a/ui-ngx/src/app/modules/home/components/widget/dynamic-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/dynamic-widget.component.ts @@ -15,7 +15,7 @@ /// import { PageComponent } from '@shared/components/page.component'; -import { Directive, Injector, OnDestroy, OnInit } from '@angular/core'; +import { Directive, Injector, OnDestroy, OnInit, TemplateRef } from '@angular/core'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { IDynamicWidgetComponent, WidgetContext } from '@home/models/widget-component.models'; @@ -67,7 +67,8 @@ export class DynamicWidgetComponent extends PageComponent implements IDynamicWid @TbInject(UntypedFormBuilder) public fb: UntypedFormBuilder, @TbInject(Injector) public readonly $injector: Injector, @TbInject('widgetContext') public readonly ctx: WidgetContext, - @TbInject('errorMessages') public readonly errorMessages: string[]) { + @TbInject('errorMessages') public readonly errorMessages: string[], + @TbInject('widgetTitlePanel') public readonly widgetTitlePanel: TemplateRef) { super(store); this.ctx.$injector = $injector; this.ctx.deviceService = $injector.get(DeviceService); diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/alarms-table-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/alarms-table-widget.component.ts index f799ed43ff..234443855f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/alarms-table-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/alarms-table-widget.component.ts @@ -37,16 +37,7 @@ import { DataKey, WidgetActionDescriptor, WidgetConfig } from '@shared/models/wi import { IWidgetSubscription } from '@core/api/widget-api.models'; import { UtilsService } from '@core/services/utils.service'; import { TranslateService } from '@ngx-translate/core'; -import { - createLabelFromDatasource, - deepClone, - hashCode, - isDefined, - isDefinedAndNotNull, - isNumber, - isObject, - isUndefined -} from '@core/utils'; +import { deepClone, hashCode, isDefined, isDefinedAndNotNull, isNumber, isObject, isUndefined } from '@core/utils'; import cssjs from '@core/css/css'; import { sortItems } from '@shared/models/page/page-link'; import { Direction } from '@shared/models/page/sort-order'; @@ -194,8 +185,6 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, private subscription: IWidgetSubscription; private widgetResize$: ResizeObserver; - private alarmsTitlePattern: string; - private displayActivity = false; private displayDetails = true; public allowAcknowledgment = true; @@ -322,7 +311,6 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, } public onDataUpdated() { - this.updateTitle(true); this.alarmsDatasource.updateAlarms(); this.clearCache(); this.ctx.detectChanges(); @@ -342,13 +330,11 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, this.allowAssign = isDefined(this.settings.allowAssign) ? this.settings.allowAssign : true; if (this.settings.alarmsTitle && this.settings.alarmsTitle.length) { - this.alarmsTitlePattern = this.utils.customTranslation(this.settings.alarmsTitle, this.settings.alarmsTitle); + this.ctx.widgetTitle = this.settings.alarmsTitle; } else { - this.alarmsTitlePattern = this.translate.instant('alarm.alarms'); + this.ctx.widgetTitle = this.translate.instant('alarm.alarms'); } - this.updateTitle(false); - this.enableSelection = isDefined(this.settings.enableSelection) ? this.settings.enableSelection : true; if (!this.allowAcknowledgment && !this.allowClear) { this.enableSelection = false; @@ -394,16 +380,6 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, $(this.elementRef.nativeElement).addClass(namespace); } - private updateTitle(updateWidgetParams = false) { - const newTitle = createLabelFromDatasource(this.subscription.alarmSource, this.alarmsTitlePattern); - if (this.ctx.widgetTitle !== newTitle) { - this.ctx.widgetTitle = newTitle; - if (updateWidgetParams) { - this.ctx.updateWidgetParams(); - } - } - } - private updateAlarmSource() { if (this.enableSelection) { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.html index 8c79c0e1e7..fee7dc5259 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.html @@ -17,6 +17,9 @@ -->
+
+ +
@@ -60,7 +63,7 @@ {{ icon }} -
{{ label }}
+
{{ label$ | async }}
{{ dateFormat.formatted }}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.scss index d0cf0ea0b7..05bbbb0bf0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.scss +++ b/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.scss @@ -44,6 +44,13 @@ bottom: 12px; right: 12px; } + > div.tb-value-card-title-panel { + position: absolute; + top: 12px; + left: 12px; + right: 12px; + z-index: 2; + } .tb-value-card-icon-row { display: flex; flex-direction: row; diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.ts index ac2cb62fee..48d432bcb7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.component.ts @@ -14,7 +14,7 @@ /// limitations under the License. /// -import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'; +import { ChangeDetectorRef, Component, Input, OnInit, TemplateRef } from '@angular/core'; import { WidgetContext } from '@home/models/widget-component.models'; import { formatValue, isDefinedAndNotNull } from '@core/utils'; import { DatePipe } from '@angular/common'; @@ -31,6 +31,7 @@ import { } from '@shared/models/widget-settings.models'; import { valueCardDefaultSettings, ValueCardLayout, ValueCardWidgetSettings } from './value-card-widget.models'; import { WidgetComponent } from '@home/components/widget/widget.component'; +import { Observable } from 'rxjs'; @Component({ selector: 'tb-value-card-widget', @@ -46,6 +47,9 @@ export class ValueCardWidgetComponent implements OnInit { @Input() ctx: WidgetContext; + @Input() + widgetTitlePanel: TemplateRef; + layout: ValueCardLayout; showIcon = true; icon = ''; @@ -53,7 +57,7 @@ export class ValueCardWidgetComponent implements OnInit { iconColor: ColorProcessor; showLabel = true; - label = ''; + label$: Observable; labelStyle: ComponentStyle = {}; labelColor: ColorProcessor; @@ -102,15 +106,16 @@ export class ValueCardWidgetComponent implements OnInit { this.iconColor = ColorProcessor.fromSettings(this.settings.iconColor); this.showLabel = this.settings.showLabel; - this.label = getLabel(this.ctx.datasources); - this.labelStyle = textStyle(this.settings.labelFont, '1.5', '0.25px'); + const label = getLabel(this.ctx.datasources); + this.label$ = this.ctx.registerLabelPattern(label, this.label$); + this.labelStyle = textStyle(this.settings.labelFont, '0.25px'); this.labelColor = ColorProcessor.fromSettings(this.settings.labelColor); - this.valueStyle = textStyle(this.settings.valueFont, '100%', '0.13px'); + this.valueStyle = textStyle(this.settings.valueFont, '0.13px'); this.valueColor = ColorProcessor.fromSettings(this.settings.valueColor); this.showDate = this.settings.showDate; this.dateFormat = DateFormatProcessor.fromSettings(this.ctx.$injector, this.settings.dateFormat); - this.dateStyle = textStyle(this.settings.dateFont, '1.33', '0.25px'); + this.dateStyle = textStyle(this.settings.dateFont, '0.25px'); this.dateColor = ColorProcessor.fromSettings(this.settings.dateColor); this.backgroundStyle = backgroundStyle(this.settings.background); diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.models.ts b/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.models.ts index 549ba4abcd..aa442bd199 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.models.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/cards/value-card-widget.models.ts @@ -89,7 +89,8 @@ export const valueCardDefaultSettings = (horizontal: boolean): ValueCardWidgetSe size: 16, sizeUnit: 'px', style: 'normal', - weight: '500' + weight: '500', + lineHeight: '1.5' }, labelColor: constantColor('rgba(0, 0, 0, 0.87)'), showIcon: true, @@ -102,7 +103,8 @@ export const valueCardDefaultSettings = (horizontal: boolean): ValueCardWidgetSe size: 52, sizeUnit: 'px', style: 'normal', - weight: '500' + weight: '500', + lineHeight: '100%' }, valueColor: constantColor('rgba(0, 0, 0, 0.87)'), showDate: true, @@ -112,7 +114,8 @@ export const valueCardDefaultSettings = (horizontal: boolean): ValueCardWidgetSe size: 12, sizeUnit: 'px', style: 'normal', - weight: '500' + weight: '500', + lineHeight: '1.33' }, dateColor: constantColor('rgba(0, 0, 0, 0.38)'), background: { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/entities-table-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/entities-table-widget.component.ts index 07b05db0f2..ecb10f3ade 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/entities-table-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/entities-table-widget.component.ts @@ -42,15 +42,7 @@ import { import { IWidgetSubscription } from '@core/api/widget-api.models'; import { UtilsService } from '@core/services/utils.service'; import { TranslateService } from '@ngx-translate/core'; -import { - createLabelFromDatasource, - deepClone, - hashCode, - isDefined, - isNumber, - isObject, - isUndefined -} from '@core/utils'; +import { deepClone, hashCode, isDefined, isNumber, isObject, isUndefined } from '@core/utils'; import cssjs from '@core/css/css'; import { CollectionViewer, DataSource } from '@angular/cdk/collections'; import { DataKeyType } from '@shared/models/telemetry/telemetry.models'; @@ -164,8 +156,6 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni private subscription: IWidgetSubscription; private widgetResize$: ResizeObserver; - private entitiesTitlePattern: string; - private defaultPageSize = 10; private defaultSortOrder = 'entityName'; @@ -266,7 +256,6 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni } public onDataUpdated() { - this.updateTitle(true); this.entityDatasource.dataUpdated(); this.clearCache(); this.ctx.detectChanges(); @@ -281,16 +270,15 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni this.setCellButtonAction = !!this.ctx.actionsApi.getActionDescriptors('actionCellButton').length; - this.hasRowAction = !!this.ctx.actionsApi.getActionDescriptors('rowClick').length || !!this.ctx.actionsApi.getActionDescriptors('rowDoubleClick').length; + this.hasRowAction = !!this.ctx.actionsApi.getActionDescriptors('rowClick').length || + !!this.ctx.actionsApi.getActionDescriptors('rowDoubleClick').length; if (this.settings.entitiesTitle && this.settings.entitiesTitle.length) { - this.entitiesTitlePattern = this.utils.customTranslation(this.settings.entitiesTitle, this.settings.entitiesTitle); + this.ctx.widgetTitle = this.settings.entitiesTitle; } else { - this.entitiesTitlePattern = this.translate.instant('entity.entities'); + this.ctx.widgetTitle = this.translate.instant('entity.entities'); } - this.updateTitle(false); - this.searchAction.show = isDefined(this.settings.enableSearch) ? this.settings.enableSearch : true; this.displayPagination = isDefined(this.settings.displayPagination) ? this.settings.displayPagination : true; this.enableStickyHeader = isDefined(this.settings.enableStickyHeader) ? this.settings.enableStickyHeader : true; @@ -319,16 +307,6 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni $(this.elementRef.nativeElement).addClass(namespace); } - private updateTitle(updateWidgetParams = false) { - const newTitle = createLabelFromDatasource(this.subscription.datasources[0], this.entitiesTitlePattern); - if (this.ctx.widgetTitle !== newTitle) { - this.ctx.widgetTitle = newTitle; - if (updateWidgetParams) { - this.ctx.updateWidgetParams(); - } - } - } - private updateDatasources() { const displayEntityName = isDefined(this.settings.displayEntityName) ? this.settings.displayEntityName : true; @@ -498,14 +476,12 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni overlayRef.dispose(); }); - const columns: DisplayColumn[] = this.columns.map(column => { - return { + const columns: DisplayColumn[] = this.columns.map(column => ({ title: column.title, def: column.def, display: this.displayedColumns.indexOf(column.def) > -1, selectable: this.columnSelectionAvailability[column.def] - }; - }); + })); const providers: StaticProvider[] = [ { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/json-input-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/json-input-widget.component.ts index 20cce79457..2e9a9fb5f9 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/json-input-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/json-input-widget.component.ts @@ -94,12 +94,8 @@ export class JsonInputWidgetComponent extends PageComponent implements OnInit { private initializeConfig() { if (this.settings.widgetTitle && this.settings.widgetTitle.length) { - const title = createLabelFromDatasource(this.datasource, this.settings.widgetTitle); - this.ctx.widgetTitle = this.utils.customTranslation(title, title); - } else { - this.ctx.widgetTitle = this.ctx.widgetConfig.title; + this.ctx.widgetTitle = this.settings.widgetTitle; } - if (this.settings.labelValue && this.settings.labelValue.length) { const label = createLabelFromDatasource(this.datasource, this.settings.labelValue); this.labelValue = this.utils.customTranslation(label, label); diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/multiple-input-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/multiple-input-widget.component.ts index 6f29a495cf..f667c785c1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/multiple-input-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/multiple-input-widget.component.ts @@ -202,10 +202,7 @@ export class MultipleInputWidgetComponent extends PageComponent implements OnIni private initializeConfig() { if (this.settings.widgetTitle && this.settings.widgetTitle.length) { - const titlePatternText = this.utils.customTranslation(this.settings.widgetTitle, this.settings.widgetTitle); - this.ctx.widgetTitle = createLabelFromDatasource(this.datasources[0], titlePatternText); - } else { - this.ctx.widgetTitle = this.ctx.widgetConfig.title; + this.ctx.widgetTitle = this.settings.widgetTitle; } this.settings.groupTitle = this.settings.groupTitle || '${entityName}'; diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/value-card-widget-settings.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/value-card-widget-settings.component.html index 71a9b60118..f0fd9cdb16 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/value-card-widget-settings.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/value-card-widget-settings.component.html @@ -44,12 +44,13 @@ {{ 'widgets.value-card.icon' | translate }} -
+
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/css-unit-select.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/css-unit-select.component.ts index 3d2658dae1..61a6bc4865 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/css-unit-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/css-unit-select.component.ts @@ -67,9 +67,9 @@ export class CssUnitSelectComponent implements OnInit, ControlValueAccessor { setDisabledState(isDisabled: boolean): void { this.disabled = isDisabled; if (this.disabled) { - this.cssUnitFormControl.disable(); + this.cssUnitFormControl.disable({emitEvent: false}); } else { - this.cssUnitFormControl.enable(); + this.cssUnitFormControl.enable({emitEvent: false}); } } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/date-format-select.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/date-format-select.component.ts index 6393a92054..e4f0b47946 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/date-format-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/date-format-select.component.ts @@ -90,9 +90,9 @@ export class DateFormatSelectComponent implements OnInit, ControlValueAccessor { setDisabledState(isDisabled: boolean): void { this.disabled = isDisabled; if (this.disabled) { - this.dateFormatFormControl.disable(); + this.dateFormatFormControl.disable({emitEvent: false}); } else { - this.dateFormatFormControl.enable(); + this.dateFormatFormControl.enable({emitEvent: false}); } } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.html index 36d488d766..9fe3273f74 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.html @@ -72,6 +72,12 @@
+
+
widgets.widget-font.line-height
+ + + +
widgets.widget-font.preview
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.ts index 2f86394f44..a0e77ef380 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.ts @@ -101,7 +101,8 @@ export class FontSettingsPanelComponent extends PageComponent implements OnInit sizeUnit: [(this.font?.sizeUnit || 'px'), []], family: [this.font?.family, []], weight: [this.font?.weight, []], - style: [this.font?.style, []] + style: [this.font?.style, []], + lineHeight: [this.font?.lineHeight, []] } ); this.updatePreviewStyle(this.font); @@ -146,7 +147,7 @@ export class FontSettingsPanelComponent extends PageComponent implements OnInit } private updatePreviewStyle(font: Font) { - this.previewStyle = {...(this.initialPreviewStyle || {}), ...textStyle(font, '1')}; + this.previewStyle = {...(this.initialPreviewStyle || {}), ...textStyle(font)}; } } diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-component.service.ts b/ui-ngx/src/app/modules/home/components/widget/widget-component.service.ts index d3dbb9853c..1b73ccbe4a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-component.service.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget-component.service.ts @@ -227,7 +227,7 @@ export class WidgetComponentService { } public clearWidgetInfo(widgetInfo: WidgetInfo, bundleAlias: string, widgetTypeAlias: string, isSystem: boolean): void { - this.dynamicComponentFactoryService.destroyDynamicComponentFactory(widgetInfo.componentFactory); + this.dynamicComponentFactoryService.destroyDynamicComponent(widgetInfo.componentType); this.widgetService.deleteWidgetInfoFromCache(bundleAlias, widgetTypeAlias, isSystem); } @@ -362,13 +362,14 @@ export class WidgetComponentService { return of(resolvedModules); } else { this.registerWidgetSettingsForms(widgetInfo, resolvedModules.factories); - return this.dynamicComponentFactoryService.createDynamicComponentFactory( + return this.dynamicComponentFactoryService.createDynamicComponent( class DynamicWidgetComponentInstance extends DynamicWidgetComponent {}, widgetInfo.templateHtml, resolvedModules.modules ).pipe( - map((factory) => { - widgetInfo.componentFactory = factory; + map((componentData) => { + widgetInfo.componentType = componentData.componentType; + widgetInfo.componentModuleRef = componentData.componentModuleRef; return null; }), catchError(e => { @@ -546,8 +547,8 @@ export class WidgetComponentService { if (isUndefined(result.typeParameters.previewHeight)) { result.typeParameters.previewHeight = '70%'; } - if (isUndefined(result.typeParameters.absoluteHeader)) { - result.typeParameters.absoluteHeader = false; + if (isUndefined(result.typeParameters.embedTitlePanel)) { + result.typeParameters.embedTitlePanel = false; } if (isFunction(widgetTypeInstance.actionSources)) { result.actionSources = widgetTypeInstance.actionSources(); diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-config.component.html b/ui-ngx/src/app/modules/home/components/widget/widget-config.component.html index 5f54970859..23440260d4 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-config.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/widget-config.component.html @@ -70,6 +70,7 @@ diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts index da35390ffd..2bdf662469 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts @@ -369,7 +369,8 @@ export class WidgetConfigComponent extends PageComponent implements OnInit, OnDe this.dataSettings.addControl('timewindowConfig', this.fb.control({ useDashboardTimewindow: true, displayTimewindow: true, - timewindow: null + timewindow: null, + timewindowStyle: null })); if (this.widgetType === widgetType.alarm) { this.dataSettings.addControl('alarmFilterConfig', this.fb.control(null)); @@ -517,7 +518,8 @@ export class WidgetConfigComponent extends PageComponent implements OnInit, OnDe useDashboardTimewindow, displayTimewindow: isDefined(config.displayTimewindow) ? config.displayTimewindow : true, - timewindow: config.timewindow + timewindow: config.timewindow, + timewindowStyle: config.timewindowStyle }, {emitEvent: false}); } if (this.modelValue.isDataEnabled) { diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-container.component.html b/ui-ngx/src/app/modules/home/components/widget/widget-container.component.html index 43b54884ec..1e3fd33171 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-container.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/widget-container.component.html @@ -32,34 +32,13 @@ (click)="onClicked($event)" (contextmenu)="onContextMenu($event)">
-
- - {{widget.titleIcon}} - {{widget.customTranslatedTitle}} - - - -
+ class="tb-widget-header"> + + +
+ +
+
+ {{widget.titleIcon}} +
+ {{widget.title$ | async}} +
+
+ + +
+
diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-container.component.scss b/ui-ngx/src/app/modules/home/components/widget/widget-container.component.scss index 52caeb2a5c..a61dc463db 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-container.component.scss +++ b/ui-ngx/src/app/modules/home/components/widget/widget-container.component.scss @@ -37,13 +37,6 @@ div.tb-widget { flex-direction: row; place-content: flex-start space-between; align-items: flex-start; - &-absolute { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 1; - } } .tb-widget-title { @@ -59,23 +52,24 @@ div.tb-widget { tb-timewindow { font-size: 14px; opacity: .85; - margin: 0; } - .title { + .title-row { + display: flex; + flex-direction: row; + place-content: center flex-start; + align-items: center; + gap: 4px; width: 100%; + } + + .title { overflow: hidden; text-overflow: ellipsis; + white-space: nowrap; line-height: 24px; - letter-spacing: .01em; + letter-spacing: normal; margin: 0; - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; - - &.single-row{ - -webkit-line-clamp: 1; - } } } diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-preview.component.ts b/ui-ngx/src/app/modules/home/components/widget/widget-preview.component.ts index 41f3fe7e4f..bc298734fc 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-preview.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget-preview.component.ts @@ -77,13 +77,15 @@ export class WidgetPreviewComponent extends PageComponent implements OnInit, OnC } private loadPreviewWidget() { - const widget = deepClone(this.widget); - widget.sizeX = 24; - widget.sizeY = this.widget.sizeY * 2; - widget.row = 0; - widget.col = 0; - widget.config = this.widgetConfig; - this.widgets = [widget]; + if (this.widget) { + const widget = deepClone(this.widget); + widget.sizeX = 24; + widget.sizeY = this.widget.sizeY * 2; + widget.row = 0; + widget.col = 0; + widget.config = this.widgetConfig; + this.widgets = [widget]; + } } } diff --git a/ui-ngx/src/app/modules/home/components/widget/widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/widget.component.ts index c276999d83..fe8bcd78c1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget.component.ts @@ -32,6 +32,7 @@ import { Optional, Renderer2, SimpleChanges, + TemplateRef, Type, ViewChild, ViewContainerRef, @@ -125,6 +126,9 @@ import { IModulesMap } from '@modules/common/modules-map.models'; }) export class WidgetComponent extends PageComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy { + @Input() + widgetTitlePanel: TemplateRef; + @Input() isEdit: boolean; @@ -308,9 +312,6 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI this.loadFromWidgetInfo(); } ); - setTimeout(() => { - this.dashboardWidget.updateWidgetParams(); - }, 0); const noDataDisplayMessage = this.widget.config.noDataDisplayMessage; if (isNotEmptyStr(noDataDisplayMessage)) { @@ -387,7 +388,7 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI this.handleWidgetException(e); } } - this.widgetContext.destroyed = true; + this.widgetContext.destroy(); this.destroyDynamicWidgetComponent(); } } @@ -409,7 +410,7 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI elem.classList.add(this.widgetContext.widgetNamespace); this.widgetType = this.widgetInfo.widgetTypeFunction; this.typeParameters = this.widgetInfo.typeParameters; - this.widgetContext.absoluteHeader = this.typeParameters.absoluteHeader; + this.widgetContext.embedTitlePanel = this.typeParameters.embedTitlePanel; if (!this.widgetType) { this.widgetTypeInstance = {}; @@ -480,6 +481,7 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI } if (!this.widgetContext.inited && this.isReady()) { this.widgetContext.inited = true; + this.dashboardWidget.updateWidgetParams(); this.widgetContext.detectContainerChanges(); if (this.cafs.init) { this.cafs.init(); @@ -493,7 +495,7 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI if (this.dataUpdatePending) { this.widgetTypeInstance.onDataUpdated(); setTimeout(() => { - this.dashboardWidget.updateCustomHeaderActions(true); + this.dashboardWidget.updateParamsFromData(true); }, 0); this.dataUpdatePending = false; } @@ -735,6 +737,10 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI { provide: 'errorMessages', useValue: this.errorMessages + }, + { + provide: 'widgetTitlePanel', + useValue: this.widgetTitlePanel } ], parent: this.injector @@ -745,7 +751,8 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI this.widgetContext.$containerParent = $(containerElement); try { - this.dynamicWidgetComponentRef = this.widgetContentContainer.createComponent(this.widgetInfo.componentFactory, 0, injector); + this.dynamicWidgetComponentRef = this.widgetContentContainer.createComponent(this.widgetInfo.componentType, + {index: 0, injector, ngModuleRef: this.widgetInfo.componentModuleRef}); this.cd.detectChanges(); } catch (e) { if (this.dynamicWidgetComponentRef) { @@ -845,7 +852,7 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI if (this.widgetInstanceInited) { this.widgetTypeInstance.onDataUpdated(); setTimeout(() => { - this.dashboardWidget.updateCustomHeaderActions(true); + this.dashboardWidget.updateParamsFromData(true); }, 0); } else { this.dataUpdatePending = true; diff --git a/ui-ngx/src/app/modules/home/models/dashboard-component.models.ts b/ui-ngx/src/app/modules/home/models/dashboard-component.models.ts index 5bae1ad256..8104e80e36 100644 --- a/ui-ngx/src/app/modules/home/models/dashboard-component.models.ts +++ b/ui-ngx/src/app/modules/home/models/dashboard-component.models.ts @@ -33,7 +33,7 @@ import { IAliasController, IStateController } from '@app/core/api/widget-api.mod import { enumerable } from '@shared/decorators/enumerable'; import { UtilsService } from '@core/services/utils.service'; import { TbPopoverComponent } from '@shared/components/popover.component'; -import { ComponentStyle, textStyle } from '@shared/models/widget-settings.models'; +import { ComponentStyle, iconStyle, textStyle } from '@shared/models/widget-settings.models'; export interface WidgetsData { widgets: Array; @@ -331,8 +331,7 @@ export class DashboardWidget implements GridsterItem, IDashboardWidget { margin: string; borderRadius: string; - title: string; - customTranslatedTitle: string; + title$: Observable; titleTooltip: string; showTitle: boolean; titleStyle: ComponentStyle; @@ -431,30 +430,23 @@ export class DashboardWidget implements GridsterItem, IDashboardWidget { this.margin = this.widget.config.margin || '0px'; this.borderRadius = this.widget.config.borderRadius; - this.title = isDefined(this.widgetContext.widgetTitle) + const title = isDefined(this.widgetContext.widgetTitle) && this.widgetContext.widgetTitle.length ? this.widgetContext.widgetTitle : this.widget.config.title; - this.customTranslatedTitle = this.dashboard.utils.customTranslation(this.title, this.title); + this.title$ = this.widgetContext.registerLabelPattern(title, this.title$); this.titleTooltip = isDefined(this.widgetContext.widgetTitleTooltip) && this.widgetContext.widgetTitleTooltip.length ? this.widgetContext.widgetTitleTooltip : this.widget.config.titleTooltip; this.titleTooltip = this.dashboard.utils.customTranslation(this.titleTooltip, this.titleTooltip); this.showTitle = isDefined(this.widget.config.showTitle) ? this.widget.config.showTitle : true; - this.titleStyle = {...(this.widget.config.titleStyle || {}), ...textStyle(this.widget.config.titleFont, '24px', '0.01em')}; + this.titleStyle = {...(this.widget.config.titleStyle || {}), ...textStyle(this.widget.config.titleFont, 'normal')}; if (this.widget.config.titleColor) { this.titleStyle.color = this.widget.config.titleColor; } this.titleIcon = isDefined(this.widget.config.titleIcon) ? this.widget.config.titleIcon : ''; this.showTitleIcon = isDefined(this.widget.config.showTitleIcon) ? this.widget.config.showTitleIcon : false; - this.titleIconStyle = {}; + this.titleIconStyle = this.widget.config.iconSize ? iconStyle(this.widget.config.iconSize) : {}; if (this.widget.config.iconColor) { this.titleIconStyle.color = this.widget.config.iconColor; } - if (this.widget.config.iconSize) { - this.titleIconStyle.width = this.widget.config.iconSize; - this.titleIconStyle.height = this.widget.config.iconSize; - this.titleIconStyle.fontSize = this.widget.config.iconSize; - this.titleIconStyle.lineHeight = this.widget.config.iconSize; - } - this.dropShadow = isDefined(this.widget.config.dropShadow) ? this.widget.config.dropShadow : true; this.enableFullscreen = isDefined(this.widget.config.enableFullscreen) ? this.widget.config.enableFullscreen : true; @@ -497,14 +489,22 @@ export class DashboardWidget implements GridsterItem, IDashboardWidget { this.showWidgetActions = !this.widgetContext.hideTitlePanel; - this.updateCustomHeaderActions(); + this.updateParamsFromData(); this.widgetActions = this.widgetContext.widgetActions ? this.widgetContext.widgetActions : []; if (detectChanges) { this.widgetContext.detectContainerChanges(); } } - updateCustomHeaderActions(detectChanges = false) { + updateParamsFromData(detectChanges = false) { + this.widgetContext.updateLabelPatterns(); + const update = this.updateCustomHeaderActions(); + if (update && detectChanges) { + this.widgetContext.detectContainerChanges(); + } + } + + private updateCustomHeaderActions(): boolean { let customHeaderActions: Array; if (this.widgetContext.customHeaderActions) { let data: FormattedData[] = []; @@ -517,10 +517,9 @@ export class DashboardWidget implements GridsterItem, IDashboardWidget { } if (!isEqual(this.customHeaderActions, customHeaderActions)) { this.customHeaderActions = customHeaderActions; - if (detectChanges) { - this.widgetContext.detectContainerChanges(); - } + return true; } + return false; } private filterCustomHeaderAction(action: WidgetHeaderAction, data: FormattedData[]): boolean { diff --git a/ui-ngx/src/app/modules/home/models/widget-component.models.ts b/ui-ngx/src/app/modules/home/models/widget-component.models.ts index 18c8ccd19e..12d3312dbb 100644 --- a/ui-ngx/src/app/modules/home/models/widget-component.models.ts +++ b/ui-ngx/src/app/modules/home/models/widget-component.models.ts @@ -45,13 +45,13 @@ import { WidgetActionsApi, WidgetSubscriptionApi } from '@core/api/widget-api.models'; -import { ChangeDetectorRef, ComponentFactory, Injector, NgZone, Type } from '@angular/core'; +import { ChangeDetectorRef, Injector, NgModuleRef, NgZone, Type } from '@angular/core'; import { HttpClient, HttpErrorResponse } from '@angular/common/http'; import { RafService } from '@core/services/raf.service'; import { WidgetTypeId } from '@shared/models/id/widget-type-id'; import { TenantId } from '@shared/models/id/tenant-id'; import { WidgetLayout } from '@shared/models/dashboard.models'; -import { formatValue, isDefined } from '@core/utils'; +import { createLabelFromDatasource, formatValue, hasDatasourceLabelsVariables, isDefined } from '@core/utils'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { @@ -87,10 +87,12 @@ import * as RxJS from 'rxjs'; import * as RxJSOperators from 'rxjs/operators'; import { TbPopoverComponent } from '@shared/components/popover.component'; import { EntityId } from '@shared/models/id/entity-id'; -import { AlarmQuery, AlarmSearchStatus, AlarmStatus} from '@app/shared/models/alarm.models'; +import { AlarmQuery, AlarmSearchStatus, AlarmStatus } from '@app/shared/models/alarm.models'; import { MillisecondsToTimeStringPipe, TelemetrySubscriber } from '@app/shared/public-api'; import { UserId } from '@shared/models/id/user-id'; import { UserSettingsService } from '@core/http/user-settings.service'; +import { DynamicComponentModule } from '@core/services/dynamic-component-factory.service'; +import { BehaviorSubject, Observable } from 'rxjs'; export interface IWidgetAction { name: string; @@ -200,6 +202,8 @@ export class WidgetContext { subscriptions: {[id: string]: IWidgetSubscription} = {}; defaultSubscription: IWidgetSubscription = null; + labelPatterns = new Map, LabelVariablePattern>(); + timewindowFunctions: TimewindowFunctions = { onUpdateTimewindow: (startTimeMs, endTimeMs, interval) => { if (this.defaultSubscription) { @@ -265,7 +269,7 @@ export class WidgetContext { hiddenData?: Array<{data: DataSet}>; timeWindow?: WidgetTimewindow; - absoluteHeader?: boolean; + embedTitlePanel?: boolean; hideTitlePanel = false; @@ -312,6 +316,23 @@ export class WidgetContext { }); } + registerLabelPattern(label: string, label$: Observable): Observable { + let labelPattern = label$ ? this.labelPatterns.get(label$) : null; + if (labelPattern) { + labelPattern.setupPattern(label); + } else { + labelPattern = new LabelVariablePattern(label, this); + this.labelPatterns.set(labelPattern.label$, labelPattern); + } + return labelPattern.label$; + } + + updateLabelPatterns() { + for (const labelPattern of this.labelPatterns.values()) { + labelPattern.update(); + } + } + showSuccessToast(message: string, duration: number = 1000, verticalPosition: NotificationVerticalPosition = 'bottom', horizontalPosition: NotificationHorizontalPosition = 'left', @@ -406,6 +427,14 @@ export class WidgetContext { this.widgetActions = undefined; } + destroy() { + for (const labelPattern of this.labelPatterns.values()) { + labelPattern.destroy(); + } + this.labelPatterns.clear(); + this.destroyed = true; + } + closeDialog(resultData: any = null) { const dialogRef = this.$scope.dialogRef || this.stateController.dashboardCtrl.dashboardCtx.getDashboard().dialogRef; if (dialogRef) { @@ -426,6 +455,42 @@ export class WidgetContext { } } +export class LabelVariablePattern { + + private pattern: string; + private hasVariables: boolean; + + private labelSubject = new BehaviorSubject(''); + + public label$ = this.labelSubject.asObservable(); + + constructor(label: string, + private ctx: WidgetContext) { + this.setupPattern(label); + } + + setupPattern(label: string) { + this.pattern = this.ctx.dashboard.utils.customTranslation(label, label); + this.hasVariables = hasDatasourceLabelsVariables(this.pattern); + this.update(); + } + + update() { + let label = this.pattern; + const datasource = this.ctx.defaultSubscription?.firstDatasource; + if (this.hasVariables && datasource) { + label = createLabelFromDatasource(datasource, label); + } + if (this.labelSubject.value !== label) { + this.labelSubject.next(label); + } + } + + destroy() { + this.labelSubject.complete(); + } +} + export interface IDynamicWidgetComponent { readonly ctx: WidgetContext; readonly errorMessages: string[]; @@ -446,7 +511,8 @@ export interface WidgetInfo extends WidgetTypeDescriptor, WidgetControllerDescri typeLatestDataKeySettingsSchema?: string | any; image?: string; description?: string; - componentFactory?: ComponentFactory; + componentType?: Type; + componentModuleRef?: NgModuleRef; } export interface WidgetConfigComponentData { diff --git a/ui-ngx/src/app/shared/components/color-input.component.ts b/ui-ngx/src/app/shared/components/color-input.component.ts index 2f0b7b1dae..834fcb8176 100644 --- a/ui-ngx/src/app/shared/components/color-input.component.ts +++ b/ui-ngx/src/app/shared/components/color-input.component.ts @@ -153,10 +153,10 @@ export class ColorInputComponent extends PageComponent implements OnInit, Contro $event.stopPropagation(); this.dialogs.colorPicker(this.colorFormGroup.get('color').value, this.colorClearButton).subscribe( - (color) => { - if (color) { + (result) => { + if (!result?.canceled) { this.colorFormGroup.patchValue( - {color}, {emitEvent: true} + {color: result?.color}, {emitEvent: true} ); this.cd.markForCheck(); } diff --git a/ui-ngx/src/app/shared/components/dialog/color-picker-dialog.component.ts b/ui-ngx/src/app/shared/components/dialog/color-picker-dialog.component.ts index 06d24f026b..38fcedf406 100644 --- a/ui-ngx/src/app/shared/components/dialog/color-picker-dialog.component.ts +++ b/ui-ngx/src/app/shared/components/dialog/color-picker-dialog.component.ts @@ -26,12 +26,17 @@ export interface ColorPickerDialogData { colorClearButton: boolean; } +export interface ColorPickerDialogResult { + color?: string; + canceled?: boolean; +} + @Component({ selector: 'tb-color-picker-dialog', templateUrl: './color-picker-dialog.component.html', styleUrls: ['./color-picker-dialog.component.scss'] }) -export class ColorPickerDialogComponent extends DialogComponent { +export class ColorPickerDialogComponent extends DialogComponent { color: string; colorClearButton: boolean; @@ -39,18 +44,18 @@ export class ColorPickerDialogComponent extends DialogComponent, protected router: Router, @Inject(MAT_DIALOG_DATA) public data: ColorPickerDialogData, - public dialogRef: MatDialogRef) { + public dialogRef: MatDialogRef) { super(store, router, dialogRef); this.color = data.color; this.colorClearButton = data.colorClearButton; } selectColor(color: string) { - this.dialogRef.close(color); + this.dialogRef.close({color}); } cancel(): void { - this.dialogRef.close(null); + this.dialogRef.close({canceled: true}); } } diff --git a/ui-ngx/src/app/shared/components/dialog/material-icons-dialog.component.html b/ui-ngx/src/app/shared/components/dialog/material-icons-dialog.component.html index 1051be6525..632e9216be 100644 --- a/ui-ngx/src/app/shared/components/dialog/material-icons-dialog.component.html +++ b/ui-ngx/src/app/shared/components/dialog/material-icons-dialog.component.html @@ -23,6 +23,7 @@ close
diff --git a/ui-ngx/src/app/shared/components/dialog/material-icons-dialog.component.ts b/ui-ngx/src/app/shared/components/dialog/material-icons-dialog.component.ts index b6321c966d..53aec6d74f 100644 --- a/ui-ngx/src/app/shared/components/dialog/material-icons-dialog.component.ts +++ b/ui-ngx/src/app/shared/components/dialog/material-icons-dialog.component.ts @@ -23,6 +23,12 @@ import { DialogComponent } from '@shared/components/dialog.component'; export interface MaterialIconsDialogData { icon: string; + iconClearButton: boolean; +} + +export interface MaterialIconsDialogResult { + icon?: string; + canceled?: boolean; } @Component({ @@ -31,24 +37,26 @@ export interface MaterialIconsDialogData { providers: [], styleUrls: ['./material-icons-dialog.component.scss'] }) -export class MaterialIconsDialogComponent extends DialogComponent { +export class MaterialIconsDialogComponent extends DialogComponent { selectedIcon: string; + iconClearButton: boolean; constructor(protected store: Store, protected router: Router, @Inject(MAT_DIALOG_DATA) public data: MaterialIconsDialogData, - public dialogRef: MatDialogRef) { + public dialogRef: MatDialogRef) { super(store, router, dialogRef); this.selectedIcon = data.icon; + this.iconClearButton = data.iconClearButton; } selectIcon(icon: string) { - this.dialogRef.close(icon); + this.dialogRef.close({icon}); } cancel(): void { - this.dialogRef.close(null); + this.dialogRef.close({canceled: true}); } } diff --git a/ui-ngx/src/app/shared/components/icon.component.ts b/ui-ngx/src/app/shared/components/icon.component.ts index d1e2c6ddcd..fcc7b70081 100644 --- a/ui-ngx/src/app/shared/components/icon.component.ts +++ b/ui-ngx/src/app/shared/components/icon.component.ts @@ -120,7 +120,7 @@ export class TbIconComponent extends _TbIconBase this._contentChanges = this.contentObserver.observe(this._iconNameContent.nativeElement) .subscribe(() => { const content = this.viewValue; - if (content && this.icon !== content) { + if (this.icon !== content) { this.icon = content; this._updateIcon(); } diff --git a/ui-ngx/src/app/shared/components/json-form/json-form.component.ts b/ui-ngx/src/app/shared/components/json-form/json-form.component.ts index 6ed1d133ae..6da145d826 100644 --- a/ui-ngx/src/app/shared/components/json-form/json-form.component.ts +++ b/ui-ngx/src/app/shared/components/json-form/json-form.component.ts @@ -216,9 +216,9 @@ export class JsonFormComponent implements OnInit, ControlValueAccessor, Validato private onColorClick(key: (string | number)[], val: tinycolor.ColorFormats.RGBA, colorSelectedFn: (color: tinycolor.ColorFormats.RGBA) => void) { - this.dialogs.colorPicker(tinycolor(val).toRgbString()).subscribe((color) => { - if (color && colorSelectedFn) { - colorSelectedFn(tinycolor(color).toRgb()); + this.dialogs.colorPicker(tinycolor(val).toRgbString()).subscribe((result) => { + if (!result?.canceled && colorSelectedFn) { + colorSelectedFn(tinycolor(result?.color).toRgb()); } }); } @@ -226,9 +226,9 @@ export class JsonFormComponent implements OnInit, ControlValueAccessor, Validato private onIconClick(key: (string | number)[], val: string, iconSelectedFn: (icon: string) => void) { - this.dialogs.materialIconPicker(val).subscribe((icon) => { - if (icon && iconSelectedFn) { - iconSelectedFn(icon); + this.dialogs.materialIconPicker(val).subscribe((result) => { + if (!result?.canceled && iconSelectedFn) { + iconSelectedFn(result?.icon); } }); } diff --git a/ui-ngx/src/app/shared/components/markdown.component.ts b/ui-ngx/src/app/shared/components/markdown.component.ts index cd03959fad..7936d2f51a 100644 --- a/ui-ngx/src/app/shared/components/markdown.component.ts +++ b/ui-ngx/src/app/shared/components/markdown.component.ts @@ -17,7 +17,6 @@ import { ChangeDetectorRef, Component, - ComponentFactory, ComponentRef, ElementRef, EventEmitter, @@ -91,7 +90,7 @@ export class TbMarkdownComponent implements OnChanges { error = null; private tbMarkdownInstanceComponentRef: ComponentRef; - private tbMarkdownInstanceComponentFactory: ComponentFactory; + private tbMarkdownInstanceComponentType: Type; constructor(private help: HelpService, private cd: ChangeDetectorRef, @@ -153,7 +152,7 @@ export class TbMarkdownComponent implements OnChanges { if (this.additionalCompileModules) { compileModules = compileModules.concat(this.additionalCompileModules); } - this.dynamicComponentFactoryService.createDynamicComponentFactory( + this.dynamicComponentFactoryService.createDynamicComponent( class TbMarkdownInstance { ngOnDestroy(): void { parent.destroyMarkdownInstanceResources(); @@ -162,12 +161,13 @@ export class TbMarkdownComponent implements OnChanges { template, compileModules, true, 1, styles - ).subscribe((factory) => { - this.tbMarkdownInstanceComponentFactory = factory; + ).subscribe((componentData) => { + this.tbMarkdownInstanceComponentType = componentData.componentType; const injector: Injector = Injector.create({providers: [], parent: this.markdownContainer.injector}); try { this.tbMarkdownInstanceComponentRef = - this.markdownContainer.createComponent(this.tbMarkdownInstanceComponentFactory, 0, injector); + this.markdownContainer.createComponent(this.tbMarkdownInstanceComponentType, + {index: 0, injector, ngModuleRef: componentData.componentModuleRef}); if (this.context) { for (const propName of Object.keys(this.context)) { this.tbMarkdownInstanceComponentRef.instance[propName] = this.context[propName]; @@ -261,9 +261,9 @@ export class TbMarkdownComponent implements OnChanges { } private destroyMarkdownInstanceResources() { - if (this.tbMarkdownInstanceComponentFactory) { - this.dynamicComponentFactoryService.destroyDynamicComponentFactory(this.tbMarkdownInstanceComponentFactory); - this.tbMarkdownInstanceComponentFactory = null; + if (this.tbMarkdownInstanceComponentType) { + this.dynamicComponentFactoryService.destroyDynamicComponent(this.tbMarkdownInstanceComponentType); + this.tbMarkdownInstanceComponentType = null; } this.tbMarkdownInstanceComponentRef = null; } diff --git a/ui-ngx/src/app/shared/components/material-icon-select.component.ts b/ui-ngx/src/app/shared/components/material-icon-select.component.ts index 740bb4545a..255aeb0668 100644 --- a/ui-ngx/src/app/shared/components/material-icon-select.component.ts +++ b/ui-ngx/src/app/shared/components/material-icon-select.component.ts @@ -54,17 +54,9 @@ export class MaterialIconSelectComponent extends PageComponent implements OnInit @Input() disabled: boolean; - private iconClearButtonValue: boolean; - get iconClearButton(): boolean { - return this.iconClearButtonValue; - } @Input() - set iconClearButton(value: boolean) { - const newVal = coerceBooleanProperty(value); - if (this.iconClearButtonValue !== newVal) { - this.iconClearButtonValue = newVal; - } - } + @coerceBoolean() + iconClearButton = false; private requiredValue: boolean; get required(): boolean { @@ -135,11 +127,12 @@ export class MaterialIconSelectComponent extends PageComponent implements OnInit openIconDialog() { if (!this.disabled) { - this.dialogs.materialIconPicker(this.materialIconFormGroup.get('icon').value).subscribe( - (icon) => { - if (icon) { + this.dialogs.materialIconPicker(this.materialIconFormGroup.get('icon').value, + this.iconClearButton).subscribe( + (result) => { + if (!result?.canceled) { this.materialIconFormGroup.patchValue( - {icon}, {emitEvent: true} + {icon: result?.icon}, {emitEvent: true} ); this.cd.markForCheck(); } @@ -159,7 +152,8 @@ export class MaterialIconSelectComponent extends PageComponent implements OnInit const materialIconsPopover = this.popoverService.displayPopover(trigger, this.renderer, this.viewContainerRef, MaterialIconsComponent, 'left', true, null, { - selectedIcon: this.materialIconFormGroup.get('icon').value + selectedIcon: this.materialIconFormGroup.get('icon').value, + iconClearButton: this.iconClearButton }, {}, {}, {}, true); diff --git a/ui-ngx/src/app/shared/components/material-icons.component.html b/ui-ngx/src/app/shared/components/material-icons.component.html index d31a73ddb5..79476572f6 100644 --- a/ui-ngx/src/app/shared/components/material-icons.component.html +++ b/ui-ngx/src/app/shared/components/material-icons.component.html @@ -62,4 +62,13 @@
{{ 'icon.no-icons-found' | translate:{iconSearch: searchIconControl.value} }}
+
+ +
diff --git a/ui-ngx/src/app/shared/components/material-icons.component.scss b/ui-ngx/src/app/shared/components/material-icons.component.scss index 23b959d118..8cf84e0687 100644 --- a/ui-ngx/src/app/shared/components/material-icons.component.scss +++ b/ui-ngx/src/app/shared/components/material-icons.component.scss @@ -58,4 +58,12 @@ margin: 0; } } + .tb-material-icons-panel-buttons { + height: 40px; + display: flex; + flex-direction: row; + gap: 16px; + align-items: flex-start; + align-self: flex-start; + } } diff --git a/ui-ngx/src/app/shared/components/material-icons.component.ts b/ui-ngx/src/app/shared/components/material-icons.component.ts index 9347243af2..1d826816b7 100644 --- a/ui-ngx/src/app/shared/components/material-icons.component.ts +++ b/ui-ngx/src/app/shared/components/material-icons.component.ts @@ -36,6 +36,7 @@ import { ResourcesService } from '@core/services/resources.service'; import { TbPopoverComponent } from '@shared/components/popover.component'; import { BreakpointObserver } from '@angular/cdk/layout'; import { MediaBreakpoints } from '@shared/models/constants'; +import { coerceBoolean } from '@shared/decorators/coercion'; @Component({ selector: 'tb-material-icons', @@ -52,6 +53,10 @@ export class MaterialIconsComponent extends PageComponent implements OnInit { @Input() selectedIcon: string; + @Input() + @coerceBoolean() + iconClearButton = false; + @Input() popover: TbPopoverComponent; @@ -123,6 +128,10 @@ export class MaterialIconsComponent extends PageComponent implements OnInit { this.iconSelected.emit(icon.name); } + clearIcon() { + this.iconSelected.emit(null); + } + private calculatePanelSize(iconsRowSize: number, iconRows = 4) { this.iconsPanelHeight = Math.min(iconRows * this.iconsRowHeight, 10 * this.iconsRowHeight) + 'px'; this.iconsPanelWidth = (iconsRowSize * 36 + (iconsRowSize - 1) * 12 + 6) + 'px'; diff --git a/ui-ngx/src/app/shared/components/phone-input.component.scss b/ui-ngx/src/app/shared/components/phone-input.component.scss index eb8d27646f..1ba5eabf3a 100644 --- a/ui-ngx/src/app/shared/components/phone-input.component.scss +++ b/ui-ngx/src/app/shared/components/phone-input.component.scss @@ -24,7 +24,6 @@ .phone-input-container { display: flex; - align-items: center; .phone-input { width: 100%; @@ -32,10 +31,11 @@ } .flags-select-container { - display: inline-block; + display: flex; + align-items: center; position: relative; width: 50px; - height: 100%; + height: 56px; margin-right: 5px; } diff --git a/ui-ngx/src/app/shared/components/time/timewindow.component.html b/ui-ngx/src/app/shared/components/time/timewindow.component.html index e445e99c98..a53ea656fc 100644 --- a/ui-ngx/src/app/shared/components/time/timewindow.component.html +++ b/ui-ngx/src/app/shared/components/time/timewindow.component.html @@ -41,26 +41,16 @@
- - + [class]="{'no-padding': noPadding}" + matTooltip="{{ 'timewindow.edit' | translate }}" + [matTooltipPosition]="tooltipPosition" + [style]="timewindowComponentStyle" + (click)="toggleTimewindow($event)"> + {{ computedTimewindowStyle.icon }} +
{{innerValue?.displayValue}} | {{innerValue?.displayTimezoneAbbr}} - - +
+ {{ computedTimewindowStyle.icon }}
diff --git a/ui-ngx/src/app/shared/components/time/timewindow.component.scss b/ui-ngx/src/app/shared/components/time/timewindow.component.scss index af3feec6eb..a00fe5bdc1 100644 --- a/ui-ngx/src/app/shared/components/time/timewindow.component.scss +++ b/ui-ngx/src/app/shared/components/time/timewindow.component.scss @@ -24,15 +24,24 @@ max-width: 100%; } section.tb-timewindow { - min-height: 32px; padding: 0 8px; + &.no-padding { + padding: 0; + } + line-height: 32px; + pointer-events: all; + cursor: pointer; + display: flex; + flex-direction: row; + place-content: center flex-start; + align-items: center; + gap: 4px; + width: 100%; - span { + .tb-timewindow-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - pointer-events: all; - cursor: pointer; } .timezone-abbr { diff --git a/ui-ngx/src/app/shared/components/time/timewindow.component.ts b/ui-ngx/src/app/shared/components/time/timewindow.component.ts index ff39e54fc7..ba8b4ba114 100644 --- a/ui-ngx/src/app/shared/components/time/timewindow.component.ts +++ b/ui-ngx/src/app/shared/components/time/timewindow.component.ts @@ -20,7 +20,7 @@ import { ElementRef, forwardRef, HostBinding, Injector, - Input, + Input, OnChanges, OnInit, SimpleChanges, StaticProvider, ViewContainerRef } from '@angular/core'; @@ -50,6 +50,12 @@ import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { ConnectedPosition, Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay'; import { ComponentPortal } from '@angular/cdk/portal'; import { coerceBoolean } from '@shared/decorators/coercion'; +import { + ComponentStyle, + defaultTimewindowStyle, iconStyle, + textStyle, + TimewindowStyle +} from '@shared/models/widget-settings.models'; // @dynamic @Component({ @@ -64,7 +70,7 @@ import { coerceBoolean } from '@shared/decorators/coercion'; } ] }) -export class TimewindowComponent implements ControlValueAccessor { +export class TimewindowComponent implements ControlValueAccessor, OnInit, OnChanges { historyOnlyValue = false; @@ -88,6 +94,14 @@ export class TimewindowComponent implements ControlValueAccessor { @coerceBoolean() noMargin = false; + @Input() + @coerceBoolean() + noPadding = false; + + @Input() + @coerceBoolean() + disablePanel = false; + @Input() @coerceBoolean() forAllTimeEnabled = false; @@ -145,10 +159,10 @@ export class TimewindowComponent implements ControlValueAccessor { } @Input() - direction: 'left' | 'right' = 'left'; + tooltipPosition: TooltipPosition = 'above'; @Input() - tooltipPosition: TooltipPosition = 'above'; + timewindowStyle: TimewindowStyle; @Input() @coerceBoolean() @@ -158,6 +172,10 @@ export class TimewindowComponent implements ControlValueAccessor { timewindowDisabled: boolean; + computedTimewindowStyle: TimewindowStyle; + timewindowComponentStyle: ComponentStyle; + timewindowIconStyle: ComponentStyle; + private propagateChange = (_: any) => {}; constructor(private overlay: Overlay, @@ -170,10 +188,28 @@ export class TimewindowComponent implements ControlValueAccessor { public viewContainerRef: ViewContainerRef) { } + ngOnInit() { + this.updateTimewindowStyle(); + } + + ngOnChanges(changes: SimpleChanges): void { + for (const propName of Object.keys(changes)) { + const change = changes[propName]; + if (!change.firstChange && change.currentValue !== change.previousValue) { + if (propName === 'timewindowStyle') { + this.updateTimewindowStyle(); + } + } + } + } + toggleTimewindow($event: Event) { if ($event) { $event.stopPropagation(); } + if (this.disablePanel) { + return; + } const config = new OverlayConfig({ panelClass: 'tb-timewindow-panel', backdropClass: 'cdk-overlay-transparent-backdrop', @@ -226,6 +262,17 @@ export class TimewindowComponent implements ControlValueAccessor { this.cd.detectChanges(); } + private updateTimewindowStyle() { + if (!this.asButton) { + this.computedTimewindowStyle = {...defaultTimewindowStyle, ...(this.timewindowStyle || {})}; + this.timewindowComponentStyle = textStyle(this.computedTimewindowStyle.font); + if (this.computedTimewindowStyle.color) { + this.timewindowComponentStyle.color = this.computedTimewindowStyle.color; + } + this.timewindowIconStyle = this.computedTimewindowStyle.iconSize ? iconStyle(this.computedTimewindowStyle.iconSize) : {}; + } + } + private onHistoryOnlyChanged(): boolean { if (this.historyOnlyValue && this.innerValue && this.innerValue.selectedTab !== TimewindowType.HISTORY) { this.innerValue.selectedTab = TimewindowType.HISTORY; diff --git a/ui-ngx/src/app/shared/models/widget-settings.models.ts b/ui-ngx/src/app/shared/models/widget-settings.models.ts index f7c1b6746e..18782cdd93 100644 --- a/ui-ngx/src/app/shared/models/widget-settings.models.ts +++ b/ui-ngx/src/app/shared/models/widget-settings.models.ts @@ -60,6 +60,7 @@ export interface Font { family: string; weight: fontWeight; style: fontStyle; + lineHeight: string; } export enum ColorType { @@ -89,6 +90,22 @@ export interface ColorSettings { colorFunction?: string; } +export interface TimewindowStyle { + showIcon: boolean; + icon: string; + iconSize: string; + iconPosition: 'left' | 'right'; + font?: Font; + color?: string; +} + +export const defaultTimewindowStyle: TimewindowStyle = { + showIcon: true, + icon: 'query_builder', + iconSize: '24px', + iconPosition: 'left' +}; + export const constantColor = (color: string): ColorSettings => ({ type: ColorType.constant, color, @@ -298,19 +315,19 @@ export interface BackgroundSettings { overlay: OverlaySettings; } -export const iconStyle = (size: number, sizeUnit: cssUnit): ComponentStyle => { - const iconSize = size + sizeUnit; +export const iconStyle = (size: number | string, sizeUnit: cssUnit = 'px'): ComponentStyle => { + const iconSize = typeof size === 'number' ? size + sizeUnit : size; return { width: iconSize, + minWidth: iconSize, height: iconSize, fontSize: iconSize, lineHeight: iconSize }; }; -export const textStyle = (font?: Font, lineHeight = '1.5', letterSpacing = '0.25px'): ComponentStyle => { +export const textStyle = (font?: Font, letterSpacing = 'normal'): ComponentStyle => { const style: ComponentStyle = { - lineHeight, letterSpacing }; if (font?.style) { @@ -319,6 +336,9 @@ export const textStyle = (font?: Font, lineHeight = '1.5', letterSpacing = '0.25 if (font?.weight) { style.fontWeight = font.weight; } + if (font?.lineHeight) { + style.lineHeight = font.lineHeight; + } if (font?.size) { style.fontSize = (font.size + (font.sizeUnit || 'px')); } diff --git a/ui-ngx/src/app/shared/models/widget.models.ts b/ui-ngx/src/app/shared/models/widget.models.ts index c3b23048d1..3a566d8b9c 100644 --- a/ui-ngx/src/app/shared/models/widget.models.ts +++ b/ui-ngx/src/app/shared/models/widget.models.ts @@ -40,7 +40,7 @@ import { Dashboard } from '@shared/models/dashboard.models'; import { IAliasController } from '@core/api/widget-api.models'; import { isEmptyStr } from '@core/utils'; import { WidgetConfigComponentData } from '@home/models/widget-component.models'; -import { ComponentStyle, Font } from '@shared/models/widget-settings.models'; +import { ComponentStyle, Font, TimewindowStyle } from '@shared/models/widget-settings.models'; export enum widgetType { timeseries = 'timeseries', @@ -183,7 +183,7 @@ export interface WidgetTypeParameters { processNoDataByWidget?: boolean; previewWidth?: string; previewHeight?: string; - absoluteHeader?: boolean; + embedTitlePanel?: boolean; } export interface WidgetControllerDescriptor { @@ -633,6 +633,7 @@ export interface WidgetConfig { useDashboardTimewindow?: boolean; displayTimewindow?: boolean; timewindow?: Timewindow; + timewindowStyle?: TimewindowStyle; desktopHide?: boolean; mobileHide?: boolean; mobileHeight?: number; diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index 026ebf857e..f90a34fe8e 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -725,7 +725,8 @@ "no-attributes-text": "No attributes found", "no-telemetry-text": "No telemetry found", "copy-key": "Copy key", - "copy-value": "Copy value" + "copy-value": "Copy value", + "add-telemetry": "Add telemetry" }, "api-usage": { "api-features": "API features", @@ -3902,7 +3903,15 @@ "interval": "Interval", "just-now": "Just now", "just-now-lower": "just now", - "ago": "ago" + "ago": "ago", + "style": "Timewindow style", + "icon": "Icon", + "icon-position": "Icon position", + "icon-position-left": "Left", + "icon-position-right": "Right", + "font": "Font", + "color": "Color", + "preview": "Preview" }, "unit": { "millimeter": "Millimeter", @@ -5799,7 +5808,8 @@ "font-weight-lighter": "Lighter", "color": "Color", "shadow-color": "Shadow color", - "preview": "Preview" + "preview": "Preview", + "line-height": "Line height" }, "home": { "no-data-available": "No data available"