active_analytics 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +9 -0
- data/app/controllers/active_analytics/application_controller.rb +6 -1
- data/app/controllers/active_analytics/assets_controller.rb +19 -12
- data/app/controllers/active_analytics/browsers_controller.rb +27 -0
- data/app/controllers/active_analytics/pages_controller.rb +4 -4
- data/app/controllers/active_analytics/referrers_controller.rb +4 -4
- data/app/controllers/active_analytics/sites_controller.rb +3 -2
- data/app/helpers/active_analytics/browsers_helper.rb +12 -0
- data/app/lib/active_analytics/histogram.rb +47 -0
- data/app/models/active_analytics/browsers_per_day.rb +40 -0
- data/app/models/active_analytics/views_per_day.rb +2 -58
- data/app/views/active_analytics/assets/browsers/arc.svg +1 -0
- data/app/views/active_analytics/assets/browsers/brave.svg +1 -0
- data/app/views/active_analytics/assets/browsers/chrome.svg +1 -0
- data/app/views/active_analytics/assets/browsers/default.svg +8 -0
- data/app/views/active_analytics/assets/browsers/firefox.svg +1 -0
- data/app/views/active_analytics/assets/browsers/internet_explorer.svg +1 -0
- data/app/views/active_analytics/assets/browsers/microsoft_edge.svg +1 -0
- data/app/views/active_analytics/assets/browsers/opera.svg +1 -0
- data/app/views/active_analytics/assets/browsers/safari.svg +1 -0
- data/app/views/active_analytics/assets/browsers/samsung_internet.svg +1 -0
- data/app/views/active_analytics/assets/browsers/vivaldi.svg +1 -0
- data/app/views/active_analytics/assets/browsers/yandex.svg +1 -0
- data/app/views/active_analytics/browsers/_table.html.erb +17 -0
- data/app/views/active_analytics/browsers/_version_table.html.erb +16 -0
- data/app/views/active_analytics/browsers/index.html.erb +9 -0
- data/app/views/active_analytics/browsers/show.html.erb +17 -0
- data/app/views/active_analytics/pages/index.html.erb +1 -1
- data/app/views/active_analytics/referrers/index.html.erb +1 -1
- data/app/views/active_analytics/sites/_histogram.html.erb +2 -2
- data/app/views/active_analytics/sites/show.html.erb +7 -2
- data/app/views/layouts/active_analytics/_footer.html.erb +4 -4
- data/config/routes.rb +6 -1
- data/db/migrate/20210303094108_create_active_analytics_views_per_days.rb +2 -3
- data/db/migrate/20240823150626_create_active_analytics_browsers_per_days.rb +13 -0
- data/lib/active_analytics/version.rb +1 -1
- data/lib/active_analytics.rb +44 -8
- metadata +41 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a008072c9c416bc367e4952deb03036e422368fc98a1da10e0e6921a59f45a09
|
4
|
+
data.tar.gz: a7a1999f79b95ba4007280e36be378dd2c6e00885f0254db8b9a3dfbc2e67dbd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ad8d068d845fbe22c00a3cafbbcc2cd4459934e4b2ba7790c394cb1c69e4858c1f58eb25ef76b5e0b77e3c71597ce1d1ac6f2caa8173a62b83f8b51f644226b
|
7
|
+
data.tar.gz: 256cc8d412ca06ea8cb71f522d4935fa212076e17a240deb03e075aa2ec8da37ea6d602dc6bd536d5a6f6b029e9c249757efdb185ac5394fb16d0f4b61ba1e7f
|
data/README.md
CHANGED
@@ -38,6 +38,15 @@ Add the route to ActiveAnalytics dashboard at the desired endpoint:
|
|
38
38
|
# config/routes.rb
|
39
39
|
mount ActiveAnalytics::Engine, at: "analytics" # http://localhost:3000/analytics
|
40
40
|
```
|
41
|
+
By default ActiveAnalytics will extend `ActionController::Base`, but you can specify a custom base controller for the ActiveAnalytics dashboard:
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
# config/initializers/active_analytics.rb
|
45
|
+
Rails.application.configure do
|
46
|
+
ActiveAnalytics.base_controller_class = "AdminController"
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
41
50
|
|
42
51
|
The next step is to collect trafic and there is 2 options.
|
43
52
|
|
@@ -1,5 +1,10 @@
|
|
1
1
|
module ActiveAnalytics
|
2
|
-
class ApplicationController <
|
2
|
+
class ApplicationController < ActiveAnalytics.base_controller_class.constantize
|
3
|
+
layout "active_analytics/application"
|
4
|
+
|
5
|
+
helper PagesHelper
|
6
|
+
helper SitesHelper
|
7
|
+
helper BrowsersHelper
|
3
8
|
|
4
9
|
private
|
5
10
|
|
@@ -1,29 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_dependency "active_analytics/application_controller"
|
2
4
|
|
3
5
|
module ActiveAnalytics
|
4
6
|
class AssetsController < ApplicationController
|
5
7
|
protect_from_forgery except: :show
|
6
8
|
|
9
|
+
@@root = ActiveAnalytics::Engine.root.join("app/views", controller_path + "/").to_s
|
10
|
+
|
11
|
+
def self.endpoints
|
12
|
+
return @endpoints if @endpoints
|
13
|
+
paths = Dir["#{@@root}**/*"].keep_if { |path| File.file?(path) }
|
14
|
+
files = paths.map { |path| path.to_s.delete_prefix(@@root).delete_suffix(".erb") }
|
15
|
+
@endpoints = files.delete_if { |str| str.start_with?("_") }
|
16
|
+
end
|
17
|
+
|
7
18
|
def show
|
8
|
-
if endpoints.include?(
|
19
|
+
if self.class.endpoints.include?(params[:file])
|
9
20
|
expires_in(1.day, public: true)
|
10
|
-
|
21
|
+
render_asset(params[:file])
|
11
22
|
else
|
12
|
-
raise ActionController::RoutingError.new
|
23
|
+
raise ActionController::RoutingError.new("Not found #{params[:file]}")
|
13
24
|
end
|
14
25
|
end
|
15
26
|
|
16
27
|
private
|
17
28
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
def mime_type
|
26
|
-
Mime::Type.lookup_by_extension(File.extname(request.path).delete_prefix("."))
|
29
|
+
def render_asset(path)
|
30
|
+
ext = File.extname(params[:file])
|
31
|
+
path_without_ext = path.delete_suffix(ext)
|
32
|
+
mime_type = Mime::Type.lookup_by_extension(ext.delete_prefix("."))
|
33
|
+
render("#{controller_path}/#{path_without_ext}", mime_type: mime_type)
|
27
34
|
end
|
28
35
|
end
|
29
36
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_dependency "active_analytics/application_controller"
|
2
|
+
|
3
|
+
module ActiveAnalytics
|
4
|
+
class BrowsersController < ApplicationController
|
5
|
+
def index
|
6
|
+
@histogram = Histogram.new(current_browsers_per_days.order_by_date.group_by_date, from_date, to_date)
|
7
|
+
@previous_histogram = Histogram.new(previous_browsers_per_days.order_by_date.group_by_date, previous_from_date, previous_to_date)
|
8
|
+
@browsers = current_browsers_per_days.group_by_name.top(100)
|
9
|
+
end
|
10
|
+
|
11
|
+
def show
|
12
|
+
@histogram = Histogram.new(current_browsers_per_days.order_by_date.group_by_date, from_date, to_date)
|
13
|
+
@previous_histogram = Histogram.new(previous_browsers_per_days.order_by_date.group_by_date, previous_from_date, previous_to_date)
|
14
|
+
@browsers = current_browsers_per_days.group_by_version.top(100)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def current_browsers_per_days
|
20
|
+
BrowsersPerDay.filter_by(params)
|
21
|
+
end
|
22
|
+
|
23
|
+
def previous_browsers_per_days
|
24
|
+
BrowsersPerDay.filter_by(params.merge(from: previous_from_date, to: previous_to_date))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -7,16 +7,16 @@ module ActiveAnalytics
|
|
7
7
|
before_action :require_date_range
|
8
8
|
|
9
9
|
def index
|
10
|
-
@histogram =
|
11
|
-
@previous_histogram =
|
10
|
+
@histogram = Histogram.new(current_views_per_days.order_by_date.group_by_date, from_date, to_date)
|
11
|
+
@previous_histogram = Histogram.new(previous_views_per_days.order_by_date.group_by_date, previous_from_date, previous_to_date)
|
12
12
|
@pages = current_views_per_days.top(100).group_by_page
|
13
13
|
end
|
14
14
|
|
15
15
|
def show
|
16
16
|
page_scope = current_views_per_days.where(page: page_from_params)
|
17
17
|
previous_page_scope = previous_views_per_days.where(page: page_from_params)
|
18
|
-
@histogram =
|
19
|
-
@previous_histogram =
|
18
|
+
@histogram = Histogram.new(page_scope.order_by_date.group_by_date, from_date, to_date)
|
19
|
+
@previous_histogram = Histogram.new(previous_page_scope.order_by_date.group_by_date, previous_from_date, previous_to_date)
|
20
20
|
@next_pages = current_views_per_days.where(referrer_host: params[:site], referrer_path: page_from_params).top(100).group_by_page
|
21
21
|
@previous_pages = page_scope.top(100).group_by_referrer_page
|
22
22
|
end
|
@@ -6,8 +6,8 @@ module ActiveAnalytics
|
|
6
6
|
|
7
7
|
def index
|
8
8
|
@referrers = current_views_per_days.top(100).group_by_referrer_site
|
9
|
-
@histogram =
|
10
|
-
@previous_histogram =
|
9
|
+
@histogram = Histogram.new(current_views_per_days.order_by_date.group_by_date, from_date, to_date)
|
10
|
+
@previous_histogram = Histogram.new(previous_views_per_days.order_by_date.group_by_date, previous_from_date, previous_to_date)
|
11
11
|
end
|
12
12
|
|
13
13
|
def show
|
@@ -15,8 +15,8 @@ module ActiveAnalytics
|
|
15
15
|
scope = current_views_per_days.where(referrer_host: referrer_host)
|
16
16
|
scope = scope.where(referrer_path: "/" + referrer_path) if referrer_path.present?
|
17
17
|
previous_scope = previous_views_per_days.where(referrer_host: params[:referrer])
|
18
|
-
@histogram =
|
19
|
-
@previous_histogram =
|
18
|
+
@histogram = Histogram.new(scope.order_by_date.group_by_date, from_date, to_date)
|
19
|
+
@previous_histogram = Histogram.new(previous_scope.order_by_date.group_by_date, previous_from_date, previous_to_date)
|
20
20
|
@previous_pages = scope.top(100).group_by_referrer_page
|
21
21
|
@next_pages = scope.top(100).group_by_page
|
22
22
|
end
|
@@ -10,10 +10,11 @@ module ActiveAnalytics
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def show
|
13
|
-
@histogram =
|
14
|
-
@previous_histogram =
|
13
|
+
@histogram = Histogram.new(current_views_per_days.order_by_date.group_by_date, from_date, to_date)
|
14
|
+
@previous_histogram = Histogram.new(previous_views_per_days.order_by_date.group_by_date, previous_from_date, previous_to_date)
|
15
15
|
@referrers = current_views_per_days.top.group_by_referrer_site
|
16
16
|
@pages = current_views_per_days.top.group_by_page
|
17
|
+
@browsers = BrowsersPerDay.filter_by(params).group_by_name.top
|
17
18
|
end
|
18
19
|
end
|
19
20
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module ActiveAnalytics
|
2
|
+
module BrowsersHelper
|
3
|
+
def browser_icon(browser_name)
|
4
|
+
path = "browsers/#{browser_name.to_s.parameterize(separator: "_")}.svg"
|
5
|
+
if AssetsController.endpoints.include?(path)
|
6
|
+
image_tag(asset_url(path, host: request.host), alt: browser_name, class: "referer-favicon", width: 16, height: 16)
|
7
|
+
else
|
8
|
+
image_tag(asset_url("browsers/default.svg", host: request.host), alt: browser_name, class: "referer-favicon", width: 16, height: 16)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module ActiveAnalytics
|
2
|
+
class Histogram
|
3
|
+
attr_reader :bars, :from_date, :to_date
|
4
|
+
|
5
|
+
def initialize(scope, from_date, to_date)
|
6
|
+
@scope = scope
|
7
|
+
@from_date, @to_date = from_date, to_date
|
8
|
+
@bars = scope.map { |record| Bar.new(record.date, record.total, self) }
|
9
|
+
fill_missing_days(@bars, @from_date, @to_date)
|
10
|
+
end
|
11
|
+
|
12
|
+
def fill_missing_days(bars, from, to)
|
13
|
+
i = 0
|
14
|
+
while (day = from + i) <= to
|
15
|
+
if !@bars[i] || @bars[i].label != day
|
16
|
+
@bars.insert(i, Bar.new(day, 0, self))
|
17
|
+
end
|
18
|
+
i += 1
|
19
|
+
end
|
20
|
+
@bars
|
21
|
+
end
|
22
|
+
|
23
|
+
def max_value
|
24
|
+
@max_total ||= bars.map(&:value).max
|
25
|
+
end
|
26
|
+
|
27
|
+
def total
|
28
|
+
@bars.reduce(0) { |sum, bar| sum += bar.value }
|
29
|
+
end
|
30
|
+
|
31
|
+
class Bar
|
32
|
+
attr_reader :label, :value, :histogram
|
33
|
+
|
34
|
+
def initialize(label, value, histogram)
|
35
|
+
@label, @value, @histogram = label, value, histogram
|
36
|
+
end
|
37
|
+
|
38
|
+
def height
|
39
|
+
if histogram.max_value > 0
|
40
|
+
(value.to_f / histogram.max_value).round(2)
|
41
|
+
else
|
42
|
+
0
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module ActiveAnalytics
|
2
|
+
class BrowsersPerDay < ApplicationRecord
|
3
|
+
# TODO: Deduplicate
|
4
|
+
scope :top, -> (n = 10) { order_by_totals.limit(n) }
|
5
|
+
scope :order_by_date, -> { order(:date) }
|
6
|
+
scope :order_by_totals, -> { order(Arel.sql("SUM(total) DESC")) }
|
7
|
+
scope :between_dates, -> (from, to) { where(date: from..to) }
|
8
|
+
|
9
|
+
def self.append(params)
|
10
|
+
total = params.delete(:total) || 1
|
11
|
+
params[:site] = params[:site].downcase if params[:site]
|
12
|
+
where(params).first.try(:increment!, :total, total) || create!(params.merge(total: total))
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.group_by_name
|
16
|
+
group(:name).select("name, sum(total) AS total")
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.group_by_version
|
20
|
+
group(:name, :version).select("version, sum(total) AS total")
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.group_by_date
|
24
|
+
group(:date).select("date, sum(total) as total")
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.filter_by(params)
|
28
|
+
scope = all
|
29
|
+
scope = scope.between_dates(params[:from], params[:to]) if params[:from].present? && params[:to].present?
|
30
|
+
scope = scope.where(site: params[:site]) if params[:site].present?
|
31
|
+
scope = scope.where(name: params[:id]) if params[:id].present?
|
32
|
+
scope = scope.where(version: params[:version]) if params[:version].present?
|
33
|
+
scope
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_param
|
37
|
+
name
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -26,59 +26,6 @@ module ActiveAnalytics
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
class Day
|
30
|
-
attr_reader :day, :total
|
31
|
-
def initialize(day, total)
|
32
|
-
@day, @total = day, total
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class Histogram
|
37
|
-
attr_reader :bars, :from_date, :to_date
|
38
|
-
|
39
|
-
def initialize(scope, from_date, to_date)
|
40
|
-
@scope = scope
|
41
|
-
@from_date, @to_date = from_date, to_date
|
42
|
-
@bars = scope.map { |day| Bar.new(day.day, day.total, self) }
|
43
|
-
fill_missing_days(@bars, @from_date, @to_date)
|
44
|
-
end
|
45
|
-
|
46
|
-
def fill_missing_days(bars, from, to)
|
47
|
-
i = 0
|
48
|
-
while (day = from + i) <= to
|
49
|
-
if !@bars[i] || @bars[i].label != day
|
50
|
-
@bars.insert(i, Bar.new(day, 0, self))
|
51
|
-
end
|
52
|
-
i += 1
|
53
|
-
end
|
54
|
-
@bars
|
55
|
-
end
|
56
|
-
|
57
|
-
def max_value
|
58
|
-
@max_total ||= bars.map(&:value).max
|
59
|
-
end
|
60
|
-
|
61
|
-
def total
|
62
|
-
@bars.reduce(0) { |sum, bar| sum += bar.value }
|
63
|
-
end
|
64
|
-
|
65
|
-
class Bar
|
66
|
-
attr_reader :label, :value, :histogram
|
67
|
-
|
68
|
-
def initialize(label, value, histogram)
|
69
|
-
@label, @value, @histogram = label, value, histogram
|
70
|
-
end
|
71
|
-
|
72
|
-
def height
|
73
|
-
if histogram.max_value > 0
|
74
|
-
(value.to_f / histogram.max_value).round(2)
|
75
|
-
else
|
76
|
-
0
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
29
|
def self.group_by_site
|
83
30
|
group(:site).pluck("site, SUM(total)").map do |row|
|
84
31
|
Site.new(row[0], row[1])
|
@@ -104,19 +51,16 @@ module ActiveAnalytics
|
|
104
51
|
end
|
105
52
|
|
106
53
|
def self.group_by_date
|
107
|
-
group(:date).
|
108
|
-
Day.new(row[0], row[1])
|
109
|
-
end
|
54
|
+
group(:date).select("date, sum(total) AS total")
|
110
55
|
end
|
111
56
|
|
112
57
|
def self.to_histogram
|
113
|
-
|
58
|
+
Histogram.new(self)
|
114
59
|
end
|
115
60
|
|
116
61
|
def self.append(params)
|
117
62
|
total = params.delete(:total) || 1
|
118
63
|
params[:site] = params[:site].downcase if params[:site]
|
119
|
-
params[:page] = params[:page].downcase if params[:page]
|
120
64
|
params[:referrer_path] = nil if params[:referrer_path].blank?
|
121
65
|
params[:referrer_path] = params[:referrer_path].downcase if params[:referrer_path]
|
122
66
|
params[:referrer_host] = params[:referrer_host].downcase if params[:referrer_host]
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero"><path d="m348.708 140.086-25.184-51.845c-14.53-29.879-44.983-48.922-78.21-48.922-33.754 0-64.585 19.65-78.835 50.236l-34.722 74.533c-25.906-15.186-57.903-15.908-84.466-1.921-41.535 21.687-56.096 73.072-38.744 112.965 9.916 22.951 24.38 44.26 42.11 63.157l-9.128 19.634c-11.951 25.594-10.671 55.473 3.398 79.967a85.722 85.722 0 0 0 31.636 31.85 86.895 86.895 0 0 0 53.716 11.294l.263-.032.23-.033c30.224-3.858 56.376-23.148 68.984-50.877l4.564-9.817a249.136 249.136 0 0 0 40.32 3.169h.378a253.266 253.266 0 0 0 45.738-4.729l5.713 11.755.033.05c14.676 30.026 45.376 49.086 78.801 48.906h.197c40.402-.427 75.453-28.894 84.137-68.36l.066-.33.066-.311a88.03 88.03 0 0 0 -7.536-56.918l-10.26-21.227c33.589-36.676 58.23-82.495 67.9-133.24 4.384-22.705-.542-46.247-13.626-65.324-16.335-23.92-43.587-38.186-72.547-37.972h-.18c-31.045.377-59.61 17.303-74.829 44.359zm-95.482 108.714-1.97-4.038zm-14.168.591 2.282-4.859-2.282 4.86zm-124.588-48.2c-14.217-10.03-32.95-11.229-48.315-3.086 15.366-8.127 34.098-6.945 48.315 3.086zm-32.292 165.565-3.858 8.307zm309.591-216.869a46.445 46.445 0 0 1 32.243-13.56c15.482-.115 30.027 7.519 38.744 20.307a45.885 45.885 0 0 1 7.98 29.223l-78.967-35.986z" fill="#fff"/><path d="m141.377 239.737-20.308 43.67-21.21 45.573a244.52 244.52 0 0 0 25.134 18.256 241.365 241.365 0 0 0 56.507 26.054l20.489-43.998 19.24-41.37c-30.978-6.486-61.99-25.168-79.852-48.201z" fill="#210784"/><path d="m392.656 323.792-42.947-88.454a156.386 156.386 0 0 1 -32.768 30.272 139.997 139.997 0 0 1 -45.426 20.9l41.042 84.317a237.566 237.566 0 0 0 56.639-28.795 246.52 246.52 0 0 0 23.46-18.24z" fill="#26069c"/><path d="m124.927 347.187a236.51 236.51 0 0 1 -25.15-18.256l-21.457 46.132a46.278 46.278 0 0 0 1.838 42.684c3.99 7.026 9.785 12.87 16.795 16.877 8.652 5.072 18.715 7.223 28.697 6.057 16.318-2.085 30.453-12.526 37.217-27.53l18.551-39.894a240.336 240.336 0 0 1 -56.49-26.07z" fill="#2404aa"/><path d="m462.756 156.634c-8.717-12.788-23.262-20.422-38.744-20.307-22.015.262-40.976 16.154-45.08 37.792a139.762 139.762 0 0 1 -29.157 61.219l42.947 88.454c38.875-34.18 67.424-80.64 77.29-132.386a46 46 0 0 0 -7.256-34.772z" fill="#f99"/><path d="m415.837 371.467-23.099-47.74-42.947-88.455-62.779-129.284c-7.732-15.94-23.968-26.103-41.699-26.103-18.01 0-34.443 10.474-42.044 26.809l-61.941 132.978c17.845 23.033 48.94 41.814 79.836 48.15l20.16-43.307a5.43 5.43 0 0 1 4.909-3.136 5.422 5.422 0 0 1 4.86 3.054l20.52 42.076 41.043 84.318 20.308 41.88c7.847 16.04 24.248 26.218 42.11 26.136 21.571-.23 40.287-15.432 44.916-36.495a47.484 47.484 0 0 0 -4.153-30.88z" fill="#ff5060"/><path d="m271.564 286.493a118.23 118.23 0 0 1 -27.876 3.628 107.97 107.97 0 0 1 -22.491-2.331c-30.897-6.42-61.925-25.118-79.754-48.135a81.708 81.708 0 0 1 -10.589-17.566c-6.944-17.665-24.084-29.354-43.062-29.354a46.205 46.205 0 0 0 -21.637 5.369c-21.228 11.032-29.945 38.908-20.358 60.874 11.082 25.676 29.83 49.81 54.11 69.986a234.232 234.232 0 0 0 25.152 18.255 240.336 240.336 0 0 0 56.49 26.07 208.515 208.515 0 0 0 62.976 9.555 212.428 212.428 0 0 0 68-12.033l-40.96-84.318z" fill="#0034fe"/></g></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg viewBox="0 0 436.49 511.97" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(2.05 0 0 -2.05 38.49 992.77)" gradientUnits="userSpaceOnUse" x1="-18.79" x2="194.32" y1="359.73" y2="359.73"><stop offset="0" stop-color="#f1562b"/><stop offset=".3" stop-color="#f1542b"/><stop offset=".41" stop-color="#f04d2a"/><stop offset=".49" stop-color="#ef4229"/><stop offset=".5" stop-color="#ef4029"/><stop offset=".56" stop-color="#e83e28"/><stop offset=".67" stop-color="#e13c26"/><stop offset="1" stop-color="#df3c26"/></linearGradient><path d="m436.49 165.63-15.79-42.88 11-24.6a8.47 8.47 0 0 0 -1.7-9.37l-29.89-30.18a48.16 48.16 0 0 0 -50.23-11.66l-8.19 2.89-45.6-49.4-77.84-.43-77.85.61-45.55 49.8-8.11-2.87a48.33 48.33 0 0 0 -50.55 11.76l-30.57 30.75a6.73 6.73 0 0 0 -1.36 7.47l11.47 25.56-15.73 42.84 56.47 214.72a89.7 89.7 0 0 0 34.7 50.23l111.68 75.69a24.73 24.73 0 0 0 30.89 0l111.62-75.8a88.86 88.86 0 0 0 34.64-50.23l46.07-176.14z" fill="url(#a)"/><path d="m231 317.33a65.61 65.61 0 0 0 -9.11-3.3h-5.49a66.08 66.08 0 0 0 -9.11 3.3l-13.81 5.74-15.6 7.18-25.4 13.24a4.84 4.84 0 0 0 -.62 9l22.06 15.49q7 5 13.55 10.76l6.21 5.35 13 11.37 5.89 5.2a10.15 10.15 0 0 0 12.95 0l25.39-22.18 13.6-10.77 22.06-15.79a4.8 4.8 0 0 0 -.68-8.93l-25.36-12.8-15.69-7.19zm156.4-142.13.8-2.3a61.26 61.26 0 0 0 -.57-9.18 73.51 73.51 0 0 0 -8.19-15.44l-14.35-21.06-10.22-13.88-19.23-24a69.65 69.65 0 0 0 -5.7-6.67h-.4l-8.54 1.58-42.27 8.14a33.49 33.49 0 0 1 -12.59-1.84l-23.21-7.5-16.61-4.59a70.52 70.52 0 0 0 -14.67 0l-16.65 4.64-23.21 7.54a33.89 33.89 0 0 1 -12.59 1.84l-42.22-8-8.54-1.58h-.4a65.79 65.79 0 0 0 -5.7 6.67l-19.2 24q-5.33 6.75-10.14 13.88l-14.39 21.06-6.78 11.31a51 51 0 0 0 -1.94 13.35l.8 2.3a34.51 34.51 0 0 0 1.31 4.34l11.33 13 50.23 53.39a14.31 14.31 0 0 1 2.55 14.34l-8.43 19.46a25.23 25.23 0 0 0 -.39 16l1.64 4.52a43.58 43.58 0 0 0 13.39 18.76l7.89 6.43a15 15 0 0 0 14.35 1.72l28.06-13.43a70.38 70.38 0 0 0 14.38-9.48l22.46-20.27a9 9 0 0 0 3-6.36 9.08 9.08 0 0 0 -2.5-6.56l-50.76-34.15a9.83 9.83 0 0 1 -3.09-12.45l19.66-36.95a19.21 19.21 0 0 0 1-14.67 22.37 22.37 0 0 0 -11.19-10.11l-61.64-23.2c-4.44-1.6-4.2-3.6.51-3.88l36.2-3.59a55.9 55.9 0 0 1 16.9 1.5l31.5 8.8a9.64 9.64 0 0 1 6.74 10.76l-12.37 67.61a34.72 34.72 0 0 0 -.61 11.41c.5 1.61 4.73 3.6 9.36 4.73l19.19 4a46.38 46.38 0 0 0 16.86 0l17.26-4c4.64-1 8.82-3.23 9.35-4.85a34.94 34.94 0 0 0 -.63-11.4l-12.45-67.59a9.66 9.66 0 0 1 6.74-10.76l31.5-8.83a55.87 55.87 0 0 1 16.9-1.5l36.2 3.37c4.74.44 5 2.2.54 3.88l-61.63 23.33a22.08 22.08 0 0 0 -11.16 10.12 19.3 19.3 0 0 0 1 14.67l19.69 36.95a9.84 9.84 0 0 1 -3.08 12.47l-50.66 34.23a9 9 0 0 0 .32 12.78l.15.14 22.49 20.27a71.46 71.46 0 0 0 14.35 9.47l28.06 13.35a14.89 14.89 0 0 0 14.34-1.76l7.9-6.45a43.53 43.53 0 0 0 13.38-18.8l1.65-4.52a25.27 25.27 0 0 0 -.39-16l-8.26-19.49a14.4 14.4 0 0 1 2.55-14.35l50.23-53.45 11.3-13a35.8 35.8 0 0 0 1.54-4.24z" fill="#fff"/></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 -10 276 276"><linearGradient id="a" x1="145" x2="34" y1="253" y2="61" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#1e8e3e"/><stop offset="1" stop-color="#34a853"/></linearGradient><linearGradient id="b" x1="111" x2="222" y1="254" y2="62" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fcc934"/><stop offset="1" stop-color="#fbbc04"/></linearGradient><linearGradient id="c" x1="17" x2="239" y1="80" y2="80" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#d93025"/><stop offset="1" stop-color="#ea4335"/></linearGradient><circle cx="128" cy="128" r="64" fill="#fff"/><path fill="url(#a)" d="M96 183.4A63.7 63.7 0 0 1 72.6 160L17.2 64A128 128 0 0 0 128 256l55.4-96A64 64 0 0 1 96 183.4Z"/><path fill="url(#b)" d="M192 128a63.7 63.7 0 0 1-8.6 32L128 256A128 128 0 0 0 238.9 64h-111a64 64 0 0 1 64 64Z"/><circle cx="128" cy="128" r="52" fill="#1a73e8"/><path fill="url(#c)" d="M96 72.6a63.7 63.7 0 0 1 32-8.6h110.8a128 128 0 0 0-221.7 0l55.5 96A64 64 0 0 1 96 72.6Z"/></svg>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<svg height="16" viewBox="0 0 512 512" width="16" xmlns="http://www.w3.org/2000/svg">
|
2
|
+
<style>
|
3
|
+
:root {
|
4
|
+
color-scheme: dark light;
|
5
|
+
}
|
6
|
+
</style>
|
7
|
+
<path fill="CanvasText" opacity="0.4" d="m256 0c-141.38 0-256 114.62-256 256s114.62 256 256 256 256-114.62 256-256-114.62-256-256-256zm-83.789 41.609c-24.934 27.119-44.68 66.125-56.755 111.992h-65.707c25.43-50.86 69.12-91.077 122.462-111.992zm-146.611 214.391c0-26.999 5.077-52.727 13.662-76.8h70.494c-4.608 24.294-7.356 49.963-7.356 76.8s2.748 52.506 7.347 76.8h-70.485c-8.585-24.073-13.662-49.8-13.662-76.8zm24.149 102.4h65.707c12.083 45.867 31.821 84.872 56.755 111.991-53.342-20.915-97.032-61.132-122.462-111.991zm193.451 126.788c-43.81-8.252-81.877-58.24-101.359-126.788h101.359zm0-152.388h-107.46c-4.924-24.166-7.74-49.997-7.74-76.8s2.816-52.634 7.74-76.8h107.46zm0-179.2h-101.359c19.482-68.548 57.549-118.537 101.359-126.788zm219.051 0h-65.707c-12.083-45.867-31.821-84.873-56.755-111.992 53.342 20.916 97.032 61.133 122.462 111.992zm-193.451-126.788c43.81 8.252 81.877 58.24 101.359 126.788h-101.359zm0 152.388h107.46c4.924 24.166 7.74 49.997 7.74 76.8s-2.816 52.634-7.74 76.8h-107.46zm0 305.988v-126.788h101.359c-19.482 68.548-57.549 118.537-101.359 126.788zm70.989-14.797c24.934-27.127 44.672-66.125 56.755-111.991h65.707c-25.43 50.859-69.12 91.076-122.462 111.991zm62.455-137.591c4.608-24.294 7.356-49.963 7.356-76.8s-2.748-52.506-7.347-76.8h70.494c8.576 24.073 13.653 49.801 13.653 76.8 0 27-5.077 52.727-13.662 76.8z"/>
|
8
|
+
</svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:x="http://www.w3.org/1999/xlink" viewBox="0 0 51500 51500"><radialGradient id="b" cx="87.4%" cy="-12.9%" r="128%" gradientTransform="matrix(.8 0 0 1 .18 .13)"><stop offset=".13" stop-color="#ffbd4f"/><stop offset=".28" stop-color="#ff980e"/><stop offset=".47" stop-color="#ff3750"/><stop offset=".78" stop-color="#eb0878"/><stop offset=".86" stop-color="#e50080"/></radialGradient><radialGradient id="d" cx="49%" cy="40%" r="128%" gradientTransform="matrix(.82 0 0 1 .09 0)"><stop offset=".3" stop-color="#960e18"/><stop offset=".35" stop-color="#b11927" stop-opacity=".74"/><stop offset=".43" stop-color="#db293d" stop-opacity=".34"/><stop offset=".5" stop-color="#f5334b" stop-opacity=".1"/><stop offset=".53" stop-color="#ff3750" stop-opacity="0"/></radialGradient><radialGradient id="e" cx="48%" cy="-12%" r="140%"><stop offset=".13" stop-color="#fff44f"/><stop offset=".53" stop-color="#ff980e"/></radialGradient><radialGradient id="f" cx="22.76%" cy="110.11%" r="100%"><stop offset=".35" stop-color="#3a8ee6"/><stop offset=".67" stop-color="#9059ff"/><stop offset="1" stop-color="#c139e6"/></radialGradient><radialGradient id="h" cx="52%" cy="33%" r="59%" gradientTransform="scale(.9 1)"><stop offset=".21" stop-color="#9059ff" stop-opacity="0"/><stop offset=".97" stop-color="#6e008b" stop-opacity=".6"/></radialGradient><radialGradient id="i" cx="210%" cy="-100%" r="290%"><stop offset=".1" stop-color="#ffe226"/><stop offset=".79" stop-color="#ff7139"/></radialGradient><radialGradient id="j" cx="84%" cy="-41%" r="180%"><stop offset=".11" stop-color="#fff44f"/><stop offset=".46" stop-color="#ff980e"/><stop offset=".72" stop-color="#ff3647"/><stop offset=".9" stop-color="#e31587"/></radialGradient><radialGradient id="k" cx="16.1%" cy="-18.6%" r="348.8%" gradientTransform="matrix(.10453 .46743 -.99452 .04913 -.05 -.26)"><stop offset="0" stop-color="#fff44f"/><stop offset=".3" stop-color="#ff980e"/><stop offset=".57" stop-color="#ff3647"/><stop offset=".74" stop-color="#e31587"/></radialGradient><radialGradient id="l" cx="18.9%" cy="-42.5%" r="238.4%"><stop offset=".14" stop-color="#fff44f"/><stop offset=".48" stop-color="#ff980e"/><stop offset=".66" stop-color="#ff3647"/><stop offset=".9" stop-color="#e31587"/></radialGradient><radialGradient id="m" cx="159.3%" cy="-44.72%" r="313.1%"><stop offset=".09" stop-color="#fff44f"/><stop offset=".63" stop-color="#ff980e"/></radialGradient><linearGradient id="a" x1="87.25%" x2="9.4%" y1="15.5%" y2="93.1%"><stop offset=".05" stop-color="#fff44f"/><stop offset=".37" stop-color="#ff980e"/><stop offset=".53" stop-color="#ff3647"/><stop offset=".7" stop-color="#e31587"/></linearGradient><linearGradient id="n" x1="80%" x2="18%" y1="14%" y2="84%"><stop offset=".17" stop-color="#fff44f" stop-opacity=".8"/><stop offset=".6" stop-color="#fff44f" stop-opacity="0"/></linearGradient><path id="c" d="M47870 16735c-1044-2512-3160-5224-4820-6082 1352 2650 2134 5310 2433 7294 0-6 2 5 4 22l4 26c2268 6147 1032 12398-748 16218-2754 5910-9420 11967-19857 11670-11276-318-21210-8683-23064-19643-338-1728 0-2605 170-4008-207 1080-286 1394-390 3315l-2 123c0 13270 10760 24030 24032 24030 11887 0 21756-8630 23690-19963l110-927c477-4120-53-8453-1560-12075z"/><path id="g" d="M25677 21050c-40 598-2150 2660-2890 2660-6834 0-7943 4133-7943 4133 303 3480 2726 6348 5660 7865 134 70 270 130 405 193a13277 13277 0 00706 289 10674 10674 0 003127 603c11978 562 14300-14320 5655-18640 2213-385 4510 505 5794 1407-2100-3672-6025-6150-10530-6150-285 0-564 24-844 43a12025 12025 0 00-6614 2549c366 310 780 724 1650 1583 1630 1606 5813 3270 5822 3465z"/><path fill="url(#a)" d="M47870 16735c-1044-2512-3160-5224-4820-6082 1352 2650 2134 5310 2433 7294l5 40c-2718-6773-7325-9505-11088-15452l-566-920a7372 7372 0 01-265-497 4370 4370 0 01-359-950 63 63 0 00-55-65 82 82 0 00-45 0l-12 7-17 10 10-14c-6037 3536-8085 10076-8274 13350a12025 12025 0 00-6614 2548 7136 7136 0 00-622-470 11134 11134 0 01-68-5873c-2468 1124-4390 2900-5785 4470h-10c-953-1206-886-5187-832-6018-10-52-710 363-802 425a17507 17507 0 00-2349 2012 21048 21048 0 00-2244 2692l-1 3v-3a20284 20284 0 00-3225 7280l-32 160a39700 39700 0 00-237 1500l-5 52a22907 22907 0 00-390 3316l-1 120c0 13270 10760 24030 24032 24030 11887 0 21756-8630 23690-19963l110-927c477-4120-53-8453-1560-12075zM20170 35545c113 53 220 112 334 164l16 10a12620 12620 0 01-350-174zm5506-14493zm19813-3060l-3-23 4 26z"/><use fill="url(#b)" x:href="#c"/><use fill="url(#d)" x:href="#c"/><path fill="url(#e)" d="M36192 19560l150 110a13070 13070 0 00-2231-2911C26640 9290 32150 563 33080 120l10-13c-6037 3535-8085 10076-8273 13348 280-20 560-43 844-43 4505 0 8430 2477 10530 6150z"/><use fill="url(#f)" x:href="#g"/><use fill="url(#h)" x:href="#g"/><path fill="url(#i)" d="M17083 15204a24404 24404 0 01498 330 11134 11134 0 01-67-5874c-2470 1125-4390 2900-5785 4470 115-3 3600-66 5354 1074z"/><path fill="url(#j)" d="M1822 26240c1855 10960 11788 19325 23063 19644 10437 296 17104-5762 19858-11670 1780-3820 3016-10070 748-16218v-2l-4-24c-2-17-4-28-4-22l5 40c853 5566-1980 10958-6405 14604l-13 30c-8625 7023-16878 4237-18550 3097a14410 14410 0 01-350-174c-5028-2403-7105-6984-6660-10913-4245 0-5693-3580-5693-3580s3812-2718 8836-355c4653 2190 9023 355 9023 354-10-195-4192-1860-5822-3465-872-860-1285-1272-1652-1583a7136 7136 0 00-622-470 28293 28293 0 00-498-330c-1753-1140-5240-1076-5355-1073h-10c-953-1207-886-5188-832-6020-10-50-710 363-802 426a17507 17507 0 00-2349 2012 21048 21048 0 00-2244 2692l-1 3v-3a20284 20284 0 00-3225 7280c-10 52-865 3784-444 5720z"/><path fill="url(#k)" d="M34110 16760a13070 13070 0 012231 2910l360 296c5450 5020 2594 12120 2380 12626 4426-3646 7258-9038 6405-14604-2716-6774-7323-9506-11086-15453l-566-920a7372 7372 0 01-265-497 4370 4370 0 01-359-950 63 63 0 00-55-65 82 82 0 00-45 0l-12 7-17 10c-930 443-6440 9170 1030 16640z"/><path fill="url(#l)" d="M36702 19965a4743 4743 0 00-360-295l-150-110c-1283-900-3580-1792-5794-1407 8644 4322 6323 19203-5655 18640a10674 10674 0 01-3127-603 13451 13451 0 01-706-289 9064 9064 0 01-405-193l16 10c1670 1140 9924 3925 18550-3097l13-30c213-506 3068-7606-2380-12626z"/><path fill="url(#m)" d="M14844 27844s1110-4133 7943-4133c740 0 2850-2062 2890-2660s-4370 1836-9023-354c-5024-2363-8836 354-8836 354s1448 3580 5693 3580c-445 3930 1632 8510 6660 10913 113 53 218 112 334 164-2935-1517-5358-4384-5660-7865z"/><path fill="url(#n)" d="M47870 16735c-1044-2512-3160-5224-4820-6082 1352 2650 2134 5310 2433 7294l5 40c-2718-6773-7325-9505-11088-15452l-566-920a7372 7372 0 01-265-497 4370 4370 0 01-359-950 63 63 0 00-55-65 82 82 0 00-45 0l-12 7-17 10 10-14c-6037 3536-8085 10076-8274 13350 280-20 560-43 845-43 4505 0 8430 2477 10530 6148-1284-900-3580-1792-5795-1407 8644 4322 6323 19203-5655 18640a10674 10674 0 01-3127-603 13451 13451 0 01-706-289 9064 9064 0 01-405-193l17 10a14410 14410 0 01-350-174c112 53 218 112 333 164-2935-1517-5358-4384-5660-7865 0 0 1108-4133 7942-4133 740 0 2850-2062 2890-2660-10-195-4190-1860-5822-3465-870-860-1285-1272-1650-1583a7136 7136 0 00-623-470 11134 11134 0 01-67-5873c-2470 1124-4390 2900-5785 4470h-10c-953-1207-886-5187-832-6020-10-50-710 363-802 426a17507 17507 0 00-2349 2012 21048 21048 0 00-2243 2692l-1 3v-3a20284 20284 0 00-3225 7280l-32 160a39787 39787 0 00-277 1515c-2 18 2-17 0 0a27956 27956 0 00-355 3353l-3 122c0 13270 10760 24030 24032 24030 11887 0 21756-8630 23690-19963l110-927c477-4120-53-8453-1560-12075zm-2384 1234l4 26v-2l-4-24z"/></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg height="218.79" width="222.64" xmlns="http://www.w3.org/2000/svg"><path d="m533.03 388.73c0-16.968-4.387-32.909-12.08-46.761 32.791-74.213-35.136-63.343-38.918-62.603-14.391 2.816-27.705 7.337-39.986 13.068-1.811-.102-3.633-.158-5.469-.158-45.833 0-84.198 31.968-94.017 74.823 24.157-27.101 41.063-38.036 51.187-42.412-1.616 1.444-3.198 2.904-4.754 4.375-.518.489-1.017.985-1.528 1.477-1.026.987-2.05 1.975-3.05 2.972-.595.593-1.174 1.191-1.76 1.788-.887.903-1.772 1.805-2.638 2.713-.615.645-1.215 1.292-1.819 1.938-.809.866-1.613 1.733-2.402 2.603-.613.676-1.216 1.352-1.818 2.03-.748.842-1.489 1.684-2.22 2.528-.606.7-1.207 1.4-1.801 2.101-.693.818-1.377 1.636-2.054 2.454-.599.724-1.196 1.447-1.782 2.17-.634.782-1.254 1.563-1.873 2.343-.6.756-1.2 1.511-1.786 2.266-.558.719-1.1 1.435-1.646 2.152-.616.81-1.237 1.62-1.837 2.426-.429.577-.841 1.148-1.262 1.723-3.811 5.2-7.293 10.3-10.438 15.199-.008.012-.016.024-.023.036-.828 1.29-1.627 2.561-2.41 3.821-.042.068-.086.137-.128.206-.784 1.265-1.541 2.508-2.279 3.738-.026.043-.053.087-.079.13-1.984 3.311-3.824 6.503-5.481 9.506-8.687 15.743-12.916 26.742-13.099 27.395-27.432 98.072 58.184 56.657 70.131 50.475 12.864 6.355 27.346 9.932 42.666 9.932 41.94 0 77.623-26.771 90.905-64.156h-50.68c-7.499 12.669-21.936 21.25-38.522 21.25-24.301 0-44-18.412-44-41.125h137.96c.523-4.068.794-8.214.794-12.423zm-18.018-94.916c8.306 5.606 14.968 14.41 3.527 44.059-10.973-17.647-27.482-31.49-47.104-39.099 8.926-4.311 31.031-13.429 43.577-4.96zm-176.52 181.24c-6.765-6.938-7.961-23.836 6.967-54.628 7.534 21.661 22.568 39.811 42 51.33-9.664 5.319-35.32 17.295-48.967 3.298zm55.571-100.28c.771-22.075 19.983-39.75 43.588-39.75 23.604 0 42.817 17.675 43.588 39.75z" fill="#1ebbee" transform="translate(-314.39 -274.4)"/></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:x="http://www.w3.org/1999/xlink" viewBox="0 0 27600 27600"><linearGradient id="a" gradientUnits="userSpaceOnUse"/><linearGradient id="b" x1="6870" x2="24704" y1="18705" y2="18705" x:href="#a"><stop offset="0" stop-color="#0c59a4"/><stop offset="1" stop-color="#114a8b"/></linearGradient><linearGradient id="c" x1="16272" x2="5133" y1="10968" y2="23102" x:href="#a"><stop offset="0" stop-color="#1b9de2"/><stop offset=".16" stop-color="#1595df"/><stop offset=".67" stop-color="#0680d7"/><stop offset="1" stop-color="#0078d4"/></linearGradient><radialGradient id="d" cx="16720" cy="18747" r="9538" x:href="#a"><stop offset=".72" stop-opacity="0"/><stop offset=".95" stop-opacity=".53"/><stop offset="1"/></radialGradient><radialGradient id="e" cx="7130" cy="19866" r="14324" gradientTransform="matrix(.14843 -.98892 .79688 .1196 -8759 25542)" x:href="#a"><stop offset=".76" stop-opacity="0"/><stop offset=".95" stop-opacity=".5"/><stop offset="1"/></radialGradient><radialGradient id="f" cx="2523" cy="4680" r="20243" gradientTransform="matrix(-.03715 .99931 -2.12836 -.07913 13579 3530)" x:href="#a"><stop offset="0" stop-color="#35c1f1"/><stop offset=".11" stop-color="#34c1ed"/><stop offset=".23" stop-color="#2fc2df"/><stop offset=".31" stop-color="#2bc3d2"/><stop offset=".67" stop-color="#36c752"/></radialGradient><radialGradient id="g" cx="24247" cy="7758" r="9734" gradientTransform="matrix(.28109 .95968 -.78353 .22949 24510 -16292)" x:href="#a"><stop offset="0" stop-color="#66eb6e"/><stop offset="1" stop-color="#66eb6e" stop-opacity="0"/></radialGradient><path id="h" d="M24105 20053a9345 9345 0 01-1053 472 10202 10202 0 01-3590 646c-4732 0-8855-3255-8855-7432 0-1175 680-2193 1643-2729-4280 180-5380 4640-5380 7253 0 7387 6810 8137 8276 8137 791 0 1984-230 2704-456l130-44a12834 12834 0 006660-5282c220-350-168-757-535-565z"/><path id="i" d="M11571 25141a7913 7913 0 01-2273-2137 8145 8145 0 01-1514-4740 8093 8093 0 013093-6395 8082 8082 0 011373-859c312-148 846-414 1554-404a3236 3236 0 012569 1297 3184 3184 0 01636 1866c0-21 2446-7960-8005-7960-4390 0-8004 4166-8004 7820 0 2319 538 4170 1212 5604a12833 12833 0 007684 6757 12795 12795 0 003908 610c1414 0 2774-233 4045-656a7575 7575 0 01-6278-803z"/><path id="j" d="M16231 15886c-80 105-330 250-330 566 0 260 170 512 472 723 1438 1003 4149 868 4156 868a5954 5954 0 003027-839 6147 6147 0 001133-850 6180 6180 0 001910-4437c26-2242-796-3732-1133-4392-2120-4141-6694-6525-11668-6525-7011 0-12703 5635-12798 12620 47-3654 3679-6605 7996-6605 350 0 2346 34 4200 1007 1634 858 2490 1894 3086 2921 618 1067 728 2415 728 2952s-271 1333-780 1990z"/><use fill="url(#b)" x:href="#h"/><use fill="url(#d)" opacity=".35" x:href="#h"/><use fill="url(#c)" x:href="#i"/><use fill="url(#e)" opacity=".4" x:href="#i"/><use fill="url(#f)" x:href="#j"/><use fill="url(#g)" x:href="#j"/></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1090 1090"><linearGradient id="a" x1="461" x2="461" y1="59" y2="1033" gradientUnits="userSpaceOnUse"><stop offset=".6" stop-color="#ff1b2d"/><stop offset="1" stop-color="#a70014"/></linearGradient><linearGradient id="b" x1="714" x2="714" y1="116" y2="978" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#9c0000"/><stop offset=".7" stop-color="#ff4b4b"/></linearGradient><path fill="url(#a)" d="M545 42.5a502.5 502.5 0 10334.9 877.1 362.4 362.4 0 01-201.4 61.5c-119.7 0-226.8-59.4-299-153-55.6-65.6-91.5-162.5-94-271.3V533c2.5-108.8 38.4-205.8 94-271.3 72-93.6 179.3-153 299-153 73.6 0 142.5 22.5 201.4 61.6a500.8 500.8 0 00-333-127.9h-2z"/><path fill="url(#b)" d="M379.6 261.8c46-54.4 105.7-87.3 170.7-87.3 146.3 0 265 166 265 370.4 0 204.6-118.6 370.4-265 370.4-65 0-124.6-32.8-170.7-87.2 72 93.6 179.2 153 299 153A363 363 0 00880 919.6 501 501 0 001047.5 545a501.1 501.1 0 00-167.6-374.6 362.4 362.4 0 00-201.4-61.5c-119.7 0-226.8 59.4-299 153"/></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg preserveAspectRatio="xMidYMid" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" x1="50%" x2="50%" y1="100%" y2="0%"><stop offset=".25" stop-color="#dbdbda"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient id="b" x1="49.05%" x2="25.713%" y1="35.703%" y2="77.572%"><stop offset="0" stop-opacity="0"/><stop offset="1"/></linearGradient><filter id="c" height="200%" width="200%" x="-50%" y="-50%"><feOffset dy="2" in="SourceAlpha" result="shadowOffsetOuter1"/><feGaussianBlur in="shadowOffsetOuter1" result="shadowBlurOuter1" stdDeviation="2"/><feColorMatrix in="shadowBlurOuter1" result="shadowMatrixOuter1" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.266007133 0"/><feMerge><feMergeNode in="shadowMatrixOuter1"/><feMergeNode in="SourceGraphic"/></feMerge></filter><filter id="d" height="200%" width="200%" x="-50%" y="-50%"><feOffset dy="1" in="SourceAlpha" result="shadowOffsetOuter1"/><feGaussianBlur in="shadowOffsetOuter1" result="shadowBlurOuter1" stdDeviation="2"/><feColorMatrix in="shadowBlurOuter1" result="shadowMatrixOuter1" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 0"/><feMerge><feMergeNode in="shadowMatrixOuter1"/><feMergeNode in="SourceGraphic"/></feMerge></filter><radialGradient id="e" cx="57.025%" cy="39.017%" r="61.032%"><stop offset="0" stop-color="#2abce1"/><stop offset=".11363" stop-color="#2abbe1"/><stop offset="1" stop-color="#3375f8"/></radialGradient><g transform="translate(4 2)"><circle cx="124" cy="124" fill="url(#a)" filter="url(#c)" r="124"/><circle cx="124" cy="124" fill="url(#e)" r="114.7"/><g transform="translate(9.688 8.719)"><path d="m114.506 28.481c-.775 0-1.453-.581-1.453-1.356v-20.247c0-.775.678-1.356 1.453-1.356s1.453.581 1.453 1.356v20.247c-.097.775-.678 1.356-1.453 1.356z" fill="#f3f3f3"/><path d="m114.506 28.578c-.872 0-1.55-.678-1.55-1.453v-20.247c0-.775.678-1.453 1.55-1.453s1.55.678 1.55 1.453v20.247c0 .775-.775 1.453-1.55 1.453zm0-22.96c-.678 0-1.356.582-1.356 1.26v20.247c0 .678.581 1.26 1.356 1.26.678 0 1.356-.582 1.356-1.26v-20.247c-.096-.678-.678-1.26-1.356-1.26z" fill="#fff"/><path d="m124.194 17.631c-.775-.097-1.356-.678-1.356-1.453l.678-9.01c.096-.774.775-1.356 1.55-1.259s1.356.679 1.356 1.454l-.678 9.009c-.097.775-.775 1.356-1.55 1.26z" fill="#f3f3f3"/><path d="m124.194 17.728c-.872-.097-1.453-.775-1.453-1.55l.678-9.01c.097-.774.775-1.452 1.647-1.356.871.097 1.453.776 1.453 1.55l-.678 9.01c-.097.872-.775 1.453-1.647 1.356zm.872-11.722c-.678 0-1.357.485-1.357 1.163l-.678 9.01c0 .677.485 1.259 1.26 1.355.678 0 1.356-.484 1.356-1.162l.678-9.01c0-.678-.581-1.259-1.26-1.356z" fill="#fff"/><path d="m131.46 30.225c-.776-.194-1.26-.872-1.163-1.647l3.972-19.86c.194-.774.872-1.259 1.647-1.065s1.259.872 1.162 1.647l-3.972 19.86c-.097.677-.872 1.162-1.647 1.065z" fill="#f3f3f3"/><path d="m131.46 30.322c-.873-.194-1.357-.969-1.26-1.744l3.972-19.86c.194-.774.969-1.356 1.84-1.162.872.194 1.357.969 1.26 1.744l-3.972 19.86c-.194.774-.969 1.259-1.84 1.162zm4.552-22.572c-.678-.097-1.356.29-1.55.969l-3.971 19.86c-.097.677.29 1.355 1.065 1.55.678.096 1.356-.292 1.55-.97l3.972-19.859c.097-.775-.387-1.356-1.066-1.55z" fill="#fff"/><path d="m143.084 21.506a1.444 1.444 0 0 1 -1.065-1.744l2.422-8.718c.193-.775.968-1.163 1.743-.969s1.26.969 1.066 1.744l-2.422 8.719c-.194.774-.969 1.162-1.744.968z" fill="#f3f3f3"/><path d="m143.084 21.603c-.775-.194-1.356-1.066-1.065-1.84l2.422-8.72c.193-.774 1.065-1.259 1.84-1.065s1.356 1.066 1.066 1.84l-2.422 8.72c-.194.774-.969 1.259-1.84 1.065zm3.197-11.334c-.678-.194-1.453.194-1.647.872l-2.421 8.718c-.194.678.193 1.357.968 1.55.678.194 1.453-.193 1.647-.871l2.422-8.72c.097-.677-.29-1.355-.969-1.55z" fill="#fff"/><path d="m147.831 35.166c-.775-.291-1.065-1.163-.775-1.841l7.75-18.697c.29-.678 1.163-1.066 1.84-.678.776.29 1.067 1.163.776 1.84l-7.75 18.697c-.29.679-1.163 1.066-1.84.679z" fill="#f3f3f3"/><path d="m147.831 35.263a1.505 1.505 0 0 1 -.872-1.938l7.75-18.697c.291-.775 1.163-1.066 2.035-.775a1.505 1.505 0 0 1 .872 1.938l-7.75 18.697c-.388.775-1.26 1.162-2.035.775zm8.816-21.216c-.678-.29-1.453 0-1.744.678l-7.75 18.697c-.29.678.097 1.356.775 1.647.678.29 1.453 0 1.744-.678l7.75-18.697c.194-.582-.097-1.357-.775-1.647z" fill="#fff"/><path d="m160.91 28.966c-.679-.388-.97-1.163-.679-1.841l4.069-8.04c.387-.679 1.162-.97 1.938-.582.678.388.968 1.163.678 1.84l-4.07 8.041c-.387.678-1.162.97-1.937.582z" fill="#f3f3f3"/><path d="m160.91 29.063c-.776-.388-1.066-1.26-.679-2.035l4.069-8.04c.387-.776 1.26-1.066 2.034-.679.775.388 1.066 1.26.678 2.035l-4.068 8.04c-.388.775-1.26 1.066-2.035.678zm5.328-10.56c-.679-.29-1.454-.097-1.744.581l-4.069 8.041c-.29.581 0 1.356.581 1.744.678.29 1.453.097 1.744-.581l4.069-8.041c.29-.581 0-1.356-.581-1.744z" fill="#fff"/><path d="m162.847 43.303c-.678-.484-.872-1.356-.388-1.937l11.238-16.76c.387-.678 1.26-.775 1.937-.387.679.484.872 1.356.388 1.937l-11.238 16.76c-.387.678-1.259.872-1.937.387z" fill="#f3f3f3"/><path d="m162.847 43.4c-.678-.484-.872-1.453-.484-2.131l11.237-16.76c.484-.678 1.356-.872 2.131-.387.678.484.872 1.453.485 2.131l-11.238 16.76c-.484.678-1.453.871-2.131.387zm12.787-19.084c-.58-.388-1.453-.291-1.84.29l-11.238 16.76c-.387.58-.194 1.356.388 1.743.581.388 1.453.291 1.84-.29l11.238-16.663c.387-.581.194-1.453-.388-1.84z" fill="#fff"/><path d="m176.99 39.719c-.58-.485-.774-1.357-.29-1.938l5.619-7.072c.484-.58 1.356-.678 1.937-.193.582.484.775 1.356.29 1.937l-5.618 7.072c-.484.581-1.356.678-1.937.194z" fill="#f3f3f3"/><path d="m176.894 39.816c-.678-.485-.775-1.454-.29-2.132l5.618-7.071c.484-.679 1.453-.776 2.131-.194.678.484.775 1.453.29 2.131l-5.618 7.072c-.484.678-1.453.775-2.131.194zm7.265-9.204c-.58-.484-1.356-.387-1.84.194l-5.619 7.072c-.387.581-.29 1.356.29 1.84.582.485 1.357.388 1.841-.193l5.619-7.072c.388-.581.29-1.453-.29-1.84z" fill="#fff"/><path d="m176.022 54.25c-.581-.581-.581-1.453 0-1.938l14.337-14.24c.582-.581 1.453-.485 1.938 0 .484.484.581 1.453 0 1.937l-14.24 14.241c-.582.581-1.454.581-2.035 0z" fill="#f3f3f3"/><path d="m175.925 54.347a1.52 1.52 0 0 1 0-2.131l14.337-14.241a1.52 1.52 0 0 1 2.132 0 1.52 1.52 0 0 1 0 2.131l-14.338 14.24a1.52 1.52 0 0 1 -2.131 0zm16.372-16.275c-.484-.485-1.356-.485-1.84 0l-14.338 14.24c-.485.485-.485 1.357 0 1.841.484.485 1.356.485 1.84 0l14.338-14.24c.484-.485.484-1.26 0-1.841z" fill="#fff"/><path d="m190.553 53.475c-.484-.581-.484-1.453.097-1.938l6.878-5.812c.581-.484 1.453-.388 1.938.194.484.581.484 1.453-.097 1.937l-6.878 5.813c-.582.484-1.454.387-1.938-.194z" fill="#f3f3f3"/><path d="m190.456 53.572c-.581-.678-.484-1.647.097-2.131l6.878-5.813c.581-.581 1.55-.484 2.131.194.582.678.485 1.647-.096 2.131l-6.879 5.813c-.58.58-1.55.484-2.13-.194zm8.913-7.653c-.485-.581-1.26-.581-1.84-.194l-6.879 5.813c-.484.484-.581 1.259-.097 1.84s1.26.581 1.84.194l6.879-5.813c.581-.484.581-1.259.097-1.84z" fill="#fff"/><path d="m186.678 67.425c-.484-.678-.29-1.55.388-1.938l16.856-11.237c.678-.388 1.55-.194 1.937.388.485.678.291 1.55-.387 1.937l-16.856 11.237c-.582.388-1.454.194-1.938-.387z" fill="#f3f3f3"/><path d="m186.581 67.425c-.484-.678-.29-1.647.388-2.131l16.856-11.238c.678-.484 1.647-.29 2.131.485.485.678.29 1.647-.387 2.13l-16.856 11.239c-.679.485-1.647.291-2.132-.484zm19.181-12.69c-.387-.582-1.162-.776-1.743-.388l-16.857 11.237c-.58.388-.775 1.163-.29 1.841.387.581 1.162.775 1.744.388l16.856-11.238c.581-.484.678-1.26.29-1.84z" fill="#fff"/><path d="m201.113 69.46c-.388-.679-.194-1.55.484-1.938l7.847-4.456c.678-.388 1.55-.097 1.937.58.388.679.194 1.55-.484 1.938l-7.847 4.457c-.678.387-1.55.097-1.938-.582z" fill="#f3f3f3"/><path d="m201.016 69.556c-.388-.775-.194-1.647.484-2.034l7.847-4.456c.678-.388 1.647-.097 2.034.58.388.776.194 1.648-.484 2.035l-7.847 4.457c-.678.387-1.647.096-2.034-.582zm10.268-5.812c-.387-.678-1.162-.872-1.743-.485l-7.847 4.457c-.581.387-.775 1.162-.485 1.743.388.678 1.163.872 1.744.485l7.847-4.457c.581-.29.775-1.065.484-1.743z" fill="#fff"/><path d="m194.622 82.344c-.29-.775 0-1.55.775-1.84l18.697-7.75c.678-.291 1.55.096 1.84.774.291.775 0 1.55-.775 1.84l-18.696 7.75c-.679.291-1.55 0-1.841-.774z" fill="#f3f3f3"/><path d="m194.525 82.44c-.29-.774 0-1.646.775-2.034l18.697-7.75a1.505 1.505 0 0 1 1.937.872c.291.775 0 1.647-.775 2.034l-18.696 7.75a1.505 1.505 0 0 1 -1.938-.871zm21.216-8.815c-.291-.678-1.066-.969-1.647-.775l-18.697 7.75c-.678.29-.969 1.066-.678 1.744.29.678 1.065.969 1.647.775l18.696-7.75c.679-.29.97-1.066.679-1.744z" fill="#fff"/><path d="m208.281 87.188c-.29-.776.097-1.55.872-1.841l8.525-2.81c.678-.29 1.55.194 1.744.872.29.775-.097 1.55-.872 1.841l-8.525 2.81c-.678.29-1.453-.097-1.744-.873z" fill="#f3f3f3"/><path d="m208.184 87.284c-.29-.775.097-1.647.97-1.937l8.524-2.81c.775-.29 1.647.194 1.938.97.29.774-.097 1.646-.97 1.937l-8.524 2.81c-.775.193-1.647-.195-1.938-.97zm11.238-3.68c-.194-.679-.969-1.067-1.647-.873l-8.525 2.81c-.678.193-.969.968-.775 1.647.194.678.969 1.065 1.647.871l8.525-2.809c.678-.29.969-.969.775-1.647z" fill="#fff"/><path d="m199.563 98.716c-.194-.775.29-1.55 1.065-1.647l19.86-3.875c.774-.194 1.453.387 1.646 1.162.194.775-.29 1.55-1.065 1.647l-19.86 3.875c-.775.097-1.55-.387-1.647-1.162z" fill="#f3f3f3"/><path d="m199.369 98.716c-.194-.872.387-1.647 1.162-1.841l19.86-3.875c.775-.194 1.55.388 1.743 1.26.194.871-.387 1.646-1.162 1.84l-19.86 3.875c-.774.194-1.55-.387-1.743-1.26zm22.572-4.36c-.097-.678-.775-1.162-1.453-1.065l-19.86 3.875c-.678.097-1.162.871-.969 1.55.097.678.775 1.162 1.454 1.065l19.859-3.875c.678-.194 1.162-.872.969-1.55z" fill="#fff"/><path d="m211.963 106.175c-.097-.775.387-1.453 1.162-1.55l8.912-1.066c.775-.096 1.454.485 1.55 1.26.097.775-.387 1.453-1.162 1.55l-8.913 1.065c-.678.097-1.453-.484-1.55-1.259z" fill="#f3f3f3"/><path d="m211.866 106.175c-.097-.872.484-1.647 1.259-1.744l8.912-1.065c.775-.097 1.55.484 1.647 1.356s-.484 1.647-1.259 1.744l-8.913 1.065c-.774.097-1.55-.484-1.646-1.356zm11.721-1.356c-.096-.678-.774-1.26-1.453-1.163l-8.912 1.066c-.678.097-1.163.775-1.066 1.453s.775 1.26 1.453 1.163l8.913-1.066c.678-.097 1.162-.775 1.066-1.453z" fill="#fff"/><path d="m201.113 115.572c0-.775.58-1.453 1.356-1.453h20.247c.775 0 1.356.678 1.356 1.453s-.581 1.453-1.356 1.453h-20.247c-.775 0-1.356-.678-1.356-1.453z" fill="#f3f3f3"/><path d="m201.016 115.572c0-.872.678-1.55 1.453-1.55h20.247c.775 0 1.453.678 1.453 1.55s-.678 1.55-1.453 1.55h-20.247c-.775 0-1.453-.678-1.453-1.55zm22.959.097c0-.678-.581-1.356-1.26-1.356h-20.245c-.678 0-1.26.58-1.26 1.356 0 .678.582 1.356 1.26 1.356h20.247c.678-.097 1.259-.678 1.259-1.356z" fill="#fff"/><path d="m211.866 125.356c.096-.775.678-1.356 1.453-1.356l9.01.678c.774.097 1.355.775 1.258 1.55-.096.775-.678 1.356-1.453 1.356l-9.009-.678c-.678-.097-1.26-.775-1.26-1.55z" fill="#f3f3f3"/><path d="m211.769 125.356c.097-.872.775-1.453 1.55-1.453l9.01.678c.774.097 1.452.775 1.355 1.647-.096.872-.775 1.453-1.55 1.453l-9.009-.678c-.775-.097-1.356-.872-1.356-1.647zm11.819.872c.096-.678-.485-1.356-1.163-1.356l-9.01-.678c-.677 0-1.259.484-1.356 1.26-.096.677.485 1.355 1.163 1.355l9.01.678c.677 0 1.259-.58 1.356-1.259z" fill="#fff"/><path d="m199.369 132.428c.194-.775.872-1.26 1.647-1.162l19.859 3.972c.775.193 1.26.871 1.066 1.646s-.872 1.26-1.647 1.163l-19.86-3.972c-.678-.097-1.162-.872-1.065-1.647z" fill="#f3f3f3"/><path d="m199.272 132.428c.194-.872.969-1.356 1.744-1.26l19.859 3.973c.775.193 1.356.968 1.162 1.84-.193.872-.968 1.357-1.743 1.26l-19.86-3.972c-.775-.194-1.259-.969-1.162-1.84zm22.572 4.553c.097-.678-.29-1.356-.969-1.55l-19.86-3.972c-.677-.096-1.356.291-1.55 1.066-.096.678.291 1.356.97 1.55l19.859 3.972c.775.097 1.356-.388 1.55-1.066z" fill="#fff"/><path d="m208.088 144.053a1.444 1.444 0 0 1 1.743-1.065l8.719 2.421c.775.194 1.162.97.969 1.744a1.444 1.444 0 0 1 -1.744 1.066l-8.719-2.422c-.775-.194-1.162-.969-.969-1.744z" fill="#f3f3f3"/><path d="m207.99 144.053c.194-.775 1.066-1.356 1.841-1.065l8.719 2.421c.775.194 1.26 1.066 1.066 1.841s-1.066 1.356-1.841 1.066l-8.719-2.422c-.775-.194-1.26-.969-1.065-1.84zm11.335 3.197c.194-.678-.194-1.453-.872-1.647l-8.719-2.422c-.678-.194-1.356.194-1.55.969-.193.678.194 1.453.872 1.647l8.719 2.422c.678.097 1.356-.29 1.55-.969z" fill="#fff"/><path d="m194.428 148.703c.29-.775 1.163-1.066 1.84-.775l18.698 7.75c.678.29 1.065 1.163.775 1.84-.291.776-1.163 1.066-1.841.776l-18.697-7.75c-.775-.29-1.066-1.163-.775-1.84z" fill="#f3f3f3"/><path d="m194.331 148.606a1.505 1.505 0 0 1 1.938-.872l18.697 7.75c.775.291 1.065 1.163.775 2.035a1.505 1.505 0 0 1 -1.938.872l-18.697-7.75c-.775-.388-1.065-1.26-.775-2.035zm21.216 8.816c.29-.678 0-1.453-.678-1.744l-18.697-7.75c-.678-.29-1.356.097-1.647.775-.29.678 0 1.453.678 1.744l18.697 7.75c.678.194 1.453-.097 1.647-.775z" fill="#fff"/><path d="m200.725 161.781c.388-.678 1.162-.969 1.84-.678l8.041 4.069c.678.29.969 1.162.582 1.937-.388.678-1.163.97-1.841.678l-8.04-4.068c-.679-.388-.97-1.26-.582-1.938z" fill="#f3f3f3"/><path d="m200.628 161.684c.388-.775 1.26-1.065 2.035-.678l8.04 4.069c.775.388 1.066 1.26.678 2.034-.387.775-1.26 1.066-2.034.678l-8.04-4.068c-.776-.29-1.066-1.26-.679-2.035zm10.463 5.328c.29-.678.096-1.453-.582-1.743l-8.04-4.069c-.582-.29-1.356 0-1.744.581-.29.678-.097 1.453.581 1.744l8.04 4.069c.679.29 1.454.097 1.745-.582z" fill="#fff"/><path d="m186.484 163.622c.485-.678 1.26-.872 1.938-.388l16.856 11.238c.678.387.775 1.26.388 1.937-.485.679-1.26.872-1.938.388l-16.856-11.238c-.678-.484-.872-1.356-.388-1.937z" fill="#f3f3f3"/><path d="m186.387 163.525c.485-.678 1.454-.872 2.132-.484l16.856 11.237c.678.484.872 1.356.387 2.131-.484.679-1.453.872-2.13.485l-16.857-11.238c-.775-.484-.872-1.453-.388-2.131zm19.085 12.787c.387-.58.29-1.453-.29-1.84l-16.857-11.238c-.581-.387-1.356-.193-1.744.388-.387.581-.29 1.453.29 1.84l16.857 11.238c.581.388 1.356.194 1.744-.387z" fill="#fff"/><path d="m190.069 177.669c.484-.582 1.356-.775 1.937-.29l7.072 5.521c.581.484.678 1.356.194 1.938-.484.58-1.356.775-1.938.29l-7.072-5.522c-.58-.484-.678-1.356-.193-1.937z" fill="#f3f3f3"/><path d="m189.972 177.572c.484-.678 1.453-.775 2.131-.29l7.072 5.521c.678.484.775 1.453.29 2.131-.484.679-1.453.775-2.13.291l-7.073-5.522c-.678-.484-.774-1.453-.29-2.131zm9.3 7.266c.484-.582.387-1.357-.194-1.841l-7.072-5.522c-.581-.387-1.356-.29-1.84.29-.485.582-.388 1.357.193 1.841l7.072 5.522c.581.388 1.356.29 1.84-.29z" fill="#fff"/><path d="m175.634 176.7c.582-.581 1.454-.581 1.938 0l14.337 14.24c.582.582.485 1.454 0 1.938-.58.581-1.453.581-1.937 0l-14.338-14.24c-.484-.485-.484-1.454 0-1.938z" fill="#f3f3f3"/><path d="m175.634 176.603a1.52 1.52 0 0 1 2.132 0l14.337 14.24a1.52 1.52 0 0 1 0 2.132 1.52 1.52 0 0 1 -2.131 0l-14.338-14.24c-.678-.582-.678-1.55 0-2.132zm16.275 16.178c.485-.484.485-1.356 0-1.84l-14.337-14.241c-.484-.484-1.356-.484-1.84 0-.485.484-.485 1.356 0 1.84l14.337 14.241c.484.582 1.26.582 1.84 0z" fill="#fff"/><path d="m176.506 191.134c.582-.484 1.453-.484 1.938.097l5.91 6.781c.483.582.387 1.454-.195 1.938-.58.484-1.453.484-1.937-.097l-5.91-6.781c-.484-.484-.387-1.356.194-1.938z" fill="#f3f3f3"/><path d="m176.41 191.134c.678-.58 1.55-.484 2.13.097l5.91 6.781c.581.582.484 1.55-.194 2.132-.678.581-1.55.484-2.131-.097l-5.91-6.781c-.484-.678-.484-1.647.194-2.132zm7.75 8.816c.58-.484.58-1.26.193-1.84l-5.91-6.782c-.484-.484-1.259-.581-1.84-.097-.581.485-.581 1.26-.194 1.84l5.91 6.782c.484.581 1.26.581 1.84.097z" fill="#fff"/><path d="m162.556 187.453c.678-.484 1.55-.29 1.938.388l11.236 16.759c.388.678.194 1.55-.387 1.938-.678.484-1.55.29-1.938-.388l-11.237-16.76c-.388-.677-.194-1.55.387-1.937z" fill="#f3f3f3"/><path d="m162.556 187.356c.678-.484 1.647-.29 2.131.388l11.238 16.76c.484.677.29 1.646-.484 2.13-.679.485-1.647.291-2.132-.387l-11.237-16.76c-.484-.774-.29-1.646.484-2.13zm12.788 19.085c.581-.388.775-1.163.387-1.744l-11.237-16.76c-.388-.58-1.163-.678-1.84-.29-.582.387-.776 1.162-.388 1.744l11.237 16.759c.388.484 1.26.678 1.84.29z" fill="#fff"/><path d="m160.522 201.79c.678-.387 1.55-.193 1.937.485l4.457 7.847c.387.678.096 1.55-.582 1.937-.678.388-1.55.194-1.937-.484l-4.456-7.847c-.291-.678-.097-1.55.58-1.937z" fill="#f3f3f3"/><path d="m160.522 201.694c.775-.388 1.647-.194 2.034.484l4.456 7.847c.388.678.194 1.647-.58 2.034-.776.388-1.648.194-2.035-.484l-4.456-7.847c-.388-.678-.194-1.55.58-2.034zm5.812 10.269c.582-.388.872-1.163.485-1.744l-4.456-7.847c-.388-.581-1.163-.775-1.744-.485-.582.388-.872 1.163-.485 1.744l4.457 7.847c.29.581 1.162.872 1.743.484z" fill="#fff"/><path d="m147.637 195.397c.775-.29 1.55 0 1.841.678l7.847 18.697c.29.678-.097 1.55-.775 1.84-.678.291-1.55 0-1.84-.678l-7.847-18.696c-.291-.679.096-1.55.774-1.841z" fill="#f3f3f3"/><path d="m147.637 195.3c.775-.29 1.647 0 2.035.775l7.847 18.697a1.505 1.505 0 0 1 -.872 1.937c-.775.291-1.647 0-2.034-.775l-7.847-18.696c-.291-.679.097-1.55.871-1.938zm8.816 21.216c.678-.291.969-1.066.678-1.647l-7.847-18.697c-.29-.678-1.065-.969-1.743-.678-.678.29-.97 1.065-.678 1.647l7.846 18.697c.388.678 1.066.968 1.744.678z" fill="#fff"/><path d="m142.89 209.153c.776-.29 1.55.097 1.841.872l2.81 8.525c.29.678-.194 1.55-.872 1.744-.775.29-1.55-.097-1.84-.872l-2.81-8.525c-.29-.678.097-1.453.872-1.744z" fill="#f3f3f3"/><path d="m142.794 209.056a1.505 1.505 0 0 1 1.937.872l2.81 8.525c.29.775-.194 1.647-.97 1.938a1.505 1.505 0 0 1 -1.937-.872l-2.809-8.525c-.194-.775.194-1.647.969-1.938zm3.778 11.14c.678-.193 1.065-.968.872-1.646l-2.81-8.525c-.193-.678-.968-.969-1.646-.775-.679.194-1.066.969-.872 1.647l2.809 8.525a1.223 1.223 0 0 0 1.647.775z" fill="#fff"/><path d="m131.46 200.338c.774-.194 1.55.29 1.646 1.065l4.069 19.86c.194.774-.388 1.453-1.163 1.646-.774.194-1.55-.29-1.646-1.065l-4.07-19.86c-.096-.678.388-1.453 1.163-1.647z" fill="#f3f3f3"/><path d="m131.46 200.24c.871-.193 1.646.388 1.84 1.163l4.069 19.86c.194.774-.388 1.646-1.163 1.743-.872.194-1.647-.387-1.84-1.162l-4.07-19.86c-.193-.775.292-1.55 1.163-1.743zm4.552 22.572c.679-.096 1.163-.775 1.066-1.55l-4.069-19.859c-.096-.678-.871-1.162-1.55-.969-.678.097-1.162.775-1.065 1.55l4.069 19.86c.193.678.871 1.065 1.55.969z" fill="#fff"/><path d="m124.097 212.931c.775-.097 1.453.388 1.647 1.163l1.162 8.912c.097.775-.484 1.453-1.26 1.55-.774.097-1.452-.387-1.646-1.162l-1.162-8.913c-.097-.775.484-1.453 1.259-1.55z" fill="#f3f3f3"/><path d="m124.097 212.834c.872-.096 1.647.485 1.744 1.26l1.162 8.912c.097.775-.484 1.55-1.356 1.647s-1.647-.484-1.744-1.26l-1.162-8.912c-.097-.775.484-1.55 1.356-1.647zm1.453 11.625c.678-.096 1.26-.775 1.163-1.453l-1.163-8.912c-.097-.678-.775-1.163-1.453-1.066s-1.26.775-1.163 1.453l1.163 8.913c.097.678.775 1.162 1.453 1.065z" fill="#fff"/><path d="m114.119 202.081c.775 0 1.453.582 1.453 1.357v20.246c0 .775-.678 1.357-1.453 1.357s-1.453-.582-1.453-1.357v-20.246c.097-.775.678-1.357 1.453-1.357z" fill="#f3f3f3"/><path d="m114.119 201.984c.872 0 1.55.678 1.55 1.453v20.247c0 .775-.678 1.453-1.55 1.453s-1.55-.678-1.55-1.453v-20.246c0-.775.775-1.454 1.55-1.454zm0 22.96c.678 0 1.356-.581 1.356-1.26v-20.246c0-.679-.581-1.26-1.356-1.26-.678 0-1.356.581-1.356 1.26v20.246c.096.679.678 1.26 1.356 1.26z" fill="#fff"/><path d="m104.431 212.931c.775.097 1.356.678 1.356 1.453l-.678 9.01c-.096.775-.775 1.356-1.55 1.26-.775-.098-1.356-.679-1.356-1.454l.678-9.01c.097-.774.775-1.356 1.55-1.259z" fill="#f3f3f3"/><path d="m104.431 212.834c.872.097 1.453.775 1.453 1.55l-.678 9.01c-.097.775-.775 1.453-1.647 1.356-.871-.097-1.453-.775-1.453-1.55l.678-9.01c.097-.871.775-1.452 1.647-1.356zm-.872 11.722c.678 0 1.357-.484 1.357-1.162l.678-9.01c0-.678-.485-1.259-1.26-1.356-.678 0-1.356.484-1.356 1.163l-.678 9.009c0 .678.581 1.26 1.26 1.356z" fill="#fff"/><path d="m97.166 200.338c.775.193 1.259.871 1.162 1.646l-3.972 19.86c-.194.775-.872 1.26-1.647 1.065-.775-.193-1.259-.871-1.162-1.647l3.972-19.859c.097-.678.872-1.162 1.647-1.065z" fill="#f3f3f3"/><path d="m97.166 200.24c.871.194 1.356.97 1.259 1.744l-3.972 19.86c-.194.775-.969 1.356-1.84 1.162-.872-.194-1.357-.969-1.26-1.744l3.972-19.859c.194-.775.969-1.26 1.84-1.162zm-4.553 22.572c.678.097 1.356-.29 1.55-.968l3.971-19.86c.097-.678-.29-1.356-1.065-1.55-.678-.096-1.356.291-1.55.97l-3.972 19.858c-.097.775.387 1.357 1.066 1.55z" fill="#fff"/><path d="m85.54 209.056c.776.194 1.26.969 1.066 1.744l-2.422 8.719c-.193.775-.968 1.162-1.743.969a1.444 1.444 0 0 1 -1.066-1.744l2.422-8.719c.194-.775.969-1.162 1.744-.969z" fill="#f3f3f3"/><path d="m85.54 208.96c.776.193 1.357 1.065 1.066 1.84l-2.422 8.719c-.193.775-1.065 1.26-1.84 1.065-.775-.193-1.356-1.065-1.066-1.84l2.422-8.719c.194-.775.969-1.26 1.84-1.066zm-3.196 11.334c.678.194 1.453-.194 1.647-.872l2.421-8.719c.194-.678-.193-1.356-.968-1.55-.678-.194-1.453.194-1.647.872l-2.422 8.719c-.097.678.29 1.356.969 1.55z" fill="#fff"/><path d="m80.794 195.397c.775.29 1.065 1.162.775 1.84l-7.75 18.697c-.29.679-1.163 1.066-1.84.679-.679-.388-1.067-1.163-.776-1.841l7.75-18.697c.29-.678 1.163-1.066 1.84-.678z" fill="#f3f3f3"/><path d="m80.794 195.3a1.505 1.505 0 0 1 .872 1.938l-7.75 18.696c-.291.775-1.163 1.066-2.035.775a1.505 1.505 0 0 1 -.872-1.937l7.75-18.697c.388-.775 1.26-1.162 2.035-.775zm-8.816 21.216c.678.29 1.453 0 1.744-.678l7.75-18.697c.29-.678-.097-1.357-.775-1.647s-1.453 0-1.744.678l-7.75 18.697c-.194.581.097 1.356.775 1.647z" fill="#fff"/><path d="m67.716 201.597c.678.387.968 1.162.678 1.84l-4.069 8.041c-.388.678-1.163.969-1.938.581-.678-.387-.968-1.162-.678-1.84l4.07-8.04c.387-.679 1.162-.97 1.937-.582z" fill="#f3f3f3"/><path d="m67.716 201.5c.775.387 1.065 1.26.678 2.034l-4.069 8.041c-.388.775-1.26 1.066-2.034.678-.775-.387-1.066-1.26-.678-2.034l4.068-8.04c.388-.776 1.26-1.066 2.035-.679zm-5.328 10.56c.678.29 1.453.096 1.743-.582l4.069-8.04c.29-.582 0-1.357-.581-1.744-.678-.29-1.453-.097-1.744.581l-4.069 8.04c-.29.582 0 1.357.582 1.744z" fill="#fff"/><path d="m65.778 187.26c.678.484.872 1.356.388 1.937l-11.238 16.76c-.387.677-1.26.774-1.937.387-.678-.485-.872-1.356-.388-1.938l11.238-16.76c.387-.677 1.259-.871 1.937-.387z" fill="#f3f3f3"/><path d="m65.778 187.162c.678.485.872 1.454.484 2.132l-11.237 16.76c-.484.677-1.356.871-2.131.387-.678-.485-.872-1.453-.485-2.132l11.238-16.759c.484-.678 1.453-.872 2.131-.388zm-12.787 19.085c.58.387 1.453.29 1.84-.29l11.238-16.76c.387-.581.194-1.356-.388-1.744-.581-.387-1.453-.29-1.84.29l-11.238 16.663c-.387.582-.194 1.453.388 1.84z" fill="#fff"/><path d="m51.634 190.844c.582.484.775 1.356.291 1.937l-5.619 7.072c-.484.581-1.356.678-1.937.194s-.775-1.356-.29-1.938l5.618-7.072c.484-.58 1.356-.678 1.937-.193z" fill="#f3f3f3"/><path d="m51.731 190.747c.678.484.775 1.453.29 2.131l-5.618 7.072c-.484.678-1.453.775-2.131.194-.678-.485-.775-1.453-.29-2.132l5.618-7.071c.484-.679 1.453-.775 2.131-.194zm-7.265 9.203c.58.484 1.356.388 1.84-.194l5.619-7.072c.388-.58.29-1.356-.29-1.84-.582-.485-1.357-.388-1.841.194l-5.619 7.071c-.387.582-.29 1.453.29 1.841z" fill="#fff"/><path d="m52.603 176.313c.581.58.581 1.453 0 1.937l-14.337 14.24c-.582.582-1.453.485-1.938 0-.484-.484-.581-1.453 0-1.937l14.24-14.24c.582-.582 1.454-.582 2.035 0z" fill="#f3f3f3"/><path d="m52.7 176.216a1.52 1.52 0 0 1 0 2.13l-14.338 14.242a1.52 1.52 0 0 1 -2.13 0 1.52 1.52 0 0 1 0-2.132l14.337-14.24a1.52 1.52 0 0 1 2.131 0zm-16.372 16.274c.484.484 1.356.484 1.84 0l14.338-14.241c.485-.484.485-1.356 0-1.84-.484-.485-1.356-.485-1.84 0l-14.338 14.24c-.484.484-.484 1.26 0 1.84z" fill="#fff"/><path d="m38.072 177.088c.484.58.484 1.453-.097 1.937l-6.878 5.813c-.581.484-1.453.387-1.938-.194-.484-.582-.484-1.453.097-1.938l6.878-5.812c.582-.485 1.453-.388 1.938.194z" fill="#f3f3f3"/><path d="m38.169 176.99c.581.679.484 1.647-.097 2.132l-6.878 5.812c-.581.582-1.55.485-2.131-.193-.582-.679-.485-1.647.096-2.132l6.879-5.812c.58-.581 1.55-.484 2.13.194zm-8.913 7.654c.485.581 1.26.581 1.84.194l6.879-5.813c.484-.484.581-1.26.097-1.84-.485-.582-1.26-.582-1.84-.194l-6.879 5.812c-.581.484-.581 1.26-.097 1.84z" fill="#fff"/><path d="m41.947 163.137c.484.679.29 1.55-.388 1.938l-16.856 11.238c-.678.387-1.55.193-1.937-.388-.485-.678-.291-1.55.387-1.938l16.857-11.237c.582-.387 1.453-.194 1.938.387z" fill="#f3f3f3"/><path d="m42.044 163.137c.484.679.29 1.647-.388 2.132l-16.856 11.237c-.678.485-1.647.29-2.131-.484-.485-.678-.29-1.647.387-2.131l16.857-11.238c.678-.484 1.646-.29 2.13.484zm-19.181 12.691c.387.581 1.162.775 1.743.388l16.856-11.238c.582-.387.775-1.162.291-1.84-.387-.582-1.162-.775-1.744-.388l-16.856 11.238c-.581.484-.678 1.259-.29 1.84z" fill="#fff"/><path d="m27.512 161.103c.388.678.194 1.55-.484 1.938l-7.847 4.456c-.678.387-1.55.097-1.937-.581-.388-.678-.194-1.55.484-1.938l7.847-4.456c.678-.388 1.55-.097 1.938.581z" fill="#f3f3f3"/><path d="m27.61 161.006c.387.775.193 1.647-.485 2.035l-7.847 4.456c-.678.387-1.647.097-2.034-.581-.388-.775-.194-1.647.484-2.035l7.847-4.456c.678-.388 1.647-.097 2.034.581zm-10.27 5.813c.388.678 1.163.872 1.744.484l7.847-4.456c.581-.388.775-1.163.485-1.744-.388-.678-1.163-.872-1.744-.484l-7.847 4.456c-.581.29-.775 1.066-.484 1.744z" fill="#fff"/><path d="m34.003 148.219c.29.775 0 1.55-.775 1.84l-18.697 7.75c-.678.291-1.55-.096-1.84-.775-.291-.775 0-1.55.775-1.84l18.697-7.75c.678-.29 1.55 0 1.84.775z" fill="#f3f3f3"/><path d="m34.1 148.122c.29.775 0 1.647-.775 2.034l-18.697 7.75a1.505 1.505 0 0 1 -1.937-.872c-.291-.775 0-1.647.775-2.034l18.697-7.75a1.505 1.505 0 0 1 1.937.872zm-21.216 8.815c.291.679 1.066.97 1.647.775l18.697-7.75c.678-.29.969-1.065.678-1.743-.29-.678-1.065-.969-1.647-.775l-18.697 7.75c-.678.29-.968 1.065-.678 1.744z" fill="#fff"/><path d="m20.344 143.375c.29.775-.097 1.55-.872 1.84l-8.525 2.81c-.678.29-1.55-.194-1.744-.872-.29-.775.097-1.55.872-1.84l8.525-2.81c.678-.29 1.453.097 1.744.872z" fill="#f3f3f3"/><path d="m20.44 143.278c.291.775-.096 1.647-.968 1.938l-8.525 2.809c-.775.29-1.647-.194-1.938-.969-.29-.775.097-1.647.97-1.937l8.524-2.81c.775-.193 1.647.194 1.938.97zm-11.236 3.682c.194.678.969 1.066 1.647.872l8.525-2.81c.678-.193.969-.968.775-1.646s-.969-1.066-1.647-.872l-8.525 2.81c-.678.29-.969.968-.775 1.646z" fill="#fff"/><path d="m29.063 131.847c.193.775-.291 1.55-1.066 1.647l-19.86 3.875c-.775.194-1.453-.388-1.646-1.163-.194-.775.29-1.55 1.065-1.647l19.86-3.875c.775-.096 1.55.388 1.646 1.163z" fill="#f3f3f3"/><path d="m29.256 131.847c.194.872-.387 1.647-1.162 1.84l-19.86 3.875c-.775.194-1.55-.387-1.743-1.259-.194-.872.387-1.647 1.162-1.84l19.86-3.875c.774-.194 1.55.387 1.743 1.259zm-22.572 4.36c.097.677.775 1.162 1.453 1.065l19.86-3.875c.678-.097 1.162-.872.969-1.55-.097-.678-.775-1.163-1.454-1.066l-19.859 3.875c-.678.194-1.162.872-.969 1.55z" fill="#fff"/><path d="m16.663 124.388c.096.774-.388 1.453-1.163 1.55l-8.912 1.065c-.776.097-1.454-.484-1.55-1.26-.097-.774.387-1.452 1.162-1.55l8.913-1.065c.678-.097 1.453.484 1.55 1.26z" fill="#f3f3f3"/><path d="m16.76 124.388c.096.871-.485 1.646-1.26 1.743l-8.912 1.066c-.776.097-1.55-.484-1.647-1.356s.484-1.647 1.259-1.744l8.913-1.066c.774-.097 1.55.485 1.646 1.356zm-11.723 1.356c.097.678.776 1.26 1.454 1.162l8.912-1.065c.678-.097 1.163-.775 1.066-1.453-.097-.679-.775-1.26-1.453-1.163l-8.913 1.066c-.678.097-1.162.775-1.066 1.453z" fill="#fff"/><path d="m27.512 114.99c0 .776-.58 1.454-1.356 1.454h-20.246c-.775 0-1.356-.678-1.356-1.453s.581-1.454 1.356-1.454h20.247c.775 0 1.357.679 1.357 1.454z" fill="#f3f3f3"/><path d="m27.61 114.99c0 .873-.679 1.55-1.454 1.55h-20.246c-.775 0-1.453-.678-1.453-1.55 0-.871.678-1.55 1.453-1.55h20.247c.775 0 1.453.679 1.453 1.55zm-22.96-.096c0 .678.581 1.356 1.26 1.356h20.246c.678 0 1.26-.581 1.26-1.356 0-.678-.582-1.357-1.26-1.357h-20.246c-.678.097-1.259.679-1.259 1.357z" fill="#fff"/><path d="m16.76 105.206c-.098.775-.679 1.356-1.454 1.356l-9.01-.678c-.774-.097-1.355-.775-1.259-1.55.097-.775.679-1.356 1.454-1.356l9.009.678c.678.097 1.26.775 1.26 1.55z" fill="#e2e2e2"/><path d="m16.856 105.206c-.097.872-.775 1.453-1.55 1.453l-9.01-.678c-.774-.097-1.452-.775-1.355-1.647.096-.871.775-1.453 1.55-1.453l9.009.678c.775.097 1.356.872 1.356 1.647zm-11.819-.872c-.096.678.485 1.357 1.163 1.357l9.01.678c.677 0 1.259-.485 1.356-1.26.097-.678-.485-1.356-1.163-1.356l-9.01-.678c-.677 0-1.259.581-1.356 1.26z" fill="#fff"/><path d="m29.256 98.134c-.194.775-.872 1.26-1.647 1.163l-19.859-4.069c-.775-.194-1.26-.872-1.066-1.647s.872-1.26 1.647-1.162l19.86 3.972c.678.193 1.162.968 1.065 1.743z" fill="#f3f3f3"/><path d="m29.353 98.134c-.194.872-.969 1.357-1.744 1.26l-19.859-3.972c-.775-.194-1.356-.969-1.162-1.84.193-.873.968-1.357 1.743-1.26l19.86 3.972c.775.194 1.259.969 1.162 1.84zm-22.572-4.553c-.097.678.29 1.356.969 1.55l19.86 3.972c.678.097 1.356-.29 1.55-1.066.096-.678-.291-1.356-.97-1.55l-19.858-3.971c-.775-.097-1.356.387-1.55 1.065z" fill="#fff"/><path d="m20.538 86.51a1.444 1.444 0 0 1 -1.744 1.065l-8.719-2.422c-.775-.194-1.162-.969-.969-1.744a1.444 1.444 0 0 1 1.744-1.065l8.719 2.422c.775.193 1.162.968.969 1.743z" fill="#f3f3f3"/><path d="m20.634 86.51c-.193.774-1.065 1.356-1.84 1.065l-8.719-2.422c-.775-.194-1.26-1.066-1.066-1.84.194-.776 1.066-1.357 1.841-1.066l8.719 2.422c.775.194 1.26.969 1.065 1.84zm-11.334-3.199c-.194.679.194 1.454.872 1.647l8.719 2.422c.678.194 1.356-.194 1.55-.969.193-.678-.194-1.453-.872-1.646l-8.719-2.422c-.678-.097-1.356.29-1.55.969z" fill="#fff"/><path d="m34.197 81.86c-.29.774-1.163 1.065-1.84.774l-18.698-7.75c-.678-.29-1.065-1.162-.775-1.84.291-.775 1.163-1.066 1.841-.775l18.697 7.75c.775.29 1.066 1.162.775 1.84z" fill="#f3f3f3"/><path d="m34.294 81.956a1.505 1.505 0 0 1 -1.938.872l-18.697-7.75c-.775-.29-1.065-1.162-.775-2.034a1.505 1.505 0 0 1 1.938-.872l18.697 7.75c.775.387 1.065 1.26.775 2.034zm-21.216-8.815c-.29.678 0 1.453.678 1.743l18.697 7.75c.678.291 1.356-.097 1.647-.775.29-.678 0-1.453-.678-1.743l-18.697-7.75c-.678-.194-1.453.097-1.647.775z" fill="#fff"/><path d="m27.9 68.781c-.387.678-1.162.969-1.84.678l-8.041-4.068c-.678-.291-.969-1.163-.581-1.938.387-.678 1.162-.969 1.84-.678l8.04 4.069c.679.387.97 1.26.582 1.937z" fill="#f3f3f3"/><path d="m27.997 68.878c-.388.775-1.26 1.066-2.035.678l-8.04-4.069c-.775-.387-1.066-1.259-.678-2.034.387-.775 1.26-1.066 2.034-.678l8.04 4.069c.776.29 1.066 1.26.679 2.034zm-10.463-5.328c-.29.678-.096 1.453.582 1.744l8.04 4.069c.582.29 1.357 0 1.744-.582.29-.678.097-1.453-.581-1.744l-8.139-4.067c-.581-.29-1.356-.097-1.647.581z" fill="#fff"/><path d="m42.14 66.94c-.484.679-1.259.873-1.937.388l-16.76-11.14c-.677-.388-.774-1.26-.387-1.938.388-.678 1.26-.872 1.938-.388l16.856 11.238c.581.388.775 1.26.29 1.84z" fill="#f3f3f3"/><path d="m42.237 67.037c-.484.679-1.453.872-2.13.485l-16.76-11.238c-.678-.484-.872-1.356-.388-2.13.485-.679 1.454-.873 2.132-.485l16.759 11.237c.775.485.872 1.453.387 2.131zm-19.084-12.787c-.387.581-.29 1.453.29 1.84l16.857 11.239c.581.388 1.356.194 1.744-.387.387-.582.29-1.454-.29-1.841l-16.858-11.238c-.581-.388-1.356-.194-1.744.387z" fill="#fff"/><path d="m38.556 52.894c-.484.581-1.356.775-1.937.29l-7.072-5.521c-.581-.485-.678-1.357-.194-1.938s1.356-.775 1.938-.29l7.071 5.521c.582.485.679 1.356.194 1.938z" fill="#f3f3f3"/><path d="m38.653 52.99c-.484.679-1.453.776-2.131.291l-7.072-5.521c-.678-.484-.775-1.453-.29-2.13.484-.679 1.453-.776 2.13-.291l7.072 5.521c.679.485.776 1.453.291 2.132zm-9.3-7.265c-.484.581-.387 1.356.194 1.84l7.072 5.523c.581.387 1.356.29 1.84-.291.485-.581.388-1.356-.193-1.84l-7.072-5.523c-.581-.387-1.357-.29-1.84.291z" fill="#fff"/><path d="m52.99 53.862c-.58.582-1.453.582-1.937 0l-14.433-14.24c-.581-.581-.485-1.453 0-1.938.581-.58 1.453-.58 1.937 0l14.338 14.241c.581.484.581 1.453.097 1.938z" fill="#f3f3f3"/><path d="m52.99 53.96a1.52 1.52 0 0 1 -2.13 0l-14.339-14.242a1.52 1.52 0 0 1 0-2.132 1.52 1.52 0 0 1 2.131 0l14.338 14.241c.678.581.678 1.55 0 2.131zm-16.273-16.18c-.485.485-.485 1.357 0 1.84l14.337 14.241c.485.485 1.356.485 1.84 0 .485-.484.485-1.356 0-1.84l-14.337-14.337c-.484-.484-1.26-.484-1.84.097z" fill="#fff"/><path d="m52.119 39.428c-.581.485-1.453.485-1.938-.097l-5.91-6.781c-.483-.581-.387-1.453.195-1.937.58-.485 1.453-.485 1.937.096l5.91 6.782c.484.484.387 1.356-.194 1.937z" fill="#f3f3f3"/><path d="m52.216 39.428c-.678.581-1.55.485-2.132-.097l-5.909-6.781c-.581-.581-.484-1.55.194-2.131.678-.582 1.55-.485 2.131.097l5.91 6.78c.484.679.484 1.648-.194 2.132zm-7.75-8.815c-.582.484-.582 1.259-.194 1.84l5.91 6.781c.484.485 1.259.582 1.84.097.581-.484.581-1.26.194-1.84l-5.91-6.782c-.484-.58-1.26-.58-1.84-.096z" fill="#fff"/><path d="m66.069 43.11c-.678.484-1.55.29-1.938-.388l-11.334-16.76c-.388-.678-.194-1.55.387-1.937.678-.484 1.55-.29 1.938.388l11.237 16.759c.485.678.291 1.55-.29 1.937z" fill="#f3f3f3"/><path d="m66.069 43.206c-.678.485-1.647.29-2.132-.387l-11.237-16.76c-.484-.678-.29-1.646.484-2.13.678-.485 1.647-.291 2.132.387l11.237 16.759c.484.775.29 1.647-.484 2.131zm-12.789-19.084c-.581.387-.775 1.162-.387 1.744l11.237 16.759c.388.581 1.163.678 1.84.29.582-.387.776-1.162.388-1.743l-11.236-16.663c-.388-.58-1.26-.775-1.84-.387z" fill="#fff"/><path d="m68.103 28.772c-.678.387-1.55.194-1.937-.484l-4.457-7.847c-.387-.678-.097-1.55.582-1.938.678-.387 1.55-.194 1.937.485l4.456 7.846c.291.678.097 1.55-.58 1.938z" fill="#f3f3f3"/><path d="m68.103 28.869c-.775.387-1.647.194-2.034-.485l-4.457-7.846c-.387-.679-.193-1.647.582-2.035.775-.387 1.647-.194 2.034.485l4.456 7.846c.388.678.194 1.55-.58 2.035zm-5.812-10.269c-.582.387-.872 1.162-.485 1.744l4.457 7.847c.387.58 1.162.775 1.743.484.582-.387.872-1.163.485-1.744l-4.457-7.847c-.29-.58-1.162-.872-1.743-.484z" fill="#fff"/><path d="m80.987 35.166c-.774.29-1.55 0-1.84-.678l-7.847-18.698c-.29-.678.097-1.55.775-1.841.775-.29 1.55 0 1.84.678l7.847 18.697c.291.678-.096 1.55-.775 1.84z" fill="#f3f3f3"/><path d="m80.987 35.263c-.774.29-1.646 0-2.034-.776l-7.847-18.696a1.505 1.505 0 0 1 .872-1.938c.775-.29 1.647 0 2.035.775l7.846 18.697c.291.678-.096 1.55-.871 1.938zm-8.815-21.216c-.678.29-.969 1.066-.678 1.647l7.846 18.696c.29.678 1.065.968 1.743.678s.97-1.066.678-1.647l-7.846-18.697c-.388-.678-1.066-.969-1.744-.678z" fill="#fff"/><path d="m85.734 21.41c-.775.29-1.55-.098-1.84-.872l-2.81-8.526c-.29-.678.194-1.55.872-1.743.678-.194 1.55.097 1.84.872l2.81 8.525c.29.678-.097 1.453-.872 1.743z" fill="#f3f3f3"/><path d="m85.831 21.506a1.505 1.505 0 0 1 -1.937-.872l-2.81-8.525c-.29-.775.194-1.646.97-1.937a1.505 1.505 0 0 1 1.937.872l2.809 8.525c.194.775-.194 1.647-.969 1.937zm-3.778-11.14c-.678.193-1.066.968-.872 1.646l2.81 8.526c.193.678.968.968 1.647.774.678-.193 1.065-.968.871-1.646l-2.809-8.526a1.223 1.223 0 0 0 -1.647-.775z" fill="#fff"/><path d="m97.166 30.225c-.775.194-1.55-.29-1.647-1.066l-4.069-19.859c-.194-.775.388-1.453 1.162-1.647.776-.194 1.55.29 1.647 1.066l4.07 19.86c.096.677-.388 1.452-1.163 1.646z" fill="#f3f3f3"/><path d="m97.166 30.322c-.872.194-1.647-.388-1.841-1.163l-4.069-19.859c-.194-.775.388-1.647 1.163-1.744.872-.194 1.647.388 1.84 1.163l4.07 19.86c.193.774-.291 1.55-1.163 1.743zm-4.553-22.572c-.679.097-1.163.775-1.066 1.55l4.069 19.86c.097.677.871 1.162 1.55.968.678-.097 1.162-.775 1.065-1.55l-4.069-19.86c-.193-.677-.871-1.065-1.55-.968z" fill="#fff"/><path d="m104.528 17.631c-.775.097-1.453-.387-1.647-1.162l-1.162-8.913c-.097-.775.484-1.453 1.26-1.55.774-.097 1.452.388 1.646 1.163l1.162 8.912c.097.775-.484 1.453-1.259 1.55z" fill="#f3f3f3"/><path d="m104.528 17.728c-.872.097-1.647-.484-1.744-1.26l-1.162-8.912c-.097-.775.484-1.55 1.356-1.647.872-.096 1.647.485 1.744 1.26l1.162 8.912c.097.775-.484 1.55-1.356 1.647zm-1.453-11.625c-.678.097-1.26.775-1.163 1.453l1.163 8.913c.097.678.775 1.162 1.453 1.065.678-.096 1.26-.775 1.163-1.453l-1.163-8.912c-.097-.678-.775-1.163-1.453-1.066z" fill="#fff"/><circle cx="114.991" cy="115.184" fill="url(#b)" fill-opacity=".2" r="114.7"/></g><path d="m204.116 51.15-92.516 59.288h-.097v.096l-.097.097-57.736 95.229 84.862-68.297.097-.096v-.097l65.488-86.219z" fill-opacity=".05" filter="url(#d)"/><path d="m202.372 45.628-91.45 65.003 27.125 26.931z" fill="#cd151e"/><path d="m111.019 110.438 13.66 13.465 77.693-78.275z" fill="#fa5153"/><path d="m111.019 110.438 27.125 26.93-91.45 65.004 64.325-91.935z" fill="#acacac"/><path d="m46.694 202.372 77.984-78.469-13.66-13.466z" fill="#eee"/></g></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg enable-background="new 0 0 493 493" viewBox="0 0 493 493" xmlns="http://www.w3.org/2000/svg"><path d="m488.5 173c-6.1-45.8-22.3-87.3-50.8-117.7-30.4-28.5-71.9-44.7-117.7-50.8-43.7-5.8-73.5-4.4-73.5-4.4s-29.8-1.4-73.5 4.4c-45.8 6.1-87.3 22.3-117.6 50.8-28.6 30.4-44.8 71.9-50.9 117.7-5.8 43.7-4.4 73.5-4.4 73.5s-1.4 29.8 4.4 73.5c6.1 45.8 22.3 87.3 50.8 117.7 30.4 28.6 71.9 44.8 117.6 50.9 43.7 5.8 73.5 4.4 73.5 4.4s29.8 1.4 73.5-4.4c45.8-6.1 87.3-22.3 117.6-50.9 28.6-30.4 44.8-71.9 50.8-117.7 5.8-43.7 4.4-73.5 4.4-73.5s1.6-29.8-4.2-73.5" fill="#7882ff"/><g fill="#fff"><path d="m372.7 210c19.5 70-21.5 142.6-91.5 162.1s-142.6-21.5-162.1-91.5 21.5-142.6 91.5-162.1 142.6 21.5 162.1 91.5"/><path d="m372.7 210c7.3 26.3 6.1 52.9-1.9 76.9-.6 1.9-1.3 3.9-2.1 5.8"/><path d="m370.6 210c5.1 18.4 6.1 37 3.4 54.7"/></g><path d="m333.9 337.7c-33.3 0-73.8-8.5-114.2-23.8s-76.3-35.9-101.2-58c-40.4-35.9-37.9-63.7-32.8-77.1s21.7-35.9 75.7-35.9c33.3 0 73.8 8.5 114.2 23.8s76.3 35.9 101.2 58c40.4 35.9 37.9 63.7 32.8 77.1-5 13.4-21.6 35.9-75.7 35.9m-172.4-153.1c-25 0-35.7 6.2-36.8 9s2.9 14.6 21.6 31.2c20.9 18.5 53.1 36.9 88.3 50.2 35.2 13.4 71.5 21.1 99.4 21.1 25 0 35.7-6.2 36.8-9s-2.9-14.6-21.5-31.2c-20.9-18.5-53.1-36.9-88.3-50.2-35.4-13.4-71.6-21.1-99.5-21.1z" fill="#4d5cc1"/><path d="m124.7 194 245.9 93.4c8.2-24.2 9.5-51 2.1-77.4-19.5-70-92-111-162.1-91.5-40.2 11.2-70.8 39.9-85.9 75.5" fill="#fff"/></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="456" height="455" viewBox="0 0 456 455"><defs><linearGradient id="a" x1="21.587%" x2="76.116%" y1="5.709%" y2="100.496%"><stop stop-opacity=".2" offset="0%"/><stop stop-opacity=".05" offset="79.08%"/></linearGradient></defs><g fill="none"><path fill="#EF3939" d="M228 454.3c99.7 0 155.1 0 191.4-36.1 36.2-36.1 36.2-91.3 36.2-190.7 0-99.4 0-154.6-36.2-190.7C383.1.8 327.7.8 228 .8S72.9.8 36.6 36.9C.4 73 .4 128.2.4 227.6c0 99.4 0 154.6 36.2 190.7 36.3 36 91.7 36 191.4 36z"/><path fill="url(#a)" d="M376 143.7c-21.8-38.1-58.3-67.8-104.2-80.1C180.7 39.3 87.1 93.1 62.7 183.8c-12.3 45.6-4.7 91.9 17.5 129.7.3.5.6 1.1 1 1.6l80.2 138.5c13.3.4 27.7.5 43.2.5H227.2c44.3 0 79.9 0 109-3.2 36.3-4 62.3-12.9 82.4-32.9 29.3-29.2 34.9-71 36-138.7-46.8-80.8-78.5-135.5-78.6-135.6z"/><path fill="#FFF" d="M347.8 107.6c-66.5-66.4-174.4-66.4-241 0-66.5 66.4-66.5 174 0 240.3 66.5 66.4 174.4 66.4 241 0s66.6-174 0-240.3zm-10.2 78.1c-28.1 48.7-56.2 97.4-84.3 146.2-5.2 9.1-12.8 14.5-23.2 15.3-11.6.8-20.8-4.1-26.7-14.1-17.8-30.5-35.4-61.2-53-91.8-10.7-18.6-21.5-37.2-32.2-55.9-10.8-18.8 1.4-41.7 23-42.8 11.4-.6 20.2 4.7 26 14.6 7.9 13.5 15.7 27.2 23.6 40.8 5.7 9.8 11.2 19.7 17 29.3 8.4 14.1 20.8 22 37.3 23 23.3 1.4 45-15.5 47.8-40.2.2-1.8.3-3.7.4-4.6-.1-8-1.6-14.8-4.8-21.1-8.7-17.4.6-36.9 19.5-41.1 15.4-3.4 31.4 7.9 33.4 23.5 1 6.7-.4 13-3.8 18.9z"/></g></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg height="225.77777mm" width="225.77777mm" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="128" x2="128" y1="0" y2="256"><stop offset=".0000001" stop-color="#f5f5f6"/><stop offset="1" stop-color="#ededee"/></linearGradient><g fill-rule="evenodd"><g transform="matrix(11.267595 0 0 11.267595 -6140.8393 -811.26684)"><path d="m256 128c0 70.692-57.308 128-128 128-70.6924 0-128-57.308-128-128 0-70.6924 57.3076-128 128-128 70.692 0 128 57.3076 128 128" fill="url(#a)" transform="matrix(.277344 0 0 .277344 545 72)"/><path d="m614.28053 107.50003c0 18.65638-15.12412 33.7805-33.7805 33.7805-18.65646 0-33.7805-15.12412-33.7805-33.7805 0-18.656457 15.12404-33.780497 33.7805-33.780497 18.65638 0 33.7805 15.12404 33.7805 33.780497" fill="#fff"/><path d="m603.35318 92.856269-18.99807 18.582051v23.10275c0 .41602-1.80273.74883-3.85508.77657-1.96914-.0277-3.85508-.36055-3.85508-.77657v-23.10275l-18.99806-18.582051c-.30508-.305079.66562-1.747267 2.16328-3.244925s2.96758-2.468362 3.24492-2.163283l17.41721 17.001189 17.4172-17.001189c.30508-.305079 1.74727.665625 3.24493 2.163283 1.49765 1.497658 2.49609 2.939846 2.21875 3.244925" fill="#ec1c24"/></g><text fill="#fff" transform="translate(-374.00488 421.48166)"/></g></svg>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<% if browsers.empty? %>
|
2
|
+
<div class="is-empty">
|
3
|
+
<span>no data</span>
|
4
|
+
</div>
|
5
|
+
<% else %>
|
6
|
+
<table>
|
7
|
+
<% for browser in browsers %>
|
8
|
+
<tr>
|
9
|
+
<td>
|
10
|
+
<%= browser_icon(browser.name)%>
|
11
|
+
<%= link_to browser.name, browser_path(site: params[:site], id: browser, from: params[:from], to: params[:to]) %>
|
12
|
+
</td>
|
13
|
+
<td class="number"><%= format_view_count browser.total %></td>
|
14
|
+
</tr>
|
15
|
+
<% end %>
|
16
|
+
</table>
|
17
|
+
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% if browsers.empty? %>
|
2
|
+
<div class="is-empty">
|
3
|
+
<span>no data</span>
|
4
|
+
</div>
|
5
|
+
<% else %>
|
6
|
+
<table>
|
7
|
+
<% for browser in browsers %>
|
8
|
+
<tr>
|
9
|
+
<td>
|
10
|
+
<%= link_to browser.version, browser_path(site: params[:site], id: params[:id], version: browser.version, from: params[:from], to: params[:to]) %>
|
11
|
+
</td>
|
12
|
+
<td class="number"><%= format_view_count browser.total %></td>
|
13
|
+
</tr>
|
14
|
+
<% end %>
|
15
|
+
</table>
|
16
|
+
<% end %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<section class="card">
|
2
|
+
<%= render "/active_analytics/sites/histogram_header", histogram: @histogram, previous_histogram: @previous_histogram %>
|
3
|
+
<%= render "/active_analytics/sites/histogram", histogram: @histogram %>
|
4
|
+
</section>
|
5
|
+
|
6
|
+
<section class="card">
|
7
|
+
<h3>Browsers</h3>
|
8
|
+
<%= render "/active_analytics/browsers/table", browsers: @browsers %>
|
9
|
+
</section>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<section>
|
2
|
+
<h2>
|
3
|
+
Browser: <%= params[:id] %>
|
4
|
+
</h2>
|
5
|
+
</section>
|
6
|
+
|
7
|
+
<section class="card">
|
8
|
+
<%= render "/active_analytics/sites/histogram_header", histogram: @histogram, previous_histogram: @previous_histogram %>
|
9
|
+
<%= render "/active_analytics/sites/histogram", histogram: @histogram %>
|
10
|
+
</section>
|
11
|
+
|
12
|
+
<ul class="grid-auto">
|
13
|
+
<li class="card">
|
14
|
+
<h3>Versions</h3>
|
15
|
+
<%= render "/active_analytics/browsers/version_table", browsers: @browsers %>
|
16
|
+
</li>
|
17
|
+
</ul>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<% if histogram.bars.count
|
1
|
+
<% if histogram.bars.count.between?(2, 367) %>
|
2
2
|
<table class="charts-css column show-primary-axis show-5-secondary-axes hide-data <%= "show-labels" if histogram.bars.count < 32 %>" style="height: calc(var(--space-2x) * 8);">
|
3
3
|
<tbody>
|
4
4
|
<% for bar in histogram.bars %>
|
@@ -19,4 +19,4 @@
|
|
19
19
|
<% end %>
|
20
20
|
</tbody>
|
21
21
|
</table>
|
22
|
-
<% end %>
|
22
|
+
<% end %>
|
@@ -5,12 +5,17 @@
|
|
5
5
|
|
6
6
|
<ul class="grid-auto">
|
7
7
|
<li class="card">
|
8
|
-
<h3>
|
8
|
+
<h3>Sources <%= link_to "view all", referrers_path(from: params[:from], to: params[:to]) %></h3>
|
9
9
|
<%= render "/active_analytics/referrers/table", referrers: @referrers %>
|
10
10
|
</li>
|
11
11
|
|
12
12
|
<li class="card">
|
13
|
-
<h3>
|
13
|
+
<h3>Pages <%= link_to "view all", pages_path(from: params[:from], to: params[:to]) %></h3>
|
14
14
|
<%= render "/active_analytics/pages/table", pages: @pages %>
|
15
15
|
</li>
|
16
|
+
|
17
|
+
<li class="card">
|
18
|
+
<h3>Browsers <%= link_to "view all", browsers_path(from: params[:from], to: params[:to]) %></h3>
|
19
|
+
<%= render "/active_analytics/browsers/table", browsers: @browsers %>
|
20
|
+
</li>
|
16
21
|
</ul>
|
@@ -9,6 +9,10 @@
|
|
9
9
|
<a href="https://github.com/BaseSecrete/rorvswild" target="_blank" rel="noopener">RoRvsWild</a>
|
10
10
|
<p>Ruby on Rails application performances and exceptions monitoring.</p>
|
11
11
|
</li>
|
12
|
+
<li>
|
13
|
+
<a href="https://github.com/BaseSecrete/active_hashcash" target="_blank" rel="noopener">Active Hashcash</a>
|
14
|
+
<p>Protect Rails applications against bots and brute force attacks without annoying humans.</p>
|
15
|
+
</li>
|
12
16
|
<li>
|
13
17
|
<a href="https://github.com/BaseSecrete/redis_dashboard" target="_blank" rel="noopener">Redis Dashboard</a>
|
14
18
|
<p>Sinatra app to monitor Redis servers.</p>
|
@@ -17,10 +21,6 @@
|
|
17
21
|
<a href="https://github.com/BaseSecrete/type_scopes" target="_blank" rel="noopener">Type Scopes</a>
|
18
22
|
<p>Automatic scopes for ActiveRecord models.</p>
|
19
23
|
</li>
|
20
|
-
<li>
|
21
|
-
<a href="https://github.com/BaseSecrete/secure_attribute" target="_blank" rel="noopener">Secure Attribute</a>
|
22
|
-
<p>Encrypt attributes of any Ruby object or ActiveRecord model.</p>
|
23
|
-
</li>
|
24
24
|
<li>
|
25
25
|
<a href="https://github.com/BaseSecrete/teamodoro" target="_blank" rel="noopener">Teamodoro</a>
|
26
26
|
<p>Synchronize pomodoros with your coworkers.</p>
|
data/config/routes.rb
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
ActiveAnalytics::Engine.routes.draw do
|
2
|
-
|
2
|
+
get "/assets/*file", to: "assets#show", constraints: {file: /.+/}, as: :asset
|
3
|
+
|
3
4
|
get "/:site", to: "sites#show", as: :site, constraints: {site: /[^\/]+/}
|
4
5
|
|
5
6
|
# Referrers
|
6
7
|
get "/:site/referrers", to: "referrers#index", constraints: {site: /[^\/]+/}, as: :referrers
|
7
8
|
get "/:site/referrers/*referrer", to: "referrers#show", as: :referrer, constraints: {site: /[^\/]+/, referrer: /.+/}
|
8
9
|
|
10
|
+
# Browsers
|
11
|
+
get "/:site/browsers", to: "browsers#index", constraints: {site: /[^\/]+/}, as: :browsers
|
12
|
+
get "/:site/browsers/:id", to: "browsers#show", constraints: {site: /[^\/]+/}, as: :browser
|
13
|
+
|
9
14
|
# Pages
|
10
15
|
get "/:site/pages", to: "pages#index", constraints: {site: /[^\/]+/}, as: :pages
|
11
16
|
get "/:site/*page", to: "pages#show", as: :page, constraints: {site: /[^\/]+/}
|
@@ -9,9 +9,8 @@ class CreateActiveAnalyticsViewsPerDays < ActiveRecord::Migration[5.2]
|
|
9
9
|
t.string :referrer_path
|
10
10
|
t.timestamps
|
11
11
|
end
|
12
|
-
add_index :active_analytics_views_per_days, :date
|
13
|
-
add_index :active_analytics_views_per_days, [:
|
14
|
-
add_index :active_analytics_views_per_days, [:referrer_host, :referrer_path, :date], name: "index_active_analytics_views_per_days_on_referrer_and_date"
|
12
|
+
add_index :active_analytics_views_per_days, [:date, :site, :page]
|
13
|
+
add_index :active_analytics_views_per_days, [:date, :site, :referrer_host, :referrer_path]
|
15
14
|
end
|
16
15
|
|
17
16
|
def down
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateActiveAnalyticsBrowsersPerDays < ActiveRecord::Migration[7.1]
|
2
|
+
def change
|
3
|
+
create_table :active_analytics_browsers_per_days do |t|
|
4
|
+
t.string :site, null: false
|
5
|
+
t.string :name, null: false
|
6
|
+
t.string :version, null: false
|
7
|
+
t.date :date, null: false
|
8
|
+
t.bigint :total, null: false, default: 1
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
add_index :active_analytics_browsers_per_days, [:date, :site, :name, :version]
|
12
|
+
end
|
13
|
+
end
|
data/lib/active_analytics.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
require "active_analytics/version"
|
2
2
|
require "active_analytics/engine"
|
3
|
+
require "browser"
|
3
4
|
|
4
5
|
module ActiveAnalytics
|
6
|
+
mattr_accessor :base_controller_class, default: "ActionController::Base"
|
7
|
+
|
5
8
|
def self.redis_url=(string)
|
6
9
|
@redis_url = string
|
7
10
|
end
|
@@ -28,6 +31,9 @@ module ActiveAnalytics
|
|
28
31
|
params[:referrer_host], params[:referrer_path] = ViewsPerDay.split_referrer(request.referrer)
|
29
32
|
end
|
30
33
|
ViewsPerDay.append(params)
|
34
|
+
|
35
|
+
browser = Browser.new(request.headers["User-Agent"])
|
36
|
+
BrowsersPerDay.append(site: request.host, date: Date.today, name: browser.name, version: browser.version)
|
31
37
|
rescue => ex
|
32
38
|
if Rails.env.development? || Rails.env.test?
|
33
39
|
raise ex
|
@@ -38,26 +44,56 @@ module ActiveAnalytics
|
|
38
44
|
end
|
39
45
|
|
40
46
|
SEPARATOR = "|"
|
41
|
-
|
42
|
-
|
47
|
+
|
48
|
+
PAGE_QUEUE = "ActiveAnalytics::PageQueue"
|
49
|
+
BROWSER_QUEUE = "ActiveAnalytics::BrowserQueue"
|
50
|
+
|
51
|
+
OLD_PAGE_QUEUE = "ActiveAnalytics::OldPageQueue"
|
52
|
+
OLD_BROWSER_QUEUE = "ActiveAnalytics::BrowserQueue"
|
43
53
|
|
44
54
|
def self.queue_request(request)
|
55
|
+
queue_request_page(request)
|
56
|
+
queue_request_browser(request)
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.queue_request_page(request)
|
45
60
|
keys = [request.host, request.path]
|
46
61
|
if request.referrer.present?
|
47
62
|
keys.concat(ViewsPerDay.split_referrer(request.referrer))
|
48
63
|
end
|
49
|
-
redis.hincrby(
|
64
|
+
redis.hincrby(PAGE_QUEUE, keys.join(SEPARATOR).downcase, 1)
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.queue_request_browser(request)
|
68
|
+
browser = Browser.new(request.headers["User-Agent"])
|
69
|
+
keys = [request.host.downcase, browser.name, browser.version]
|
70
|
+
redis.hincrby(BROWSER_QUEUE, keys.join(SEPARATOR), 1)
|
50
71
|
end
|
51
72
|
|
52
73
|
def self.flush_queue
|
53
|
-
|
54
|
-
|
74
|
+
flush_page_queue
|
75
|
+
flush_browser_queue
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.flush_page_queue
|
79
|
+
return if !redis.exists?(PAGE_QUEUE)
|
55
80
|
date = Date.today
|
56
|
-
redis.rename(
|
57
|
-
redis.hscan_each(
|
81
|
+
redis.rename(PAGE_QUEUE, OLD_PAGE_QUEUE)
|
82
|
+
redis.hscan_each(OLD_PAGE_QUEUE) do |key, count|
|
58
83
|
site, page, referrer_host, referrer_path = key.split(SEPARATOR)
|
59
84
|
ViewsPerDay.append(date: date, site: site, page: page, referrer_host: referrer_host, referrer_path: referrer_path, total: count.to_i)
|
60
85
|
end
|
61
|
-
redis.del(
|
86
|
+
redis.del(OLD_PAGE_QUEUE)
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.flush_browser_queue
|
90
|
+
return if !redis.exists?(BROWSER_QUEUE)
|
91
|
+
date = Date.today
|
92
|
+
redis.rename(BROWSER_QUEUE, OLD_BROWSER_QUEUE)
|
93
|
+
redis.hscan_each(OLD_BROWSER_QUEUE) do |key, count|
|
94
|
+
site, name, version = key.split(SEPARATOR)
|
95
|
+
BrowsersPerDay.append(date: date, site: site, name: name, version: version, total: count.to_i)
|
96
|
+
end
|
97
|
+
redis.del(OLD_BROWSER_QUEUE)
|
62
98
|
end
|
63
99
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_analytics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexis Bernard
|
8
8
|
- Antoine Marguerie
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2025-03-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -25,6 +25,20 @@ dependencies:
|
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 5.2.0
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: browser
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.0.0
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 1.0.0
|
28
42
|
description: NO cookies, NO JavaScript, NO third parties and NO bullshit.
|
29
43
|
email:
|
30
44
|
- alexis@basesecrete.com
|
@@ -41,16 +55,20 @@ files:
|
|
41
55
|
- app/assets/images/active_analytics_screenshot.png
|
42
56
|
- app/controllers/active_analytics/application_controller.rb
|
43
57
|
- app/controllers/active_analytics/assets_controller.rb
|
58
|
+
- app/controllers/active_analytics/browsers_controller.rb
|
44
59
|
- app/controllers/active_analytics/pages_controller.rb
|
45
60
|
- app/controllers/active_analytics/referrers_controller.rb
|
46
61
|
- app/controllers/active_analytics/sites_controller.rb
|
47
62
|
- app/helpers/active_analytics/application_helper.rb
|
63
|
+
- app/helpers/active_analytics/browsers_helper.rb
|
48
64
|
- app/helpers/active_analytics/pages_helper.rb
|
49
65
|
- app/helpers/active_analytics/referrers_helper.rb
|
50
66
|
- app/helpers/active_analytics/sites_helper.rb
|
51
67
|
- app/jobs/active_analytics/application_job.rb
|
68
|
+
- app/lib/active_analytics/histogram.rb
|
52
69
|
- app/mailers/active_analytics/application_mailer.rb
|
53
70
|
- app/models/active_analytics/application_record.rb
|
71
|
+
- app/models/active_analytics/browsers_per_day.rb
|
54
72
|
- app/models/active_analytics/views_per_day.rb
|
55
73
|
- app/views/active_analytics/assets/_charts.css
|
56
74
|
- app/views/active_analytics/assets/_style.css
|
@@ -58,6 +76,22 @@ files:
|
|
58
76
|
- app/views/active_analytics/assets/application.js
|
59
77
|
- app/views/active_analytics/assets/ariato.css
|
60
78
|
- app/views/active_analytics/assets/ariato.js
|
79
|
+
- app/views/active_analytics/assets/browsers/arc.svg
|
80
|
+
- app/views/active_analytics/assets/browsers/brave.svg
|
81
|
+
- app/views/active_analytics/assets/browsers/chrome.svg
|
82
|
+
- app/views/active_analytics/assets/browsers/default.svg
|
83
|
+
- app/views/active_analytics/assets/browsers/firefox.svg
|
84
|
+
- app/views/active_analytics/assets/browsers/internet_explorer.svg
|
85
|
+
- app/views/active_analytics/assets/browsers/microsoft_edge.svg
|
86
|
+
- app/views/active_analytics/assets/browsers/opera.svg
|
87
|
+
- app/views/active_analytics/assets/browsers/safari.svg
|
88
|
+
- app/views/active_analytics/assets/browsers/samsung_internet.svg
|
89
|
+
- app/views/active_analytics/assets/browsers/vivaldi.svg
|
90
|
+
- app/views/active_analytics/assets/browsers/yandex.svg
|
91
|
+
- app/views/active_analytics/browsers/_table.html.erb
|
92
|
+
- app/views/active_analytics/browsers/_version_table.html.erb
|
93
|
+
- app/views/active_analytics/browsers/index.html.erb
|
94
|
+
- app/views/active_analytics/browsers/show.html.erb
|
61
95
|
- app/views/active_analytics/pages/_table.html.erb
|
62
96
|
- app/views/active_analytics/pages/index.html.erb
|
63
97
|
- app/views/active_analytics/pages/show.html.erb
|
@@ -73,6 +107,7 @@ files:
|
|
73
107
|
- app/views/layouts/active_analytics/application.html.erb
|
74
108
|
- config/routes.rb
|
75
109
|
- db/migrate/20210303094108_create_active_analytics_views_per_days.rb
|
110
|
+
- db/migrate/20240823150626_create_active_analytics_browsers_per_days.rb
|
76
111
|
- lib/active_analytics.rb
|
77
112
|
- lib/active_analytics/engine.rb
|
78
113
|
- lib/active_analytics/version.rb
|
@@ -85,7 +120,7 @@ metadata:
|
|
85
120
|
homepage_uri: https://github.com/BaseSecrete/active_analytics
|
86
121
|
source_code_uri: https://github.com/BaseSecrete/active_analytics
|
87
122
|
changelog_uri: https://github.com/BaseSecrete/active_analytics
|
88
|
-
post_install_message:
|
123
|
+
post_install_message:
|
89
124
|
rdoc_options: []
|
90
125
|
require_paths:
|
91
126
|
- lib
|
@@ -100,8 +135,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
135
|
- !ruby/object:Gem::Version
|
101
136
|
version: '0'
|
102
137
|
requirements: []
|
103
|
-
rubygems_version: 3.
|
104
|
-
signing_key:
|
138
|
+
rubygems_version: 3.5.22
|
139
|
+
signing_key:
|
105
140
|
specification_version: 4
|
106
141
|
summary: First-party, privacy-focused traffic analytics for Ruby on Rails applications
|
107
142
|
test_files: []
|