36C209.793 54.8671 209.611 52.6549 209.414 50.5416C209.104 47.1884 208.795 43.8492 208.5 40.5242C208.289 38.2981 207.909 36.072 208.148 33.8459C208.373 31.5071 209.245 29.1824 209.709 26.8718C209.821 26.3363 209.99 25.6742 210.159 24.9556C210.651 22.969 211.143 20.9684 211.607 18.9959C212.086 16.9389 212.901 14.9523 213.435 12.9939C214.139 10.4579 214.87 7.1328 213.323 4.77991C211.874 2.582 208.682 1.8071 206.573 3.44144C206.404 3.55415 206.278 3.68096 206.137 3.82185C205.589 4.3995 205.153 5.13215 204.422 5.44209C203.831 5.7098 203.17 5.65346 202.509 5.62526C200.892 5.59707 199.219 5.89297 197.925 6.86509C195.267 8.89393 195.998 11.2891 197.756 13.318C197.32 13.6279 196.912 13.9097 196.561 14.0647C195.605 14.5578 194.634 14.9523 193.65 15.2764C192.919 12.8389 192.173 10.4156 191.414 7.96405C190.669 5.56892 189.867 1.34215 187.322 0.271376C186.689 0.00368107 185.972 -0.0104081 185.283 0.00368111C176.255 0.0882161 167.733 3.61051 159.577 7.17509C157.721 7.97815 155.893 8.73896 154.107 9.49978C150.985 10.8101 147.877 12.1204 144.812 13.5575C143.546 14.1492 142.407 14.9382 141.071 15.2905C139.707 15.6567 138.287 15.7695 136.909 16.1076C135.531 16.4598 134.167 16.9389 132.774 17.277C130.426 17.8265 128.092 18.531 125.828 19.3622C121.342 21.0106 117.039 23.1663 113.059 25.7728C105.114 30.9435 98.3362 37.8754 93.3157 45.9344C90.2083 50.922 87.7893 56.3461 86.1438 61.9959C85.3426 64.7719 84.5409 67.5612 84.0488 70.4074C83.5423 73.3238 83.5705 76.1275 83.7535 79.0721C83.7535 79.1705 83.7673 79.2551 83.7392 79.3541C83.7115 79.4669 83.6407 79.5653 83.5705 79.6637C82.7268 80.8192 81.4755 81.5236 80.4349 82.5099C77.594 85.1726 74.5004 87.5118 72.1101 90.6251C72.124 90.5969 74.1349 90.6958 74.3318 90.7097C75.1191 90.724 75.9065 90.7379 76.6944 90.7522C77.4818 90.7522 78.2691 90.7522 79.0565 90.7522C79.8444 90.7379 80.6317 90.724 81.4191 90.7097C82.291 90.6815 83.1486 90.5692 84.0067 90.4985C84.1754 90.4846 84.3722 90.4846 84.4989 90.6112C84.5973 90.7097 84.6111 90.8506 84.6393 90.9778C84.9346 93.2319 85.6379 95.4721 85.6379 97.7964C85.6661 98.1492 85.7225 98.5014 85.7363 98.8535C85.9331 100.53 86.0736 102.235 86.1582 103.926C86.2002 104.362 86.2428 104.813 86.2566 105.25C86.3412 106.701 86.3832 108.152 86.397 109.631C86.4396 111.576 86.4252 113.506 86.3268 115.45C86.2146 118.367 85.947 121.298 85.5251 124.2C79.1411 128.201 71.7867 132.047 62.3931 136.359C60.9445 137.007 59.4118 137.725 57.8647 138.542C57.5413 138.641 57.1338 138.726 56.7539 138.782C55.7133 138.994 54.6727 139.163 53.6603 139.303C48.9494 140.05 44.0981 140.839 39.7809 144.531C37.2074 146.715 35.6043 149.504 35.2809 152.378C35.2668 152.547 35.2809 152.702 35.2809 152.871C34.2403 153.618 33.2278 154.491 32.2294 155.52C31.8216 155.943 30.8654 156.929 30.6966 158.394C30.556 159.691 31.0482 161.029 32.0607 161.987C32.7497 162.635 33.5232 163.016 34.2544 163.34C34.9434 163.635 35.6184 163.861 36.3215 164.058C37.7699 166.848 40.3151 168.13 42.5654 169.229L43.0432 169.468C47.4449 171.652 51.9866 171.708 56.3884 171.751C56.9226 171.751 57.429 171.765 57.9493 171.765C57.8365 171.878 57.7243 171.99 57.5977 172.103C52.4793 176.654 46.8821 180.74 40.9763 184.234C35.309 187.615 29.3045 190.067 23.2436 192.673C22.7515 192.885 22.2171 193.152 22.0343 193.659C21.7671 194.392 22.414 195.125 23.0468 195.547C24.2139 196.35 25.7045 196.984 27.0685 197.337C28.2779 197.647 29.5295 197.675 30.7529 197.816C32.9888 198.055 35.2809 198.027 37.5309 197.901C45.9399 197.407 54.462 194.646 62.0415 191.011C63.8976 190.123 65.7256 189.179 67.5535 188.249C69.6071 187.192 71.7303 186.094 73.8397 185.121C74.2754 184.91 74.8239 184.628 75.4426 184.319C77.0599 183.515 78.6346 182.67 80.2381 181.825C80.927 181.472 81.5739 181.064 82.249 180.697C82.938 180.317 83.894 179.584 84.6813 179.528C85.7501 179.443 84.5973 181.965 84.344 182.444C83.7955 183.515 82.98 184.417 82.1224 185.262C81.841 185.558 81.5457 185.84 81.2643 186.108C79.6614 187.615 77.8893 188.926 76.0613 190.151C74.444 191.222 72.7847 192.222 71.0972 193.152C69.5789 193.998 68.2148 194.913 66.7805 195.815C64.868 197.013 53.4635 201.282 55.9383 204.551C56.7683 205.65 58.7228 206.1 59.9603 206.382C65.6974 207.721 71.7303 206.706 77.3833 205.452C83.3316 204.128 89.1251 202.198 94.975 200.549C95.5656 200.38 96.3816 200.324 96.6205 200.873C98.1394 204.339 86.5518 208.975 84.527 209.904C77.046 213.342 69.2272 215.723 61.1557 217.386C57.9913 218.034 54.8132 218.696 51.6212 219.161C48.8367 219.569 45.659 219.344 43.1416 220.781C39.7389 222.725 43.7183 225.825 45.8133 226.952C48.2179 228.249 50.946 228.84 53.6039 229.432C63.1385 231.531 73.1928 231.08 82.8677 230.418C101.978 229.08 120.849 225.008 139.102 219.231C141.015 218.626 142.913 218.005 144.826 217.372C146.851 216.681 148.946 216.005 150.985 215.202C157.538 212.666 163.543 209.51 169.013 205.762C171.094 204.339 173.105 202.817 175.032 201.226C176.283 200.197 177.492 199.126 178.659 198.013C180.094 196.675 181.458 195.266 182.794 193.814C189.91 186.023 195.436 176.781 199.205 166.284C201.961 158.578 202.607 151.406 201.44 141.628C207.585 137.007 213.45 131.991 218.976 126.538C224.348 121.213 230.381 115.211 234.191 107.405L234.318 107.448C234.529 106.898 235.162 106.293 235.767 105.715C236.709 104.813 237.679 103.954 238.621 103.108C242.91 99.2339 247.34 95.2327 249.294 88.7093C250.462 84.863 250.25 81.073 248.746 78.0012ZM222.323 73.6478C224.812 72.0981 227.624 71.1118 230.465 70.7878L231.112 70.7032C231.449 70.675 231.801 70.633 232.125 70.5904C231.73 70.9006 231.379 71.2384 231.013 71.6049C230.296 72.3237 229.509 73.0563 228.651 73.8027C228.383 74 228.116 74.2112 227.849 74.4086C226.907 75.1273 225.937 75.8317 224.995 76.5361C223.265 76.1839 221.479 76.0429 219.665 76.2259C219.356 76.2403 219.075 76.2967 218.779 76.3387C219.918 75.3103 221.099 74.4086 222.323 73.6478ZM203.93 57.9245C203.662 58.6709 202.045 60.3334 201.188 59.4599C200.99 59.2487 200.892 58.9529 200.808 58.6709C200.414 57.3606 199.739 55.9801 200.006 54.6554C200.175 53.8664 201.243 50.3584 202.157 50.4429C203.691 50.5698 204.323 56.7829 203.93 57.9245ZM206.77 49.6821C206.798 50.3584 206.812 50.9361 206.404 51.5138C205.434 52.8804 204.914 49.8512 204.787 49.3017C204.436 47.8364 204.408 46.2866 205.055 44.9059C205.406 44.1169 206.081 44.4973 206.278 45.2018C206.658 46.6389 206.728 48.1887 206.77 49.6821ZM136.149 23.913C142.519 19.6299 149.073 16.8825 156.033 13.966C157.848 13.2052 159.704 12.4304 161.56 11.6132C168.422 8.62628 175.13 6.11837 182.498 4.52631C183.118 4.3995 183.75 4.25861 184.369 4.42768C185.325 4.70947 185.719 6.09023 186.113 6.92148C186.647 8.07678 186.802 9.373 187.153 10.5987C187.8 12.698 188.7 14.6846 189.066 16.8543C189.08 16.953 189.094 17.0516 189.038 17.1361C189.009 17.1784 188.939 17.2207 188.869 17.2489C187.392 17.8828 185.902 18.545 184.425 19.1791C183.82 19.4468 183.089 19.9258 182.414 19.9821C181.866 20.0103 181.261 19.8694 180.685 19.8835C176.691 19.9821 174.624 22.5887 172.472 25.5051C170.026 28.7738 169.632 32.7892 169.35 36.7342C169.041 40.9891 169.027 44.3564 165.962 47.7801C163.557 50.4852 160.337 52.3309 157.13 53.9936C154.234 55.5151 151.168 56.952 147.892 56.9802C142.449 57.0792 138.864 52.6549 135.137 49.3863C132.31 46.9066 130.004 43.7506 127.515 40.9046C125.87 39.0307 123.001 36.4524 122.945 33.7613C122.917 32.5356 123.873 31.7466 124.745 31.0281C126.798 29.3796 129.09 28.0411 131.383 26.7449C132.971 25.8714 134.63 24.9415 136.149 23.913ZM92.5284 57.9102C94.4127 53.1902 97.1828 48.5409 100.234 44.4409C103.441 40.1156 107.238 36.2129 111.484 32.8878C113.622 31.2253 115.858 29.7037 118.192 28.337C119.893 27.3508 121.468 26.3223 123.24 25.491C124.126 25.0824 125.026 24.6597 125.982 24.5752C123.409 26.3786 120.794 28.1398 118.291 30.0137C117.657 30.4927 116.997 30.9999 116.659 31.6903C116.322 32.4511 116.378 33.3528 116.659 34.1559C117.292 35.917 118.909 37.0583 116.856 38.5376C113.368 41.0173 109.895 43.4829 106.408 45.9626C103.638 47.9351 101.106 50.288 98.6315 52.6409C97.5207 53.6696 96.3955 54.6836 95.4251 55.8391C94.2861 57.1914 93.3721 58.8965 91.9235 59.9392C92.0362 59.1359 92.2469 58.6289 92.5284 57.9102ZM88.7878 74.8033C88.816 74.3948 88.8581 73.9718 88.9001 73.5632C88.9847 72.7605 89.0831 71.9571 89.1954 71.1682C89.3363 70.1818 89.4486 69.1955 89.6034 68.2235C89.6316 68.0262 89.9551 65.6311 90.1939 65.6875C91.0238 65.9131 91.8676 66.1525 92.7114 66.3216C94.1456 66.6174 95.5517 66.9978 96.9722 67.3356C98.35 67.674 99.7423 67.9134 101.12 68.2374C101.556 68.3363 101.992 68.4491 102.428 68.5475C102.456 68.5475 101.852 68.9423 101.81 68.9705C101.486 69.1391 101.163 69.2945 100.839 69.4493C100.192 69.7733 99.5311 70.0834 98.8847 70.4074C97.6047 71.0272 96.3252 71.6613 95.0734 72.3657C92.922 73.5351 90.8408 74.7469 88.7176 75.9865C88.8017 75.9163 88.7735 74.9438 88.7878 74.8033ZM85.8209 85.187C85.4831 85.2151 85.1458 85.2572 84.8079 85.2854C84.6255 85.2997 84.4568 85.3279 84.2738 85.3418C84.26 85.3418 83.9365 85.3561 83.9365 85.3279C84.2456 84.8768 84.7377 84.5954 85.174 84.257C85.5533 83.9612 85.8767 83.5947 86.2284 83.285C90.1801 79.7201 95.2001 77.7054 99.8125 75.2119C103.905 72.9855 107.87 70.5058 111.653 67.7724C111.836 67.632 112.033 67.5048 112.216 67.3638C111.695 67.1106 111.048 67.026 110.486 66.8286C109.783 66.5749 109.066 66.3498 108.348 66.1381C106.858 65.7013 105.367 65.3209 103.863 64.9549C102.4 64.6027 100.938 64.2506 99.4891 63.842C99.1092 63.743 95.2283 62.4045 95.2001 62.4471C95.8049 61.4607 96.5923 60.6436 97.394 59.8264C98.6171 58.6007 99.8827 57.4314 101.12 56.2195C102.597 54.7682 104.242 53.5142 105.803 52.1477C110.542 47.9914 115.661 44.5959 120.906 41.1582C122.354 43.1448 124.014 44.9764 125.673 46.7939C127.586 48.8932 129.484 50.9924 131.396 53.0776C131.875 53.6132 132.423 54.1909 132.999 54.7543C132.62 54.9799 132.24 55.2049 131.875 55.4023C127.586 58.2623 123.17 60.9537 118.656 63.4334C118.726 63.3908 119.19 63.6446 119.275 63.6866C119.485 63.7712 119.683 63.8558 119.893 63.9404C122.439 65.0252 124.913 66.2791 127.361 67.5756C128.584 68.2235 129.793 68.8859 131.017 69.5339C131.635 69.8579 132.24 70.1818 132.859 70.5058C133.421 70.8016 134.026 71.0416 134.532 71.464C134.462 71.5204 134.363 71.5624 134.293 71.6049C134.195 71.6752 134.096 71.7459 133.998 71.8023C133.815 71.9151 133.618 72.0274 133.407 72.1263C133.056 72.2955 132.69 72.4359 132.325 72.5631C131.453 72.8871 130.581 73.2111 129.709 73.5351C128.893 73.8308 128.12 74.1974 127.29 74.4794C126.896 74.606 126.559 74.7188 126.306 74.8172C121.806 76.4797 117.039 78.0294 111.695 79.5791C111.203 79.7201 110.725 79.8611 110.233 80.0021C102.316 82.3551 94.0892 84.3836 85.8209 85.187ZM42.9868 148.222C44.8711 146.587 46.9805 145.728 49.2585 145.122C48.9494 145.517 48.6398 145.869 48.3589 146.292C47.9652 146.898 47.67 147.588 47.4167 148.321C47.2337 148.334 47.0651 148.363 46.8821 148.391C45.5744 148.504 44.2247 148.616 42.8883 148.912C42.5931 148.982 42.3404 149.039 42.059 149.123C42.326 148.799 42.6356 148.518 42.9868 148.222ZM36.209 158.803C36.1668 158.774 36.0825 158.732 35.984 158.69C38.0793 156.591 40.2028 155.337 42.7899 154.689L46.6571 153.731C46.7416 155.83 47.1497 157.929 47.8104 159.691C47.5854 159.719 47.3742 159.761 47.1353 159.789C43.2262 160.057 39.5277 160.198 36.209 158.803ZM45.293 165.072C46.0383 164.904 46.8539 164.763 47.6976 164.65C47.9652 164.636 48.2179 164.622 48.4855 164.608C49.2867 164.537 50.0885 164.495 50.8902 164.439C51.7898 165.326 52.8448 166.115 54.012 166.791C50.9184 166.693 47.9791 166.411 45.293 165.072ZM57.9211 163.269C55.4883 162.24 53.646 160.691 52.7602 158.873C51.4243 156.21 51.0024 151.195 52.4511 148.969C54.1524 146.391 56.9369 144.531 59.9459 142.938C60.2694 142.812 60.579 142.643 60.9025 142.445C62.1117 141.839 63.3071 141.29 64.5025 140.726C72.2644 137.19 78.649 133.921 84.3158 130.61C83.5567 133.738 82.5581 136.866 81.2786 139.937C77.594 148.743 71.9691 157.281 64.8254 165.016C62.3931 164.608 60.0587 164.171 57.9211 163.269ZM194.62 164.622C193.987 166.439 193.27 168.229 192.483 169.99C192.188 170.68 191.878 171.342 191.569 172.004C187.842 179.81 182.752 186.925 176.648 193.011C175.791 193.871 174.905 194.73 173.991 195.547C172.416 196.984 170.785 198.351 169.083 199.648C168.887 199.816 168.69 199.957 168.492 200.098C167.143 201.113 165.765 202.057 164.386 202.944C158.551 206.635 152.349 209.129 145.487 210.877C144.052 211.257 139.314 212.891 138.371 210.975C138.16 210.524 138.188 209.96 138.287 209.453C138.962 206.016 141.493 202.789 142.998 199.661C147.947 189.362 150.521 178.274 158.705 169.82C163.838 164.509 170.236 160.437 176.691 157.14C183.694 153.562 190.444 149.49 196.884 144.967C197.531 152.547 196.842 158.408 194.62 164.622ZM232.645 95.5988C232.349 98.5014 231.604 101.347 230.423 104.024C227.048 111.675 220.945 117.719 215.545 123.045C203.367 135.076 189.558 145.066 174.469 152.772C167.986 156.07 161.419 159.676 156.118 164.763C148.552 171.99 144.967 180.162 141.352 189.743C138.681 196.773 134.617 203.282 129.54 208.834C121.412 217.71 109.811 222.303 98.2234 224.487C92.2469 225.614 86.1438 226.149 80.0694 226.318C74.9643 226.445 67.4695 227.46 62.8006 225.05C62.6038 224.952 62.3788 224.839 62.1963 224.712C62.1819 224.698 62.1681 224.698 62.1537 224.684C61.8585 224.472 61.5776 224.191 61.5212 223.853C61.3382 223.035 62.2521 222.444 63.0257 222.148C70.7179 219.189 78.9022 217.738 86.4252 214.314C91.741 211.919 96.6205 208.566 100.698 204.381C102.316 202.719 110.205 193.829 105.086 192.236C104.664 192.11 104.2 192.236 103.778 192.363C98.7299 193.97 93.8222 195.843 88.7033 197.238C85.5251 198.126 82.3474 198.985 79.1693 199.873C76.4832 200.605 73.6146 201.211 70.8445 201.324C70.5349 201.338 70.2114 201.352 69.9162 201.254C67.4131 200.408 72.3772 197.999 72.8975 197.717C75.1191 196.449 77.3833 195.224 79.4784 193.744C83.3598 191.039 86.6503 187.714 89.4768 183.938C91.3893 181.36 93.3019 178.556 93.9062 175.315C94.1313 174.146 94.708 170.173 93.3859 169.37C93.1471 169.243 92.8518 169.257 92.5704 169.285C90.9531 169.553 89.5896 170.596 88.2394 171.511C83.5285 174.738 78.3111 177.372 73.2491 179.951C72.7006 180.233 72.1942 180.486 71.8005 180.669C69.6071 181.698 67.4551 182.811 65.3463 183.882C59.1586 187.066 52.6899 189.7 45.659 190.236C45.2089 190.264 44.745 190.306 44.337 190.109C43.9151 189.926 43.5917 189.489 43.7044 189.052C43.7885 188.77 44.0135 188.559 44.2524 188.376C46.2213 186.812 48.3728 185.502 50.4401 184.065C54.096 181.514 57.5413 178.711 60.8461 175.752C72.0394 165.805 80.6456 154.083 85.7645 141.839C89.5188 132.865 91.0095 123.524 91.2766 114.549C91.3191 113.013 91.3473 111.477 91.3047 109.984C91.2909 108.11 91.2063 106.25 91.1079 104.419C90.9813 102.291 90.7988 100.206 90.5876 98.163C90.2923 95.4296 89.9551 92.7951 89.5752 90.2591C94.1313 89.2025 98.6735 87.7932 103.201 86.5537C108.039 85.2433 112.848 83.8905 117.644 82.4253C119.092 81.9747 120.54 81.5236 121.975 81.0448C123.479 80.5516 124.97 80.0303 126.447 79.4951C127.937 78.9593 129.414 78.396 130.876 77.8044C132.339 77.2122 133.787 76.5925 135.235 75.9301C136.67 75.2683 138.09 74.5778 139.482 73.8452C140.185 73.4787 140.875 73.0983 141.549 72.7179C141.887 72.5205 142.239 72.3237 142.576 72.1263C142.745 72.0274 142.913 71.9289 143.082 71.8305C143.11 71.8162 143.518 71.5768 143.504 71.5624C143.237 71.3512 142.956 71.1964 142.674 70.999C142.464 70.858 142.266 70.6894 142.056 70.5622C141.001 69.8999 139.932 69.2381 138.877 68.5757C136.529 67.1106 134.195 65.6875 131.692 64.5182C130.398 63.9122 129.104 63.3063 127.937 62.4891C127.923 62.4753 128.893 61.8693 128.978 61.8268C129.202 61.7001 129.442 61.5735 129.681 61.4464C130.019 61.2777 130.314 61.0378 130.637 60.8266C131.523 60.277 132.451 59.7982 133.351 59.263C134.392 58.6289 135.46 58.0368 136.543 57.4734C138.273 59.1923 140.635 60.277 142.857 61.1931C145.29 62.1933 148.426 62.0385 150.971 61.6299C154.881 60.9958 158.565 59.3471 161.94 57.2478C169.646 52.4577 173.541 46.0471 174.188 37.0864C174.427 33.7614 174.666 30.6336 176.339 28.4075C178.308 25.801 182.175 24.3779 185.916 22.9972C188.826 21.9405 191.794 20.6444 194.705 19.3763C196.237 18.7282 197.756 18.0519 199.289 17.432C199.922 17.1643 200.808 16.6148 201.511 16.6007C202.678 16.5726 204.576 17.5306 205.532 18.1505C206.756 18.9396 206.278 20.6866 205.954 21.856C204.253 27.9144 203.114 34.029 201.005 39.9888C197.784 49.034 193.327 57.6 187.758 65.4199C183.61 71.2528 177.324 75.1694 171.952 79.7063C164.738 85.8067 160.688 95.162 160.646 105.687C160.646 105.786 160.491 105.828 160.407 105.841C160.069 105.912 159.717 105.87 159.38 105.841C158.818 105.799 158.255 105.729 157.707 105.645C156.99 105.546 156.272 105.419 155.555 105.306C154.74 105.165 153.924 105.01 153.108 104.856C152.251 104.686 151.407 104.517 150.549 104.348C149.72 104.179 148.89 104.01 148.046 103.841C147.287 103.686 146.541 103.531 145.782 103.362C145.164 103.235 144.559 103.094 143.94 102.968C143.603 102.897 143.279 102.798 142.956 102.756C142.941 102.756 142.913 102.756 142.885 102.798C142.871 102.869 142.913 102.953 142.941 103.024C143.026 103.165 143.082 103.305 143.195 103.418C143.701 103.968 144.193 104.532 144.784 105.01C148.552 108.025 153.052 109.857 157.848 110.378C159.225 110.533 160.618 110.604 162.01 110.576C178.463 110.336 192.16 101.812 203.873 90.9634C208.809 86.3983 213.928 81.6789 220.115 81.073C224.094 80.6782 228.088 82.1998 230.268 84.9193C232.279 87.4272 233.109 91.2028 232.645 95.5988ZM177.338 102.968C173.527 104.306 169.547 105.151 165.54 105.517C165.638 96.5425 169.041 88.5822 175.102 83.4819C175.692 82.9887 176.297 82.5243 176.873 82.045C174.919 88.4694 175.074 95.9653 177.338 102.968ZM234.107 81.8901C233.094 80.6218 231.843 79.5653 230.437 78.6917C230.887 78.3396 231.323 77.973 231.745 77.6208C235.654 74.6624 239.423 71.9853 243.923 71.182C244.302 71.1118 244.668 71.0698 245.019 71.098C245.005 71.182 244.991 71.2948 244.949 71.4358C244.19 75.3103 242.769 78.1847 240.393 80.7346L236.146 85.2715C235.626 84.1022 234.965 82.9611 234.107 81.8901ZM244.625 87.3144C243.318 91.696 240.59 94.6832 237.299 97.7124C237.383 97.191 237.468 96.6553 237.524 96.1058C237.693 94.556 237.735 92.7387 237.538 90.8506C238.213 90.3011 238.888 89.7239 239.634 89.1461C240.871 88.1598 242.179 87.1596 243.332 85.9759C244.021 85.2854 244.597 84.5672 245.16 83.8341C245.16 84.9475 244.977 86.1169 244.625 87.3144Z" fill="#1D445C"/> '; $output .= '' . esc_html( $string ) . ''; $output .= ''; echo $output; } /** * Check if we should rewrite the urls. * * @return bool If we can replace the image. */ public function should_replace() { if ( apply_filters( 'optml_should_replace_page', false ) ) { return false; } if ( apply_filters( 'optml_force_replacement', false ) === true ) { return true; } if ( is_customize_preview() && $this->settings->get( 'offload_media' ) !== 'enabled' ) { return false; } if ( ( is_admin() && ! self::is_ajax_request() ) || ! $this->settings->is_connected() || ! $this->settings->is_enabled() ) { return false; // @codeCoverageIgnore } if ( array_key_exists( 'preview', $_GET ) && ! empty( $_GET['preview'] ) && ! $this->settings->is_offload_enabled() ) { return false; // @codeCoverageIgnore } if ( array_key_exists( 'optml_off', $_GET ) && 'true' === $_GET['optml_off'] ) { return false; // @codeCoverageIgnore } if ( array_key_exists( 'elementor-preview', $_GET ) && ! empty( $_GET['elementor-preview'] ) ) { return false; // @codeCoverageIgnore } if ( array_key_exists( 'ct_builder', $_GET ) && ! empty( $_GET['ct_builder'] ) ) { return false; // @codeCoverageIgnore } if ( array_key_exists( 'et_fb', $_GET ) && ! empty( $_GET['et_fb'] ) ) { return false; // @codeCoverageIgnore } if ( array_key_exists( 'tve', $_GET ) && $_GET['tve'] === 'true' ) { return false; // @codeCoverageIgnore } if ( array_key_exists( 'trp-edit-translation', $_GET ) && ( $_GET['trp-edit-translation'] === 'true' || $_GET['trp-edit-translation'] === 'preview' ) ) { return false; // @codeCoverageIgnore } if ( array_key_exists( 'context', $_GET ) && $_GET['context'] === 'edit' ) { return false; // @codeCoverageIgnore } // avada if ( array_key_exists( 'fb-edit', $_GET ) && ! empty( $_GET['fb-edit'] ) ) { return false; // @codeCoverageIgnore } if ( array_key_exists( 'builder', $_GET ) && ! empty( $_GET['builder'] ) && array_key_exists( 'builder_id', $_GET ) && ! empty( $_GET['builder_id'] ) ) { return false; // @codeCoverageIgnore } // Motion.page iFrame & builder if ( ( array_key_exists( 'motionpage_iframe', $_GET ) && $_GET['motionpage_iframe'] === 'true' ) || ( array_key_exists( 'page', $_GET ) && $_GET['page'] === 'motionpage' ) ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison return false; // @codeCoverageIgnore } /** * Disable replacement on POST request and when user is logged in, but allows for sample image call widget in dashboard */ if ( isset( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] === 'POST' && is_user_logged_in() && ( ! isset( $_GET['quality'] ) || ! current_user_can( 'manage_options' ) ) ) { return false; // @codeCoverageIgnore } if ( class_exists( 'FLBuilderModel', false ) ) { $post_data = FLBuilderModel::get_post_data(); if ( isset( $_GET['fl_builder'] ) || isset( $post_data['fl_builder'] ) ) { return false; } } $filters = $this->settings->get_filters(); return Optml_Filters::should_do_page( $filters[ Optml_Settings::FILTER_TYPE_OPTIMIZE ][ Optml_Settings::FILTER_URL ], $filters[ Optml_Settings::FILTER_TYPE_OPTIMIZE ][ Optml_Settings::FILTER_URL_MATCH ] ); } /** * Check if we are in a ajax contex where we should enable replacement. * * @return bool Is ajax request? */ public static function is_ajax_request() { if ( apply_filters( 'optml_force_replacement_on', false ) === true ) { return true; } if ( ! function_exists( 'is_user_logged_in' ) ) { return false; } // Disable for logged in users to avoid unexpected results. if ( is_user_logged_in() ) { return false; } if ( ! function_exists( 'wp_doing_ajax' ) ) { return false; } if ( ! wp_doing_ajax() ) { return false; } if ( isset( $_REQUEST['action'] ) && strpos( $_REQUEST['action'], 'wpmdb' ) !== false ) { return false; } return true; } /** * Register frontend replacer hooks. */ public function register_hooks() { do_action( 'optml_replacer_setup' ); if ( $this->settings->get( 'native_lazyload' ) === 'disabled' ) { add_filter( 'wp_lazy_loading_enabled', '__return_false' ); } add_filter( 'the_content', [ $this, 'process_images_from_content' ], PHP_INT_MAX ); /** * When we have to process cdn images, i.e MIRROR is defined, * we need this as late as possible for other replacers to occur. * Otherwise, we can hook first to avoid any other plugins to take care of replacement. */ add_action( self::is_ajax_request() ? 'init' : 'template_redirect', [ $this, 'process_template_redirect_content', ], defined( 'OPTML_SITE_MIRROR' ) ? PHP_INT_MAX : PHP_INT_MIN ); add_action( 'template_redirect', [ $this, 'register_after_setup' ] ); add_action( 'rest_api_init', [ $this, 'process_template_redirect_content' ], PHP_INT_MIN ); add_action( 'shutdown', [ $this, 'close_buffer' ] ); foreach ( self::$loaded_compatibilities as $registered_compatibility ) { $registered_compatibility->register(); } } /** * Run after Optimole is fully setup. */ public function register_after_setup() { do_action( 'optml_after_setup' ); } /** * Filter raw HTML content for urls. * * @param string $html HTML to filter. * * @return mixed Filtered content. */ public function replace_content( $html ) { if ( defined( 'REST_REQUEST' ) && REST_REQUEST && is_user_logged_in() && ( apply_filters( 'optml_force_replacement', false ) !== true ) ) { return $html; } $html = $this->add_html_class( $html ); $html = $this->process_images_from_content( $html ); if ( $this->settings->get( 'video_lazyload' ) === 'enabled' ) { $html = apply_filters( 'optml_video_replace', $html ); if ( Optml_Lazyload_Replacer::found_iframe() === true ) { if ( strpos( $html, Optml_Lazyload_Replacer::IFRAME_TEMP_COMMENT ) !== false ) { $html = str_replace( Optml_Lazyload_Replacer::IFRAME_TEMP_COMMENT, Optml_Lazyload_Replacer::IFRAME_PLACEHOLDER_CLASS, $html ); } else { $html = preg_replace( '/(.*)<\/head>/ism', ' $1' . Optml_Lazyload_Replacer::IFRAME_PLACEHOLDER_STYLE . '', $html ); } } } $html = apply_filters( 'optml_url_pre_process', $html ); $html = $this->process_urls_from_content( $html ); $html = apply_filters( 'optml_url_post_process', $html ); return $html; } /** * Adds a filter that allows adding classes to the HTML tag. * * @param string $content The HTML content. * * @return mixed */ public function add_html_class( $content ) { if ( empty( $content ) ) { return $content; } $additional_html_classes = apply_filters( 'optml_additional_html_classes', [] ); if ( ! $additional_html_classes ) { return $content; } if ( preg_match( '//ismU', $content, $matches, PREG_OFFSET_CAPTURE ) === 1 ) { $add_classes = implode( ' ', $additional_html_classes ); foreach ( $matches as $match ) { if ( strpos( $match[0], 'class' ) !== false ) { $new_tag = str_replace( [ 'class="', "class='" ], [ 'class="' . $add_classes, "class='" . $add_classes ], $match[0] ); } else { $new_tag = str_replace( 'html ', 'html class="' . $add_classes . '" ', $match[0] ); } $content = str_replace( $match[0], $new_tag, $content ); } } return $content; } /** * Adds a filter with detected images tags and the content. * * @param string $content The HTML content. * * @return mixed */ public function process_images_from_content( $content ) { if ( self::should_ignore_image_tags() ) { return $content; } $images = self::parse_images_from_html( $content ); if ( empty( $images ) ) { return $content; } return apply_filters( 'optml_content_images_tags', $content, $images ); } /** * Check if we are on a amp endpoint. * * IMPORTANT: This needs to be used after parse_query hook, otherwise will return false positives. * * @return bool */ public static function should_ignore_image_tags() { // Ignore image tag replacement in feed context as we don't need it. if ( is_feed() ) { return true; } // Ignore image tags replacement in amp context as they are not available. if ( function_exists( 'is_amp_endpoint' ) ) { return is_amp_endpoint(); } if ( function_exists( 'ampforwp_is_amp_endpoint' ) ) { return ampforwp_is_amp_endpoint(); } return apply_filters( 'optml_should_ignore_image_tags', false ) === true; } /** * Match all images and any relevant tags in a block of HTML. * * @param string $content Some HTML. * * @return array An array of $images matches, where $images[0] is * an array of full matches, and the link_url, img_tag, * and img_url keys are arrays of those matches. */ public static function parse_images_from_html( $content ) { $images = []; $header_start = null; $header_end = null; if ( preg_match( '//ismU', $content, $matches, PREG_OFFSET_CAPTURE ) === 1 ) { $header_start = $matches[0][1]; $header_end = $header_start + strlen( $matches[0][0] ); } $regex = '/(?:]+?href=["|\'](?P[^\s]+?)["|\'][^>]*?>\s*)?(?P(?:\s*)?]*?\s?(?:' . implode( '|', array_merge( [ 'src' ], Optml_Tag_Replacer::possible_src_attributes() ) ) . ')=["\'\\\\]*?(?P[' . Optml_Config::$chars . ']{10,}).*?>(?:\s*<\/noscript\s*>)?){1}(?:\s*<\/a>)?/ismu'; if ( preg_match_all( $regex, $content, $images, PREG_OFFSET_CAPTURE ) ) { if ( OPTML_DEBUG ) { do_action( 'optml_log', $images ); } foreach ( $images as $key => $unused ) { // Simplify the output as much as possible, mostly for confirming test results. if ( is_numeric( $key ) && $key > 0 ) { unset( $images[ $key ] ); continue; } $is_no_script = false; foreach ( $unused as $url_key => $url_value ) { if ( $key === 'img_url' ) { $images[ $key ][ $url_key ] = rtrim( $url_value[0], '\\' ); continue; } $images[ $key ][ $url_key ] = $url_value[0]; if ( $key === 0 ) { $images['in_header'][ $url_key ] = $header_start !== null ? ( $url_value[1] > $header_start && $url_value[1] < $header_end ) : false; // Check if we are in the noscript context. if ( $is_no_script === false ) { $is_no_script = strpos( $images[0][ $url_key ], 'extract_urls_from_content( $html ); if ( OPTML_DEBUG ) { do_action( 'optml_log', 'matched urls' ); do_action( 'optml_log', $extracted_urls ); } return $this->do_url_replacement( $html, $extracted_urls ); } /** * Method to extract assets from content. * * @param string $content The HTML content. * * @return array */ public function extract_urls_from_content( $content ) { $extensions = array_keys( Optml_Config::$image_extensions ); if ( $this->settings->use_cdn() && ! self::should_ignore_image_tags() ) { $extensions = array_merge( $extensions, array_keys( Optml_Config::$assets_extensions ) ); } $regex = '/(?:[(|\s\';",=\]])((?:http|\/|\\\\){1}(?:[' . Optml_Config::$chars . ']{10,}\.(?:' . implode( '|', $extensions ) . ')))(?=(?:http|>|%3F|\?|"|&|,|\s|\'|\)|\||\\\\|}|\[))/Uu'; preg_match_all( $regex, $content, $urls ); return $this->normalize_urls( $urls[1] ); } /** * Normalize extracted urls. * * @param array $urls Raw urls extracted. * * @return array Normalized array. */ private function normalize_urls( $urls ) { $urls = array_map( function ( $value ) { $value = str_replace( '"', '', $value ); return rtrim( $value, '\\";\'' ); }, $urls ); $urls = array_unique( $urls ); return array_values( $urls ); } /** * Process string content and replace possible urls. * * @param string $html String content. * @param array $extracted_urls Urls to check. * * @return string Processed html. */ public function do_url_replacement( $html, $extracted_urls ) { $extracted_urls = apply_filters( 'optml_extracted_urls', $extracted_urls ); if ( empty( $extracted_urls ) ) { return $html; } $slashed_config = addcslashes( Optml_Config::$service_url, '/' ); $extracted_urls = array_filter( $extracted_urls, function ( $value ) use ( $slashed_config ) { return strpos( $value, Optml_Config::$service_url ) === false && strpos( $value, $slashed_config ) === false || Optml_Media_Offload::is_not_processed_image( $value ) || $this->tag_replacer->url_has_dam_flag( $value ); } ); $upload_resource = $this->tag_replacer->get_upload_resource(); $urls = array_combine( $extracted_urls, $extracted_urls ); $urls = array_map( function ( $url ) use ( $upload_resource ) { $is_slashed = strpos( $url, '\/' ) !== false; $is_relative = strpos( $url, $is_slashed ? addcslashes( $upload_resource['content_path'], '/' ) : $upload_resource['content_path'] ) === 0; if ( $is_relative ) { $url = $upload_resource['content_host'] . $url; } return apply_filters( 'optml_content_url', $url ); }, $urls ); foreach ( $urls as $origin => $replace ) { $html = preg_replace( '/(?