dionysus-rb 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +61 -0
  3. data/.github/workflows/ci.yml +77 -0
  4. data/.gitignore +12 -0
  5. data/.rspec +3 -0
  6. data/.rubocop.yml +175 -0
  7. data/.rubocop_todo.yml +53 -0
  8. data/CHANGELOG.md +227 -0
  9. data/Gemfile +10 -0
  10. data/Gemfile.lock +258 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +1206 -0
  13. data/Rakefile +10 -0
  14. data/assets/logo.svg +51 -0
  15. data/bin/console +11 -0
  16. data/bin/karafka_health_check +14 -0
  17. data/bin/outbox_worker_health_check +12 -0
  18. data/bin/setup +8 -0
  19. data/dionysus-rb.gemspec +64 -0
  20. data/docker-compose.yml +44 -0
  21. data/lib/dionysus/checks/health_check.rb +50 -0
  22. data/lib/dionysus/checks.rb +7 -0
  23. data/lib/dionysus/consumer/batch_events_publisher.rb +33 -0
  24. data/lib/dionysus/consumer/config.rb +97 -0
  25. data/lib/dionysus/consumer/deserializer.rb +231 -0
  26. data/lib/dionysus/consumer/dionysus_event.rb +42 -0
  27. data/lib/dionysus/consumer/karafka_consumer_generator.rb +56 -0
  28. data/lib/dionysus/consumer/params_batch_processor.rb +65 -0
  29. data/lib/dionysus/consumer/params_batch_transformations/remove_duplicates_strategy.rb +54 -0
  30. data/lib/dionysus/consumer/params_batch_transformations.rb +4 -0
  31. data/lib/dionysus/consumer/persistor.rb +157 -0
  32. data/lib/dionysus/consumer/registry.rb +84 -0
  33. data/lib/dionysus/consumer/synced_data/assign_columns_from_synced_data.rb +27 -0
  34. data/lib/dionysus/consumer/synced_data/assign_columns_from_synced_data_job.rb +26 -0
  35. data/lib/dionysus/consumer/synced_data.rb +4 -0
  36. data/lib/dionysus/consumer/synchronizable_model.rb +93 -0
  37. data/lib/dionysus/consumer/workers_group.rb +18 -0
  38. data/lib/dionysus/consumer.rb +36 -0
  39. data/lib/dionysus/monitor.rb +48 -0
  40. data/lib/dionysus/producer/base_responder.rb +46 -0
  41. data/lib/dionysus/producer/config.rb +104 -0
  42. data/lib/dionysus/producer/deleted_record_serializer.rb +17 -0
  43. data/lib/dionysus/producer/genesis/performed.rb +11 -0
  44. data/lib/dionysus/producer/genesis/stream_job.rb +13 -0
  45. data/lib/dionysus/producer/genesis/streamer/base_job.rb +44 -0
  46. data/lib/dionysus/producer/genesis/streamer/standard_job.rb +43 -0
  47. data/lib/dionysus/producer/genesis/streamer.rb +40 -0
  48. data/lib/dionysus/producer/genesis.rb +62 -0
  49. data/lib/dionysus/producer/karafka_responder_generator.rb +133 -0
  50. data/lib/dionysus/producer/key.rb +14 -0
  51. data/lib/dionysus/producer/model_serializer.rb +105 -0
  52. data/lib/dionysus/producer/outbox/active_record_publishable.rb +74 -0
  53. data/lib/dionysus/producer/outbox/datadog_latency_reporter.rb +26 -0
  54. data/lib/dionysus/producer/outbox/datadog_latency_reporter_job.rb +11 -0
  55. data/lib/dionysus/producer/outbox/datadog_latency_reporter_scheduler.rb +47 -0
  56. data/lib/dionysus/producer/outbox/datadog_tracer.rb +32 -0
  57. data/lib/dionysus/producer/outbox/duplicates_filter.rb +26 -0
  58. data/lib/dionysus/producer/outbox/event_name.rb +26 -0
  59. data/lib/dionysus/producer/outbox/health_check.rb +48 -0
  60. data/lib/dionysus/producer/outbox/latency_tracker.rb +43 -0
  61. data/lib/dionysus/producer/outbox/model.rb +117 -0
  62. data/lib/dionysus/producer/outbox/producer.rb +26 -0
  63. data/lib/dionysus/producer/outbox/publishable.rb +106 -0
  64. data/lib/dionysus/producer/outbox/publisher.rb +131 -0
  65. data/lib/dionysus/producer/outbox/records_processor.rb +56 -0
  66. data/lib/dionysus/producer/outbox/runner.rb +120 -0
  67. data/lib/dionysus/producer/outbox/tombstone_publisher.rb +22 -0
  68. data/lib/dionysus/producer/outbox.rb +103 -0
  69. data/lib/dionysus/producer/partition_key.rb +42 -0
  70. data/lib/dionysus/producer/registry/validator.rb +32 -0
  71. data/lib/dionysus/producer/registry.rb +165 -0
  72. data/lib/dionysus/producer/serializer.rb +52 -0
  73. data/lib/dionysus/producer/suppressor.rb +18 -0
  74. data/lib/dionysus/producer.rb +121 -0
  75. data/lib/dionysus/railtie.rb +9 -0
  76. data/lib/dionysus/rb/version.rb +5 -0
  77. data/lib/dionysus/rb.rb +8 -0
  78. data/lib/dionysus/support/rspec/outbox_publishable.rb +78 -0
  79. data/lib/dionysus/topic_name.rb +15 -0
  80. data/lib/dionysus/utils/default_message_filter.rb +25 -0
  81. data/lib/dionysus/utils/exponential_backoff.rb +7 -0
  82. data/lib/dionysus/utils/karafka_datadog_listener.rb +20 -0
  83. data/lib/dionysus/utils/karafka_sentry_listener.rb +9 -0
  84. data/lib/dionysus/utils/null_error_handler.rb +6 -0
  85. data/lib/dionysus/utils/null_event_bus.rb +5 -0
  86. data/lib/dionysus/utils/null_hermes_event_producer.rb +5 -0
  87. data/lib/dionysus/utils/null_instrumenter.rb +7 -0
  88. data/lib/dionysus/utils/null_lock_client.rb +13 -0
  89. data/lib/dionysus/utils/null_model_factory.rb +5 -0
  90. data/lib/dionysus/utils/null_mutex_provider.rb +7 -0
  91. data/lib/dionysus/utils/null_retry_provider.rb +7 -0
  92. data/lib/dionysus/utils/null_tracer.rb +5 -0
  93. data/lib/dionysus/utils/null_transaction_provider.rb +15 -0
  94. data/lib/dionysus/utils/sidekiq_batched_job_distributor.rb +24 -0
  95. data/lib/dionysus/utils.rb +6 -0
  96. data/lib/dionysus/version.rb +7 -0
  97. data/lib/dionysus-rb.rb +3 -0
  98. data/lib/dionysus.rb +133 -0
  99. data/lib/tasks/dionysus.rake +18 -0
  100. data/log/development.log +0 -0
  101. data/sig/dionysus/rb.rbs +6 -0
  102. metadata +585 -0
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
9
+
10
+ import("./lib/tasks/dionysus.rake")
data/assets/logo.svg ADDED
@@ -0,0 +1,51 @@
1
+ <svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="1024" height="1024" rx="512" fill="white"/>
3
+ <g clip-path="url(#clip0_411_914)">
4
+ <rect x="216.142" y="216.143" width="591.715" height="591.715" rx="295.858" fill="white"/>
5
+ <path d="M673.388 378.096L661.534 363.856C661.515 363.834 661.503 363.806 661.5 363.777C661.496 363.748 661.501 363.719 661.513 363.693L671.944 342.057C671.97 342.002 672.013 341.975 672.073 341.975H711.952C712.014 341.975 712.058 342.002 712.084 342.057L722.529 363.727C722.537 363.744 722.54 363.763 722.538 363.782C722.535 363.8 722.527 363.818 722.515 363.832L710.609 378.129C710.606 378.133 710.604 378.138 710.603 378.143C710.602 378.148 710.603 378.153 710.605 378.158C710.607 378.162 710.611 378.166 710.615 378.169C710.619 378.172 710.624 378.173 710.629 378.174L720.293 378.172C720.31 378.172 720.326 378.176 720.341 378.184C720.355 378.192 720.367 378.204 720.374 378.218L722.598 382.285C722.626 382.339 722.621 382.389 722.582 382.436L712.755 394.238C712.749 394.245 712.745 394.254 712.743 394.263C712.741 394.272 712.741 394.282 712.743 394.291C712.745 394.3 712.749 394.308 712.755 394.315C712.761 394.322 712.769 394.327 712.777 394.331L737.648 404.421C737.668 404.43 737.686 404.446 737.696 404.465C737.707 404.485 737.71 404.508 737.706 404.53L725.71 469.578C725.701 469.63 725.67 469.655 725.617 469.655H658.428C658.401 469.655 658.374 469.646 658.353 469.629C658.332 469.611 658.318 469.587 658.313 469.561L646.32 404.526C646.311 404.476 646.33 404.441 646.377 404.423L671.21 394.346C671.223 394.341 671.235 394.333 671.244 394.322C671.253 394.311 671.26 394.299 671.264 394.285C671.267 394.272 671.267 394.257 671.264 394.244C671.261 394.23 671.255 394.218 671.246 394.207L661.436 382.428C661.404 382.389 661.4 382.348 661.424 382.304L663.63 378.253C663.643 378.228 663.662 378.208 663.686 378.194C663.71 378.179 663.738 378.172 663.766 378.172H673.352C673.419 378.172 673.431 378.147 673.388 378.096ZM689.147 346.184C689.151 346.175 689.153 346.166 689.153 346.156C689.152 346.146 689.149 346.137 689.144 346.128C689.139 346.12 689.132 346.113 689.123 346.108C689.115 346.104 689.105 346.101 689.095 346.102H676.205C676.195 346.101 676.186 346.104 676.177 346.108C676.168 346.113 676.161 346.12 676.156 346.128C676.151 346.137 676.148 346.146 676.147 346.156C676.147 346.166 676.149 346.175 676.154 346.184L682.599 359.547C682.603 359.557 682.61 359.565 682.619 359.571C682.629 359.577 682.639 359.58 682.65 359.58C682.661 359.58 682.672 359.577 682.681 359.571C682.69 359.565 682.697 359.557 682.702 359.547L689.147 346.184ZM707.87 346.181C707.874 346.172 707.875 346.163 707.875 346.154C707.875 346.145 707.872 346.136 707.867 346.128C707.862 346.12 707.856 346.114 707.848 346.109C707.84 346.104 707.831 346.102 707.821 346.102H694.942C694.932 346.102 694.923 346.104 694.915 346.109C694.907 346.114 694.901 346.12 694.896 346.128C694.891 346.136 694.888 346.145 694.888 346.154C694.888 346.163 694.89 346.172 694.894 346.181L701.332 359.547C701.336 359.557 701.343 359.565 701.352 359.57C701.361 359.576 701.371 359.579 701.382 359.579C701.392 359.579 701.402 359.576 701.411 359.57C701.42 359.565 701.427 359.557 701.431 359.547L707.87 346.181ZM685.329 361.752C685.325 361.761 685.323 361.77 685.323 361.78C685.324 361.79 685.327 361.8 685.332 361.809C685.338 361.817 685.345 361.824 685.354 361.829C685.363 361.834 685.373 361.836 685.383 361.836H698.651C698.661 361.836 698.671 361.834 698.68 361.829C698.688 361.824 698.696 361.817 698.701 361.809C698.706 361.8 698.71 361.79 698.71 361.78C698.711 361.77 698.709 361.761 698.704 361.752L692.07 347.986C692.065 347.976 692.058 347.967 692.048 347.961C692.039 347.955 692.028 347.952 692.017 347.952C692.005 347.952 691.994 347.955 691.985 347.961C691.975 347.967 691.968 347.976 691.963 347.986L685.329 361.752ZM667.041 361.76C667.038 361.768 667.036 361.777 667.037 361.786C667.037 361.795 667.04 361.804 667.045 361.811C667.05 361.819 667.056 361.825 667.064 361.829C667.072 361.833 667.081 361.836 667.09 361.836H679.925C679.933 361.836 679.942 361.833 679.95 361.829C679.958 361.825 679.965 361.819 679.969 361.811C679.974 361.804 679.977 361.795 679.978 361.786C679.978 361.777 679.976 361.768 679.973 361.76L673.555 348.449C673.551 348.44 673.544 348.432 673.536 348.427C673.527 348.421 673.517 348.418 673.507 348.418C673.497 348.418 673.487 348.421 673.479 348.427C673.47 348.432 673.463 348.44 673.459 348.449L667.041 361.76ZM704.052 361.762C704.048 361.77 704.047 361.778 704.047 361.787C704.048 361.796 704.05 361.804 704.055 361.812C704.059 361.819 704.066 361.825 704.074 361.829C704.081 361.834 704.09 361.836 704.098 361.836H716.937C716.946 361.836 716.954 361.834 716.962 361.829C716.969 361.825 716.976 361.819 716.98 361.812C716.985 361.804 716.988 361.796 716.988 361.787C716.989 361.778 716.987 361.77 716.983 361.762L710.564 348.445C710.56 348.437 710.553 348.429 710.545 348.424C710.537 348.419 710.527 348.416 710.518 348.416C710.508 348.416 710.498 348.419 710.49 348.424C710.482 348.429 710.475 348.437 710.471 348.445L704.052 361.762ZM681.398 365.186C681.395 365.174 681.389 365.164 681.379 365.157C681.37 365.15 681.358 365.146 681.347 365.146H668.111C668.101 365.146 668.091 365.149 668.082 365.154C668.074 365.16 668.067 365.167 668.062 365.177C668.058 365.186 668.056 365.196 668.058 365.206C668.059 365.216 668.063 365.226 668.07 365.234L678.833 378.153C678.838 378.159 678.844 378.164 678.851 378.167C678.858 378.17 678.866 378.172 678.874 378.172H684.954C684.963 378.172 684.971 378.17 684.978 378.166C684.985 378.163 684.992 378.158 684.997 378.151C685.002 378.145 685.005 378.137 685.007 378.129C685.008 378.121 685.008 378.113 685.006 378.105L681.398 365.186ZM688.461 378.132C688.464 378.144 688.471 378.154 688.481 378.161C688.49 378.168 688.502 378.172 688.514 378.172H695.513C695.525 378.172 695.536 378.168 695.546 378.161C695.556 378.154 695.563 378.144 695.566 378.132L699.172 365.216C699.174 365.208 699.175 365.2 699.173 365.191C699.172 365.183 699.168 365.175 699.163 365.168C699.158 365.161 699.151 365.155 699.143 365.152C699.136 365.148 699.127 365.146 699.119 365.146H684.91C684.901 365.146 684.893 365.148 684.885 365.152C684.877 365.155 684.87 365.161 684.865 365.168C684.86 365.175 684.857 365.183 684.855 365.191C684.853 365.2 684.854 365.208 684.856 365.216L688.461 378.132ZM715.952 365.234C715.958 365.226 715.962 365.216 715.964 365.206C715.965 365.196 715.963 365.186 715.959 365.177C715.955 365.167 715.948 365.16 715.939 365.154C715.931 365.149 715.92 365.146 715.91 365.146H702.68C702.668 365.146 702.657 365.15 702.647 365.157C702.638 365.164 702.631 365.174 702.628 365.186L699.019 378.105C699.017 378.113 699.016 378.121 699.018 378.129C699.02 378.137 699.023 378.145 699.028 378.151C699.033 378.158 699.039 378.163 699.047 378.166C699.054 378.17 699.062 378.172 699.07 378.172H705.154C705.162 378.172 705.17 378.17 705.177 378.167C705.184 378.164 705.191 378.159 705.196 378.153L715.952 365.234ZM666.83 382.299C666.82 382.299 666.811 382.302 666.802 382.307C666.794 382.312 666.788 382.32 666.784 382.328C666.779 382.337 666.778 382.347 666.779 382.357C666.78 382.366 666.784 382.376 666.79 382.383L678.095 395.947C678.1 395.953 678.104 395.961 678.106 395.969C678.107 395.977 678.107 395.985 678.105 395.993C678.103 396.001 678.099 396.008 678.094 396.014C678.089 396.02 678.082 396.025 678.074 396.028L651.024 407.006C651.012 407.01 651.003 407.018 650.997 407.028C650.991 407.039 650.989 407.051 650.991 407.063L661.764 465.484C661.766 465.496 661.772 465.507 661.782 465.515C661.791 465.523 661.803 465.527 661.816 465.527H722.211C722.223 465.527 722.235 465.523 722.245 465.515C722.254 465.507 722.26 465.496 722.262 465.484L733.036 407.063C733.038 407.051 733.035 407.039 733.029 407.028C733.023 407.018 733.014 407.01 733.003 407.006L705.956 396.03C705.948 396.027 705.941 396.022 705.936 396.016C705.931 396.01 705.927 396.002 705.925 395.995C705.923 395.987 705.923 395.978 705.924 395.97C705.926 395.963 705.93 395.955 705.935 395.949L717.231 382.383C717.237 382.376 717.241 382.366 717.242 382.357C717.243 382.347 717.242 382.337 717.238 382.328C717.234 382.32 717.227 382.312 717.219 382.307C717.211 382.302 717.201 382.299 717.191 382.299H707.159C707.152 382.299 707.144 382.301 707.137 382.304C707.131 382.307 707.125 382.312 707.12 382.318L697.703 393.629C697.699 393.635 697.693 393.64 697.686 393.643C697.679 393.646 697.671 393.648 697.664 393.648H686.368C686.36 393.648 686.353 393.646 686.346 393.643C686.339 393.64 686.333 393.635 686.328 393.629L676.902 382.318C676.897 382.312 676.891 382.307 676.884 382.304C676.877 382.301 676.87 382.299 676.862 382.299H666.83ZM682.291 382.311L688.244 389.452C688.282 389.498 688.331 389.521 688.392 389.521H695.662C695.684 389.521 695.706 389.516 695.726 389.507C695.746 389.498 695.763 389.484 695.777 389.468L701.676 382.374C701.718 382.324 701.706 382.299 701.639 382.299H682.296C682.286 382.299 682.284 382.303 682.291 382.311Z" fill="#0B0C1B"/>
6
+ <path d="M683.2 413.149C687.391 414.15 691.463 415.539 695.667 416.49C702.967 418.141 710.114 417.845 717.375 416.078C718.385 415.832 720.115 415.354 722.563 414.642C722.629 414.623 722.655 414.647 722.643 414.714L714.918 456.551C714.909 456.602 714.879 456.627 714.827 456.627H669.143C669.129 456.627 669.121 456.62 669.119 456.606L661.376 414.666C661.367 414.627 661.382 414.601 661.42 414.588C668.593 412.105 675.77 411.374 683.2 413.149Z" fill="#BC2C40"/>
7
+ <path d="M-98.803 -98.8047H1122.8V1122.8H-98.803V-98.8047ZM697.77 507L700.752 505.091C701.484 504.63 701.412 504.399 700.537 504.399H699.834C699.539 504.399 699.432 504.256 699.512 503.969L699.643 503.528C702.589 503.516 706.3 503.504 706.526 500.021C707.473 499.687 708.037 498.939 708.22 497.778C709.668 497.865 710.924 497.46 711.99 496.561C712.332 496.283 712.42 495.937 712.253 495.523C711.68 494.068 710.606 492.708 710.201 491.384C708.984 487.471 708.419 483.804 708.507 480.384C708.586 477.45 708.503 475.278 708.256 473.871L706.646 470.459C710.964 464.768 713.231 458.302 709.27 452.123C708.642 451.145 708.212 451.224 707.982 452.361C701.611 453.459 692.819 430.661 686.842 426.915C687.55 425.531 694.112 415.445 693.313 405.704C713.697 405.433 689.359 395.23 709.735 395.54C715.521 395.624 730.529 395.051 734.072 400.276C739.138 407.736 743.89 413.912 748.328 418.803C752.492 423.396 751.967 429.826 750.559 435.373C750.539 435.451 750.499 435.522 750.443 435.58C750.388 435.637 750.318 435.679 750.241 435.702C750.164 435.725 750.083 435.727 750.005 435.71C749.927 435.692 749.855 435.654 749.795 435.6C742.387 428.621 738.725 418.875 731.781 411.502C731.715 411.434 731.63 411.386 731.538 411.364C731.445 411.342 731.348 411.347 731.259 411.379C731.17 411.411 731.094 411.468 731.038 411.542C730.982 411.617 730.951 411.707 730.946 411.8C730.493 419.042 741.838 431.926 745.942 438.058C746.567 438.996 746.943 440.078 747.037 441.202C747.131 442.326 746.939 443.457 746.479 444.488L746.061 445.406C745.919 445.724 745.7 446.001 745.425 446.214C745.15 446.427 744.827 446.569 744.484 446.628C744.142 446.687 743.789 446.661 743.459 446.552C743.129 446.443 742.83 446.254 742.59 446.003C735.464 438.535 730.095 432.156 726.485 426.868C724.767 424.362 722.858 422.191 720.186 421.654C711.97 420.032 704.089 418.199 696.541 416.155C695.173 415.781 694.847 416.206 695.563 417.431C698.068 421.702 711.966 423.539 716.583 424.661C721.928 425.961 726.377 433.512 729.73 437.783C729.951 438.067 730.257 438.273 730.605 438.369C730.953 438.466 731.324 438.449 731.662 438.32C732.843 437.855 733.762 438.511 734.49 439.477C736.915 442.714 739.146 446.086 741.182 449.594C742.009 451.017 742.284 452.242 742.005 453.268C738.116 467.906 742.638 481.565 744.332 494.092C744.833 497.822 743.846 501.301 741.373 504.53C730.748 518.377 720.906 533.977 711.847 551.331C706.892 560.835 702.578 568.672 698.903 574.844C689.908 589.947 677.477 601.754 661.611 610.263C656.063 613.234 652.663 618.125 648.953 623.279C646.695 626.404 642.992 628.182 637.847 628.611C626.585 629.542 616.815 621.084 607.497 613.317C595.842 603.607 579.498 595.9 565.493 588.993C565.135 588.818 564.872 588.909 564.705 589.267L559.671 600.219C559.504 600.569 559.472 600.934 559.576 601.316C562.475 612.113 565.123 622.658 560.983 633.467C560.838 633.851 560.797 634.267 560.864 634.671C560.931 635.076 561.104 635.454 561.365 635.769C568.941 644.86 574.547 653.115 576.766 664.961C576.787 665.07 576.83 665.173 576.893 665.264C576.956 665.355 577.037 665.432 577.132 665.489C577.226 665.547 577.332 665.583 577.442 665.597C577.551 665.611 577.663 665.602 577.769 665.57C586.99 662.754 599.779 663.363 604.563 673.241C604.737 673.606 605.028 673.904 605.39 674.087C605.753 674.27 606.166 674.329 606.567 674.255C616.063 672.429 631.739 674.493 632.073 687.664C632.12 689.716 632.164 691.577 632.204 693.247C632.215 693.743 632.329 694.231 632.539 694.678C632.748 695.126 633.049 695.524 633.421 695.847C654.282 714.068 671.286 735.363 684.432 759.731C684.495 759.846 684.58 759.947 684.684 760.026C684.788 760.106 684.907 760.163 685.034 760.193C685.162 760.224 685.294 760.227 685.422 760.203C685.551 760.179 685.673 760.128 685.78 760.053C761.296 707.753 808.406 619.258 812.868 527.841C817.354 435.875 782.614 347.392 716.165 284.271C666.108 236.707 602.081 207.67 534.07 203.268C452.224 197.972 380.299 221.712 318.297 274.489C244.642 337.192 206.491 427.977 210.678 524.25C215.2 628.051 273.656 724.777 363.236 776.337C364.159 776.87 364.286 776.723 363.618 775.896C349.922 759.004 337.663 740.93 326.838 721.675C319.863 709.276 315.107 697.923 312.57 687.616C309.91 676.796 307.643 666.262 303.611 655.668C299.77 645.587 295.141 635.948 297.312 625.617C297.559 624.416 298.605 621.776 300.45 617.696C302.255 613.711 303.48 609.198 304.124 604.155C305.802 590.993 306.566 579.56 306.415 569.857C305.985 542.837 307.524 519.943 326.922 499.126C327.192 498.84 327.323 498.502 327.315 498.112C327.26 496.052 327.141 494.02 326.958 492.016C324.608 465.472 337.611 439.573 363.522 431.055C366.664 430.029 369.817 429.031 372.983 428.061C373.929 427.766 374.557 427.432 374.867 427.058C386.38 413.053 399.813 404.976 415.297 396.172C427.991 388.955 435.984 376.452 432.846 361.445C432.814 361.278 432.703 361.182 432.512 361.158C432.453 361.154 432.394 361.16 432.337 361.178C432.281 361.196 432.229 361.225 432.185 361.262C432.14 361.3 432.104 361.346 432.078 361.398C432.052 361.45 432.038 361.507 432.035 361.564C430.723 380.33 416.252 388.299 399.956 392.355C394.194 393.786 385.879 397.532 388.491 404.821C388.953 406.102 388.674 406.289 387.656 405.382C384.014 402.145 382.005 397.918 381.632 392.701C380.94 383.264 383.97 377.025 391.808 371.549C394.154 369.903 396.075 369.036 397.57 368.949C400.481 368.782 403.928 368.925 406.517 367.744C415.643 363.568 414.367 354.299 409.499 346.628C408.036 344.314 407.615 344.489 408.235 347.153C409.738 353.631 413.556 359.441 406.505 364.714C403.801 366.742 400.966 367.517 397.999 367.04C397.077 366.889 396.627 366.344 396.651 365.405C396.794 360.117 399.065 356.1 403.463 353.356C403.845 353.118 403.956 352.792 403.797 352.378C401.196 345.745 401.332 339.76 404.203 334.424C407.794 327.731 415.357 324.832 421.99 322.303C422.709 322.03 423.346 321.579 423.843 320.992C424.34 320.406 424.679 319.704 424.829 318.951C425.521 315.539 425.974 311.531 427.549 308.524C432.273 299.541 439.968 295.939 449.989 295.569C450.084 295.561 450.148 295.517 450.18 295.438C450.228 295.326 450.275 295.211 450.323 295.092C450.395 294.932 450.343 294.837 450.168 294.805C444.919 293.7 440.004 294.471 435.423 297.12C435.318 297.181 435.2 297.215 435.079 297.219C434.958 297.224 434.837 297.199 434.727 297.146C434.616 297.093 434.52 297.015 434.446 296.917C434.372 296.819 434.323 296.704 434.301 296.583C432.345 285.178 439.777 280.275 449.249 276.946C449.799 276.755 450.27 276.387 450.591 275.9C450.912 275.413 451.065 274.834 451.027 274.25C450.001 258.288 457.159 252.228 472.656 251.262C473.175 251.228 473.68 251.077 474.131 250.818C474.581 250.56 474.967 250.201 475.256 249.77C480.004 242.696 483.667 237.292 493.521 239.69C496.877 240.501 499.167 241.563 500.392 242.875C502.858 245.5 503.271 245.209 501.633 242.004C500.352 239.499 498.062 238.139 494.761 237.924C492.797 237.797 492.686 237.272 494.427 236.35C510.986 227.641 516.271 248.184 530.181 249.114C543.757 250.021 555.09 250.116 561.568 264.432C562.045 265.474 561.719 265.892 560.59 265.685C556.152 264.85 551.738 264.361 547.157 263.191C536.909 260.567 525.767 261.187 516.76 260.185C516.418 260.145 516.084 260.066 515.758 259.947L513.742 259.183C513.642 259.148 513.533 259.148 513.433 259.182C513.333 259.216 513.247 259.283 513.19 259.37C513.133 259.458 513.108 259.562 513.12 259.664C513.131 259.767 513.178 259.862 513.253 259.935C515.877 262.535 528.976 263.12 533.473 263.311C548.087 263.931 562.534 276.708 556.056 292.813C555.961 293.044 556.025 293.227 556.247 293.362C556.486 293.497 556.701 293.441 556.891 293.195C562.606 285.834 558.884 274.668 553.169 268.476C552.597 267.864 552.72 267.653 553.539 267.844C557.75 268.834 562.677 269.586 566.256 271.614C574.13 276.099 582.731 286.872 574.249 295.342C574.146 295.445 574.09 295.549 574.082 295.652C574.074 295.795 574.102 295.919 574.166 296.022C574.325 296.261 574.524 296.304 574.762 296.153C580.775 292.252 581.431 286.514 578.353 280.179C577.924 279.297 578.118 279.126 578.938 279.666C585.3 283.89 587.432 289.807 585.332 297.418C584.895 298.993 583.376 300.257 580.775 301.212C580.695 301.243 580.675 301.299 580.715 301.379C582.409 304.671 584.342 306.21 583.232 310.72C581.097 319.333 564.944 323.616 567.449 331.334C568.058 333.159 567.938 334.245 567.927 336.022C567.927 336.333 567.771 336.488 567.461 336.488H566.948C566.702 336.488 566.57 336.361 566.555 336.106C566.292 330.897 566.451 325.707 567.032 320.538C567.604 315.408 565.35 306.222 558.812 308.262C549.769 311.077 550.33 322.47 555.186 329.151C555.196 329.164 555.205 329.179 555.211 329.194C555.216 329.21 555.218 329.226 555.217 329.241C555.216 329.256 555.211 329.27 555.204 329.281C555.196 329.293 555.186 329.301 555.174 329.306C555.134 329.33 555.094 329.338 555.054 329.33C555.007 329.33 554.955 329.298 554.899 329.234C550.855 324.88 541.765 319.81 535.549 322.458C535.368 322.538 535.214 322.669 535.105 322.834C534.996 323 534.938 323.193 534.936 323.391C534.935 323.589 534.991 323.783 535.098 323.95C535.204 324.117 535.357 324.249 535.537 324.331L558.442 334.603C558.616 334.68 558.77 334.796 558.891 334.943C559.012 335.09 559.096 335.263 559.138 335.449C559.18 335.635 559.178 335.827 559.131 336.012C559.085 336.197 558.996 336.368 558.872 336.512C557.44 338.19 556.709 340.118 556.677 342.298C556.573 350.537 556.649 358.792 556.903 367.064C556.919 367.43 556.776 367.505 556.474 367.29L549.722 362.483C549.292 362.18 548.91 362.232 548.576 362.638L548.254 363.008C548.216 363.052 548.188 363.104 548.173 363.161C548.157 363.217 548.153 363.276 548.162 363.334C548.171 363.392 548.193 363.447 548.225 363.495C548.258 363.544 548.3 363.585 548.35 363.616L556.534 368.829C556.844 369.02 556.971 369.295 556.915 369.652C556.891 369.875 556.828 370.09 556.724 370.297C556.647 370.464 556.53 370.612 556.383 370.73C556.237 370.848 556.064 370.932 555.878 370.977C554.056 371.398 552.251 371.343 550.461 370.81C550.316 370.766 550.162 370.765 550.016 370.806C549.871 370.847 549.74 370.928 549.639 371.041C549.537 371.153 549.47 371.292 549.445 371.441C549.419 371.59 549.437 371.744 549.495 371.883C551.571 376.775 549.948 379.029 547.312 382.942C547.02 383.37 546.833 383.862 546.767 384.376C546.7 384.89 546.756 385.412 546.93 385.901C548.672 390.792 550.939 395.862 551.619 401.111C551.641 401.292 551.622 401.476 551.565 401.649C551.507 401.821 551.412 401.979 551.286 402.109C551.16 402.24 551.006 402.34 550.837 402.403C550.667 402.466 550.486 402.489 550.306 402.471L549.901 402.435C548.549 402.308 547.662 401.6 547.24 400.312C546.167 397.007 540.631 381.01 535.394 381.88C535.036 381.944 534.754 381.829 534.547 381.535C532.877 379.256 529.095 379.996 528.069 382.572C524.335 391.925 539.474 392.88 535.8 402.722C535.753 402.884 535.767 403.058 535.84 403.211C535.912 403.363 536.039 403.484 536.194 403.55C536.35 403.616 536.524 403.623 536.685 403.569C536.845 403.516 536.98 403.405 537.064 403.259L539.892 397.401C540.005 397.169 540.179 396.971 540.395 396.828C540.611 396.686 540.86 396.603 541.118 396.59C541.375 396.577 541.63 396.633 541.858 396.752C542.085 396.872 542.275 397.051 542.409 397.27C544.21 400.228 545.332 403.02 547.849 405.442C550.151 407.661 553.002 410.047 554.279 412.85C556.82 418.469 555.901 424.434 554.291 430.184C551.487 440.217 553.837 451.646 564.467 455.666C564.638 455.729 564.782 455.851 564.872 456.009C564.963 456.168 564.995 456.353 564.962 456.533C564.929 456.713 564.834 456.875 564.693 456.991C564.552 457.108 564.375 457.171 564.192 457.169H557.619C557.559 457.171 557.501 457.19 557.451 457.223C557.402 457.257 557.362 457.303 557.337 457.358C557.313 457.412 557.304 457.473 557.311 457.532C557.319 457.591 557.343 457.647 557.381 457.694C563.91 465.448 568.304 474.256 570.563 484.118C572.018 490.501 573.223 499.83 566.268 504.697C566.131 504.793 566.026 504.927 565.965 505.083C565.904 505.238 565.891 505.409 565.927 505.572C565.962 505.735 566.046 505.884 566.166 506C566.286 506.116 566.438 506.194 566.602 506.224C569.298 506.757 571.935 507.835 574.512 509.457C591.977 520.504 602.272 534.999 612.257 552.679C614.441 556.544 618.008 555.768 621.658 555.733C621.714 555.73 621.769 555.742 621.818 555.769C621.868 555.795 621.909 555.834 621.939 555.882C621.969 555.93 621.987 555.985 621.99 556.043C621.993 556.1 621.981 556.158 621.956 556.21C620.493 559.176 619.284 562.278 618.33 565.515C618.29 565.634 618.282 565.742 618.306 565.837C618.338 565.956 618.393 566.06 618.473 566.147C618.664 566.346 618.831 566.33 618.974 566.099C631.118 547.286 647.474 539.544 668.53 533.973C670.781 533.376 672.777 532.303 674.519 530.752C682.742 523.435 690.612 515.764 698.128 507.739C698.311 507.54 698.335 507.33 698.199 507.107C698.056 506.876 697.913 506.841 697.77 507ZM499.044 264.969C492.586 266.082 486.116 266.17 479.634 265.231C469.924 263.824 458.698 266.377 456.061 277.257C455.974 277.615 456.014 277.941 456.181 278.235C456.387 278.617 456.578 278.609 456.753 278.211C459.028 273.121 462.551 269.661 467.323 267.832C469.582 266.973 473.367 266.587 478.68 266.675C484.502 266.77 490.316 266.643 496.121 266.293C504.424 265.784 509.821 265.8 512.31 266.341C518.911 267.772 524.124 271.379 527.95 277.161C529.421 279.38 529.823 279.201 529.155 276.624C527.779 271.272 523.961 267.597 517.702 265.601C512.469 263.931 506.25 263.72 499.044 264.969ZM517.273 298.79C517.619 299.744 517.523 300.901 517.822 301.76C518.339 303.248 518.796 303.228 519.194 301.701C521.472 292.908 509.912 285.572 502.54 287.814C501.108 288.252 501.136 288.55 502.623 288.709C509.578 289.437 514.803 292.026 517.273 298.79ZM476.175 310.815C476.509 307.498 478.104 305.932 480.959 306.115C488.343 306.592 490.813 312.593 493.282 318.677C493.313 318.754 493.368 318.817 493.437 318.856C493.716 319.023 493.926 318.919 494.069 318.545C494.109 318.452 494.125 318.345 494.117 318.235C493.819 311.936 490.085 304.087 483.261 303.18C476.246 302.249 474.6 311.614 473.204 317.245C471.2 325.393 473.002 335.975 481.925 338.969C482.084 339.025 482.199 338.981 482.271 338.838L482.426 338.528C482.569 338.257 482.498 338.059 482.211 337.931C471.88 333.291 475.352 319.058 476.175 310.815ZM482.498 327.23C483.046 323.437 484.74 321.206 488.451 319.929C488.618 319.874 488.729 319.798 488.785 319.703C488.848 319.599 488.876 319.492 488.868 319.381C488.865 319.218 488.798 319.063 488.682 318.95C488.566 318.836 488.41 318.772 488.248 318.772C484.275 318.724 477.821 323.305 480.792 327.636C481.706 328.956 482.275 328.821 482.498 327.23ZM510.902 345.471C514.028 342.186 514.239 338.754 511.535 335.175C511.439 335.048 511.312 335.008 511.153 335.056C511.057 335.088 510.958 335.12 510.855 335.152C510.584 335.239 510.497 335.418 510.592 335.688C511.729 338.886 511.566 341.96 510.103 344.91C509.125 346.875 509.391 347.061 510.902 345.471ZM544.89 335.319L541.049 335.665C541.008 335.668 540.968 335.679 540.932 335.697C540.895 335.716 540.863 335.741 540.836 335.772C540.81 335.803 540.789 335.839 540.777 335.878C540.764 335.917 540.759 335.958 540.762 335.999L540.786 336.213C540.831 336.717 541.091 337.18 541.509 337.502C541.928 337.824 542.47 337.978 543.017 337.931L543.351 337.895C543.898 337.846 544.404 337.601 544.759 337.212C545.114 336.823 545.29 336.322 545.248 335.82L545.236 335.605C545.233 335.563 545.222 335.522 545.203 335.485C545.183 335.448 545.157 335.415 545.125 335.388C545.092 335.361 545.055 335.341 545.014 335.329C544.974 335.317 544.932 335.314 544.89 335.319ZM536.575 357.675C536.281 358.168 536.086 358.606 535.991 358.987C535.966 359.082 535.964 359.182 535.985 359.278C536.005 359.374 536.047 359.463 536.107 359.54C536.167 359.616 536.244 359.677 536.331 359.718C536.419 359.759 536.515 359.778 536.611 359.775C543.9 359.512 548.398 353.774 545.475 346.867C545.324 346.517 545.089 346.234 544.771 346.02C541.653 343.976 538.842 341.097 536.337 337.383C535.883 336.714 535.267 336.428 534.487 336.524C534.114 336.571 533.899 336.786 533.843 337.168C532.805 344.361 540.691 350.875 536.575 357.675ZM487.353 349.682C488.92 347.543 490.952 345.972 493.449 344.97C493.591 344.911 493.705 344.801 493.77 344.662C493.834 344.523 493.843 344.364 493.795 344.218L493.7 343.896C493.652 343.753 493.552 343.701 493.401 343.741C489.333 344.779 483.488 348.429 484.514 353.273C484.896 355.054 485.397 355.086 486.017 353.368C486.423 352.271 486.613 350.696 487.353 349.682ZM511.881 360.49C512.93 359.81 514.35 359.524 515.352 358.928C516.227 358.395 516.151 358.148 515.125 358.188C511.093 358.363 508.091 360.339 506.119 364.117C505.053 366.161 505.005 367.899 505.975 369.33C506.938 370.754 507.395 370.607 507.347 368.889C507.244 365.334 508.755 362.534 511.881 360.49ZM468.755 368.949C471.999 363.234 475.817 363.914 480.112 360.956C481.257 360.168 481.138 359.779 479.754 359.787C474.083 359.818 470.099 362.753 467.8 368.591C467.768 368.67 467.78 368.738 467.836 368.794L468.039 369.02C468.309 369.322 468.548 369.299 468.755 368.949ZM541.419 365.68C539.534 364.594 536.849 365.012 534.642 365.453C534.253 365.525 533.923 365.712 533.652 366.014C530.348 369.569 526.101 369.664 520.923 370.058C518.291 370.265 516.692 372.015 516.128 375.307C516.072 375.665 516.207 375.768 516.533 375.617C526.005 371.346 539.331 375.021 547.049 368.579C547.125 368.517 547.182 368.436 547.216 368.345C547.25 368.253 547.259 368.155 547.242 368.059C547.225 367.963 547.183 367.873 547.119 367.799C547.056 367.725 546.974 367.668 546.882 367.636L541.967 365.93C541.776 365.867 541.594 365.783 541.419 365.68ZM475.399 379.435C469.761 385.074 468.039 391.186 470.234 397.771C471.653 402.03 476.175 407.529 477.439 411.764C479.837 419.722 469.005 425.09 475.9 432.94C476.346 433.449 476.525 433.369 476.437 432.701C475.543 425.973 478.656 423.253 479.992 418.839C484.204 404.893 466.607 398.344 475.578 381.869C476.048 381.018 476.322 380.409 476.401 380.043C476.712 378.659 476.378 378.457 475.399 379.435ZM509.161 403.879C509.121 401.095 510.974 397.326 514.72 392.569C514.764 392.511 514.795 392.443 514.81 392.37C514.826 392.298 514.825 392.223 514.807 392.152C514.79 392.08 514.758 392.013 514.711 391.955C514.665 391.897 514.607 391.85 514.541 391.818L514.195 391.651C513.614 391.373 513.105 391.464 512.668 391.925C501.12 404.034 505.081 409.259 515.603 419.221C525.648 428.729 508.815 436.256 513.932 444.225C515.611 446.826 515.976 446.651 515.03 443.7C514.608 442.412 514.744 440.829 515.436 438.952C516.7 435.505 520.554 431.771 521.353 428.8C522.323 425.189 521.277 421.412 518.215 417.467C514.863 413.136 509.268 410.464 509.161 403.879ZM729.712 410.032C729.801 409.403 728.421 408.593 725.876 407.781C723.331 406.969 719.829 406.222 716.141 405.704C712.454 405.185 708.882 404.939 706.212 405.017C703.541 405.096 701.992 405.494 701.903 406.124C701.814 406.754 703.195 407.564 705.74 408.375C708.285 409.187 711.786 409.934 715.474 410.453C719.162 410.971 722.733 411.218 725.404 411.139C728.074 411.06 729.624 410.662 729.712 410.032ZM540.822 426.868C540.416 429.814 537.529 433.477 537.649 436.543C537.816 440.587 540.452 442.126 543.673 444.297C545.964 445.836 545.618 451.121 547.205 453.471C548.04 454.704 548.58 454.584 548.827 453.113C550.33 443.987 542.969 443.593 541.419 436.841C540.643 433.429 543.447 430.053 543.912 427.297C545.069 420.497 538.973 414.282 533.402 411.442C532.638 411.053 532.507 411.204 533.008 411.896C536.527 416.787 541.776 419.996 540.822 426.868ZM707.576 436.531C709.198 436.519 710.749 437.378 712.026 438.726C716.36 443.291 721.216 448.043 726.592 452.982C727.324 453.658 728.171 453.865 729.133 453.602L729.777 453.423C729.93 453.382 730.07 453.302 730.183 453.191C730.297 453.081 730.38 452.943 730.426 452.792C730.471 452.64 730.477 452.479 730.443 452.325C730.409 452.17 730.336 452.027 730.231 451.908C723.478 444.249 715.128 433.667 704.033 432.439C698.999 431.89 694.787 431.437 691.769 429.289C689.868 427.929 688.373 427.015 687.284 426.545C686.886 426.378 686.739 426.502 686.842 426.915C688.572 433.882 701.719 436.531 707.576 436.531ZM424.471 434.968C438.692 434.769 452.669 436.841 466.404 441.183C468.003 441.692 469.594 442.098 471.176 442.4C471.261 442.418 471.35 442.411 471.431 442.379C471.512 442.347 471.581 442.292 471.631 442.221C471.681 442.149 471.708 442.065 471.71 441.978C471.712 441.891 471.688 441.805 471.642 441.732C469.124 437.7 461.537 434.956 457.159 433.751C437.296 428.287 415.369 427.989 395.78 434.849C395.247 435.031 395.025 435.437 395.112 436.065C395.168 436.519 395.426 436.737 395.888 436.721C418.721 435.707 430.818 451.347 422.491 473.083C422.459 473.168 422.45 473.26 422.464 473.349C422.479 473.439 422.516 473.523 422.572 473.594C422.629 473.665 422.702 473.72 422.786 473.754C422.871 473.788 422.962 473.799 423.052 473.787C423.298 473.747 423.521 473.576 423.72 473.274C431.657 460.891 431.756 448.401 424.018 435.803C423.968 435.721 423.94 435.627 423.937 435.531C423.935 435.434 423.958 435.339 424.004 435.255C424.05 435.17 424.117 435.099 424.199 435.049C424.281 434.998 424.375 434.97 424.471 434.968ZM489.858 454.318C490.009 455.519 490.22 456.744 490.491 457.992C490.658 458.772 490.876 458.787 491.147 458.04C493.187 452.421 491.349 446.301 486.422 442.841C486.284 442.747 486.119 442.701 485.952 442.71C485.785 442.719 485.625 442.783 485.498 442.891C485.371 443 485.282 443.147 485.247 443.31C485.211 443.474 485.23 443.644 485.301 443.796C487.329 447.983 489.214 449.2 489.858 454.318ZM531.839 462.001C532.674 459.03 532.364 452.051 528.487 451.24C527.167 450.97 526.872 451.399 527.604 452.528C529.549 455.547 529.823 458.851 531.314 462.036C531.529 462.498 531.704 462.486 531.839 462.001ZM561.938 560.469C561.111 555.108 559.723 549.891 557.774 544.817C557.424 543.918 557.281 543.107 557.345 542.383C557.448 541.238 557.734 540.431 558.204 539.961C559.731 538.403 559.464 537.981 557.404 538.697C555.233 539.46 552.835 540.725 550.438 540.892C536.718 541.854 523.926 539.043 512.06 532.458C511.312 532.044 510.974 531.408 511.045 530.549C512.954 508.216 498.03 482.52 480.541 469.552C478.107 467.751 472.811 464.697 470.317 468.013C470.202 468.169 470.124 468.35 470.089 468.542C470.053 468.734 470.062 468.933 470.115 469.123C470.711 471.135 471.701 472.944 473.085 474.551C479.686 482.17 485.902 490.087 491.731 498.303C493.044 500.152 497.052 506.32 495.131 508.491C491.672 512.38 488.307 517.033 491.779 521.876C494.38 525.503 501.132 524.059 502.42 529.105C503.558 533.559 502.496 537.739 499.235 541.644C493.429 548.571 486.148 553.14 477.392 555.351C477.298 555.373 477.217 555.431 477.164 555.513C477.111 555.595 477.09 555.694 477.105 555.792L477.165 556.162C477.245 556.631 477.523 556.846 478 556.806C482.661 556.385 487.281 555.597 491.862 554.444C495.195 553.601 497.418 553.255 498.531 553.406C506.954 554.504 509.483 570.859 511.153 577.278C511.294 577.814 511.616 578.283 512.065 578.606C512.514 578.928 513.061 579.083 513.61 579.043C521.699 578.447 519.026 558.524 517.905 553.311C517.404 550.996 517.221 549.477 517.356 548.754C518.132 544.626 524.789 545.139 527.771 546.344C543.816 552.822 546.381 568.867 547.968 583.946C548.025 584.498 548.289 585.007 548.705 585.37C549.122 585.733 549.66 585.924 550.211 585.903C561.222 585.557 563.155 568.33 561.938 560.469ZM565.588 508.729C563.417 503.85 562.188 498.434 560.113 494.008C554.919 482.89 546.962 474.209 536.241 467.966C536.164 467.921 536.078 467.895 535.99 467.888C535.902 467.88 535.813 467.893 535.731 467.923C535.648 467.954 535.574 468.003 535.514 468.066C535.454 468.129 535.409 468.205 535.382 468.288C534.141 471.97 531.978 474.968 528.892 477.283C528.817 477.337 528.755 477.406 528.708 477.486C528.661 477.566 528.631 477.656 528.62 477.748C528.609 477.841 528.616 477.935 528.643 478.026C528.669 478.116 528.714 478.2 528.773 478.273C536.933 487.9 542.313 496.835 543.924 509.6C544.723 515.995 544.711 523.296 550.223 527.734C554.088 530.847 559.659 531.277 563.405 527.936C568.523 523.379 568.165 514.515 565.588 508.729ZM474.827 784.569C475.03 788.124 471.976 796.88 467.311 794.339C465.832 793.54 465.283 791.763 464.567 790.271C464.495 790.123 464.382 789.999 464.241 789.914C464.1 789.829 463.937 789.788 463.772 789.794C463.608 789.8 463.449 789.854 463.314 789.95C463.18 790.045 463.077 790.178 463.016 790.331C460.535 796.546 468.91 799.207 473.109 797.036C477.905 794.542 479.79 788.41 479.098 783.197C479.048 782.825 478.868 782.483 478.591 782.23C478.314 781.977 477.957 781.829 477.583 781.813C472.906 781.622 468.158 781.276 463.338 780.775C453.616 779.761 447.209 777.196 437.284 773.379C428.587 770.039 420.606 770.898 411.993 771.053C406.768 771.136 404.227 769.013 402.115 764.157C399.634 758.479 396.401 752.406 394.373 747.312C389.672 735.49 385.044 720.101 384.96 707.324C384.936 702.969 395.184 696.277 398.596 694.523C398.671 694.485 398.736 694.43 398.787 694.362C398.838 694.295 398.872 694.216 398.888 694.132C398.904 694.049 398.901 693.962 398.88 693.879C398.858 693.796 398.818 693.718 398.763 693.652C389.076 682.427 381.679 670.425 379.019 655.74C378.244 651.505 378.196 647.806 375.011 644.156C369.941 638.358 366.684 632.214 364.942 624.639C364.821 624.106 364.855 623.549 365.041 623.035C365.227 622.521 365.557 622.072 365.992 621.74C372.696 616.694 377.862 610.43 383.099 603.32C400.695 579.449 405.097 553.359 401.566 523.952C401.508 523.458 401.569 522.957 401.746 522.491C401.922 522.026 402.209 521.61 402.58 521.28C403.559 520.405 404.366 519.395 405.002 518.249C405.052 518.17 405.072 518.076 405.059 517.983C405.045 517.89 404.999 517.805 404.929 517.743C404.858 517.681 404.768 517.647 404.674 517.645C404.581 517.644 404.49 517.676 404.417 517.736L387.895 530.728C385.962 532.247 386.237 532.728 388.718 532.171C389.139 532.076 390.134 531.599 391.7 530.74C391.848 530.658 392.014 530.615 392.183 530.612C392.352 530.61 392.519 530.65 392.669 530.728C392.819 530.806 392.947 530.92 393.042 531.059C393.138 531.198 393.197 531.359 393.215 531.527C396.532 561.363 388.67 603.809 361.268 621.644C360.075 622.424 359.156 622.177 358.512 620.905L353.692 611.445C353.032 610.156 352.404 610.172 351.807 611.492C349.397 616.789 359.705 637.487 362.103 643.273C369.237 660.476 371.79 676.951 373.34 695.716C375.321 719.719 384.65 742.505 395.446 765.398C397.665 770.086 400.66 772.902 405.479 773.987C421.02 777.487 439.427 780.934 460.702 784.33C463.971 784.855 468.46 784.756 474.171 784.032C474.584 783.976 474.803 784.155 474.827 784.569ZM516.167 614.033C516.56 614.03 516.947 613.767 517.306 613.261C517.665 612.755 517.989 612.015 518.259 611.083C518.529 610.151 518.74 609.046 518.88 607.83C519.019 606.615 519.086 605.312 519.074 603.998C519.051 601.344 518.713 598.801 518.135 596.929C517.557 595.056 516.787 594.009 515.993 594.016C515.599 594.019 515.212 594.281 514.853 594.787C514.494 595.293 514.171 596.034 513.901 596.965C513.631 597.897 513.42 599.003 513.28 600.218C513.14 601.434 513.074 602.736 513.086 604.05C513.109 606.705 513.446 609.248 514.024 611.12C514.602 612.992 515.373 614.04 516.167 614.033ZM560.757 643.392C557.81 639.241 552.847 633.717 552.656 628.611C552.454 623.243 552.931 614.94 550.39 610.156C550.32 610.02 550.216 609.904 550.088 609.82C549.96 609.736 549.812 609.687 549.659 609.677C549.507 609.668 549.354 609.698 549.216 609.765C549.079 609.832 548.961 609.934 548.875 610.061C538.019 625.915 549.567 650.884 555.03 666.739C556.939 672.286 559.743 679.706 564.622 682.343C564.972 682.534 565.338 682.574 565.72 682.462C568.392 681.667 570.126 679.85 570.921 677.01C573.796 666.739 566.889 652.053 560.757 643.392ZM525.457 643.058C523.441 639.551 521.532 633.395 519.134 631.594C511.892 626.142 507.884 644.084 516.581 648.701C518.824 649.894 520.601 648.904 522.76 650.884C524.319 652.324 525.922 653.716 527.568 655.06C530.026 657.076 532.018 660.118 535.108 662.074C535.185 662.125 535.275 662.153 535.367 662.156C535.459 662.159 535.55 662.136 535.63 662.091C535.711 662.045 535.777 661.978 535.821 661.897C535.866 661.817 535.887 661.725 535.883 661.633C535.657 654.917 528.654 648.618 525.457 643.058ZM596.14 697.84C599.743 692.018 602.964 682.367 599.433 675.913C595.866 669.363 587.694 667.395 580.596 668.54C580.047 668.628 579.574 668.854 579.176 669.22C579.101 669.292 579.047 669.383 579.022 669.484C578.997 669.585 579 669.691 579.033 669.79C579.065 669.888 579.125 669.976 579.206 670.042C579.286 670.108 579.383 670.15 579.486 670.163C588.792 671.165 595.651 675.066 594.542 685.91C592.227 708.576 562.928 722.164 543.208 721.27C540.043 721.127 539.967 721.683 542.981 722.94C544.055 723.385 545.658 723.644 547.789 723.715C567.211 724.324 586.251 713.838 596.14 697.84ZM518.275 687.222C510.409 685.902 502.058 685.671 493.222 686.53C492.053 686.65 491.616 687.119 491.91 687.938C492 688.182 492.155 688.396 492.36 688.556C492.564 688.716 492.809 688.816 493.067 688.845C502.683 690.002 512.083 690.742 521.401 692.77C532.579 695.191 545.558 698.794 555.543 699.295C563.107 699.689 573.963 699.092 580.345 694.607C584.457 691.72 585.805 688.049 584.39 683.596C583.888 682.013 583.463 682.033 583.113 683.655C579.737 699.653 551.404 694.607 541.538 690.61C529.513 685.731 517.154 679.098 507.276 674.756C489.56 666.977 467.896 665.916 450.466 675.567C449.019 676.37 447.722 677.368 446.577 678.561C446.378 678.76 446.414 678.82 446.685 678.74C460.03 674.469 472.934 673.062 485.397 674.517C496.611 675.841 508.457 680.744 518.633 686.172C520.645 687.246 520.526 687.596 518.275 687.222ZM609.931 732.209C609.939 732.249 609.86 732.714 609.693 733.605C604.372 761.712 589.591 782.601 563.286 794.459C543.522 803.358 522.955 807.045 501.585 805.518C494.38 805.005 488.844 804.146 483.81 801.473C483.571 801.346 483.432 801.418 483.392 801.688L483.297 802.273C483.273 802.392 483.317 802.483 483.428 802.547C495.966 809.753 513.73 810.289 528.403 809.061C570.253 805.565 604.587 779.451 614.703 738.103C619.038 720.391 620.191 703.081 618.163 686.172C617.622 681.615 615.041 679.178 610.42 678.859C609.052 678.764 607.839 679.007 606.782 679.587C606.669 679.65 606.576 679.744 606.515 679.858C606.454 679.972 606.428 680.102 606.439 680.231C606.451 680.359 606.499 680.482 606.579 680.584C606.659 680.686 606.767 680.762 606.889 680.804C611.792 682.522 614.822 684.574 614.309 690.36C612.401 711.893 605.565 735.908 588.267 749.949C572.853 762.459 554.78 767.692 534.046 765.648C529.902 765.243 524.212 764.042 516.975 762.046C516.521 761.926 516.303 762.101 516.318 762.57C516.342 762.976 516.565 763.306 516.986 763.561C519.985 765.326 523.413 766.686 527.27 767.641C560.112 775.741 593.062 763.131 608.213 731.983C609.009 730.336 609.581 730.412 609.931 732.209ZM410.549 707.658C431.975 703.482 457.218 710.509 476.234 719.91C488.331 725.891 500.245 731.052 511.976 735.395C526.089 740.62 539.307 743.71 553.157 742.23C580.644 739.272 607.557 718.764 610.897 690.05C611.08 688.491 610.754 687.286 609.919 686.435C609.7 686.211 609.428 686.044 609.129 685.951C608.83 685.857 608.511 685.839 608.202 685.898C607.893 685.957 607.603 686.091 607.357 686.289C607.112 686.486 606.918 686.741 606.794 687.031C598.61 706.262 587.456 720.112 567.986 727.867C549.591 735.204 528.845 733.152 510.819 725.791C496.988 720.152 483.019 714.887 468.91 709.996C451.635 704.019 433.824 700.762 415.655 704.485C413.659 704.89 411.85 705.701 410.227 706.918C410.155 706.975 410.104 707.055 410.082 707.144C410.06 707.233 410.068 707.327 410.104 707.412C410.141 707.496 410.205 707.566 410.285 707.61C410.366 707.655 410.458 707.672 410.549 707.658ZM423.147 693.39C444.557 694.869 460.952 696.75 472.333 699.033C488.765 702.317 505.2 705.554 521.639 708.743C534.44 711.225 551.428 714.04 563.763 708.791C564.996 708.266 564.988 707.753 563.739 707.252C563.612 707.205 563.163 707.232 562.391 707.336C544.461 709.758 526.148 705.332 508.862 700.989C487.735 695.68 471.498 691.958 453.544 690.658C447.818 690.244 438.155 690.308 424.555 690.849C423.688 690.889 423.064 691.302 422.682 692.09L422.551 692.376C422.5 692.479 422.476 692.594 422.48 692.709C422.485 692.824 422.518 692.937 422.577 693.037C422.636 693.137 422.718 693.222 422.818 693.283C422.917 693.345 423.03 693.381 423.147 693.39ZM668.566 767.772C669.027 768.917 669.878 769.521 671.119 769.585L671.56 769.597C671.73 769.604 671.899 769.572 672.054 769.502C672.209 769.432 672.346 769.327 672.452 769.194C672.559 769.062 672.633 768.906 672.669 768.74C672.705 768.574 672.701 768.402 672.658 768.237C667.623 749.364 658.402 730.814 646.4 716.104C641.684 710.322 637.059 705.896 632.526 702.826C627.221 699.232 626.788 699.744 631.226 704.365C633.962 707.212 637.393 711.456 641.521 717.094C651.311 730.487 660.326 747.38 668.566 767.772ZM640.793 729.656C641 729.617 641.342 729.994 641.819 730.79C649.836 744.056 655.312 758.407 660.382 773.057C660.788 774.226 661.611 774.775 662.852 774.703L663.484 774.655C664.653 774.584 665.031 773.999 664.617 772.902C662.311 766.746 659.968 760.682 657.59 754.709C651.586 739.606 643.561 725.672 633.516 712.907C632.085 711.086 630.486 709.404 628.721 707.861C628.124 707.344 627.937 707.463 628.16 708.219C635.477 733.032 639.31 758.391 639.66 784.295C639.676 785.448 640.217 785.814 641.282 785.392L643.549 784.509C644.043 784.315 644.462 783.97 644.749 783.522C645.036 783.075 645.175 782.548 645.148 782.016C644.281 765.171 642.404 748.442 639.517 731.828C639.429 731.335 639.513 730.832 639.752 730.427C639.99 730.021 640.364 729.745 640.793 729.656ZM405.348 756.212C417.29 739.558 442.986 739.2 460.499 743.602C477.392 747.837 493.246 755.723 509.089 762.272C509.232 762.336 509.339 762.296 509.411 762.153L509.578 761.843C509.615 761.769 509.623 761.685 509.601 761.605C509.579 761.526 509.528 761.458 509.459 761.413C495.143 752.45 480.08 745.109 464.269 739.391C442.652 731.589 416.693 733.545 404.918 755.639C404.831 755.814 404.871 755.953 405.038 756.057L405.288 756.224C405.312 756.24 405.332 756.236 405.348 756.212ZM628.005 740.787C625.309 760.029 621.694 777.483 614.393 794.888C613.749 796.415 614.202 796.884 615.753 796.296L620.37 794.53C622.072 793.878 623.121 792.661 623.519 790.88C627.146 774.643 630.379 756.534 628.804 740.811C628.581 738.584 628.315 738.576 628.005 740.787ZM495.06 772.878C490.526 770.961 486.204 768.694 482.092 766.078C481.909 765.959 481.754 765.986 481.627 766.161L481.436 766.424C481.189 766.758 481.225 767.06 481.543 767.33C500.261 783.698 533.294 792.645 557.082 784.784C557.194 784.752 557.265 784.704 557.297 784.641C557.353 784.545 557.369 784.426 557.345 784.283C557.333 784.192 557.286 784.109 557.212 784.051C557.139 783.993 557.046 783.965 556.951 783.972C548.386 784.724 542.337 785.189 532.125 783.543C519.337 781.483 506.981 777.928 495.06 772.878ZM451.468 803.883C451.415 803.628 451.429 803.363 451.511 803.115C451.593 802.868 451.739 802.646 451.934 802.473C452.129 802.3 452.366 802.181 452.622 802.129C452.877 802.077 453.142 802.094 453.389 802.177C458.407 803.871 463.016 805.601 467.216 807.367C470.357 808.687 477.487 810.715 488.606 813.451C488.717 813.475 488.789 813.435 488.82 813.332L488.832 813.32C488.864 813.216 488.828 813.141 488.725 813.093C477.861 808.464 466.985 803.859 456.097 799.278C450.025 796.713 443.106 794.709 436.831 797.692C434.556 798.765 432.369 799.891 430.269 801.068C430.199 801.107 430.14 801.164 430.097 801.232C430.054 801.3 430.028 801.377 430.023 801.458C430.017 801.538 430.031 801.618 430.063 801.692C430.096 801.765 430.146 801.83 430.21 801.879C435.459 805.899 442.545 806.734 448.999 806.281C450.955 806.146 451.779 805.347 451.468 803.883Z" fill="#11191C"/>
8
+ <path d="M499.044 264.971C506.25 263.723 512.469 263.933 517.702 265.603C523.962 267.6 527.779 271.274 529.155 276.627C529.823 279.203 529.421 279.382 527.95 277.163C524.125 271.381 518.911 267.775 512.31 266.343C509.821 265.802 504.425 265.786 496.121 266.295C490.316 266.645 484.502 266.773 478.68 266.677C473.367 266.59 469.582 266.975 467.323 267.834C462.551 269.664 459.028 273.123 456.753 278.213C456.578 278.611 456.387 278.619 456.181 278.237C456.014 277.943 455.974 277.617 456.061 277.259C458.698 266.379 469.924 263.826 479.635 265.234C486.116 266.172 492.586 266.085 499.044 264.971Z" fill="white"/>
9
+ <path d="M517.273 298.793C514.804 292.029 509.578 289.441 502.623 288.713C501.136 288.554 501.108 288.256 502.54 287.818C509.912 285.575 521.472 292.912 519.194 301.704C518.796 303.231 518.339 303.251 517.822 301.764C517.524 300.905 517.619 299.748 517.273 298.793Z" fill="white"/>
10
+ <path d="M476.175 310.817C475.352 319.06 471.88 333.292 482.211 337.933C482.498 338.06 482.569 338.259 482.426 338.529L482.271 338.84C482.199 338.983 482.084 339.027 481.925 338.971C473.002 335.976 471.2 325.395 473.204 317.247C474.6 311.616 476.247 302.251 483.261 303.182C490.085 304.088 493.819 311.938 494.117 318.237C494.125 318.347 494.109 318.453 494.07 318.547C493.926 318.921 493.716 319.024 493.437 318.857C493.368 318.818 493.313 318.755 493.282 318.678C490.813 312.594 488.343 306.594 480.959 306.116C478.104 305.933 476.509 307.5 476.175 310.817Z" fill="white"/>
11
+ <path d="M488.451 319.931C484.741 321.207 483.047 323.438 482.498 327.232C482.275 328.823 481.706 328.958 480.792 327.638C477.821 323.307 484.275 318.726 488.248 318.774C488.41 318.774 488.566 318.837 488.682 318.951C488.798 319.065 488.865 319.22 488.868 319.382C488.876 319.494 488.848 319.601 488.785 319.704C488.729 319.8 488.618 319.875 488.451 319.931Z" fill="white"/>
12
+ <path d="M510.902 345.473C509.391 347.064 509.125 346.877 510.103 344.913C511.567 341.962 511.73 338.888 510.592 335.691C510.497 335.42 510.584 335.242 510.855 335.154C510.958 335.122 511.058 335.09 511.153 335.059C511.312 335.011 511.439 335.051 511.535 335.178C514.239 338.757 514.028 342.189 510.902 345.473Z" fill="white"/>
13
+ <path d="M544.89 335.321C544.932 335.316 544.974 335.319 545.015 335.331C545.055 335.343 545.092 335.363 545.125 335.39C545.157 335.416 545.184 335.449 545.203 335.487C545.222 335.524 545.233 335.565 545.236 335.607L545.248 335.822C545.29 336.324 545.115 336.825 544.759 337.213C544.404 337.602 543.898 337.848 543.351 337.897L543.017 337.933C542.47 337.98 541.928 337.826 541.51 337.504C541.091 337.182 540.831 336.718 540.787 336.215L540.763 336.001C540.759 335.96 540.764 335.919 540.777 335.88C540.79 335.841 540.81 335.805 540.836 335.774C540.863 335.743 540.895 335.717 540.932 335.699C540.968 335.681 541.008 335.67 541.049 335.666L544.89 335.321Z" fill="white"/>
14
+ <path d="M536.575 357.677C540.691 350.877 532.805 344.364 533.843 337.17C533.899 336.788 534.114 336.573 534.488 336.526C535.267 336.43 535.883 336.717 536.337 337.385C538.842 341.099 541.653 343.978 544.771 346.022C545.089 346.237 545.324 346.519 545.475 346.869C548.398 353.776 543.9 359.514 536.611 359.777C536.515 359.78 536.419 359.761 536.332 359.72C536.244 359.679 536.167 359.618 536.107 359.542C536.047 359.466 536.005 359.376 535.985 359.28C535.965 359.184 535.967 359.085 535.991 358.989C536.086 358.608 536.281 358.17 536.575 357.677Z" fill="white"/>
15
+ <path d="M487.353 349.686C486.614 350.7 486.423 352.275 486.017 353.373C485.397 355.091 484.896 355.059 484.514 353.277C483.488 348.434 489.334 344.783 493.402 343.745C493.553 343.706 493.652 343.757 493.7 343.9L493.795 344.223C493.843 344.368 493.834 344.527 493.77 344.666C493.706 344.806 493.591 344.916 493.449 344.974C490.952 345.976 488.92 347.547 487.353 349.686Z" fill="white"/>
16
+ <path d="M511.881 360.492C508.755 362.536 507.244 365.336 507.347 368.891C507.395 370.609 506.938 370.756 505.976 369.332C505.005 367.9 505.053 366.163 506.119 364.119C508.091 360.341 511.093 358.365 515.126 358.19C516.152 358.15 516.227 358.396 515.352 358.929C514.35 359.526 512.931 359.812 511.881 360.492Z" fill="white"/>
17
+ <path d="M480.112 360.958C475.817 363.917 472 363.237 468.755 368.951C468.548 369.301 468.309 369.325 468.039 369.023L467.836 368.796C467.78 368.74 467.768 368.673 467.8 368.593C470.099 362.756 474.083 359.821 479.754 359.789C481.138 359.781 481.257 360.171 480.112 360.958Z" fill="white"/>
18
+ <path d="M541.968 365.933L546.883 367.639C546.975 367.671 547.056 367.727 547.12 367.801C547.183 367.875 547.225 367.965 547.242 368.061C547.259 368.157 547.25 368.256 547.216 368.347C547.183 368.439 547.125 368.519 547.05 368.581C539.331 375.023 526.006 371.349 516.533 375.62C516.207 375.771 516.072 375.668 516.128 375.31C516.692 372.017 518.291 370.267 520.923 370.06C526.101 369.667 530.348 369.571 533.653 366.016C533.923 365.714 534.253 365.527 534.643 365.456C536.85 365.014 539.534 364.597 541.419 365.682C541.594 365.786 541.777 365.869 541.968 365.933ZM542.278 369.154C542.405 369.074 542.5 368.915 542.564 368.677C542.675 368.263 542.528 367.885 542.123 367.543C541.797 367.273 541.614 367.348 541.574 367.77C541.534 368.16 541.578 368.553 541.705 368.951C541.808 369.269 541.999 369.337 542.278 369.154Z" fill="white"/>
19
+ <path d="M541.705 368.951C541.578 368.553 541.534 368.16 541.574 367.77C541.614 367.348 541.796 367.273 542.123 367.543C542.528 367.885 542.675 368.263 542.564 368.677C542.5 368.915 542.405 369.074 542.278 369.154C541.999 369.337 541.808 369.269 541.705 368.951Z" fill="#11191C"/>
20
+ <path d="M475.4 379.438C476.378 378.46 476.712 378.662 476.402 380.046C476.322 380.412 476.048 381.02 475.579 381.871C466.607 398.346 484.204 404.896 479.993 418.842C478.656 423.256 475.543 425.976 476.437 432.704C476.525 433.372 476.346 433.452 475.901 432.943C469.005 425.093 479.837 419.725 477.44 411.767C476.175 407.532 471.654 402.033 470.234 397.774C468.039 391.189 469.761 385.077 475.4 379.438Z" fill="white"/>
21
+ <path d="M509.161 403.879C509.268 410.464 514.863 413.137 518.215 417.467C521.277 421.412 522.323 425.19 521.353 428.801C520.554 431.771 516.7 435.505 515.436 438.953C514.744 440.83 514.609 442.412 515.03 443.701C515.977 446.651 515.611 446.826 513.933 444.226C508.815 436.257 525.648 428.729 515.603 419.221C505.081 409.26 501.12 404.034 512.668 391.926C513.105 391.464 513.615 391.373 514.195 391.651L514.541 391.818C514.607 391.851 514.665 391.898 514.712 391.955C514.758 392.013 514.79 392.08 514.808 392.152C514.825 392.224 514.826 392.298 514.811 392.371C514.795 392.443 514.764 392.511 514.72 392.57C510.974 397.326 509.121 401.096 509.161 403.879Z" fill="white"/>
22
+ <path d="M715.474 410.455C723.153 411.534 729.528 411.346 729.712 410.035C729.897 408.723 723.821 406.785 716.141 405.706C708.462 404.627 702.087 404.815 701.903 406.126C701.719 407.438 707.795 409.376 715.474 410.455Z" fill="white"/>
23
+ <path d="M540.822 426.868C541.777 419.997 536.528 416.788 533.008 411.896C532.507 411.204 532.638 411.053 533.402 411.443C538.973 414.282 545.069 420.498 543.912 427.298C543.447 430.053 540.643 433.43 541.419 436.841C542.97 443.594 550.33 443.987 548.827 453.114C548.581 454.585 548.04 454.704 547.205 453.472C545.618 451.121 545.964 445.836 543.673 444.298C540.452 442.126 537.816 440.587 537.649 436.543C537.53 433.477 540.417 429.815 540.822 426.868Z" fill="white"/>
24
+ <path d="M712.026 438.725C710.749 437.377 709.199 436.518 707.576 436.53C701.719 436.53 688.572 433.882 686.842 426.915C686.739 426.501 686.886 426.378 687.284 426.545C688.373 427.014 689.868 427.929 691.769 429.289C694.788 431.436 698.999 431.889 704.033 432.438C715.128 433.667 723.479 444.248 730.231 451.907C730.336 452.026 730.409 452.169 730.443 452.324C730.477 452.479 730.471 452.639 730.426 452.791C730.38 452.943 730.297 453.08 730.183 453.191C730.07 453.301 729.93 453.381 729.777 453.422L729.133 453.601C728.171 453.864 727.324 453.657 726.592 452.981C721.216 448.042 716.36 443.29 712.026 438.725Z" fill="white"/>
25
+ <path d="M424.471 434.97C424.375 434.973 424.281 435 424.199 435.051C424.117 435.101 424.05 435.172 424.004 435.257C423.958 435.341 423.935 435.437 423.938 435.533C423.94 435.629 423.968 435.723 424.018 435.805C431.757 448.403 431.657 460.893 423.72 473.276C423.521 473.579 423.298 473.75 423.052 473.789C422.962 473.801 422.871 473.79 422.787 473.756C422.703 473.722 422.629 473.667 422.572 473.596C422.516 473.525 422.479 473.441 422.465 473.351C422.45 473.262 422.459 473.17 422.491 473.086C430.818 451.35 418.721 435.71 395.888 436.724C395.427 436.74 395.168 436.521 395.112 436.068C395.025 435.439 395.248 435.034 395.78 434.851C415.369 427.991 437.296 428.289 457.159 433.753C461.537 434.958 469.125 437.702 471.642 441.734C471.688 441.808 471.712 441.893 471.71 441.98C471.708 442.067 471.681 442.152 471.631 442.223C471.581 442.294 471.512 442.349 471.431 442.381C471.35 442.413 471.261 442.42 471.176 442.402C469.594 442.1 468.003 441.694 466.405 441.185C452.669 436.843 438.692 434.771 424.471 434.97Z" fill="white"/>
26
+ <path d="M489.858 454.322C489.214 449.204 487.329 447.987 485.301 443.8C485.23 443.648 485.211 443.478 485.247 443.314C485.282 443.151 485.371 443.003 485.498 442.895C485.625 442.787 485.785 442.723 485.952 442.714C486.119 442.705 486.284 442.751 486.423 442.845C491.35 446.305 493.187 452.425 491.147 458.044C490.876 458.791 490.658 458.776 490.491 457.996C490.22 456.747 490.01 455.523 489.858 454.322Z" fill="white"/>
27
+ <path d="M528.487 451.24C532.364 452.052 532.674 459.031 531.839 462.001C531.704 462.486 531.529 462.498 531.314 462.037C529.823 458.852 529.549 455.547 527.604 452.529C526.872 451.4 527.167 450.97 528.487 451.24Z" fill="white"/>
28
+ <path d="M561.938 560.471C563.155 568.333 561.222 585.559 550.211 585.905C549.66 585.926 549.122 585.736 548.706 585.372C548.289 585.009 548.025 584.5 547.968 583.949C546.382 568.87 543.817 552.824 527.771 546.346C524.789 545.141 518.132 544.629 517.356 548.756C517.221 549.48 517.404 550.999 517.905 553.313C519.027 558.527 521.699 578.449 513.611 579.046C513.061 579.086 512.514 578.931 512.065 578.608C511.616 578.286 511.294 577.816 511.153 577.28C509.483 570.862 506.954 554.506 498.531 553.409C497.418 553.258 495.195 553.604 491.863 554.447C487.282 555.6 482.661 556.387 478 556.809C477.523 556.849 477.245 556.634 477.165 556.165L477.106 555.795C477.09 555.697 477.111 555.597 477.164 555.515C477.217 555.434 477.298 555.376 477.392 555.353C486.148 553.142 493.429 548.573 499.235 541.646C502.496 537.741 503.558 533.562 502.42 529.108C501.132 524.062 494.38 525.505 491.779 521.879C488.308 517.035 491.672 512.382 495.131 508.493C497.052 506.322 493.044 500.154 491.731 498.305C485.902 490.09 479.686 482.172 473.085 474.553C471.701 472.947 470.711 471.137 470.115 469.125C470.062 468.935 470.054 468.737 470.089 468.545C470.124 468.353 470.202 468.172 470.318 468.016C472.811 464.699 478.108 467.753 480.541 469.555C498.03 482.522 512.954 508.219 511.046 530.551C510.974 531.41 511.312 532.047 512.06 532.46C523.926 539.045 536.718 541.857 550.438 540.894C552.836 540.727 555.233 539.463 557.405 538.699C559.465 537.984 559.731 538.405 558.204 539.964C557.735 540.433 557.448 541.24 557.345 542.386C557.281 543.109 557.425 543.921 557.774 544.819C559.723 549.894 561.111 555.111 561.938 560.471Z" fill="white"/>
29
+ <path d="M565.588 508.731C568.165 514.517 568.523 523.38 563.405 527.938C559.659 531.278 554.088 530.848 550.223 527.735C544.711 523.297 544.723 515.996 543.924 509.602C542.314 496.837 536.933 487.901 528.773 478.274C528.714 478.201 528.669 478.117 528.643 478.027C528.617 477.937 528.609 477.842 528.62 477.75C528.631 477.657 528.661 477.568 528.708 477.488C528.755 477.408 528.818 477.338 528.893 477.284C531.978 474.969 534.142 471.971 535.382 468.289C535.409 468.206 535.454 468.13 535.514 468.067C535.575 468.004 535.649 467.955 535.731 467.925C535.813 467.894 535.902 467.881 535.99 467.889C536.078 467.896 536.164 467.923 536.241 467.967C546.962 474.21 554.919 482.891 560.113 494.009C562.188 498.435 563.417 503.851 565.588 508.731Z" fill="white"/>
30
+ <path d="M474.171 784.035C468.46 784.759 463.971 784.858 460.702 784.333C439.427 780.938 421.02 777.49 405.479 773.99C400.66 772.905 397.665 770.089 395.446 765.401C384.65 742.508 375.321 719.722 373.341 695.719C371.79 676.954 369.237 660.479 362.103 643.276C359.705 637.49 349.398 616.792 351.807 611.495C352.404 610.175 353.032 610.159 353.692 611.448L358.512 620.908C359.156 622.18 360.075 622.427 361.268 621.648C388.67 603.813 396.532 561.367 393.216 531.53C393.197 531.362 393.138 531.202 393.042 531.062C392.947 530.923 392.819 530.809 392.669 530.731C392.519 530.653 392.352 530.614 392.183 530.616C392.014 530.618 391.848 530.661 391.7 530.743C390.134 531.602 389.14 532.079 388.718 532.174C386.237 532.731 385.962 532.25 387.895 530.731L404.418 517.739C404.49 517.68 404.581 517.647 404.675 517.648C404.768 517.65 404.859 517.684 404.929 517.746C404.999 517.808 405.046 517.893 405.059 517.986C405.072 518.079 405.052 518.173 405.002 518.252C404.366 519.398 403.559 520.408 402.58 521.283C402.209 521.614 401.922 522.029 401.746 522.494C401.569 522.96 401.508 523.461 401.566 523.955C405.098 553.362 400.695 579.452 383.099 603.323C377.862 610.434 372.696 616.697 365.992 621.743C365.557 622.075 365.227 622.524 365.041 623.038C364.855 623.552 364.821 624.109 364.942 624.642C366.684 632.217 369.941 638.361 375.011 644.159C378.196 647.81 378.244 651.508 379.019 655.743C381.679 670.428 389.076 682.43 398.763 693.656C398.818 693.722 398.858 693.799 398.88 693.882C398.902 693.965 398.904 694.052 398.888 694.136C398.872 694.219 398.838 694.298 398.787 694.366C398.736 694.433 398.671 694.488 398.596 694.526C395.184 696.28 384.936 702.973 384.96 707.327C385.044 720.104 389.672 735.493 394.373 747.315C396.401 752.409 399.634 758.482 402.115 764.16C404.227 769.016 406.768 771.139 411.993 771.056C420.606 770.901 428.587 770.042 437.284 773.382C447.21 777.199 453.616 779.764 463.339 780.778C468.158 781.279 472.906 781.625 477.583 781.816C477.957 781.833 478.315 781.98 478.592 782.233C478.869 782.486 479.048 782.828 479.098 783.2C479.79 788.413 477.905 794.545 473.109 797.039C468.91 799.21 460.535 796.55 463.016 790.334C463.077 790.181 463.18 790.048 463.314 789.953C463.449 789.858 463.608 789.803 463.772 789.797C463.937 789.791 464.1 789.833 464.241 789.917C464.382 790.002 464.496 790.126 464.567 790.275C465.283 791.766 465.832 793.543 467.311 794.342C471.976 796.884 475.03 788.127 474.827 784.572C474.803 784.158 474.584 783.98 474.171 784.035Z" fill="white"/>
31
+ <path d="M513.086 604.051C513.134 609.579 514.514 614.048 516.167 614.034C517.821 614.019 519.122 609.527 519.074 603.999C519.026 598.471 517.646 594.002 515.993 594.016C514.339 594.031 513.037 598.524 513.086 604.051Z" fill="white"/>
32
+ <path d="M552.657 628.614C552.847 633.72 557.81 639.243 560.757 643.395C566.889 652.056 573.796 666.741 570.921 677.013C570.126 679.852 568.392 681.669 565.72 682.465C565.338 682.576 564.972 682.536 564.622 682.345C559.743 679.709 556.939 672.288 555.031 666.741C549.567 650.887 538.019 625.918 548.875 610.063C548.961 609.936 549.079 609.835 549.216 609.767C549.354 609.7 549.507 609.67 549.659 609.679C549.812 609.689 549.96 609.738 550.088 609.822C550.216 609.906 550.32 610.022 550.39 610.158C552.931 614.942 552.454 623.245 552.657 628.614Z" fill="white"/>
33
+ <path d="M519.134 631.595C521.532 633.396 523.441 639.552 525.457 643.06C528.654 648.619 535.657 654.918 535.883 661.634C535.887 661.726 535.866 661.818 535.821 661.899C535.777 661.979 535.711 662.046 535.631 662.092C535.55 662.138 535.459 662.16 535.367 662.157C535.275 662.155 535.185 662.126 535.108 662.076C532.018 660.119 530.026 657.077 527.568 655.061C525.922 653.717 524.319 652.325 522.761 650.885C520.601 648.905 518.824 649.895 516.581 648.702C507.884 644.086 511.893 626.143 519.134 631.595Z" fill="white"/>
34
+ <path d="M596.141 697.843C586.251 713.841 567.211 724.327 547.789 723.719C545.658 723.647 544.055 723.389 542.982 722.943C539.967 721.687 540.043 721.13 543.208 721.273C562.928 722.168 592.228 708.58 594.542 685.913C595.651 675.069 588.792 671.168 579.487 670.166C579.383 670.153 579.286 670.111 579.206 670.045C579.125 669.979 579.066 669.892 579.033 669.793C579.001 669.694 578.997 669.588 579.022 669.488C579.048 669.387 579.101 669.295 579.176 669.224C579.574 668.858 580.047 668.631 580.596 668.544C587.694 667.398 595.866 669.367 599.433 675.916C602.964 682.37 599.743 692.021 596.141 697.843Z" fill="white"/>
35
+ <path d="M518.275 687.224C520.526 687.598 520.645 687.248 518.633 686.174C508.457 680.746 496.611 675.843 485.397 674.519C472.934 673.064 460.03 674.471 446.685 678.742C446.414 678.822 446.378 678.762 446.577 678.563C447.723 677.37 449.019 676.372 450.466 675.569C467.896 665.918 489.56 666.979 507.276 674.758C517.154 679.1 529.513 685.733 541.538 690.612C551.404 694.609 579.737 699.655 583.113 683.657C583.463 682.035 583.889 682.015 584.39 683.598C585.805 688.051 584.457 691.722 580.345 694.609C573.963 699.094 563.107 699.691 555.544 699.297C545.558 698.796 532.579 695.193 521.401 692.772C512.084 690.744 502.683 690.004 493.068 688.847C492.809 688.818 492.564 688.718 492.36 688.558C492.155 688.398 492 688.184 491.91 687.94C491.616 687.121 492.053 686.652 493.223 686.532C502.059 685.673 510.409 685.904 518.275 687.224Z" fill="white"/>
36
+ <path d="M609.931 732.212C609.581 730.414 609.009 730.339 608.213 731.985C593.063 763.134 560.113 775.743 527.27 767.643C523.413 766.689 519.985 765.329 516.987 763.563C516.565 763.309 516.342 762.979 516.319 762.573C516.303 762.104 516.521 761.929 516.975 762.048C524.212 764.044 529.903 765.245 534.046 765.651C554.78 767.695 572.854 762.462 588.267 749.951C605.565 735.91 612.401 711.895 614.309 690.362C614.822 684.576 611.792 682.524 606.889 680.807C606.767 680.765 606.659 680.688 606.579 680.587C606.5 680.485 606.451 680.362 606.44 680.233C606.428 680.104 606.455 679.975 606.515 679.861C606.576 679.746 606.669 679.652 606.782 679.59C607.84 679.009 609.052 678.767 610.42 678.862C615.041 679.18 617.622 681.618 618.163 686.175C620.191 703.083 619.038 720.393 614.703 738.105C604.587 779.454 570.253 805.568 528.403 809.063C513.73 810.292 495.966 809.755 483.428 802.55C483.317 802.486 483.273 802.395 483.297 802.275L483.392 801.691C483.432 801.42 483.571 801.349 483.81 801.476C488.844 804.148 494.38 805.007 501.585 805.52C522.955 807.047 543.522 803.361 563.286 794.461C589.591 782.603 604.372 761.714 609.693 733.608C609.86 732.717 609.939 732.252 609.931 732.212Z" fill="white"/>
37
+ <path d="M476.235 719.913C457.219 710.512 431.975 703.486 410.549 707.661C410.458 707.675 410.366 707.658 410.285 707.614C410.205 707.569 410.141 707.499 410.104 707.415C410.068 707.331 410.06 707.237 410.082 707.147C410.104 707.058 410.155 706.979 410.227 706.922C411.85 705.705 413.659 704.893 415.655 704.488C433.824 700.766 451.635 704.023 468.91 709.999C483.019 714.891 496.988 720.156 510.819 725.794C528.845 733.155 549.591 735.207 567.986 727.87C587.456 720.116 598.61 706.265 606.794 687.035C606.918 686.745 607.112 686.49 607.358 686.292C607.603 686.094 607.893 685.96 608.202 685.901C608.511 685.842 608.83 685.86 609.129 685.954C609.429 686.048 609.7 686.214 609.919 686.438C610.754 687.289 611.08 688.494 610.898 690.053C607.557 718.768 580.644 739.275 553.158 742.234C539.307 743.713 526.089 740.623 511.976 735.398C500.245 731.055 488.331 725.894 476.235 719.913Z" fill="white"/>
38
+ <path d="M423.147 693.391C423.03 693.383 422.917 693.346 422.818 693.285C422.719 693.223 422.636 693.138 422.577 693.038C422.518 692.938 422.485 692.826 422.48 692.71C422.476 692.595 422.5 692.481 422.551 692.377L422.682 692.091C423.064 691.304 423.688 690.89 424.555 690.85C438.155 690.309 447.818 690.246 453.544 690.659C471.498 691.96 487.735 695.682 508.862 700.991C526.149 705.333 544.461 709.759 562.391 707.337C563.163 707.234 563.612 707.206 563.739 707.254C564.988 707.755 564.996 708.268 563.763 708.793C551.428 714.042 534.44 711.226 521.639 708.745C505.2 705.556 488.765 702.319 472.334 699.034C460.953 696.752 444.557 694.871 423.147 693.391Z" fill="white"/>
39
+ <path d="M668.566 767.774C660.326 747.382 651.312 730.489 641.521 717.096C637.394 711.457 633.962 707.214 631.226 704.367C626.788 699.746 627.221 699.233 632.526 702.828C637.06 705.898 641.684 710.324 646.4 716.106C658.402 730.815 667.623 749.366 672.658 768.239C672.701 768.403 672.705 768.576 672.669 768.742C672.634 768.908 672.559 769.064 672.453 769.196C672.346 769.328 672.209 769.434 672.054 769.504C671.899 769.574 671.73 769.606 671.56 769.599L671.119 769.587C669.878 769.523 669.027 768.919 668.566 767.774Z" fill="white"/>
40
+ <path d="M640.794 729.658C640.364 729.746 639.991 730.022 639.752 730.428C639.514 730.833 639.429 731.336 639.517 731.829C642.404 748.443 644.281 765.172 645.148 782.017C645.176 782.549 645.036 783.076 644.749 783.523C644.463 783.971 644.043 784.316 643.549 784.511L641.283 785.393C640.217 785.815 639.676 785.449 639.66 784.296C639.31 758.392 635.477 733.034 628.16 708.22C627.937 707.464 628.124 707.345 628.721 707.862C630.486 709.405 632.085 711.087 633.516 712.908C643.561 725.673 651.586 739.607 657.591 754.71C659.969 760.683 662.311 766.747 664.617 772.903C665.031 774 664.653 774.585 663.484 774.657L662.852 774.704C661.611 774.776 660.788 774.227 660.382 773.058C655.312 758.408 649.836 744.057 641.82 730.791C641.342 729.996 641 729.618 640.794 729.658Z" fill="white"/>
41
+ <path d="M460.499 743.604C442.986 739.202 417.29 739.56 405.348 756.214C405.332 756.237 405.312 756.241 405.288 756.225L405.038 756.058C404.871 755.955 404.831 755.816 404.919 755.641C416.693 733.547 442.652 731.59 464.269 739.393C480.08 745.111 495.143 752.452 509.459 761.415C509.528 761.459 509.579 761.528 509.601 761.607C509.623 761.686 509.615 761.771 509.578 761.844L509.411 762.155C509.34 762.298 509.232 762.337 509.089 762.274C493.246 755.724 477.392 747.839 460.499 743.604Z" fill="white"/>
42
+ <path d="M614.393 794.888C621.694 777.483 625.309 760.03 628.005 740.787C628.315 738.576 628.581 738.584 628.804 740.811C630.379 756.534 627.146 774.644 623.519 790.88C623.122 792.662 622.072 793.878 620.37 794.531L615.753 796.296C614.202 796.885 613.749 796.415 614.393 794.888Z" fill="white"/>
43
+ <path d="M495.06 772.88C506.982 777.931 519.337 781.486 532.125 783.546C542.337 785.192 548.386 784.727 556.951 783.975C557.046 783.968 557.139 783.996 557.213 784.054C557.286 784.111 557.333 784.194 557.345 784.285C557.369 784.428 557.353 784.548 557.297 784.643C557.265 784.707 557.194 784.754 557.082 784.786C533.295 792.648 500.261 783.701 481.543 767.333C481.225 767.063 481.189 766.76 481.436 766.426L481.627 766.164C481.754 765.989 481.909 765.961 482.092 766.08C486.204 768.697 490.526 770.964 495.06 772.88Z" fill="white"/>
44
+ <path d="M451.468 803.888C451.779 805.351 450.955 806.15 448.999 806.285C442.545 806.739 435.459 805.904 430.21 801.883C430.146 801.834 430.096 801.77 430.063 801.696C430.031 801.622 430.017 801.542 430.023 801.462C430.029 801.382 430.054 801.304 430.097 801.236C430.14 801.168 430.199 801.112 430.269 801.072C432.369 799.895 434.556 798.77 436.831 797.696C443.106 794.714 450.025 796.718 456.097 799.283C466.985 803.864 477.861 808.469 488.725 813.097C488.828 813.145 488.864 813.221 488.832 813.324L488.821 813.336C488.789 813.439 488.717 813.479 488.606 813.455C477.487 810.719 470.357 808.691 467.216 807.371C463.016 805.605 458.408 803.876 453.389 802.182C453.142 802.098 452.877 802.082 452.622 802.134C452.366 802.185 452.129 802.304 451.934 802.477C451.739 802.65 451.593 802.872 451.511 803.12C451.43 803.367 451.415 803.632 451.468 803.888Z" fill="white"/>
45
+ </g>
46
+ <defs>
47
+ <clipPath id="clip0_411_914">
48
+ <rect x="216.142" y="216.143" width="591.715" height="591.715" rx="295.858" fill="white"/>
49
+ </clipPath>
50
+ </defs>
51
+ </svg>
data/bin/console ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "dionysus-rb"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ require "irb"
11
+ IRB.start(__FILE__)
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "file-based-healthcheck"
5
+ require "logger"
6
+ require_relative "../lib/dionysus/checks"
7
+
8
+ result = Dionysus::Checks::HealthCheck.check
9
+ if result.empty?
10
+ exit 0
11
+ else
12
+ Logger.new($stdout).fatal "[Dionysus] health check failed: #{result}"
13
+ exit 1
14
+ end
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require_relative "../lib/dionysus"
5
+
6
+ result = Dionysus::Producer::Outbox::HealthCheck.check
7
+ if result.empty?
8
+ exit 0
9
+ else
10
+ Dionysus.logger.fatal "[Dionysus Outbox Worker] health check failed: #{result}"
11
+ exit 1
12
+ end
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/dionysus/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "dionysus-rb"
7
+ spec.version = Dionysus::VERSION
8
+ spec.authors = ["Karol Galanciak"]
9
+ spec.email = ["karol.galanciak@gmail.com", "karol@bookingsync.com", "dev@bookingsync.com"]
10
+
11
+ spec.summary = "A framework on top of Karafka for Change Data Capture on the model level."
12
+ spec.description = "A framework on top of Karafka for Change Data Capture on the model level."
13
+ spec.homepage = "https://github.com/BookingSync/dionysus-rb"
14
+ spec.license = "MIT"
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = "https://github.com/BookingSync/dionysus-rb"
18
+ spec.metadata["changelog_uri"] = "https://github.com/BookingSync/dionysus-rb/blob/master/CHANGELOG.md"
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ %x(git ls-files -z).split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "bin"
26
+ spec.executables = %w[karafka_health_check outbox_worker_health_check]
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency "activerecord", "~> 7.1"
30
+ spec.add_development_dependency "bundler"
31
+ spec.add_development_dependency "byebug"
32
+ spec.add_development_dependency "crypt_keeper"
33
+ spec.add_development_dependency "ddtrace"
34
+ spec.add_development_dependency "dogstatsd-ruby"
35
+ spec.add_development_dependency "hermes-rb"
36
+ spec.add_development_dependency "pg"
37
+ spec.add_development_dependency "redis"
38
+ spec.add_development_dependency "redis-namespace"
39
+ spec.add_development_dependency "redlock"
40
+ spec.add_development_dependency "rspec-retry"
41
+ spec.add_development_dependency "rspec-sidekiq"
42
+ spec.add_development_dependency "rubocop"
43
+ spec.add_development_dependency "rubocop-performance"
44
+ spec.add_development_dependency "rubocop-rake"
45
+ spec.add_development_dependency "rubocop-rspec"
46
+ spec.add_development_dependency "sentry-ruby"
47
+ spec.add_development_dependency "shoulda-matchers"
48
+ spec.add_development_dependency "timecop"
49
+
50
+ spec.add_dependency "activerecord", ">= 5"
51
+ spec.add_dependency "activesupport", ">= 3.2"
52
+ spec.add_dependency "concurrent-ruby"
53
+ spec.add_dependency "dry-monitor"
54
+ spec.add_dependency "file-based-healthcheck"
55
+ spec.add_dependency "karafka", "~> 2.0"
56
+ spec.add_dependency "sidekiq"
57
+ spec.add_dependency "sidekiq-cron"
58
+ spec.add_dependency "sigurd"
59
+ spec.add_dependency "waterdrop", "~> 2.0"
60
+ spec.add_dependency "zeitwerk"
61
+
62
+ spec.required_ruby_version = ">= 2.7"
63
+ spec.metadata["rubygems_mfa_required"] = "true"
64
+ end
@@ -0,0 +1,44 @@
1
+ version: '2'
2
+
3
+ services:
4
+ kafka:
5
+ container_name: kafka
6
+ image: confluentinc/cp-kafka:7.5.2
7
+
8
+ ports:
9
+ - 9092:9092
10
+
11
+ environment:
12
+ CLUSTER_ID: kafka-docker-cluster-1
13
+ KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
14
+ KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
15
+ KAFKA_PROCESS_ROLES: broker,controller
16
+ KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
17
+ KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
18
+ KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
19
+ KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://127.0.0.1:9092
20
+ KAFKA_BROKER_ID: 1
21
+ KAFKA_CONTROLLER_QUORUM_VOTERS: 1@127.0.0.1:9093
22
+ ALLOW_PLAINTEXT_LISTENER: 'yes'
23
+ KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
24
+ KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
25
+ KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
26
+ KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true"
27
+ KAFKA_AUTHORIZER_CLASS_NAME: org.apache.kafka.metadata.authorizer.StandardAuthorizer
28
+ KAFKA_CREATE_TOPICS: "v102_rentals:1:1"
29
+ TOPIC_CREATE_BACKOFF_MS: "10000"
30
+ command: "bash -c 'docker exec kafka sh -c \"sleep 5 && kafka-topics --bootstrap-server broker:9092 --create --topic v102_rentals --replication-factor 1 --partitions 1\"'"
31
+ kafka-setup:
32
+ image: confluentinc/cp-kafka:7.5.2
33
+ hostname: kafka-setup
34
+ container_name: kafka-setup
35
+ depends_on:
36
+ - kafka
37
+ command: "bash -c 'echo Waiting for Kafka to be ready... && \
38
+ cub kafka-ready -b broker:9092 1 20 && \
39
+ kafka-topics --create --if-not-exists --zookeeper zookeeper:2181 --partitions 1 --replication-factor 1 --topic v102_rentals'"
40
+ environment:
41
+ # The following settings are listed here only to satisfy the image's requirements.
42
+ # We override the image's `command` anyways, hence this container will not start a broker.
43
+ KAFKA_BROKER_ID: ignored
44
+ KAFKA_ZOOKEEPER_CONNECT: ignored
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Dionysus::Checks::HealthCheck
4
+ KEY_PREFIX = "__karafka_app_running__"
5
+ TMP_DIR = "/tmp"
6
+ KARAFKA_TIMEOUT = "KARAFKA_HEALTH_CHECK_TIMEOUT"
7
+ private_constant :KEY_PREFIX, :TMP_DIR, :KARAFKA_TIMEOUT
8
+
9
+ def self.check(hostname: ENV.fetch("HOSTNAME", nil), expiry_time_in_seconds: ENV.fetch(KARAFKA_TIMEOUT, 600))
10
+ new(hostname: hostname, expiry_time_in_seconds: expiry_time_in_seconds).check
11
+ end
12
+
13
+ attr_reader :hostname, :expiry_time_in_seconds
14
+
15
+ def initialize(hostname: ENV.fetch("HOSTNAME", nil), expiry_time_in_seconds: ENV.fetch(KARAFKA_TIMEOUT, 600))
16
+ @hostname = hostname
17
+ @expiry_time_in_seconds = expiry_time_in_seconds
18
+ end
19
+
20
+ def check
21
+ if healthcheck_storage.running?
22
+ ""
23
+ else
24
+ "[Dionysus healthcheck failed]"
25
+ end
26
+ end
27
+
28
+ def app_initialized!
29
+ register_heartbeat
30
+ end
31
+
32
+ def register_heartbeat
33
+ healthcheck_storage.touch
34
+ end
35
+
36
+ def app_stopped!
37
+ healthcheck_storage.remove
38
+ end
39
+
40
+ private
41
+
42
+ def healthcheck_storage
43
+ @healthcheck_storage ||= FileBasedHealthcheck.new(directory: TMP_DIR, filename: key,
44
+ time_threshold: expiry_time_in_seconds)
45
+ end
46
+
47
+ def key
48
+ "#{KEY_PREFIX}#{hostname}"
49
+ end
50
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dionysus
4
+ class Checks
5
+ autoload :HealthCheck, "dionysus/checks/health_check"
6
+ end
7
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Dionysus::Consumer::BatchEventsPublisher
4
+ attr_reader :config, :topic
5
+ private :config, :topic
6
+
7
+ def initialize(config, topic)
8
+ @config = config
9
+ @topic = topic
10
+ end
11
+
12
+ def publish(processed_events)
13
+ processed_events
14
+ .map(&method(:to_event_data))
15
+ .each(&method(:publish_via_event_bus))
16
+ end
17
+
18
+ private
19
+
20
+ def to_event_data(dionysus_event)
21
+ {
22
+ topic_name: topic.to_s,
23
+ event_name: dionysus_event.event_name,
24
+ model_name: dionysus_event.model_name,
25
+ transformed_data: dionysus_event.transformed_data.to_a,
26
+ local_changes: dionysus_event.local_changes
27
+ }
28
+ end
29
+
30
+ def publish_via_event_bus(event_data)
31
+ config.event_bus.publish("dionysus.consume", event_data)
32
+ end
33
+ end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Dionysus::Consumer::Config
4
+ attr_accessor :registry
5
+ attr_writer :transaction_provider, :model_factory, :processing_mutex_provider, :processing_mutex_method_name,
6
+ :instrumenter, :event_bus, :soft_delete_strategy, :soft_deleted_at_timestamp_attribute,
7
+ :synced_created_at_timestamp_attribute, :synced_updated_at_timestamp_attribute, :synced_id_attribute,
8
+ :synced_data_attribute, :consumer_base_class, :retry_provider, :resolve_synced_data_hash_proc, :sidekiq_queue,
9
+ :message_filter
10
+
11
+ def self.default_sidekiq_queue
12
+ :dionysus
13
+ end
14
+
15
+ def transaction_provider
16
+ @transaction_provider || Dionysus::Utils::NullTransactionProvider
17
+ end
18
+
19
+ def model_factory
20
+ @model_factory || Dionysus::Utils::NullModelFactory
21
+ end
22
+
23
+ def processing_mutex_provider
24
+ @processing_mutex_provider || Dionysus::Utils::NullMutexProvider
25
+ end
26
+
27
+ def processing_mutex_method_name
28
+ @processing_mutex_method_name || :with_lock
29
+ end
30
+
31
+ def instrumenter
32
+ @instrumenter || Dionysus::Utils::NullInstrumenter
33
+ end
34
+
35
+ def event_bus
36
+ @event_bus || Dionysus::Utils::NullEventBus
37
+ end
38
+
39
+ def soft_delete_strategy
40
+ @soft_delete_strategy || :cancel
41
+ end
42
+
43
+ def soft_deleted_at_timestamp_attribute
44
+ @soft_deleted_at_timestamp_attribute || :synced_canceled_at
45
+ end
46
+
47
+ def synced_created_at_timestamp_attribute
48
+ @synced_created_at_timestamp_attribute || :synced_created_at
49
+ end
50
+
51
+ def synced_updated_at_timestamp_attribute
52
+ @synced_updated_at_timestamp_attribute || :synced_updated_at
53
+ end
54
+
55
+ def synced_id_attribute
56
+ @synced_id_attribute || :synced_id
57
+ end
58
+
59
+ def synced_data_attribute
60
+ @synced_data_attribute || :synced_data
61
+ end
62
+
63
+ def consumer_base_class
64
+ @consumer_base_class || Karafka::BaseConsumer
65
+ end
66
+
67
+ def retry_provider
68
+ @retry_provider || Dionysus::Utils::NullRetryProvider
69
+ end
70
+
71
+ def add_attributes_mapping_for_model(model_name)
72
+ attributes_mapping_for_models[model_name.to_s] = yield
73
+ end
74
+
75
+ def attributes_mapping_for_models
76
+ @attributes_mapping_for_models ||= {}
77
+ end
78
+
79
+ def attributes_mapping_for_model(model_name)
80
+ attributes_mapping_for_models.fetch(model_name.to_s, {})
81
+ end
82
+
83
+ def resolve_synced_data_hash_proc
84
+ @resolve_synced_data_hash_proc || lambda do |record|
85
+ record.public_send(Dionysus::Consumer.configuration.synced_data_attribute).to_h
86
+ end
87
+ end
88
+
89
+ def sidekiq_queue
90
+ @sidekiq_queue || self.class.default_sidekiq_queue
91
+ end
92
+
93
+ def message_filter
94
+ @message_filter || Dionysus::Utils::DefaultMessageFilter.new(error_handler:
95
+ Dionysus::Utils::NullErrorHandler)
96
+ end
97
+ end