adhesiones-jekyll-theme 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,25 @@
1
+ {%- assign param = include.param | default: 'search' -%}
2
+
3
+ <form method="get" action="" class="form-inline" data-controller="search" data-action="search#search">
4
+ <div class="form-group">
5
+ <label for="{{ param }}_q" class="sr-only">{{ site.i18n.search.label }}</label>
6
+
7
+ <div class="input-group flex-nowrap">
8
+ <div class="input-group-prepend">
9
+ <span class="input-group-text fa fa-search border-0 pt-2"></span>
10
+ </div>
11
+
12
+ <input
13
+ class="border-0 form-control"
14
+ type="search"
15
+ required
16
+ id="{{ param }}_q"
17
+ name="q"
18
+ placeholder="{{ site.i18n.search.submit }}"
19
+ data-target="search.q"
20
+ autocomplete="off" />
21
+ </div>
22
+ </div>
23
+
24
+ <input class="sr-only" type="submit" value="{{ site.i18n.search.submit }}" />
25
+ </form>
data/_includes/share.html CHANGED
@@ -1,10 +1,11 @@
1
1
  {% capture url %}{{ site.url }}{{ include.url }}{% endcapture %}
2
2
 
3
3
  {% unless include.share.url == '%url' %}
4
- {% assign url = url | cgi_escape %}
4
+ {% assign url = url | default: '' | cgi_escape %}
5
5
  {% endunless %}
6
- {% assign title = include.title | cgi_escape %}
6
+ {% assign title = include.title | default: '' | cgi_escape %}
7
7
  {% assign description = include.description | default: '' | cgi_escape %}
8
+ {% assign tags = include.tags | join: ',' | default: '' | cgi_escape %}
8
9
 
9
10
  <a
10
11
  {% if include.share.url == '%url' %}
@@ -12,10 +13,10 @@
12
13
  {% else %}
13
14
  target="_blank"
14
15
  {% endif %}
15
- rel="nofollow"
16
+ rel="noopener nofollow"
16
17
  title="{{ include.share.title }}"
17
18
  class="d-flex flex-column align-items-center p-3"
18
- href="{{ include.share.url | replace: '%url', url | replace: '%title', title | replace: '%description', description }}">
19
+ href="{{ include.share.url | replace: '%url', url | replace: '%title', title | replace: '%description', description | replace: '%tags', tags }}">
19
20
  <i class="fa fa-fw fa-2x fa-{{ include.share.icon }}"></i>
20
21
  <span>{{ include.share.title }}</span>
21
22
  </a>
@@ -1 +1,5 @@
1
- <input type="submit" class="btn btn-success" value="{{ include.field[1].label[site.locale] }}" />
1
+ <input
2
+ data-target="contact.submit"
3
+ type="submit"
4
+ class="btn btn-success"
5
+ value="{{ include.field[1].label[site.locale] }}" />
@@ -10,7 +10,26 @@
10
10
  <meta name="referrer" content="strict-origin-when-cross-origin" />
11
11
 
12
12
  <link href="assets/css/styles.css" rel="stylesheet">
13
- <script defer type="text/javascript" src="assets/js/script.js"></script>
13
+
14
+ {% comment %}
15
+ Webpack. La configuración se pasa por variables de entorno, en
16
+ desarrollo hay que evitar el archivo .env (copiarlo de .env.example
17
+ si no existe.
18
+ {% endcomment %}
19
+ <link rel="preload" as="script" type="text/javascript" href="env.js" />
20
+ <script type="text/javascript" src="env.js"></script>
21
+ <script defer type="text/javascript" src="assets/js/pack.js"></script>
22
+
23
+ {% comment %}
24
+ Agregar otras tipografías. Esto hace que las tipografías se carguen
25
+ lo más rápido posible y minimizar el tiempo en que se ven las del
26
+ navegador. En Firefox todavía no está soportado.
27
+ {% endcomment %}
28
+ {% include_cached preload_font.html font='assets/fonts/forkawesome-webfont.woff2' %}
29
+
30
+ <link rel="icon" type="image/svg+xml" href="public/favicon.svg">
31
+ <link rel="alternate icon" href="public/favicon.ico">
32
+ <link rel="mask-icon" href="public/favicon.svg" color="white">
14
33
 
15
34
  {% seo %}
16
35
  {% feed_meta %}
data/_layouts/home.html CHANGED
@@ -27,7 +27,7 @@ layout: default
27
27
  <h1 class="font-weight-bold">{{ documento.title }}</h1>
28
28
  &mdash;
29
29
  <time datetime="{{ documento.date }}">
30
- {{ documento.date | date: site.i18n.date }}
30
+ {{ documento.date | date: site.i18n.date.format }}
31
31
  </time>
32
32
  </div>
33
33
 
@@ -76,7 +76,10 @@ layout: default
76
76
  </label>
77
77
 
78
78
  <div class="toggled collapsed fade">
79
- <form action="{{ site.sutty }}v1/sites/{{ site.hostname }}/posts/{{ form }}" method="post" enctype="multipart/form-data">
79
+ <form
80
+ data-controller="contact"
81
+ data-delay="30"
82
+ action="{{ site.sutty }}v1/sites/{{ site.hostname }}/posts/{{ form }}" method="post" enctype="multipart/form-data">
80
83
  <div class="row justify-content-center">
81
84
  {%- for field in site.data.layouts[form] -%}
82
85
  {%- if field[1].skip -%}{% continue %}{%- endif -%}
@@ -89,6 +92,10 @@ layout: default
89
92
 
90
93
  <div class="col-12">
91
94
  <input type="submit" value="{{ site.i18n.home.form.submit }}" class="btn btn-success btn-block" />
95
+ <small
96
+ class="form-text text-muted">
97
+ {{ site.i18n.home.form.submit_help }}
98
+ </small>
92
99
  </div>
93
100
  </div>
94
101
  </form>
@@ -166,7 +173,7 @@ layout: default
166
173
 
167
174
 
168
175
  <time datetime="{{ adhesion.date }}">
169
- {{ adhesion.date | date: site.i18n.date }}
176
+ {{ adhesion.date | date: site.i18n.date.format }}
170
177
  </time>
171
178
  </header>
172
179
 
data/_layouts/post.html CHANGED
@@ -4,10 +4,10 @@ layout: default
4
4
 
5
5
  <article class="h-entry" itemscope itemtype="http://schema.org/Article">
6
6
  <header>
7
- <h1 class="p-name" itemprop="name headline">{{ page.title | escape }}</h1>
7
+ <h1 class="p-name" itemprop="name headline">{{ page.title | default: '' | escape }}</h1>
8
8
 
9
9
  {%- if page.description -%}
10
- <p class="lead p-summary" itemprop="description">{{ page.description | escape }}</p>
10
+ <p class="lead p-summary" itemprop="description">{{ page.description | default: '' | escape }}</p>
11
11
  {%- endif -%}
12
12
 
13
13
  {%- if page.image.path -%}
@@ -22,14 +22,14 @@ layout: default
22
22
 
23
23
  <p>
24
24
  <time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
25
- {%- assign date_format = site.i18n.date | default: "%b %-d, %Y" -%}
26
- {{ page.date | date: date_format }}
25
+ {%- assign date_format = site.i18n.date.format | default: "%b %-d, %Y" -%}
26
+ {{ page.date | date_local: date_format }}
27
27
  </time>
28
28
  {%- for author in page.author -%}
29
29
 
30
30
  <span itemprop="author" itemscope itemtype="http://schema.org/Person">
31
31
  <span class="p-author h-card" itemprop="name">
32
- {{ author | escape }}
32
+ {{ author | default: '' | escape }}
33
33
  </span>
34
34
  </span>
35
35
  {%- endfor -%}
@@ -11,3 +11,27 @@
11
11
  animation: none !important;
12
12
  }
13
13
  }
14
+
15
+ .inaccesible {
16
+ outline: $red 1px solid;
17
+
18
+ @extend .position-relative;
19
+
20
+ &:focus::after {
21
+ @extend .position-fixed;
22
+ @extend .background-red;
23
+ @extend .white;
24
+ @extend .p-3;
25
+
26
+ left: 0;
27
+ bottom: 0;
28
+ width: 100vw;
29
+ font-size: 1rem;
30
+
31
+ word-wrap: normal;
32
+ line-break: auto;
33
+ white-space: pre-line;
34
+
35
+ content: attr(aria-label);
36
+ }
37
+ }
data/_sass/editor.scss ADDED
@@ -0,0 +1,8 @@
1
+ /*
2
+ * Estilos del editor de Sutty
3
+ */
4
+
5
+ // Alineación
6
+ div[data-align="left"] { text-align: left; }
7
+ div[data-align="center"] { text-align: center; }
8
+ div[data-align="right"] { text-align: right; }
data/_sass/embed.scss ADDED
@@ -0,0 +1,5 @@
1
+ iframe {
2
+ border: 0;
3
+ width: 100%;
4
+ min-height: 480px;
5
+ }
@@ -0,0 +1,10 @@
1
+ .floating-alert {
2
+ &.floating-alert-bottom {
3
+ bottom: 2rem;
4
+ }
5
+
6
+ .floating-alert-content {
7
+ border-radius: 2rem;
8
+ padding: .5rem 1rem;
9
+ }
10
+ }
data/_sass/helpers.scss CHANGED
@@ -1,54 +1,318 @@
1
- $bezier: cubic-bezier(0.75, 0, 0.25, 1);
1
+ // En este archivo colocamos todos las herramientas que nos hagan falta,
2
+ // de forma que podamos generar clases específicas que sean combinables
3
+ // con otras, en lugar de escribir clases específicas para cada
4
+ // elemento.
5
+ //
6
+ // Cada clase tiene su versión responsive de acuerdo a los parámetros de
7
+ // Bootstrap.
2
8
 
3
- /*
4
- * Crea una propiedad con prefijos de navegador
5
- */
6
- $vendor-prefixes: ("", "-webkit-", "-ms-", "-o-", "-moz-");
9
+ // Ocultar la barra de scroll, útil para sliders horizontales.
10
+ .no-scrollbar {
11
+ scrollbar-width: none;
12
+ -webkit-overflow-scrolling: touch;
13
+
14
+ &::-webkit-scrollbar { display: none; }
15
+ }
16
+
17
+ // Mismo alto que ancho
18
+ .square {
19
+ @extend .position-relative;
20
+ padding-bottom: 100%;
21
+
22
+ & > * {
23
+ @extend .position-absolute;
24
+ @extend .top-0;
25
+ @extend .left-0;
26
+ @extend .h-100;
27
+ }
28
+ }
29
+
30
+ // Eventos del cursor
31
+ @each $event in (none, auto) {
32
+ .pointer-event-#{$event} {
33
+ pointer-events: $event;
34
+ }
35
+
36
+ @each $grid-breakpoint, $_ in $grid-breakpoints {
37
+ @include media-breakpoint-up($grid-breakpoint) {
38
+ .pointer-event-#{$grid-breakpoint}-#{$event} {
39
+ pointer-events: $event;
40
+ }
41
+ }
42
+ }
43
+ }
44
+
45
+ // Agrega una transición a cualquier modificación de atributos
46
+ .transition {
47
+ @include transition($transition-base);
48
+ }
49
+
50
+ // Ajustes de imagen y video con respecto al contenedor
51
+ @each $keyword in (contain, cover, fill, none, scale-down) {
52
+ .fit-#{$keyword} {
53
+ object-fit: #{$keyword};
54
+ }
55
+
56
+ @each $grid-breakpoint, $_ in $grid-breakpoints {
57
+ @include media-breakpoint-up($grid-breakpoint) {
58
+ .fit-#{$grid-breakpoint}-#{$keyword} {
59
+ object-fit: #{$keyword};
60
+ }
61
+ }
62
+ }
63
+ }
64
+
65
+ // Cursores
66
+ @each $cursor in (pointer none) {
67
+ .cursor-#{$cursor} {
68
+ cursor: $cursor;
69
+ }
70
+ }
71
+
72
+ // Overflow
73
+ @each $value in (auto, hidden, scroll) {
74
+ .overflow-#{$value} {
75
+ overflow: $value !important;
76
+ }
77
+
78
+ @each $axis in (y, x) {
79
+ .overflow-#{$axis}-#{$value} {
80
+ overflow-#{$axis}: $value !important;
81
+ }
82
+ }
83
+
84
+ @each $grid-breakpoint, $_ in $grid-breakpoints {
85
+ @include media-breakpoint-up($grid-breakpoint) {
86
+ .overflow-#{$grid-breakpoint}-#{$value} {
87
+ overflow: $value !important;
88
+ }
89
+
90
+ @each $axis in (y, x) {
91
+ .overflow-#{$grid-breakpoint}-#{$axis}-#{$value} {
92
+ overflow-#{$axis}: $value !important;
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+
99
+ @each $spacer, $length in $spacers {
100
+ // Poder aumentar o disminuir el alto de la tipografía
101
+ .f-#{$spacer} {
102
+ font-size: $length !important;
103
+ }
104
+
105
+ // Columnas de texto
106
+ .text-column-#{$spacer} {
107
+ column-count: $spacer;
108
+ }
109
+
110
+ // Limitar la cantidad de líneas de un bloque de texto
111
+ .line-clamp-#{$spacer} {
112
+ overflow: hidden;
113
+ display: -webkit-box;
114
+ -webkit-line-clamp: $spacer;
115
+ -webkit-box-orient: vertical;
116
+ }
117
+
118
+ // Ubicación absoluta, usar con position-*
119
+ @each $direction in (top, right, bottom, left) {
120
+ .#{$direction}-#{$spacer} {
121
+ #{$direction}: $length
122
+ }
123
+ }
124
+
125
+ @each $grid-breakpoint, $_ in $grid-breakpoints {
126
+ @include media-breakpoint-up($grid-breakpoint) {
127
+ // Poder aumentar o disminuir el alto de la tipografía
128
+ .f-#{$grid-breakpoint}-#{$spacer} {
129
+ font-size: $length !important;
130
+ }
131
+
132
+ // Columnas de texto
133
+ .text-column-#{$grid-breakpoint}-#{$spacer} {
134
+ column-count: $spacer;
135
+ }
136
+
137
+ // Limitar la cantidad de líneas de un bloque de texto
138
+ .line-clamp-#{$grid-breakpoint}-#{$spacer} {
139
+ overflow: hidden;
140
+ display: -webkit-box;
141
+ -webkit-line-clamp: $spacer;
142
+ -webkit-box-orient: vertical;
143
+ }
144
+
145
+ // Ubicación absoluta, usar con position-*
146
+ @each $direction in (top, right, bottom, left) {
147
+ .#{$direction}-#{$grid-breakpoint}-#{$spacer} {
148
+ #{$direction}: $length
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+
155
+ // anchos y altos
156
+ @each $prop, $abbrev in (width: w, height: h) {
157
+ @each $size, $length in $sizes {
158
+ .#{$abbrev}-#{$size} { #{$prop}: $length; }
159
+ .#{$abbrev}-#{$size} { #{$prop}: $length; }
160
+ .min-#{$abbrev}-#{$size} { min-#{$prop}: $length; }
161
+ .max-#{$abbrev}-#{$size} { max-#{$prop}: $length; }
162
+
163
+ @each $grid-breakpoint, $_ in $grid-breakpoints {
164
+ @include media-breakpoint-up($grid-breakpoint) {
165
+ .#{$abbrev}-#{$grid-breakpoint}-#{$size} { #{$prop}: $length; }
166
+ .min-#{$abbrev}-#{$grid-breakpoint}-#{$size} { min-#{$prop}: $length; }
167
+ .max-#{$abbrev}-#{$grid-breakpoint}-#{$size} { max-#{$prop}: $length; }
168
+ }
169
+ }
170
+ }
171
+ }
172
+
173
+ @each $scroll in (auto, smooth) {
174
+ .scroll-#{$scroll} {
175
+ scroll-behavior: #{$scroll};
176
+ }
177
+
178
+ @each $grid-breakpoint, $_ in $grid-breakpoints {
179
+ @include media-breakpoint-up($grid-breakpoint) {
180
+ .scroll-#{$grid-breakpoint}-#{$scroll} {
181
+ scroll-behavior: #{$scroll};
182
+ }
183
+ }
184
+ }
185
+ }
186
+
187
+ // Versiones responsive de utilidades Bootstrap
188
+ @each $grid-breakpoint, $_ in $grid-breakpoints {
189
+ @include media-breakpoint-up($grid-breakpoint) {
190
+ // Bordes
191
+ // node_modules/bootstrap/scss/utilities/_borders.scss
192
+ .border-#{$grid-breakpoint} { border: $border-width solid $border-color !important; }
193
+ .border-#{$grid-breakpoint}-top { border-top: $border-width solid $border-color !important; }
194
+ .border-#{$grid-breakpoint}-right { border-right: $border-width solid $border-color !important; }
195
+ .border-#{$grid-breakpoint}-bottom { border-bottom: $border-width solid $border-color !important; }
196
+ .border-#{$grid-breakpoint}-left { border-left: $border-width solid $border-color !important; }
197
+ .border-#{$grid-breakpoint}-0 { border: 0 !important; }
198
+ .border-#{$grid-breakpoint}-top-0 { border-top: 0 !important; }
199
+ .border-#{$grid-breakpoint}-right-0 { border-right: 0 !important; }
200
+ .border-#{$grid-breakpoint}-bottom-0 { border-bottom: 0 !important; }
201
+ .border-#{$grid-breakpoint}-left-0 { border-left: 0 !important; }
202
+
203
+ // Alineación
204
+ .text-#{$grid-breakpoint}-left { text-align: left !important; }
205
+ .text-#{$grid-breakpoint}-right { text-align: right !important; }
206
+ .text-#{$grid-breakpoint}-center { text-align: center !important; }
207
+
208
+ // Posicionamiento
209
+ @each $position in $positions {
210
+ .position-#{$grid-breakpoint}-#{$position} { position: $position !important; }
211
+ }
212
+
213
+ // Anchos y altos
214
+ @each $prop, $abbrev in (width: w, height: h) {
215
+ @each $size, $length in $sizes {
216
+ .#{$abbrev}-#{$grid-breakpoint}-#{$size} { #{$prop}: $length !important; }
217
+ .min-#{$abbrev}-#{$grid-breakpoint}-#{$size} { min-#{$prop}: $length !important; }
218
+ }
219
+ }
220
+ }
221
+ }
222
+
223
+ // Crea una propiedad con prefijos de navegador
7
224
  @mixin vendor-prefix($property, $definition...) {
8
225
  @each $prefix in $vendor-prefixes {
9
226
  #{$prefix}$property: $definition;
10
227
  }
11
228
  }
12
229
 
13
- /*
14
- * Crea clases para asignar colores según la lista de colores.
15
- */
16
- @each $color, $_ in $colors {
230
+ // Colores
231
+ @each $color, $rgb in $colors {
17
232
  .background-#{$color} {
18
233
  background-color: var(--#{$color});
234
+
235
+ &:focus {
236
+ background-color: var(--#{$color});
237
+ }
19
238
  }
20
239
 
240
+ @each $opacity, $degree in $opacities {
241
+ .background-#{$color}-t#{$opacity} {
242
+ background-color: scale-color($rgb, $alpha: $degree);
243
+ }
244
+ }
245
+
246
+ @each $attr in (stroke, fill) {
247
+ .#{$attr}-#{$color} {
248
+ svg {
249
+ * {
250
+ #{$attr}: var(--#{$color});
251
+ }
252
+ }
253
+ }
254
+ }
255
+
256
+ // Barras de scroll de colores
257
+ .scrollbar-#{$color} {
258
+ scrollbar-color: var(--#{$color}) transparent;
259
+ scrollbar-width: thin;
260
+
261
+ &::-webkit-scrollbar {
262
+ width: 5px;
263
+ height: 8px;
264
+ background-color: transparent;
265
+ }
266
+
267
+ &::-webkit-scrollbar-thumb {
268
+ background: var(--#{$color});
269
+ }
270
+ }
271
+
272
+ // Bordes
273
+ .border-#{$color} {
274
+ border-color: var(--#{$color}) !important;
275
+ }
276
+
277
+ // Cambiar el fondo al pasar por encima o hacer foco
278
+ .hover-bg-#{$color} {
279
+ &:hover,
280
+ &:focus-within {
281
+ background-color: var(--#{$color});
282
+ }
283
+ }
284
+
285
+ // Cambiar el color al pasar por encima o hacer foco
286
+ .hover-#{$color} {
287
+ &:hover,
288
+ &:focus-within {
289
+ color: var(--#{$color});
290
+ }
291
+ }
292
+
293
+ // Cambiar el color
21
294
  .#{$color} {
22
295
  color: var(--#{$color});
23
296
 
297
+ &:focus {
298
+ color: var(--#{$color});
299
+ }
300
+
301
+ // Invertir el color en la selección
24
302
  ::-moz-selection,
25
303
  ::selection {
26
304
  background: var(--#{$color});
27
305
  color: white;
28
306
  }
29
307
 
30
- svg {
31
- * {
32
- fill: var(--#{$color});
33
- }
34
- }
35
-
308
+ // Ajustes para Bootstrap
36
309
  .form-control {
37
310
  border-color: var(--#{$color});
38
- }
39
-
40
- .btn {
41
- background-color: var(--#{$color});
42
- color: white;
43
- border-color: var(--#{$color});
311
+ color: var(--#{$color});
44
312
  }
45
313
 
46
314
  hr {
47
315
  border-color: var(--#{$color});
48
316
  }
49
-
50
- a {
51
- color: var(--#{$color});
52
- }
53
317
  }
54
318
  }
data/_sass/menu.scss ADDED
@@ -0,0 +1,20 @@
1
+ .navbar {
2
+ &:focus-within {
3
+ .navbar-collapse {
4
+ @extend .d-block;
5
+ }
6
+ }
7
+
8
+ .dropdown {
9
+ .dropdown-menu {
10
+ @extend .d-none;
11
+ }
12
+
13
+ &:hover,
14
+ &:focus-within {
15
+ .dropdown-menu {
16
+ @extend .d-block;
17
+ }
18
+ }
19
+ }
20
+ }
data/_sass/snap.scss ADDED
@@ -0,0 +1,58 @@
1
+ $snap-types: (none, mandatory, proximity);
2
+ $snap-directions: (y, x);
3
+ $snap-points: (start, end, center, none);
4
+
5
+ // TODO: Escribir un mixin
6
+ @each $snap-type in $snap-types {
7
+ @each $snap-direction in $snap-directions {
8
+ // El contenedor indica la dirección y obligatoriedad del snap
9
+ .snap-#{$snap-type}-#{$snap-direction} {
10
+ scroll-snap-points-#{$snap-direction}: repeat(100%);
11
+ scroll-snap-destination: 0 0;
12
+ @each $prefix in $vendor-prefixes {
13
+ #{$prefix}scroll-snap-type: #{$snap-direction} #{$snap-type};
14
+ #{$prefix}scroll-snap-type: #{$snap-type};
15
+ }
16
+
17
+ // Lxs hijxs directos se alinean al contenedor
18
+ @each $snap-point in $snap-points {
19
+ & > .snap-#{$snap-point} {
20
+ scroll-snap-align: #{$snap-point};
21
+ }
22
+ }
23
+
24
+ // Poder modificar el snap según el punto de corte
25
+ @each $grid-breakpoint, $_ in $grid-breakpoints {
26
+ @include media-breakpoint-up($grid-breakpoint) {
27
+ @each $snap-point in $snap-points {
28
+ & > .snap-#{$grid-breakpoint}-#{$snap-point} {
29
+ scroll-snap-align: #{$snap-point};
30
+ }
31
+ }
32
+ }
33
+ }
34
+ }
35
+
36
+ @each $grid-breakpoint, $_ in $grid-breakpoints {
37
+ @include media-breakpoint-up($grid-breakpoint) {
38
+ .snap-#{$snap-type}-#{$grid-breakpoint}-#{$snap-direction} {
39
+ // XXX: Esto está duplicado porque SCSS no nos deja extender
40
+ // dentro de un @include.
41
+ // @extend .snap-#{$snap-type}-#{$snap-direction};
42
+ scroll-snap-points-#{$snap-direction}: repeat(100%);
43
+ scroll-snap-destination: 0 0;
44
+ @each $prefix in $vendor-prefixes {
45
+ #{$prefix}scroll-snap-type: #{$snap-direction} #{$snap-type};
46
+ #{$prefix}scroll-snap-type: #{$snap-type};
47
+ }
48
+
49
+ @each $snap-point in $snap-points {
50
+ .snap-#{$snap-point} {
51
+ scroll-snap-align: #{$snap-point};
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }