[astro] Rework Moon Phase calculations (#20104)

* Review Moon Distance and factorization of MoonCalc

Signed-off-by: gael@lhopital.org <gael@lhopital.org>
This commit is contained in:
Gaël L'hopital
2026-01-24 16:13:44 +01:00
committed by GitHub
parent 27fa9d3616
commit 9f24593d34
32 changed files with 594 additions and 1194 deletions
@@ -1,6 +0,0 @@
<svg height="64" width="64" viewBox="0 0 274 274" xmlns="http://www.w3.org/2000/svg">
<path fill="#e86016"
d="M273.95 219.16c0 30.261-24.528 54.792-54.79 54.792H54.79C24.53 273.952 0 249.422 0 219.16V54.79C0 24.53 24.53 0 54.79 0h164.37c30.262 0 54.79 24.53 54.79 54.79z" />
<path fill="#fff"
d="M242.472 154.694c-8.047 2.6-30.666-6.893-13.476-11.978 9.757-7.122 8.74-22.482 6.57-33.425-3.442-14.589-6.888-29.314-14.665-42.308-6.247-11.25-14.817-26.588-29.768-25.468-6.19 3.33-10.682 15.083-21.09 10.388-9.857-3.109-19.806-6.254-29.348-9.831-16.995-7.126-37.566-5.395-52.192-17.96-6.967 20.558-18.466 39.259-25.815 59.654-5.905 8.397-10.077 20.385-12.079 28.564-9.277.965-22.21-2.03-27.74 7.447.072 12.16 7.202 23.53 9.75 35.507a110.63 110.63 0 0019.886 37.096c6.638 13.591 24.91 17.723 37.382 9.774 4.418-2.23 9.445-8.302 5.104-.411-4.227 11.845-4.287 29.622 9.118 35.478 20.156 6.391 43.285-6.852 51.264-25.739 1.517-9.046-10.33-19.482-4.55-28.785 13.424 1.47 15.566 18.693 19.71 29.081 3.802 12.846 6.727 26.234 13.826 37.78 14.722 8.837 3.956-13.924.274-19.497-6.41-9.814-9.378-21.045-14.845-31.38-4.588-6.81-10.484-25.704 4.314-21.486.396 12.902 11.933 24.107 25.161 22.177 20.442-1.558 38.827-15.744 47.2-34.158 1.546-3.985-.345-8.441-3.991-10.52zm-10.614 11.915c.026 12.516-17.03-2.675-24.752.86-13.22 3.091-5.641 15.499 3.873 17.816 9.91 9.024-12.87 2.34-15.256-4.025-3.927-4.593-12.669-9.16-6.387.326 4.796 8.313-8.43-5.6-12.464-7.129-8.143-6.487-22.18-8.65-28.093 1.962-8.37 7.286-2.457 19.544-.907 28.64-.808 6.498-12.284-14.501-11.966.176-.35 6.937 4.4 19.905-5.749 21.256 4.305-6.551-4.614-23.869-8.163-9.63-.81 4.919-1.056 17.409-6.089 6.586-1.336-9.474-13.289 9.969-10.195-2.951 4.053-4.636 8.759-8.566.947-12.242-9.676-7.277 21.537 1.607 14.472-10.206-4.948-3.109-9.543-2.385-1.315-3.024 9.677-2.333 24.108-8.608 22.324-20.57-6.092-11.699-20.639-3.973-28.56 1.49-11.184 7.602-23.452 18.752-38.02 15.481 8-7.745 21.264-9.723 31.267-15.276 10.777-2.073 12.846-17.731-.29-16.217-12.06-2.043-21.407 6.085-31.019 10.65-5.353 2.359-17.961-3.654-5.903-4.054 10.134 2.708 21.227-11.456 7.642-15.567-7.64-1.74-25.423 4.629-26.27-4.717 7.667 2.325 12.817-8.191 2.486-7.655-5.177-.138-21.307 1.19-12.198-6.85-8.004-.434-9.75-19.414-1.213-8.802 5.334 11.36 24.16-1.108 25.114 14.439 4.73 14.553 19.902 4.151 15.332-2.96 3.804 10.283 13.782 19.426 24.937 20.424 8.842.93 3.023-17.32 9.176-7.145 7.106 7.099 14.685 16.593 25.482 17.086 14.939-6.738-2.714-23.225-11.953-26.542-17.725-7.963-39.092-9.218-53.172-24.08-7.353-11.234 15.11 3.97 19.703 5.607 10.37 4.638 21.052 14.168 33.04 11.25 10.485-10.177-5.957-23.101-15.453-26.66-9.968-4.834-23.413-9.26-25.614-21.754 8.326 6.987 17.766 13.829 28.664 15.794 13.586-5.693-3.647-19.524-11.732-23.117-4.586-2.087-13.043-9.908-2.149-6.288 11.749-1.527-1.638-11.742-7.946-12.116-12.774-5.271 10.39-2.369 3.131-10.134-2.141-4.52-4.67-16.838 1.703-6.26 2.672 7.858 11.221 6.17 16.534 3.26-2.188 4.234-7.136 24.078 1.993 12.758 5.77-10.585 3.258 10.34 2.655 15.105-3.325 7.468 3.623 25.299 9.88 19.139-.257-7.257-2.222-20.927 3.804-24.013 6.18 12.118-1.101 25.499-1.286 38.15-3.159 9.275 4.69 27.079 14.899 20.37 9.607-20.381 7.497-43.918 15.965-64.658 4.607 17.924-2.363 35.836-6.3 53.17-6.95 11.057-11.3 25.375-7.662 38.275 4.562 11.59 26.057 2.528 19.768-9.17-1.034-4.967-13.004-17.726-5.997-17.127 4.558 14.929 20.39 3.814 20.224-7.308 4.518-12.362-7.678-18.765-11.888-28.3 6.016 8.35 22.215 11.248 20.317-3.19-.068-6.44-10.112-13.314-8.57-17.829 13.275 10.189 10.994-9.985 12.89-18.313 11.935 3.437 4 17.397 3.37 26.04 1.187 8.852 15.721-9.944 8.968 3.342-3.824 9.2-17.727 15.72-15.06 26.289 8.334 4.85 14.344-15.093 24.946-10.877-4.42 10.572-17.415 13.754-24.836 21.985-9.131 3.674-14.148 23.834.597 18.353 11.027-4.016 20.308-12.16 31.788-14.897 7.114 4.652-10.562 11.054-15.134 13.44-15.133 6.588-35.23 9.586-42.77 26.307 1.31 10.66 17.716 4.492 22.7-1.967 4.325-6.854 20.949-7.405 8.564-.033-5.362 11.006 18.27 5.852 20.835-1.786 2.5 6.274 21.51 2.71 17.927 7.78-1.821.73-3.704 1.286-5.586 1.833z" />
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

@@ -1,8 +0,0 @@
<svg height="64" width="64" viewBox="0 0 274 274" xmlns="http://www.w3.org/2000/svg">
<path fill="#b3d92c"
d="M273.95 219.161c.876 30.481-27.57 57.17-57.89 54.79-54.696-.047-109.395.095-164.09-.071-29.767-.72-54.535-29.06-51.97-58.593.047-54.439-.095-108.88.071-163.317C.791 22.203 29.131-2.565 58.664 0c54.438.047 108.879-.095 163.316.071 29.767.719 54.535 29.06 51.97 58.593v160.497z" />
<path fill="#fff"
d="M59.326 47.752c.084-5.102-7.718-8.716-4.822-13.795 5.78-1.578 1.14-14.6 9.583-11.653 5.513 3.516 9.222-6.93 14.708-1.995 5.124 2.671-.354 6.923-3.295 7.794-3.115 5.324 1.89 10.896 6.157 13.714 2.917 4.026 9.887 1.95 6.552-3.1-4.801-6.694 9.217-7.815 6.379-.375-4.35 4.573-3.47 13.645 3.34 15.192 7.784.425-1.975-10.58 5.97-11.323 8.348.411.112 9.044-.347 13.232-2.178 5.073 7.467 11.46 8.233 4.114-1.392-4.437 2.875-9.661 6.698-4.918 3.411 5.692-8.77 6.975-4.995 13.691 1.767 5.66 7.217 8.903 10.071 13.945 10.443 15.462 18.837 33.547 18.31 52.583 1.234 5.655-4.691 9.858-9.789 8.024-5.595-1.226-7.07-7.39-8.005-12.218-1.024-7.199-1.162-14.526-3.143-21.569-3.25-15.334-8.488-30.683-17.883-43.364-5-4.282-12.656 9.533-15.293.123.024-5.936 8.37-3.523 10.506-4.647.457-7.106-10.154-10.842-14.24-4.795-4.588 5.2-11.013-4.238-4.646-5.862 3.575 2.016 11.316 1.546 6.532-3.926-4.206-3.063-12.1-8.134-16.442-3.078-1.675 4.356-6.58 11.564-10.139 4.206z" />
<path fill="#fff"
d="M30.193 178.158c4.608-9.605 17.084-19.721 5.754-29.74-2.211-16.767 18.688-23.231 31.787-18.573 7.931.218 26.717 10.589 27.567.71-7.397-11.673-23.966-4.857-35.345-6.767-11.123 1.473-36.356-7.846-22.993-21.269 13.002-7.561-12.562-24.345 7.304-27.807 12.853 2.427 28.784-11.315 40.915 1.379 17.206 10.11 29.346 28.551 31.459 48.436-13.127-4.976-15.468-26.956-31.92-24.86-13.781 9.26 4.963 21.24 13.508 25.684 11.348 2.63 13.831 20.766-.956 15.514-12.584-3.455-21.774 7.84-12.98 18.278-3.84 7.588-7.606 22.599 6.872 17.289 8.542-2.362 17.166-22.502 24.541-15.565-7.58 8.005-15.467 15.884-20.255 26.049-5.898 9.925-13.079 22.73-25.61 24.134-12.202-3.837-24.678-9.069-35.651-15.02-4.565-4.505-7.192-11.87-3.997-17.872zm114.085-64.918c-7.328-21.768-7.532-49.76 10.94-66.177 10.147-4.928 22.3 4.432 31.152-5.363 17.055-2.358 21.527 15.985 19.307 28.539 11.842 8.36 9.127 24.549-3.68 30.555-12.118 5.662-26.004 8.007-35.963 17.72-3.985 4.966-13.76 12.025-8.283.705 7.525-9.657 16.584-18.801 20.687-30.536 2.088-18.243-19.07-8.557-21.357 3.042-7.402 3.072-3.749 29.112-12.803 21.515zm47.285 66.323c-11.239-8.71-31.742-19.584-42.174-17.45 4.107 8.328 30.031 17.45 10.619 24.874-4.266 6.69 10.558 18.994-3.266 23.836-14.589 5.402-10.552-18.573-18.48-19.141-11.517 16.405-24.167-10.312-11.156-17.955 9.628-14.346-9.227-10.533-13.474-1.613-12.21 13.982-21.862 34.672-14.088 52.998 8.381 15.895 27.27 9.516 40.495 10.898 10.497 8.906 23.488 18.82 38.043 11.944 16.484-5.907 15.187-25.927 25.441-37.795 5.296-11.344-4.652-22.843-11.96-30.596zm59.431-34.556c-5.797-7.654-26.316-2.437-18.485-17.349-2.573-13.896-20.233-16.232-31.948-15.327-18.45 1.929-34.435 13.175-46.978 26.225 1.506 5.762 12.117-8.488 18.63-6.918 9.208-4.473 25.956-1.715 16.357 10.561 4.762 4.238 20.764 4.112 14.633 16.142-12.958 6.393-27.835-10.015-42.537-6.825-17.348 4.13 12.834 9.14 18.177 13.985 13.415 7.618 23.287 20.533 37.291 27.09 12.52 5.115 22.706-6.667 25.283-16.332 11.796-4.399 22.004-19.843 10.526-30.217.072-.496-.95-.566-.949-1.035z" />
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

@@ -1,6 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 274 274">
<path fill="#ffcf09"
d="M273.95 219.16c0 30.261-24.528 54.792-54.79 54.792H54.79C24.53 273.952 0 249.422 0 219.16V54.79C0 24.53 24.53 0 54.79 0h164.37c30.262 0 54.79 24.53 54.79 54.79z" />
<path fill="#fff"
d="M77.52 154.764C68.87 122.778 88.027 89.9 120.31 81.33c32.284-8.572 65.465 10.41 74.117 42.397 8.65 31.984-10.509 64.862-42.792 73.433-32.283 8.57-65.465-10.412-74.115-42.396zM112.168 209.398l-39.871 39.111 14.25-53.767 10.963 10.497zM206.77 162.814l39.474 39.504-54.266-14.12 10.595-10.863zM159.753 69.08l39.868-39.108-14.249 53.765L174.41 73.24zM65.15 115.666L25.68 76.163l54.263 14.116-10.593 10.864zM69.079 172.166l-56.102-.277 48.445-28.037.262 15.105zM169.218 205.504l-.281 55.587-28.292-48 15.243-.26zM202.867 106.287l56.104.276-48.447 28.037-.26-15.104zM102.727 72.947l.278-55.585 28.295 48-15.244.257z" />
</svg>

Before

Width:  |  Height:  |  Size: 934 B

@@ -1,12 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 274 274">
<path fill="#02b1e8"
d="M273.95 219.161c0 30.26-24.528 54.79-54.79 54.79H54.79c-30.26 0-54.79-24.53-54.79-54.79V54.79C0 24.53 24.53 0 54.79 0h164.37c30.262 0 54.79 24.53 54.79 54.79z" />
<path fill="#02b1e8"
d="M273.95 219.161c0 30.26-24.528 54.79-54.79 54.79H54.79c-30.26 0-54.79-24.53-54.79-54.79V54.79C0 24.53 24.53 0 54.79 0h164.37c30.262 0 54.79 24.53 54.79 54.79z" />
<path fill="#02b1e8"
d="M273.95 219.161c0 30.26-24.528 54.79-54.79 54.79H54.79c-30.26 0-54.79-24.53-54.79-54.79V54.79C0 24.53 24.53 0 54.79 0h164.37c30.262 0 54.79 24.53 54.79 54.79z" />
<path fill="#fff"
d="M100.332 115.657l-1.429 41.814 35.498 22.144 36.927-19.672 1.427-41.814-35.498-22.143zm60.627 36.523l-25.622 14.353-25.242-15.013.38-29.365 25.624-14.353 25.24 15.013z" />
<path fill="#fff"
d="M240.36 175.275l-15.436 7.932-22.482-12.807 21.133-12.515-4.24-7.923-16.14 9.041-16.96-10.625.134-5.418.092.174.258-13.714 17.358-10.835 16.828 10.986 6.061-8.217-23.098-13.86 22.187-13.662 18.07 9.363 3.965-7.716-19.526-9.163 1.74-19.808-8.949-.747-.848 17.336-22.333 13.066-.271-24.56-8.983-.288-.24 18.56-18.433 8.98-3.94-2.582.115.006-1.34-.807-5.921-3.881.24.456-4.576-2.76-.707-20.45 17.926-9.078-4.083-9.36-23.552 13.074-.739-26.045 17.146-10.969-4.7-7.291-17.7 12.33-16.283-11.412-5.122 7.377 14.59 9.401.15 25.874-21.406-12.044-4.74 7.636 15.883 9.447-.526 19.81-10.91 5.813.282.015-6.219 3.435-18.061-9.614 1.1-20.065-10.148-1.143-.454 26.934L53.627 80.58 52.7 60.248l-8.665.425 1.83 21.492-18.027 8.396 3.829 8.124 15.436-7.934 22.482 12.807-21.133 12.516 4.242 7.923 16.122-9.03 16.016 9.804.534 16.953-.054 2.816-17.356 10.836-16.828-10.986-6.063 8.216 23.098 13.86-22.186 13.665-18.07-9.365-3.965 7.717 19.527 9.161-1.741 19.809 8.95.747.846-17.336 22.334-13.066.27 24.56 8.984.286.24-18.46 16.966-9.4 5.195 2.786-.071-.003 6.181 3.726.358.235-.013-.027 5.245 3.162.705 20.45-17.927 9.079 4.085 9.361 23.551-13.075.74 26.046-17.146 10.969 4.7 7.29 17.7-12.33 16.284 11.412 5.12-7.378-14.59-9.4-.148-25.873 21.406 12.042 4.74-7.634-15.91-9.463.83-19.826 12.27-6.785-.119-.004 4.408-2.435 18.062 9.613-1.1 20.066 10.147 1.143.454-26.935 22.925 12.383.927 20.333 8.665-.426-1.83-21.492 18.026-8.395zm-45.046-.984a2.727 2.727 0 01-3.747.93l-17.508-10.547-36.84 19.625-.583 22.075a2.731 2.731 0 01-2.728 2.658h-.073a2.73 2.73 0 01-2.657-2.802l.577-21.832-33.078-20.633-18.364 10.365a2.727 2.727 0 01-3.72-1.035 2.73 2.73 0 011.036-3.718l15.772-8.903-.062-.038 1.486-43.493-15.497-9.335a2.731 2.731 0 012.818-4.677l14.297 8.612 37.767-20.119.55-20.814c.04-1.507 1.272-2.722 2.801-2.657a2.73 2.73 0 012.656 2.8l-.535 20.31 36.426 22.724 17.294-9.763a2.73 2.73 0 012.685 4.755l-17.895 10.1-1.403 41.066 17.596 10.6a2.728 2.728 0 01.929 3.747zm-11.41-35.984l-.091.145-.009-.336z" />
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

@@ -1,34 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.158 496.158">
<path
d="M248.082.003C111.07.003 0 111.063 0 248.085c0 137.001 111.07 248.07 248.082 248.07 137.006 0 248.076-111.069 248.076-248.07C496.158 111.062 385.088.003 248.082.003z"
fill="#f9dc5f" />
<path
d="M235.765 118.016l-3.109-3.109c-9.275-9.274-36.705 3.118-61.262 27.676-24.559 24.56-36.951 51.987-27.676 61.262l3.109 3.109c9.273 9.274 36.701-3.118 61.26-27.677 24.559-24.558 36.951-51.987 27.678-61.261z"
fill="#a3947c" />
<path
d="M171.393 142.583c-24.559 24.56-36.951 51.987-27.676 61.262l3.109 3.109c9.273 9.274 36.701-3.118 61.26-27.677l-36.693-36.694z"
fill="#918169" />
<path fill="#a3947c" d="M246.178 149.262l-68.41 68.412-10.884-10.883 68.411-68.412z" />
<path fill="#918169" d="M212.655 182.781l-34.889 34.889-10.884-10.885 34.888-34.888z" />
<path
d="M412.991 305.866l-38.188-86.822c-34.924-63.343-72.076-80.919-72.076-80.919-19.988-8.62-64.943 9.59-64.943 9.59l-30.794 29.58-.015-.016-.373.388-.387.372.016.016-29.582 30.794s-18.207 44.952-9.588 64.941c0 0 17.578 37.155 80.92 72.075l86.822 38.188s22.146 4.738 52.385-25.044l.011.011c.13-.129.247-.256.372-.384.131-.128.259-.246.387-.375l-.01-.011c29.781-30.237 25.043-52.384 25.043-52.384z"
fill="#a3947c" />
<path
d="M387.948 358.25L206.99 177.294l-.015-.016-.373.388-.387.372.016.016-29.582 30.795s-18.207 44.952-9.588 64.941c0 0 17.578 37.155 80.92 72.075l86.822 38.188s22.146 4.738 52.385-25.044l.011.011c.13-.129.247-.256.372-.384.131-.128.259-.246.387-.375l-.01-.011z"
fill="#918169" />
<path
d="M224.421 123.141c-7.558-7.558-29.908 2.541-49.918 22.552-20.012 20.012-30.109 42.361-22.553 49.918 7.557 7.557 29.906-2.541 49.92-22.552 20.008-20.011 30.107-42.361 22.551-49.918z"
fill="#414140" />
<path
d="M394.7 162.184c-16.23-30.965-51.829-44.304-79.51-29.794-27.682 14.51-36.963 51.375-20.73 82.34 16.23 30.966 51.829 44.305 79.51 29.795 27.683-14.511 36.963-51.375 20.73-82.341zm-29.696 65.235c-19.237 10.084-43.976.814-55.254-20.705-11.278-21.517-4.831-47.135 14.406-57.219 19.235-10.083 43.974-.813 55.254 20.706 11.28 21.517 4.829 47.135-14.406 57.218z"
fill="#a3947c" />
<path
d="M243.349 265.842c-30.966-16.232-67.83-6.951-82.34 20.731-14.51 27.68-1.172 63.279 29.793 79.51 30.966 16.232 67.83 6.951 82.342-20.731 14.508-27.681 1.169-63.279-29.795-79.51zm12.688 70.543c-10.083 19.235-35.7 25.687-57.218 14.406-21.52-11.279-30.788-36.018-20.705-55.253 10.084-19.236 35.701-25.686 57.219-14.406s30.788 36.017 20.704 55.253z"
fill="#918169" />
<path
d="M205.835 169.055s-38.207 3.371-61.805 15.17c0 0-72.666 41.015-59.557 111.809 13.111 70.793 58.621 78.659 69.297 77.536 0 0-23.973-80.907-5.619-124.356 18.272-43.256 57.684-80.159 57.684-80.159z"
fill="#98cad8" />
<path
d="M126.053 210.257c-20.977 16.481-39.058 36.824-35.21 78.659 5.994 65.175 53.938 77.161 53.938 77.161-61.43-60.679-18.728-155.82-18.728-155.82z"
fill="#c1dfe8" />
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

@@ -1,37 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.159 496.159">
<path
d="M248.083.003C111.071.003 0 111.063 0 248.085c0 137.001 111.07 248.07 248.083 248.07 137.006 0 248.076-111.069 248.076-248.07C496.159 111.062 385.089.003 248.083.003z"
fill="#f2b12f" />
<path
d="M444.762 177.718C425.032 85.898 315 116.252 315 116.252c-47.807 11.383-56.913 65.26-56.913 65.26 1.518 16.188 38.954 37.942 38.954 37.942 18.719 7.588 24.282-9.106 24.282-9.106l14.67-26.812c18.213-24.789 36.425-18.718 36.425-18.718 0 8.6 11.129 53.625 11.129 53.625 7.588 20.236 2.023 64.249 2.023 64.249-2.024 24.283 16.188 22.259 16.188 22.259 7.588-6.071 16.903-19.489 20.235-23.777.425-.546.917-1.035 1.364-1.563 30.247-35.812 21.405-101.893 21.405-101.893z"
fill="#6d6256" />
<g fill="#847664">
<path
d="M375.21 302.167c-3.541 15.682 15.095 26.805 26.307 6.323 13.153-24.029 60.453-41.988 60.453-41.988-62.73-.759-85.755 31.216-86.76 35.665zM444.762 177.718C425.032 85.898 315 116.252 315 116.252c-47.807 11.383-56.913 65.26-56.913 65.26 1.518 16.188 38.954 37.942 38.954 37.942 18.719 7.588 24.282-9.106 24.282-9.106l14.67-26.812c18.213-24.789 32.631-18.718 36.425-18.718 30.858 0 48.059 30.101 61.718 30.101 13.66-.001 10.626-17.201 10.626-17.201z" />
</g>
<path
d="M181.881 116.252S71.85 85.898 52.12 177.718c0 0-8.844 66.081 21.402 101.893.445.527.938 1.016 1.362 1.563 8.355 10.772 12.647 17.706 20.235 23.777 0 0 18.213 2.024 16.19-22.259 0 0-5.566-44.012 2.022-64.249 0 0 11.131-45.024 11.131-53.625 0 0 18.212-6.07 36.424 18.718l14.67 26.812s5.565 16.694 24.284 9.106c0 0 37.436-21.754 38.954-37.942-.001 0-9.107-53.877-56.913-65.26z"
fill="#6d6256" />
<g fill="#847664">
<path
d="M120.95 302.167c-1.005-4.449-24.03-36.424-86.76-35.665 0 0 47.3 17.959 60.453 41.988 11.212 20.483 29.848 9.36 26.307-6.323zM181.881 116.252S71.85 85.898 52.12 177.718c0 0-3.036 17.2 10.624 17.2 13.659 0 30.859-30.101 61.719-30.101 3.793 0 18.212-6.07 36.424 18.718l14.67 26.812s5.565 16.694 24.284 9.106c0 0 37.436-21.754 38.954-37.942-.002.001-9.108-53.876-56.914-65.259z" />
</g>
<path
d="M322.772 247.38s9.486-19.35 3.794-28.457c0 0-6.83-5.312-17.074-6.83 0 0-26.488-14.923-46.881-30.733-3.725-2.889-10.014-3.034-13.795-3.035h-.031c-3.782.001-10.071.146-13.796 3.035-20.393 15.81-46.881 30.733-46.881 30.733-10.244 1.518-17.074 6.83-17.074 6.83-5.691 9.106 3.795 28.457 3.795 28.457 1.896 7.588-1.897 23.524-1.897 23.524-4.173 27.698 9.865 35.666 9.865 35.666 10.624 6.83 13.658 29.595 13.658 29.595 1.518 11.382 6.83 28.835 6.83 28.835 3.035 5.312 30.354 32.63 30.354 32.63 6.762 9.016 14.999 6.877 15.161 6.833.164.044 8.401 2.182 15.162-6.833 0 0 27.319-27.318 30.354-32.63 0 0 5.313-17.453 6.831-28.835 0 0 3.034-22.765 13.658-29.595 0 0 14.039-7.968 9.865-35.666-.001 0-3.795-15.936-1.898-23.524z"
fill="#b79563" />
<path
d="M248.816 178.326h-.031c-3.782.001-10.071.146-13.796 3.035-20.393 15.81-46.881 30.733-46.881 30.733-10.244 1.518-17.074 6.83-17.074 6.83-5.691 9.106 3.795 28.457 3.795 28.457 1.896 7.588-1.897 23.524-1.897 23.524-4.173 27.698 9.865 35.666 9.865 35.666 10.624 6.83 13.658 29.595 13.658 29.595 1.518 11.382 6.83 28.835 6.83 28.835 3.035 5.312 30.354 32.63 30.354 32.63 6.762 9.016 14.999 6.877 15.161 6.833.164.043-.015-226.138.016-226.138z"
fill="#aa885b" />
<path
d="M247.709 304.556c-48.099 0-51.254 31.608-51.254 31.608 1.518 11.382 6.83 28.835 6.83 28.835 3.035 5.312 30.354 32.63 30.354 32.63 6.762 9.016 14.999 6.877 15.161 6.833.164.044 8.401 2.182 15.162-6.833 0 0 27.319-27.318 30.354-32.63 0 0 5.313-17.453 6.831-28.835-.002 0-5.339-31.608-53.438-31.608z"
fill="#e0c199" />
<path
d="M248.785 387.421c-29.595 0-45.5-22.422-45.5-22.422 3.035 5.312 30.354 32.63 30.354 32.63 6.762 9.016 14.999 6.877 15.161 6.833.164.044 8.401 2.182 15.162-6.833 0 0 27.319-27.318 30.354-32.63-.001 0-15.936 22.422-45.531 22.422z"
fill="#9e7f56" />
<g fill="#494949">
<path
d="M191.65 228.409l-22.006-.759s-1.518 1.645-.253 9.612c1.265 7.968 5.439 10.118 5.439 10.118l29.72 12.648 1.771-3.036-14.671-28.583zM327.957 227.65l-22.006.759-14.671 28.583 1.771 3.036 29.72-12.648s4.173-2.149 5.438-10.118c1.267-7.968-.252-9.612-.252-9.612zM280.332 332.534c-14.991-7.623-30.614-9.561-31.272-9.639-.088-.012-.172.019-.261.023-.087-.004-.171-.035-.26-.023-.657.078-16.281 2.016-31.271 9.639a1.52 1.52 0 00-.83 1.302 1.521 1.521 0 00.74 1.355l30.764 18.339c.24.143.508.214.777.214.027 0 .054-.009.08-.01.027.001.054.01.082.01.268 0 .537-.071.777-.214l30.764-18.339a1.519 1.519 0 00-.09-2.657z" />
<path
d="M327.957 227.65l-.042.002c.407 1.254.674 2.605.796 4.014-.015-3.204-.754-4.016-.754-4.016zM281.348 364.701a1.622 1.622 0 00-2.136-.832c-10.592 4.661-18.443 5.263-23.34 1.787-4.046-2.872-5.281-8.063-5.635-11.596.168-2.229.031-3.815.014-3.993a1.616 1.616 0 00-1.587-1.46l-.014-.002a1.616 1.616 0 00-1.747 1.485c-.015.178-.131 1.778.069 4.022-.304 3.5-1.461 8.609-5.427 11.489-4.874 3.537-12.816 2.954-23.607-1.735a1.617 1.617 0 00-2.132.841 1.619 1.619 0 00.84 2.132c6.543 2.844 12.212 4.267 16.967 4.267 3.904 0 7.191-.959 9.837-2.88 2.56-1.858 4.174-4.37 5.193-6.931 1.057 2.591 2.719 5.132 5.337 6.995 2.639 1.878 5.888 2.817 9.726 2.817 4.726 0 10.344-1.424 16.812-4.27a1.62 1.62 0 00.83-2.136z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.2 KiB

@@ -1,59 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.159 496.159">
<path
d="M248.083.003C111.071.003 0 111.063 0 248.085c0 137.001 111.07 248.07 248.083 248.07 137.006 0 248.076-111.069 248.076-248.07C496.159 111.062 385.089.003 248.083.003z"
fill="#58d1dd" />
<path
d="M303.188 423.508l-33.423-17.507a.844.844 0 00-.814.019 40.958 40.958 0 01-20.589 5.56c-.051 0-.095.021-.144.029-.049-.008-.093-.029-.144-.029a40.954 40.954 0 01-20.588-5.56.847.847 0 00-.814-.019l-33.423 17.507a.84.84 0 00-.411 1.003c6.388 19.814 29.102 33.653 55.236 33.653.051 0 .095-.021.144-.028.048.008.093.028.144.028 26.135 0 48.85-13.838 55.236-33.653a.84.84 0 00-.41-1.003z"
fill="#9b0000" />
<path
d="M248.36 411.585c-.028.006-.108.018-.142.024-.049-.008-.093-.029-.144-.029a40.954 40.954 0 01-20.588-5.56.847.847 0 00-.814-.019l-33.423 17.507a.84.84 0 00-.411 1.003c6.388 19.814 29.102 33.653 55.236 33.653.051 0 .095-.021.144-.028.034.005.113.017.142.023-.284-.207-.284-46.366 0-46.574z"
fill="#aa0404" />
<g fill="#840303">
<path
d="M351.846 201.877c-1.965-2.806-2.806-.562-2.806-.562 5.332 31.431-7.858 47.427-7.858 47.427-8.699 13.19-56.968 23.573-56.968 23.573l-1.123 11.225c71-10.383 73.807-48.549 73.807-48.549 8.137-27.222-5.052-33.114-5.052-33.114z" />
<path
d="M378.225 246.497c-.28-5.051-2.245-3.087-2.245-3.087-2.526 36.762-26.66 45.462-26.66 45.462-9.261.561-31.712 5.052-31.712 5.052-14.592-5.894-34.236-6.454-34.236-6.454s-8.139 9.261-.842 10.664c7.297 1.402 36.763 3.929 36.763 3.929 47.988-3.087 51.355-19.364 51.355-19.364 14.312-15.434 7.577-36.202 7.577-36.202zM305.121 181.672l-2.666.14s-12.629-7.577-23.152-7.998c0 0 45.042 26.099 37.043 52.198 0 0-10.524 17.68-36.202 26.52l2.105 9.682s37.885-13.471 41.253-33.676c0-.001 6.875-34.237-18.381-46.866z" />
</g>
<path
d="M358.44 186.443c-7.577 2.104-4.63-9.261-4.63-9.261-8.419 10.103-26.941.421-26.941.421l-16.417 21.047-42.937-1.263 9.682 25.678 27.362 1.263-3.789-4.63 30.308-2.947 27.362-30.308z"
fill="#9b0000" />
<path
d="M360.545 135.368c-49.952 3.368-95.976 31.711-95.976 31.711-8.138 4.491-8.699 21.608-8.699 21.608l10.103 8.7.562-10.665c3.306-22.45 23.853-24.976 23.853-24.976 21.89-12.629 75.209-19.645 75.209-19.645 19.364 0 34.237 22.731 34.237 22.731-4.49-25.816-39.289-29.464-39.289-29.464z"
fill="#840303" />
<g fill="#9b0000">
<path
d="M274.111 121.898c-21.047 21.048-25.963 64.243-25.963 64.243l3.653 1.003c1.684-38.868 21.889-62.44 21.889-62.44 1.122-2.385.421-2.806.421-2.806z" />
<path
d="M353.81 117.687c-9.541-38.167-55.846-71-55.846-71-25.257-15.154-35.64-5.894-35.64-5.894 34.798 29.747 48.83 86.996 48.83 86.996-43.778-56.688-49.953-81.944-49.953-81.944-26.099 47.471 63.563 129.231 63.563 129.231 21.468 10.804 29.327-.421 29.327-.421l4.77 5.893c0-3.929 7.017-14.032 7.017-14.032 0-10.943-12.068-48.829-12.068-48.829zM185.708 198.65l-16.417-21.047s-18.522 9.682-26.941-.421c0 0 2.947 11.366-4.63 9.261l27.362 30.308 30.308 2.947-3.789 4.63 27.362-1.263 9.682-25.678-42.937 1.263z" />
</g>
<g fill="#840303">
<path
d="M211.946 272.316s-48.269-10.383-56.968-23.573c0 0-13.19-15.997-7.858-47.427 0 0-.841-2.245-2.806.562 0 0-13.189 5.893-5.052 33.115 0 0 2.806 38.166 73.807 48.549l-1.123-11.226z" />
<path
d="M212.788 287.47s-19.644.561-34.236 6.454c0 0-22.451-4.491-31.712-5.052 0 0-24.134-8.7-26.66-45.462 0 0-1.964-1.964-2.245 3.087 0 0-6.735 20.767 7.577 36.202 0 0 3.368 16.276 51.355 19.364 0 0 29.466-2.527 36.763-3.929 7.297-1.403-.842-10.664-.842-10.664zM179.814 226.012c-7.998-26.099 37.043-52.198 37.043-52.198-10.523.421-23.152 7.998-23.152 7.998l-2.666-.14c-25.257 12.628-18.381 46.865-18.381 46.865 3.368 20.205 41.253 33.676 41.253 33.676l2.105-9.682c-25.678-8.839-36.202-26.519-36.202-26.519z" />
<path
d="M231.591 167.079s-46.024-28.344-95.977-31.711c0 0-34.799 3.648-39.289 29.466 0 0 14.874-22.731 34.237-22.731 0 0 53.32 7.016 75.209 19.645 0 0 20.547 2.526 23.853 24.976l.562 10.665 10.103-8.7c.001-.001-.56-17.119-8.698-21.61z" />
</g>
<g fill="#9b0000">
<path
d="M222.049 121.898s-.702.421.421 2.806c0 0 20.206 23.572 21.889 62.44l3.653-1.003s-4.915-43.195-25.963-64.243z" />
<path
d="M234.958 45.846s-6.174 25.257-49.953 81.944c0 0 14.032-57.249 48.83-86.996 0 0-10.383-9.261-35.64 5.894 0 0-46.305 32.833-55.846 71 0 0-12.068 37.885-12.068 48.83 0 0 7.017 10.103 7.017 14.032l4.77-5.893s7.858 11.225 29.327.421c0-.001 89.663-81.761 63.563-129.232z" />
</g>
<path
d="M248.148 186.141c-18.481 0-42.24 23.033-42.24 94.805 0 101.027 14.742 127.758 42.24 127.758 27.497 0 42.239-26.169 42.239-127.758 0-71.351-23.758-94.805-42.239-94.805z"
fill="#b50606" />
<path d="M205.908 280.946c0 101.027 14.742 127.758 42.24 127.758V186.141c-18.482 0-42.24 23.033-42.24 94.805z"
fill="#cc0e0e" />
<g fill="#600">
<ellipse transform="rotate(-169.235 235.663 212.684)" cx="235.663" cy="212.685" rx="4.771" ry="7.437" />
<ellipse transform="scale(-1) rotate(78.591 259.895 -319.338)" cx="261.323" cy="212.679" rx="7.437"
ry="4.771" />
</g>
<g fill="#840303">
<path
d="M248.582 318.117c-25.339 0-40.14-6.498-40.14-6.498s37.611 24.256 79.7 0c0 0-14.222 6.498-39.56 6.498zM248.555 339.992c-22.96 0-36.373-5.888-36.373-5.888s34.082 21.98 72.22 0c0 0-12.886 5.888-35.847 5.888zM248.523 360.908c-20.168 0-31.947-5.171-31.947-5.171s29.935 19.306 63.433 0c0 0-11.319 5.171-31.486 5.171zM248.495 379.643c-17.769 0-28.148-4.556-28.148-4.556s26.376 17.01 55.893 0c-.001 0-9.975 4.556-27.745 4.556z" />
</g>
<path d="M252.099 183.076l-4.019.935.171 7.755 3.874-.009c-.061 0-.026-8.681-.026-8.681z" fill="#b50606" />
<path fill="#cc0e0e" d="M248.126 184.011l-4.052-.935-.026 8.699 4.11.017z" />
</svg>

Before

Width:  |  Height:  |  Size: 5.6 KiB

@@ -1,31 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.158 496.158">
<path
d="M248.082.003C111.07.003 0 111.063 0 248.085c0 137.001 111.07 248.07 248.082 248.07 137.006 0 248.076-111.069 248.076-248.07C496.158 111.062 385.088.003 248.082.003z"
fill="#af8d4a" />
<g fill="#ddd9bf">
<path
d="M163.342 114.72c-66.5-6.5-119.159 61.667-105.5 61.667 0 0 26.641-24.167 57.5-24.167 49.5 0 79.501 56.5 79.501 56.5s-2.053 14.255 16.666 6.667c0 0 25.767-17.686 27.284-33.874 0-.001-22.979-61.664-75.451-66.793zM333.79 114.72c-52.473 5.129-75.451 66.792-75.451 66.792 1.518 16.188 27.284 33.874 27.284 33.874 18.719 7.588 16.666-6.667 16.666-6.667s30.001-56.5 79.501-56.5c30.859 0 57.5 24.167 57.5 24.167 13.659 0-39-68.166-105.5-61.666z" />
</g>
<g fill="#91552c">
<path
d="M376.448 168.048c-.264-.528-.768-.848-1.405-.828-38.123 1.622-63.338 41.401-65.413 44.786-4.291 3.646 2.807 28.303 16.702 23.28 26.876-9.714 43.765-22.801 50.196-38.897 6.188-15.485.179-27.823-.08-28.341zM187.069 212.006c-2.075-3.384-27.29-43.164-65.413-44.786-.638-.02-1.142.299-1.405.828-.259.518-6.268 12.855-.08 28.341 6.432 16.096 23.32 29.183 50.196 38.897 13.896 5.023 20.993-19.633 16.702-23.28z" />
</g>
<path
d="M322.771 247.38s9.485-19.35 3.794-28.457c0 0-6.83-5.312-17.074-6.83 0 0-26.488-14.923-46.881-30.733-3.725-2.889-10.014-3.034-13.796-3.035h-.03c-3.782.001-10.071.146-13.796 3.035-20.393 15.81-46.881 30.733-46.881 30.733-10.244 1.518-17.074 6.83-17.074 6.83-5.691 9.106 3.795 28.457 3.795 28.457 1.896 7.588-1.896 23.524-1.896 23.524-4.174 27.698 23.523 65.26 23.523 65.26 1.518 11.382 6.829 28.835 6.829 28.835 3.035 5.312 30.354 32.63 30.354 32.63 6.762 9.016 14.999 6.877 15.161 6.833.164.044 8.4 2.182 15.162-6.833 0 0 27.318-27.318 30.354-32.63 0 0 5.313-17.453 6.83-28.835 0 0 27.697-37.563 23.523-65.26 0 0-3.794-15.936-1.897-23.524z"
fill="#9b6038" />
<path
d="M248.814 178.326h-.03c-3.782.001-10.071.146-13.796 3.035-20.393 15.81-46.881 30.733-46.881 30.733-10.244 1.518-17.074 6.83-17.074 6.83-5.691 9.106 3.795 28.457 3.795 28.457 1.896 7.588-1.896 23.524-1.896 23.524-4.174 27.698 23.523 65.26 23.523 65.26 1.518 11.382 6.829 28.835 6.829 28.835 3.035 5.312 30.354 32.63 30.354 32.63 6.762 9.016 14.999 6.877 15.161 6.833.164.044-.015-226.137.015-226.137z"
fill="#aa693d" />
<path
d="M247.709 304.556c-48.1 0-51.254 31.608-51.254 31.608 1.518 11.382 6.829 28.835 6.829 28.835 3.035 5.312 30.354 32.63 30.354 32.63 6.762 9.016 14.999 6.877 15.161 6.833.164.044 8.4 2.182 15.162-6.833 0 0 27.318-27.318 30.354-32.63 0 0 5.313-17.453 6.83-28.835-.001 0-5.338-31.608-53.436-31.608z"
fill="#e0c199" />
<path
d="M248.784 387.421c-29.595 0-45.5-22.422-45.5-22.422 3.035 5.312 30.354 32.63 30.354 32.63 6.762 9.016 14.999 6.877 15.161 6.833.164.044 8.4 2.182 15.162-6.833 0 0 27.318-27.318 30.354-32.63-.001 0-15.936 22.422-45.531 22.422z"
fill="#96592f" />
<g fill="#494949">
<path
d="M191.648 228.409l-22.006-.759s-1.518 1.645-.254 9.612c1.266 7.968 5.439 10.118 5.439 10.118l29.721 12.648 1.771-3.036-14.671-28.583zM327.957 227.65l-22.007.759-14.671 28.583 1.771 3.036 29.721-12.648s4.173-2.149 5.438-10.118c1.266-7.968-.252-9.612-.252-9.612zM280.332 332.534c-14.991-7.623-30.615-9.561-31.272-9.639-.089-.012-.172.019-.261.023-.088-.004-.171-.035-.26-.023-.657.078-16.281 2.016-31.271 9.639a1.52 1.52 0 00-.83 1.302 1.521 1.521 0 00.74 1.355l30.764 18.339c.24.143.508.214.777.214.027 0 .054-.009.08-.01.027.001.054.01.082.01.268 0 .537-.071.776-.214l30.765-18.339a1.518 1.518 0 00-.09-2.657z" />
<path
d="M327.957 227.65l-.043.002a18.02 18.02 0 01.797 4.014c-.016-3.204-.754-4.016-.754-4.016zM281.348 364.701a1.623 1.623 0 00-2.137-.832c-10.592 4.661-18.443 5.263-23.34 1.787-4.046-2.872-5.281-8.063-5.635-11.596.168-2.229.031-3.815.014-3.993a1.615 1.615 0 00-1.587-1.46l-.015-.002a1.615 1.615 0 00-1.746 1.485c-.015.178-.131 1.778.069 4.022-.304 3.5-1.461 8.609-5.427 11.489-4.874 3.537-12.816 2.954-23.607-1.735a1.617 1.617 0 00-2.132.841 1.619 1.619 0 00.84 2.132c6.544 2.844 12.212 4.267 16.967 4.267 3.904 0 7.191-.959 9.837-2.88 2.561-1.858 4.175-4.37 5.193-6.931 1.057 2.591 2.719 5.132 5.337 6.995 2.639 1.878 5.888 2.817 9.726 2.817 4.726 0 10.344-1.424 16.812-4.27a1.621 1.621 0 00.831-2.136z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

@@ -1,37 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.159 496.159">
<path
d="M248.083.003C111.071.003 0 111.063 0 248.085c0 137.001 111.07 248.07 248.083 248.07 137.006 0 248.076-111.069 248.076-248.07C496.159 111.062 385.089.003 248.083.003z"
fill="#f9dc5f" />
<path
d="M213.286 276.657c27.443-36.322 25.022-81.523 25.022-81.523-4.036-58.115-58.115-70.223-58.115-70.223C93.826 101.503 78.49 160.426 78.49 160.426c-19.372 20.179-12.915 63.765-12.915 63.765-.807 10.089-21.995 34.103-21.995 34.103-4.439 5.449.807 9.888.807 9.888 3.027 2.825 11.301 3.833 11.301 3.833 1.21.808 1.009 2.826 1.009 2.826l-2.422 8.878c-.605 3.431 4.641 7.668 4.641 7.668.808 1.614-.605 3.229-.605 3.229-2.018 3.026-2.421 5.448-2.421 5.448-.808 4.036 5.65 9.687 5.65 9.687.807 4.035-4.843 12.914-4.843 12.914-1.615 13.318 9.686 13.722 9.686 13.722h34.708l18.564 40.358 94.438-29.058c-15.336-25.829-.807-71.03-.807-71.03z"
fill="#b97141" />
<path fill="#a55d35" d="M151.538 306.925l-85.155 29.461h34.708l52.061-27.039.404-11.705z" />
<path
d="M238.308 195.134c-4.036-58.115-58.115-70.223-58.115-70.223C93.826 101.503 78.49 160.426 78.49 160.426c62.958 4.843 65.172 61.318 89.999 107.755 18.118 33.891 38.522 51.973 38.579 47.219.242-20.151 6.218-38.744 6.218-38.744 27.443-36.322 25.022-81.522 25.022-81.522z"
fill="#70462a" />
<g fill="#a55d35">
<path
d="M174.824 222.093c-17.687-4.708-19.981 20.099-19.981 20.099l-.346 25.725c4.906 4.321 10.361 5.73 13.602.926 5.116-7.588 12.499-18.418 17.879-27.7 7.031-12.132-4.72-17.336-11.154-19.05zM66.113 263.743c-1.346 9.416-9.416 8.071-9.416 8.071l4.305 1.346c8.342-.539 5.111-9.417 5.111-9.417zM70.823 224.998s8.071 7.265 23.003-2.422c0 .001-10.896 3.633-23.003 2.422z" />
</g>
<path
d="M95.643 201.793c-5.65-2.422-29.058-1.614-29.058-1.614-2.152 3.296.771 6.659 2.219 6.659 20.853 0 33.901 5.65 33.901 5.65-.605-8.072-7.062-10.695-7.062-10.695z"
fill="#70462a" />
<g fill="#b97141">
<path
d="M177.233 210.604c-20.717-5.516-23.408 23.542-23.408 23.542l-.404 30.133c5.746 5.063 12.136 6.714 15.932 1.086 5.995-8.888 11.375-16.421 17.497-25.839 8.953-13.769-2.08-26.915-9.617-28.922zM452.579 258.294s-21.188-24.013-21.995-34.103c0 0 6.457-43.586-12.915-63.765 0 0-15.336-58.923-101.702-35.515 0 0-54.079 12.107-58.115 70.223 0 0-2.421 45.201 25.022 81.523 0 0 14.528 45.201-.807 71.03l94.438 29.058 18.564-40.358h34.708s11.301-.403 9.686-13.722c0 0-5.65-8.879-4.843-12.914 0 0 6.458-5.65 5.65-9.687 0 0-.403-2.421-2.421-5.448 0 0-1.413-1.615-.605-3.229 0 0 5.247-4.238 4.641-7.668l-2.422-8.878s-.202-2.018 1.009-2.826c0 0 8.273-1.008 11.301-3.833-.001 0 5.245-4.439.806-9.888z" />
</g>
<path fill="#a55d35" d="M344.622 306.925l-2.018-9.283.404 11.705 52.061 27.039h34.708z" />
<path
d="M315.968 124.911s-54.079 12.107-58.115 70.223c0 0-2.421 45.201 25.022 81.523 0 0 5.976 18.593 6.218 38.744.057 4.754 20.461-13.328 38.579-47.219 24.827-46.437 27.04-102.913 89.999-107.755-.001-.001-15.337-58.924-101.703-35.516z"
fill="#70462a" />
<g fill="#a55d35">
<path
d="M341.317 242.192s-2.295-24.807-19.981-20.099c-6.434 1.713-18.185 6.918-11.154 19.049 5.38 9.282 12.763 20.112 17.879 27.7 3.241 4.805 8.696 3.395 13.602-.926l-.346-25.724zM430.047 263.743s-3.23 8.878 5.111 9.417l4.305-1.346s-8.07 1.345-9.416-8.071zM402.334 222.577c14.932 9.687 23.003 2.422 23.003 2.422-12.107 1.21-23.003-2.422-23.003-2.422z" />
</g>
<path
d="M429.575 200.179s-23.408-.808-29.058 1.614c0 0-6.457 2.623-7.063 10.695 0 0 13.048-5.65 33.901-5.65 1.449 0 4.372-3.363 2.22-6.659z"
fill="#70462a" />
<path
d="M342.334 234.147s-2.691-29.058-23.408-23.542c-7.537 2.007-18.569 15.152-9.618 28.923 6.122 9.417 11.502 16.951 17.497 25.839 3.796 5.628 10.186 3.977 15.932-1.086l-.403-30.134z"
fill="#b97141" />
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

@@ -1,66 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.159 496.159">
<path
d="M248.083.003C111.071.003 0 111.063 0 248.085c0 137.001 111.07 248.071 248.083 248.071 137.006 0 248.076-111.07 248.076-248.071C496.159 111.063 385.089.003 248.083.003z"
fill="#f2b12f" />
<path
d="M398.941 294.253l36.136 1.853c-14.825-48.181-51.887-44.475-51.887-44.475l38.915-37.988c-39.842-1.853-49.107-25.943-49.107-25.943l20.384-22.238c-2.78-7.412-31.503-11.118-31.503-11.118 4.633-4.633 3.707-26.87 3.707-26.87-11.119 1.854-37.062-3.707-37.062-3.707 5.559-8.338 18.531-6.485 18.531-6.485-20.384-22.237-64.859-5.559-64.859-5.559-1.236-13.282 4.325-20.693 4.325-20.693-21.002-5.56-33.356 16.06-33.356 16.06l-6.794-21.001-3.706 21.001c-11.119-2.471-25.943-26.561-25.943-26.561-11.119 9.884 3.088 38.916 3.088 38.916-27.797-24.708-62.389-14.208-62.389-14.208 0 16.06 25.944 37.681 25.944 37.681-23.472-19.15-67.948-9.266-67.948-9.266 4.942 17.295 16.678 22.237 16.678 22.237l-42.005 58.68c-39.534 21.62-27.179 72.891-27.179 72.891 16.678-21.62 42.815-12.973 42.815-12.973-7.219 4.942-27.991 9.884-27.991 9.884 6.177 2.472 13.589 5.56 13.589 5.56-22.855 8.03-22.237 37.063-22.237 37.063 11.118-4.324 36.639-.618 36.639-.618-6.601-.618-20.578 15.442-20.578 15.442 8.03 4.324 30.267 6.177 30.267 6.177-21.002 12.973-12.972 29.65-12.972 29.65 10.501-5.56 27.797-8.647 27.797-8.647 11.736 1.234 19.149 3.706 19.149 3.706 0 16.678 11.119 32.12 11.119 32.12 0-12.972 11.737-14.207 11.737-14.207 3.088 19.767 11.736 17.296 11.736 17.296 1.235-9.266 12.354-8.03 12.354-8.03-2.471 1.853-4.016 8.338-4.016 8.338 24.091 6.486 45.401-8.338 45.401-8.338l-.926 15.751c0-8.339 16.679-7.413 16.679-7.413 12.044 10.192 34.282 4.634 34.282 4.634-10.192-4.634-.927-16.679-.927-16.679 29.65 16.679 52.814-1.853 52.814-1.853-10.192 0-20.384-8.34-20.384-8.34l50.961 1.854-25.943-15.751c16.678 7.412 41.694-7.413 41.694-7.413l-18.53-8.339c9.265-7.412 29.649 1.854 29.649 1.854.927-15.752-12.972-32.43-12.972-32.43 15.752 2.779 27.796 14.825 27.796 14.825 7.412-37.064-12.972-46.33-12.972-46.33z"
fill="#7a582b" />
<path
d="M328.513 203.984c10.954-25.878-28.438-65.434-85.661-52.739-57.222-12.694-98.714 26.861-87.762 52.739 3.415 8.066-17.117 54.272 8.553 82.144 5.622 6.103 28.21 70.716 28.21 70.716.79 1.381 25.19 6.627 48.714 7.004v.023c.411-.001.823-.007 1.234-.011.411.004.824.01 1.234.011v-.023c23.524-.377 47.925-5.623 48.714-7.004 0 0 22.59-64.613 28.211-70.716 25.671-27.872 5.139-74.078 8.553-82.144z"
fill="#d6953e" />
<path
d="M242.852 151.245c-57.222-12.694-98.714 26.861-87.762 52.739 3.415 8.066-17.117 54.272 8.553 82.144 5.622 6.103 28.21 70.716 28.21 70.716.79 1.381 25.19 6.627 48.714 7.004v.023c.411-.001.823-.007 1.234-.011.411.004.824.01 1.234.011v-.023l-.183-212.603z"
fill="#c18236" />
<path
d="M255.313 361.594l-12.461-8.826-12.716 8.901-36.815-4.826c3.339 5.845 20.203 24.079 20.203 24.079 12.828 15.134 45.832 14.034 59.74 0 0 0 16.864-18.234 20.203-24.079l-38.154 4.751z"
fill="#d6953e" />
<path
d="M280.533 283.009c-16.379-13.906-16.29-45.451-32.789-53.355-1.579-.758-7.148-.796-8.644-.104-16.458 7.605-16.557 39.491-33.01 53.46-29.153 24.754-38.872 53.174-16.501 75.359 9.91 9.829 43.455 12.377 43.455 12.377s8.906-10.815 9.086-10.863c.165.044 2.2.044 2.364 0 .181.048 9.085 10.863 9.085 10.863s33.546-2.548 43.456-12.377c22.37-22.186 12.651-50.606-16.502-75.36z"
fill="#bc7928" />
<path
d="M277.639 288.567c-15.106-12.825-15.023-54.343-30.24-61.634-1.457-.698-6.592-.733-7.972-.097-15.179 7.015-15.27 48.847-30.442 61.73-26.887 22.828-35.849 49.039-15.219 69.5 9.139 9.063 40.076 11.414 40.076 11.414s8.213-9.975 8.379-10.02c.151.041 2.029.041 2.181 0 .167.045 8.379 10.02 8.379 10.02s30.937-2.351 40.077-11.414c20.63-20.46 11.667-46.671-15.219-69.499z"
fill="#d6953e" />
<path
d="M242.852 226.239c-1.638-.016-2.735.279-3.425.598-15.179 7.015-15.27 48.847-30.442 61.73-26.887 22.828-35.849 49.039-15.219 69.5 9.139 9.063 40.076 11.414 40.076 11.414s8.213-9.975 8.379-10.02c.079.021.627.031 1.156.03.485 0-.525-133.252-.525-133.252z"
fill="#c18236" />
<g fill="#3f2308">
<path
d="M278.084 321.127c-16.492-8.386-33.68-10.519-34.403-10.604-.098-.014-.189.021-.287.024-.096-.004-.188-.038-.286-.024-.723.085-17.912 2.218-34.403 10.604a1.672 1.672 0 00-.099 2.923l33.845 20.175c.264.157.559.235.854.235.03 0 .06-.009.088-.011.03.002.059.011.09.011.295 0 .591-.078.855-.235l33.845-20.175c.521-.312.833-.883.814-1.49a1.673 1.673 0 00-.913-1.433z" />
<path
d="M279.202 365.409a1.782 1.782 0 00-2.35-.915c-11.653 5.127-20.291 5.79-25.677 1.966-4.451-3.159-5.81-8.87-6.199-12.757.185-2.452.034-11.09.016-11.285a1.777 1.777 0 00-1.746-1.606l-.016-.003a1.779 1.779 0 00-1.922 1.634c-.016.196-.144 8.851.077 11.319-.334 3.851-1.607 9.471-5.971 12.639-5.362 3.891-14.099 3.25-25.971-1.909a1.78 1.78 0 00-2.346.925 1.783 1.783 0 00.924 2.347c7.199 3.128 13.436 4.693 18.666 4.693 4.295 0 7.912-1.056 10.822-3.169 2.816-2.044 4.593-4.808 5.713-7.625 1.163 2.851 2.991 5.646 5.872 7.696 2.902 2.065 6.477 3.099 10.699 3.099 5.199 0 11.38-1.566 18.495-4.697a1.786 1.786 0 00.914-2.352z" />
</g>
<g fill="#282727">
<path
d="M173.911 208.384c12.468 46.939 50.606 9.534 50.606 9.534-21.819 5.134-50.606-9.534-50.606-9.534zM261.654 217.918s38.138 37.405 50.606-9.534c.001 0-28.787 14.668-50.606 9.534z" />
</g>
<path
d="M236.435 207.65c-.55-2.2-2.75-3.851-2.75-3.851s-7.701 5.318-13.202 5.501c-10.339.345-24.937-4.033-34.288-5.501-9.351-1.467-16.319 0-16.319 0s14.486 21.82 54.641 15.586c5.429-.844 8.067-4.034 10.359-7.06.001.001 2.11-2.475 1.559-4.675z"
fill="#6d4d25" />
<path
d="M299.975 203.799c-9.351 1.468-23.949 5.846-34.288 5.501-5.5-.183-13.202-5.501-13.202-5.501s-2.2 1.65-2.75 3.851 1.559 4.676 1.559 4.676c2.292 3.025 4.93 6.216 10.359 7.06 40.155 6.234 54.641-15.586 54.641-15.586s-6.967-1.468-16.319-.001z"
fill="#7a582b" />
<path
d="M154.794 162.576c-18.826-14.1-43.06-13.548-54.13 1.233-11.07 14.78-4.783 38.191 14.044 52.29 18.826 14.101 58.912-39.423 40.086-53.523z"
fill="#d6953e" />
<path
d="M162.791 185.09c-14.671-16.132-35.12-24.449-45.675-18.578-10.555 5.87-7.216 23.706 7.456 39.838s52.892-5.128 38.219-21.26z"
fill="#c98431" />
<path
d="M385.22 163.809c-11.069-14.781-35.304-15.333-54.129-1.233-18.826 14.101 21.26 67.624 40.086 53.523 18.826-14.099 25.113-37.51 14.043-52.29z"
fill="#d6953e" />
<path
d="M374.918 170.547c-5.87-10.555-23.706-7.216-39.838 7.456s5.128 52.892 21.26 38.219c16.132-14.671 24.45-35.12 18.578-45.675z"
fill="#c98431" />
<g fill="#7a582b">
<path
d="M351.088 191.13c-5.039-2.063-14.349-17.636-14.349-17.636l22.825-3.075c-11.118-14.354-55.595-14.257-55.595-14.257 12.244 15.584 27.98 68.96 27.98 68.96 6.259 3.868 10.151 8.729 10.151 8.729 5.676-7.479-.81-25.166-.81-25.166l9.364-5.316-10.38-8.17c0 .001 15.853-2.007 10.814-4.069zM274.586 136.141l-67.047 4.117 6.47 17.056 14.702 8.822 3.53-9.41s9.999 7.057 9.999 10.586l8.822-18.82 7.057 10.587 6.47-7.059 2.94 12.352 10.586-9.41-3.529-18.821zM172.615 163.105c-14.123-4.762-50.211 8.168-50.211 8.168l10.445 11.566c-8.953.681-22.383 21.769-22.383 21.769 1.492 6.123 24.373 4.082 24.373 4.082l-10.445 6.803c4.974 8.164 25.614 7.213 25.614 7.213l14.675-25.58 11.439-17.689-3.507-16.332z" />
</g>
<g fill="#8c5519">
<ellipse cx="290.22" cy="328.39" rx="4.125" ry="2.475" />
<ellipse cx="276.2" cy="341.32" rx="4.125" ry="2.476" />
<ellipse cx="292.7" cy="348.74" rx="4.125" ry="2.475" />
<ellipse cx="196.71" cy="328.39" rx="4.125" ry="2.475" />
<ellipse cx="210.74" cy="341.32" rx="4.125" ry="2.476" />
<ellipse cx="194.24" cy="348.74" rx="4.125" ry="2.475" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.6 KiB

@@ -1,26 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.158 496.158">
<path
d="M248.082.003C111.07.003 0 111.063 0 248.085c0 137.001 111.07 248.07 248.082 248.07 137.006 0 248.076-111.069 248.076-248.07C496.158 111.062 385.088.003 248.082.003z"
fill="#f9dc5f" />
<g fill="#4c4c48">
<path d="M243.029 157.629h10.938v202.92h-10.938z" />
<path
d="M268.272 386.501c0-46.279-19.353-45.438-19.353-45.438s-19.353-.842-19.353 45.438c0 0 5.049 17.67-78.253 17.67v8.414h195.211v-8.414c-83.299 0-78.252-17.67-78.252-17.67zM248.499 123.134c-4.628 0-10.813 9.808-10.813 31.73s22.467 21.922 22.467 0c0-21.923-7.026-31.73-11.654-31.73z" />
</g>
<g fill="#6d6d68">
<path
d="M369.949 191.075a3.37 3.37 0 00-4.385 1.853l-36.903 111.909c-.594 1.723.109 3.686 1.569 4.385.352.169.714.248 1.072.248 1.126 0 2.193-.793 2.645-2.1l37.854-111.91a3.364 3.364 0 00-1.852-4.385zM423.451 304.837l-36.925-111.909a3.366 3.366 0 10-6.238 2.532l37.877 111.91c.449 1.307 1.517 2.1 2.644 2.1.357 0 .721-.079 1.073-.248 1.46-.7 2.162-2.663 1.569-4.385z" />
<path d="M327.975 304s.714 48.485 48.497 48.485S424.255 304 424.255 304h-96.28z" />
</g>
<path
d="M386.404 170.553c-.007.033-.02.066-.027.101-1.459-2.901-4.23-5.341-7.836-6.499-6.525-2.098-13.289.783-15.104 6.432-1.816 5.651 2.002 11.932 8.527 14.028.158.051.316.086.474.131a18.536 18.536 0 01-9.968-.383c-4.939-1.588-13.397-11.229-31.094-16.917-14.019-4.506-45.148-5.23-85.213-18.106l-4.248 13.218c32.111 10.32 64.651 10.515 78.967 14.627 26.484 7.608 32.892 14.99 39.777 20.148 6.885 5.159 23.311 3.092 27.221-9.075a23.05 23.05 0 00-1.476-17.705z"
fill="#4c4c48" />
<g fill="#6d6d68">
<path
d="M168.885 224.837l-38.291-111.909a3.366 3.366 0 10-6.238 2.532l39.088 111.91c.463 1.307 1.562 2.1 2.721 2.1.368 0 .742-.079 1.104-.248 1.502-.7 2.225-2.663 1.616-4.385zM114.017 111.075a3.37 3.37 0 00-4.385 1.853L71.323 224.837c-.611 1.723.112 3.686 1.615 4.385.362.169.735.248 1.104.248 1.159 0 2.258-.793 2.722-2.1l39.104-111.91a3.365 3.365 0 00-1.851-4.385z" />
<path d="M70.495 224s0 48.485 49.18 48.485c49.181 0 49.914-48.485 49.914-48.485H70.495z" />
</g>
<path
d="M166.357 114.409c-17.696-5.688-30.188-2.778-35.127-4.366a18.53 18.53 0 01-8.324-5.496c.154.055.303.119.461.17 6.525 2.097 13.288-.782 15.104-6.434 1.816-5.648-2.002-11.93-8.527-14.026-3.605-1.159-7.281-.793-10.156.717.014-.033.023-.067.037-.099a23.057 23.057 0 00-11.516 13.529c-3.91 12.166 8.236 23.416 16.838 23.234 8.602-.18 18.109-2.447 44.066 6.8 14.031 4.997 40.592 23.797 72.703 34.118l4.248-13.218c-40.064-12.876-65.787-30.423-79.807-34.929z"
fill="#4c4c48" />
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

@@ -1,23 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.158 496.158">
<path
d="M248.082.003C111.07.003 0 111.063 0 248.085c0 137.001 111.07 248.07 248.082 248.07 137.006 0 248.076-111.069 248.076-248.07C496.158 111.062 385.088.003 248.082.003z"
fill="#58d1dd" />
<g fill="#c14e00">
<path
d="M298.486 105.655c-1.959-.735-50.152-18.669-79.666-17.209-18.338.888-31.063 20.819-31.599 21.667a2.845 2.845 0 00-.192 2.659 2.842 2.842 0 002.1 1.645l105.969 18.924a2.832 2.832 0 002.226-.542 2.833 2.833 0 001.101-2.011l1.894-22.234a2.84 2.84 0 00-1.833-2.899zM283.058 233.673l-13.998-31.527a2.634 2.634 0 00-3.348-1.39l-50.24 19.25a2.631 2.631 0 00-1.692 2.407 2.636 2.636 0 001.592 2.473c1.312.563 32.471 13.788 65.386 12.488a2.632 2.632 0 002.3-3.701z" />
</g>
<path
d="M397.451 226.358l-10.256-61.663 10.256-62.25c.184-1.105-.52-2.174-1.686-2.564s-2.475.006-3.141.949c-13.955 19.732-39.832 49.62-49.864 49.62-8.78 0-29.989-11.148-39.31-18.193-19.637-14.841-46.532-26.955-78.326-26.955-57.056 0-123.479 31.723-126.447 58.422l38.072 14.726-37.086-6.98c8.959 24.991 71.413 54.073 125.461 54.073 35.691 0 67.545-17.124 86.577-32.429 6.176-4.967 22.864-14.757 31.059-14.757 9.61 0 35.69 29.896 49.872 49.635.498.691 1.342 1.083 2.214 1.083.311 0 .626-.049.93-.152 1.161-.395 1.859-1.463 1.675-2.565z"
fill="#e85e00" />
<circle cx="166.159" cy="142.019" r="11.852" fill="#42423f" />
<circle cx="169.229" cy="137.189" r="4.829" fill="#fff" />
<g fill="#c14e00">
<path
d="M308.936 280.446c-.535-.848-13.261-20.779-31.599-21.667-29.514-1.46-77.707 16.474-79.666 17.209a2.838 2.838 0 00-1.831 2.898l1.894 22.234a2.831 2.831 0 001.101 2.011 2.827 2.827 0 002.226.542l105.968-18.924a2.838 2.838 0 001.907-4.303zM280.685 390.34l-50.24-19.25a2.634 2.634 0 00-3.348 1.39l-13.998 31.527a2.631 2.631 0 002.3 3.701c32.915 1.3 64.074-11.924 65.386-12.488a2.639 2.639 0 001.592-2.473 2.631 2.631 0 00-1.692-2.407z" />
</g>
<path
d="M397.48 334.056c-2.968-26.699-69.392-58.422-126.447-58.422-31.794 0-58.689 12.114-78.326 26.955-9.32 7.045-30.529 18.193-39.31 18.193-10.032 0-35.909-29.888-49.864-49.62-.665-.943-1.975-1.34-3.141-.949s-1.869 1.459-1.686 2.564l10.256 62.25-10.256 61.663c-.184 1.103.514 2.17 1.675 2.563.304.104.619.152.93.152.872 0 1.716-.392 2.214-1.083 14.182-19.738 40.262-49.635 49.872-49.635 8.194 0 24.883 9.79 31.06 14.757 19.031 15.305 50.885 32.429 86.576 32.429 54.049 0 116.502-29.082 125.461-54.073l-37.086 6.98 38.072-14.724z"
fill="#e85e00" />
<circle cx="329.999" cy="312.349" r="11.852" fill="#42423f" />
<circle cx="326.929" cy="307.519" r="4.829" fill="#fff" />
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

@@ -1,31 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.162 496.162">
<path
d="M248.086.006C111.07.006 0 111.06 0 248.09c0 136.996 111.07 248.066 248.086 248.066 137.004 0 248.076-111.07 248.076-248.066C496.162 111.06 385.09.006 248.086.006z"
fill="#f2b12f" />
<path
d="M141.92 238.174l-41.17-28.047-44.369.176 23.01 31.682-22.773 31.609 44.371-.166 40.945-28.324a4.905 4.905 0 00-.014-6.93z"
fill="#b21212" />
<path
d="M165.709 239.199l-32.539-22.156-35.074.123 18.195 25.039-18.004 25.002 35.064-.137 32.375-22.387a3.881 3.881 0 00-.017-5.484z"
fill="#c11616" />
<path fill="#5e3838" d="M53.914 240.553L265.641 65.09l-2.498-3.016L47.908 240.447l215.836 192.141 2.606-2.92z" />
<path
d="M449.997 237.152c-6.541-6.729-13.084-13.458-19.617-20.186-3.436-3.533-7.62-3.776-11.055-2.208-3.646 1.18-6.588 4.246-6.656 9.224-.049 3.181-.092 6.351-.14 9.527l-375.65-2.124c-1.482 1.114-2.779 2.372-3.698 3.861-3.111 5.056-1.484 10.717 3.478 14.532 0 0 373.243 4.492 375.576 4.526-.041 3.162-.093 6.324-.138 9.488-.128 9.089 11.048 13.943 17.582 7.597 6.728-6.54 13.461-13.08 20.189-19.621 4.053-3.934 4.034-10.594.129-14.616z"
fill="#7e6060" />
<path
d="M31.626 241.379c.252 3.114 2.033 6.094 5.032 8.401 0 0 373.243 4.492 375.576 4.526-.041 3.162-.093 6.324-.138 9.488-.128 9.089 11.048 13.943 17.582 7.597 6.728-6.54 13.461-13.08 20.189-19.621 2.026-1.968 3.035-4.617 3.049-7.276l-421.29-3.115z"
fill="#605151" />
<g fill="#5e3838">
<path
d="M349.34 185.185c-2.037-5.111-4.385-10.139-7.301-15.092a73.991 73.991 0 00-2.34-3.734l-1.332-1.912-1.316-1.723a141.413 141.413 0 00-5.107-6.318c-3.566-4.156-7.482-8.203-11.869-11.912-4.359-3.719-9.234-7.039-14.109-9.764-9.906-5.455-18.494-8.852-26.07-13.67a115.54 115.54 0 01-11.078-7.82 137.408 137.408 0 01-5.285-4.436l-2.605-2.352a71.367 71.367 0 01-2.346-2.232c-3.012-2.998-5.598-6.16-7.449-9.303-2.072-3.137-2.111-6.404-3.123-9.004-.947-2.723-1.154-5.809-.234-9.252a23.628 23.628 0 012.064-5.225c.838-1.666 2.279-3.588 3.113-4.742l-.834.514c2.313-1.836 4.693-3.543 7.076-4.828 2.357-1.301 4.766-2.135 6.414-2.02.822.055 1.635.299 2.445 1.109.803.779 1.457 2.027 1.926 3.404.914 2.801 1.229 6.066 1.166 9.318 1.4-2.977 2.432-6.174 2.668-9.754.092-1.791-.002-3.727-.764-5.746-.717-2.012-2.363-4.094-4.52-5.248-4.4-2.318-8.73-1.928-12.436-1.477-3.762.551-7.221 1.545-10.586 2.66l-.838.523a43.162 43.162 0 00-4.068 2.707 44.676 44.676 0 00-3.529 2.945c-2.266 2.096-4.373 4.475-6.205 7.207-3.666 5.408-6.1 12.424-6.264 19.668-.285 7.377 3.291 13.695 6.26 19.129 3.223 5.453 7.076 10.01 11.121 14.053 1.004 1.018 2.059 1.996 3.064 2.93l2.955 2.656a163.466 163.466 0 006.176 5.178 137.793 137.793 0 0013.359 9.426c9.316 5.861 19.354 9.924 26.889 14.152 7.588 4.195 13.758 9.604 19.674 16.502a118.889 118.889 0 014.301 5.318l.959 1.24.807 1.162a58.533 58.533 0 011.625 2.6c2.146 3.641 4.051 7.676 5.703 11.828 6.604 16.725 9.295 35.576 9.359 54.289-.064 18.707-2.756 37.555-9.359 54.289-1.652 4.154-3.557 8.176-5.703 11.82a56.072 56.072 0 01-1.625 2.607l-.807 1.154-.932 1.201-2.158 2.748-2.17 2.607c-5.916 6.908-12.086 12.311-19.674 16.51-7.535 4.223-17.572 8.293-26.889 14.154-9.385 5.822-17.701 12.563-25.49 20.119-4.17 4.164-7.941 8.639-11.186 14.115-2.938 5.441-6.561 11.773-6.105 19.143.188 7.213 2.641 14.193 6.313 19.555a41.096 41.096 0 006.15 7.186c2.342 2.15 4.428 3.801 7.545 5.652l.814.496c3.354 1.129 6.807 2.129 10.551 2.686 3.689.453 7.998.844 12.35-1.445 2.143-1.145 3.762-3.205 4.484-5.193.764-2.006.871-3.926.787-5.709-.221-3.574-1.232-6.768-2.607-9.746.086 3.246-.203 6.512-1.105 9.318-.457 1.387-1.107 2.645-1.908 3.449-.805.828-1.639 1.088-2.48 1.156-1.691.139-4.123-.697-6.496-1.982-2.393-1.287-4.789-2.99-7.111-4.818l.818.504c-.855-1.18-2.313-3.084-3.172-4.75a23.877 23.877 0 01-2.117-5.246c-.92-3.492-.697-6.619.283-9.365 1.18-2.609 1.168-5.859 3.275-8.988 1.826-3.125 4.496-6.375 7.385-9.244 6.516-6.334 13.797-12.225 21.379-16.898 7.576-4.828 16.164-8.227 26.07-13.672 4.875-2.725 9.75-6.051 14.109-9.771 4.387-3.709 8.303-7.756 11.869-11.904l2.611-3.143 2.465-3.139 1.348-1.758 1.332-1.914a82.83 82.83 0 002.34-3.734c2.916-4.953 5.264-9.982 7.301-15.094 8.031-20.48 10.918-41.854 11.02-62.955-.103-21.105-2.99-42.48-11.021-62.955z" />
<path
d="M263.738 52.803c-6.488 0-11.754 5.264-11.754 11.75 0 6.488 5.266 11.752 11.754 11.752s11.752-5.264 11.752-11.752c0-6.487-5.263-11.75-11.752-11.75z" />
</g>
<path d="M263.738 58.678a5.879 5.879 0 00-5.877 5.875 5.875 5.875 0 105.877-5.875z" fill="#7e6060" />
<path
d="M265.693 419.375c-6.486 0-11.75 5.266-11.75 11.752 0 6.488 5.264 11.752 11.75 11.752 6.49 0 11.754-5.264 11.754-11.752 0-6.486-5.263-11.752-11.754-11.752z"
fill="#5e3838" />
<path
d="M265.693 424.92a5.88 5.88 0 00-5.873 5.879 5.88 5.88 0 005.873 5.875 5.88 5.88 0 005.879-5.875 5.88 5.88 0 00-5.879-5.879z"
fill="#7e6060" />
</svg>

Before

Width:  |  Height:  |  Size: 4.8 KiB

@@ -1,167 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.158 496.158">
<path
d="M248.082.003C111.07.003 0 111.063 0 248.085c0 137.001 111.07 248.07 248.082 248.07 137.006 0 248.076-111.069 248.076-248.07C496.158 111.062 385.088.003 248.082.003z"
fill="#58d1dd" />
<path
d="M344.312 157.14c-5.491-3.849-16.838 2.863-25.344 14.994-8.506 12.127-10.953 25.083-5.461 28.931 5.492 3.85 16.838-2.863 25.343-14.991 8.506-12.128 10.951-25.084 5.462-28.934z"
fill="#282828" />
<path
d="M343.024 161.293a.403.403 0 00-.401-.369c-.243-.003-24.346.061-25.26 27.641-.009.311-.016.623-.021.94a.412.412 0 00.387.417.412.412 0 00.432-.371c.02-.231 2.516-23.075 24.545-27.817a.417.417 0 00.324-.388c-.005-.017-.003-.035-.006-.053z"
fill="#a9a9a9" />
<path
d="M343.033 109.093c-.175-.288-17.908-28.701-56.699-28.701-4.635 0-9.453.407-14.316 1.209a1.869 1.869 0 00-.207 3.639c8.756 2.504 28.189 10.813 32.746 20.818.76 1.669 2.654 7.723 1.054 10.16-.218.331-.903 1.378-3.419 1.327-2.353-1.16-16.93-8.776-30.277-25.46a1.87 1.87 0 00-3.27 1.632c.701 2.721 17.609 66.678 59.037 71.439a1.888 1.888 0 00.731-.062c.65-.187 15.949-4.755 21.487-18.848 4.051-10.307 1.742-22.804-6.867-37.153z"
fill="#1e1e1e" />
<path
d="M282.853 83.424c-.706 0-1.42.007-2.142.021a.933.933 0 00-.042 1.866c.525.034 52.71 3.992 65.154 53.776a.935.935 0 001.841-.247c-.012-.554-1.965-55.416-64.811-55.416z"
fill="#a9a9a9" />
<ellipse transform="rotate(-163.416 294.357 194.043)" cx="294.36" cy="194.046" rx="26.824" ry="12.142"
fill="#1e1e1e" />
<path
d="M317.713 200.275c-.112-.252-13.402-22.499-45.295-14.935-.387.093-.76.232-1.145.355-.268.086-.41.335-.324.565.089.231.375.362.652.297.289-.072 26.216-4.147 45.169 14.126.161.154.396.248.622.18.021-.009.044-.016.063-.029.246-.101.357-.343.258-.559z"
fill="#a9a9a9" />
<path
d="M341.749 202.06s-1.244-1.557-3.424-.934l.312 10.897s-13.393 20.963-27.789 19.247c-.491-.059-3.637 1.914-4.736 3.981-1.1 2.066-1.51 4.762 1.023 5.522 4.594 1.38 12.731 2.286 22.162-3.534 0 0 14.633-9.028 16.5-17.435 0 .002-.313-13.385-4.048-17.744z"
fill="#282828" />
<path d="M318.088 231.714c18.68-1.401 21.715-18.212 21.715-18.212-9.807 14.71-21.715 18.212-21.715 18.212z"
fill="#a9a9a9" />
<path
d="M307.933 229.29l-22.188-18.603a5.448 5.448 0 00-7 8.35l22.188 18.602a5.446 5.446 0 007.674-.674 5.45 5.45 0 00-.674-7.675z"
fill="#1e1e1e" />
<path
d="M306.486 229.783l-18.596-15.59c-1.93-1.62-3.835-2.532-4.251-2.036-.416.495.813 2.211 2.745 3.831l18.594 15.589c1.934 1.621 3.838 2.533 4.25 2.036.416-.496-.81-2.209-2.742-3.83z"
fill="#a9a9a9" />
<path
d="M340.869 241.592s-1.227-1.536-3.376-.921l.306 10.749s-13.21 20.68-27.413 18.986c-.483-.058-3.587 1.889-4.67 3.928-1.085 2.039-1.489 4.698 1.009 5.448 4.531 1.361 12.56 2.254 21.863-3.486 0 0 14.433-8.906 16.275-17.199 0 0-.308-13.205-3.994-17.505z"
fill="#282828" />
<path d="M317.529 270.845c18.426-1.381 21.42-17.966 21.42-17.966-9.674 14.511-21.42 17.966-21.42 17.966z"
fill="#a9a9a9" />
<path
d="M307.511 268.454l-21.886-18.352a5.376 5.376 0 00-7.574.667 5.377 5.377 0 00.667 7.571l21.887 18.35a5.372 5.372 0 007.57-.665 5.372 5.372 0 00-.664-7.571z"
fill="#1e1e1e" />
<path
d="M306.084 268.939L287.74 253.56c-1.904-1.598-3.783-2.498-4.193-2.009-.41.49.803 2.181 2.709 3.779l18.342 15.378c1.906 1.599 3.785 2.498 4.192 2.008.409-.488-.802-2.178-2.706-3.777z"
fill="#a9a9a9" />
<path
d="M338.033 279.285s-1.172-1.468-3.227-.88l.293 10.273s-12.627 19.764-26.201 18.146c-.461-.055-3.428 1.806-4.463 3.754-1.038 1.948-1.425 4.489.965 5.207 4.33 1.301 12.002 2.155 20.895-3.332 0 0 13.795-8.512 15.555-16.438 0 0-.294-12.62-3.817-16.73z"
fill="#282828" />
<path d="M315.725 307.243c17.613-1.322 20.474-17.17 20.474-17.17-9.246 13.868-20.474 17.17-20.474 17.17z"
fill="#a9a9a9" />
<path
d="M306.152 304.958l-20.918-17.54a5.137 5.137 0 00-6.601 7.874l20.918 17.538a5.135 5.135 0 007.236-.636 5.138 5.138 0 00-.635-7.236z"
fill="#1e1e1e" />
<path
d="M304.787 305.423l-17.531-14.699c-1.819-1.527-3.616-2.388-4.006-1.92-.395.468.766 2.084 2.586 3.613l17.53 14.697c1.825 1.529 3.62 2.387 4.008 1.92.393-.468-.765-2.083-2.587-3.611z"
fill="#a9a9a9" />
<path
d="M324.529 326.425s-.6-1.612-2.557-1.691l-2.692 9.018s-16.654 13.563-27.991 8.258c-.389-.181-3.499.586-4.961 1.984-1.463 1.395-2.528 3.495-.654 4.803 3.391 2.376 9.816 5.319 19.123 3.102 0 0 14.439-3.443 18.249-9.83 0 .001 3.367-11.058 1.483-15.644z"
fill="#282828" />
<path d="M297.105 344.335c15.693 3.905 22.731-9.056 22.731-9.056-12.022 9.407-22.731 9.056-22.731 9.056z"
fill="#a9a9a9" />
<path
d="M289.435 339.599l-13.154-21.258a4.709 4.709 0 00-6.48-1.522 4.7 4.7 0 00-1.522 6.475l13.155 21.256a4.706 4.706 0 008.001-4.951z"
fill="#1e1e1e" />
<path
d="M288.113 339.611l-11.027-17.816c-1.141-1.849-2.457-3.113-2.932-2.818-.475.292.068 2.033 1.213 3.883l11.027 17.814c1.147 1.853 2.461 3.115 2.933 2.82.475-.294-.065-2.031-1.214-3.883z"
fill="#a9a9a9" />
<path
d="M174.351 172.134c-8.506-12.131-19.854-18.843-25.344-14.994-5.489 3.851-3.045 16.807 5.461 28.934 8.505 12.128 19.852 18.841 25.344 14.991 5.491-3.849 3.045-16.804-5.461-28.931z"
fill="#282828" />
<path
d="M175.957 188.565c-.914-27.58-25.018-27.644-25.26-27.641a.401.401 0 00-.401.369c-.004.018-.003.036-.005.054a.414.414 0 00.324.388c22.029 4.742 24.523 27.586 24.544 27.817a.415.415 0 00.433.371.412.412 0 00.387-.417c-.006-.318-.014-.63-.022-.941z"
fill="#a9a9a9" />
<path
d="M223.701 91.58a1.864 1.864 0 00-2.295.504c-13.348 16.685-27.925 24.301-30.277 25.46-2.516.052-3.203-.996-3.42-1.327-1.602-2.437-1.041-5.232 1.055-10.16 3.904-9.173 23.99-18.314 32.746-20.818a1.867 1.867 0 00-.208-3.639c-4.863-.803-9.681-1.209-14.315-1.209-38.792 0-56.524 28.414-56.699 28.701-8.611 14.349-10.918 26.846-6.867 37.154 5.539 14.093 20.838 18.661 21.487 18.848a1.855 1.855 0 00.732.062c41.428-4.762 58.336-68.718 59.036-71.439a1.875 1.875 0 00-.975-2.137z"
fill="#1e1e1e" />
<path
d="M212.607 83.445c-.723-.014-1.436-.021-2.141-.021-62.846 0-64.799 54.862-64.813 55.416a.936.936 0 00.935.955.935.935 0 00.906-.708c12.444-49.785 64.63-53.743 65.155-53.776a.935.935 0 00-.042-1.866z"
fill="#a9a9a9" />
<ellipse transform="rotate(-106.589 198.974 194.046)" cx="198.975" cy="194.05" rx="12.14" ry="26.826"
fill="#1e1e1e" />
<path
d="M222.047 185.695c-.386-.123-.758-.262-1.145-.355-31.895-7.563-45.184 14.683-45.297 14.935-.098.216.014.458.258.559.021.013.042.02.064.029.226.068.461-.025.621-.18 18.953-18.273 44.881-14.198 45.169-14.126.277.065.563-.065.653-.297.087-.23-.056-.479-.323-.565z"
fill="#a9a9a9" />
<path
d="M187.208 235.251c-1.101-2.067-4.245-4.04-4.735-3.981-14.396 1.716-27.789-19.247-27.789-19.247l.312-10.897c-2.181-.623-3.425.934-3.425.934-3.736 4.359-4.047 17.746-4.047 17.746 1.867 8.406 16.5 17.435 16.5 17.435 9.43 5.819 17.568 4.914 22.161 3.534 2.534-.762 2.123-3.457 1.023-5.524z"
fill="#282828" />
<path d="M153.517 213.501s3.035 16.812 21.715 18.212c0 .001-11.908-3.501-21.715-18.212z" fill="#a9a9a9" />
<path
d="M215.251 211.364a5.45 5.45 0 00-7.677-.676l-22.187 18.603a5.447 5.447 0 00-.673 7.675 5.445 5.445 0 007.674.674l22.188-18.602a5.448 5.448 0 00.675-7.674z"
fill="#1e1e1e" />
<path
d="M209.68 212.157c-.416-.496-2.32.416-4.25 2.036l-18.596 15.59c-1.932 1.622-3.16 3.334-2.744 3.83.412.497 2.317-.415 4.251-2.036l18.594-15.589c1.932-1.62 3.161-3.336 2.745-3.831z"
fill="#a9a9a9" />
<path
d="M187.603 274.333c-1.084-2.039-4.187-3.985-4.67-3.928-14.203 1.693-27.414-18.986-27.414-18.986l.307-10.749c-2.148-.615-3.376.921-3.376.921-3.685 4.299-3.993 17.504-3.993 17.504 1.842 8.293 16.275 17.199 16.275 17.199 9.303 5.74 17.331 4.847 21.863 3.486 2.499-.748 2.094-3.408 1.008-5.447z"
fill="#282828" />
<path d="M154.371 252.878s2.992 16.585 21.42 17.966c0 .001-11.746-3.454-21.42-17.966z" fill="#a9a9a9" />
<path
d="M215.269 250.769a5.378 5.378 0 00-7.574-.667l-21.887 18.352a5.372 5.372 0 00-.664 7.571 5.372 5.372 0 007.57.665l21.887-18.35a5.375 5.375 0 00.668-7.571z"
fill="#1e1e1e" />
<path
d="M209.773 251.552c-.411-.489-2.289.411-4.193 2.009l-18.345 15.379c-1.904 1.599-3.116 3.289-2.705 3.778.407.49 2.285-.41 4.191-2.008l18.343-15.378c1.907-1.599 3.119-3.291 2.709-3.78z"
fill="#a9a9a9" />
<path
d="M188.885 310.578c-1.037-1.949-4.002-3.809-4.465-3.754-13.573 1.618-26.2-18.146-26.2-18.146l.294-10.273a3.085 3.085 0 00-3.227.88c-3.523 4.11-3.816 16.73-3.816 16.73 1.76 7.926 15.555 16.438 15.555 16.438 8.893 5.487 16.563 4.633 20.895 3.332 2.387-.718 2.001-3.259.964-5.207z"
fill="#282828" />
<path d="M157.121 290.073s2.861 15.849 20.473 17.17c0 0-11.227-3.302-20.473-17.17z" fill="#a9a9a9" />
<path
d="M215.324 288.057a5.138 5.138 0 00-7.238-.638l-20.918 17.54a5.136 5.136 0 006.601 7.871l20.918-17.538a5.138 5.138 0 00.637-7.235z"
fill="#1e1e1e" />
<path
d="M210.07 288.804c-.391-.468-2.188.393-4.006 1.92l-17.532 14.699c-1.823 1.528-2.979 3.143-2.587 3.611.389.467 2.184-.391 4.008-1.92l17.531-14.697c1.821-1.528 2.981-3.145 2.586-3.613z"
fill="#a9a9a9" />
<path
d="M206.991 343.994c-1.462-1.398-4.571-2.165-4.96-1.984-11.338 5.305-27.992-8.258-27.992-8.258l-2.692-9.018c-1.958.08-2.556 1.691-2.556 1.691-1.885 4.586 1.483 15.645 1.483 15.645 3.808 6.387 18.249 9.83 18.249 9.83 9.307 2.217 15.731-.726 19.123-3.102 1.873-1.309.808-3.409-.655-4.804z"
fill="#282828" />
<path d="M173.482 335.279s7.038 12.961 22.731 9.056c.001 0-10.707.351-22.731-9.056z" fill="#a9a9a9" />
<path
d="M223.517 316.819a4.707 4.707 0 00-6.479 1.522l-13.154 21.258a4.706 4.706 0 001.526 6.474 4.7 4.7 0 006.474-1.523l13.156-21.256a4.7 4.7 0 00-1.523-6.475z"
fill="#1e1e1e" />
<path
d="M219.166 318.977c-.475-.295-1.791.969-2.932 2.818l-11.027 17.816c-1.149 1.853-1.689 3.589-1.215 3.884.473.295 1.786-.968 2.934-2.82l11.027-17.814c1.143-1.851 1.688-3.592 1.213-3.884z"
fill="#a9a9a9" />
<path
d="M268.014 184.537c-.069-.099-6.133-11.279-4.371-27.574a1.867 1.867 0 00-3.624-.804c-.038.111-3.909 11.111-12.242 11.111h-2.306c-8.333 0-12.204-11-12.242-11.111a1.867 1.867 0 00-3.625.804c1.763 16.294-4.301 27.475-4.371 27.574a1.87 1.87 0 001.531 2.939c.139 0 .277-.016.416-.048l18.707-5.729c.283-.065 1.191-.065 1.474 0l18.707 5.729a1.872 1.872 0 001.967-.779 1.87 1.87 0 00-.021-2.112z"
fill="#1e1e1e" />
<path
d="M278.791 208.435c-5.91-24.532-18.088-35.328-32.153-35.328-13.759 0-25.712 10.331-31.757 33.743-2.682 10.383 66.344 11.692 63.91 1.585z"
fill="#565655" />
<path
d="M279.386 211.053c-5.657-26.383-59.839-26.383-65.495 0-2.062 9.615-3.211 21.196-3.211 34.904 0 51.324 16.097 113.011 35.958 113.011 19.86 0 35.958-61.687 35.958-113.011 0-13.708-1.149-25.289-3.21-34.904z"
fill="#1e1e1e" />
<path
d="M246.334 191.267c-14.857.089-29.635 6.684-32.443 19.786-2.062 9.615-3.211 21.196-3.211 34.904 0 51.324 16.097 113.011 35.958 113.011l-.304-167.701z"
fill="#0f0f0f" />
<g fill="#d3d3d3">
<path
d="M276.209 242.411a.283.283 0 00-.295-.144l-.016.003c-3.545.597-7.145.597-10.657.417-1.761-.117-3.51-.226-5.245-.477-1.74-.223-3.435-.775-5.145-1.02a2.709 2.709 0 00-1.869.414l-.088.057c-1.408.921-2.663 2.074-3.842 3.341-.58.65-1.148 1.311-1.666 2.054-.455.627-2.039.627-2.492 0-.519-.743-1.088-1.404-1.668-2.054-1.178-1.268-2.434-2.42-3.842-3.341l-.088-.057a2.708 2.708 0 00-1.869-.414c-1.709.245-3.404.797-5.145 1.02-1.734.251-3.484.359-5.244.477-3.514.18-7.113.18-10.656-.417l-.018-.003a.28.28 0 00-.293.144.28.28 0 00.113.383c1.65.898 3.402 1.515 5.186 2.07 1.782.562 3.61.979 5.46 1.294 1.85.328 3.722.486 5.601.614 1.521.084 3.068.274 4.604.256a22.598 22.598 0 003.674 1.752c.821.284 1.652.558 2.535.749.875.207 1.783.362 2.771.398a.348.348 0 00.125-.025.338.338 0 00.123.025 14.176 14.176 0 002.771-.398c.883-.191 1.715-.464 2.535-.749a22.598 22.598 0 003.674-1.752c1.536.019 3.083-.171 4.604-.256 1.879-.128 3.751-.287 5.601-.614a40.99 40.99 0 005.459-1.294c1.785-.555 3.536-1.172 5.187-2.07a.281.281 0 00.115-.383zM273.722 273.492a.26.26 0 00-.271-.132l-.014.003c-3.253.548-6.553.548-9.776.382-1.614-.107-3.22-.208-4.81-.438-1.597-.204-3.151-.711-4.72-.935a2.484 2.484 0 00-1.715.378l-.081.053c-1.291.845-2.443 1.902-3.523 3.065-.533.597-1.055 1.202-1.529 1.884-.418.575-1.869.575-2.287 0-.475-.682-.996-1.287-1.529-1.884-1.079-1.163-2.232-2.22-3.523-3.065l-.08-.053a2.48 2.48 0 00-1.715-.378c-1.567.224-3.123.731-4.717.935-1.594.23-3.197.33-4.813.438-3.222.166-6.523.166-9.773-.382l-.018-.003a.257.257 0 00-.268.132.257.257 0 00.102.351c1.514.824 3.121 1.391 4.758 1.899 1.635.515 3.313.897 5.009 1.187 1.696.301 3.413.446 5.138.563 1.395.078 2.813.252 4.223.234a20.662 20.662 0 003.369 1.608c.754.26 1.518.511 2.326.686.803.19 1.636.333 2.543.366a.39.39 0 00.113-.022.317.317 0 00.114.022c.905-.034 1.74-.176 2.541-.366.81-.175 1.573-.426 2.326-.686 1.188-.439 2.31-.98 3.369-1.608 1.41.018 2.829-.156 4.224-.234 1.723-.117 3.439-.263 5.136-.563a37.58 37.58 0 005.01-1.187c1.636-.509 3.243-1.075 4.757-1.899a.258.258 0 00.104-.351zM268.746 304.521a.217.217 0 00-.222-.109l-.013.003c-2.665.449-5.37.449-8.012.314-1.322-.089-2.64-.171-3.942-.359-1.308-.167-2.583-.582-3.866-.767a2.043 2.043 0 00-1.408.311l-.064.043c-1.059.693-2.003 1.559-2.889 2.512-.438.488-.864.985-1.252 1.544-.344.47-1.533.47-1.876 0a15.814 15.814 0 00-1.253-1.544c-.885-.953-1.83-1.819-2.888-2.512l-.065-.043a2.046 2.046 0 00-1.406-.311c-1.285.185-2.56.599-3.865.767-1.305.188-2.621.271-3.945.359-2.639.135-5.346.135-8.01-.314l-.014-.003a.213.213 0 00-.22.109.209.209 0 00.085.288c1.24.674 2.557 1.139 3.897 1.557 1.341.422 2.716.735 4.106.972 1.391.246 2.797.366 4.211.461 1.141.064 2.305.208 3.459.193.869.514 1.789.958 2.763 1.317.616.214 1.242.419 1.906.562a10.57 10.57 0 002.083.3.254.254 0 00.094-.019c.03.011.06.02.094.019a10.57 10.57 0 002.082-.3c.664-.143 1.289-.348 1.906-.562.975-.36 1.894-.804 2.762-1.317 1.154.014 2.318-.129 3.461-.193 1.413-.095 2.819-.215 4.21-.461a30.982 30.982 0 004.106-.972c1.34-.417 2.657-.882 3.898-1.557a.21.21 0 00.087-.288zM262.215 333.533a.149.149 0 00-.157-.077l-.009.002c-1.895.319-3.818.319-5.697.222-.939-.063-1.877-.121-2.804-.255-.931-.119-1.837-.415-2.749-.545a1.45 1.45 0 00-1.001.221l-.046.031c-.754.492-1.425 1.108-2.054 1.786-.312.348-.615.701-.893 1.098-.242.335-1.089.335-1.331 0-.277-.397-.58-.75-.893-1.098-.629-.677-1.301-1.294-2.054-1.786l-.046-.031a1.457 1.457 0 00-1-.221c-.914.13-1.82.426-2.75.545-.927.134-1.861.192-2.805.255-1.877.097-3.801.097-5.695-.222l-.01-.002a.145.145 0 00-.155.077.147.147 0 00.058.204c.883.479 1.819.811 2.773 1.107.953.3 1.932.523 2.92.691.987.175 1.988.26 2.994.329.812.045 1.641.146 2.461.137.617.366 1.271.681 1.965.937.438.152.883.298 1.355.4.467.11.951.193 1.48.214a.19.19 0 00.066-.014.177.177 0 00.066.014 7.724 7.724 0 001.481-.214c.471-.102.916-.248 1.354-.4a11.953 11.953 0 001.965-.937c.821.01 1.649-.092 2.461-.137 1.005-.068 2.007-.153 2.995-.329a21.909 21.909 0 002.918-.691c.955-.297 1.891-.628 2.773-1.107a.147.147 0 00.064-.204z" />
</g>
<path
d="M266.766 367.803c-8.21-11.165-19.664-16.688-25.582-12.336-5.914 4.353-4.048 16.931 4.166 28.096 8.215 11.162 19.669 16.686 25.585 12.332 5.913-4.352 4.049-16.93-4.169-28.092z"
fill="#1e1e1e" />
<path
d="M263.92 369.897c-6.028-8.197-14.438-12.253-18.783-9.057-4.342 3.196 17.5 32.879 21.843 29.682 4.342-3.195 2.973-12.43-3.06-20.625z"
fill="#cfcfcf" />
<path
d="M297.963 392.621c-11.547-7.663-24.201-8.913-28.262-2.792-4.059 6.12 2.016 17.29 13.566 24.953 11.551 7.659 24.205 8.91 28.264 2.788 4.059-6.119-2.014-17.29-13.568-24.949z"
fill="#1e1e1e" />
<path
d="M296.012 395.566c-8.479-5.626-17.77-6.544-20.752-2.051-2.979 4.494 27.732 24.864 30.711 20.369 2.981-4.493-1.479-12.695-9.959-18.318z"
fill="#cfcfcf" />
<path
d="M333.582 396.01c-13.857-.008-25.097 5.941-25.101 13.287-.002 7.344 11.233 13.298 25.093 13.304 13.861.003 25.1-5.946 25.102-13.291.002-7.343-11.233-13.3-25.094-13.3z"
fill="#1e1e1e" />
<path
d="M333.582 399.543c-10.176-.005-18.428 4.362-18.432 9.755 0 5.392 36.854 5.403 36.854.011.002-5.393-8.246-9.765-18.422-9.766z"
fill="#cfcfcf" />
<path
d="M393.463 377.174c-4.3-5.952-16.894-4.201-28.129 3.917-11.236 8.111-16.861 19.516-12.563 25.471 4.299 5.955 16.893 4.199 28.13-3.914 11.236-8.114 16.861-19.52 12.562-25.474z"
fill="#1e1e1e" />
<path
d="M388.057 381.081c-3.158-4.371-12.404-3.084-20.652 2.874-8.251 5.956-12.383 14.329-9.227 18.703 3.157 4.37 33.036-17.205 29.879-21.577z"
fill="#cfcfcf" />
<path
d="M402.455 354.922c-3.425-25.218-23.037-24.284-23.037-24.284 3.424-16.188 17.746-23.35 17.746-23.35-17.746-.934-26.463 21.792-26.463 21.792-11.209 30.51 9.029 47.011 9.029 47.011l13.697 3.736c11.831-7.781 9.028-24.905 9.028-24.905z"
fill="#1e1e1e" />
<path d="M382.842 335.931s18.057 11.52 10.274 35.492c0 0 19.924-22.416-10.274-35.492z" fill="#cfcfcf" />
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

@@ -1,57 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.159 496.159">
<path
d="M248.083.003C111.071.003 0 111.063 0 248.085c0 137.001 111.07 248.07 248.083 248.07 137.006 0 248.076-111.069 248.076-248.07C496.159 111.062 385.089.003 248.083.003z"
fill="#af8d4a" />
<path
d="M167.373 199.371c-15.639 5.093-30.906.336-40.461-6.388-9.556-6.724-20.828-23.321-18.077-47.33 4.961-43.284 47.094-43.202 47.094-43.202-13.176-11.316-31.91-8.684-39.008-6.011-41.625 15.681-50.474 61.879-50.474 61.879-9.358 77.235 95.644 85.017 95.644 85.017 55.194-2.04 60.517-62.722 60.517-62.722-24.159 1.688-55.235 18.757-55.235 18.757z"
fill="#eae7d0" />
<path
d="M167.373 199.371C96.288 209.421 66.448 158.32 66.448 158.32c-9.358 77.235 95.644 85.017 95.644 85.017 55.194-2.04 60.517-62.722 60.517-62.722-24.16 1.687-55.236 18.756-55.236 18.756z"
fill="#ddd9bf" />
<path
d="M428.251 158.32s-8.849-46.198-50.474-61.879c-7.098-2.673-25.832-5.305-39.008 6.011 0 0 42.133-.082 47.094 43.202 2.752 24.009-8.521 40.606-18.076 47.33s-24.822 11.48-40.461 6.388c0 0-31.076-17.069-55.235-18.756 0 0 5.323 60.682 60.517 62.722-.001-.001 105.001-7.783 95.643-85.018z"
fill="#eae7d0" />
<path
d="M428.251 158.32s-29.84 51.101-100.925 41.051c0 0-31.076-17.069-55.235-18.756 0 0 5.323 60.682 60.517 62.722-.001 0 105.001-7.782 95.643-85.017z"
fill="#ddd9bf" />
<path
d="M367.007 244.183c-23.533-3.177-46.177 11.646-46.177 19.002 0 7.355 8.18 23.02 39.815 28.133 23.533 3.177 46.178-20.778 46.178-28.133 0-7.356-16.283-15.827-39.816-19.002z"
fill="#4c4a48" />
<path
d="M360.958 253.385c-14.313-1.933-28.085 7.083-28.085 11.557s4.976 14 24.216 17.111c14.313 1.932 28.085-12.638 28.085-17.111s-9.903-9.626-24.216-11.557z"
fill="#383736" />
<path
d="M131.202 244.183c-23.533 3.176-39.816 11.646-39.816 19.002 0 7.355 22.645 31.31 46.178 28.133 31.635-5.113 39.816-20.778 39.816-28.133 0-7.356-22.645-22.179-46.178-19.002z"
fill="#4c4a48" />
<path
d="M137.251 253.385c-14.313 1.932-24.216 7.083-24.216 11.557s13.772 19.042 28.085 17.111c19.24-3.11 24.216-12.638 24.216-17.111s-13.772-13.49-28.085-11.557z"
fill="#383736" />
<path
d="M333.445 256.518s10.828-22.088 4.332-32.483c0 0-7.796-6.063-19.49-7.796 0 0-39.702-22.497-69.281-22.497-29.579 0-69.28 22.497-69.28 22.497-11.693 1.733-19.49 7.796-19.49 7.796-6.496 10.395 4.332 32.483 4.332 32.483 2.165 8.662-2.166 26.853-2.166 26.853-4.764 31.617 34.648 107.411 34.648 107.411 3.464 6.063 18.181 48.385 51.955 48.385s48.492-42.321 51.956-48.385c0 0 39.414-75.794 34.649-107.411 0 0-4.33-18.191-2.165-26.853z"
fill="#3f3d3d" />
<path
d="M318.286 216.239s-39.702-22.497-69.281-22.497-69.28 22.497-69.28 22.497c-6.338 0 18.768 54.717 18.768 54.717l12.561 89.764c3.464 6.063 4.177 78.447 37.951 78.447s35.918-74.384 39.382-80.447l11.132-87.764s23.368-54.717 18.767-54.717z"
fill="#514f4d" />
<path
d="M179.725 216.239c-5.588 0 18.768 54.717 18.768 54.717l12.561 89.764c3.464 6.063 4.177 78.447 37.951 78.447V193.742c-29.579 0-69.28 22.497-69.28 22.497z"
fill="#444341" />
<path
d="M247.76 356.407c-54.905 0-55.357 22.006-55.357 22.006 1.641 12.993 2.818 27.338 4.647 32.916 1.829 5.578 17.04 29.55 51.955 29.55 34.916 0 49.02-22 51.956-29.55 2.937-7.549 3.007-19.923 4.648-32.916 0 0-2.944-22.006-57.849-22.006z"
fill="#383736" />
<g fill="#161616">
<path
d="M216.35 381.192c-14.065 45.506 26.477 33.923 26.477 33.923-17.123-5.627-26.477-33.923-26.477-33.923zM284.665 381.192s-9.354 28.296-26.477 33.923c.001 0 40.543 11.583 26.477-33.923z" />
</g>
<g fill="#282727">
<path
d="M183.768 234.863l-25.121-.867s-1.733 1.877-.29 10.973c1.444 9.096 6.209 11.549 6.209 11.549l33.926 14.438 2.021-3.466-16.745-32.627zM339.364 233.996l-25.121.867-16.747 32.627 2.022 3.466 33.926-14.438s4.764-2.454 6.208-11.549c1.445-9.096-.288-10.973-.288-10.973z" />
</g>
<path d="M339.364 233.996l-.048.002c.465 1.432.77 2.974.909 4.582-.018-3.656-.861-4.584-.861-4.584z"
fill="#494949" />
<path
d="M316.381 197.175c-8.732-9.666-35.981-18.272-67.847-18.272-29.389 0-55.285 4.57-66.128 15.725-3.477 3.577-5.406 23.848-5.406 23.848 0 12.046 142.308 12.046 142.308 0 0-.001-1.024-19.194-2.927-21.301z"
fill="#383736" />
<path
d="M248.534 178.903c-29.389 0-55.285 4.57-66.128 15.725-3.477 3.577-5.406 23.848-5.406 23.848 0 6.074 36.18 9.085 72.055 9.034l-.521-48.607z"
fill="#2d2d2d" />
</svg>

Before

Width:  |  Height:  |  Size: 4.3 KiB

@@ -1,105 +0,0 @@
<svg height="64" width="64" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.159 496.159">
<path
d="M248.083.003C111.071.003 0 111.063 0 248.085c0 137.001 111.07 248.071 248.083 248.071 137.006 0 248.076-111.07 248.076-248.071C496.159 111.063 385.089.003 248.083.003z"
fill="#af8d4a" />
<path
d="M342.669 139.736c3.418-11.72 7-89.333-73.591-85.338-18.652.925-28.766 8.482-32.454 20.284-3.688 11.801-8.719 40.51-9.439 51.77-.85 13.285 1.71 32.496 1.71 32.496s26.141 118.062 35.388 125.577c7.868 6.394 20.162 14.261 41.305 12.786 12.85-.896 24.286-9.628 29.872-22.375 11.802-26.921-5.9-64.169-2.582-81.871 2.583-13.776 4.628-35.626 9.791-53.329z"
fill="#7c4c1d" />
<path
d="M310.011 72.237c-13.267-22.3-45.235-16.854-45.235-16.854-14.163 9.085-11.785 43.387-11.785 43.387.846 15.243 3.269 17.8 3.269 17.8 7.031 23.184 28.889 27.618 31.925 27.365 20.523-1.71 23.213-16.183 24.65-20.532 1.437-4.349 2.257-19.553 2.257-19.553 3.388-18.629-5.081-31.613-5.081-31.613z"
fill="#ddb17c" />
<path
d="M273.935 101.434c-4.457.141-7.944 4.225-7.944 4.225.028.917 3.737 3.857 8.195 3.718 4.456-.141 7.943-4.226 7.943-4.226s-3.737-3.857-8.194-3.717z"
fill="#666" />
<path
d="M273.97 102.534c-4.216.132-7.527 3.663-7.527 3.663.024.79 3.526 3.313 7.743 3.181 4.215-.133 7.526-3.663 7.526-3.663s-3.526-3.315-7.742-3.181z"
fill="#f7f1ed" />
<circle cx="274.08" cy="106.04" r="2.825" fill="#5b5b5b" />
<circle cx="274.08" cy="106.04" r="1.999" fill="#333" />
<path
d="M297.969 99.011c-4.395.751-7.286 5.278-7.286 5.278s4.232 3.306 8.627 2.555c4.395-.753 7.44-4.375 7.287-5.28.001-.001-4.233-3.307-8.628-2.553z"
fill="#666" />
<path
d="M298.155 100.094c-4.159.711-6.952 4.664-6.952 4.664s3.949 2.797 8.107 2.086c4.157-.712 7.084-3.885 6.951-4.665.001 0-3.949-2.797-8.106-2.085z"
fill="#f7f1ed" />
<circle cx="298.73" cy="103.42" r="2.825" fill="#5b5b5b" />
<circle cx="298.73" cy="103.42" r="1.999" fill="#333" />
<path fill="#fff" d="M288.822 127.206l-9.214.987 9.245 1.736 9.226-2.96z" />
<path
d="M288.925 128.97c-3.08.204-9.667-.686-9.667-.686s3.656 5.716 9.941 5.299c6.286-.416 9.106-6.563 9.106-6.563s-6.301 1.747-9.38 1.95z"
fill="#ce8c78" />
<path
d="M293.314 124.796c-2.31.153-4.582.918-4.582.918s-2.346-.458-4.654-.305c-2.31.152-4.821 2.875-4.821 2.875s6.021 0 9.612-.239c3.593-.238 9.436-1.024 9.436-1.024s-2.682-2.378-4.991-2.225z"
fill="#db9a83" />
<path d="M280.67 127.89l5.752-1.597c-3.959-1.519-5.752 1.597-5.752 1.597z" fill="#e8b1a0" />
<g fill="#7c4c1d">
<path
d="M280.224 94.902s-4.6-.281-6.268-.381c-1.666-.099-4.431.021-6.715.622s-6.852 4.448-6.852 4.448 5.169-2.374 7.212-2.615a28.28 28.28 0 016.372 0c2.163.241 7.212 1.413 7.212 1.413l-.961-3.487zM304.832 92.241c-2.353-.198-5.096.159-6.721.543a6192.37 6192.37 0 00-6.108 1.455l-.347 3.6s4.771-2.023 6.861-2.634a28.306 28.306 0 016.276-1.097c2.054-.114 7.555 1.333 7.555 1.333s-5.162-3.002-7.516-3.2zM201.699 177.333c-17.145 0-39.777-11.659-39.777-11.659-30.176-16.46-56.236-6.172-56.236-6.172-29.49 8.916-40.35 26.567-37.684 44.567s20.538 23.328 20.538 23.328c-5.486-12.344 5.487-21.946 5.487-21.946 21.26-17.831 44.578 0 44.578 0 13.03 8.23 33.604 27.433 33.604 27.433 27.433 21.26 59.666 4.115 59.666 4.115l6.857-66.523c-15.773 9.6-37.033 6.857-37.033 6.857z" />
</g>
<path
d="M237.335 183.069c-20 3.5-39.667 11.667-81.333-11.333-13.485-7.444-43.093-9.375-56-2-38.5 22-18.667 44.333-18.667 44.333 1-20.5 29.208-37.996 51-28.333 51.5 22.833 59.333 35.667 92.333 31s12.667-33.667 12.667-33.667z"
fill="#875327" />
<path
d="M251.699 215.386l-53.658 26.186c-7.316 17.375-21.946 25.146-21.946 25.146-10.059 1.371-24.352-4.859-39.777-5.03-20.575-.228-21.031 17.832-21.031 17.832 0 10.514 13.259 10.973 13.259 10.973-5.943-18.29 13.123-14.01 16.688-11.201 7.544 5.944 16.459 10.744 26.29 13.944 9.83 3.2 39.32-3.657 39.32-3.657 14.631-1.829 50.178-58.409 50.178-58.409l-9.323-15.784z"
fill="#7c4c1d" />
<g fill="#ddb17c">
<path
d="M381.838 377.819c-34.364-70.078-122.988-66.296-122.988-66.296 21.488-25.604 24.46-80.011 24.46-80.011 10.058 4.573 17.809-2.92 19.546-6.172 8.916-16.687-11.43-37.947-11.43-37.947-5.486-7.317.8-15.317.8-15.317 13.259-21.947-7.747-33.652-14.632-33.834-31.018-.818-33.877 12.439-41.288 34.102-6.356 18.578-30.949 71.056-30.949 71.056-15.545 20.118-43.306 74.033-45.824 81.444-2.297 6.761 15.251 10.734 17.768 5.701 3.278-6.556 8.853-24.05 8.853-24.05l21.946-34.749c4.573-5.486 20.225-23.295 20.225-23.295 4.857-5.55 16.879-23.3 19.193-25.654.736-.749-4.341 12.455-7.222 19.953-8.979 23.374-24.894 42.187-24.894 42.187-26.861 19.889-28.792 42.588-28.792 42.588-1.829 24.689 20.574 39.32 20.574 39.32-10.058 3.658-25.608 2.465-25.608 2.465-9.145-3.658-18.813-6.841-27.365-2.28-8.551 4.561-27.364 11.972-27.364 11.972-21.033 7.315-25.084 22.804-22.992 28.992 2.092 6.189 19.203 2.743 19.203 2.743 7.316 0 78.639-17.375 78.639-17.375 32.919-4.571 124.361 4.572 124.361 4.572 64.926 5.488 55.78-20.115 55.78-20.115z" />
<path
d="M168.698 305.994l-1.446 4.439c-2.682 3.549-4.36 5.595-6.453 9.931-2.126 4.407-4.486 12.163-4.486 12.163l3.28 2.376 6.539 3.799 9.165 3.216 6.297-16.006s.683-8.007.754-9.536l2.363-5.66a32.626 32.626 0 00-16.013-4.722z" />
<path
d="M174.518 336.996c-1.272-.452-2.95.324-3.456 1.747l-5.817 17.971c-.46 1.292.104 2.673 1.257 3.084 1.157.412 2.465-.304 2.925-1.594l6.479-17.811c.508-1.423-.112-2.943-1.388-3.397zM169.163 334.981c-1.317-.491-3.019.161-3.547 1.576l-7.384 21.204c-.478 1.284.101 2.688 1.293 3.131 1.194.446 2.552-.235 3.03-1.519l8.237-20.991c.528-1.416-.313-2.91-1.629-3.401zM163.807 333.086c-1.26-.488-3.024.118-3.571 1.527l-6.416 17.479c-.544 1.409.034 2.947 1.294 3.434 1.26.487 2.725-.257 3.269-1.666l6.889-17.297c.546-1.41-.206-2.99-1.465-3.477zM158.801 330.617c-1.178-.477-1.984.722-2.55 2.123l-4.235 9.587c-.491 1.215-.06 2.535.962 2.949 1.023.412 2.25-.238 2.741-1.454l4.466-9.716c.565-1.401-.206-3.014-1.384-3.489zM183.489 332.609c-.805-2.691-2.236-8.138-2.236-8.138l-6.774 4.593 3.22 5.294s-.542 5.401.675 9.277c.144.456 1.622 4.229 3.869 2.802.819-.52.306-3.316.592-6.288.296-3.093 1.059-6.166.654-7.54z" />
</g>
<path d="M182.745 342.002s-2.134 2.711-.678 4.848c0 .001 1.253.184.678-4.848z" fill="#efe4dc" />
<path
d="M154.309 342.148c-.732-.327-1.444-.327-1.854.591-.03.065-.185.347-.209.419-.319.92.069 1.555.75 1.859.698.312 1.469.122 1.921-.755.022-.042.171-.297.19-.339.409-.917-.066-1.447-.798-1.775z"
fill="#e8c7af" />
<path
d="M154.268 342.259c-.709-.303-1.393-.293-1.774.595-.028.064-.344.687-.367.755-.292.889-.338 1.88.542 2.257.881.378 1.622-.386 2.045-1.235.02-.041.331-.637.348-.679.379-.886-.086-1.389-.794-1.693z"
fill="#f7f3f0" />
<path
d="M154.219 342.245c-.71-.304-1.394-.293-1.774.595-.028.064-.14.34-.163.409-.292.89.09 1.493.748 1.775.676.29 1.415.096 1.838-.754.02-.04.126-.29.144-.331.38-.888-.085-1.391-.793-1.694z"
fill="#efe4dc" />
<path
d="M156.622 351.661c-.904-.372-1.771-.345-2.235.788-.034.081-.213.431-.24.519-.354 1.131.144 1.89.98 2.235.862.354 1.794.094 2.313-.989.025-.053.197-.368.219-.42.465-1.133-.134-1.762-1.037-2.133z"
fill="#e8c7af" />
<path
d="M156.576 351.797c-.874-.343-1.707-.306-2.138.79-.031.079-.393.849-.418.933-.323 1.093-.343 2.302.742 2.728 1.085.427 1.96-.529 2.444-1.578.023-.051.378-.789.398-.839.43-1.095-.155-1.689-1.028-2.034z"
fill="#f7f3f0" />
<path
d="M156.516 351.781c-.875-.344-1.708-.306-2.138.789-.031.08-.158.419-.183.504-.323 1.092.165 1.815.975 2.133.834.329 1.727.065 2.209-.984.023-.051.144-.359.162-.409.432-1.094-.152-1.69-1.025-2.033z"
fill="#efe4dc" />
<path
d="M160.956 356.976c-.925-.311-1.789-.228-2.178.933-.028.084-.184.445-.205.535-.278 1.151.269 1.876 1.128 2.164.884.298 1.795-.024 2.242-1.14.021-.053.171-.38.189-.433.39-1.163-.25-1.748-1.176-2.059z"
fill="#e8c7af" />
<path
d="M160.92 357.116c-.896-.285-1.723-.193-2.081.93-.025.081-.336.874-.355.959-.251 1.111-.189 2.318.922 2.671 1.111.354 1.92-.659 2.332-1.738.02-.052.326-.811.342-.862.358-1.122-.266-1.677-1.16-1.96z"
fill="#f7f3f0" />
<path
d="M160.858 357.102c-.895-.284-1.724-.19-2.081.931-.025.081-.128.429-.148.515-.25 1.112.285 1.8 1.116 2.064.854.271 1.727-.05 2.139-1.129.02-.052.118-.368.135-.419.357-1.123-.266-1.677-1.161-1.962z"
fill="#efe4dc" />
<path
d="M167.834 355.969c-.926-.311-1.789-.228-2.178.934-.027.083-.183.444-.205.534-.278 1.151.268 1.876 1.127 2.164.884.296 1.797-.025 2.242-1.14.021-.056.171-.381.189-.435.391-1.162-.247-1.747-1.175-2.057z"
fill="#e8c7af" />
<path
d="M167.798 356.107c-.895-.284-1.724-.192-2.081.93-.026.081-.337.874-.355.96-.25 1.111-.189 2.319.922 2.671 1.111.354 1.92-.658 2.333-1.737.019-.052.325-.811.342-.863.356-1.121-.266-1.676-1.161-1.961z"
fill="#f7f3f0" />
<path
d="M167.736 356.095c-.895-.284-1.723-.191-2.08.93-.026.082-.129.429-.149.516-.25 1.111.285 1.8 1.115 2.063.854.272 1.727-.05 2.139-1.13.021-.051.119-.367.135-.417.358-1.123-.265-1.677-1.16-1.962z"
fill="#efe4dc" />
<path
d="M178.362 331.121s-.263 1.745-.589 3.283c-.328 1.549-1.441 4.883-1.441 4.883s1.493-3.539 1.803-4.785c.313-1.259.659-3.427.659-3.427l-.432.046z"
fill="#c69661" />
<g fill="#cca172">
<path
d="M241.817 357.149c-10.262 5.701-34.632 9.697-34.632 9.697 17.831 4.915 38.995-7.106 45.264-9.602 30.795-12.257 81.913 5.226 81.913 5.226-31.09-21.031-73.1-16.123-92.545-5.321zM242.848 235.17l11.408-22.415 14.653-28.792c-9.373 3.43-22.861 42.977-26.061 51.207z" />
</g>
<path
d="M295.002 72.736l-12.667-12-14.732-6.338c-24.341 3.688-36.879 35.404-22.005 95.886 4.142 16.839-3.688 51.262-22.127 70.808 0 0 43.356-38.015 41.625-62.43-2.565-36.201-21.761-79.259 29.906-85.926z"
fill="#875327" />
<path
d="M265.889 54.647c14.991 4.283 28.78 15.756 38.113 29.756 17.798 26.697 4.732 69.838.111 78.42-6.885 12.786-20.53 51.754-7.744 82.241 0 0 3.81 13.154-9.958 22.496 0 0-14.629 8.975-21.021.615 0 0 1.967 14.874 25.078 14.874 0 0 28.888-7.376 27.413-33.928-1.191-21.442 3.368-50.583 8.36-71.793 31.761-134.925-60.352-122.681-60.352-122.681z"
fill="#9b6432" />
<path d="M278.066 143.697c8.979 4.418 14.395 22.091 14.395 22.091 5.131-21.521-14.395-22.091-14.395-22.091z"
fill="#e8c59e" />
</svg>

Before

Width:  |  Height:  |  Size: 10 KiB

@@ -24,7 +24,7 @@ import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.astro.internal.model.EclipseKind;
import org.openhab.binding.astro.internal.model.MoonPhaseName;
import org.openhab.binding.astro.internal.model.MoonPhase;
import org.openhab.binding.astro.internal.model.SeasonName;
import org.openhab.binding.astro.internal.model.ZodiacSign;
import org.openhab.core.i18n.TranslationProvider;
@@ -106,9 +106,7 @@ public class AstroIconProvider implements IconProvider {
case SEASON_SET -> SeasonName.valueOf(state).name();
case ZODIAC_SET -> ZodiacSign.valueOf(state).name();
case MOON_ECLIPSE_SET, SUN_ECLIPSE_SET -> EclipseKind.valueOf(state).name();
case MOON_PHASE_SET -> {
yield Integer.toString(MoonPhaseName.valueOf(state).getAgeDays());
}
case MOON_PHASE_SET -> Integer.toString(MoonPhase.valueOf(state).getAgeDays());
case MOON_DAY_SET -> {
try {
var age = QuantityType.valueOf(state);
@@ -86,9 +86,8 @@ public class AstroActions implements ThingActions {
return qta;
}
return null;
} else {
logger.info("Astro Action service ThingHandler is null!");
}
logger.info("Astro Action service ThingHandler is null!");
return null;
}
@@ -104,9 +103,8 @@ public class AstroActions implements ThingActions {
return qta;
}
return null;
} else {
logger.info("Astro Action service ThingHandler is null!");
}
logger.info("Astro Action service ThingHandler is null!");
return null;
}
@@ -120,9 +118,8 @@ public class AstroActions implements ThingActions {
Radiation radiation = sunHandler
.getRadiationAt(date != null ? date : ZonedDateTime.now(timeZoneProvider.getTimeZone()));
return radiation == null ? null : radiation.getTotal();
} else {
logger.info("Astro Action service ThingHandler is not a SunHandler!");
}
logger.info("Astro Action service ThingHandler is not a SunHandler!");
} else {
logger.info("Astro Action service ThingHandler is null!");
}
@@ -143,9 +140,8 @@ public class AstroActions implements ThingActions {
return sunHandler.getEventTime(phase,
date != null ? date : ZonedDateTime.now(timeZoneProvider.getTimeZone()),
moment == null || AstroBindingConstants.EVENT_START.equalsIgnoreCase(moment));
} else {
logger.info("Astro Action service ThingHandler is not a SunHandler!");
}
logger.info("Astro Action service ThingHandler is not a SunHandler!");
} else {
logger.info("Astro Action service ThingHandler is null!");
}
@@ -172,8 +168,7 @@ public class AstroActions implements ThingActions {
@Nullable ZonedDateTime date, @Nullable String moment) {
if (phaseName != null) {
return ((AstroActions) actions).getEventTime(phaseName, date, moment);
} else {
}
throw new IllegalArgumentException("phaseName can not be null");
}
}
}
@@ -18,8 +18,6 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.InstantSource;
import java.util.Calendar;
import java.util.Locale;
import java.util.Optional;
import java.util.Set;
import java.util.TimeZone;
@@ -27,8 +25,6 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.astro.internal.model.DistanceType;
import org.openhab.binding.astro.internal.model.EclipseSet;
import org.openhab.binding.astro.internal.model.Moon;
import org.openhab.binding.astro.internal.model.MoonPhase;
import org.openhab.binding.astro.internal.model.MoonPhaseName;
import org.openhab.binding.astro.internal.model.MoonPosition;
import org.openhab.binding.astro.internal.model.Range;
import org.openhab.binding.astro.internal.util.AstroConstants;
@@ -64,7 +60,7 @@ public class MoonCalc extends AstroCalc {
/**
* Calculates all moon data at the specified coordinates
*/
public Moon getMoonInfo(Calendar calendar, double latitude, double longitude, TimeZone zone, Locale locale) {
public Moon getMoonInfo(Calendar calendar, double latitude, double longitude) {
Moon moon = new Moon();
double[] riseSet = getRiseSet(calendar, latitude, longitude);
@@ -87,11 +83,6 @@ public class MoonCalc extends AstroCalc {
moon.setRise(new Range(rise, rise));
moon.setSet(new Range(set, set));
MoonPhase phase = moon.getPhase();
double julianDateMidnight = DateTimeUtils.midnightDateToJulianDate(calendar);
phase.remarkablePhases().forEach(mp -> phase.setPhase(mp,
DateTimeUtils.toCalendar(getPhase(julianDateMidnight, mp, true), zone, locale)));
double julianDate = DateTimeUtils.dateToJulianDate(calendar);
if (moon.getEclipseSet().needsRecalc(julianDate)) {
@@ -108,49 +99,17 @@ public class MoonCalc extends AstroCalc {
/**
* Calculates the moon illumination and distance.
*/
public void setPositionalInfo(Calendar calendar, double latitude, double longitude, Moon moon, TimeZone zone,
Locale locale) {
setMoonPhase(calendar, moon, zone, locale);
public void setPositionalInfo(Calendar calendar, double latitude, double longitude, Moon moon, TimeZone zone) {
double julianDate = DateTimeUtils.dateToJulianDate(calendar);
moon.setPhaseSet(MoonPhaseCalc.calculate(instantSource, julianDate, moon.getPhaseSet(), zone.toZoneId()));
MoonPosition moonPosition = getMoonPosition(julianDate, latitude, longitude);
moon.setPosition(moonPosition);
moon.setZodiac(ZodiacCalc.calculate(moonPosition.getLongitude(), null));
moon.setDistance(DistanceType.CURRENT, MoonDistanceCalc.calculate(julianDate));
}
/**
* Calculates the age and the current phase.
*/
private void setMoonPhase(Calendar calendar, Moon moon, TimeZone zone, Locale locale) {
MoonPhase phase = moon.getPhase();
double julianDate = DateTimeUtils.dateToJulianDate(calendar);
double parentNewMoon = getPhase(julianDate, MoonPhaseName.NEW, false);
double age = Math.abs(parentNewMoon - julianDate);
Calendar parentNewMoonCal = DateTimeUtils.toCalendar(parentNewMoon, zone, locale);
if (parentNewMoonCal == null) {
return;
}
phase.setAge(age);
long parentNewMoonMillis = parentNewMoonCal.getTimeInMillis();
Calendar cal = phase.getNew();
if (cal == null) {
return;
}
long ageRangeTimeMillis = cal.getTimeInMillis() - parentNewMoonMillis;
long ageCurrentMillis = instantSource.millis() - parentNewMoonMillis;
double agePercent = ageRangeTimeMillis != 0 ? ageCurrentMillis * 100.0 / ageRangeTimeMillis : 0;
phase.setAgePercent(agePercent);
phase.setAgeDegree(3.6 * agePercent);
double illumination = getIllumination(julianDate);
phase.setIllumination(illumination);
Optional<MoonPhaseName> remarkablePhase = phase.remarkablePhases()
.filter(p -> DateTimeUtils.isSameDay(calendar, phase.getPhaseDate(p))).findFirst();
phase.setName(remarkablePhase.orElse(MoonPhaseName.fromAgePercent(agePercent / 100)));
}
/**
* Calculates moonrise and moonset.
*/
@@ -241,91 +200,6 @@ public class MoonCalc extends AstroCalc {
return bd.doubleValue();
}
/**
* Calculates the moon phase.
*/
private double calcMoonPhase(double k, MoonPhaseName phase) {
double kMod = Math.floor(k) + phase.cycleProgress;
double t = kMod / 1236.85;
double e = varE(t);
double m = varM(kMod, t);
double m1 = varM1(kMod, t);
double f = varF(kMod, t);
double o = varO(kMod, t);
double jd = varJde(kMod, t);
switch (phase) {
case NEW:
jd += -.4072 * sinDeg(m1) + .17241 * e * sinDeg(m) + .01608 * sinDeg(2 * m1) + .01039 * sinDeg(2 * f)
+ .00739 * e * sinDeg(m1 - m) - .00514 * e * sinDeg(m1 + m) + .00208 * e * e * sinDeg(2 * m)
- .00111 * sinDeg(m1 - 2 * f) - .00057 * sinDeg(m1 + 2 * f);
jd += .00056 * e * sinDeg(2 * m1 + m) - .00042 * sinDeg(3 * m1) + .00042 * e * sinDeg(m + 2 * f)
+ .00038 * e * sinDeg(m - 2 * f) - .00024 * e * sinDeg(2 * m1 - m) - .00017 * sinDeg(o)
- .00007 * sinDeg(m1 + 2 * m) + .00004 * sinDeg(2 * m1 - 2 * f);
jd += .00004 * sinDeg(3 * m) + .00003 * sinDeg(m1 + m - 2 * f) + .00003 * sinDeg(2 * m1 + 2 * f)
- .00003 * sinDeg(m1 + m + 2 * f) + .00003 * sinDeg(m1 - m + 2 * f)
- .00002 * sinDeg(m1 - m - 2 * f) - .00002 * sinDeg(3 * m1 + m);
jd += .00002 * sinDeg(4 * m1);
break;
case FULL:
jd += -.40614 * sinDeg(m1) + .17302 * e * sinDeg(m) + .01614 * sinDeg(2 * m1) + .01043 * sinDeg(2 * f)
+ .00734 * e * sinDeg(m1 - m) - .00515 * e * sinDeg(m1 + m) + .00209 * e * e * sinDeg(2 * m)
- .00111 * sinDeg(m1 - 2 * f) - .00057 * sinDeg(m1 + 2 * f);
jd += .00056 * e * sinDeg(2 * m1 + m) - .00042 * sinDeg(3 * m1) + .00042 * e * sinDeg(m + 2 * f)
+ .00038 * e * sinDeg(m - 2 * f) - .00024 * e * sinDeg(2 * m1 - m) - .00017 * sinDeg(o)
- .00007 * sinDeg(m1 + 2 * m) + .00004 * sinDeg(2 * m1 - 2 * f);
jd += .00004 * sinDeg(3 * m) + .00003 * sinDeg(m1 + m - 2 * f) + .00003 * sinDeg(2 * m1 + 2 * f)
- .00003 * sinDeg(m1 + m + 2 * f) + .00003 * sinDeg(m1 - m + 2 * f)
- .00002 * sinDeg(m1 - m - 2 * f) - .00002 * sinDeg(3 * m1 + m);
jd += .00002 * sinDeg(4 * m1);
break;
default:
jd += -.62801 * sinDeg(m1) + .17172 * e * sinDeg(m) - .01183 * e * sinDeg(m1 + m)
+ .00862 * sinDeg(2 * m1) + .00804 * sinDeg(2 * f) + .00454 * e * sinDeg(m1 - m)
+ .00204 * e * e * sinDeg(2 * m) - .0018 * sinDeg(m1 - 2 * f) - .0007 * sinDeg(m1 + 2 * f);
jd += -.0004 * sinDeg(3 * m1) - .00034 * e * sinDeg(2 * m1 - m) + .00032 * e * sinDeg(m + 2 * f)
+ .00032 * e * sinDeg(m - 2 * f) - .00028 * e * e * sinDeg(m1 + 2 * m)
+ .00027 * e * sinDeg(2 * m1 + m) - .00017 * sinDeg(o);
jd += -.00005 * sinDeg(m1 - m - 2 * f) + .00004 * sinDeg(2 * m1 + 2 * f)
- .00004 * sinDeg(m1 + m + 2 * f) + .00004 * sinDeg(m1 - 2 * m)
+ .00003 * sinDeg(m1 + m - 2 * f) + .00003 * sinDeg(3 * m) + .00002 * sinDeg(2 * m1 - 2 * f);
jd += .00002 * sinDeg(m1 - m + 2 * f) - .00002 * sinDeg(3 * m1 + m);
double w = .00306 - .00038 * e * cosDeg(m) + .00026 * cosDeg(m1) - .00002 * cosDeg(m1 - m)
+ .00002 * cosDeg(m1 + m) + .00002 * cosDeg(2 * f);
jd += MoonPhaseName.FIRST_QUARTER.equals(phase) ? w : -w;
}
return moonCorrection(jd, t, kMod);
}
/**
* Calculates the illumination.
*/
private double getIllumination(double jd) {
double t = DateTimeUtils.toJulianCenturies(jd);
double t2 = t * t;
double t3 = t2 * t;
double t4 = t3 * t;
double d = 297.8502042 + 445267.11151686 * t - .00163 * t2 + t3 / 545868 - t4 / 113065000;
double m = AstroConstants.E05_0 + 35999.0502909 * t - .0001536 * t2 + t3 / 24490000;
double m1 = 134.9634114 + 477198.8676313 * t + .008997 * t2 + t3 / 69699 - t4 / 14712000;
double i = 180 - d - 6.289 * sinDeg(m1) + 2.1 * sinDeg(m) - 1.274 * sinDeg(2 * d - m1) - .658 * sinDeg(2 * d)
- .241 * sinDeg(2 * m1) - .110 * sinDeg(d);
return (1 + cosDeg(i)) / 2 * 100.0;
}
/**
* Searches the next moon phase in a given direction
*/
private double getPhase(double jd, MoonPhaseName phase, boolean forward) {
double tz = 0;
double phaseJd = 0;
do {
double k = varK(jd, tz);
tz += forward ? 1 : -1;
phaseJd = calcMoonPhase(k, phase);
} while (forward ? phaseJd <= jd : phaseJd > jd);
return phaseJd;
}
private double[] calcMoon(double t) {
double p2 = 6.283185307;
double arc = 206264.8062;
@@ -403,19 +277,6 @@ public class MoonCalc extends AstroCalc {
return new double[] { ye, zero1, zero2, nz };
}
private double moonCorrection(double jd, double t, double k) {
double ret = jd;
ret += .000325 * sinDeg(299.77 + .107408 * k - .009173 * t * t) + .000165 * sinDeg(251.88 + .016321 * k)
+ .000164 * sinDeg(251.83 + 26.651886 * k) + .000126 * sinDeg(349.42 + 36.412478 * k)
+ .00011 * sinDeg(84.66 + 18.206239 * k);
ret += .000062 * sinDeg(141.74 + 53.303771 * k) + .00006 * sinDeg(207.14 + 2.453732 * k)
+ .000056 * sinDeg(154.84 + 7.30686 * k) + .000047 * sinDeg(34.52 + 27.261239 * k)
+ .000042 * sinDeg(207.19 + .121824 * k) + .00004 * sinDeg(291.34 + 1.844379 * k);
ret += .000037 * sinDeg(161.72 + 24.198154 * k) + .000035 * sinDeg(239.56 + 25.513099 * k)
+ .000023 * sinDeg(331.55 + 3.592518 * k);
return ret;
}
/**
* Sets the azimuth, elevation and zodiac in the moon object.
*/
@@ -0,0 +1,154 @@
/*
* Copyright (c) 2010-2026 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.astro.internal.calc;
import static org.openhab.binding.astro.internal.util.MathUtils.*;
import java.time.InstantSource;
import java.time.ZoneId;
import java.util.Map;
import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.astro.internal.model.MoonPhase;
import org.openhab.binding.astro.internal.model.MoonPhaseSet;
import org.openhab.binding.astro.internal.util.AstroConstants;
import org.openhab.binding.astro.internal.util.DateTimeUtils;
/**
* Moon Phase Calculator
*
* @author Gaël L'hopital - Initial contribution
*/
@NonNullByDefault
public class MoonPhaseCalc extends AstroCalc {
public static MoonPhaseSet calculate(InstantSource instantSource, double julianDate, MoonPhaseSet previousMP,
ZoneId zone) {
final MoonPhaseSet result;
if (previousMP.needsRecalc(julianDate)) {
double julianDateMidnight = Math.floor(julianDate + 0.5) - 0.5;
double parentNewMoon = getPhase(julianDateMidnight, MoonPhase.NEW, false);
Map<MoonPhase, Double> comingPhases = MoonPhase.remarkables().stream()
.collect(Collectors.toMap(phase -> phase, phase -> getPhase(julianDateMidnight, phase, true)));
result = new MoonPhaseSet(instantSource, parentNewMoon, comingPhases);
} else {
result = previousMP;
}
result.setIllumination(getIllumination(julianDate));
result.updateName(julianDate, zone);
return result;
}
/**
* Calculates the illumination.
*/
private static double getIllumination(double jd) {
double t = DateTimeUtils.toJulianCenturies(jd);
double t2 = t * t;
double t3 = t2 * t;
double t4 = t3 * t;
double d = 297.8502042 + 445267.11151686 * t - .00163 * t2 + t3 / 545868 - t4 / 113065000;
double m = AstroConstants.E05_0 + 35999.0502909 * t - .0001536 * t2 + t3 / 24490000;
double m1 = 134.9634114 + 477198.8676313 * t + .008997 * t2 + t3 / 69699 - t4 / 14712000;
double i = 180 - d - 6.289 * sinDeg(m1) + 2.1 * sinDeg(m) - 1.274 * sinDeg(2 * d - m1) - .658 * sinDeg(2 * d)
- .241 * sinDeg(2 * m1) - .110 * sinDeg(d);
return (1 + cosDeg(i)) / 2;
}
/**
* Searches the next moon phase in a given direction
*/
private static double getPhase(double jd, MoonPhase phase, boolean forward) {
double tz = 0;
double phaseJd = 0;
do {
double k = varK(jd, tz);
tz += forward ? 1 : -1;
phaseJd = calcMoonPhase(k, phase);
} while (forward ? phaseJd <= jd : phaseJd > jd);
return phaseJd;
}
/**
* Calculates the moon phase.
*/
private static double calcMoonPhase(double k, MoonPhase phase) {
double kMod = Math.floor(k) + phase.cycleProgress;
double t = kMod / 1236.85;
double e = varE(t);
double m = varM(kMod, t);
double m1 = varM1(kMod, t);
double f = varF(kMod, t);
double o = varO(kMod, t);
double jd = varJde(kMod, t);
switch (phase) {
case NEW:
jd += -.4072 * sinDeg(m1) + .17241 * e * sinDeg(m) + .01608 * sinDeg(2 * m1) + .01039 * sinDeg(2 * f)
+ .00739 * e * sinDeg(m1 - m) - .00514 * e * sinDeg(m1 + m) + .00208 * e * e * sinDeg(2 * m)
- .00111 * sinDeg(m1 - 2 * f) - .00057 * sinDeg(m1 + 2 * f);
jd += .00056 * e * sinDeg(2 * m1 + m) - .00042 * sinDeg(3 * m1) + .00042 * e * sinDeg(m + 2 * f)
+ .00038 * e * sinDeg(m - 2 * f) - .00024 * e * sinDeg(2 * m1 - m) - .00017 * sinDeg(o)
- .00007 * sinDeg(m1 + 2 * m) + .00004 * sinDeg(2 * m1 - 2 * f);
jd += .00004 * sinDeg(3 * m) + .00003 * sinDeg(m1 + m - 2 * f) + .00003 * sinDeg(2 * m1 + 2 * f)
- .00003 * sinDeg(m1 + m + 2 * f) + .00003 * sinDeg(m1 - m + 2 * f)
- .00002 * sinDeg(m1 - m - 2 * f) - .00002 * sinDeg(3 * m1 + m);
jd += .00002 * sinDeg(4 * m1);
break;
case FULL:
jd += -.40614 * sinDeg(m1) + .17302 * e * sinDeg(m) + .01614 * sinDeg(2 * m1) + .01043 * sinDeg(2 * f)
+ .00734 * e * sinDeg(m1 - m) - .00515 * e * sinDeg(m1 + m) + .00209 * e * e * sinDeg(2 * m)
- .00111 * sinDeg(m1 - 2 * f) - .00057 * sinDeg(m1 + 2 * f);
jd += .00056 * e * sinDeg(2 * m1 + m) - .00042 * sinDeg(3 * m1) + .00042 * e * sinDeg(m + 2 * f)
+ .00038 * e * sinDeg(m - 2 * f) - .00024 * e * sinDeg(2 * m1 - m) - .00017 * sinDeg(o)
- .00007 * sinDeg(m1 + 2 * m) + .00004 * sinDeg(2 * m1 - 2 * f);
jd += .00004 * sinDeg(3 * m) + .00003 * sinDeg(m1 + m - 2 * f) + .00003 * sinDeg(2 * m1 + 2 * f)
- .00003 * sinDeg(m1 + m + 2 * f) + .00003 * sinDeg(m1 - m + 2 * f)
- .00002 * sinDeg(m1 - m - 2 * f) - .00002 * sinDeg(3 * m1 + m);
jd += .00002 * sinDeg(4 * m1);
break;
default:
jd += -.62801 * sinDeg(m1) + .17172 * e * sinDeg(m) - .01183 * e * sinDeg(m1 + m)
+ .00862 * sinDeg(2 * m1) + .00804 * sinDeg(2 * f) + .00454 * e * sinDeg(m1 - m)
+ .00204 * e * e * sinDeg(2 * m) - .0018 * sinDeg(m1 - 2 * f) - .0007 * sinDeg(m1 + 2 * f);
jd += -.0004 * sinDeg(3 * m1) - .00034 * e * sinDeg(2 * m1 - m) + .00032 * e * sinDeg(m + 2 * f)
+ .00032 * e * sinDeg(m - 2 * f) - .00028 * e * e * sinDeg(m1 + 2 * m)
+ .00027 * e * sinDeg(2 * m1 + m) - .00017 * sinDeg(o);
jd += -.00005 * sinDeg(m1 - m - 2 * f) + .00004 * sinDeg(2 * m1 + 2 * f)
- .00004 * sinDeg(m1 + m + 2 * f) + .00004 * sinDeg(m1 - 2 * m)
+ .00003 * sinDeg(m1 + m - 2 * f) + .00003 * sinDeg(3 * m) + .00002 * sinDeg(2 * m1 - 2 * f);
jd += .00002 * sinDeg(m1 - m + 2 * f) - .00002 * sinDeg(3 * m1 + m);
double w = .00306 - .00038 * e * cosDeg(m) + .00026 * cosDeg(m1) - .00002 * cosDeg(m1 - m)
+ .00002 * cosDeg(m1 + m) + .00002 * cosDeg(2 * f);
jd += MoonPhase.FIRST_QUARTER.equals(phase) ? w : -w;
}
return moonCorrection(jd, t, kMod);
}
private static double moonCorrection(double jd, double t, double k) {
double ret = jd;
ret += .000325 * sinDeg(299.77 + .107408 * k - .009173 * t * t) + .000165 * sinDeg(251.88 + .016321 * k)
+ .000164 * sinDeg(251.83 + 26.651886 * k) + .000126 * sinDeg(349.42 + 36.412478 * k)
+ .00011 * sinDeg(84.66 + 18.206239 * k);
ret += .000062 * sinDeg(141.74 + 53.303771 * k) + .00006 * sinDeg(207.14 + 2.453732 * k)
+ .000056 * sinDeg(154.84 + 7.30686 * k) + .000047 * sinDeg(34.52 + 27.261239 * k)
+ .000042 * sinDeg(207.19 + .121824 * k) + .00004 * sinDeg(291.34 + 1.844379 * k);
ret += .000037 * sinDeg(161.72 + 24.198154 * k) + .000035 * sinDeg(239.56 + 25.513099 * k)
+ .000023 * sinDeg(331.55 + 3.592518 * k);
return ret;
}
}
@@ -81,13 +81,12 @@ public class SunCalc {
/**
* Calculates the sun position (azimuth and elevation).
*/
public void setPositionalInfo(Calendar calendar, double latitude, double longitude, @Nullable Double altitude,
Sun sun) {
Position sunPosition = getPosition(calendar, latitude, longitude, altitude);
public void setPositionalInfo(Calendar calendar, double latitude, double longitude, Sun sun) {
Position sunPosition = getPosition(calendar, latitude, longitude);
sun.setPosition(sunPosition);
}
public Position getPosition(Calendar calendar, double latitude, double longitude, @Nullable Double altitude) {
public Position getPosition(Calendar calendar, double latitude, double longitude) {
double lw = Math.toRadians(-longitude);
double phi = Math.toRadians(latitude);
@@ -107,13 +106,13 @@ public class SunCalc {
/**
* Returns true, if the sun is up all day (no rise and set).
*/
private boolean isSunUpAllDay(Calendar calendar, double latitude, double longitude, @Nullable Double altitude) {
private boolean isSunUpAllDay(Calendar calendar, double latitude, double longitude) {
Sun sun = new Sun();
Calendar start = DateTimeUtils.truncateToMidnight(calendar);
Calendar cal = (Calendar) start.clone();
var numberOfSamples = 24 * 60 / CURVE_TIME_INTERVAL;
for (int i = 0; i <= numberOfSamples; i++) {
setPositionalInfo(cal, latitude, longitude, altitude, sun);
setPositionalInfo(cal, latitude, longitude, sun);
if (sun.getPosition().getElevationAsDouble() < SUN_ANGLE) {
return false;
}
@@ -201,7 +200,7 @@ public class SunCalc {
sun.setRange(SunPhase.NAUTIC_DUSK, new Range(DateTimeUtils.toCalendar(jnau, zone, locale),
DateTimeUtils.toCalendar(jastro, zone, locale)));
boolean isSunUpAllDay = isSunUpAllDay(calendar, latitude, longitude, altitude);
boolean isSunUpAllDay = isSunUpAllDay(calendar, latitude, longitude);
// daylight
Range daylightRange = new Range();
@@ -259,7 +258,7 @@ public class SunCalc {
if (sun.getEclipseSet().needsRecalc(j)) {
sun.setEclipseSet(new EclipseSet(ECLIPSE_CALC.getNextEclipses(j).stream().map(eclipse -> {
Calendar eclipseCal = Objects.requireNonNull(DateTimeUtils.toCalendar(eclipse.when(), zone, locale));
return eclipse.withPosition(getPosition(eclipseCal, latitude, longitude, altitude));
return eclipse.withPosition(getPosition(eclipseCal, latitude, longitude));
})));
}
@@ -30,6 +30,7 @@ import org.openhab.binding.astro.internal.job.Job;
import org.openhab.binding.astro.internal.model.DistanceType;
import org.openhab.binding.astro.internal.model.EclipseKind;
import org.openhab.binding.astro.internal.model.Moon;
import org.openhab.binding.astro.internal.model.MoonPhase;
import org.openhab.binding.astro.internal.model.Planet;
import org.openhab.binding.astro.internal.model.Position;
import org.openhab.binding.astro.internal.util.DateTimeUtils;
@@ -75,10 +76,10 @@ public class MoonHandler extends AstroThingHandler {
Locale locale = localeProvider.getLocale();
ZonedDateTime now = instantSource.instant().atZone(zone.toZoneId());
Moon moon = getPlanetAt(now, locale);
Double latitude = thingConfig.latitude;
Double longitude = thingConfig.longitude;
moonCalc.setPositionalInfo(DateTimeUtils.calFromInstantSource(instantSource, zone, locale),
latitude != null ? latitude : 0, longitude != null ? longitude : 0, moon, zone, locale);
double latitude = thingConfig.latitude instanceof Double value ? value : 0;
double longitude = thingConfig.longitude instanceof Double value ? value : 0;
moonCalc.setPositionalInfo(DateTimeUtils.calFromInstantSource(instantSource, zone, locale), latitude, longitude,
moon, zone);
this.moon = moon;
publishPlanet();
@@ -115,23 +116,23 @@ public class MoonHandler extends AstroThingHandler {
case CHANNEL_ID_SET_DURATION:
return toState(moon.getSet().getDuration(), channel);
case CHANNEL_ID_MOON_PHASE_FIRST_QUARTER:
return toState(moon.getPhase().getFirstQuarter(), channel);
return toState(moon.getPhaseSet().getPhase(MoonPhase.FIRST_QUARTER), channel);
case CHANNEL_ID_MOON_PHASE_THIRD_QUARTER:
return toState(moon.getPhase().getThirdQuarter(), channel);
return toState(moon.getPhaseSet().getPhase(MoonPhase.THIRD_QUARTER), channel);
case CHANNEL_ID_MOON_PHASE_FULL:
return toState(moon.getPhase().getFull(), channel);
return toState(moon.getPhaseSet().getPhase(MoonPhase.FULL), channel);
case CHANNEL_ID_MOON_PHASE_NEW:
return toState(moon.getPhase().getNew(), channel);
return toState(moon.getPhaseSet().getPhase(MoonPhase.NEW), channel);
case CHANNEL_ID_MOON_PHASE_AGE:
return toState(moon.getPhase().getAge(), channel);
return toState(moon.getPhaseSet().getAge(), channel);
case CHANNEL_ID_MOON_PHASE_AGE_DEGREE:
return toState(moon.getPhase().getAgeDegree(), channel);
return toState(moon.getPhaseSet().getAgeDegree(), channel);
case CHANNEL_ID_MOON_PHASE_AGE_PERCENT:
return toState(moon.getPhase().getAgePercent(), channel);
return toState(moon.getPhaseSet().getAgePercent(), channel);
case CHANNEL_ID_MOON_PHASE_ILLUMINATION:
return toState(moon.getPhase().getIllumination(), channel);
return toState(moon.getPhaseSet().getIllumination(), channel);
case CHANNEL_ID_PHASE_NAME:
return toState(moon.getPhase().getName(), channel);
return toState(moon.getPhaseSet().getName(), channel);
case CHANNEL_ID_ECLIPSE_TOTAL:
return toState(moon.getEclipseSet().getDate(EclipseKind.TOTAL), channel);
case CHANNEL_ID_ECLIPSE_TOTAL_ELEVATION:
@@ -174,19 +175,18 @@ public class MoonHandler extends AstroThingHandler {
@Override
public Moon getPlanetAt(ZonedDateTime date, Locale locale) {
Double latitude = thingConfig.latitude;
Double longitude = thingConfig.longitude;
return moonCalc.getMoonInfo(GregorianCalendar.from(date), latitude != null ? latitude : 0,
longitude != null ? longitude : 0, TimeZone.getTimeZone(date.getZone()), locale);
double latitude = thingConfig.latitude instanceof Double value ? value : 0;
double longitude = thingConfig.longitude instanceof Double value ? value : 0;
return moonCalc.getMoonInfo(GregorianCalendar.from(date), latitude, longitude);
}
@Override
public Position getPositionAt(ZonedDateTime date) {
Moon localMoon = getPlanetAt(date, Locale.ROOT);
Double latitude = thingConfig.latitude;
Double longitude = thingConfig.longitude;
moonCalc.setPositionalInfo(GregorianCalendar.from(date), latitude != null ? latitude : 0,
longitude != null ? longitude : 0, localMoon, TimeZone.getTimeZone(date.getZone()), Locale.ROOT);
double latitude = thingConfig.latitude instanceof Double value ? value : 0;
double longitude = thingConfig.longitude instanceof Double value ? value : 0;
moonCalc.setPositionalInfo(GregorianCalendar.from(date), latitude, longitude, localMoon,
TimeZone.getTimeZone(date.getZone()));
return localMoon.getPosition();
}
}
@@ -82,12 +82,11 @@ public class SunHandler extends AstroThingHandler {
Locale locale = localeProvider.getLocale();
ZonedDateTime now = instantSource.instant().atZone(zoneId);
Sun sun = getPlanetAt(now, locale);
Double latitude = thingConfig.latitude;
Double longitude = thingConfig.longitude;
Double altitude = thingConfig.altitude;
double latitude = thingConfig.latitude instanceof Double value ? value : 0;
double longitude = thingConfig.longitude instanceof Double value ? value : 0;
double altitude = thingConfig.altitude instanceof Double value ? value : 0;
Calendar calendar = DateTimeUtils.calFromInstantSource(instantSource, zone, locale);
sunCalc.setPositionalInfo(calendar, latitude != null ? latitude : 0, longitude != null ? longitude : 0,
altitude != null ? altitude : 0, sun);
sunCalc.setPositionalInfo(calendar, latitude, longitude, sun);
sun.setCircadian(CircadianCalc.calculate(calendar, sun.getRise(), sun.getSet(), sun.getRange(SunPhase.NOON)));
sun.setRadiation(RadiationCalc.calculate(now, sun.getPosition().getElevationAsDouble(), altitude));
@@ -308,21 +307,18 @@ public class SunHandler extends AstroThingHandler {
@Override
public Sun getPlanetAt(ZonedDateTime date, Locale locale) {
Double latitude = thingConfig.latitude;
Double longitude = thingConfig.longitude;
Double altitude = thingConfig.altitude;
return sunCalc.getSunInfo(GregorianCalendar.from(date), latitude != null ? latitude : 0,
longitude != null ? longitude : 0, altitude != null ? altitude : 0, thingConfig.useMeteorologicalSeason,
TimeZone.getTimeZone(timeZoneProvider.getTimeZone()), locale);
double latitude = thingConfig.latitude instanceof Double value ? value : 0;
double longitude = thingConfig.longitude instanceof Double value ? value : 0;
double altitude = thingConfig.altitude instanceof Double value ? value : 0;
return sunCalc.getSunInfo(GregorianCalendar.from(date), latitude, longitude, altitude,
thingConfig.useMeteorologicalSeason, TimeZone.getTimeZone(timeZoneProvider.getTimeZone()), Locale.ROOT);
}
private Sun getPositionedSunAt(ZonedDateTime date, Locale locale) {
Sun localSun = getPlanetAt(date, locale);
Double latitude = thingConfig.latitude;
Double longitude = thingConfig.longitude;
Double altitude = thingConfig.altitude;
sunCalc.setPositionalInfo(GregorianCalendar.from(date), latitude != null ? latitude : 0,
longitude != null ? longitude : 0, altitude != null ? altitude : 0, localSun);
private Sun getPositionedSunAt(ZonedDateTime date) {
Sun localSun = getPlanetAt(date, Locale.ROOT);
double latitude = thingConfig.latitude instanceof Double value ? value : 0;
double longitude = thingConfig.longitude instanceof Double value ? value : 0;
sunCalc.setPositionalInfo(GregorianCalendar.from(date), latitude, longitude, localSun);
return localSun;
}
@@ -331,18 +327,17 @@ public class SunHandler extends AstroThingHandler {
if (eventRange != null) {
Calendar cal = begin ? eventRange.getStart() : eventRange.getEnd();
return cal == null ? null : ZonedDateTime.ofInstant(cal.toInstant(), date.getZone());
} else {
return null;
}
return null;
}
@Override
public Position getPositionAt(ZonedDateTime date) {
return getPositionedSunAt(date, Locale.ROOT).getPosition();
return getPositionedSunAt(date).getPosition();
}
public @Nullable Radiation getRadiationAt(ZonedDateTime date) {
Sun localSun = getPositionedSunAt(date, Locale.ROOT);
Sun localSun = getPositionedSunAt(date);
return RadiationCalc.calculate(date, localSun.getPosition().getElevationAsDouble(), thingConfig.altitude);
}
}
@@ -18,6 +18,7 @@ import static org.openhab.binding.astro.internal.job.Job.scheduleEvent;
import java.time.Instant;
import java.util.Calendar;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
@@ -26,6 +27,7 @@ import org.openhab.binding.astro.internal.handler.AstroThingHandler;
import org.openhab.binding.astro.internal.model.DistanceType;
import org.openhab.binding.astro.internal.model.Moon;
import org.openhab.binding.astro.internal.model.MoonPhase;
import org.openhab.binding.astro.internal.model.MoonPhaseSet;
import org.openhab.binding.astro.internal.model.Planet;
/**
@@ -75,25 +77,10 @@ public final class DailyJobMoon extends AbstractJob {
scheduleEvent(handler, cal, EVENT_END, EVENT_CHANNEL_ID_SET, false, zone, locale);
}
MoonPhase moonPhase = moon.getPhase();
cal = moonPhase.getFirstQuarter();
if (cal != null) {
scheduleEvent(handler, cal, EVENT_PHASE_FIRST_QUARTER, EVENT_CHANNEL_ID_MOON_PHASE, false, zone,
locale);
}
cal = moonPhase.getThirdQuarter();
if (cal != null) {
scheduleEvent(handler, cal, EVENT_PHASE_THIRD_QUARTER, EVENT_CHANNEL_ID_MOON_PHASE, false, zone,
locale);
}
cal = moonPhase.getFull();
if (cal != null) {
scheduleEvent(handler, cal, EVENT_PHASE_FULL, EVENT_CHANNEL_ID_MOON_PHASE, false, zone, locale);
}
cal = moonPhase.getNew();
if (cal != null) {
scheduleEvent(handler, cal, EVENT_PHASE_NEW, EVENT_CHANNEL_ID_MOON_PHASE, false, zone, locale);
}
MoonPhaseSet moonPhase = moon.getPhaseSet();
MoonPhase.remarkables().stream().map(phase -> Map.entry(phase, moonPhase.getPhase(phase)))
.forEach(e -> scheduleEvent(handler, e.getValue(), e.getKey().toString(),
EVENT_CHANNEL_ID_MOON_PHASE, false, zone.toZoneId()));
moon.getEclipseSet().getEclipses().forEach(eclipse -> {
scheduleEvent(handler, eclipse.when(), eclipse.kind().toString(), EVENT_CHANNEL_ID_ECLIPSE, false,
@@ -12,9 +12,8 @@
*/
package org.openhab.binding.astro.internal.model;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -26,10 +25,10 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
*/
@NonNullByDefault
public class Moon extends RiseSet implements Planet {
private final Map<DistanceType, MoonDistance> distances = new HashMap<>(DistanceType.values().length);
private final EnumMap<DistanceType, MoonDistance> distances = new EnumMap<>(DistanceType.class);
private EclipseSet eclipseSet = EclipseSet.NONE;
private MoonPhase phase = new MoonPhase();
private MoonPhaseSet phaseSet = MoonPhaseSet.NONE;
private Position position = MoonPosition.NONE;
private Zodiac zodiac = Zodiac.NONE;
@@ -40,15 +39,15 @@ public class Moon extends RiseSet implements Planet {
/**
* Returns the moon phase.
*/
public MoonPhase getPhase() {
return phase;
public MoonPhaseSet getPhaseSet() {
return phaseSet;
}
/**
* Sets the moon phase.
*/
public void setPhase(MoonPhase phase) {
this.phase = phase;
public void setPhaseSet(MoonPhaseSet phaseSet) {
this.phaseSet = phaseSet;
}
public MoonDistance getDistanceType(DistanceType type) {
@@ -12,166 +12,68 @@
*/
package org.openhab.binding.astro.internal.model;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import static org.openhab.binding.astro.internal.util.AstroConstants.LUNAR_SYNODIC_MONTH_DAYS;
import javax.measure.quantity.Angle;
import javax.measure.quantity.Dimensionless;
import javax.measure.quantity.Time;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.library.types.QuantityType;
import org.openhab.core.library.unit.Units;
import org.openhab.core.types.State;
import org.openhab.core.types.UnDefType;
/**
* Holds the calculates moon phase informations.
* All moon phases.
*
* @author Gerhard Riegler - Initial contribution
* @author Christoph Weitkamp - Introduced UoM
* @author Gaël L'hopital - added age equivalence in days & cycleProgressPercentage
*/
@NonNullByDefault
public class MoonPhase {
private final Map<MoonPhaseName, @Nullable Calendar> phases = new HashMap<>(MoonPhaseName.values().length);
public enum MoonPhase {
NEW(0.0, true),
WAXING_CRESCENT(0.125, false),
FIRST_QUARTER(0.25, true),
WAXING_GIBBOUS(0.375, false),
FULL(0.5, true),
WANING_GIBBOUS(0.625, false),
THIRD_QUARTER(0.75, true), // also called last quarter
WANING_CRESCENT(0.875, false);
private double age;
private double illumination;
private double agePercent;
private double ageDegree;
public final double cycleProgress;
private final boolean remarkable;
private @Nullable MoonPhaseName name;
public MoonPhase() {
phases.put(MoonPhaseName.FIRST_QUARTER, null);
phases.put(MoonPhaseName.FULL, null);
phases.put(MoonPhaseName.THIRD_QUARTER, null);
phases.put(MoonPhaseName.NEW, null);
MoonPhase(double cycleProgress, boolean remarkable) {
this.cycleProgress = cycleProgress;
this.remarkable = remarkable;
}
/**
* Returns the date at which the moon is in the first quarter.
*/
@Nullable
public Calendar getFirstQuarter() {
return getPhaseDate(MoonPhaseName.FIRST_QUARTER);
public int getAgeDays() {
return (int) ((LUNAR_SYNODIC_MONTH_DAYS - 1) * cycleProgress + 1);
}
/**
* Returns the date of the full moon.
*/
@Nullable
public Calendar getFull() {
return getPhaseDate(MoonPhaseName.FULL);
public static MoonPhase fromAgePercent(double agePercent) {
if (agePercent < 0.0 || agePercent > 1.0) {
throw new IllegalArgumentException("agePercent must be in [0,1]");
}
/**
* Returns the date at which the moon is in the third quarter.
*/
@Nullable
public Calendar getThirdQuarter() {
return getPhaseDate(MoonPhaseName.THIRD_QUARTER);
if (agePercent == NEW.cycleProgress) {
return NEW;
} else if (agePercent < FIRST_QUARTER.cycleProgress) {
return WAXING_CRESCENT;
} else if (agePercent == FIRST_QUARTER.cycleProgress) {
return FIRST_QUARTER;
} else if (agePercent < FULL.cycleProgress) {
return WAXING_GIBBOUS;
} else if (agePercent == FULL.cycleProgress) {
return FULL;
} else if (agePercent < THIRD_QUARTER.cycleProgress) {
return WANING_GIBBOUS;
} else if (agePercent == THIRD_QUARTER.cycleProgress) {
return THIRD_QUARTER;
}
return WANING_CRESCENT;
}
/**
* Returns the date of the new moon.
*/
@Nullable
public Calendar getNew() {
return getPhaseDate(MoonPhaseName.NEW);
}
@Nullable
public Calendar getPhaseDate(MoonPhaseName moonPhase) {
if (!phases.containsKey(moonPhase)) {
throw new IllegalArgumentException("MoonPhase does not handle %s".formatted(moonPhase.toString()));
}
return phases.get(moonPhase);
}
public void setPhase(MoonPhaseName moonPhase, @Nullable Calendar calendar) {
if (!phases.containsKey(moonPhase)) {
throw new IllegalArgumentException("MoonPhase does not handle %s".formatted(moonPhase.toString()));
}
phases.put(moonPhase, calendar);
}
public Stream<MoonPhaseName> remarkablePhases() {
return phases.keySet().stream();
}
/**
* Returns the age in days.
*/
public QuantityType<Time> getAge() {
return new QuantityType<>(age, Units.DAY);
}
/**
* Sets the age in days.
*/
public void setAge(double age) {
this.age = age;
}
/**
* Returns the illumination.
*/
public State getIllumination() {
return Double.isNaN(illumination) ? UnDefType.UNDEF
: illumination < 0 ? UnDefType.NULL : new QuantityType<>(illumination, Units.PERCENT);
}
/**
* Sets the illumination.
*/
public void setIllumination(double illumination) {
this.illumination = illumination;
}
/**
* Returns the phase name.
*/
@Nullable
public MoonPhaseName getName() {
return name;
}
/**
* Sets the phase name.
*/
public void setName(@Nullable MoonPhaseName name) {
this.name = name;
}
/**
* Returns the age in degree.
*/
public QuantityType<Angle> getAgeDegree() {
return new QuantityType<>(ageDegree, Units.DEGREE_ANGLE);
}
/**
* Sets the age in degree.
*/
public void setAgeDegree(double ageDegree) {
this.ageDegree = ageDegree;
}
/**
* Returns the age in percent.
*/
public QuantityType<Dimensionless> getAgePercent() {
return new QuantityType<>(agePercent, Units.PERCENT);
}
/**
* Sets the age in percent.
*/
public void setAgePercent(double agePercent) {
this.agePercent = agePercent;
public static List<MoonPhase> remarkables() {
return Arrays.stream(values()).filter(mp -> mp.remarkable).sorted(Comparator.comparing(mp -> mp.cycleProgress))
.toList();
}
}
@@ -1,60 +0,0 @@
/*
* Copyright (c) 2010-2026 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.astro.internal.model;
import static org.openhab.binding.astro.internal.util.AstroConstants.LUNAR_SYNODIC_MONTH_DAYS;
import java.util.Arrays;
import java.util.Comparator;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
/**
* All moon phases.
*
* @author Gerhard Riegler - Initial contribution
* @author Gaël L'hopital - added age equivalence in days & cycleProgressPercentage
*/
@NonNullByDefault
public enum MoonPhaseName {
NEW(0.0),
WAXING_CRESCENT(0.125),
FIRST_QUARTER(0.25),
WAXING_GIBBOUS(0.375),
FULL(0.5),
WANING_GIBBOUS(0.625),
THIRD_QUARTER(0.75), // also called last quarter
WANING_CRESCENT(0.875);
public final double cycleProgress;
MoonPhaseName(double cycleProgress) {
this.cycleProgress = cycleProgress;
}
public int getAgeDays() {
return (int) ((LUNAR_SYNODIC_MONTH_DAYS - 1) * cycleProgress + 1);
}
public @Nullable static MoonPhaseName fromAgePercent(double agePercent) {
return (agePercent >= 0.0 && agePercent <= 1.0) ? Arrays.stream(values())
.min(Comparator.comparingDouble(p -> circularDistance(agePercent, p.cycleProgress))).orElseThrow() // impossible
: null;
}
private static double circularDistance(double a, double b) {
double d = Math.abs(a - b);
return Math.min(d, 1.0 - d);
}
}
@@ -0,0 +1,150 @@
/*
* Copyright (c) 2010-2026 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.astro.internal.model;
import java.time.Duration;
import java.time.Instant;
import java.time.InstantSource;
import java.time.ZoneId;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.measure.quantity.Angle;
import javax.measure.quantity.Dimensionless;
import javax.measure.quantity.Time;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.astro.internal.util.DateTimeUtils;
import org.openhab.core.library.types.QuantityType;
import org.openhab.core.library.types.StringType;
import org.openhab.core.library.unit.Units;
import org.openhab.core.types.State;
import org.openhab.core.types.UnDefType;
/**
* Holds the calculates moon phase informations.
*
* @author Gerhard Riegler - Initial contribution
* @author Christoph Weitkamp - Introduced UoM
*/
@NonNullByDefault
public class MoonPhaseSet {
public static final MoonPhaseSet NONE = new MoonPhaseSet();
private final Map<MoonPhase, Instant> phases;
private final Instant parentNewMoon;
private final InstantSource instantSource;
private double illumination;
private @Nullable MoonPhase name;
private MoonPhaseSet(InstantSource instantSource, Instant parentNewMoon, Map<MoonPhase, Instant> phases) {
this.phases = phases;
this.parentNewMoon = parentNewMoon;
this.instantSource = instantSource;
}
private MoonPhaseSet() {
this(InstantSource.system(), Instant.MIN, Map.of());
}
public MoonPhaseSet(InstantSource instantSource, double parentNewMoon, Map<MoonPhase, Double> comingPhases) {
this(instantSource, DateTimeUtils.jdToInstant(parentNewMoon),
comingPhases.keySet().stream().collect(Collectors.toMap(Function.identity(),
k -> DateTimeUtils.jdToInstant(Objects.requireNonNull(comingPhases.get(k))))));
}
public Instant getPhase(MoonPhase phase) {
if (!MoonPhase.remarkables().contains(phase)) {
throw new IllegalArgumentException("The phase '%s' is not handled".formatted(phase.toString()));
}
return Objects.requireNonNull(phases.get(phase));
}
/**
* Returns the age.
*/
public QuantityType<Time> getAge() {
return new QuantityType<>(getAgeDouble(), Units.SECOND);
}
private double getAgeDouble() {
return getAgePercentDouble() * getMonthDuration();
}
public double getAgePercentDouble() {
return ((double) Duration.between(parentNewMoon, instantSource.instant()).getSeconds()) / getMonthDuration();
}
/**
* Returns the age in percent.
*/
public QuantityType<Dimensionless> getAgePercent() {
return new QuantityType<>(getAgePercentDouble(), Units.ONE);
}
/**
* Returns the age in degree.
*/
public QuantityType<Angle> getAgeDegree() {
return new QuantityType<>(getAgePercentDouble() * 360, Units.DEGREE_ANGLE);
}
/**
* Returns the illumination.
*/
public QuantityType<Dimensionless> getIllumination() {
return new QuantityType<>(illumination, Units.ONE);
}
/**
* Sets the illumination.
*/
public void setIllumination(double illumination) {
this.illumination = illumination;
}
public void updateName(double julianDate, ZoneId zone) {
this.name = MoonPhase.remarkables().stream().filter(mp -> isPhaseDay(julianDate, mp, zone)).findFirst()
.orElseGet(() -> MoonPhase.fromAgePercent(getAgePercentDouble()));
}
/**
* Returns the phase name.
*/
public State getName() {
if (name != null) {
return new StringType(name.toString());
}
return UnDefType.UNDEF;
}
public boolean needsRecalc(double jdNow) {
Instant now = DateTimeUtils.jdToInstant(jdNow);
return phases.isEmpty() || phases.values().stream().anyMatch(when -> when.isBefore(now));
}
public boolean isPhaseDay(double julianDate, MoonPhase phaseName, ZoneId zone) {
Instant instant = DateTimeUtils.jdToInstant(julianDate);
Instant phaseDate = getPhase(phaseName);
return DateTimeUtils.isSameDay(instant, phaseDate, zone)
|| (MoonPhase.NEW.equals(phaseName) && DateTimeUtils.isSameDay(instant, parentNewMoon, zone));
}
private long getMonthDuration() {
return Duration.between(parentNewMoon, getPhase(MoonPhase.NEW)).getSeconds();
}
}
@@ -16,6 +16,7 @@ import static org.openhab.binding.astro.internal.util.MathUtils.mod;
import java.time.Instant;
import java.time.InstantSource;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
@@ -232,6 +233,13 @@ public class DateTimeUtils {
&& cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);
}
/**
* Returns true, if two Instant objects are on the same day for a given zone, ignoring time.
*/
public static boolean isSameDay(Instant i1, @Nullable Instant i2, ZoneId zone) {
return i2 != null && i1.atZone(zone).toLocalDate().equals(i2.atZone(zone).toLocalDate());
}
/**
* Evaluates whether the second date time is within the same date as the first date time in the time zone of
* the latter.
@@ -315,9 +323,8 @@ public class DateTimeUtils {
nextYearSeason.add(Calendar.YEAR, 1);
return nextYearSeason;
} else {
return next;
}
return next;
}
public static Calendar getAdjustedEarliest(Calendar cal, AstroChannelConfig config) {
@@ -474,12 +481,11 @@ public class DateTimeUtils {
try {
if (!HHMM_PATTERN.matcher(time).matches()) {
throw new NumberFormatException();
} else {
}
String[] elements = time.split(":");
int hour = Integer.parseInt(elements[0]);
int minutes = Integer.parseInt(elements[1]);
return (hour * 60) + minutes;
}
} catch (NumberFormatException ex) {
LOGGER.warn(
"Can not parse astro channel configuration '{}' to hour and minutes, use pattern hh:mm, ignoring!",
@@ -532,4 +538,11 @@ public class DateTimeUtils {
cal.add(Calendar.DAY_OF_MONTH, days);
return cal;
}
public static double instantToJulianDay(Instant instant) {
double seconds = instant.getEpochSecond();
double nanos = instant.getNano() / 1_000_000_000.0;
return JD_UNIX_EPOCH + (seconds + nanos) / SECONDS_PER_DAY;
}
}
@@ -57,13 +57,12 @@ public class MoonCalcTest {
@BeforeEach
public void init() {
moonCalc = new MoonCalc(InstantSource.fixed(Instant.ofEpochMilli(1645671600000L)));
moonCalc = new MoonCalc(InstantSource.fixed(Instant.ofEpochMilli(1551225600000L)));
}
@Test
public void testGetMoonInfoForOldDate() {
Moon moon = Objects.requireNonNull(moonCalc).getMoonInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE,
TIME_ZONE, Locale.ROOT);
Moon moon = Objects.requireNonNull(moonCalc).getMoonInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE);
assertNotNull(moon.getDistanceType(DistanceType.APOGEE));
assertNotNull(moon.getDistanceType(DistanceType.PERIGEE));
@@ -71,20 +70,15 @@ public class MoonCalcTest {
assertNotNull(moon.getEclipseSet());
assertNotNull(moon.getPhase());
assertNotNull(moon.getPosition());
assertNotNull(moon.getRise());
assertNotNull(moon.getSet());
assertNotNull(moon.getZodiac());
// for an old date the phase should not be calculated
assertNull(moon.getPhase().getName());
}
@Test
public void testGetMoonInfoForRiseAccuracy() {
Moon moon = Objects.requireNonNull(moonCalc).getMoonInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE,
TIME_ZONE, Locale.ROOT);
Moon moon = Objects.requireNonNull(moonCalc).getMoonInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE);
Calendar riseStart = moon.getRise().getStart();
assertNotNull(riseStart);
@@ -95,8 +89,7 @@ public class MoonCalcTest {
@Test
public void testGetMoonInfoForSetAccuracy() {
Moon moon = Objects.requireNonNull(moonCalc).getMoonInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE,
TIME_ZONE, Locale.ROOT);
Moon moon = Objects.requireNonNull(moonCalc).getMoonInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE);
Calendar setStart = moon.getSet().getStart();
assertNotNull(setStart);
@@ -109,8 +102,8 @@ public class MoonCalcTest {
public void testGetMoonInfoForMoonPositionAccuracy() {
MoonCalc moonCalc = this.moonCalc;
assertNotNull(moonCalc);
Moon moon = moonCalc.getMoonInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE, TIME_ZONE, Locale.ROOT);
moonCalc.setPositionalInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE, moon, TIME_ZONE, Locale.ROOT);
Moon moon = moonCalc.getMoonInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE);
moonCalc.setPositionalInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE, moon, TIME_ZONE);
var azimuth = moon.getPosition().getAzimuth();
var elevation = moon.getPosition().getElevation();
@@ -122,35 +115,6 @@ public class MoonCalcTest {
assertEquals(-17, moon.getPosition().getElevationAsDouble(), ACCURACY_IN_DEGREE);
}
@Test
public void testGetMoonInfoForMoonPhaseAccuracy() {
MoonCalc moonCalc = this.moonCalc;
assertNotNull(moonCalc);
Moon moon = moonCalc.getMoonInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE, TIME_ZONE, Locale.ROOT);
moonCalc.setPositionalInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE, moon, TIME_ZONE, Locale.ROOT);
// New moon 06 March 2019 17:04
// First quarter 14 March 2019 11:27
// Full moon 21 March 2019 02:43
// Last quarter 28 March 2019 05:10
Calendar phaseCal = moon.getPhase().getNew();
assertNotNull(phaseCal);
assertEquals(MoonCalcTest.newCalendar(2019, Calendar.MARCH, 06, 17, 04, TIME_ZONE).getTimeInMillis(),
phaseCal.getTimeInMillis(), ACCURACY_IN_MILLIS);
phaseCal = moon.getPhase().getFirstQuarter();
assertNotNull(phaseCal);
assertEquals(MoonCalcTest.newCalendar(2019, Calendar.MARCH, 14, 11, 27, TIME_ZONE).getTimeInMillis(),
phaseCal.getTimeInMillis(), ACCURACY_IN_MILLIS);
phaseCal = moon.getPhase().getFull();
assertNotNull(phaseCal);
assertEquals(MoonCalcTest.newCalendar(2019, Calendar.MARCH, 21, 02, 43, TIME_ZONE).getTimeInMillis(),
phaseCal.getTimeInMillis(), ACCURACY_IN_MILLIS);
phaseCal = moon.getPhase().getThirdQuarter();
assertNotNull(phaseCal);
assertEquals(MoonCalcTest.newCalendar(2019, Calendar.MARCH, 28, 05, 10, TIME_ZONE).getTimeInMillis(),
phaseCal.getTimeInMillis(), ACCURACY_IN_MILLIS);
}
/***
* Constructs a <code>GregorianCalendar</code> with the given date and time set
* for the provided time zone.
@@ -0,0 +1,148 @@
/*
* Copyright (c) 2010-2026 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.astro.internal.calc;
import static org.junit.jupiter.api.Assertions.*;
import java.time.Instant;
import java.time.InstantSource;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Objects;
import java.util.TimeZone;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openhab.binding.astro.internal.model.Moon;
import org.openhab.binding.astro.internal.model.MoonPhase;
import org.openhab.binding.astro.internal.model.MoonPhaseSet;
import org.openhab.binding.astro.internal.util.DateTimeUtils;
import org.openhab.core.types.UnDefType;
/***
* Specific unit tests to check if {@link MoonCalc} generates correct data for
* Amsterdam city on 27 February 2019. In particular the following cases are
* covered:
* <ul>
* <li>checks if generated data are the same (with some accuracy) as produced by
* heavens-above.com</li>
* </ul>
*
* @author Leo Siepel - Initial contribution
* @see <a href="https://www.heavens-above.com/Moon.aspx">Heavens Above Moon</a>
*/
@NonNullByDefault
public class MoonPhaseCalcTest {
private static final TimeZone TIME_ZONE = TimeZone.getTimeZone("Europe/Amsterdam");
private static final ZoneId ZONE = TIME_ZONE.toZoneId();
private static final Calendar FEB_27_2019 = newCalendar(2019, Calendar.FEBRUARY, 27, 1, 0, TIME_ZONE);
private static final double AMSTERDAM_LATITUDE = 52.367607;
private static final double AMSTERDAM_LONGITUDE = 4.8978293;
private static final int ACCURACY_IN_MILLIS = 5 * 60 * 1000;
private @Nullable MoonCalc moonCalc;
@BeforeEach
public void init() {
moonCalc = new MoonCalc(InstantSource.fixed(Instant.ofEpochMilli(1551225600000L)));
}
@Test
public void testGetMoonInfoForOldDate() {
Moon moon = Objects.requireNonNull(moonCalc).getMoonInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE);
assertNotNull(moon.getPhaseSet());
// for an old date the phase should not be calculated
assertTrue(moon.getPhaseSet().getName() instanceof UnDefType);
}
@Test
public void testGetMoonInfoForMoonPhaseAccuracy() {
InstantSource instantSource = InstantSource.fixed(Instant.ofEpochMilli(1551225600000L));
MoonPhaseSet moonPhase = MoonPhaseCalc.calculate(instantSource, DateTimeUtils.dateToJulianDate(FEB_27_2019),
MoonPhaseSet.NONE, ZONE);
// New moon 06 March 2019 17:04 - jd : 2458549.1702492456
// First quarter 14 March 2019 11:27 - jd : 2458556.936169754
// Full moon 21 March 2019 02:43 - jd : 2458563.572182703
// Last quarter 28 March 2019 05:10 - jd : 2458570.6742177564
Instant phaseNew = moonPhase.getPhase(MoonPhase.NEW);
assertNotNull(phaseNew);
assertEquals(newCalendar(2019, Calendar.MARCH, 06, 17, 04, TIME_ZONE).getTimeInMillis(),
phaseNew.toEpochMilli(), ACCURACY_IN_MILLIS);
Instant phaseFQ = moonPhase.getPhase(MoonPhase.FIRST_QUARTER);
assertNotNull(phaseFQ);
assertEquals(newCalendar(2019, Calendar.MARCH, 14, 11, 27, TIME_ZONE).getTimeInMillis(), phaseFQ.toEpochMilli(),
ACCURACY_IN_MILLIS);
Instant phaseFull = moonPhase.getPhase(MoonPhase.FULL);
assertNotNull(phaseFull);
assertEquals(newCalendar(2019, Calendar.MARCH, 21, 02, 43, TIME_ZONE).getTimeInMillis(),
phaseFull.toEpochMilli(), ACCURACY_IN_MILLIS);
Instant phaseTQ = moonPhase.getPhase(MoonPhase.THIRD_QUARTER);
assertNotNull(phaseTQ);
assertEquals(newCalendar(2019, Calendar.MARCH, 28, 05, 10, TIME_ZONE).getTimeInMillis(), phaseTQ.toEpochMilli(),
ACCURACY_IN_MILLIS);
moonPhase = MoonPhaseCalc.calculate(InstantSource.fixed(phaseNew), DateTimeUtils.instantToJulianDay(phaseNew),
MoonPhaseSet.NONE, ZONE);
assertEquals(0, moonPhase.getIllumination().doubleValue(), 0.01);
moonPhase = MoonPhaseCalc.calculate(InstantSource.fixed(phaseFull), DateTimeUtils.instantToJulianDay(phaseFull),
MoonPhaseSet.NONE, ZONE);
assertEquals(1, moonPhase.getIllumination().doubleValue(), 0.01);
moonPhase = MoonPhaseCalc.calculate(InstantSource.fixed(phaseTQ), DateTimeUtils.instantToJulianDay(phaseTQ),
MoonPhaseSet.NONE, ZONE);
assertEquals(0.5, moonPhase.getIllumination().doubleValue(), 0.01);
moonPhase = MoonPhaseCalc.calculate(InstantSource.fixed(phaseFQ), DateTimeUtils.instantToJulianDay(phaseFQ),
MoonPhaseSet.NONE, ZONE);
assertEquals(0.5, moonPhase.getIllumination().doubleValue(), 0.01);
}
/***
* Constructs a <code>GregorianCalendar</code> with the given date and time set
* for the provided time zone.
*
* @param year
* the value used to set the <code>YEAR</code> calendar field in the
* calendar.
* @param month
* the value used to set the <code>MONTH</code> calendar field in the
* calendar. Month value is 0-based. e.g., 0 for January.
* @param dayOfMonth
* the value used to set the <code>DAY_OF_MONTH</code> calendar field
* in the calendar.
* @param hourOfDay
* the value used to set the <code>HOUR_OF_DAY</code> calendar field
* in the calendar.
* @param minute
* the value used to set the <code>MINUTE</code> calendar field in
* the calendar.
* @param zone
* the given time zone.
* @return a {@link Calendar} set to the given date and time in the specified
* time zone, truncated to minute precision.
*/
private static Calendar newCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, TimeZone zone) {
Calendar result = new GregorianCalendar(zone, Locale.ROOT);
result.set(year, month, dayOfMonth, hourOfDay, minute);
return DateTimeUtils.truncateToMinute(result);
}
}
@@ -55,15 +55,15 @@ public class MoonZodiacCalcTest {
@BeforeEach
public void init() {
moonCalc = new MoonCalc(InstantSource.fixed(Instant.ofEpochMilli(1645671600000L)));
moonCalc = new MoonCalc(InstantSource.fixed(Instant.ofEpochMilli(1551225600000L)));
}
@Test
public void testGetMoonInfoForZodiac() {
MoonCalc moonCalc = this.moonCalc;
assertNotNull(moonCalc);
Moon moon = moonCalc.getMoonInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE, TIME_ZONE, Locale.ROOT);
moonCalc.setPositionalInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE, moon, TIME_ZONE, Locale.ROOT);
Moon moon = moonCalc.getMoonInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE);
moonCalc.setPositionalInfo(FEB_27_2019, AMSTERDAM_LATITUDE, AMSTERDAM_LONGITUDE, moon, TIME_ZONE);
assertEquals(ZodiacSign.SAGITTARIUS, moon.getZodiac().getSign());
}