disco_app 0.8.9 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/images/disco_app/icons.svg +0 -0
- data/app/assets/javascripts/disco_app/components/{filterable_shop_list.js.jsx → custom/filterable_shop_list.js.jsx} +1 -1
- data/app/assets/javascripts/disco_app/components/custom/inline-radio-options.es6.jsx +59 -0
- data/app/assets/javascripts/disco_app/components/custom/rules-editor.es6.jsx +360 -0
- data/app/assets/javascripts/disco_app/components/{shop_list.js.jsx → custom/shop_list.js.jsx} +9 -11
- data/app/assets/javascripts/disco_app/components/custom/shop_row.js.jsx +43 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/cards/card-section.es6.jsx +30 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/cards/card.es6.jsx +9 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/cards/cart-section-title.es6.jsx +7 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_form.es6.jsx +72 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_input.es6.jsx +20 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/button.es6.jsx +13 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-radio.es6.jsx +30 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-select.es6.jsx +39 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-text.es6.jsx +59 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-textarea.es6.jsx +48 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/icons/icon-chevron.es6.jsx +33 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/icons/next-icon.es6.jsx +18 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/input_select.es6.jsx +21 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-annotated-section.es6.jsx +29 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-empty-state.es6.jsx +35 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-footer-help.es6.jsx +13 -0
- data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-page-actions.es6.jsx +39 -0
- data/app/assets/javascripts/disco_app/components.js +1 -4
- data/app/assets/javascripts/disco_app/disco_app.js +3 -0
- data/app/assets/javascripts/disco_app/ui-kit.js +1 -0
- data/app/assets/stylesheets/disco_app/admin/_header.scss +66 -0
- data/app/assets/stylesheets/disco_app/admin/_layout.scss +40 -0
- data/app/assets/stylesheets/disco_app/admin/_nav.scss +172 -0
- data/app/assets/stylesheets/disco_app/admin.scss +11 -0
- data/app/assets/stylesheets/disco_app/disco_app.scss +12 -12
- data/app/assets/stylesheets/disco_app/{disco/mixins → mixins}/_flexbox.scss +6 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-empty-state.scss +94 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-footer-help.scss +25 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-icons.scss +28 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-kit.scss +5086 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-layout.scss +10 -0
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-page-actions.scss +21 -0
- data/app/assets/stylesheets/disco_app/{disco/_tabs.scss → ui-kit/_ui-tabs.scss} +3 -1
- data/app/assets/stylesheets/disco_app/ui-kit/_ui-type.scss +13 -0
- data/app/controllers/disco_app/admin/concerns/plans_controller.rb +8 -5
- data/app/controllers/disco_app/admin/concerns/subscriptions_controller.rb +32 -0
- data/app/controllers/disco_app/admin/subscriptions_controller.rb +3 -0
- data/app/helpers/disco_app/application_helper.rb +22 -0
- data/app/models/disco_app/concerns/plan.rb +2 -2
- data/app/models/disco_app/concerns/shop.rb +0 -4
- data/app/models/disco_app/concerns/subscription.rb +12 -0
- data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +40 -3
- data/app/views/disco_app/admin/plans/_form.html.erb +18 -21
- data/app/views/disco_app/admin/plans/_plan_code_fields.html.erb +15 -0
- data/app/views/disco_app/admin/plans/index.html.erb +2 -0
- data/app/views/disco_app/admin/shops/index.html.erb +2 -1
- data/app/views/disco_app/admin/subscriptions/edit.html.erb +33 -0
- data/app/views/disco_app/shared/_icons.html.erb +3 -0
- data/app/views/layouts/admin/_nav_items.erb +20 -0
- data/app/views/layouts/admin.html.erb +53 -9
- data/app/views/layouts/embedded_app.html.erb +2 -0
- data/app/views/layouts/embedded_app_modal.html.erb +11 -0
- data/config/routes.rb +4 -2
- data/lib/disco_app/engine.rb +2 -1
- data/lib/disco_app/version.rb +1 -1
- data/lib/generators/disco_app/disco_app_generator.rb +35 -2
- data/lib/generators/disco_app/templates/assets/javascripts/components.js +3 -0
- data/lib/generators/disco_app/templates/config/database.yml.tt +20 -0
- data/lib/tasks/database.rake +8 -0
- data/test/controllers/disco_app/charges_controller_test.rb +9 -2
- data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_request.json +1 -1
- data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_request.json +1 -1
- data/test/fixtures/disco_app/subscriptions.yml +1 -0
- data/test/models/disco_app/subscription_test.rb +19 -0
- data/test/services/disco_app/charges_service_test.rb +9 -2
- data/test/test_helper.rb +3 -0
- metadata +80 -21
- data/app/assets/javascripts/disco_app/components/shop_row.js.jsx +0 -27
- data/app/assets/stylesheets/disco_app/bootstrap/_custom.scss +0 -54
- data/app/assets/stylesheets/disco_app/bootstrap/_variables.scss +0 -872
- data/app/assets/stylesheets/disco_app/disco/_buttons.scss +0 -31
- data/app/assets/stylesheets/disco_app/disco/_cards.scss +0 -52
- data/app/assets/stylesheets/disco_app/disco/_forms.scss +0 -23
- data/app/assets/stylesheets/disco_app/disco/_grid.scss +0 -58
- data/app/assets/stylesheets/disco_app/disco/_sections.scss +0 -61
- data/app/assets/stylesheets/disco_app/disco/_tables.scss +0 -57
- data/app/assets/stylesheets/disco_app/disco/_type.scss +0 -39
- data/app/views/layouts/admin/_navbar.html.erb +0 -25
- data/lib/generators/disco_app/adminify/adminify_generator.rb +0 -35
- data/lib/generators/disco_app/reactify/reactify_generator.rb +0 -45
- /data/app/assets/javascripts/disco_app/components/{shop_filter_tab.js.jsx → custom/shop_filter_tab.js.jsx} +0 -0
- /data/app/assets/javascripts/disco_app/components/{shop_filter_tabs.js.jsx → custom/shop_filter_tabs.js.jsx} +0 -0
- /data/app/assets/javascripts/disco_app/components/{shopify_admin_link.js.jsx → custom/shopify_admin_link.js.jsx} +0 -0
@@ -1,31 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// Replicate the styles for Shopify Admin buttons.
|
3
|
-
// --------------------------------------------------
|
4
|
-
|
5
|
-
.btn {
|
6
|
-
line-height: 1;
|
7
|
-
padding: 8.5px 15px;
|
8
|
-
}
|
9
|
-
|
10
|
-
.btn-default {
|
11
|
-
&:hover, &:focus, &:active, &.active {
|
12
|
-
border-color: #d3dbe2;
|
13
|
-
background-color: #f5f6f7;
|
14
|
-
}
|
15
|
-
}
|
16
|
-
|
17
|
-
.btn-primary {
|
18
|
-
&:hover, &:focus, &:active, &.active {
|
19
|
-
border-color: #4293c2;
|
20
|
-
background-color: #4293c2;
|
21
|
-
}
|
22
|
-
}
|
23
|
-
|
24
|
-
.btn-disabled {
|
25
|
-
&, &:hover, &:focus, &:active {
|
26
|
-
cursor: default;
|
27
|
-
background: #fafbfc;
|
28
|
-
color: #c3cfd8;
|
29
|
-
border: 1px solid #d3dbe2;
|
30
|
-
}
|
31
|
-
}
|
@@ -1,52 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// Replicate the styles for Shopify Admin cards.
|
3
|
-
// --------------------------------------------------
|
4
|
-
|
5
|
-
.next-card {
|
6
|
-
background-color: #ffffff;
|
7
|
-
border-radius: 3px;
|
8
|
-
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
9
|
-
overflow-x: auto;
|
10
|
-
}
|
11
|
-
|
12
|
-
.next-card ~ .next-card {
|
13
|
-
margin-top: 20px;
|
14
|
-
}
|
15
|
-
|
16
|
-
.next-card__header {
|
17
|
-
padding: 20px 20px 0;
|
18
|
-
|
19
|
-
h1, h2, h3 {
|
20
|
-
margin-bottom: 0;
|
21
|
-
font-size: 18px;
|
22
|
-
line-height: 1.2em;
|
23
|
-
}
|
24
|
-
}
|
25
|
-
|
26
|
-
.next-card__footer {
|
27
|
-
padding: 0 20px 20px;
|
28
|
-
}
|
29
|
-
|
30
|
-
.next-card__section {
|
31
|
-
padding: 20px;
|
32
|
-
}
|
33
|
-
|
34
|
-
.next-card__section ~ .next-card__section {
|
35
|
-
border-top: 1px solid #ebeef0;
|
36
|
-
}
|
37
|
-
|
38
|
-
.next-card__section--no-bottom-padding {
|
39
|
-
padding-bottom: 0;
|
40
|
-
}
|
41
|
-
|
42
|
-
.next-card--aside,
|
43
|
-
.next-card--disabled {
|
44
|
-
background-color: #f5f6f7;
|
45
|
-
}
|
46
|
-
|
47
|
-
.next-card--disabled {
|
48
|
-
.next-card__header,
|
49
|
-
.next-card__section {
|
50
|
-
color: #777777;
|
51
|
-
}
|
52
|
-
}
|
@@ -1,23 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// Replicate the styles for Shopify Admin forms.
|
3
|
-
// --------------------------------------------------
|
4
|
-
|
5
|
-
.form-control {
|
6
|
-
-webkit-box-shadow: none;
|
7
|
-
box-shadow: none;
|
8
|
-
|
9
|
-
font-size: 15px;
|
10
|
-
line-height: 20px;
|
11
|
-
|
12
|
-
&:focus {
|
13
|
-
-webkit-box-shadow: none;
|
14
|
-
box-shadow: none;
|
15
|
-
}
|
16
|
-
}
|
17
|
-
|
18
|
-
.help-block {
|
19
|
-
font-style: italic;
|
20
|
-
font-size: 13px;
|
21
|
-
color: #95a7b7;
|
22
|
-
margin-top: 5px;
|
23
|
-
}
|
@@ -1,58 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// Replicate the styles for Shopify Admin grid.
|
3
|
-
// --------------------------------------------------
|
4
|
-
|
5
|
-
.next-grid {
|
6
|
-
display: flex;
|
7
|
-
width: calc(100% - 20px);
|
8
|
-
margin: 0 auto;
|
9
|
-
box-sizing: border-box;
|
10
|
-
padding-top: 10px;
|
11
|
-
|
12
|
-
&:last-of-type {
|
13
|
-
padding-bottom: 10px;
|
14
|
-
}
|
15
|
-
}
|
16
|
-
|
17
|
-
.next-grid--no-padding {
|
18
|
-
width: 100%;
|
19
|
-
|
20
|
-
&:first-of-type, &:last-of-type {
|
21
|
-
padding: 0;
|
22
|
-
}
|
23
|
-
|
24
|
-
> .next-grid__cell {
|
25
|
-
padding: 0;
|
26
|
-
}
|
27
|
-
}
|
28
|
-
|
29
|
-
.next-grid--center-aligned, .next-grid--center-both {
|
30
|
-
-webkit-box-pack: center;
|
31
|
-
-webkit-justify-content: center;
|
32
|
-
-ms-flex-pack: center;
|
33
|
-
justify-content: center;
|
34
|
-
}
|
35
|
-
|
36
|
-
.next-grid--right-aligned {
|
37
|
-
-webkit-box-pack: end;
|
38
|
-
-webkit-justify-content: flex-end;
|
39
|
-
-ms-flex-pack: end;
|
40
|
-
justify-content: flex-end;
|
41
|
-
}
|
42
|
-
|
43
|
-
.next-grid__cell {
|
44
|
-
@include flex(1, 1, 0%);
|
45
|
-
padding: 10px;
|
46
|
-
box-sizing: border-box;
|
47
|
-
max-width: 100%;
|
48
|
-
min-width: 0;
|
49
|
-
}
|
50
|
-
|
51
|
-
.next-grid__cell--third {
|
52
|
-
@include flex(0, 0, 33.333%);
|
53
|
-
max-width: 33.333%;
|
54
|
-
}
|
55
|
-
|
56
|
-
.next-grid__cell--no-flex {
|
57
|
-
@include flex(0 0 auto);
|
58
|
-
}
|
@@ -1,61 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// Replicate the styles for Shopify Admin sections
|
3
|
-
// and flexbox layout.
|
4
|
-
// --------------------------------------------------
|
5
|
-
|
6
|
-
|
7
|
-
//== Layout
|
8
|
-
//
|
9
|
-
//## Simple Flexbox layout utilities.
|
10
|
-
|
11
|
-
.layout-content {
|
12
|
-
display: flex;
|
13
|
-
}
|
14
|
-
|
15
|
-
.layout-content__sidebar {
|
16
|
-
padding: 20px;
|
17
|
-
@include flex(1, 1, 25%);
|
18
|
-
max-width: 25%
|
19
|
-
}
|
20
|
-
|
21
|
-
.layout-content__main {
|
22
|
-
padding: 20px;
|
23
|
-
@include flex(1, 1, 0%);
|
24
|
-
}
|
25
|
-
|
26
|
-
.layout-content__first {
|
27
|
-
padding-right: 0;
|
28
|
-
}
|
29
|
-
|
30
|
-
|
31
|
-
//== Section
|
32
|
-
//
|
33
|
-
//## Simple Flexbox layout utilities.
|
34
|
-
|
35
|
-
//** Main section wrapper.
|
36
|
-
.section {
|
37
|
-
margin: 0;
|
38
|
-
padding: 0;
|
39
|
-
border-bottom: 1px solid #e6e6e6;
|
40
|
-
}
|
41
|
-
|
42
|
-
//** Section "summary" to the left of the section.
|
43
|
-
.section-summary {
|
44
|
-
padding: 20px 20px 20px 30px;
|
45
|
-
|
46
|
-
h1, h2 {
|
47
|
-
line-height: 1.325;
|
48
|
-
margin-top: -4px;
|
49
|
-
font-size: 18px;
|
50
|
-
margin-bottom: 10px;
|
51
|
-
}
|
52
|
-
|
53
|
-
p {
|
54
|
-
color: #798c9c;
|
55
|
-
margin-bottom: 15px;
|
56
|
-
|
57
|
-
&:last-child {
|
58
|
-
margin-bottom: 0;
|
59
|
-
}
|
60
|
-
}
|
61
|
-
}
|
@@ -1,57 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// Replicate the styles for Shopify Admin tables.
|
3
|
-
// --------------------------------------------------
|
4
|
-
|
5
|
-
table {
|
6
|
-
width: 100%;
|
7
|
-
border-collapse: separate;
|
8
|
-
border-spacing: 0;
|
9
|
-
|
10
|
-
&.expanded td {
|
11
|
-
padding-top: 8px;
|
12
|
-
padding-bottom: 8px;
|
13
|
-
}
|
14
|
-
}
|
15
|
-
|
16
|
-
th {
|
17
|
-
font-weight: 400;
|
18
|
-
text-align: left;
|
19
|
-
color: #31373d;
|
20
|
-
padding: 8px 10px;
|
21
|
-
border-bottom: 1px solid #ebeef0;
|
22
|
-
|
23
|
-
&.is-sortable {
|
24
|
-
cursor: pointer;
|
25
|
-
|
26
|
-
&:hover {
|
27
|
-
background: #eff9fd;
|
28
|
-
color: #479ccf;
|
29
|
-
}
|
30
|
-
}
|
31
|
-
}
|
32
|
-
|
33
|
-
td {
|
34
|
-
border-bottom: 1px solid #ebeef0;
|
35
|
-
padding: 6px 10px;
|
36
|
-
background: transparent;
|
37
|
-
}
|
38
|
-
|
39
|
-
th, td {
|
40
|
-
&.right-aligned {
|
41
|
-
text-align: right;
|
42
|
-
}
|
43
|
-
|
44
|
-
&.center-aligned {
|
45
|
-
text-align: center;
|
46
|
-
}
|
47
|
-
}
|
48
|
-
|
49
|
-
tr:last-child > td {
|
50
|
-
border-bottom: none;
|
51
|
-
}
|
52
|
-
|
53
|
-
.table-hover {
|
54
|
-
tr:hover td {
|
55
|
-
background: #eff9fd;
|
56
|
-
}
|
57
|
-
}
|
@@ -1,39 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// Replicate the styles for Shopify Admin typography.
|
3
|
-
// --------------------------------------------------
|
4
|
-
|
5
|
-
|
6
|
-
//== Headings
|
7
|
-
//
|
8
|
-
//## Heading styles.
|
9
|
-
|
10
|
-
h1, .h1,
|
11
|
-
h2, .h2,
|
12
|
-
h3, .h3,
|
13
|
-
h4, .h4,
|
14
|
-
h5, .h5,
|
15
|
-
h6, .h6 {
|
16
|
-
margin: 0 0 20px 0;
|
17
|
-
}
|
18
|
-
|
19
|
-
p {
|
20
|
-
margin: 0;
|
21
|
-
}
|
22
|
-
|
23
|
-
|
24
|
-
//== Type
|
25
|
-
//
|
26
|
-
//## Type modifiers.
|
27
|
-
|
28
|
-
.type--subdued {
|
29
|
-
color: #798c9c;
|
30
|
-
}
|
31
|
-
|
32
|
-
a.type--subdued {
|
33
|
-
color: inherit;
|
34
|
-
text-decoration: underline;
|
35
|
-
|
36
|
-
&:hover {
|
37
|
-
color: #272c30;
|
38
|
-
}
|
39
|
-
}
|
@@ -1,25 +0,0 @@
|
|
1
|
-
<nav class="navbar navbar-default navbar-static-top">
|
2
|
-
<div class="container-fluid">
|
3
|
-
|
4
|
-
<!-- Brand & Toggle -->
|
5
|
-
<div class="navbar-header">
|
6
|
-
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
|
7
|
-
<span class="sr-only">Toggle navigation</span>
|
8
|
-
<span class="icon-bar"></span>
|
9
|
-
<span class="icon-bar"></span>
|
10
|
-
<span class="icon-bar"></span>
|
11
|
-
</button>
|
12
|
-
<a class="navbar-brand" href="<%= admin_shops_path %>">Credible</a>
|
13
|
-
</div>
|
14
|
-
|
15
|
-
<!-- Collapsing Navigation Links -->
|
16
|
-
<div class="collapse navbar-collapse">
|
17
|
-
<ul class="nav navbar-nav">
|
18
|
-
<%= active_link_to 'Shops', admin_shops_path, wrap_tag: :li %>
|
19
|
-
<%= active_link_to 'Plans', admin_plans_path, wrap_tag: :li %>
|
20
|
-
<%= active_link_to 'Settings', edit_admin_app_settings_path, wrap_tag: :li %>
|
21
|
-
</ul>
|
22
|
-
</div>
|
23
|
-
|
24
|
-
</div>
|
25
|
-
</nav>
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module DiscoApp
|
2
|
-
module Generators
|
3
|
-
class AdminifyGenerator < Rails::Generators::Base
|
4
|
-
|
5
|
-
source_root File.expand_path('../templates', __FILE__)
|
6
|
-
|
7
|
-
# Run disco_app:reactfy since the admin section needs react
|
8
|
-
def reactify_install
|
9
|
-
generate 'disco_app:reactify'
|
10
|
-
end
|
11
|
-
|
12
|
-
def configure_gems
|
13
|
-
gem 'active_link_to', '~> 1.0.2'
|
14
|
-
end
|
15
|
-
|
16
|
-
def add_env_variables
|
17
|
-
env_variables = <<-CONFIG.strip_heredoc
|
18
|
-
|
19
|
-
ADMIN_APP_USERNAME=
|
20
|
-
ADMIN_APP_PASSWORD=
|
21
|
-
CONFIG
|
22
|
-
append_to_file '.env', env_variables
|
23
|
-
append_to_file '.env.local', env_variables
|
24
|
-
end
|
25
|
-
|
26
|
-
# Run bundle install to add our new gems before running tasks.
|
27
|
-
def bundle_install
|
28
|
-
Bundler.with_clean_env do
|
29
|
-
run 'bundle install'
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
module DiscoApp
|
2
|
-
module Generators
|
3
|
-
class ReactifyGenerator < Rails::Generators::Base
|
4
|
-
|
5
|
-
source_root File.expand_path('../templates', __FILE__)
|
6
|
-
|
7
|
-
# Install the react-rails gem and run its setup.
|
8
|
-
def install_gem
|
9
|
-
# Add gem to Gemfile
|
10
|
-
gem 'react-rails', '~> 1.6.0'
|
11
|
-
|
12
|
-
# Install gem.
|
13
|
-
Bundler.with_clean_env do
|
14
|
-
run 'bundle install'
|
15
|
-
end
|
16
|
-
|
17
|
-
# Run the gem's generator.
|
18
|
-
generate 'react:install'
|
19
|
-
end
|
20
|
-
|
21
|
-
# Set application configuration
|
22
|
-
def configure_application
|
23
|
-
application "config.react.variant = :development", env: :development
|
24
|
-
application "# Use development variant of React in development.", env: :development
|
25
|
-
application "config.react.variant = :production", env: :production
|
26
|
-
application "# Use production variant of React in production.", env: :production
|
27
|
-
end
|
28
|
-
|
29
|
-
# Include the DiscoApp component library in the application.js manifest.
|
30
|
-
def add_to_manifest
|
31
|
-
inject_into_file manifest, "//= require disco_app/components\n", { before: "//= require components\n" }
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
# This method of finding the application.js manifest taken from the
|
37
|
-
# install generator in react-rails.
|
38
|
-
# See https://github.com/reactjs/react-rails/blob/3f0af13fa755d6e95969c17728d0354c234f3a37/lib/generators/react/install_generator.rb#L53-L55
|
39
|
-
def manifest
|
40
|
-
Pathname.new(destination_root).join('app/assets/javascripts', 'application.js')
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
File without changes
|
File without changes
|
File without changes
|