tb_banners 1.1.1 → 1.1.2
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/admin/banners/banners.png +0 -0
- data/app/assets/javascripts/admin/banners/banners.js +26 -16
- data/app/assets/stylesheets/admin/banners/banners.css.scss +27 -0
- data/app/controllers/admin/banners_controller.rb +2 -2
- data/app/helpers/spud_banners_helper.rb +36 -6
- data/app/models/spud_banner.rb +10 -2
- data/app/views/admin/banner_sets/show.html.erb +15 -4
- data/app/views/admin/banners/_banner.html.erb +27 -7
- data/app/views/admin/banners/_form.html.erb +41 -27
- data/db/migrate/20140721142719_add_start_and_end_dates_to_spud_banners.rb +6 -0
- data/lib/spud_banners/version.rb +1 -1
- metadata +4 -4
- data/app/assets/images/admin/banners/banners@2x.png +0 -0
- data/app/assets/stylesheets/admin/banners/banners.css +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad452499d29ec9a3057ccd4cb8a36c033d63092d
|
4
|
+
data.tar.gz: e036c409580661b5e0de416b6742749fdbae9ba8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b7ba0b3b26f430ef451a377302ae412b7a9cbbf2cb3e2896b5fbdac9b9848359852a2805c18b6175c7a90fc766b33f8fc06935d94b6914c06ab8bb37bc3692d
|
7
|
+
data.tar.gz: 4af7f96c8d9b8724636bfea43af11c2bc1fe520ab03d0e0615b7d28c5d679b7bd937c25db52bc52568147a2149c2942bef5436de29dd88bde09d1f7af5fb1115
|
Binary file
|
@@ -14,16 +14,25 @@ spud.admin.banners = new function(){
|
|
14
14
|
if(typeof(FormData) != 'undefined'){
|
15
15
|
html5upload = true;
|
16
16
|
}
|
17
|
-
$('.
|
18
|
-
$('.
|
19
|
-
$('.
|
17
|
+
$('.admin-banner-set-item-add').on('click', self.clickedAddNewBanner);
|
18
|
+
$('.admin-banner-set-items-container').on('click', '.admin-banner-set-item-edit', self.clickedEditBanner);
|
19
|
+
$('.admin-banner-set-items-container').on('click', '.admin-banner-set-item-delete', self.clickedDeleteBanner);
|
20
20
|
$('.modal-body').on('submit', '.spud_banner_form', self.submittedBannerForm);
|
21
21
|
|
22
|
-
$('.
|
23
|
-
stop: self.sortedBanners
|
22
|
+
$('.admin-banner-set-items-container').sortable({
|
23
|
+
stop: self.sortedBanners,
|
24
|
+
helper: fixHelper
|
24
25
|
});
|
25
26
|
};
|
26
27
|
|
28
|
+
// http://www.foliotek.com/devblog/make-table-rows-sortable-using-jquery-ui-sortable/
|
29
|
+
var fixHelper = function(e, ui) {
|
30
|
+
ui.children().each(function() {
|
31
|
+
$(this).width($(this).width());
|
32
|
+
});
|
33
|
+
return ui;
|
34
|
+
};
|
35
|
+
|
27
36
|
self.clickedAddNewBanner = function(e){
|
28
37
|
e.preventDefault();
|
29
38
|
bannerEditId = false;
|
@@ -41,7 +50,7 @@ spud.admin.banners = new function(){
|
|
41
50
|
|
42
51
|
self.clickedEditBanner = function(e){
|
43
52
|
e.preventDefault();
|
44
|
-
bannerEditId = parseInt($(this).parents('.
|
53
|
+
bannerEditId = parseInt($(this).parents('.admin-banner-set-item').attr('data-id'), 10);
|
45
54
|
$.ajax({
|
46
55
|
url: $(this).attr('href'),
|
47
56
|
dataType: 'html',
|
@@ -62,7 +71,7 @@ spud.admin.banners = new function(){
|
|
62
71
|
type: 'post',
|
63
72
|
data: {'_method':'delete'},
|
64
73
|
complete: function(jqXHR, textStatus){
|
65
|
-
var parent = el.parents('.
|
74
|
+
var parent = el.parents('.admin-banner-set-item');
|
66
75
|
parent.fadeOut(200, function(){
|
67
76
|
parent.remove();
|
68
77
|
});
|
@@ -79,12 +88,13 @@ spud.admin.banners = new function(){
|
|
79
88
|
|
80
89
|
var form = $(this);
|
81
90
|
var fd = new FormData();
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
91
|
+
|
92
|
+
$('input[type=text], input[type=hidden], select').each(function(index, element){
|
93
|
+
var input = $(element);
|
94
|
+
var name = input.attr('name');
|
95
|
+
var value = input.val();
|
96
|
+
fd.append(name, value);
|
97
|
+
});
|
88
98
|
|
89
99
|
var richText = form.find('.spud_banner_rich_text');
|
90
100
|
if(richText){
|
@@ -142,11 +152,11 @@ spud.admin.banners = new function(){
|
|
142
152
|
// Non-html5 upload
|
143
153
|
self.onLegacyUploadComplete = function(html){
|
144
154
|
if(bannerEditId){
|
145
|
-
var item = $('.
|
155
|
+
var item = $('.admin-banner-set-item[data-id="'+bannerEditId+'"]');
|
146
156
|
item.replaceWith(html);
|
147
157
|
}
|
148
158
|
else{
|
149
|
-
$('.
|
159
|
+
$('.admin-banner-set-items-container').append(html);
|
150
160
|
}
|
151
161
|
hideModalDialog();
|
152
162
|
};
|
@@ -157,7 +167,7 @@ spud.admin.banners = new function(){
|
|
157
167
|
|
158
168
|
self.sortedBanners = function(e, ui){
|
159
169
|
var ids = [];
|
160
|
-
$('.
|
170
|
+
$('.admin-banner-set-item').each(function(){
|
161
171
|
ids.push($(this).attr('data-id'));
|
162
172
|
});
|
163
173
|
$.ajax({
|
@@ -0,0 +1,27 @@
|
|
1
|
+
// Banner Management
|
2
|
+
.admin-banner-set-items-container{
|
3
|
+
|
4
|
+
}
|
5
|
+
.admin-banner-set-item{
|
6
|
+
cursor: move;
|
7
|
+
}
|
8
|
+
.admin-banner-set-item.ui-sortable-helper{
|
9
|
+
width: 940px;
|
10
|
+
display: block;
|
11
|
+
}
|
12
|
+
.admin-banner-set-item img{
|
13
|
+
display: block;
|
14
|
+
}
|
15
|
+
.admin-banner-set-item-nowrap{
|
16
|
+
white-space: nowrap;
|
17
|
+
}
|
18
|
+
|
19
|
+
// Banner Form
|
20
|
+
.spud_banner_upload_progress{
|
21
|
+
display: none;
|
22
|
+
}
|
23
|
+
.controls-banner-date-selects{
|
24
|
+
select{
|
25
|
+
width: 100px;
|
26
|
+
}
|
27
|
+
}
|
@@ -8,7 +8,7 @@ class Admin::BannersController < Admin::ApplicationController
|
|
8
8
|
layout false
|
9
9
|
|
10
10
|
def new
|
11
|
-
@banner = @banner_set.banners.new
|
11
|
+
@banner = @banner_set.banners.new(:start_date => Date.today)
|
12
12
|
respond_with @banner
|
13
13
|
end
|
14
14
|
|
@@ -102,7 +102,7 @@ private
|
|
102
102
|
end
|
103
103
|
|
104
104
|
def banner_params
|
105
|
-
params.require(:spud_banner).permit(:banner, :link_to, :link_target, :title, :alt, :sort_order, :rich_text)
|
105
|
+
params.require(:spud_banner).permit(:banner, :link_to, :link_target, :title, :alt, :sort_order, :rich_text, :start_date, :end_date)
|
106
106
|
end
|
107
107
|
|
108
108
|
end
|
@@ -1,5 +1,13 @@
|
|
1
1
|
module SpudBannersHelper
|
2
2
|
|
3
|
+
# Returns banner html for a given identifier
|
4
|
+
# Generated HTML will be cached if your application uses fragment caching
|
5
|
+
#
|
6
|
+
# * set_or_identifier: A reference to a SpudBannerSet, or the name of a known banner set passed as a symbol (ie, :home)
|
7
|
+
# * options:
|
8
|
+
# - limit: Max number of banners to return
|
9
|
+
# - background_image: Pass true to return the banners as CSS background-image properties rather than <img/> tags
|
10
|
+
#
|
3
11
|
def spud_banners_for_set(set_or_identifier, options = {})
|
4
12
|
if set_or_identifier.is_a?(SpudBannerSet)
|
5
13
|
banner_set = set_or_identifier
|
@@ -12,22 +20,42 @@ module SpudBannersHelper
|
|
12
20
|
end
|
13
21
|
end
|
14
22
|
|
23
|
+
# Returns banner html for a given banner_set
|
24
|
+
#
|
25
|
+
# * banner_set: A reference to a SpudBannerSet
|
26
|
+
# * options:
|
27
|
+
# - limit: Max number of banners to return
|
28
|
+
# - background_image: Pass true to return the banners as CSS background-image properties rather than <img/> tags
|
29
|
+
#
|
15
30
|
def spud_banners_set_tag(banner_set, options = {})
|
16
|
-
|
31
|
+
background_image = options.delete(:background_image)
|
32
|
+
limit = options.delete(:limit) || false
|
33
|
+
banners_query = banner_set.banners.active.limit(limit)
|
17
34
|
if block_given?
|
18
|
-
|
35
|
+
banners_query.each do |banner|
|
19
36
|
yield(banner)
|
20
37
|
end
|
21
38
|
else
|
22
|
-
content_tag(:div, :class =>
|
23
|
-
|
24
|
-
|
39
|
+
content_tag(:div, :class => "spud-banner-set #{options[:wrapper_class]}", 'data-id' => banner_set.id) do
|
40
|
+
banners_query.map do |banner|
|
41
|
+
if background_image
|
42
|
+
concat(content_tag(:div, :class => "spud-banner #{options[:banner_class]}", 'data-id' => banner.id, :style => "background:url('#{banner.banner.url(:banner)}') center center / 100% auto no-repeat;"){
|
43
|
+
if banner.rich_text
|
44
|
+
content_tag :div, raw(banner.rich_text), :class => 'spud-banner-rich-text'
|
45
|
+
end
|
46
|
+
})
|
47
|
+
else
|
48
|
+
concat(content_tag(:div, :class => "spud-banner #{options[:banner_class]}", 'data-id' => banner.id){ spud_banner_tag(banner, options) })
|
49
|
+
end
|
25
50
|
end
|
26
51
|
end
|
27
52
|
end
|
28
53
|
end
|
29
54
|
|
30
|
-
|
55
|
+
# Returns an HTML tag for a single banner
|
56
|
+
# May return either an <img/> or an <a/> depending on the banner
|
57
|
+
#
|
58
|
+
def spud_banner_tag(banner, options={})
|
31
59
|
if banner.link_to.blank?
|
32
60
|
spud_banner_image_tag(banner)
|
33
61
|
else
|
@@ -37,6 +65,8 @@ module SpudBannersHelper
|
|
37
65
|
end
|
38
66
|
end
|
39
67
|
|
68
|
+
# Returns an HTML <img/> tag for a single banner
|
69
|
+
#
|
40
70
|
def spud_banner_image_tag(banner)
|
41
71
|
image_tag(banner.banner.url(:banner), :alt => banner.alt, :title => banner.title)
|
42
72
|
end
|
data/app/models/spud_banner.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
class SpudBanner < ActiveRecord::Base
|
2
2
|
belongs_to :owner, :class_name => 'SpudBannerSet', :foreign_key => 'spud_banner_set_id', :inverse_of => :banners, :touch => true
|
3
3
|
|
4
|
+
scope :active, ->{
|
5
|
+
where('(start_date IS NULL OR start_date <= ?) AND (end_date IS NULL OR end_date >= ?)', Date.today, Date.today)
|
6
|
+
}
|
7
|
+
|
4
8
|
has_attached_file :banner,
|
5
9
|
:styles => lambda { |attachment| attachment.instance.dynamic_styles },
|
6
10
|
:convert_options => {
|
7
|
-
:
|
11
|
+
:tiny => '-strip -density 72x72',
|
8
12
|
:banner => '-strip -density 72x72'
|
9
13
|
},
|
10
14
|
:storage => Spud::Banners.paperclip_storage,
|
@@ -18,7 +22,7 @@ class SpudBanner < ActiveRecord::Base
|
|
18
22
|
|
19
23
|
def dynamic_styles
|
20
24
|
styles = {
|
21
|
-
:
|
25
|
+
:tiny => '150x150'
|
22
26
|
}
|
23
27
|
owner_style = nil
|
24
28
|
if self.owner
|
@@ -33,4 +37,8 @@ class SpudBanner < ActiveRecord::Base
|
|
33
37
|
return owner.name
|
34
38
|
end
|
35
39
|
|
40
|
+
def is_expired?
|
41
|
+
return end_date.present? && end_date < Date.today
|
42
|
+
end
|
43
|
+
|
36
44
|
end
|
@@ -1,10 +1,21 @@
|
|
1
1
|
<% content_for :data_controls do %>
|
2
|
-
<%= link_to 'Upload Banner', new_admin_banner_set_banner_path(@banner_set), :class => 'btn btn-primary
|
2
|
+
<%= link_to 'Upload Banner', new_admin_banner_set_banner_path(@banner_set), :class => 'btn btn-primary admin-banner-set-item-add' %>
|
3
3
|
<% end %>
|
4
4
|
|
5
|
-
<
|
6
|
-
|
7
|
-
|
5
|
+
<table class="table table-striped">
|
6
|
+
<thead>
|
7
|
+
<tr>
|
8
|
+
<th>Banner</th>
|
9
|
+
<th>Start Date</th>
|
10
|
+
<th>End Date</th>
|
11
|
+
<% if !@banner_set.has_rich_text %>
|
12
|
+
<th>Links to</th>
|
13
|
+
<% end %>
|
14
|
+
</tr>
|
15
|
+
</thead>
|
16
|
+
<tbody class="admin-banner-set-items-container">
|
17
|
+
<%= render :partial => 'admin/banners/banner', :collection => @banner_set.banners %>
|
18
|
+
</tbody>
|
8
19
|
|
9
20
|
<script>
|
10
21
|
$(document).ready(spud.admin.banners.init);
|
@@ -1,7 +1,27 @@
|
|
1
|
-
<%= content_tag :
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
</
|
7
|
-
|
1
|
+
<%= content_tag :tr, 'data-id' => banner.id, :class => 'admin-banner-set-item' do %>
|
2
|
+
<td width="200">
|
3
|
+
<%= link_to banner.banner.url(:banner), :target => :blank do %>
|
4
|
+
<%= image_tag banner.banner.url(:tiny) %>
|
5
|
+
<% end %>
|
6
|
+
</td>
|
7
|
+
<td><%= banner.start_date.try(:strftime, '%m/%d/%Y') %></td>
|
8
|
+
<td class="admin-banner-set-item-nowrap">
|
9
|
+
<%= banner.end_date.try(:strftime, '%m/%d/%Y') %>
|
10
|
+
<% if banner.is_expired? %>
|
11
|
+
<span class="label">Expired</span>
|
12
|
+
<% end %>
|
13
|
+
</td>
|
14
|
+
<% if !banner.owner.has_rich_text %>
|
15
|
+
<td>
|
16
|
+
<% if banner.link_to.present? %>
|
17
|
+
<%= link_to banner.link_to, banner.link_to, :target => :blank %>
|
18
|
+
<% else %>
|
19
|
+
n/a
|
20
|
+
<% end %>
|
21
|
+
</td>
|
22
|
+
<% end %>
|
23
|
+
<td class="admin-banner-set-item-nowrap">
|
24
|
+
<%= link_to 'Edit', edit_admin_banner_path(banner), :class => 'admin-banner-set-item-edit btn btn-mini' %>
|
25
|
+
<%= link_to 'Delete', admin_banner_path(banner), :class => 'admin-banner-set-item-delete btn btn-mini btn-danger' %>
|
26
|
+
</td>
|
27
|
+
<% end %>
|
@@ -3,33 +3,6 @@
|
|
3
3
|
<%= error_messages_for(f.object) %>
|
4
4
|
|
5
5
|
<fieldset>
|
6
|
-
<div class="control-group">
|
7
|
-
<%= f.label :link_to, 'Link to', :class => 'control-label' %>
|
8
|
-
<div class="controls">
|
9
|
-
<%= f.text_field :link_to %>
|
10
|
-
</div>
|
11
|
-
</div>
|
12
|
-
<div class="control-group">
|
13
|
-
<%= f.label :link_target, 'Open Link in', :class => 'control-label' %>
|
14
|
-
<div class="controls">
|
15
|
-
<%= f.select :link_target, options_for_select([
|
16
|
-
['Same Window', '_self'],
|
17
|
-
['New Window', '_blank']
|
18
|
-
], @banner.link_target) %>
|
19
|
-
</div>
|
20
|
-
</div>
|
21
|
-
<div class="control-group">
|
22
|
-
<%= f.label :title, 'Image Title', :class => 'control-label' %>
|
23
|
-
<div class="controls">
|
24
|
-
<%= f.text_field :title %>
|
25
|
-
</div>
|
26
|
-
</div>
|
27
|
-
<div class="control-group">
|
28
|
-
<%= f.label :alt, 'Alt Text', :class => 'control-label' %>
|
29
|
-
<div class="controls">
|
30
|
-
<%= f.text_field :alt %>
|
31
|
-
</div>
|
32
|
-
</div>
|
33
6
|
<div class="control-group">
|
34
7
|
<%= f.label :banner, 'Banner', :class => 'control-label' %>
|
35
8
|
<div class="controls">
|
@@ -43,7 +16,48 @@
|
|
43
16
|
<%= f.text_area :rich_text, :class => 'spud_banner_rich_text' %>
|
44
17
|
</div>
|
45
18
|
</div>
|
19
|
+
<% else %>
|
20
|
+
<div class="control-group">
|
21
|
+
<%= f.label :link_to, 'Link to', :class => 'control-label' %>
|
22
|
+
<div class="controls">
|
23
|
+
<%= f.text_field :link_to %>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
<div class="control-group">
|
27
|
+
<%= f.label :link_target, 'Open Link in', :class => 'control-label' %>
|
28
|
+
<div class="controls">
|
29
|
+
<%= f.select :link_target, options_for_select([
|
30
|
+
['Same Window', '_self'],
|
31
|
+
['New Window', '_blank']
|
32
|
+
], @banner.link_target) %>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
<div class="control-group">
|
36
|
+
<%= f.label :title, 'Image Title', :class => 'control-label' %>
|
37
|
+
<div class="controls">
|
38
|
+
<%= f.text_field :title %>
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
<div class="control-group">
|
42
|
+
<%= f.label :alt, 'Alt Text', :class => 'control-label' %>
|
43
|
+
<div class="controls">
|
44
|
+
<%= f.text_field :alt %>
|
45
|
+
</div>
|
46
|
+
</div>
|
46
47
|
<% end %>
|
48
|
+
<div class="control-group">
|
49
|
+
<%= f.label :start_date, 'Start Date', :class => 'control-label' %>
|
50
|
+
<div class="controls controls-banner-date-selects">
|
51
|
+
<%= f.date_select :start_date, :start_year => Date.today.year %>
|
52
|
+
</div>
|
53
|
+
</div>
|
54
|
+
<div class="control-group">
|
55
|
+
<%= f.label :end_date, 'End Date', :class => 'control-label' %>
|
56
|
+
<div class="controls controls-banner-date-selects">
|
57
|
+
<%= f.date_select :end_date, :include_blank => true, :start_year => Date.today.year %>
|
58
|
+
<span class="help-block">Leave blank to never expire</span>
|
59
|
+
</div>
|
60
|
+
</div>
|
47
61
|
</fieldset>
|
48
62
|
|
49
63
|
<div class="progress progress-striped active spud_banner_upload_progress">
|
data/lib/spud_banners/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tb_banners
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Westlake
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -189,13 +189,12 @@ files:
|
|
189
189
|
- README.markdown
|
190
190
|
- Rakefile
|
191
191
|
- app/assets/images/admin/banners/banners.png
|
192
|
-
- app/assets/images/admin/banners/banners@2x.png
|
193
192
|
- app/assets/javascripts/admin/banners/application.js
|
194
193
|
- app/assets/javascripts/admin/banners/banner_sets.js
|
195
194
|
- app/assets/javascripts/admin/banners/banners.js
|
196
195
|
- app/assets/stylesheets/admin/banners/application.css
|
197
196
|
- app/assets/stylesheets/admin/banners/banner_sets.css
|
198
|
-
- app/assets/stylesheets/admin/banners/banners.css
|
197
|
+
- app/assets/stylesheets/admin/banners/banners.css.scss
|
199
198
|
- app/controllers/admin/banner_sets_controller.rb
|
200
199
|
- app/controllers/admin/banners_controller.rb
|
201
200
|
- app/helpers/admin/banner_sets_helper.rb
|
@@ -220,6 +219,7 @@ files:
|
|
220
219
|
- db/migrate/20121116195139_create_spud_banners.rb
|
221
220
|
- db/migrate/20121116195312_create_spud_banner_sets.rb
|
222
221
|
- db/migrate/20130614132846_add_rich_text_to_spud_banners.rb
|
222
|
+
- db/migrate/20140721142719_add_start_and_end_dates_to_spud_banners.rb
|
223
223
|
- lib/spud_banners/configuration.rb
|
224
224
|
- lib/spud_banners/engine.rb
|
225
225
|
- lib/spud_banners/liquid_tags.rb
|
Binary file
|
@@ -1,36 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
Place all the styles related to the matching controller here.
|
3
|
-
They will automatically be included in application.css.
|
4
|
-
*/
|
5
|
-
|
6
|
-
/* Banner Management
|
7
|
-
-------------------- */
|
8
|
-
.spud_banner_set_banners_container{
|
9
|
-
|
10
|
-
}
|
11
|
-
.spud_banner_set_banner_item{
|
12
|
-
padding: 0 10px 10px 0;
|
13
|
-
position: relative;
|
14
|
-
display: inline-block;
|
15
|
-
cursor: move;
|
16
|
-
float: left;
|
17
|
-
}
|
18
|
-
.spud_banner_set_banner_item img{
|
19
|
-
display: inline-block;
|
20
|
-
}
|
21
|
-
.spud_banner_set_banner_item_actions{
|
22
|
-
position: absolute;
|
23
|
-
bottom: 10px;
|
24
|
-
right: 10px;
|
25
|
-
padding: 5px 10px;
|
26
|
-
background: rgba(0, 0, 0, 0.5);
|
27
|
-
}
|
28
|
-
.spud_banner_set_banner_item_actions a{
|
29
|
-
color: white;
|
30
|
-
}
|
31
|
-
|
32
|
-
/* Banner Form
|
33
|
-
--------------- */
|
34
|
-
.spud_banner_upload_progress{
|
35
|
-
display: none;
|
36
|
-
}
|