Smush Image Compression and Optimization - Version 2.2

Version Description

  • New: Option to resmush image if settings are changed after optimising images
  • New: Added an option to preserve EXIF
  • New: Remove Smush meta on image regeneration, This allows user to manually smush them later, if auto smush is off ( WP Image Editor support )
  • New: Manual Image restore option for Media Library and NextGen Gallery, if "Backup Original Images" was kept on while smushing ( Pro Only )
  • New: Delete Backup Files (Pro Only) on attachment deletion
  • Updated: Upfront Integration
  • Fixed: jQuery tooltip conflict
  • Code Optimisation, Updated Settings page UI
Download this release

Release Info

Developer UmeshSingla
Plugin Icon 128x128 Smush Image Compression and Optimization
Version 2.2
Comparing to
See all releases

Code changes from version 2.1.5 to 2.2

Files changed (39) hide show
  1. assets/css/wp-smushit-admin.css +933 -427
  2. assets/images/bulk-smush.png +0 -0
  3. assets/images/dev-team.png +0 -0
  4. assets/images/hummingbird.png +0 -0
  5. assets/images/icon-gzip.svg +1 -0
  6. assets/images/install-welcome.png +0 -0
  7. assets/images/smush-upload-images.png +0 -0
  8. assets/images/welcome-notice.png +0 -0
  9. assets/js/wp-smushit-admin.js +872 -412
  10. assets/shared-ui/font/WPMU DEV Dashboard.json +1396 -0
  11. assets/shared-ui/font/WPMU-DEV-App-Icons.eot +0 -0
  12. assets/shared-ui/font/WPMU-DEV-App-Icons.svg +70 -0
  13. assets/shared-ui/font/WPMU-DEV-App-Icons.ttf +0 -0
  14. assets/shared-ui/font/WPMU-DEV-App-Icons.woff +0 -0
  15. assets/shared-ui/font/fontawesome-webfont.eot +0 -0
  16. assets/shared-ui/font/fontawesome-webfont.svg +255 -0
  17. assets/shared-ui/font/fontawesome-webfont.svgz +0 -0
  18. assets/shared-ui/font/fontawesome-webfont.ttf +0 -0
  19. assets/shared-ui/font/fontawesome-webfont.woff +0 -0
  20. assets/shared-ui/img/spin-grey.gif +0 -0
  21. assets/shared-ui/img/spin.gif +0 -0
  22. assets/shared-ui/notice.css +189 -0
  23. assets/shared-ui/notice.js +52 -0
  24. assets/shared-ui/plugin-ui.php +267 -0
  25. assets/shared-ui/wdev-ui.css +2499 -0
  26. assets/shared-ui/wdev-ui.js +1203 -0
  27. languages/wp-smushit.pot +346 -226
  28. lib/class-wp-smush-admin.php +1073 -706
  29. lib/class-wp-smush-bulk.php +36 -48
  30. lib/class-wp-smush-migrate.php +1 -1
  31. lib/class-wp-smush-nextgen.php +313 -77
  32. lib/class-wp-smush-ui.php +679 -0
  33. lib/class-wp-smush.php +709 -194
  34. lib/nextgen-integration/class-wp-smush-nextgen-admin.php +346 -168
  35. lib/nextgen-integration/class-wp-smush-nextgen-bulk.php +17 -2
  36. lib/nextgen-integration/class-wp-smush-nextgen-stats.php +109 -12
  37. readme.txt +13 -2
  38. uninstall.php +18 -1
  39. wp-smush.php +2 -2
assets/css/wp-smushit-admin.css CHANGED
@@ -1,13 +1,6 @@
1
  /*
2
  Smush button transformation
3
  */
4
- .button.wp-smushit-started {
5
- padding: 0 10px 1px 0;
6
- }
7
-
8
- .button.wp-smushit-started .floatingCirclesG {
9
- float: left;
10
- }
11
 
12
  .button.wp-smush-finished.disabled, .button.wp-smush-finished:disabled, .button.wp-smush-finished[disabled] {
13
  color: #fff !important;
@@ -17,307 +10,6 @@ Smush button transformation
17
  box-shadow: inset 0 1px 0 rgba(0, 207, 33, .5), 0 1px 0 rgba(0, 0, 0, .15) !important;
18
  }
19
 
20
- /*
21
- Loader
22
- */
23
- .wp-smushit-loader-wrap {
24
- display: none;
25
- }
26
-
27
- .floatingCirclesG {
28
- position: relative;
29
- width: 28px;
30
- height: 28px;
31
- -moz-transform: scale(0.6);
32
- -webkit-transform: scale(0.6);
33
- -ms-transform: scale(0.6);
34
- -o-transform: scale(0.6);
35
- transform: scale(0.6);
36
- }
37
-
38
- .f_circleG {
39
- position: absolute;
40
- background-color: #FFFFFF;
41
- height: 5px;
42
- width: 5px;
43
- -moz-border-radius: 3px;
44
- -moz-animation-name: f_fadeG;
45
- -moz-animation-duration: 0.8s;
46
- -moz-animation-iteration-count: infinite;
47
- -moz-animation-direction: linear;
48
- -webkit-border-radius: 3px;
49
- -webkit-animation-name: f_fadeG;
50
- -webkit-animation-duration: 0.8s;
51
- -webkit-animation-iteration-count: infinite;
52
- -webkit-animation-direction: linear;
53
- -ms-border-radius: 3px;
54
- -ms-animation-name: f_fadeG;
55
- -ms-animation-duration: 0.8s;
56
- -ms-animation-iteration-count: infinite;
57
- -ms-animation-direction: linear;
58
- -o-border-radius: 3px;
59
- -o-animation-name: f_fadeG;
60
- -o-animation-duration: 0.8s;
61
- -o-animation-iteration-count: infinite;
62
- -o-animation-direction: linear;
63
- border-radius: 3px;
64
- animation-name: f_fadeG;
65
- animation-duration: 0.8s;
66
- animation-iteration-count: infinite;
67
- animation-direction: linear;
68
- }
69
-
70
- #frotateG_01 {
71
- left: 0;
72
- top: 11px;
73
- -moz-animation-delay: 0.3s;
74
- -webkit-animation-delay: 0.3s;
75
- -ms-animation-delay: 0.3s;
76
- -o-animation-delay: 0.3s;
77
- animation-delay: 0.3s;
78
- }
79
-
80
- #frotateG_02 {
81
- left: 3px;
82
- top: 3px;
83
- -moz-animation-delay: 0.4s;
84
- -webkit-animation-delay: 0.4s;
85
- -ms-animation-delay: 0.4s;
86
- -o-animation-delay: 0.4s;
87
- animation-delay: 0.4s;
88
- }
89
-
90
- #frotateG_03 {
91
- left: 11px;
92
- top: 0;
93
- -moz-animation-delay: 0.5s;
94
- -webkit-animation-delay: 0.5s;
95
- -ms-animation-delay: 0.5s;
96
- -o-animation-delay: 0.5s;
97
- animation-delay: 0.5s;
98
- }
99
-
100
- #frotateG_04 {
101
- right: 3px;
102
- top: 3px;
103
- -moz-animation-delay: 0.6s;
104
- -webkit-animation-delay: 0.6s;
105
- -ms-animation-delay: 0.6s;
106
- -o-animation-delay: 0.6s;
107
- animation-delay: 0.6s;
108
- }
109
-
110
- #frotateG_05 {
111
- right: 0;
112
- top: 11px;
113
- -moz-animation-delay: 0.7s;
114
- -webkit-animation-delay: 0.7s;
115
- -ms-animation-delay: 0.7s;
116
- -o-animation-delay: 0.7s;
117
- animation-delay: 0.7s;
118
- }
119
-
120
- #frotateG_06 {
121
- right: 3px;
122
- bottom: 3px;
123
- -moz-animation-delay: 0.8s;
124
- -webkit-animation-delay: 0.8s;
125
- -ms-animation-delay: 0.8s;
126
- -o-animation-delay: 0.8s;
127
- animation-delay: 0.8s;
128
- }
129
-
130
- #frotateG_07 {
131
- left: 11px;
132
- bottom: 0;
133
- -moz-animation-delay: 0.9s;
134
- -webkit-animation-delay: 0.9s;
135
- -ms-animation-delay: 0.9s;
136
- -o-animation-delay: 0.9s;
137
- animation-delay: 0.9s;
138
- }
139
-
140
- #frotateG_08 {
141
- left: 3px;
142
- bottom: 3px;
143
- -moz-animation-delay: 1s;
144
- -webkit-animation-delay: 1s;
145
- -ms-animation-delay: 1s;
146
- -o-animation-delay: 1s;
147
- animation-delay: 1s;
148
- }
149
-
150
- @-moz-keyframes f_fadeG {
151
- 0% {
152
- background-color: #000000
153
- }
154
-
155
- 100% {
156
- background-color: #FFFFFF
157
- }
158
-
159
- }
160
-
161
- @-webkit-keyframes f_fadeG {
162
- 0% {
163
- background-color: #000000
164
- }
165
-
166
- 100% {
167
- background-color: #FFFFFF
168
- }
169
-
170
- }
171
-
172
- @-ms-keyframes f_fadeG {
173
- 0% {
174
- background-color: #000000
175
- }
176
-
177
- 100% {
178
- background-color: #FFFFFF
179
- }
180
-
181
- }
182
-
183
- @-o-keyframes f_fadeG {
184
- 0% {
185
- background-color: #000000
186
- }
187
-
188
- 100% {
189
- background-color: #FFFFFF
190
- }
191
-
192
- }
193
-
194
- @keyframes f_fadeG {
195
- 0% {
196
- background-color: #000000
197
- }
198
-
199
- 100% {
200
- background-color: #FFFFFF
201
- }
202
-
203
- }
204
-
205
- /*
206
- Progressbar ui
207
- */
208
- #progress-ui {
209
- width: 80%;
210
- margin-bottom: 20px;
211
- display: none;
212
- }
213
-
214
- #progress-ui #wp-smushit-progress-wrap {
215
- height: 16px;
216
- border: 1px solid #0074a2;
217
- border-radius: 7px;
218
- overflow: hidden;
219
- }
220
-
221
- #progress-ui #wp-smushit-progress-wrap .wp-smushit-progressbar {
222
- height: 16px;
223
- float: left;
224
- width: 100%;
225
- }
226
-
227
- #progress-ui #wp-smushit-progress-wrap .wp-smushit-progressbar div {
228
- height: 16px;
229
- }
230
-
231
- #progress-ui #wp-smushit-progress-wrap #wp-smushit-smush-progress div {
232
- border-radius: 5px 0 0 5px;
233
- background-color: #2ea2cc;
234
- }
235
-
236
- #progress-ui #wp-smushit-progress-wrap #wp-smushit-check-progress div {
237
- border-radius: 0 5px 5px 0;
238
- background-color: #0074a2;
239
- }
240
-
241
- #progress-ui p#check-status {
242
- display: none;
243
- }
244
-
245
- /*
246
- Progressbar ui
247
- */
248
- #progress-ui {
249
- display: block;
250
- width: 80%;
251
- margin-bottom: 20px;
252
- }
253
-
254
- #progress-ui #wp-smush-progress-wrap, #progress-ui #wp-smush-ss-progress-wrap {
255
- height: 20px;
256
- border: 1px solid #0074a2;
257
- border-radius: 10px;
258
- overflow: hidden;
259
- position: relative;
260
- }
261
-
262
- #progress-ui #wp-smush-ss-progress-wrap {
263
- /*background-color: #2ea2cc;*/
264
- }
265
-
266
- #progress-ui #wp-smush-progress-wrap .wp-smush-progressbar, #progress-ui #wp-smush-ss-progress-wrap .wp-smush-progressbar {
267
- height: 20px;
268
- position: absolute;
269
- width: 100%;
270
- }
271
-
272
- #progress-ui #wp-smush-progress-wrap .wp-smush-progressbar div, #progress-ui #wp-smush-ss-progress-wrap .wp-smush-progressbar div {
273
- height: 20px;
274
- border-radius: 10px;
275
- }
276
-
277
- #progress-ui #wp-smush-progress-wrap #wp-smush-fetched-progress div, #progress-ui #wp-smush-ss-progress-wrap #wp-smush-ss-progress div {
278
- background-color: #7ad03a;
279
- }
280
-
281
- #progress-ui #wp-smush-progress-wrap #wp-smush-sent-progress div {
282
- background-color: #2ea2cc;
283
- }
284
-
285
- div#wp-smush-progress-status {
286
- overflow: hidden;
287
- }
288
-
289
- #wp-smush-progress-status p {
290
- float: left;
291
- max-width: 100%;
292
- }
293
-
294
- div#wp-smush-progress-status p::before {
295
- content: "c";
296
- background-color: #7ad03a;
297
- color: #7ad03a;
298
- display: inline-block;
299
- width: 20px;
300
- margin-right: 10px;
301
- }
302
-
303
- div#wp-smush-progress-status p#sent-status::before {
304
- background-color: #2ea2cc;
305
- color: #2ea2cc;
306
- }
307
-
308
- p#wp-smush-compression {
309
- text-align: center;
310
- font-size: 1.1em;
311
- line-height: 20px;
312
- position: absolute;
313
- margin: 0;
314
- width: 100%;
315
- }
316
-
317
- p#wp-smush-compression span {
318
- font-weight: bold;
319
- }
320
-
321
  .media-lib-wp-smush-el {
322
  position: absolute;
323
  display: block;
@@ -344,81 +36,62 @@ p#wp-smush-compression span {
344
  display: block;
345
  }
346
 
 
 
 
 
347
  .column-smushit .wp-smush-loader {
348
  margin: 10px;
349
  float: left;
350
  }
351
 
352
- #wp-smush-send span.wp-smushing {
353
- display: inline-block;
354
- vertical-align: top;
355
  }
356
 
357
- #wp-smush-send .wp-smush-loader-wrap {
358
- display: inline-block;
359
  }
360
 
361
- button .wp-smush-loader-wrap {
362
  display: inline-block;
363
- float: left;
 
364
  }
365
 
366
- /** Settings Page **/
367
- #wp-smush-options-wrap {
368
- display: block;
369
- overflow: auto;
370
- margin: 0;
371
  }
372
 
373
- #wp-smush-options-wrap .wp-smush-setting-row {
374
- display: inline-block;
375
- float: left;
376
- margin: 5px 20px 5px 0;
377
- padding: 5px 5px 5px 0;
378
- min-width: 323px;
379
- }
380
- .wp-smushit-container-wrap {
381
- display: inline-block;
382
- max-width: 790px;
383
- padding: 0 10px 0 0;
384
  }
385
- .wp-smushit-container-wrap.smush-full-width {
386
- max-width: 100%;
 
 
387
  }
388
- .wp-smushit-features-wrap{
389
- display: inline-block;
390
- width: 270px;
391
- vertical-align: top;
 
392
  }
393
 
394
- /** Media Query for screen size smaller than 1275px **/
395
- @media screen and (max-width: 1275px) {
396
- .wp-smushit-features-wrap {
397
- display: block;
398
- width: 100%;
399
- }
400
- }
401
 
402
- .wp-smushit-features-inner{
403
- border: 0;
404
- padding: 1px 15px;
405
- position: relative;
406
- }
407
- /** Pro Version **/
408
- .wp-smush-pro-user.wp-smushit-features-inner {
409
- padding: 1px 20px 1px 10px;
410
  }
411
- .wp-smushit-features-inner .notice-dismiss {
412
- padding: 3px 1px 9px 9px;
413
- text-decoration: none;
414
- }
415
- /*Pro rows*/
416
- #wp-smush-options-wrap .wp-smush-pro-features .wp-smush-setting-row {
417
- margin: 5px 20px 5px 25px;
418
  }
419
 
420
- #wp-smush-options-wrap .wp-smush-pro-features .pro-note {
421
- margin: 0 0 0 25px;
422
  }
423
 
424
  .wp-smush-setting-row .dashicons-info.smush-original {
@@ -427,16 +100,21 @@ button .wp-smush-loader-wrap {
427
  color: gray;
428
  }
429
 
430
- .wp-smush-pro-features {
431
- border: 1px solid lightgray;
432
- display: inline-block;
433
- padding: 0 0 10px 0;
434
- margin: 10px 0 0;
435
- width: 85%;
 
436
  }
437
 
438
  input#wp-smush-save-settings {
439
- margin: 15px 0;
 
 
 
 
440
  }
441
 
442
  .media-lib-wp-smush-icon {
@@ -481,20 +159,6 @@ input#wp-smush-save-settings {
481
  content: "";
482
  }
483
 
484
- .wp-smush-pro-features legend {
485
- margin-left: 15px;
486
- padding: 0 10px;
487
- }
488
-
489
- .pro-note .dashicons-info {
490
- color: gray;
491
- margin: 0 5px 0 0;
492
- }
493
-
494
- .pro-note .find-out-link {
495
- margin: -5px 0 0 10px;
496
- }
497
-
498
  .wp-smush-setting-row.disabled label, .wp-smush-setting-row.disabled input {
499
  color: gray;
500
  cursor: default;
@@ -545,59 +209,47 @@ input#wp-smush-save-settings {
545
  line-height: 29px;
546
  }
547
 
548
- #post-body-content .wp-smush-send {
549
- margin: 4px 0 0;
550
- }
551
-
552
  #post-body-content .smush-status {
553
  margin: 4px 0;
554
  }
555
 
556
- .compat-field-wp_smush button {
557
  float: left;
 
558
  }
559
 
560
- .compat-field-wp_smush .smush-wrap {
561
- margin: 0;
562
- max-width: 100%;
563
- }
564
-
565
- /*===================================*\
566
- =======================================
567
- == ==
568
- == UPGRADE NOTES ==
569
- == ==
570
- =======================================
571
- \*===================================*/
572
- .pro-only {
573
- position: relative;
574
- margin: 3px 0;
575
- display: inline-block;
576
  }
577
 
578
- .pro-only .pro-note {
579
- opacity: 0;
580
- position: absolute;
581
- top: -3px;
582
- left: -3px;
583
- right: -3px;
584
- bottom: -3px;
585
- text-align: center;
586
- background: rgba(0, 0, 0, 0.6);
587
- color: #FFF;
588
- font-family: "Source Sans Pro", "Open Sans", sans-serif;
589
- font-weight: 100;
590
- font-size: 20px;
591
- z-index: 9999;
592
- transition: opacity .2s;
593
  }
594
 
595
- .pro-only .pro-note a {
596
- color: #7ed321;
 
 
 
 
 
 
597
  }
598
 
599
- .pro-only:hover .pro-note {
600
- opacity: 1;
 
 
601
  }
602
 
603
  .inactive {
@@ -613,10 +265,36 @@ input#wp-smush-save-settings {
613
  }
614
 
615
  .smush-stats-wrapper {
616
- border: 1px solid lightgray;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
617
  }
618
 
619
  table.wp-smush-stats-holder {
 
620
  border-collapse: collapse;
621
  width: 100%;
622
  }
@@ -625,10 +303,15 @@ table.wp-smush-stats-holder th {
625
  background-color: #E4E4E4;
626
  }
627
 
628
- table.wp-smush-stats-holder td, table.wp-smush-stats-holder th {
 
629
  border: 1px solid #CECECE;
630
  }
631
 
 
 
 
 
632
  table.wp-smush-stats-holder tr:first-child th {
633
  border-top: 0;
634
  }
@@ -657,6 +340,7 @@ table.wp-smush-stats-holder tr td:first-child {
657
 
658
  .smush-skipped .dashicons-editor-help {
659
  cursor: pointer;
 
660
  }
661
 
662
  /*NextGen Gallery stats*/
@@ -664,8 +348,19 @@ table.wp-smush-stats-holder tr td:first-child {
664
  table-layout: fixed;
665
  }
666
 
667
- #ngg-listimages table.wp-smush-stats-holder td {
668
- font-size: 12px;
 
 
 
 
 
 
 
 
 
 
 
669
  }
670
 
671
  /*Media Modal Styling*/
@@ -674,10 +369,821 @@ table.wp-smush-stats-holder tr td:first-child {
674
  }
675
 
676
  .compat-field-wp_smush .wp-smush-stats-holder td {
677
- padding: 8px 10px
 
678
  }
679
 
680
  /** Help Tip **/
681
  .ui-tooltip-content {
682
  font-size: 12px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
683
  }
1
  /*
2
  Smush button transformation
3
  */
 
 
 
 
 
 
 
4
 
5
  .button.wp-smush-finished.disabled, .button.wp-smush-finished:disabled, .button.wp-smush-finished[disabled] {
6
  color: #fff !important;
10
  box-shadow: inset 0 1px 0 rgba(0, 207, 33, .5), 0 1px 0 rgba(0, 0, 0, .15) !important;
11
  }
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  .media-lib-wp-smush-el {
14
  position: absolute;
15
  display: block;
36
  display: block;
37
  }
38
 
39
+ .column-smushit .wp-smush-action {
40
+ font-size: 11px;
41
+ }
42
+
43
  .column-smushit .wp-smush-loader {
44
  margin: 10px;
45
  float: left;
46
  }
47
 
48
+ /** Installation/Upgrade message **/
49
+ .wpmud.wp-smush-updated {
50
+ margin: 50px 20px 0 2px;
51
  }
52
 
53
+ .wp-smush-install-image > img, .wp-smush-image-wrap > img {
54
+ float: left;
55
  }
56
 
57
+ .wpmud .wp-smush-install-welcome {
58
  display: inline-block;
59
+ margin: 10px 0 30px 250px;
60
+ max-width: 68%;
61
  }
62
 
63
+ .wpmud .wp-smush-install-content {
64
+ margin-top: 24px;
 
 
 
65
  }
66
 
67
+ .wpmud .wp-smush-install-welcome .button {
68
+ margin-top: 18px;
 
 
 
 
 
 
 
 
 
69
  }
70
+
71
+ .wpmud .dev-box.wp-smush-install-thanks-box {
72
+ margin-bottom: 20px;
73
+ padding-bottom: 0;
74
  }
75
+ #wp-smush-install-thanks .row {
76
+ background-image: url(../images/install-welcome.png);
77
+ background-repeat: no-repeat;
78
+ background-position: 30px bottom;
79
+ min-height: 206px;
80
  }
81
 
82
+ /** Settings Page **/
 
 
 
 
 
 
83
 
84
+ .wp-smush-setting-row {
85
+ margin: 15px 20px 15px 0;
 
 
 
 
 
 
86
  }
87
+
88
+ .wpmud .wp-smushit-container-wrap {
89
+ display: inline-block;
90
+ margin-top: 30px;
 
 
 
91
  }
92
 
93
+ .wp-smush-pro.smush-settings-wrapper {
94
+ width: 100%;
95
  }
96
 
97
  .wp-smush-setting-row .dashicons-info.smush-original {
100
  color: gray;
101
  }
102
 
103
+ .wpmud .wp-smush-submit-wrap {
104
+ padding-top: 0;
105
+ }
106
+
107
+ .wp-smush-submit-wrap .spinner {
108
+ float: none;
109
+ margin: 1.5em 1em 0;
110
  }
111
 
112
  input#wp-smush-save-settings {
113
+ margin: 10px 0 5px;
114
+ }
115
+
116
+ .wp-smush-welcome #wp-smush-save-settings {
117
+ float: right;
118
  }
119
 
120
  .media-lib-wp-smush-icon {
159
  content: "";
160
  }
161
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
  .wp-smush-setting-row.disabled label, .wp-smush-setting-row.disabled input {
163
  color: gray;
164
  cursor: default;
209
  line-height: 29px;
210
  }
211
 
 
 
 
 
212
  #post-body-content .smush-status {
213
  margin: 4px 0;
214
  }
215
 
216
+ .compat-field-wp_smush button.wp-smush-send {
217
  float: left;
218
+ margin-bottom: 5px;
219
  }
220
 
221
+ /** If we have button-primary class, this style will be loaded already **/
222
+ .compat-field-wp_smush button:not(.button-primary) {
223
+ background: #0085ba;
224
+ border-color: #0073aa #006799 #006799;
225
+ -webkit-box-shadow: 0 1px 0 #006799;
226
+ box-shadow: 0 1px 0 #006799;
227
+ color: #fff;
228
+ text-decoration: none;
229
+ text-shadow: 0 -1px 1px #006799, 1px 0 1px #006799, 0 1px 1px #006799, -1px 0 1px #006799;
230
+ margin-bottom: 10px;
 
 
 
 
 
 
231
  }
232
 
233
+ .compat-field-wp_smush button:not( .button-primary ):hover {
234
+ background: #008ec2;
235
+ border-color: #006799;
236
+ color: #fff;
 
 
 
 
 
 
 
 
 
 
 
237
  }
238
 
239
+ .compat-field-wp_smush button:disabled:not( .button-primary ) {
240
+ color: #66c6e4 !important;
241
+ background: #008ec2 !important;
242
+ border-color: #007cb2 !important;
243
+ -webkit-box-shadow: none !important;
244
+ box-shadow: none !important;
245
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1) !important;
246
+ cursor: default;
247
  }
248
 
249
+ .compat-field-wp_smush .smush-wrap {
250
+ margin: 0 0 5px 0;
251
+ max-width: 100%;
252
+ overflow: hidden;
253
  }
254
 
255
  .inactive {
265
  }
266
 
267
  .smush-stats-wrapper {
268
+ font-size: 12px;
269
+ }
270
+
271
+ .smush-stats-wrapper .row {
272
+ padding: 8px 0;
273
+ }
274
+
275
+ .smush-stats-wrapper .row:first-child {
276
+ padding-top: 0;
277
+ }
278
+
279
+ .smush-stats-wrapper .row:last-child {
280
+ padding-bottom: 0;
281
+ }
282
+
283
+ .wpmud .wp-smushit-container-right .smush-stats-wrapper .wp-smush-container-header {
284
+ margin-bottom: 20px;
285
+ }
286
+
287
+ .smush-stats-wrapper td, .smush-stats-wrapper th {
288
+ font-size: 11px;
289
+ }
290
+
291
+ .smush-stats-wrapper .smush-container-subheading .spinner {
292
+ float: left;
293
+ margin: 7px 8px 0;
294
  }
295
 
296
  table.wp-smush-stats-holder {
297
+ border: 1px solid lightgray;
298
  border-collapse: collapse;
299
  width: 100%;
300
  }
303
  background-color: #E4E4E4;
304
  }
305
 
306
+ table.wp-smush-stats-holder td, table.wp-smush-stats-holder th,
307
+ #ngg-listimages table.wp-smush-stats-holder td, #ngg-listimages table.wp-smush-stats-holder th {
308
  border: 1px solid #CECECE;
309
  }
310
 
311
+ #ngg-listimages .column-7 {
312
+ width: 300px;
313
+ }
314
+
315
  table.wp-smush-stats-holder tr:first-child th {
316
  border-top: 0;
317
  }
340
 
341
  .smush-skipped .dashicons-editor-help {
342
  cursor: pointer;
343
+ margin-top: -2px;
344
  }
345
 
346
  /*NextGen Gallery stats*/
348
  table-layout: fixed;
349
  }
350
 
351
+ /** NextGen Gallery tr height, to show the progress bar properly for alternate rows **/
352
+ .alternate.iedit {
353
+ height: 120px;
354
+ }
355
+
356
+ /** Allows to click on button, otherwise row-actions from NextGen interferes **/
357
+ .wp-smush-nextgen-send {
358
+ position: relative;
359
+ z-index: 2;
360
+ }
361
+
362
+ .iedit .wp-smush-action, .iedit .smush-stats-details {
363
+ font-size: 11px;
364
  }
365
 
366
  /*Media Modal Styling*/
369
  }
370
 
371
  .compat-field-wp_smush .wp-smush-stats-holder td {
372
+ padding: 8px 10px;
373
+ word-wrap: break-word;
374
  }
375
 
376
  /** Help Tip **/
377
  .ui-tooltip-content {
378
  font-size: 12px;
379
+ }
380
+
381
+ /** Progress Bar **/
382
+ .wp-smush-progress {
383
+ width: 150px;
384
+ height: 20px;
385
+ background-color: #14485F;
386
+ -webkit-border-radius: 2px;
387
+ -moz-border-radius: 2px;
388
+ border-radius: 2px;
389
+ padding: 2px;
390
+ box-sizing: border-box;
391
+ text-align: left;
392
+ clear: left;
393
+ margin-top: 10px;
394
+ }
395
+
396
+ .wp-smush-progress span {
397
+ color: #14485F;
398
+ text-align: right;
399
+ font-size: 12px;
400
+ font-weight: bolder;
401
+ line-height: 15px;
402
+ box-sizing: border-box;
403
+ padding-right: 22px;
404
+ display: inline-block;
405
+ height: 100%;
406
+ width: 100%;
407
+ border-radius: 1px;
408
+ transition: width .4s ease-in-out;
409
+ background-color: #FECF2F;
410
+ background-size: 12px 10px;
411
+ background-image: linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%,
412
+ transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%,
413
+ transparent 75%, transparent);
414
+ vertical-align: top;
415
+
416
+ }
417
+
418
+ .wp-smush-progress.animate span {
419
+ animation: animate-stripes 3s linear infinite;
420
+ }
421
+
422
+ @keyframes animate-stripes {
423
+ 0% {
424
+ background-position: 0 0;
425
+ }
426
+ 100% {
427
+ background-position: 60px 0;
428
+ }
429
+ }
430
+
431
+ /** Disabled Hyperlinks **/
432
+ .smush-stats a[disabled] {
433
+ cursor: default;
434
+ color: grey;
435
+ }
436
+
437
+ .wp-smush-error {
438
+ color: #ffb900;
439
+ }
440
+
441
+ .resmush-scan {
442
+ vertical-align: middle;
443
+ line-height: 28px;
444
+ }
445
+
446
+ /** Resmush Button **/
447
+
448
+ #wp-smush-resmush {
449
+ margin: 20px 0;
450
+ }
451
+
452
+ .wp-resmush-wrapper.notice {
453
+ padding: 5px;
454
+ max-width: 400px;
455
+ }
456
+
457
+ /** Bulk Smush Page UI - New UI Changes **/
458
+ /** Font-Families **/
459
+ .wpmud .roboto-regular {
460
+ font-family: 'Roboto', sans-serif;
461
+ font-weight: 400;
462
+ }
463
+
464
+ .wpmud .roboto-medium {
465
+ font-family: 'Roboto', sans-serif;
466
+ font-weight: 500;
467
+ }
468
+
469
+ .wpmud .roboto-condensed-regular {
470
+ font-family: 'Roboto Condensed', sans-serif;
471
+ }
472
+
473
+ .wpmud .roboto-condensed-bold {
474
+ font-family: 'Roboto Condensed', sans-serif;
475
+ font-weight: 700;
476
+ }
477
+
478
+ /** End of Font Family Variations **/
479
+
480
+ .wpmud .wp-smush-page-heading {
481
+ float: left;
482
+ font-size: 30px;
483
+ font-weight: normal;
484
+ }
485
+
486
+ .wp-smush-auto-message {
487
+ float: right;
488
+ font-size: 15px;
489
+ line-height: 1.7;
490
+ margin: 1.4em auto;
491
+ }
492
+
493
+ .wp-smush-auto-disabled {
494
+ color: #fd6265;
495
+ }
496
+
497
+ .wp-smush-auto-enabled {
498
+ color: #2cb996;
499
+ }
500
+
501
+ .wp-smush-page-header {
502
+ overflow: hidden;
503
+ padding: 10px 0 0;
504
+ margin: 0 0 20px;
505
+ }
506
+
507
+ .wpmud .wp-smush-welcome.wp-smush-container {
508
+ background-image: url(../images/welcome-notice.png);
509
+ background-repeat: no-repeat;
510
+ background-position: 30px bottom;
511
+ padding-bottom: 0;
512
+ }
513
+ .wpmud .wp-smush-welcome.wp-smush-container .box-content {
514
+ min-height: 149px;
515
+ }
516
+
517
+ .wpmud .dev-box .box-title h3 {
518
+ display: inline-block;
519
+ }
520
+
521
+ .smush-container-subheading {
522
+ display: inline-block;
523
+ float: right;
524
+ margin: 1.5em auto;
525
+ max-width: 60%;
526
+ }
527
+
528
+ .wp-smush-premium .smush-container-subheading {
529
+ border: solid 1px #ff6d6d;
530
+ border-radius: 4px;
531
+ float: none;
532
+ font-size: 12px;
533
+ line-height: 1.4;
534
+ margin: 1.3em 10px;
535
+ padding: 5px 8px;
536
+ vertical-align: top;
537
+ }
538
+
539
+ .wpmud .wp-smush-premium .smush-container-subheading a {
540
+ color: #ff6d6d;
541
+ }
542
+
543
+ .smush-stats-wrapper .smush-container-subheading {
544
+ margin: 1em 0;
545
+ max-width: 90%;
546
+ }
547
+
548
+ .wpmud .row .col-two-third.wp-smushit-container-left {
549
+ padding-left: 0;
550
+ width: 62%;
551
+ }
552
+
553
+ .wp-smush-premium .box-content {
554
+ opacity: 0.5;
555
+ pointer-events: none;
556
+ }
557
+
558
+ .smush-dismiss-welcome {
559
+ margin: 1.4em 0;
560
+ }
561
+
562
+ .wpmud .smush-dismiss-welcome a {
563
+ color: #9b9b9b;
564
+ }
565
+
566
+ .wpmud .wp-smush-welcome-content {
567
+ padding-bottom: 20px;
568
+ display: inline-block;
569
+ overflow: hidden;
570
+ max-width: 68%;
571
+ margin: 0 30px 0px 200px;
572
+ }
573
+
574
+ .wpmud .wp-smush-welcome-content .wp-smush-premium {
575
+ box-shadow: none;
576
+ margin-top: 30px;
577
+ padding: 0
578
+ }
579
+
580
+ .wpmud .wp-smush-welcome-content .wp-smush-premium .wp-smush-container-header {
581
+ margin: 0;
582
+ padding: 0
583
+ }
584
+
585
+ .wpmud .wp-smush-welcome-content h4 {
586
+ font-size: 30px;
587
+ text-align: left;
588
+ }
589
+
590
+ .wpmud .wp-smush-welcome-message {
591
+ line-height: 1.7;
592
+ margin-top: 20px;
593
+ margin-bottom: 30px;
594
+ }
595
+
596
+ .wp-smush-welcome-image {
597
+ display: inline-block;
598
+ float: left;
599
+ overflow: hidden;
600
+ }
601
+
602
+ /** Bulk Smush **/
603
+ /** No Images **/
604
+ .wp-smush-no-image {
605
+ display: block;
606
+ overflow: hidden;
607
+ }
608
+
609
+ .wpmud .wp-smush-no-images-content {
610
+ color: #514a30;
611
+ margin-top: 20px;
612
+ padding: 20px 10px;
613
+ }
614
+
615
+ .wp-smush-upload-images {
616
+ display: block;
617
+ overflow: hidden;
618
+ padding: 10px 0;
619
+ }
620
+
621
+ /** Ongoing Bulk Smush **/
622
+ .wpmud .wp-smush-bulk-active {
623
+ margin-bottom: 24px;
624
+ }
625
+
626
+ .wp-smush-bulk-active .spinner {
627
+ float: left;
628
+ margin-top: 0;
629
+ }
630
+
631
+ /** All Smushed **/
632
+ .wp-smush-notice {
633
+ background-color: #1abc9c;
634
+ border-radius: 5px;
635
+ color: white;
636
+ font-family: 'Roboto', sans-serif;
637
+ font-size: 15px;
638
+ margin-bottom: 20px;
639
+ padding: 20px 40px;
640
+ }
641
+
642
+ .wp-smush-resmush-message, .wp-smush-settings-updated {
643
+ border: none;
644
+ margin-bottom: 25px;
645
+ padding: 18px 50px;
646
+ text-align: center;
647
+ }
648
+
649
+ .wpmud a.wp-smush-trigger-bulk, .wpmud a.wp-smush-trigger-bulk:hover,
650
+ .wpmud a.wp-smush-trigger-bulk:focus, .wpmud a.wp-smush-trigger-bulk:active {
651
+ color: white;
652
+ text-decoration: underline;
653
+ }
654
+
655
+ .wp-smush-resmush-message .dev-icon, .wp-smush-settings-updated .dev-icon {
656
+ font-size: 16px;
657
+ }
658
+
659
+ .wp-smush-resmush-message .dev-icon-cross, .wp-smush-settings-updated .dev-icon-cross {
660
+ cursor: pointer;
661
+ float: right;
662
+ }
663
+
664
+ .wp-smush-notice .dev-icon-tick:before {
665
+ line-height: 1.1;
666
+ vertical-align: bottom;
667
+ }
668
+
669
+ .wp-smush-all-done .dev-icon-tick {
670
+ display: inline-block;
671
+ font-size: 16px;
672
+ margin-right: 10px;
673
+ vertical-align: bottom;
674
+ }
675
+
676
+ /** Image Remaining **/
677
+ .wp-smush-remaining {
678
+ background-color: #fee696;
679
+ color: #514a30;
680
+ line-height: 1.7;
681
+ }
682
+
683
+ .wp-smush-resmush-wrap .wp-smush-remaining {
684
+ padding: 10px 50px;
685
+ }
686
+
687
+ .wp-smush-remaining .dev-icon img {
688
+ position: relative;
689
+ top: 6px;
690
+ width: 14px;
691
+ }
692
+
693
+ .wpmud .dev-box.bulk-smush-wrapper:not(.wp-smush-pro-install) {
694
+ padding-bottom: 0;
695
+ }
696
+
697
+ .wpmud .bulk-smush-wrapper .dev-icon {
698
+ margin-right: 10px;
699
+ vertical-align: top;
700
+ }
701
+
702
+ .wpmud .bulk-smush-wrapper .dev-icon img {
703
+ vertical-align: top;
704
+ }
705
+
706
+ .bulk-smush-wrapper .wp-smush-notice-text {
707
+ display: inline-block;
708
+ max-width: 90%;
709
+ }
710
+
711
+ .bulk-smush-wrapper .wp-smush-all {
712
+ margin: 20px 0;
713
+ }
714
+
715
+ .bulk-smush-wrapper .wp-smush-remaining .wp-smush-skip-resmush {
716
+ display: block;
717
+ margin-left: 27px;
718
+ margin-top: 10px;
719
+ }
720
+
721
+ .wp-smush-pro-trial {
722
+ color: #9b9b9b;
723
+ }
724
+
725
+ /** Bulk Smush - Progress Bar **/
726
+ .wp-smush-progress-wrap {
727
+ border-radius: 5px;
728
+ background-color: #fafafa;
729
+ padding: 30px;
730
+ }
731
+
732
+ .wp-smush-progress-bar-wrap {
733
+ border-radius: 5px;
734
+ -moz-border-radius: 5px;
735
+ -webkit-border-radius: 5px;
736
+ box-sizing: border-box;
737
+ -moz-box-sizing: border-box;
738
+ -webkit-box-sizing: border-box;
739
+ background: #14485F;
740
+ padding: 5px;
741
+ width: 100%;
742
+ }
743
+
744
+ .wp-smush-progress-bar {
745
+ overflow: hidden;
746
+ animation: progress 10s;
747
+ -ms-animation: progress 10s;
748
+ -moz-animation: progress 10s;
749
+ -webkit-animation: progress 10s;
750
+ }
751
+
752
+ .wp-smush-progress-inner {
753
+ width: 100%;
754
+ height: 40px;
755
+ border-radius: 4px;
756
+ -moz-border-radius: 4px;
757
+ -webkit-border-radius: 4px;
758
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.75);
759
+ -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.75);
760
+ -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.75);
761
+ background: repeating-linear-gradient(-45deg, #FECF2F, #FECF2F 10px, #FEE696 10px, #FEE696 24px);
762
+ background-size: 68px 68px;
763
+ animation: movement 1s infinite linear;
764
+ -ms-animation: movement 1s infinite linear;
765
+ -moz-animation: movement 1s infinite linear;
766
+ -webkit-animation: movement 1s infinite linear;
767
+ transition: width 1s;
768
+ -webkit-transition: width 1s;
769
+ -moz-transition: width 1s;
770
+ -ms-transition: width 1s;
771
+ overflow: hidden;
772
+ }
773
+
774
+ @keyframes movement {
775
+ from {
776
+ background-position: 0 0;
777
+ }
778
+ to {
779
+ background-position: 24px 40px;
780
+ }
781
+ }
782
+
783
+ .wp-smush-count {
784
+ color: #8b8b8b;
785
+ font-size: 11px;
786
+ line-height: 1.5;
787
+ margin-top: 15px;
788
+ }
789
+
790
+ .wp-smush-sep {
791
+ margin: 20px 0;
792
+ }
793
+
794
+ .wp-smush-progress-count {
795
+ color: #14485F;
796
+ font-weight: bold;
797
+ font-size: 14px;
798
+ margin: 11px auto;
799
+ text-align: center;
800
+ }
801
+
802
+ .smush-final-log {
803
+ padding: 10px;
804
+ }
805
+
806
+ .wp-smush-ajax-error {
807
+ color: black;
808
+ font-size: 14px;
809
+ font-weight: bold;
810
+ margin-bottom: 20px;
811
+ }
812
+
813
+ .wpmud .wp-smush-enable-lossy {
814
+ color: #adadad;
815
+ font-size: 13px;
816
+ }
817
+
818
+ /** Settings Styling **/
819
+ .wpmud .wp-smush-setting-row label.inline-label {
820
+ color: #555555;
821
+ font-size: 15px;
822
+ font-family: "Roboto", sans-serif;
823
+ width: 85%;
824
+ }
825
+
826
+ small.smush-setting-description {
827
+ margin-top: 10px;
828
+ display: block;
829
+ }
830
+
831
+ /** Stats Container **/
832
+ .wpmud .smush-stats-wrapper {
833
+ color: #777771;
834
+ font-size: 15px;
835
+ font-family: 'Roboto Condensed', sans-serif;
836
+ font-weight: 700;
837
+ }
838
+
839
+ .wp-smush-lossy-disabled {
840
+ color: #adadad;
841
+ background: #fafafa;
842
+ border-radius: 3px;
843
+ font-size: 11px;
844
+ padding: 10px;
845
+ }
846
+
847
+ .wp-smush-lossy-enable {
848
+ background: #00ACCA;
849
+ border-radius: 3px;
850
+ color: #FFF;
851
+ cursor: pointer;
852
+ font: 500 11px/20px 'Roboto';
853
+ padding: 10px;
854
+ }
855
+
856
+ .wp-smush-lossy-enable:hover, .wp-smush-lossy-enable:active, .wp-smush-lossy-enable:focus {
857
+ background-color: #0093B1;
858
+ color: #FFF;
859
+ box-shadow: none;
860
+ }
861
+
862
+ .wpmud .wp-smush-stats, .wp-smush-stats-wrap {
863
+ color: #555555;
864
+ font-family: 'Roboto Condensed', sans-serif;
865
+ font-size: 25px;
866
+ line-height: 1;
867
+ padding: 5px 0;
868
+ }
869
+
870
+ .wpmud .row .col-third.wp-smushit-container-right {
871
+ padding-right: 0;
872
+ width: 38%;
873
+ }
874
+
875
+ .wpmud .wp-smush-stats-label {
876
+ padding-top: 7px;
877
+ }
878
+
879
+ /** For Smush Pro Promo and Humming Bird promo **/
880
+ .wpmud .wp-smushit-container-right .wp-smush-pro-adv {
881
+ overflow: hidden;
882
+ padding: 30px 0 0;
883
+ }
884
+
885
+ .wpmud .dev-box.wp-smush-pro-adv .wp-smush-container-header {
886
+ margin: -30px 0 30px;
887
+ }
888
+
889
+ .wpmud .wp-smush-pro-adv .box-content {
890
+ padding: 0 30px;
891
+ }
892
+
893
+ .wp-smushit-container-right .wp-smush-pro-adv > img {
894
+ max-width: 100%;
895
+ margin: 0 auto;
896
+ display: block;
897
+ }
898
+
899
+ .wp-smush-pro-cta, .wp-smush-hb-cta {
900
+ overflow: hidden;
901
+ display: block;
902
+ padding: 20px;
903
+ }
904
+
905
+ .wp-smush-hb-cta {
906
+ padding-bottom: 0;
907
+ padding-top: 30px;
908
+ width: 100%;
909
+ }
910
+
911
+ .wp-smush-hummingbird-image {
912
+ display: block;
913
+ margin: 40px 0 20px 0;
914
+ overflow: hidden;
915
+ }
916
+
917
+ .wpmud .wp-smush-promo-content {
918
+ color: #555555;
919
+ line-height: 1.7;
920
+ margin: auto;
921
+ max-width: 320px;
922
+ text-align: center;
923
+ }
924
+
925
+ .wpmud .wp-smush-promo-content-2 {
926
+ margin-top: 30px;
927
+ }
928
+
929
+ .wpmud .wp-smush-hb-cta .button.button-cta {
930
+ background-color: #ffe900;
931
+ box-shadow: inset 0 -3px 0 0 #f0db00;
932
+ color: #4e4b10;
933
+ width: 100%;
934
+ }
935
+
936
+ .wpmud .box-content .wp-smush-hb-cta .button.button-cta.button-yellow:hover,
937
+ .wpmud .box-content .wp-smush-hb-cta .button.button-cta.button-yellow:active,
938
+ .wpmud .box-content .wp-smush-hb-cta .button.button-cta.button-yellow:focus {
939
+ box-shadow: none;
940
+ color: #4e4b10;
941
+ }
942
+
943
+ /** Re Smush **/
944
+ .wp-smush-settings-changed {
945
+ background: #dff6fa;
946
+ border-radius: 5px;
947
+ font-size: 13px;
948
+ line-height: 1.7;
949
+ padding: 20px;
950
+ }
951
+
952
+ .wp-scan-progress-text {
953
+ color: #14485F;
954
+ display: block;
955
+ text-align: center;
956
+ padding: 10px;
957
+ font-size: 14px;
958
+ font-weight: bold;
959
+ }
960
+
961
+ @media screen and (max-width: 1024px) and ( min-width: 800px ) {
962
+ .wpmud .wrap .dev-box:not(.wp-smush-pro-adv) {
963
+ padding: 20px;
964
+ }
965
+
966
+ .wpmud .dev-box.wp-smush-pro-adv .box-title, .wpmud .wp-smush-pro-adv .box-content {
967
+ padding: 0 20px;
968
+ }
969
+
970
+ /** Stats Section **/
971
+ .wpmud .smush-stats-wrapper {
972
+ font-size: 12px;
973
+ }
974
+
975
+ .smush-stats-wrapper h3 {
976
+ padding: 6px 0;
977
+ }
978
+
979
+ .smush-stats-wrapper .smush-container-subheading {
980
+ margin-top: 20px;
981
+ }
982
+
983
+ .wpmud .wp-smush-stats, .wp-smush-stats-wrap {
984
+ font-size: 20px;
985
+ }
986
+
987
+ /** Sub Heading **/
988
+ .wpmud .smush-container-subheading {
989
+ font-size: 12px;
990
+ }
991
+ }
992
+
993
+ /** Media Queries for resolution between 782px - 1024px **/
994
+ @media screen and (max-width: 1024px) {
995
+ /** Configure screen **/
996
+ .wpmud .row .wp-smush-lady.col-third {
997
+ display: none;
998
+ }
999
+
1000
+ /** Media Library Stats **/
1001
+ .wp-list-table .smushit .wp-smush-stats-holder tr th {
1002
+ display: inline-block;
1003
+ width: 50%;
1004
+ box-sizing: border-box;
1005
+ }
1006
+
1007
+ .wp-list-table .smushit .wp-smush-stats-holder tr td:first-child {
1008
+ border-right: none;
1009
+ box-sizing: border-box;
1010
+ display: inline-block !important;
1011
+ width: 50% !important;
1012
+ }
1013
+
1014
+ .wp-list-table .smushit .wp-smush-stats-holder tr td:last-child {
1015
+ box-sizing: border-box;
1016
+ display: inline-block !important;
1017
+ float: none;
1018
+ width: 50% !important;
1019
+ }
1020
+
1021
+ .wpmud .wp-smush-promo-content, .wpmud .wp-smush-promo-content-smaller {
1022
+ max-width: none;
1023
+ }
1024
+ }
1025
+
1026
+ /** Media Queries for resolution below 782px **/
1027
+ @media only screen and (max-width: 800px) {
1028
+ .wpmud .wp-smushit-container-wrap .col-two-third.wp-smushit-container-left, .wpmud .wp-smushit-container-wrap .col-third.wp-smushit-container-right {
1029
+ padding: 0;
1030
+ width: 100%;
1031
+ }
1032
+ .wpmud .wp-smush-welcome-content {
1033
+ margin: 0 30px 0px 160px;
1034
+ }
1035
+ .dev-box.bulk-smush-wrapper.wp-smush-container {
1036
+ padding: 20px 10px;
1037
+ }
1038
+ .wpmud .wp-smush-super-smush-content {
1039
+ font-size: 11px;
1040
+ margin-left: 160px;
1041
+ padding: 15px 20px;
1042
+ }
1043
+ }
1044
+
1045
+ /** For Media Gallery and Other WordPress pages **/
1046
+ /** No Caps for the tooltips **/
1047
+ .wp-admin.wpmud [tooltip]:after {
1048
+ text-transform: none !important;
1049
+ }
1050
+ .smushit [tooltip] {
1051
+ position: relative;
1052
+ overflow: visible;
1053
+ }
1054
+
1055
+ .smushit [tooltip]:before {
1056
+ content: '';
1057
+ position: absolute;
1058
+ border: 5px solid transparent;
1059
+ border-top-color: #0B2F3F;
1060
+ bottom: 100%;
1061
+ left: 50%;
1062
+ margin-left: -5px;
1063
+ margin-bottom: -5px;
1064
+ opacity: 0;
1065
+ z-index: -1;
1066
+ transition: margin .2s, opacity .2s, z-index .2s linear .2s;
1067
+ pointer-events: none;
1068
+ }
1069
+
1070
+ .smushit [tooltip]:after {
1071
+ content: attr(tooltip);
1072
+ position: absolute;
1073
+ background: #0B2F3F;
1074
+ color: #FFF;
1075
+ bottom: 100%;
1076
+ left: 50%;
1077
+ width: 200px;
1078
+ margin-left: -100px;
1079
+ margin-bottom: 5px;
1080
+ text-align: center;
1081
+ padding: 5px;
1082
+ border-radius: 4px;
1083
+ font: 600 13px/20px 'Roboto Condensed';
1084
+ opacity: 0;
1085
+ z-index: -1;
1086
+ transition: margin .2s, opacity .2s, z-index .2s linear .2s;
1087
+ white-space: pre-wrap;
1088
+ pointer-events: none;
1089
+ }
1090
+
1091
+ .smushit [tooltip].tooltip-s:after {
1092
+ width: 150px;
1093
+ margin-left: -75px;
1094
+ }
1095
+
1096
+ .smushit [tooltip].tooltip-l:after {
1097
+ width: 280px;
1098
+ margin-left: -140px;
1099
+ }
1100
+
1101
+ .smushit [tooltip].tooltip-right:after {
1102
+ margin-left: -180px;
1103
+ }
1104
+
1105
+ .smushit [tooltip].tooltip-s.tooltip-right:after {
1106
+ margin-left: -130px;
1107
+ }
1108
+
1109
+ .smushit [tooltip].tooltip-l.tooltip-right:after {
1110
+ margin-left: -260px;
1111
+ }
1112
+
1113
+ .smushit [tooltip].tooltip-bottom:before {
1114
+ border-color: transparent;
1115
+ border-bottom-color: #0B2F3F;
1116
+ top: 100%;
1117
+ bottom: auto;
1118
+ margin-top: -5px;
1119
+ margin-bottom: 0;
1120
+ }
1121
+
1122
+ .smushit [tooltip].tooltip-bottom:after {
1123
+ bottom: auto;
1124
+ top: 100%;
1125
+ margin-top: 5px;
1126
+ margin-bottom: 0;
1127
+ }
1128
+
1129
+ .smushit [tooltip]:hover:before {
1130
+ opacity: 1;
1131
+ z-index: 1;
1132
+ margin-bottom: 0;
1133
+ transition: margin .2s, opacity .2s;
1134
+ }
1135
+
1136
+ .smushit [tooltip]:hover:after {
1137
+ opacity: 1;
1138
+ z-index: 1;
1139
+ margin-bottom: 10px;
1140
+ transition: margin .2s, opacity .2s;
1141
+ }
1142
+
1143
+ .smushit .disabled[tooltip]:before,
1144
+ .smushit .disabled[tooltip]:after {
1145
+ display: none;
1146
+ }
1147
+
1148
+ /** Super Smush Content **/
1149
+
1150
+ .wp-smush-super-smush-promo {
1151
+ background-image: url(../images/welcome-notice.png);
1152
+ background-repeat: no-repeat;
1153
+ background-position: 0 bottom;
1154
+ height: 180px;
1155
+ margin-top: 8px;
1156
+ overflow: hidden;
1157
+ }
1158
+
1159
+ .wp-smush-super-smush-content {
1160
+ background: #dff6fa;
1161
+ border-radius: 5px;
1162
+ display: inline-block;
1163
+ margin-left: 200px;
1164
+ margin-top: 10px;
1165
+ padding: 20px 30px;
1166
+ position: relative;
1167
+ width: 58%;
1168
+ }
1169
+ /** Arrow **/
1170
+ .wp-smush-super-smush-content:after {
1171
+ right: 100%;
1172
+ top: 50%;
1173
+ border: solid transparent;
1174
+ content: " ";
1175
+ height: 0;
1176
+ width: 0;
1177
+ position: absolute;
1178
+ pointer-events: none;
1179
+ border-color: rgba(223, 246, 250, 0);
1180
+ border-right-color: #dff6fa;
1181
+ border-width: 10px;
1182
+ margin-top: -10px;
1183
+ }
1184
+ .wpmud .wp-smush-super-smush-content a,
1185
+ .wpmud .wp-smush-super-smush-content a:hover,
1186
+ .wpmud .wp-smush-super-smush-content a:visited {
1187
+ color: black;
1188
+ text-decoration: underline;
1189
  }
assets/images/bulk-smush.png ADDED
Binary file
assets/images/dev-team.png ADDED
Binary file
assets/images/hummingbird.png ADDED
Binary file
assets/images/icon-gzip.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 47.99 58.97"><defs><style>.cls-1{fill:#252525;}</style></defs><title>icon-gzip</title><path class="cls-1" d="M30,43H16.26A8,8,0,0,1,8,34.78Q8,22.88,8,11A8,8,0,0,1,16,3C25.31,3,34.66,3,44,3a7.68,7.68,0,0,1,7.34,4.88c0.8,1.75-.11,3.1-2,3.1h-29A4,4,0,0,0,16,15.33q0,7.59,0,15.18C16,33.43,17.6,35,20.53,35H49.4a2,2,0,0,1,2,3A8,8,0,0,1,44,43H30Z" transform="translate(-8 -3)"/><path class="cls-1" d="M34,46H46v7c1.48,0,.91,0,2.34,0a0.8,0.8,0,0,0,.45-0.35A4,4,0,0,1,56,55.37a4,4,0,0,1-3.26,3.54,3.8,3.8,0,0,1-3.9-1.52A0.89,0.89,0,0,0,48,57c-1.31,0-.62,0-1.92,0,0,1.72-1.66,5-6.08,5a5.84,5.84,0,0,1-6-5c-1.42,0-.85,0-2.29,0a0.8,0.8,0,0,0-.45.35A4,4,0,0,1,24,54.62a4,4,0,0,1,3.26-3.54,3.8,3.8,0,0,1,3.9,1.52A0.89,0.89,0,0,0,32,53c1.31,0,.62,0,2,0V46Z" transform="translate(-8 -3)"/><polygon class="cls-1" points="38.26 20.67 25.73 16.02 25.73 11.36 38.26 16.02 38.26 20.67"/><polygon class="cls-1" points="38.26 12.68 25.73 8.02 38.26 8.02 38.26 12.68"/><polygon class="cls-1" points="38.26 28.66 25.73 24.01 25.73 19.36 38.26 24.01 38.26 28.66"/><polygon class="cls-1" points="25.73 32 25.73 27.35 38.26 32 25.73 32"/></svg>
assets/images/install-welcome.png ADDED
Binary file
assets/images/smush-upload-images.png ADDED
Binary file
assets/images/welcome-notice.png ADDED
Binary file
assets/js/wp-smushit-admin.js CHANGED
@@ -6,461 +6,921 @@
6
  *
7
  */
8
  var WP_Smush = WP_Smush || {};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  jQuery(function ($) {
10
- var smushAddParams = function (url, data) {
11
- if (!$.isEmptyObject(data)) {
12
- url += ( url.indexOf('?') >= 0 ? '&' : '?' ) + $.param(data);
13
- }
14
 
15
- return url;
16
- }
17
  // url for smushing
18
  WP_Smush.errors = [];
19
  WP_Smush.timeout = wp_smushit_data.timeout;
20
  /**
21
  * Checks for the specified param in URL
22
- * @param sParam
23
  * @returns {*}
24
  */
25
- WP_Smush.geturlparam = function(arg) {
26
  var $sPageURL = window.location.search.substring(1);
27
  var $sURLVariables = $sPageURL.split('&');
28
 
29
- for (var i = 0; i < $sURLVariables.length; i++) {
30
- var $sParameterName = $sURLVariables[i].split('=');
31
- if ($sParameterName[0] == arg) {
32
- return $sParameterName[1];
33
- }
34
- }
35
- };
36
-
37
- WP_Smush.ajax = function ($id, $send_url, $getnxt, nonce ) {
38
- "use strict";
39
- return $.ajax({
40
- type: "GET",
41
- data: {attachment_id: $id, get_next: $getnxt, _nonce: nonce },
42
- url: $send_url,
43
- timeout: WP_Smush.timeout,
44
- dataType: 'json'
45
- });
46
- };
47
-
48
- WP_Smush.Smush = function ($button, bulk, smush_type) {
49
- var self = this;
50
-
51
- this.init = function (arguments) {
52
- this.$button = $($button[0]);
53
- this.is_bulk = typeof bulk ? bulk : false;
54
- this.url = ajaxurl;
55
- this.button_text = this.is_bulk ? wp_smush_msgs.bulk_now : wp_smush_msgs.smush_now;
56
- this.$log = $(".smush-final-log");
57
- this.$button_span = this.$button.find("span");
58
- this.$loader = $(".wp-smush-loader-wrap").eq(0).clone();
59
- this.deferred = jQuery.Deferred();
60
- this.deferred.errors = [];
61
- this.ids = wp_smushit_data.unsmushed.length > 0 ? wp_smushit_data.unsmushed : wp_smushit_data.lossless;
62
- this.is_bulk_super_smush = wp_smushit_data.unsmushed.length > 0 ? false : true;
63
- this.lossless_count = wp_smushit_data.lossless.length;
64
- this.$status = this.$button.parent().find('.smush-status');
65
- //Added for NextGen support
66
- this.smush_type = typeof smush_type ? smush_type : false;
67
- this.single_ajax_suffix = this.smush_type ? 'smush_manual_nextgen' : 'wp_smushit_manual';
68
- this.bulk_ajax_suffix = this.smush_type ? 'wp_smushit_nextgen_bulk' : 'wp_smushit_bulk';
69
  this.url = this.is_bulk ? smushAddParams(this.url, {action: this.bulk_ajax_suffix}) : smushAddParams(this.url, {action: this.single_ajax_suffix});
70
- };
71
-
72
- //Show loader in button for single and bulk smush
73
- this.start = function () {
74
-
75
- this.$button.attr('disabled', 'disabled');
76
- this.$button.addClass('wp-smush-started');
77
- if (!this.$button.find(".wp-smush-loader-wrap").length) {
78
- this.$button.prepend(this.$loader);
79
- } else {
80
- this.$loader = this.$button.find(".wp-smush-loader-wrap");
81
- }
82
-
83
-
84
- this.show_loader();
85
- this.bulk_start();
86
- this.single_start();
87
- };
88
-
89
- this.bulk_start = function () {
90
- if (!this.is_bulk) return;
91
- $('#progress-ui').show();
92
- this.$button_span.text(wp_smush_msgs.progress);
93
- this.show_loader();
94
-
95
- };
96
-
97
- this.single_start = function () {
98
- if (this.is_bulk) return;
99
- this.$button_span.text(wp_smush_msgs.sending);
100
- this.$status.removeClass("error");
101
- };
102
-
103
- this.enable_button = function () {
104
- this.$button.prop("disabled", false);
105
- };
106
-
107
-
108
- this.disable_button = function () {
109
- this.$button.prop("disabled", true);
110
- };
111
-
112
- this.show_loader = function () {
113
- this.$loader.removeClass("hidden");
114
- this.$loader.show();
115
- };
116
-
117
- this.hide_loader = function () {
118
- this.$loader.hide();
119
- };
120
-
121
- this.single_done = function () {
122
- if (this.is_bulk) return;
123
-
124
- this.hide_loader();
125
- this.request.done(function (response) {
126
- if (typeof response.data != 'undefined') {
127
- //Append the smush stats or error
128
- self.$status.html(response.data);
129
- if (response.success && response.data !== "Not processed") {
130
- self.$status.removeClass('hidden');
131
- self.$button.parent().removeClass('unsmushed').addClass('smushed');
132
- self.$button.remove();
133
- } else {
134
- self.$status.addClass("error");
135
- }
136
- self.$status.html(response.data);
137
- }
138
- self.$button_span.text(self.button_text);
139
- self.enable_button();
140
- }).error(function (response) {
141
- self.$status.html(response.data);
142
- self.$status.addClass("error");
143
- self.enable_button();
144
- self.$button_span.text(self.button_text);
145
- });
146
-
147
- };
148
-
149
- this.bulk_done = function () {
150
- if (!this.is_bulk) return;
151
-
152
- this.hide_loader();
153
-
154
- // Add finished class
155
- this.$button.addClass('wp-smush-finished');
156
-
157
- // Remove started class
158
- this.$button.removeClass('wp-smush-started');
159
-
160
- //Enable the button
161
- this.disable_button();
162
-
163
- // Update button text
164
- self.$button_span.text(wp_smush_msgs.done);
165
- };
166
-
167
- this.is_resolved = function () {
168
- "use strict";
169
- return this.deferred.state() === "resolved";
170
- };
171
-
172
- this.free_exceeded = function () {
173
- this.hide_loader();
174
-
175
- // Add new class for css adjustment
176
- this.$button.removeClass('wp-smush-started');
177
-
178
- //Enable button
179
- this.$button.prop("disabled", false);
180
-
181
- // Update text
182
- this.$button.find('span').html(wp_smush_msgs.bulk_now);
183
- };
184
-
185
- this.update_progress = function (_res) {
186
- //If not bulk
187
- if( !this.is_bulk_super_smush && !this.is_bulk ) {
188
- return;
189
- }
190
-
191
- if (!this.is_bulk_super_smush) {
192
- //handle progress for normal bulk smush
193
- var progress = ( _res.data.stats.smushed / _res.data.stats.total) * 100;
194
- } else {
195
- //Handle progress for Super smush progress bar
196
- if (wp_smushit_data.lossless.length > 0) {
197
- $('#wp-smush-ss-progress-wrap .remaining-count').html(wp_smushit_data.lossless.length);
198
- } else if (wp_smushit_data.lossless.length == 0) {
199
- $('#wp-smush-ss-progress-wrap #wp-smush-compression').html(wp_smush_msgs.all_supersmushed);
200
- }
201
-
202
- }
203
-
204
- //Update stats
205
- $('#wp-smush-compression #human').html(_res.data.stats.human);
206
- $('#wp-smush-compression #percent').html(_res.data.stats.percent);
207
-
208
- // increase the progress bar
209
- this._update_progress(_res.data.stats.smushed, progress);
210
- };
211
-
212
- this._update_progress = function (count, width) {
213
- "use strict";
214
- if (!this.is_bulk) {
215
- return;
216
- }
217
-
218
- if (!this.is_bulk_super_smush) {
219
- // get the progress bar
220
- var $progress_bar = jQuery('#wp-smush-progress-wrap #wp-smush-fetched-progress div');
221
- if ($progress_bar.length < 1) {
222
- return;
223
- }
224
- $('.done-count').html(count);
225
- // increase progress
226
- $progress_bar.css('width', width + '%');
227
- } else {
228
-
229
- if (this.lossless_count > 0) {
230
- var remaining_lossless = this.lossless_count - wp_smushit_data.lossless.length;
231
- var progress_width = ( remaining_lossless / this.lossless_count * 100 );
232
- var $progress_bar = jQuery('#wp-smush-ss-progress-wrap #wp-smush-ss-progress div');
233
- if ($progress_bar.length < 1) {
234
- return;
235
- }
236
- // increase progress
237
- $progress_bar.css('width', progress_width + '%');
238
- }
239
- }
240
-
241
- };
242
-
243
- this.continue = function () {
244
- return this.ids.length > 0 && this.is_bulk;
245
- };
246
-
247
- this.increment_errors = function () {
248
- WP_Smush.errors.push(this.current_id);
249
- };
250
-
251
- //Send ajax request for smushing single and bulk, call update_progress on ajax response
252
- this.call_ajax = function () {
253
-
254
- var nonce_field = false;
255
- var nonce_value = '';
256
- this.current_id = this.is_bulk ? this.ids.shift() : this.$button.data("id"); //remove from array while processing so we can continue where left off
257
- nonce_field = this.$button.parent().find('#_wp_smush_nonce');
258
- if (nonce_field) {
259
- nonce_value = nonce_field.val();
260
- }
261
-
262
- this.request = WP_Smush.ajax(this.current_id, this.url, 0, nonce_value)
263
- .complete(function () {
264
- if (!self.continue() || !self.is_bulk) {
265
- self.deferred.resolve();
266
- }
267
- })
268
- .error(function () {
269
- self.increment_errors();
270
- }).done(function (res) {
271
- //If no response or success is false, do not process further
272
- if (typeof res == 'undefined' || !res || !res.success ) {
273
- if( typeof res.data.error_msg !== 'undefined' ) {
274
- //Print the error on screen
275
- self.$log.append(res.data.error_msg);
276
- //We can proceed to next image
277
- if (self.continue()) {
278
- self.call_ajax();
279
- }
280
- }
281
- }
282
- if (typeof res.success === "undefined" || ( typeof res.success !== "undefined" && res.success === false && res.data.error !== 'bulk_request_image_limit_exceeded' )) {
283
- self.increment_errors();
284
- }
285
-
286
- if (typeof res.data !== "undefined" && res.data.error == 'bulk_request_image_limit_exceeded' && !self.is_resolved()) {
287
- self.free_exceeded();
288
- } else {
289
-
290
- if( self.is_bulk ) {
291
- self.update_progress(res);
292
- }
293
-
294
- if (self.continue()) {
295
- self.call_ajax();
296
- }
297
- }
298
- self.single_done();
299
- });
300
-
301
- self.deferred.errors = WP_Smush.errors;
302
- return self.deferred;
303
- };
304
-
305
- this.init(arguments);
306
-
307
- //Send ajax request for single and bulk smushing
308
- this.run = function () {
309
-
310
- // if we have a definite number of ids
311
- if (this.is_bulk && this.ids.length > 0) {
312
- this.call_ajax();
313
- }
314
-
315
- if (!this.is_bulk)
316
- this.call_ajax();
317
-
318
- };
319
-
320
- //Show bulk smush errors, and disable bulk smush button on completion
321
- this.bind_deferred_events = function () {
322
-
323
- this.deferred.done(function () {
324
- if (WP_Smush.errors.length) {
325
- var error_message = wp_smush_msgs.error_in_bulk.replace("{{errors}}", WP_Smush.errors.length);
326
- self.$log.append(error_message);
327
- }
328
- self.bulk_done();
329
- });
330
-
331
- };
332
-
333
- this.start();
334
- this.run();
335
- this.bind_deferred_events();
336
- return this.deferred;
337
- };
338
- /**
339
- * Handle the start button click
340
- */
341
- $('button[name="smush-all"]').on('click', function (e) {
342
-
343
- // prevent the default action
344
- e.preventDefault();
345
-
346
- //Check for ids, if there is none (Unsmushed or lossless), don't call smush function
347
- if (typeof wp_smushit_data == 'undefined' ||
348
- ( wp_smushit_data.unsmushed.length == 0 && wp_smushit_data.lossless.length == 0 )
349
- ) {
350
-
351
- return false;
352
-
353
- }
354
-
355
- $(".smush-remaining-images-notice").remove();
356
-
357
- new WP_Smush.Smush($(this), true);
358
-
359
- return;
360
- });
361
-
362
- /**
363
- * Handle the Smush Stats link click
364
- */
365
- $('body').on('click', 'a.smush-stats-details', function (e) {
366
-
367
- // prevent the default action
368
- e.preventDefault();
369
- var slide_symbol = $(this).find('.stats-toggle');
370
- $(this).parents().eq(1).find('.smush-stats-wrapper').slideToggle();
371
- slide_symbol.text(slide_symbol.text() == '+' ? '-' : '+');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
372
 
373
- return;
374
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
375
 
376
- //Handle smush button click
377
- $('body').on('click', '.wp-smush-send', function (e) {
 
 
 
 
 
 
 
 
 
 
 
 
 
378
 
379
- // prevent the default action
380
- e.preventDefault();
381
- new WP_Smush.Smush($(this), false);
382
- });
383
- //Stats Button Click
384
 
 
 
385
 
386
- //Handle NextGen Gallery smush button click
387
- $('body').on('click', '.wp-smush-nextgen-send', function (e) {
 
 
388
 
389
- // prevent the default action
390
- e.preventDefault();
391
- new WP_Smush.Smush($(this), false, 'nextgen');
392
- });
393
 
394
- //Handle NextGen Gallery Bulk smush button click
395
- $('body').on('click', '.wp-smush-nextgen-bulk', function (e) {
396
 
397
- // prevent the default action
398
- e.preventDefault();
 
 
 
399
 
400
- //Check for ids, if there is none (Unsmushed or lossless), don't call smush function
401
- if (typeof wp_smushit_data == 'undefined' ||
402
- ( wp_smushit_data.unsmushed.length == 0 && wp_smushit_data.lossless.length == 0 )
403
- ) {
 
 
404
 
405
- return false;
 
 
 
 
 
406
 
407
- }
 
 
 
 
 
408
 
409
- $(".smush-remaining-images-notice").remove();
410
- new WP_Smush.Smush($(this), true, 'nextgen');
411
- return;
412
- });
 
 
413
 
414
- /** Show help text on help image hover **/
415
- $( document ).tooltip();
416
 
417
- /** Dismiss the notice and store it in options table **/
418
- $('.wp-smush-pro-feature-dismiss').on('click', function(e){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
419
  e.preventDefault();
420
  var $el = $(this).parents().eq(1);
 
 
 
 
 
 
 
 
 
 
 
421
 
 
 
 
 
422
  $el.fadeTo( 100, 0, function() {
423
  $el.slideUp( 100, function() {
424
  $el.remove();
425
  });
426
  });
 
 
 
 
 
427
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
428
  //Send a ajax request to save the dismissed notice option
429
  var param = {
430
- action: 'dismiss_smush_notice'
431
  };
432
  $.post(ajaxurl, param );
433
-
434
  });
435
 
436
  });
437
  (function ($) {
438
- var Smush = function (element, options) {
439
- var elem = $(element);
440
-
441
- var defaults = {
442
- isSingle: false,
443
- ajaxurl: '',
444
- msgs: {},
445
- msgClass: 'wp-smush-msg',
446
- ids: []
447
- };
448
- };
449
- $.fn.wpsmush = function (options) {
450
- return this.each(function () {
451
- var element = $(this);
452
-
453
- // Return early if this element already has a plugin instance
454
- if (element.data('wpsmush'))
455
- return;
456
-
457
- // pass options to plugin constructor and create a new instance
458
- var wpsmush = new Smush(this, options);
459
-
460
- // Store plugin object in this element's data
461
- element.data('wpsmush', wpsmush);
462
- });
463
- };
464
 
465
- })(jQuery);
 
 
 
 
 
466
 
 
 
 
 
 
 
6
  *
7
  */
8
  var WP_Smush = WP_Smush || {};
9
+
10
+ /**
11
+ * Show/hide the progress bar for Smushing/Restore/SuperSmush
12
+ *
13
+ * @param cur_ele
14
+ * @param txt Message to be displayed
15
+ * @param state show/hide
16
+ */
17
+ var progress_bar = function( cur_ele, txt, state ) {
18
+
19
+ //Update Progress bar text and show it
20
+ var progress_button = cur_ele.parents().eq(1).find('.wp-smush-progress');
21
+
22
+ if( 'show' == state ) {
23
+ progress_button.find('span').html(txt);
24
+ progress_button.removeClass('hidden');
25
+ }else{
26
+ progress_button.find('span').html( wp_smush_msgs.all_done );
27
+ progress_button.hide();
28
+ }
29
+ };
30
  jQuery(function ($) {
31
+ var smushAddParams = function (url, data) {
32
+ if (!$.isEmptyObject(data)) {
33
+ url += ( url.indexOf('?') >= 0 ? '&' : '?' ) + $.param(data);
34
+ }
35
 
36
+ return url;
37
+ };
38
  // url for smushing
39
  WP_Smush.errors = [];
40
  WP_Smush.timeout = wp_smushit_data.timeout;
41
  /**
42
  * Checks for the specified param in URL
43
+ * @param arg
44
  * @returns {*}
45
  */
46
+ WP_Smush.geturlparam = function (arg) {
47
  var $sPageURL = window.location.search.substring(1);
48
  var $sURLVariables = $sPageURL.split('&');
49
 
50
+ for (var i = 0; i < $sURLVariables.length; i++) {
51
+ var $sParameterName = $sURLVariables[i].split('=');
52
+ if ($sParameterName[0] == arg) {
53
+ return $sParameterName[1];
54
+ }
55
+ }
56
+ };
57
+
58
+ WP_Smush.Smush = function ($button, bulk, smush_type) {
59
+ var self = this;
60
+ var skip_resmush = $button.data('smush');
61
+ //If smush attribute is not defined, Need not skip resmush ids
62
+ skip_resmush = ( ( typeof skip_resmush == typeof undefined ) || skip_resmush == false ) ? false : true;
63
+
64
+ this.init = function () {
65
+ this.$button = $($button[0]);
66
+ this.is_bulk = typeof bulk ? bulk : false;
67
+ this.url = ajaxurl;
68
+ this.$log = $(".smush-final-log");
69
+ this.deferred = jQuery.Deferred();
70
+ this.deferred.errors = [];
71
+
72
+ //If button has resmush class, and we do have ids that needs to resmushed, put them in the list
73
+ this.ids = wp_smushit_data.resmush.length > 0 && !skip_resmush ? wp_smushit_data.resmush.concat( wp_smushit_data.unsmushed ) : wp_smushit_data.unsmushed ;
74
+
75
+ this.is_bulk_resmush = wp_smushit_data.resmush.length > 0 && !skip_resmush ? true : false;
76
+
77
+ this.$status = this.$button.parent().find('.smush-status');
78
+
79
+ //Added for NextGen support
80
+ this.smush_type = typeof smush_type ? smush_type : false;
81
+ this.single_ajax_suffix = this.smush_type ? 'smush_manual_nextgen' : 'wp_smushit_manual';
82
+ this.bulk_ajax_suffix = this.smush_type ? 'wp_smushit_nextgen_bulk' : 'wp_smushit_bulk';
 
 
 
 
 
 
 
83
  this.url = this.is_bulk ? smushAddParams(this.url, {action: this.bulk_ajax_suffix}) : smushAddParams(this.url, {action: this.single_ajax_suffix});
84
+ };
85
+
86
+ /** Send Ajax request for smushing the image **/
87
+ WP_Smush.ajax = function (is_bulk_resmush, $id, $send_url, $getnxt, nonce) {
88
+ "use strict";
89
+ var param = {
90
+ is_bulk_resmush: is_bulk_resmush,
91
+ attachment_id: $id,
92
+ get_next: $getnxt,
93
+ _nonce: nonce
94
+ };
95
+ param = jQuery.param(param);
96
+ return $.ajax({
97
+ type: "GET",
98
+ data: param,
99
+ url: $send_url,
100
+ timeout: WP_Smush.timeout,
101
+ dataType: 'json'
102
+ });
103
+ };
104
+
105
+ //Show loader in button for single and bulk smush
106
+ this.start = function () {
107
+
108
+ this.$button.attr('disabled', 'disabled');
109
+ this.$button.addClass('wp-smush-started');
110
+
111
+ this.bulk_start();
112
+ this.single_start();
113
+ };
114
+
115
+ this.bulk_start = function () {
116
+ if (!this.is_bulk) return;
117
+
118
+ //Hide the Bulk Div
119
+ $('.wp-smush-bulk-wrapper').hide();
120
+
121
+ //Show the Progress Bar
122
+ $('.bulk-smush-wrapper .wp-smush-bulk-progress-bar-wrapper').show();
123
+
124
+ //Set Progress Bar width
125
+ if( 'undefined' !== typeof this.ids && 'undefined' !== typeof wp_smushit_data.count_total && wp_smushit_data.count_total > 0 ) {
126
+ var progress = ( ( wp_smushit_data.count_total - this.ids.length ) / wp_smushit_data.count_total ) * 100;
127
+ var progress_bar = jQuery('.bulk-smush-wrapper .wp-smush-progress-inner');
128
+ if ( progress_bar.length < 1) {
129
+ return;
130
+ }
131
+ // increase progress
132
+ progress_bar.css('width', progress + '%');
133
+ }
134
+ //Remove any Global Notices if there
135
+ $('.wp-smush-notice.wp-smush-resmush-message').remove();
136
+ };
137
+
138
+ this.single_start = function () {
139
+ if (this.is_bulk) return;
140
+ this.show_loader();
141
+ this.$status.removeClass("error");
142
+ };
143
+
144
+ this.enable_button = function () {
145
+ this.$button.prop("disabled", false);
146
+ //For Bulk process, Enable other buttons
147
+ $('button.wp-smush-all').removeAttr('disabled');
148
+ $('button.wp-smush-scan').removeAttr('disabled');
149
+ };
150
+
151
+ this.show_loader = function () {
152
+ progress_bar(this.$button, wp_smush_msgs.smushing, 'show');
153
+ };
154
+
155
+ this.hide_loader = function () {
156
+ progress_bar(this.$button, wp_smush_msgs.smushing, 'hide');
157
+ };
158
+
159
+ this.single_done = function () {
160
+ if (this.is_bulk) return;
161
+
162
+ this.hide_loader();
163
+ this.request.done(function (response) {
164
+ if (typeof response.data != 'undefined') {
165
+ //Append the smush stats or error
166
+ self.$status.html(response.data);
167
+ if (response.success && response.data !== "Not processed") {
168
+ self.$status.removeClass('hidden');
169
+ self.$button.parent().removeClass('unsmushed').addClass('smushed');
170
+ self.$button.remove();
171
+ } else {
172
+ self.$status.addClass("error");
173
+ }
174
+ self.$status.html( response.data.status );
175
+ //Check if stats div exists
176
+ var parent = self.$status.parent();
177
+ var stats_div = parent.find('.smush-stats-wrapper');
178
+ if( 'undefined' != stats_div && stats_div.length ) {
179
+ stats_div.replaceWith( response.data.stats );
180
+ }else{
181
+ parent.append( response.data.stats );
182
+ }
183
+ }
184
+ self.enable_button();
185
+ }).error(function (response) {
186
+ self.$status.html(response.data);
187
+ self.$status.addClass("error");
188
+ self.enable_button();
189
+ });
190
+
191
+ };
192
+
193
+ /** After the Bulk Smushing has been Finished **/
194
+ this.bulk_done = function () {
195
+ if (!this.is_bulk) return;
196
+
197
+ //Enable the button
198
+ this.enable_button();
199
+
200
+ //Show Notice
201
+ if ( self.ids.length == 0 ) {
202
+ $('.bulk-smush-wrapper .wp-smush-all-done').show();
203
+ } else {
204
+ if ($('.bulk-smush-wrapper .wp-smush-resmush-notice').length > 0) {
205
+ $('.bulk-smush-wrapper .wp-smush-resmush-notice').show();
206
+ } else {
207
+ $('.bulk-smush-wrapper .wp-smush-remaining').show();
208
+ }
209
+ $('.wp-smush-bulk-wrapper').show();
210
+ }
211
+
212
+ //Hide the Progress Bar
213
+ $('.wp-smush-bulk-progress-bar-wrapper').hide();
214
+
215
+ //Enable Resmush and scan button
216
+ $('.wp-resmush.wp-smush-action, .wp-smush-scan').removeAttr('disabled');
217
+ };
218
+
219
+ this.is_resolved = function () {
220
+ "use strict";
221
+ return this.deferred.state() === "resolved";
222
+ };
223
+
224
+ this.free_exceeded = function () {
225
+ //Hide the Progress bar and show the Bulk smush wrapper
226
+ $('.wp-smush-bulk-progress-bar-wrapper').hide();
227
+
228
+ if ( self.ids.length > 0 ) {
229
+ //Show Bulk wrapper
230
+ $('.wp-smush-bulk-wrapper ').show();
231
+ } else {
232
+ $('.wp-smush-notice.wp-smush-all-done').show();
233
+ }
234
+ };
235
+
236
+ this.update_remaining_count = function () {
237
+ if( this.is_bulk_resmush ) {
238
+ //ReSmush Notice
239
+ if( $('.wp-smush-resmush-notice .wp-smush-remaining-count').length && 'undefined' != typeof self.ids ) {
240
+ $('.wp-smush-resmush-notice .wp-smush-remaining-count').html( self.ids.length );
241
+ }
242
+ }else{
243
+ //Smush Notice
244
+ if( $('.bulk-smush-wrapper .wp-smush-remaining-count').length && 'undefined' != typeof self.ids ) {
245
+ $('.bulk-smush-wrapper .wp-smush-remaining-count').html( self.ids.length );
246
+ }
247
+ }
248
+ }
249
+
250
+ this.update_progress = function (_res) {
251
+ //If not bulk
252
+ if (!this.is_bulk_resmush && !this.is_bulk) {
253
+ return;
254
+ }
255
+
256
+ var progress = '';
257
+
258
+ if (!this.is_bulk_resmush) {
259
+ if (_res && ( 'undefined' == typeof _res.data || 'undefined' == typeof _res.data.stats )) {
260
+ return;
261
+ }
262
+ //handle progress for normal bulk smush
263
+ progress = ( _res.data.stats.smushed / _res.data.stats.total) * 100;
264
+ } else {
265
+ //If the Request was successful, Update the progress bar
266
+ if (_res.success) {
267
+ //Handle progress for Super smush progress bar
268
+ if (wp_smushit_data.resmush.length > 0) {
269
+ //Update the Count
270
+ $('.wp-smush-images-remaining').html(wp_smushit_data.resmush.length);
271
+ } else if (wp_smushit_data.resmush.length == 0) {
272
+ //If all images are resmushed, show the All Smushed message
273
+
274
+ //Show All Smushed
275
+ $('.bulk-resmush-wrapper .wp-smush-all-done').removeClass('hidden');
276
+
277
+ //Hide Everything else
278
+ $('.wp-smush-resmush-wrap, .wp-smush-bulk-progress-bar-wrapper').hide();
279
+ }
280
+ }
281
+
282
+ //handle progress for normal bulk smush
283
+ //Set Progress Bar width
284
+ if ('undefined' !== typeof self.ids && 'undefined' !== typeof wp_smushit_data.count_total && wp_smushit_data.count_total > 0) {
285
+ progress = ( ( wp_smushit_data.count_total - self.ids.length ) / wp_smushit_data.count_total ) * 100;
286
+ }
287
+ }
288
+
289
+ //Show Bulk Wrapper and Smush Notice
290
+ if( self.ids.length == 0 ) {
291
+ //Hide the bulk wrapper
292
+ $('.wp-smush-bulk-wrapper').hide();
293
+ //Show All done notice
294
+ $('.wp-smush-notice.wp-smush-all-done').show();
295
+ }
296
+
297
+ //Update remaining count
298
+ self.update_remaining_count();
299
+
300
+ //if we have received the progress data, update the stats else skip
301
+ if ('undefined' != typeof _res.data.stats) {
302
+ //Temporary Workaround, @todo: Need to fix this jugaad
303
+ var smushed_count = self.is_bulk_resmush ? ( _res.data.stats.total - self.ids.length ) + 1 : _res.data.stats.smushed;
304
+ smushed_count = smushed_count > _res.data.stats.total ? _res.data.stats.total : smushed_count;
305
+ //Update stats
306
+ $('.smush-total-reduction-percent .wp-smush-stats').html(_res.data.stats.percent);
307
+ $('.smush-total-reduction-bytes .wp-smush-stats').html(_res.data.stats.human);
308
+
309
+ $('.smush-attachments .wp-smush-stats .smushed-count, .wp-smush-images-smushed').html(smushed_count);
310
+ if ($('.super-smush-attachments .smushed-count').length && 'undefined' != typeof _res.data.stats.super_smushed) {
311
+ $('.super-smush-attachments .smushed-count').html(_res.data.stats.super_smushed);
312
+ }
313
+
314
+ // increase the progress bar
315
+ this._update_progress(_res.data.stats.smushed, progress);
316
+ }
317
+ };
318
+
319
+ this._update_progress = function (count, width) {
320
+ "use strict";
321
+ if ( !this.is_bulk && !this.is_bulk_resmush ) {
322
+ return;
323
+ }
324
+ //Update the Progress Bar Width
325
+ // get the progress bar
326
+ var $progress_bar = jQuery('.bulk-smush-wrapper .wp-smush-progress-inner');
327
+ if ($progress_bar.length < 1) {
328
+ return;
329
+ }
330
+ // increase progress
331
+ $progress_bar.css('width', width + '%');
332
+
333
+ };
334
+
335
+ //Whether to send the ajax requests further or not
336
+ this.continue = function () {
337
+ var continue_smush = self.$button.attr('continue_smush');
338
+
339
+ if (typeof continue_smush == typeof undefined) {
340
+ continue_smush = true;
341
+ }
342
+
343
+ if ('false' == continue_smush || !continue_smush) {
344
+ continue_smush = false;
345
+ }
346
+
347
+ return continue_smush && this.ids.length > 0 && this.is_bulk;
348
+ };
349
+
350
+ this.increment_errors = function ( id ) {
351
+ WP_Smush.errors.push(id);
352
+ };
353
+
354
+ //Send ajax request for smushing single and bulk, call update_progress on ajax response
355
+ this.call_ajax = function () {
356
+ var nonce_value = '';
357
+ this.current_id = this.is_bulk ? this.ids.shift() : this.$button.data("id"); //remove from array while processing so we can continue where left off
358
+ var nonce_field = this.$button.parent().find('#_wp_smush_nonce');
359
+ if (nonce_field) {
360
+ nonce_value = nonce_field.val();
361
+ }
362
+
363
+ this.request = WP_Smush.ajax(this.is_bulk_resmush, this.current_id, this.url, 0, nonce_value)
364
+ .error(function () {
365
+ self.increment_errors( self.current_id );
366
+ }).done(function (res ) {
367
+ //Increase the error count if any
368
+ if (typeof res.success === "undefined" || ( typeof res.success !== "undefined" && res.success === false && res.data.error !== 'bulk_request_image_limit_exceeded' )) {
369
+ self.increment_errors( self.current_id );
370
+ }
371
+ //If no response or success is false, do not process further
372
+ if (typeof res == 'undefined' || !res || !res.success) {
373
+ if ('undefined' !== typeof res && 'undefined' !== typeof res.data && typeof res.data.error_msg !== 'undefined') {
374
+ //Print the error on screen
375
+ self.$log.append(res.data.error_msg);
376
+ self.$log.removeClass('hidden');
377
+ }
378
+ }
379
+
380
+ if (typeof res.data !== "undefined" && res.data.error == 'bulk_request_image_limit_exceeded' && !self.is_resolved() ) {
381
+ //Add a data attribute to the smush button, to stop sending ajax
382
+ self.$button.attr('continue_smush', false);
383
+
384
+ self.free_exceeded();
385
+
386
+ //Reinsert the current id
387
+ wp_smushit_data.unsmushed.push(self.current_id);
388
+
389
+ //Update the remaining count to length of remaining ids + 1 (Current id)
390
+ self.update_remaining_count();
391
+ } else {
392
+
393
+ if (self.is_bulk && res.success ) {
394
+ self.update_progress(res);
395
+ }
396
+ }
397
+ self.single_done();
398
+ }).complete(function () {
399
+ if (!self.continue() || !self.is_bulk) {
400
+ //Calls deferred.done()
401
+ self.deferred.resolve();
402
+ }else{
403
+ self.call_ajax();
404
+ }
405
+ });
406
+
407
+ self.deferred.errors = WP_Smush.errors;
408
+ return self.deferred;
409
+ };
410
+
411
+ this.init(arguments);
412
+
413
+ //Send ajax request for single and bulk smushing
414
+ this.run = function () {
415
+
416
+ // if we have a definite number of ids
417
+ if (this.is_bulk && this.ids.length > 0) {
418
+ this.call_ajax();
419
+ }
420
+
421
+ if (!this.is_bulk)
422
+ this.call_ajax();
423
+
424
+ };
425
+
426
+ //Show bulk smush errors, and disable bulk smush button on completion
427
+ this.bind_deferred_events = function () {
428
+
429
+ this.deferred.done(function () {
430
+
431
+ self.$button.removeAttr('continue_smush');
432
+
433
+ if (WP_Smush.errors.length) {
434
+ var error_message = '<div class="wp-smush-ajax-error">' + wp_smush_msgs.error_in_bulk.replace("{{errors}}", WP_Smush.errors.length) + '</div>';
435
+ //Remove any existing notice
436
+ $('.wp-smush-ajax-error').remove();
437
+ self.$log.prepend(error_message);
438
+ }
439
+
440
+ self.bulk_done();
441
+
442
+ //Re enable the buttons
443
+ $('.wp-smush-button:not(.wp-smush-finished), .wp-smush-scan').removeAttr('disabled');
444
+ });
445
+
446
+ };
447
+ /** Handles the Cancel button Click
448
+ *
449
+ * Update the UI, and enables the bulk smush button
450
+ *
451
+ **/
452
+ this.cancel_ajax = function () {
453
+ $('.wp-smush-cancel-bulk').on('click', function () {
454
+ //Add a data attribute to the smush button, to stop sending ajax
455
+ self.$button.attr('continue_smush', false );
456
+
457
+ self.request.abort();
458
+ self.enable_button();
459
+ self.$button.removeClass('wp-smush-started');
460
+ $('.wp-smush-bulk-wrapper').show();
461
+
462
+ //Hide the Progress Bar
463
+ $('.wp-smush-bulk-progress-bar-wrapper').hide();
464
+ });
465
+ };
466
+
467
+ this.start();
468
+ this.run();
469
+ this.bind_deferred_events();
470
+
471
+ //Handle Cancel Ajax
472
+ this.cancel_ajax();
473
+
474
+ return this.deferred;
475
+ };
476
+
477
+ /**
478
+ * Handle the Bulk Smush/ Bulk Resmush button click
479
+ */
480
+ $('body').on('click', 'button.wp-smush-all', function (e) {
481
+
482
+ // prevent the default action
483
+ e.preventDefault();
484
+
485
+ $('.wp-smush-notice.wp-smush-settings-updated').remove();
486
+
487
+ //Disable Resmush and scan button
488
+ $('.wp-resmush.wp-smush-action, .wp-smush-scan, .wp-smush-button').attr('disabled', 'disabled');
489
+
490
+ //Check for ids, if there is none (Unsmushed or lossless), don't call smush function
491
+ if (typeof wp_smushit_data == 'undefined' ||
492
+ ( wp_smushit_data.unsmushed.length == 0 && wp_smushit_data.resmush.length == 0 )
493
+ ) {
494
+
495
+ return false;
496
+
497
+ }
498
+
499
+ $(".wp-smush-remaining").hide();
500
+
501
+ new WP_Smush.Smush($(this), true);
502
+
503
+
504
+ });
505
+
506
+ /** Disable the action links **/
507
+ var disable_links = function (c_element) {
508
+
509
+ var parent = c_element.parent();
510
+ //reduce parent opacity
511
+ parent.css({'opacity': '0.5'});
512
+ //Disable Links
513
+ parent.find('a').attr('disabled', 'disabled');
514
+ };
515
+
516
+ /** Enable the Action Links **/
517
+ var enable_links = function (c_element) {
518
+
519
+ var parent = c_element.parent();
520
+
521
+ //reduce parent opacity
522
+ parent.css({'opacity': '1'});
523
+ //Disable Links
524
+ parent.find('a').removeAttr('disabled');
525
+ };
526
+ /**
527
+ * Restore image request with a specified action for Media Library / NextGen Gallery
528
+ * @param e
529
+ * @param current_button
530
+ * @param smush_action
531
+ * @returns {boolean}
532
+ */
533
+ var process_smush_action = function( e, current_button, smush_action ) {
534
+
535
+ //If disabled
536
+ if( 'disabled' == current_button.attr('disabled') ) {
537
+ return false;
538
+ }
539
+
540
+ e.preventDefault();
541
+
542
+ //Remove Error
543
+ $('.wp-smush-error').remove();
544
+
545
+ //Hide stats
546
+ $('.smush-stats-wrapper').hide();
547
+
548
+ //Get the image ID and nonce
549
+ var params = {
550
+ action: smush_action,
551
+ attachment_id: current_button.data('id'),
552
+ _nonce: current_button.data('nonce')
553
+ };
554
+
555
+ //Reduce the opacity of stats and disable the click
556
+ disable_links( current_button );
557
+
558
+ progress_bar( current_button, wp_smush_msgs.smushing, 'show' );
559
+
560
+ //Restore the image
561
+ $.post(ajaxurl, params, function (r) {
562
+
563
+ progress_bar( current_button, wp_smush_msgs.smushing, 'hide' );
564
+
565
+ //reset all functionality
566
+ enable_links( current_button );
567
+
568
+ if (r.success && 'undefined' != typeof( r.data.button ) ) {
569
+ //Show the smush button, and remove stats and restore option
570
+ current_button.parents().eq(1).html(r.data.button);
571
+ } else {
572
+ if(r.data.message ) {
573
+ //show error
574
+ current_button.parent().append(r.data.message);
575
+ }
576
+ }
577
+ })
578
+ };
579
 
580
+ /**
581
+ * Handle the Smush Stats link click
582
+ */
583
+ $('body').on('click', 'a.smush-stats-details', function (e) {
584
+
585
+ //If disabled
586
+ if( 'disabled' == $(this).attr('disabled') ) {
587
+ return false;
588
+ }
589
+
590
+ // prevent the default action
591
+ e.preventDefault();
592
+ //Replace the `+` with a `-`
593
+ var slide_symbol = $(this).find('.stats-toggle');
594
+ $(this).parents().eq(1).find('.smush-stats-wrapper').slideToggle();
595
+ slide_symbol.text(slide_symbol.text() == '+' ? '-' : '+');
596
+
597
+
598
+ });
599
 
600
+ /** Handle smush button click **/
601
+ $('body').on('click', '.wp-smush-send:not(.wp-smush-resmush)', function (e) {
602
+
603
+ // prevent the default action
604
+ e.preventDefault();
605
+ new WP_Smush.Smush($(this), false);
606
+ });
607
+
608
+ /** Handle NextGen Gallery smush button click **/
609
+ $('body').on('click', '.wp-smush-nextgen-send', function (e) {
610
+
611
+ // prevent the default action
612
+ e.preventDefault();
613
+ new WP_Smush.Smush($(this), false, 'nextgen');
614
+ });
615
 
616
+ /** Handle NextGen Gallery Bulk smush button click **/
617
+ $('body').on('click', '.wp-smush-nextgen-bulk', function (e) {
 
 
 
618
 
619
+ // prevent the default action
620
+ e.preventDefault();
621
 
622
+ //Check for ids, if there is none (Unsmushed or lossless), don't call smush function
623
+ if (typeof wp_smushit_data == 'undefined' ||
624
+ ( wp_smushit_data.unsmushed.length == 0 && wp_smushit_data.resmush.length == 0 )
625
+ ) {
626
 
627
+ return false;
 
 
 
628
 
629
+ }
 
630
 
631
+ jQuery('.wp-smush-button, .wp-smush-scan').attr('disabled', 'disabled');
632
+ $(".wp-smush-notice.wp-smush-remaining").hide();
633
+ new WP_Smush.Smush($(this), true, 'nextgen');
634
+
635
+ });
636
 
637
+ /** Restore: Media Library **/
638
+ $('body').on('click', '.wp-smush-action.wp-smush-restore', function (e) {
639
+ var current_button = $(this);
640
+ var smush_action = 'smush_restore_image';
641
+ process_smush_action( e, current_button, smush_action );
642
+ });
643
 
644
+ /** Resmush: Media Library **/
645
+ $('body').on('click', '.wp-smush-action.wp-smush-resmush', function (e) {
646
+ var current_button = $(this);
647
+ var smush_action = 'smush_resmush_image';
648
+ process_smush_action( e, current_button, smush_action );
649
+ });
650
 
651
+ /** Restore: NextGen Gallery **/
652
+ $('body').on('click', '.wp-smush-action.wp-smush-nextgen-restore', function (e) {
653
+ var current_button = $(this);
654
+ var smush_action = 'smush_restore_nextgen_image';
655
+ process_smush_action( e, current_button, smush_action );
656
+ });
657
 
658
+ /** Resmush: NextGen Gallery **/
659
+ $('body').on('click', '.wp-smush-action.wp-smush-nextgen-resmush', function (e) {
660
+ var current_button = $(this);
661
+ var smush_action = 'smush_resmush_nextgen_image';
662
+ process_smush_action( e, current_button, smush_action );
663
+ });
664
 
665
+ //Scan For resmushing images
666
+ $('body').on('click', '.wp-smush-scan', function(e) {
667
 
668
+ e.preventDefault();
669
+
670
+ var button = jQuery(this);
671
+ var spinner = button.parent().find('.spinner');
672
+
673
+ //Check if type is set in data attributes
674
+ var scan_type = button.data('type');
675
+ scan_type = 'undefined' == typeof scan_type ? 'media' : scan_type;
676
+
677
+ //Show spinner
678
+ spinner.addClass('is-active');
679
+
680
+ //Remove the Skip resmush attribute from button
681
+ $('button.wp-smush-all').removeAttr('data-smush');
682
+
683
+ //remove notices
684
+ var el = $('.wp-smush-notice.wp-smush-resmush-message, .wp-smush-notice.wp-smush-settings-updated');
685
+ el.slideUp(100, function () {
686
+ el.remove();
687
+ });
688
+
689
+ //Disable Bulk smush button and itself
690
+ button.attr('disabled', 'disabled');
691
+ $('.wp-smush-button' ).attr('disabled', 'disabled');
692
+
693
+ //Hide Settings changed Notice
694
+ $('.wp-smush-settings-changed').hide();
695
+
696
+ //Show Loading Animation
697
+ jQuery('.bulk-resmush-wrapper .wp-smush-progress-bar-wrap').removeClass('hidden');
698
+
699
+ //Ajax Params
700
+ var params = {
701
+ action: 'scan_for_resmush',
702
+ type: scan_type,
703
+ get_ui: true,
704
+ wp_smush_options_nonce: jQuery('#wp_smush_options_nonce').val()
705
+ };
706
+
707
+ //Send ajax request and get ids if any
708
+ $.get(ajaxurl, params, function (r) {
709
+ //Check if we have the ids, initialize the local variable
710
+ if( 'undefined' != typeof r.data ) {
711
+ //Update Resmush id list
712
+ if( 'undefined' != typeof r.data.resmush_ids ) {
713
+ wp_smushit_data.resmush = r.data.resmush_ids;
714
+
715
+ //Get the Smushed image count
716
+ var smushed_count = wp_smushit_data.count_smushed - r.data.resmush_ids.length;
717
+
718
+ //Update it in stats bar
719
+ $('.smush-attachments .wp-smush-stats .smushed-count, .wp-smush-images-smushed').html(smushed_count);
720
+
721
+ //Hide the Existing wrapper
722
+ var notices = $('.bulk-smush-wrapper .wp-smush-notice');
723
+ if (notices.length > 0) {
724
+ notices.hide();
725
+ }
726
+ //remove existing Re-Smush notices
727
+ $('.wp-smush-resmush-notice').remove();
728
+
729
+ //Show Bulk wrapper
730
+ $('.wp-smush-bulk-wrapper').show();
731
+ }
732
+ //If content is received, Prepend it
733
+ if ('undefined' != typeof r.data.content) {
734
+ $('.bulk-smush-wrapper .box-container').prepend(r.data.content);
735
+ }
736
+ //If we have any notice to show
737
+ if ('undefined' != typeof r.data.notice ) {
738
+ $('.wp-smush-page-header').after(r.data.notice);
739
+ }
740
+ }
741
+
742
+ }).always( function() {
743
+
744
+ //Hide the progress bar
745
+ jQuery('.bulk-smush-wrapper .wp-smush-bulk-progress-bar-wrapper').hide();
746
+
747
+ //Enable the Bulk Smush Button and itself
748
+ button.removeAttr('disabled');
749
+
750
+ //Hide Spinner
751
+ spinner.removeClass('is-active');
752
+ $('.wp-smush-button').removeAttr('disabled');
753
+ });
754
+
755
+ });
756
+
757
+ //Dismiss Welcome notice
758
+ $('#wp-smush-welcome-box .smush-dismiss-welcome').on('click', function(e) {
759
  e.preventDefault();
760
  var $el = $(this).parents().eq(1);
761
+ $el.fadeTo( 100, 0, function() {
762
+ $el.slideUp( 100, function() {
763
+ $el.remove();
764
+ });
765
+ });
766
+ //Send a ajax request to save the dismissed notice option
767
+ var param = {
768
+ action: 'dismiss_welcome_notice'
769
+ };
770
+ $.post(ajaxurl, param );
771
+ });
772
 
773
+ //Remove Notice
774
+ $('body').on('click', '.wp-smush-notice .dev-icon-cross', function(e) {
775
+ e.preventDefault();
776
+ var $el = $(this).parent();
777
  $el.fadeTo( 100, 0, function() {
778
  $el.slideUp( 100, function() {
779
  $el.remove();
780
  });
781
  });
782
+ });
783
+
784
+ //On Click Update Settings. Check for change in settings
785
+ $('#wp-smush-save-settings').on('click', function(e) {
786
+ e.preventDefault();
787
 
788
+ var self = $(this);
789
+ //Update text
790
+ self.attr('disabled', 'disabled').addClass('button-grey').val( wp_smush_msgs.checking );
791
+ self.parent().find('.spinner').addClass('is-active');
792
+
793
+ //Check if type is set in data attributes
794
+ var scan_type = self.data('type');
795
+ scan_type = 'undefined' == typeof scan_type ? 'media' : scan_type;
796
+
797
+ //Ajax param
798
+ var param = {
799
+ action: 'scan_for_resmush',
800
+ scan_type: scan_type
801
+ };
802
+
803
+ param = jQuery.param( param ) + '&' + jQuery('form#wp-smush-settings-form').serialize();
804
+
805
+ //Send ajax, Update Settings, And Check For resmush
806
+ jQuery.post(ajaxurl, param).done(function () {
807
+ jQuery('form#wp-smush-settings-form').submit();
808
+ return true;
809
+ });
810
+ });
811
+
812
+ //On Resmush click
813
+ $('body').on('click', '.wp-smush-skip-resmush', function (e) {
814
+ e.preventDefault();
815
+ var self = jQuery(this);
816
+ var container = self.parents().eq(1);
817
+
818
+ //Remove Parent div
819
+ var $el = self.parent();
820
+ $el.fadeTo( 100, 0, function() {
821
+ $el.slideUp( 100, function() {
822
+ $el.remove();
823
+ });
824
+ });
825
+
826
+ //Remove Settings Notice
827
+ $('.wp-smush-notice.wp-smush-settings-updated').remove();
828
+
829
+ //Set button attribute to skip re-smush ids
830
+ container.find('.wp-smush-all').attr('data-smush', 'skip_resmush');
831
+
832
+ //Update Stats
833
+ if( wp_smushit_data.count_smushed == wp_smushit_data.count_total ) {
834
+
835
+ //Show all done notice
836
+ $('.wp-smush-notice.wp-smush-all-done').show();
837
+
838
+ //Hide Smush button
839
+ $('.wp-smush-bulk-wrapper ').hide()
840
+
841
+ }
842
+ //Remove Re-Smush Notice
843
+ $('.wp-smush-resmush-notice').remove();
844
+
845
+ var type = $('.wp-smush-scan').data('type');
846
+ type = 'undefined' == typeof type ? 'media' : type;
847
+
848
+ var smushed_count = 'undefined' != typeof wp_smushit_data.count_smushed ? wp_smushit_data.count_smushed : 0
849
+ $('.smush-attachments .wp-smush-stats .smushed-count, .wp-smush-images-smushed').html(smushed_count);
850
+
851
+ //Show the default bulk smush notice
852
+ $('.wp-smush-bulk-wrapper .wp-smush-notice').removeClass('hidden');
853
+
854
+ var params = {
855
+ action: 'delete_resmush_list',
856
+ type: type
857
+ }
858
+ //Delete resmush list
859
+ $.post(ajaxurl, params);
860
+
861
+ });
862
+
863
+ //Enable Super Smush
864
+ $('.wp-smush-lossy-enable').on('click', function (e) {
865
+ e.preventDefault();
866
+
867
+ //Enable Super Smush
868
+ $('#wp-smush-lossy').prop('checked', true);
869
+ //Induce Setting button save click
870
+ $('#wp-smush-save-settings').click();
871
+ });
872
+
873
+ //Trigger Bulk
874
+ $('body').on('click', '.wp-smush-trigger-bulk', function (e) {
875
+ e.preventDefault();
876
+ //Induce Setting button save click
877
+ $('button.wp-smush-all').click();
878
+
879
+ });
880
+
881
+ //Dismiss Install/Upgrade notice
882
+ $('#wp-smush-install-thanks .smush-dismiss-welcome').on('click', function(e) {
883
+ e.preventDefault();
884
+ var $el = $(this).parents().eq(2);
885
+ $el.fadeTo( 100, 0, function() {
886
+ $el.slideUp( 100, function() {
887
+ $el.remove();
888
+ });
889
+ });
890
  //Send a ajax request to save the dismissed notice option
891
  var param = {
892
+ action: 'dismiss_upgrade_notice'
893
  };
894
  $.post(ajaxurl, param );
 
895
  });
896
 
897
  });
898
  (function ($) {
899
+ var Smush = function (element, options) {
900
+ var elem = $(element);
901
+
902
+ var defaults = {
903
+ isSingle: false,
904
+ ajaxurl: '',
905
+ msgs: {},
906
+ msgClass: 'wp-smush-msg',
907
+ ids: []
908
+ };
909
+ };
910
+ $.fn.wpsmush = function (options) {
911
+ return this.each(function () {
912
+ var element = $(this);
 
 
 
 
 
 
 
 
 
 
 
 
913
 
914
+ // Return early if this element already has a plugin instance
915
+ if (element.data('wpsmush'))
916
+ return;
917
+
918
+ // pass options to plugin constructor and create a new instance
919
+ var wpsmush = new Smush(this, options);
920
 
921
+ // Store plugin object in this element's data
922
+ element.data('wpsmush', wpsmush);
923
+ });
924
+ };
925
+
926
+ })(jQuery);
assets/shared-ui/font/WPMU DEV Dashboard.json ADDED
@@ -0,0 +1,1396 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "metadata": {
3
+ "name": "WPMU DEV Dashboard",
4
+ "lastOpened": 1446220177291,
5
+ "created": 1446220144047
6
+ },
7
+ "iconSets": [
8
+ {
9
+ "selection": [
10
+ {
11
+ "order": 77,
12
+ "id": 70,
13
+ "name": "comment",
14
+ "prevSize": 32,
15
+ "code": 65,
16
+ "tempChar": ""
17
+ },
18
+ {
19
+ "order": 45,
20
+ "id": 8,
21
+ "prevSize": 32,
22
+ "code": 109,
23
+ "name": "speach",
24
+ "tempChar": ""
25
+ },
26
+ {
27
+ "id": 21,
28
+ "order": 40,
29
+ "prevSize": 32,
30
+ "code": 61,
31
+ "name": "speach_alt",
32
+ "tempChar": ""
33
+ },
34
+ {
35
+ "order": 81,
36
+ "id": 68,
37
+ "name": "download",
38
+ "prevSize": 32,
39
+ "code": 66,
40
+ "tempChar": ""
41
+ },
42
+ {
43
+ "id": 32,
44
+ "order": 10,
45
+ "prevSize": 32,
46
+ "code": 105,
47
+ "name": "download_alt",
48
+ "tempChar": ""
49
+ },
50
+ {
51
+ "order": 101,
52
+ "id": 50,
53
+ "name": "upload",
54
+ "prevSize": 32,
55
+ "code": 86,
56
+ "tempChar": ""
57
+ },
58
+ {
59
+ "order": 82,
60
+ "id": 67,
61
+ "name": "error",
62
+ "prevSize": 32,
63
+ "code": 69,
64
+ "tempChar": ""
65
+ },
66
+ {
67
+ "order": 90,
68
+ "id": 63,
69
+ "name": "archive",
70
+ "prevSize": 32,
71
+ "code": 79,
72
+ "tempChar": ""
73
+ },
74
+ {
75
+ "id": 19,
76
+ "order": 25,
77
+ "prevSize": 32,
78
+ "code": 57,
79
+ "name": "logo",
80
+ "tempChar": ""
81
+ },
82
+ {
83
+ "id": 20,
84
+ "order": 26,
85
+ "prevSize": 32,
86
+ "code": 48,
87
+ "name": "logo_alt",
88
+ "tempChar": ""
89
+ },
90
+ {
91
+ "order": 95,
92
+ "id": 48,
93
+ "name": "wordpress",
94
+ "prevSize": 32,
95
+ "code": 71,
96
+ "tempChar": ""
97
+ },
98
+ {
99
+ "order": 85,
100
+ "id": 66,
101
+ "name": "facebook",
102
+ "prevSize": 32,
103
+ "code": 70,
104
+ "tempChar": ""
105
+ },
106
+ {
107
+ "order": 88,
108
+ "id": 51,
109
+ "name": "twitter",
110
+ "prevSize": 32,
111
+ "code": 73,
112
+ "tempChar": ""
113
+ },
114
+ {
115
+ "order": 89,
116
+ "id": 64,
117
+ "name": "github",
118
+ "prevSize": 32,
119
+ "code": 74,
120
+ "tempChar": ""
121
+ },
122
+ {
123
+ "order": 83,
124
+ "id": 54,
125
+ "name": "stackoverflow",
126
+ "prevSize": 32,
127
+ "code": 75,
128
+ "tempChar": ""
129
+ },
130
+ {
131
+ "order": 94,
132
+ "id": 61,
133
+ "name": "linkedin",
134
+ "prevSize": 32,
135
+ "code": 76,
136
+ "tempChar": ""
137
+ },
138
+ {
139
+ "order": 97,
140
+ "id": 60,
141
+ "name": "medium",
142
+ "prevSize": 32,
143
+ "code": 77,
144
+ "tempChar": ""
145
+ },
146
+ {
147
+ "order": 100,
148
+ "id": 57,
149
+ "name": "quora",
150
+ "prevSize": 32,
151
+ "code": 81,
152
+ "tempChar": ""
153
+ },
154
+ {
155
+ "order": 104,
156
+ "id": 73,
157
+ "name": "seo",
158
+ "prevSize": 32,
159
+ "code": 83,
160
+ "tempChar": ""
161
+ },
162
+ {
163
+ "order": 98,
164
+ "id": 59,
165
+ "name": "minify",
166
+ "prevSize": 32,
167
+ "code": 78,
168
+ "tempChar": ""
169
+ },
170
+ {
171
+ "order": 92,
172
+ "id": 49,
173
+ "name": "uptime",
174
+ "prevSize": 32,
175
+ "code": 85,
176
+ "tempChar": ""
177
+ },
178
+ {
179
+ "order": 96,
180
+ "id": 47,
181
+ "name": "world",
182
+ "prevSize": 32,
183
+ "code": 87,
184
+ "tempChar": ""
185
+ },
186
+ {
187
+ "order": 50,
188
+ "id": 3,
189
+ "prevSize": 32,
190
+ "code": 89,
191
+ "name": "pos_footer",
192
+ "tempChar": ""
193
+ },
194
+ {
195
+ "order": 49,
196
+ "id": 4,
197
+ "prevSize": 32,
198
+ "code": 88,
199
+ "name": "pos_middle",
200
+ "tempChar": ""
201
+ },
202
+ {
203
+ "order": 48,
204
+ "id": 5,
205
+ "prevSize": 32,
206
+ "code": 67,
207
+ "name": "pos_header",
208
+ "tempChar": ""
209
+ },
210
+ {
211
+ "order": 43,
212
+ "id": 6,
213
+ "prevSize": 32,
214
+ "code": 98,
215
+ "name": "book",
216
+ "tempChar": ""
217
+ },
218
+ {
219
+ "order": 46,
220
+ "id": 9,
221
+ "prevSize": 32,
222
+ "code": 110,
223
+ "name": "support",
224
+ "tempChar": ""
225
+ },
226
+ {
227
+ "id": 33,
228
+ "order": 11,
229
+ "prevSize": 32,
230
+ "code": 106,
231
+ "name": "rocket",
232
+ "tempChar": ""
233
+ },
234
+ {
235
+ "order": 52,
236
+ "id": 7,
237
+ "prevSize": 32,
238
+ "code": 118,
239
+ "name": "rocket_alt",
240
+ "tempChar": ""
241
+ },
242
+ {
243
+ "id": 25,
244
+ "order": 3,
245
+ "prevSize": 32,
246
+ "code": 97,
247
+ "name": "lock",
248
+ "tempChar": ""
249
+ },
250
+ {
251
+ "id": 26,
252
+ "order": 4,
253
+ "prevSize": 32,
254
+ "code": 99,
255
+ "name": "unlock",
256
+ "tempChar": ""
257
+ },
258
+ {
259
+ "id": 27,
260
+ "order": 5,
261
+ "prevSize": 32,
262
+ "code": 100,
263
+ "name": "plugin",
264
+ "tempChar": ""
265
+ },
266
+ {
267
+ "id": 39,
268
+ "order": 17,
269
+ "prevSize": 32,
270
+ "code": 114,
271
+ "name": "caret_up",
272
+ "tempChar": ""
273
+ },
274
+ {
275
+ "order": 103,
276
+ "id": 71,
277
+ "name": "caret_right",
278
+ "prevSize": 32,
279
+ "code": 51,
280
+ "tempChar": ""
281
+ },
282
+ {
283
+ "id": 28,
284
+ "order": 6,
285
+ "prevSize": 32,
286
+ "code": 101,
287
+ "name": "caret_down",
288
+ "tempChar": ""
289
+ },
290
+ {
291
+ "order": 102,
292
+ "id": 72,
293
+ "name": "caret_left",
294
+ "prevSize": 32,
295
+ "code": 124,
296
+ "tempChar": ""
297
+ },
298
+ {
299
+ "id": 29,
300
+ "order": 7,
301
+ "prevSize": 32,
302
+ "code": 102,
303
+ "name": "power",
304
+ "tempChar": ""
305
+ },
306
+ {
307
+ "id": 31,
308
+ "order": 9,
309
+ "prevSize": 32,
310
+ "code": 104,
311
+ "name": "radio_default, radio",
312
+ "tempChar": ""
313
+ },
314
+ {
315
+ "id": 30,
316
+ "order": 8,
317
+ "prevSize": 32,
318
+ "code": 103,
319
+ "name": "radio_checked",
320
+ "tempChar": ""
321
+ },
322
+ {
323
+ "id": 45,
324
+ "order": 23,
325
+ "prevSize": 32,
326
+ "code": 121,
327
+ "name": "cross",
328
+ "tempChar": ""
329
+ },
330
+ {
331
+ "id": 46,
332
+ "order": 24,
333
+ "prevSize": 32,
334
+ "code": 122,
335
+ "name": "tick",
336
+ "tempChar": ""
337
+ },
338
+ {
339
+ "id": 34,
340
+ "order": 12,
341
+ "prevSize": 32,
342
+ "code": 107,
343
+ "name": "search",
344
+ "tempChar": ""
345
+ },
346
+ {
347
+ "id": 37,
348
+ "order": 15,
349
+ "prevSize": 32,
350
+ "code": 112,
351
+ "name": "info",
352
+ "tempChar": ""
353
+ },
354
+ {
355
+ "id": 10,
356
+ "order": 41,
357
+ "prevSize": 32,
358
+ "code": 49,
359
+ "name": "devman",
360
+ "tempChar": ""
361
+ },
362
+ {
363
+ "id": 16,
364
+ "order": 35,
365
+ "prevSize": 32,
366
+ "code": 55,
367
+ "name": "upfront",
368
+ "tempChar": ""
369
+ },
370
+ {
371
+ "order": 93,
372
+ "id": 62,
373
+ "name": "hummingbird",
374
+ "prevSize": 32,
375
+ "code": 72,
376
+ "tempChar": ""
377
+ },
378
+ {
379
+ "order": 80,
380
+ "id": 69,
381
+ "name": "defender",
382
+ "prevSize": 32,
383
+ "code": 68,
384
+ "tempChar": ""
385
+ },
386
+ {
387
+ "id": 35,
388
+ "order": 13,
389
+ "prevSize": 32,
390
+ "code": 108,
391
+ "name": "theme",
392
+ "tempChar": ""
393
+ },
394
+ {
395
+ "order": 99,
396
+ "id": 58,
397
+ "name": "pencil",
398
+ "prevSize": 32,
399
+ "code": 80,
400
+ "tempChar": ""
401
+ },
402
+ {
403
+ "order": 84,
404
+ "id": 53,
405
+ "name": "star",
406
+ "prevSize": 32,
407
+ "code": 90,
408
+ "tempChar": ""
409
+ },
410
+ {
411
+ "order": 87,
412
+ "id": 52,
413
+ "name": "trash",
414
+ "prevSize": 32,
415
+ "code": 84,
416
+ "tempChar": ""
417
+ },
418
+ {
419
+ "order": 78,
420
+ "id": 56,
421
+ "name": "recycle",
422
+ "prevSize": 32,
423
+ "code": 82,
424
+ "tempChar": ""
425
+ },
426
+ {
427
+ "order": 86,
428
+ "id": 65,
429
+ "name": "fix",
430
+ "prevSize": 32,
431
+ "code": 50,
432
+ "tempChar": ""
433
+ },
434
+ {
435
+ "id": 36,
436
+ "order": 14,
437
+ "prevSize": 32,
438
+ "code": 111,
439
+ "name": "edit",
440
+ "tempChar": ""
441
+ },
442
+ {
443
+ "id": 40,
444
+ "order": 18,
445
+ "prevSize": 32,
446
+ "code": 115,
447
+ "name": "options",
448
+ "tempChar": ""
449
+ },
450
+ {
451
+ "id": 41,
452
+ "order": 19,
453
+ "prevSize": 32,
454
+ "code": 116,
455
+ "name": "cog",
456
+ "tempChar": ""
457
+ },
458
+ {
459
+ "id": 38,
460
+ "order": 47,
461
+ "prevSize": 32,
462
+ "code": 113,
463
+ "name": "badge",
464
+ "tempChar": ""
465
+ },
466
+ {
467
+ "id": 42,
468
+ "order": 20,
469
+ "prevSize": 32,
470
+ "code": 117,
471
+ "name": "cylinder",
472
+ "tempChar": ""
473
+ },
474
+ {
475
+ "id": 44,
476
+ "order": 22,
477
+ "prevSize": 32,
478
+ "code": 120,
479
+ "name": "trophy",
480
+ "tempChar": ""
481
+ },
482
+ {
483
+ "id": 43,
484
+ "order": 21,
485
+ "prevSize": 32,
486
+ "code": 119,
487
+ "name": "bell",
488
+ "tempChar": ""
489
+ }
490
+ ],
491
+ "id": 3,
492
+ "metadata": {
493
+ "name": "WPMU DEV App Icons",
494
+ "importSize": {
495
+ "width": 32,
496
+ "height": 32
497
+ }
498
+ },
499
+ "height": 1024,
500
+ "prevSize": 32,
501
+ "icons": [
502
+ {
503
+ "id": 70,
504
+ "paths": [
505
+ "M0 190.573c0.213-105.296 85.621-190.573 190.947-190.573 0.066 0 0.132 0 0.198 0l666.058-0c0.056-0 0.122-0 0.188-0 105.325 0 190.734 85.277 190.947 190.552l0 492.364c0 105.354-85.406 190.76-190.76 190.76h-38.938l-60.279 149.762-146.018-149.762h-421.955c-105.17-0.107-190.385-85.388-190.385-190.572 0-0.066 0-0.132 0-0.198l-0-492.333z"
506
+ ],
507
+ "attrs": [],
508
+ "isMulticolor": false,
509
+ "width": 1048,
510
+ "grid": 0,
511
+ "tags": [
512
+ "comment"
513
+ ],
514
+ "colorPermutations": {}
515
+ },
516
+ {
517
+ "id": 8,
518
+ "paths": [
519
+ "M699.206 370.919h-345.743c-13.632 0-24.696 11.014-24.696 24.696 0 13.632 11.064 24.696 24.696 24.696h345.743c13.632 0 24.696-11.064 24.696-24.696 0-13.682-11.064-24.696-24.696-24.696z",
520
+ "M699.206 667.271h-345.743c-13.632 0-24.696 11.014-24.696 24.696 0 13.632 11.064 24.696 24.696 24.696h345.743c13.632 0 24.696-11.064 24.696-24.696 0-13.682-11.064-24.696-24.696-24.696z",
521
+ "M699.206 519.095h-345.743c-13.632 0-24.696 11.014-24.696 24.696 0 13.632 11.064 24.696 24.696 24.696h345.743c13.632 0 24.696-11.064 24.696-24.696 0-13.682-11.064-24.696-24.696-24.696z",
522
+ "M501.639 28.88c-272.742 0-493.919 221.226-493.919 493.919 0 109.897 35.908 211.447 96.611 293.437l-51.318 177.218 175.983-58.727c78.089 51.911 171.884 81.991 272.643 81.991 272.742 0 493.919-221.078 493.919-493.919 0-272.693-221.177-493.919-493.919-493.919v0zM501.639 917.935c-78.138 0-153.461-22.671-217.917-65.494-16.398-10.916-35.463-16.497-54.726-16.497-9.681 0-19.362 1.432-28.845 4.297 7.162-28.598 1.185-59.023-16.398-82.781-50.528-68.21-77.249-149.312-77.249-234.661 0-217.868 177.268-395.135 395.135-395.135s395.135 177.268 395.135 395.135c0 217.868-177.268 395.135-395.135 395.135v0z"
523
+ ],
524
+ "attrs": [],
525
+ "isMulticolor": false,
526
+ "grid": 0,
527
+ "tags": [
528
+ "speach"
529
+ ],
530
+ "colorPermutations": {}
531
+ },
532
+ {
533
+ "id": 21,
534
+ "paths": [
535
+ "M558 778c-42 14-86 22-134 22-26 0-50-2-76-8-22 20-74 52-150 58-2 2-2 2-4 2-6 0-14-4-4-8 22-14 62-40 62-80-120-52-202-156-202-276 0-174 168-314 374-314 156 0 290 80 346 194 22 2 42 8 60 14-52-148-214-258-406-258-234 0-424 164-424 364 0 120 70 232 186 298-6 6-14 10-22 14-28 16-32 42-28 60 6 20 24 42 58 42 2 0 6-2 8-2 74-6 128-32 160-54 20 2 42 4 62 4 70 0 134-16 192-40-22-8-42-18-58-32zM732 390c138 0 248 94 248 208 0 82-54 152-134 186 10 28 40 50 58 60 10 4 2 8-4 8-2 0-2 0-4-2-62-4-108-26-134-46-10 2-20 2-30 2-138 0-250-92-250-208 0-114 112-208 250-208zM732 340c-166 0-300 116-300 258s134 258 300 258c4 0 10 0 18 0 32 20 80 40 142 44 2 0 4 2 8 2 34 0 52-22 58-42 4-18 0-44-30-60-2-2-2-2-4-4 66-48 106-120 106-198 0-142-134-258-298-258z"
536
+ ],
537
+ "attrs": [],
538
+ "isMulticolor": false,
539
+ "tags": [
540
+ "speach_alt",
541
+ "comment"
542
+ ],
543
+ "defaultCode": 57345,
544
+ "grid": 0,
545
+ "colorPermutations": {}
546
+ },
547
+ {
548
+ "id": 68,
549
+ "paths": [
550
+ "M1050.836 1024h-749.992c-0.424 0.002-0.925 0.003-1.426 0.003-15.013 0-29.805-0.942-44.322-2.77-117.762-14.242-218.304-105.483-247.147-224.715-3.005-14.041-5.359-25.576-7.949-36.169v-69.208c-0.121 0.517 1.417-1.772 2.319-4.359 11.525-110.342 91.606-206.428 199.228-241.984 7.938-1.803 12.284-6.922 12.284-13.057 0-1.006-0.117-1.986-0.338-2.925 0.011-0.63 0.007-1.476 0.007-2.323 0-163.941 132.901-296.842 296.842-296.842 20.495 0 40.506 2.077 59.832 6.032-0.203 0.254 1.768 0.59 3.817 0.59 6.46 0 12.14-3.336 15.413-8.378 26.059-43.611 96.992-96.055 180.393-117.272-11.657 2.522 15.599-5.389 44.039-9.689 10.816-1.059 21.262-1.533 31.817-1.533 18.246 0 36.161 1.416 53.642 4.144 69.441 4.088 148.797 45.322 204.691 107.946 55.785 58.363 89.947 137.21 89.947 224.035 0 13.662-0.846 27.126-2.488 40.343-0.163-0.309-0.348 1.151-0.348 2.653 0 6.791 3.784 12.699 9.359 15.729 68.861 34.597 134.23 117.504 155.763 216.754-1.424-7.797 3.362 11.618 5.916 31.73 1.696 13.937 2.586 28.537 2.586 43.344s-0.889 29.407-2.618 43.748c-15.395 134.38-118.284 249.368-253.362 283.546-10.044 3.904-33.128 8.976-57.16 10.586zM780.359 317.793h-146.42c-12.397 1.14-22.314 11.010-23.532 23.433l-0.009 194.314c-0.974 12.508-10.94 22.506-23.448 23.534l-99.432 0.006c-14.36 0-48.493 0 0 48.728l195.149 196.326c6.226 6.256 14.843 10.128 24.364 10.128s18.139-3.872 24.363-10.127l195.15-194.914c49.199-49.199 11.535-48.728 0-48.728h-97.692c-13.001 0-23.54-10.539-23.54-23.54v-195.384c-0.63-13.496-11.616-24.24-25.165-24.482z"
551
+ ],
552
+ "attrs": [],
553
+ "isMulticolor": false,
554
+ "width": 1365,
555
+ "grid": 0,
556
+ "tags": [
557
+ "download"
558
+ ],
559
+ "colorPermutations": {}
560
+ },
561
+ {
562
+ "id": 32,
563
+ "paths": [
564
+ "M753.6 848c-174.4 0-318.4 0-492.8 0-16 0-27.2-1.6-28.8-1.6-80-11.2-145.6-70.4-163.2-150.4-1.6-8-3.2-14.4-4.8-22.4 0-14.4 0-30.4 0-44.8 0-1.6 1.6-1.6 1.6-3.2 12.8-78.4 57.6-131.2 132.8-160 6.4-1.6 6.4-4.8 6.4-9.6-1.6-123.2 112-217.6 233.6-193.6 6.4 1.6 9.6 0 14.4-4.8 32-38.4 72-64 120-76.8 9.6-1.6 19.2-4.8 28.8-6.4 25.6-3.2 52.8 1.6 54.4 1.6 54.4 8 99.2 30.4 136 70.4 44.8 49.6 64 105.6 57.6 172.8 0 6.4 1.6 9.6 6.4 12.8 54.4 33.6 88 81.6 102.4 144 1.6 8 3.2 12.8 3.2 20.8 3.2 28.8 0 54.4 0 56-12.8 91.2-78.4 164.8-168 188.8-12.8 3.2-27.2 6.4-40 6.4zM560 400c-32 0-73.6 0-96 0-8 0-16 8-16 16 0 43.2 0 84.8 0 128 0 9.6-8 16-16 16-27.2 0-38.4 0-64 0-9.6 0-32 0 0 32 44.8 44.8 84.8 84.8 128 128 8 8 22.4 9.6 32 0 43.2-43.2 84.8-84.8 128-128 32-32 8-32 0-32-16 0-48 0-64 0-9.6 0-16-8-16-16 0-48 0-80 0-128 0-9.6-8-16-16-16z"
565
+ ],
566
+ "attrs": [],
567
+ "isMulticolor": false,
568
+ "tags": [
569
+ "download"
570
+ ],
571
+ "defaultCode": 105,
572
+ "grid": 0,
573
+ "colorPermutations": {}
574
+ },
575
+ {
576
+ "id": 50,
577
+ "paths": [
578
+ "M1050.836 1024h-749.992c-0.424 0.002-0.925 0.003-1.426 0.003-15.013 0-29.805-0.942-44.322-2.77-117.762-14.242-218.304-105.483-247.147-224.715-3.005-14.041-5.359-25.576-7.949-36.169v-69.208c-0.121 0.517 1.417-1.772 2.319-4.359 11.525-110.342 91.606-206.428 199.228-241.984 7.938-1.803 12.284-6.922 12.284-13.057 0-1.006-0.117-1.986-0.338-2.925 0.011-0.63 0.007-1.476 0.007-2.323 0-163.941 132.901-296.842 296.842-296.842 20.495 0 40.506 2.077 59.832 6.032-0.203 0.254 1.768 0.59 3.817 0.59 6.46 0 12.14-3.336 15.413-8.378 26.059-43.611 96.992-96.055 180.393-117.272-11.657 2.522 15.599-5.389 44.039-9.689 10.816-1.059 21.262-1.533 31.817-1.533 18.246 0 36.161 1.416 53.642 4.144 69.441 4.088 148.797 45.322 204.691 107.946 55.785 58.363 89.947 137.21 89.947 224.035 0 13.662-0.846 27.126-2.488 40.343-0.163-0.309-0.348 1.151-0.348 2.653 0 6.791 3.784 12.699 9.359 15.729 68.861 34.597 134.23 117.504 155.763 216.754-1.424-7.797 3.362 11.618 5.916 31.73 1.696 13.937 2.586 28.537 2.586 43.344s-0.889 29.407-2.618 43.748c-15.395 134.38-118.284 249.368-253.362 283.546-10.044 3.904-33.128 8.976-57.16 10.586zM633.468 814.257h146.185c12.397-1.14 22.314-11.010 23.532-23.433l0.009-195.727c0.974-12.508 10.94-22.506 23.448-23.534l97.549-0.006c14.36 0 48.493 0 0-48.728l-195.149-194.913c-6.226-6.256-14.843-10.128-24.364-10.128s-18.139 3.872-24.363 10.127l-195.15 194.914c-49.199 49.199-11.535 48.728 0 48.728h97.457c13.001 0 23.54 10.539 23.54 23.54v194.913c0.741 13.575 11.929 24.302 25.623 24.302 0.592 0 1.18-0.020 1.763-0.060z"
579
+ ],
580
+ "attrs": [],
581
+ "isMulticolor": false,
582
+ "width": 1365,
583
+ "grid": 0,
584
+ "tags": [
585
+ "upload"
586
+ ],
587
+ "colorPermutations": {}
588
+ },
589
+ {
590
+ "id": 67,
591
+ "paths": [
592
+ "M1133.686 927.114l-507.668-894.818c-10.931-19.443-31.427-32.362-54.942-32.362s-44.011 12.919-54.779 32.047l-507.831 895.133c-5.349 9.287-8.504 20.423-8.504 32.295s3.155 23.008 8.673 32.615c10.799 19.015 31.273 31.902 54.762 31.976l1015.346 0c23.439-0.050 43.924-12.919 54.778-31.984 5.512-9.599 8.667-20.734 8.667-32.607s-3.155-23.008-8.673-32.615zM571.077 899.545c-47.431-2.299-85.016-41.314-85.016-89.108s37.585-86.808 84.811-89.1c47.636 2.291 85.221 41.306 85.221 89.1s-37.585 86.808-84.811 89.1zM640.985 606.523c-1.182 27.372-31.311 48.443-71.089 48.443s-67.545-21.071-68.726-48.443c-6.105-98.462-19.692-275.692-19.692-294.006 0-36.037 39.385-64.197 90.388-64.197s86.843 28.16 86.843 64.197c0.591 17.526-11.422 196.135-17.526 293.809z"
593
+ ],
594
+ "attrs": [],
595
+ "isMulticolor": false,
596
+ "width": 1142,
597
+ "grid": 0,
598
+ "tags": [
599
+ "error",
600
+ "warning"
601
+ ],
602
+ "colorPermutations": {}
603
+ },
604
+ {
605
+ "id": 63,
606
+ "paths": [
607
+ "M382.025 694.59h-238.592c-1.362 0.048-2.963 0.075-4.569 0.075-76.722 0-138.918-62.196-138.918-138.918 0-1.37 0.020-2.735 0.059-4.095q-0.005-206.441-0.005-412.734c0-76.722 62.196-138.918 138.918-138.918 161.666 0 324.026 0 486.213 0 0.971-0.025 2.113-0.040 3.26-0.040 56.17 0 104.23 34.726 123.881 83.881 14.209 31.287-1.593 54.73-34.412 54.73h-503.578c-1.857-0.176-4.014-0.277-6.195-0.277-38.361 0-69.459 31.098-69.459 69.459 0 2.237 0.106 4.45 0.313 6.633q-0.021 131.52-0.021 263.318c0 50.705 27.784 77.968 78.662 77.968h501.321c1.458-0.217 3.141-0.341 4.852-0.341 19.181 0 34.73 15.549 34.73 34.73 0 6.532-1.803 12.643-4.94 17.862-21.008 51.071-70.552 86.546-128.396 86.667l-243.122 0z",
608
+ "M451.484 746.685h208.377v121.553c25.7 0 15.802 0 40.634 0 2.535-0.441 5.797-2.794 7.78-6.017 12.82-17.355 33.139-28.447 56.049-28.447 38.361 0 69.459 31.098 69.459 69.459 0 2.169-0.099 4.314-0.294 6.432-2.734 30.281-26.005 55.449-56.157 61.132-4.598 1.004-9.383 1.54-14.293 1.54-22.154 0-41.758-10.918-53.726-27.666-2.948-4.367-7.652-7.070-12.987-7.070-0.611 0-1.215 0.036-1.807 0.105-22.676-0.007-10.694-0.007-33.268-0.007 0 29.867-28.826 86.824-105.578 86.824-1.14 0.046-2.478 0.072-3.822 0.072-50.887 0-93.019-37.48-100.298-86.34-24.726-0.555-14.828-0.555-39.833-0.555-2.535 0.441-5.797 2.794-7.78 6.017-12.746 18.188-33.546 29.892-57.081 29.892-38.361 0-69.459-31.098-69.459-69.459 0-2.741 0.159-5.444 0.468-8.102 2.724-30.229 25.995-55.398 56.147-61.080 4.598-1.004 9.383-1.54 14.293-1.54 22.154 0 41.758 10.918 53.726 27.666 2.935 4.459 7.69 7.232 13.094 7.232 0.574 0 1.14-0.031 1.698-0.092 22.679 0.006 10.697 0.006 34.661 0.006v-121.553z",
609
+ "M664.376 358.93l-217.58-80.746v-80.92l217.58 80.92v80.746z",
610
+ "M664.376 220.185l-217.58-80.92h217.58v80.92z",
611
+ "M664.376 497.674l-217.58-80.746v-80.746l217.58 80.746v80.746z",
612
+ "M446.795 555.672v-80.746l217.58 80.746h-217.58z"
613
+ ],
614
+ "attrs": [],
615
+ "isMulticolor": false,
616
+ "width": 833,
617
+ "grid": 0,
618
+ "tags": [
619
+ "gzip",
620
+ "archive"
621
+ ],
622
+ "colorPermutations": {}
623
+ },
624
+ {
625
+ "id": 19,
626
+ "paths": [
627
+ "M1004 670v-670l-108 84v586c0 34-24 62-54 62-32 0-56-28-56-62v-312c0-100-74-182-164-182s-162 82-162 182v312c0 34-26 62-56 62s-54-28-54-62v-312c0-100-74-182-164-182s-164 82-164 182v0 670l108-84v-586c0-34 26-62 56-62s56 28 56 62l-2 312c0 100 74 182 164 182s164-82 164-182v0-312c0-34 24-62 54-62 32 0 56 28 56 62v312c0 100 72 182 164 182 90 0 162-82 162-182z"
628
+ ],
629
+ "attrs": [],
630
+ "isMulticolor": false,
631
+ "tags": [
632
+ "wpmudev-logo"
633
+ ],
634
+ "defaultCode": 99,
635
+ "grid": 0,
636
+ "colorPermutations": {}
637
+ },
638
+ {
639
+ "id": 20,
640
+ "paths": [
641
+ "M514 0c-284 0-514 230-514 514s230 514 514 514c284 0 514-230 514-514s-230-514-514-514zM514 950c-242 0-436-196-436-436 0-242 194-436 436-436 240 0 436 194 436 436 0 240-196 436-436 436zM774 228l-60 48v322c0 20-14 34-30 34-18 0-32-14-32-34v-172c0-56-40-100-90-100s-90 44-90 100v172c0 20-14 34-30 34s-30-14-30-34v-172c0-56-40-100-90-100s-90 44-90 100v0 370l58-46v-324c0-18 14-34 32-34 16 0 30 16 30 34v172c0 56 40 102 90 102s90-46 90-102v0-172c0-18 14-34 30-34 18 0 32 16 32 34v172c0 56 40 102 90 102s90-46 90-102v0-370z"
642
+ ],
643
+ "attrs": [],
644
+ "isMulticolor": false,
645
+ "tags": [
646
+ "wpmudev-logo"
647
+ ],
648
+ "defaultCode": 100,
649
+ "grid": 0,
650
+ "colorPermutations": {}
651
+ },
652
+ {
653
+ "id": 48,
654
+ "paths": [
655
+ "M510.72 1024c-282.192-0.764-510.657-229.701-510.657-511.998 0-282.77 229.23-512 512-512s512 229.23 512 512c0 2.828-0.023 5.651-0.069 8.469-3.807 278.716-230.984 503.536-510.67 503.536-0.916 0-1.831-0.002-2.746-0.007zM801.829 186.331c-192-178.103-514.011-136.594-652.069 83.383 1.457 0.351 5.118 0.794 8.862 0.912l128.098-4.569c1.526-0.428 3.279-0.673 5.089-0.673 9.947 0 18.161 7.423 19.403 17.033 0.021 0.347 0.027 0.638 0.027 0.931 0 11.21-9.087 20.297-20.297 20.297-0.714 0-1.42-0.037-2.116-0.109-13.81 1.653-27.89 2.75-43.616 4.213l157.074 469.76c2.56-6.766 4.023-10.606 5.303-14.629 28.343-85.029 56.686-170.24 85.211-256 1.679-4.231 2.652-9.133 2.652-14.263s-0.973-10.032-2.745-14.532c-18.192-48.005-36.478-96.097-52.752-144.919-6.583-19.749-14.811-31.451-36.571-28.526-0.546 0.016-1.189 0.025-1.834 0.025-5.843 0-11.513-0.743-16.92-2.139-8.938-0.769-16.246-8.623-16.246-18.183 0-10.14 8.22-18.36 18.36-18.36 0.579 0 1.153 0.027 1.718 0.079 14.007-0.005 28.27 1.457 42.35 2.555 22.64 1.451 49.092 2.278 75.736 2.278 38.096 0 75.797-1.69 113.032-5-3.065-0.267-1.049-0.621 1.050-0.621 9.86 0 17.897 7.804 18.272 17.572 0.040 0.495 0.062 1.031 0.062 1.572 0 10.705-8.678 19.383-19.383 19.383-0.601 0-1.195-0.027-1.782-0.081-14.37 1.651-28.816 2.931-44.542 4.577l156.16 464.457c-2.265 4.5 0.24 0.213 1.921-4.467 22.399-75.076 45.439-149.864 66.833-224.836 5.267-17.232 8.3-37.039 8.3-57.555 0-37.519-10.143-72.669-27.837-102.857-7.891-14.4-17.765-28.845-25.994-44.571 3.982 11.641-12.885-20.218-22.608-55.057-1.764-7.159-2.529-13.298-2.529-19.616 0-39.446 29.81-71.93 68.131-76.153-2.341 0.849 2.341-0.302 6.655-2.147zM655.726 923.977l-134.766-367.177h-2.926l-128.914 374.674c36.697 11.121 78.871 17.524 122.541 17.524 51.481 0 100.884-8.898 146.754-25.239zM318.72 903.314l-206.629-566.857c-23.247 51.636-36.791 111.934-36.791 175.395 0 170.748 98.044 318.596 240.906 390.319zM899.291 310.857c0 6.217 0 9.143 0 12.069 0.474 7.029 0.745 15.236 0.745 23.506 0 43.384-7.439 85.030-21.111 123.733q-54.057 156.852-108.914 316.12l-34.743 100.571c197.303-111.726 272.823-371.383 164.571-575.817z"
656
+ ],
657
+ "attrs": [],
658
+ "isMulticolor": false,
659
+ "grid": 0,
660
+ "tags": [
661
+ "wordpress"
662
+ ],
663
+ "colorPermutations": {}
664
+ },
665
+ {
666
+ "id": 66,
667
+ "paths": [
668
+ "M109.909 1024v-512h-109.909v-176.469h109.739v-105.984c0.171-144.213 62.123-229.547 238.251-229.547h146.603v176.469h-91.648c-68.267 0-73.216 24.747-73.216 70.656v88.235h166.059l-19.627 176.64h-146.603v512h-219.648z"
669
+ ],
670
+ "attrs": [],
671
+ "isMulticolor": false,
672
+ "width": 495,
673
+ "grid": 0,
674
+ "tags": [
675
+ "facebook"
676
+ ],
677
+ "colorPermutations": {}
678
+ },
679
+ {
680
+ "id": 51,
681
+ "paths": [
682
+ "M1310.792 121.135c-14.89 10.709-81.418 32.19-151.988 40.433 39.699-16.967 91.224-72.488 115.047-140.977-5.215 8.61-82.434 44.54-166.562 61.314-53.177-49.795-122.171-81.005-198.455-81.005-0.51 0-1.019 0.001-1.529 0.004-1.417-0.031-3.181-0.048-4.948-0.048-143.894 0-260.897 115.137-263.907 258.31-0.005 0.394-0.005 0.528-0.005 0.663 0 20.801 2.555 41.005 7.367 60.315-213.432-6.91-416.518-110.697-554.535-271.859-23.725 35.825-37.265 80.55-37.265 128.437 0 0.162 0 0.324 0 0.486 0.318 89.914 47.503 169.25 118.519 214.509-40.056 0.282-83.88-11.67-122.242-32.426s1.463 2.758 1.463 3.888c1.807 126.237 93.452 231.003 213.999 253.1-19.642 6.049-44.035 9.384-69.208 9.384-17.872 0-35.351-1.681-52.289-4.894 39.032 104.987 137.304 178.977 252.959 179.717-91.27 69.137-206.805 110.743-332.057 110.743-0.661 0-1.321-0.001-1.981-0.003-21.669-0.002-43.945-1.315-65.843-3.869 119.49 73.177 261.363 116.418 413.335 116.418 0.546 0 1.091-0.001 1.636-0.002 494.626 0 765.147-393.916 765.147-735.4q0-16.724 0-33.448c-10.131 19.157 72.941-47.501 132.196-132.070z"
683
+ ],
684
+ "attrs": [],
685
+ "isMulticolor": false,
686
+ "width": 1311,
687
+ "grid": 0,
688
+ "tags": [
689
+ "twitter"
690
+ ],
691
+ "colorPermutations": {}
692
+ },
693
+ {
694
+ "id": 64,
695
+ "paths": [
696
+ "M692.495 744.47c63.126-15.876 116.235-46.872 145.341-107.73 18.195-36.716 28.841-79.951 28.841-125.673 0-26.693-3.629-52.539-10.419-77.070 1.36-8.143-14.763-42.914-38.675-70.812-2.053-2.82-3.417-6.692-3.417-10.883 0-1.408 0.154-2.78 0.446-4.1 4.58-15.767 7.227-34.023 7.227-52.897 0-24.881-4.601-48.687-12.998-70.614-0.751-4.264-5.676-8.414-11.569-8.414-0.625 0-1.24 0.047-1.84 0.137-22.795 0.222-48.918 7.221-71.926 19.338-17.97 8.815-36.87 20.344-55.77 30.361-3.497 1.961-7.675 3.117-12.123 3.117-1.324 0-2.625-0.102-3.894-0.3-37.228-9.592-80.127-15.108-124.315-15.108s-87.087 5.516-128.047 15.898c2.499-0.603 1.24-0.507-0.042-0.507-4.959 0-9.583-1.436-13.479-3.916-6.299-9.525-54.471-35.184-107.814-47.174l-8.319-1.338c-18.9-2.079-20.412-1.701-26.46 17.577-6.368 18.236-10.046 39.259-10.046 61.14 0 19.234 2.842 37.804 8.129 55.314-0.014-0.17 0.18 1.189 0.18 2.593 0 3.031-0.903 5.852-2.455 8.206-47.593 55.132-56.665 119.959-46.081 188.944-2.207 0.821 5.952 38.105 19.692 72.558 26.046 66.924 81.045 103.59 150.408 121.545 21.357 5.481 43.281 8.883 66.339 13.608-12.638 11.215-26.514 36.191-31.088 64.29-1.070 3.438-4.041 6.294-7.755 7.504-56.791 21.761-111.412 12.122-145.999-45.145-10.683-23.925-37.497-46.215-69.98-53.542-4.020-0.649-7.843-0.943-11.734-0.943-5.736 0-11.323 0.639-16.694 1.849-7.811 1.416-9.134 7.842-3.842 14.079-2.725-1.877 4.644 6.466 13.756 12.335 19.054 7.885 45.767 36.705 59.057 72.092 17.056 43.824 58.023 73.933 106.097 74.521 4.852 0.123 10.481 0.193 16.125 0.193 20.964 0 41.704-0.962 62.177-2.844-2.629 32.514-2.629 66.534-2.629 100.365 0 17.199-18.9 25.137-39.123 18.9 7.828 9.482-65.118-19.649-127.215-63.198-158.175-112.005-238.689-266.229-230.562-461.276 11.099-242.804 190.67-443.514 425.429-487.122 34.55-7.142 70.546-10.946 107.43-10.946 289.868 0 524.852 234.984 524.852 524.852 0 229.409-147.183 424.441-352.272 495.818-29.388 9.621-44.886-1.152-44.886-27.99q0-65.961 0-132.3c0.271-3.25 0.426-7.035 0.426-10.856 0-35.003-12.981-66.973-34.392-91.36 23.382-4.379 44.928-7.781 65.907-13.073z"
697
+ ],
698
+ "attrs": [],
699
+ "isMulticolor": false,
700
+ "width": 1058,
701
+ "grid": 0,
702
+ "tags": [
703
+ "github"
704
+ ],
705
+ "colorPermutations": {}
706
+ },
707
+ {
708
+ "id": 54,
709
+ "paths": [
710
+ "M750.421 379.904l-232.448-328.704 69.973-51.2c6.315 7.68 12.629 14.336 17.067 21.675 64.171 95.573 127.488 191.488 192.341 286.379 12.288 17.92 14.165 29.696-6.315 41.643 76.886-48.048 12.89-14.204-41.447 30.876zM734.72 397.824l-52.736 59.221-304.299-277.163 60.075-64.171zM270.677 345.088l34.133-63.317c9.899-17.067 21.333-6.656 31.403-0.853q140.459 80.555 280.576 161.621c59.051 34.133 59.904 41.813 11.776 97.792zM620.203 570.197c-2.56 10.581-3.072 13.312-3.925 16.213-17.067 60.587-5.461 54.784-64.683 38.059-106.667-30.208-213.333-61.269-320.341-90.112-25.088-6.827-29.525-17.067-20.992-40.448 25.429-70.656 11.947-59.221 74.923-39.765 103.253 31.744 205.995 65.365 308.736 99.157-5.62-4.303 11.983 4.578 26.432 17.021zM595.285 691.712c-1.877 49.323-2.731 51.2-48.469 46.421-117.077-11.264-233.984-23.381-351.061-34.133-21.333-2.048-27.136-9.899-23.211-31.915 10.923-63.659 9.728-62.635 75.264-53.589q158.891 22.016 318.293 40.277c25.259 2.56 35.328 11.435 29.355 32.939zM378.027 765.781c59.904 0 119.467 0 179.712 0 22.869 0 33.109 5.291 32.256 30.549-2.389 72.704 9.899 63.317-62.805 63.659-108.203 0-216.405 0-324.267 0-27.136 0.512-38.229-6.656-38.229-35.157 1.877-70.827-2.731-58.027 59.221-58.88 51.712-0.683 102.912-0.171 154.112-0.171zM91.136 930.475h576.512v-38.741c0-87.040 0-173.909 0-260.949 0-23.040 6.997-30.208 29.696-29.525 73.387 2.219 60.587-8.875 61.099 61.44 0 110.080 0 220.331 0 330.411 0 24.576-8.021 30.891-31.573 30.72q-347.819-1.024-695.808 0c-24.064 0-31.403-7.168-31.232-31.232 1.024-119.467 1.195-238.933 0-359.424 0-26.283 8.533-32.597 33.28-32.256 57.856 1.195 57.856 0 57.856 59.051v270.507z"
711
+ ],
712
+ "attrs": [],
713
+ "isMulticolor": false,
714
+ "width": 807,
715
+ "grid": 0,
716
+ "tags": [
717
+ "stackoverflow"
718
+ ],
719
+ "colorPermutations": {}
720
+ },
721
+ {
722
+ "id": 61,
723
+ "paths": [
724
+ "M378.839 1024h234.818v-380.6c-0.115-2.18-0.181-4.732-0.181-7.299 0-17.148 2.933-33.61 8.325-48.913 18.477-47.756 64.975-81.744 119.411-81.744 0.217 0 0.434 0.001 0.65 0.002 85.088-0 118.941 62.422 118.941 154.001v364.554h235.013v-391.363c0-209.379-115.843-306.633-270.431-306.633-3.397-0.176-7.375-0.276-11.377-0.276-85.454 0-160.246 45.646-201.324 113.886l0.974 1.058v-97.841h-234.818c3.131 63.596 0 681.166 0 681.166zM131.302 263.387c1.841 0.096 3.997 0.15 6.166 0.15 70.031 0 126.801-56.771 126.801-126.801 0-1.773-0.036-3.538-0.108-5.293-1.362-74.499-50.869-131.442-131.294-131.442-1.841-0.096-3.997-0.15-6.166-0.15-70.031 0-126.801 56.771-126.801 126.801 0 1.773 0.036 3.538 0.108 5.293-0.091 1.46-0.139 3.466-0.139 5.482 0 69.598 56.421 126.019 126.019 126.019 1.353 0 2.702-0.021 4.045-0.064l1.369 0.005zM248.711 1024v-681.166h-234.818v681.166h234.818z"
725
+ ],
726
+ "attrs": [],
727
+ "isMulticolor": false,
728
+ "width": 1096,
729
+ "grid": 0,
730
+ "tags": [
731
+ "linkedin"
732
+ ],
733
+ "colorPermutations": {}
734
+ },
735
+ {
736
+ "id": 60,
737
+ "paths": [
738
+ "M0 150.68v-151.349h484.806v1.783l17.832 65.087 109.667 407.906q15.603 58.177 31.206 116.354c0 2.452 2.006 3.566 4.235 2.675 0.899-0.591 1.747-1.849 2.001-3.312l111.454-414.179 48.146-176.313h483.469v151.572h-4.235c-14.934 0-29.646 0-44.58 0-4.902 0.022-10.177 1.17-14.975 3.221-4.709 0.532-16.911 9.762-25.001 21.956-5.298 7.041-8.399 15.65-8.399 24.983 0 0.233 0.002 0.465 0.006 0.697q-0 313.139-0 626.535c-0.011 0.319-0.017 0.695-0.017 1.071 0 8.082 2.868 15.495 7.641 21.275-7.498-8.847 0.66 2.521 10.991 11.442 8.277 7.432 19.135 11.92 31.042 11.92 0.409 0 0.817-0.005 1.224-0.016 13.983 0.001 28.025 0.001 41.845 0.001h4.458v3.566q0 73.111 0 146.445h-462.739c-0.034-0.533-0.053-1.156-0.053-1.783s0.019-1.25 0.057-1.868q-0.004-71.912-0.004-143.685c0-1.114 0-2.229 0-3.789h96.515v-668.698c-3.566-1.337-4.904 0-5.795 3.343q-29.2 103.871-57.285 207.296l-161.379 583.997c-2.229 8.47-4.458 16.717-6.687 25.188h-175.199s0-2.229-1.114-3.343l-60.852-222.899-160.488-588.677c-1.337-4.904-1.337-4.904-6.687-4.012v668.698h96.738v4.458q0 73.111 0 146.445h-387.845v-152.017h49.707c0.97 0.123 2.093 0.193 3.232 0.193s2.262-0.070 3.364-0.206c11.449-1.849 25.89-12 34.716-26.038 3.75-4.782 6.060-10.819 6.165-17.391q0-316.541 0-633.281c-0.021-3.62-0.924-7.669-2.528-11.342 0.243-2.833-7.367-14.032-17.619-21.991-8.527-7.722-19.721-12.387-32.005-12.387-0.551 0-1.099 0.009-1.645 0.028-14.409-0.002-28.675-0.002-43.163-0.002z"
739
+ ],
740
+ "attrs": [],
741
+ "isMulticolor": false,
742
+ "width": 1293,
743
+ "grid": 0,
744
+ "tags": [
745
+ "medium"
746
+ ],
747
+ "colorPermutations": {}
748
+ },
749
+ {
750
+ "id": 57,
751
+ "paths": [
752
+ "M695.79 853.981c3.596 15.101 23.817 39.586 50.242 54.246-40.601-22.728 2.827 5.557 50.912 24.625 9.205 2.488 13.998 8.286 13.998 15.204 0 0.382-0.015 0.761-0.043 1.136 0.003 17.605 0.003 35.261 0.003 52.916 0.257 1.013 0.404 2.177 0.404 3.375 0 7.898-6.403 14.301-14.301 14.301-0.266 0-0.531-0.007-0.794-0.022-59.108 9.182-115.605 5.828-166.805-29.129-7.085 0.7-40.335-30.641-61.431-69.534-3.148-6.217-8.387-9.67-14.433-9.67-1.336 0-2.632 0.169-3.869 0.486 2.529 0.954-45.655 7.205-94.816 9.766-3.969 0.12-5.873 0.132-7.78 0.132-94.629 0-182.061-30.815-252.809-82.957-85.845-51.128-164.078-162.048-186.131-292.088-5.712-28.702-8.77-58.662-8.77-89.337 0-116.169 43.862-222.094 115.928-302.117 45.578-64.244 143.675-127.546 256.753-147.171 27.893-5.565 56.97-8.538 86.741-8.538 104.131 0 199.769 36.366 274.906 97.090 75.283 48.643 146.935 154.036 168.449 276.688 5.832 29.094 8.949 59.458 8.949 90.549 0 103.708-34.672 199.318-93.057 275.871 16.652-8.453-41.705 60.467-114.896 108.714l-7.526 5.466zM629.407 714.505c1.236-1.766 4.237-5.473 7.062-9.534 33.173-48.522 52.973-108.474 52.973-173.049 0-0.735-0.003-1.469-0.008-2.203 0.319-11.927 0.501-26.1 0.501-40.317 0-51.28-2.361-102.009-6.982-152.083-3.832-61.431-43.719-131.186-103.212-176.534-33.71-26.441-75.921-42.117-121.793-42.117-51.63 0-98.622 19.858-133.754 52.353-59.034 54.74-96.017 132.976-96.090 219.851-1.412 44.858-0 89.878-0 134.722-0.011 0.992-0.017 2.164-0.017 3.337 0 42.177 8.042 82.475 22.677 119.446 31.895 82.723 109.754 169.41 226.985 158.817 10.417-0.883 20.657-3.708 33.368-6.003-26.659-40.96-57.732-69.385-103.283-79.095-4.557-1.173-8.784-5.253-10.387-10.481-0.912-24.477-0.030-49.017-0.030-73.382-0.027-0.266-0.043-0.574-0.043-0.886 0-5.070 4.11-9.181 9.181-9.181 0.64 0 1.265 0.065 1.868 0.19 4.087-0.251 8.936-0.389 13.818-0.389 42.722 0 82.986 10.523 118.342 29.118 29.503 15.928 57.751 37.291 89.001 57.771z"
753
+ ],
754
+ "attrs": [],
755
+ "isMulticolor": false,
756
+ "width": 911,
757
+ "grid": 0,
758
+ "tags": [
759
+ "quora"
760
+ ],
761
+ "colorPermutations": {}
762
+ },
763
+ {
764
+ "id": 73,
765
+ "paths": [
766
+ "M640 635.68h-151.52v-87.84h126.24c8.837 0 16-7.163 16-16v-66.080c0-8.837-7.163-16-16-16h-126.24v-73.6h150.72c8.837 0 16-7.163 16-16v-66.080c0-8.837-7.163-16-16-16h-249.6c-8.837 0-16 7.163-16 16v423.68c0 8.837 7.163 16 16 16h250.4c8.837 0 16-7.163 16-16v-66.080c0-8.837-7.163-16-16-16v0z",
767
+ "M295.040 510.88c-27.243-25.69-60.119-44.648-96-55.36-12.16-5.28-22.24-10.24-30.56-14.88-6.525-3.489-12.689-7.616-18.4-12.32-3.204-2.715-5.771-6.102-7.52-9.92-1.675-3.943-2.493-8.197-2.4-12.48-0.196-5.436 0.618-10.861 2.4-16 1.559-4.269 3.952-8.185 7.040-11.52 2.931-2.939 6.485-5.181 10.4-6.56 5.121-1.88 10.545-2.802 16-2.72 5.868-0.144 11.7 0.947 17.12 3.2 4.517 1.996 8.474 5.073 11.52 8.96 3.693 4.755 6.412 10.192 8 16 2.034 7.016 3.004 14.297 2.88 21.6 0 8.837 7.163 16 16 16h80c6.879 0.018 12.999-4.363 15.2-10.88v-1.76c0.51-1.55 0.78-3.169 0.8-4.8v-4c0.199-18.749-3.337-37.351-10.4-54.72-6.484-17.080-16.394-32.653-29.12-45.76-14.215-13.736-31.172-24.314-49.76-31.040-19.396-6.945-39.88-10.359-60.48-10.080-20.14-0.235-40.186 2.791-59.36 8.96-17.943 5.928-34.569 15.273-48.96 27.52-14.061 11.771-25.321 26.529-32.96 43.2-7.485 16.923-11.25 35.256-11.040 53.76-0.308 17.979 2.842 35.85 9.28 52.64 6.347 15.934 16.381 30.136 29.28 41.44 30.757 24.553 65.881 43.065 103.52 54.56 14.493 5.372 27.766 13.586 39.040 24.16 2.89 3.307 5.069 7.174 6.4 11.36 1.694 5.545 2.504 11.323 2.4 17.12 0.050 5.427-0.76 10.827-2.4 16-1.304 3.972-3.43 7.625-6.24 10.72l11.84 10.72-11.68-10.080c-2.624 2.855-5.926 5.001-9.6 6.24-5.624 1.846-11.523 2.712-17.44 2.56-8.13 0.199-16.237-0.936-24-3.36-5.492-1.716-10.487-4.736-14.56-8.8-4.135-4.554-7.1-10.045-8.64-16-2.43-9.347-3.561-18.984-3.36-28.64 0-8.837-7.163-16-16-16h-81.28c-6.879-0.018-12.999 4.363-15.2 10.88v1.76c-0.494 1.499-0.764 3.062-0.8 4.64v4.48c-0.349 21.369 3.794 42.573 12.16 62.24 8.179 18.8 20.875 35.288 36.96 48 32.617 25.906 73.234 39.653 114.88 38.88 20.378-0.054 40.622-3.293 60-9.6 17.592-5.53 33.909-14.504 48-26.4 13.909-11.625 24.873-26.373 32-43.040 7.182-17.558 10.72-36.393 10.4-55.36 0.036-17.877-2.994-35.628-8.96-52.48-5.571-16.093-14.579-30.78-26.4-43.040v0z",
768
+ "M996.96 375.36c-7.145-20.974-18.775-40.138-34.080-56.16-14.863-15.548-32.935-27.669-52.96-35.52-42.728-15.595-89.592-15.595-132.32 0-19.961 7.869-37.937 20.053-52.64 35.68-15.124 16.074-26.587 35.233-33.6 56.16-7.557 23.019-11.234 47.135-10.88 71.36v118.72c-0.368 24.279 3.309 48.449 10.88 71.52 7.046 20.853 18.568 39.912 33.76 55.84 14.748 15.457 32.721 27.475 52.64 35.2 42.865 15.442 89.775 15.442 132.64 0 19.957-7.741 37.978-19.756 52.8-35.2 15.254-15.909 26.832-34.97 33.92-55.84 7.595-23.065 11.272-47.24 10.88-71.52v-118.72c0.371-24.291-3.361-48.471-11.040-71.52v0zM794.4 445.92c-0.139-12.101 1.096-24.178 3.68-36 1.741-8.286 5.054-16.162 9.76-23.2 3.551-5.173 8.409-9.314 14.080-12 13.895-5.682 29.465-5.682 43.36 0 5.828 2.793 10.841 7.035 14.56 12.32 4.796 6.91 8.218 14.678 10.080 22.88 2.661 11.864 3.896 24.003 3.68 36.16v119.68c0.189 12.156-1.046 24.292-3.68 36.16-1.735 8.364-5.106 16.303-9.92 23.36-3.719 5.285-8.732 9.527-14.56 12.32-13.738 5.637-29.142 5.637-42.88 0-5.778-2.728-10.742-6.92-14.4-12.16-4.815-7.115-8.185-15.106-9.92-23.52-2.646-12.029-3.881-24.325-3.68-36.64v-119.36h-0.16z"
769
+ ],
770
+ "attrs": [],
771
+ "isMulticolor": false,
772
+ "grid": 0,
773
+ "tags": [
774
+ "seo"
775
+ ]
776
+ },
777
+ {
778
+ "id": 59,
779
+ "paths": [
780
+ "M244.524 887.172c3.553-5.798-0.865 3.084-6.972 10.526-35.223 35.201-68.945 69.452-103.726 103.703-14.1 13.997-33.525 22.647-54.969 22.647-11.348 0-22.131-2.422-31.859-6.778-27.618-12.237-46.878-39.882-46.878-72.026 0-22.325 9.291-42.48 24.217-56.81l101.544-101.366c-16.571 15.614-4.263 2.16 10.381-8.213-4.202-5.204-7.027-8.559-10.205-11.56l-89.335-89.512c-0.261 0.319-3.339-2.282-5.427-5.573-2.997-5.565-4.731-12.087-4.731-19.013 0-0.978 0.035-1.948 0.103-2.909 4.057-4.921 10.436-8.32 17.615-8.521 43.288-0.001 86.543-0.001 129.798-0.001h179.023c1.53-0.095 3.319-0.149 5.12-0.149s3.59 0.054 5.364 0.16c-0.168-0.013-0.077-0.014 0.013-0.014 9.751 0 17.655 7.904 17.655 17.655 0 1.061-0.094 2.1-0.273 3.11 0.016 29.907 0.016 59.921 0.016 89.758q0 112.11 0 224.221c0.66 1.778 1.041 3.831 1.041 5.974 0 7.121-4.216 13.258-10.289 16.050-2.023 0.657-4.224 1.009-6.508 1.009-7.33 0-13.812-3.632-17.744-9.194q-45.949-45.971-91.499-92.051c3.89 5.539-2.709-2.264-7.247-11.283z",
781
+ "M886.113 774.003c5.826 6.179 8.121 9.004 10.77 11.652 35.31 35.31 69.385 69.032 103.636 104.166 14.141 14.205 22.884 33.795 22.884 55.426 0 36.978-25.546 67.989-59.952 76.347-6.248 1.654-12.806 2.541-19.57 2.541-21.704 0-41.275-9.129-55.085-23.756l-104.023-103.849-7.945-7.768-9.357 8.828-89.159 89.335c0.312 0.541-3.553 4.67-8.341 7.347-4.333 2.131-9.274 3.337-14.497 3.337-1.911 0-3.784-0.161-5.606-0.471-4.663-3.855-7.749-9.78-7.749-16.426 0-0.050 0-0.1 0.001-0.15-0-73.261-0-146.53-0-219.799 0-32.662 0-65.324 0-97.986-0.459-1.497-0.723-3.218-0.723-5.001 0-9.751 7.904-17.655 17.655-17.655 1.833 0 3.6 0.279 5.262 0.797l317.668-0.034c0.522-0.060 1.127-0.093 1.74-0.093 8.971 0 16.243 7.272 16.243 16.243 0 4.019-1.46 7.697-3.878 10.533 4.384-5.383-1.42 3.319-8.937 10.174q-44.716 44.711-89.56 89.202c3.812-2.402-3.136 3.205-11.14 6.922z",
782
+ "M245.76 136.828l89.688-90.041c-6.447 6.153 4.178-6.713 17.378-16.229 5.098-3.007 10.891-4.67 17.072-4.67 1.423 0 2.826 0.088 4.203 0.259 8.486 1.396 8.31 10.4 8.31 17.638q0 157.837 0 315.498c0 18.538-4.943 23.128-24.011 23.128-104.342 0-208.861 0-313.203 0-6.749-0.104-13.125-3.133-17.643-7.932-1.432-2.499-2.269-5.477-2.269-8.651 0-5.661 2.665-10.7 6.808-13.931 15.399-15.743 31.112-31.279 46.649-46.816l57.026-57.909-9.181-9.71c-35.31-35.31-69.385-69.032-103.636-104.166-14.223-13.509-23.071-32.559-23.071-53.676 0-8.596 1.466-16.85 4.162-24.525 6.485-26.059 29.621-47.893 58.533-53.086 5.633-1.325 11.579-2.046 17.693-2.046 21.959 0 41.746 9.302 55.635 24.18l102.264 102.444c-11.027-12.493-0.547-2.233 7.359 9.861z",
783
+ "M775.062 137.534c39.901-40.077 76.623-77.33 114.052-114.052 14.357-14.968 34.522-24.269 56.859-24.269 43.488 0 78.742 35.254 78.742 78.742 0 22.645-9.559 43.057-24.861 57.421-33.94 34.29-68.191 68.188-102.266 102.263-2.825 2.825-5.65 6.003-9.534 10.24l62.323 61.263c13.418 13.418 27.189 26.483 40.077 40.43 3.281 2.891 7.111 9.74 8.444 17.445 1.443 10.097-5.443 15.394-17.625 15.57h-312.32c-23.658 0-27.719-4.061-27.719-27.895q0-154.306 0-308.789c-0.413-1.424-0.651-3.059-0.651-4.749 0-6.691 3.722-12.513 9.21-15.508 2.175-0.813 4.58-1.256 7.088-1.256 6.687 0 12.638 3.151 16.45 8.049q45.938 45.421 91.312 91.147c-15.147-17.038-0.765-3.060 10.102 13.439z"
784
+ ],
785
+ "attrs": [],
786
+ "isMulticolor": false,
787
+ "grid": 0,
788
+ "tags": [
789
+ "minify"
790
+ ],
791
+ "colorPermutations": {}
792
+ },
793
+ {
794
+ "id": 49,
795
+ "paths": [
796
+ "M57.234 569.417h217.051l164.571 418.011c8.581 21.457 29.195 36.339 53.284 36.339 28.233 0 51.692-20.443 56.381-47.334l119.455-695.199 89.966 250.149c8.129 22.356 29.192 38.034 53.918 38.034 0.009 0 0.018-0 0.026-0l264.593 0c31.711-0 57.417-25.707 57.417-57.417s-25.707-57.417-57.417-57.417h-223.817l-150.126-416.549c-8.447-21.735-29.2-36.861-53.486-36.861-27.832 0-51.024 19.866-56.17 46.191l-122.207 707.105-103.314-263.497c-8.551-21.544-29.217-36.526-53.389-36.571l-256.006-0c-31.711 0-57.417 25.707-57.417 57.417s25.707 57.417 57.417 57.417h0z"
797
+ ],
798
+ "attrs": [],
799
+ "isMulticolor": false,
800
+ "width": 1134,
801
+ "grid": 0,
802
+ "tags": [
803
+ "uptime"
804
+ ],
805
+ "colorPermutations": {}
806
+ },
807
+ {
808
+ "id": 47,
809
+ "paths": [
810
+ "M365.714 941.897c5.976 10.646 28.073 27.415 54.041 35.262 31.188 10.424 66.163 16.318 102.515 16.318 38.771 0 75.977-6.704 110.52-19.015-13.109 5.71 1.945 0.090 15.19-8.16-33.216-43.97-73.627-69.57-128.484-67.193s-103.131 25.783-153.783 42.789zM125.074 740.754c-3.508-4.984-5.606-11.179-5.606-17.865 0-9.726 4.44-18.414 11.404-24.149 7.002-8.637 15.414-15.952 21.631-24.912-4.73 9.278 15.3-15.941 28.060-45.071 11.803-37.763 8.328-48.369-17.82-67.203-1.097 0-2.011-1.829-3.109-2.56-14.538-5.499-40.503-33.064-54.492-66.844-3.657-7.945-7.497-14.527-10.423-21.659-15.909-34.194-29.989-68.206-21.577-108.434 8.298-9.68-1.302-0.041-8.378 11.33 20.448-38.773-2.988-0.547-18.783 41.421-10.326 34.045-15.799 70.328-15.799 107.889s5.474 73.844 15.667 108.095c-0.221 16.144 12.884 49.446 33.481 76.783 3.135 7.668 21.778 23.63 44.121 32.032zM454.217 98.743l1.28 2.194c8.042-10.711 0.704 0.748-8.764 10.044-18.299 15.19-36.584 30.184-54.87 45.361 59.907-40.798 9.274-11.484-33.074 26.82-1.783 2.523-3.062 6.094-3.062 9.964 0 1.683 0.242 3.309 0.693 4.846 2.261 3.854 6.823 6.973 12.148 7.552 0.898 0.057 1.861 0.085 2.832 0.085 6.38 0 12.471-1.238 18.045-3.486q91.104-35.176 180.521-71.382c2.854-1.477 5.345-4.779 6.024-8.702 0.122-0.926 0.186-1.91 0.186-2.909 0-12.725-10.315-23.040-23.040-23.040-1.615 0-3.192 0.166-4.713 0.482-0.754 0.189-1.792 0.313-2.859 0.313-6.948 0-12.673-5.237-13.443-11.979-2.099-5.094-3.315-10.939-3.315-17.068 0-0.45 0.007-0.898 0.020-1.345 0.23-0.933 0.363-2.080 0.363-3.259 0-7.25-5.023-13.327-11.779-14.94 8.614 5.016-0.37-1.021-10.353-5.127-9.261-4.806-26.68-9.694-45.095-10.962-78.148 2.53-171.621 39.469-246.413 98.904 37.597-34.161-25.949 13.059-74.639 72.857l13.606 28.078c4.925 1.539 10.588 2.426 16.458 2.426 9.768 0 18.962-2.455 27-6.781 6.459-3.32 14.452-5.354 22.919-5.354s16.46 2.034 23.515 5.639c-4.164-1.729 1.135 0.895 6.854 2.522 4.053 1.832 8.393 2.851 12.97 2.851 16.663 0 30.171-13.508 30.171-30.171 0-0.137-0.001-0.273-0.003-0.409 0.016 0.566 0.75-3.026 1.083-6.734 0.525-10.233 6.505-19.572 15.231-24.801-11.879 9.884-0.573-0.973 12.66-8.961q56.969-30.067 113.837-59.141c-6.309 2.273 3.829-2.272 14.694-4.98zM503.223 341.211c13.531-6.4 26.514-12.069 39.314-18.286 5.65-2.873 12.322-4.556 19.386-4.556 4.433 0 8.71 0.663 12.74 1.894-1.772-5.663 56.736 14.645 107.651 46.072-11.303-9.775 12.401 6.356 30.666 27.346 12.963 14.089 23.386 30.18 35.272 44.992-6.989-3.404 18.165 26.478 49.745 47.457 10.514 6.811 22.49 10.592 35.348 10.592 3.984 0 7.883-0.363 11.666-1.058 11.396-0.105 20.89-9.701 20.89-21.515 0-4.048-1.114-7.835-3.053-11.072-0.976-1.882-1.581-4.226-1.581-6.711 0-1.416 0.196-2.787 0.563-4.086 2.929-2.032 6.625-3.313 10.621-3.313 0.759 0 1.507 0.046 2.242 0.136 2.334 0.111 7.185 2.578 10.887 6.212 25.231 20.659 50.099 41.688 75.699 61.985 12.069 9.509 21.211 6.949 25.783-7.863 3.369-9.396 5.316-20.237 5.316-31.532 0-0.55-0.005-1.099-0.014-1.647-0.263-42.389-13.256-99.616-36.027-151.584 7.501 12.427-6.079-20.844-26.073-49.278 118.608 161.488 35.527 28.798-71.081-80.907 50.945 50.529 7.397 0.455-45.169-38.030-7.394-5.781-15.317-8.763-23.936-8.763-5.84 0-11.361 1.369-16.258 3.804-12.222 5.39-24.473 11.424-36.359 18.19-16.64 8.046-18.286 7.314-25.234-9.326-1.026-10.748-10.008-19.088-20.939-19.088-5.21 0-9.977 1.894-13.65 5.032-22.28 13.69-43.857 28.867-65.434 43.679-4.895 3.332-8.068 8.878-8.068 15.165 0 2.441 0.478 4.771 1.347 6.9q2.882 8.289 5.259 17.066c1.995 2.751 3.191 6.194 3.191 9.917 0 8.97-6.946 16.319-15.752 16.96-21.084 8.049-42.661 15.546-63.141 24.689 2.909-3.329-14.693 6.197-28.765 19.435-6.227 5.566-10.163 13.695-10.163 22.744 0 6.523 2.045 12.568 5.529 17.53zM593.554 397.166c-20.993-12.338-46.239-19.625-73.188-19.625-1.463 0-2.921 0.021-4.373 0.064-65.067 5.298-106.027 42.966-133.821 97.824-3.271 5.69-5.2 12.511-5.2 19.782 0 12.99 6.157 24.542 15.711 31.897-8.384-4.063 15.818 14.994 43.748 27.058-34.324-12.321 16.004 9.664 69.761 22.946 21.284 3.464 36.121 17.656 39.951 35.897-2.367-6.813 0.391 0.114 2.137 7.433 6.143 39.307 12.36 78.073 18.395 116.838-2.344-10.411 2.408 32.601 10.992 74.213 6.928 25.261 26.676 31.295 52.459 13.924-12.475 9.056 4.526-1.252 18.3-14.826-29.756 26.513 2.517 1.845 27.796-28.806 26.681-35.728 52.647-71.202 77.332-107.408 1.65-7.609 18.879-26.348 40.565-37.757 21.975-7.156 37.189-26.885 37.189-50.166 0-0.718-0.014-1.433-0.043-2.144-0.063-0.2-0.1-0.548-0.1-0.904s0.038-0.703 0.109-1.038c0.586-1.261 0.931-2.772 0.931-4.365 0-4.378-2.608-8.147-6.355-9.838 36.045 26.123 5.795 0.803-28.714-17.572-17.225-5.638-35.937-23.326-45.206-45.89 10.205 22.437 0.183-4.434-14.439-28.168 14.264 22.666 0.548-3.173-17.978-24.763-1.787-2.226-6.771-5.211-12.43-6.305-19.907-4.414-40.204-7.34-59.587-12.643 26.012 9.617-12.883-1.666-48.169-19.14-4.050-0.727-8.367-6.070-8.367-12.422 0-1.803 0.348-3.525 0.981-5.102zM539.977 1024h-55.954c2.685 0.476-3.199-1.009-9.304-1.788-65.31-1.008-144.474-24.437-212.994-64.186-120.342-57.945-225.505-193.667-253.256-355.816-4.080-22.553-5.909-42.484-8.469-62.233v-55.954c-0.579 3.095 0.961-2.979 1.785-9.279 1.727-81.753 33.964-174.177 87.408-250.693 62.601-105.24 193.094-195.584 345.686-217.516 18.059-2.695 33.601-4.341 49.144-6.17h55.954c-2.808-0.507 3.133 0.994 9.296 1.787 44.675 0.295 103.039 13.054 156.284 35.552 169.597 73.29 274.922 202.57 310.579 387.438 3.84 19.749 5.303 40.046 7.863 60.16v54.857c0.445-2.562-1.023 3.265-1.789 9.311-0.264 42.76-13.201 101.078-35.915 154.22-75.118 174.938-208.604 281.544-400.055 314.458-15.177 2.56-30.72 3.84-46.263 5.851z"
811
+ ],
812
+ "attrs": [],
813
+ "isMulticolor": false,
814
+ "grid": 0,
815
+ "tags": [
816
+ "world"
817
+ ],
818
+ "colorPermutations": {}
819
+ },
820
+ {
821
+ "id": 3,
822
+ "paths": [
823
+ "M0 575.81c0-35.241 28.456-63.81 64.056-63.81h895.888c35.377 0 64.056 28.994 64.056 63.81v384.38c0 35.241-28.456 63.81-64.056 63.81h-895.888c-35.377 0-64.056-28.994-64.056-63.81v-384.38zM0 288c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 160c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 32c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 416c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32z"
824
+ ],
825
+ "attrs": [],
826
+ "isMulticolor": false,
827
+ "grid": 0,
828
+ "tags": [
829
+ "footer"
830
+ ],
831
+ "colorPermutations": {}
832
+ },
833
+ {
834
+ "id": 4,
835
+ "paths": [
836
+ "M0 704.19c0 35.241 28.456 63.81 64.056 63.81h895.888c35.377 0 64.056-28.994 64.056-63.81v-384.38c0-35.241-28.456-63.81-64.056-63.81h-895.888c-35.377 0-64.056 28.994-64.056 63.81v384.38zM0 160c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 864c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 992c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 32c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32z"
837
+ ],
838
+ "attrs": [],
839
+ "isMulticolor": false,
840
+ "grid": 0,
841
+ "tags": [
842
+ "middle",
843
+ "center"
844
+ ],
845
+ "colorPermutations": {}
846
+ },
847
+ {
848
+ "id": 5,
849
+ "paths": [
850
+ "M0 448.19c0 35.241 28.456 63.81 64.056 63.81h895.888c35.377 0 64.056-28.994 64.056-63.81v-384.38c0-35.241-28.456-63.81-64.056-63.81h-895.888c-35.377 0-64.056 28.994-64.056 63.81v384.38zM0 736c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 864c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 992c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 608c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32z"
851
+ ],
852
+ "attrs": [],
853
+ "isMulticolor": false,
854
+ "grid": 0,
855
+ "tags": [
856
+ "header"
857
+ ],
858
+ "colorPermutations": {}
859
+ },
860
+ {
861
+ "id": 6,
862
+ "paths": [
863
+ "M707.467 151.080c-2.704-9.436-9.638-16.489-18.143-19.762-0.335-0.134-0.671-0.263-1.011-0.385-0.338-0.116-0.678-0.224-1.020-0.328-3.334-1.063-6.841-1.586-10.376-1.438-0.732 0.032-1.507 0.048-2.322 0.048-4.964 0.008-11.389-0.645-18.57-2.063-12.594-2.459-27.479-7.227-42.21-13.683-11.060-4.833-22.069-10.603-32.15-16.917-7.561-4.732-14.603-9.77-20.762-14.877-4.621-3.827-8.744-7.693-12.233-11.443-5.247-5.621-9.006-11-11.161-15.356-1.087-2.179-1.496-4.090-1.911-5.683-0.417-1.597-0.265-2.865-0.265-3.929v-0.147c0-9.547-4.633-18.687-12.259-24.436-7.624-5.749-17.788-7.537-26.931-4.782l-474.675 143.044c-12.698 3.827-21.469 15.534-21.469 28.795v666.072c0 10.182 1.798 20.104 4.889 29.476 2.707 8.21 6.395 16.027 10.827 23.458 7.77 13.003 17.797 24.86 29.448 35.633 17.493 16.137 38.693 29.876 62.282 40.397 23.591 10.496 49.603 17.75 76.729 20.243 3.777 0.346 7.663-0.039 11.299-1.119 0.985-0.293 2.247-0.677 3.919-1.192 6.43-1.98 18.749-5.841 35.546-11.126 117.454-36.968 452.335-143.268 452.35-143.274 12.466-3.956 20.976-15.585 20.976-28.664v-653.767c0.633-4.15 0.433-8.495-0.798-12.795v0zM542.709 142.981c8.776 5.86 17.982 11.248 27.4 16.17-39.795 11.404-87.554 25.093-135.832 38.936-59.784 17.143-120.357 34.518-167.561 48.078-23.603 6.78-43.863 12.604-59.017 16.971-7.579 2.183-13.88 4.001-18.692 5.395-1.489 0.43-2.812 0.814-4.006 1.161-15.907-1.901-31.585-5.708-46.115-10.997-12.141-4.412-23.481-9.844-33.481-15.902-7.501-4.541-14.245-9.436-20.027-14.452-7.916-6.848-13.95-13.929-17.953-20.448l416.585-125.558c1.54 3.032 3.209 5.977 5.006 8.824 4.783 7.561 10.395 14.531 16.585 21.076 10.842 11.437 23.473 21.618 37.108 30.746v0zM105.647 913.493c-7.508-4.95-14.299-10.286-20.161-15.755-8.803-8.197-15.457-16.72-19.586-24.403-2.075-3.839-3.531-7.454-4.447-10.723-0.916-3.275-1.302-6.188-1.302-8.803v-568.871c14.659 10.516 31.171 19.49 48.965 26.74 14.961 6.078 30.833 10.922 47.275 14.275v610.805c-5.932-1.717-11.765-3.705-17.43-5.962-12.018-4.782-23.302-10.699-33.314-17.302v0zM256.541 919.698c-15.080 4.762-28.58 9.019-40 12.613v-609.125c15.947-4.6 40.601-11.481 69.172-19.743v267.943l83.133-83.765 55.211 27.922v-252.161c45.112-12.656 89.321-25.505 129.125-36.914 37.621-10.783 71.111-20.275 94.933-27.1v596.265c-42.103 13.361-141.164 44.792-237.658 75.363-56.069 17.762-111.271 35.236-153.917 48.702v0z"
864
+ ],
865
+ "attrs": [],
866
+ "isMulticolor": false,
867
+ "width": 727,
868
+ "grid": 0,
869
+ "tags": [
870
+ "book"
871
+ ],
872
+ "colorPermutations": {}
873
+ },
874
+ {
875
+ "id": 9,
876
+ "paths": [
877
+ "M504.231 955.882c22.087-9.699 42.18-20.276 60.268-31.085 39.815-23.797 69.925-48.698 90.442-68.056 1.536 0.142 3.092 0.214 4.664 0.214 27.658 0 50.078-22.421 50.078-50.078v-206.037c0-27.658-22.421-50.078-50.078-50.078s-50.078 22.421-50.078 50.078v200.346c-6.829 6.618-15.244 14.275-25.222 22.478-15.543 12.784-34.873 26.902-57.905 40.556-14.759 8.751-31.036 17.312-48.824 25.227-11.141-4.622-23.975-5.258-36.212-0.833-16.277 5.886-33.641 11.126-52.114 15.437-26.934 6.284-43.674 33.213-37.388 60.147 6.284 26.934 33.213 43.674 60.147 37.388 22.439-5.235 43.588-11.614 63.421-18.787 13.406-4.849 23.478-14.826 28.803-26.918zM101.589 702.427v-277.577c0.007-42.612 8.608-82.95 24.154-119.726 23.312-55.141 62.386-102.213 111.51-135.39 24.558-16.59 51.606-29.709 80.464-38.686 28.862-8.974 59.532-13.819 91.496-13.822 42.612 0.007 82.948 8.608 119.726 24.154 55.141 23.312 102.213 62.386 135.39 111.51 16.59 24.558 29.709 51.605 38.686 80.463 8.974 28.864 13.819 59.533 13.822 91.497v277.577c0 27.658 22.421 50.078 50.078 50.078s50.078-22.421 50.078-50.078v-277.577c0.007-56.165-11.411-109.929-32.066-158.743-30.991-73.243-82.631-135.406-147.685-179.366-32.532-21.979-68.44-39.405-106.787-51.33-38.341-11.929-79.124-18.344-121.243-18.342-56.165-0.007-109.929 11.411-158.743 32.066-73.243 30.991-135.406 82.629-179.366 147.685-21.977 32.532-39.405 68.44-51.33 106.787-11.929 38.34-18.344 79.124-18.342 121.243v277.577c0 27.658 22.421 50.078 50.078 50.078s50.078-22.421 50.078-50.078zM108.743 602.271v206.037c0 27.658 22.421 50.078 50.078 50.078s50.078-22.421 50.078-50.078v-206.037c0-27.658-22.421-50.078-50.078-50.078s-50.078 22.421-50.078 50.078z"
878
+ ],
879
+ "attrs": [],
880
+ "isMulticolor": false,
881
+ "width": 847,
882
+ "grid": 0,
883
+ "tags": [
884
+ "support"
885
+ ],
886
+ "colorPermutations": {}
887
+ },
888
+ {
889
+ "id": 33,
890
+ "paths": [
891
+ "M603.2 777.6c-36.8 36.8-148.8 36.8-184 0-19.2-19.2-35.2 0-35.2 19.2 0 33.6 0 78.4 0 112 0 19.2 17.6 36.8 36.8 19.2 11.2-11.2 24-24 36.8-36.8 11.2 27.2 25.6 64 36.8 92.8 9.6 24 27.2 24 36.8 0 9.6-25.6 27.2-70.4 36.8-92.8 9.6 9.6 17.6 17.6 36.8 36.8 17.6 17.6 36.8 0 36.8-19.2 0-32 0-78.4 0-112-1.6-19.2-19.2-38.4-38.4-19.2zM800 540.8c-19.2-19.2-80-60.8-80-80 0-168-51.2-307.2-144-400-52.8-52.8-76.8-51.2-128 0-92.8 92.8-144 232-144 400 0 17.6-62.4 62.4-80 80-36.8 36.8-32 76.8-32 96 0 56 25.6 140.8 32 160 11.2 36.8 60.8 35.2 80 16 36.8-36.8 83.2-83.2 96-96 56 56 168 56 224 0 12.8 12.8 59.2 59.2 96 96 19.2 19.2 70.4 20.8 80-16 4.8-19.2 32-104 32-160 0-19.2 4.8-59.2-32-96zM512 425.6c-52.8 0-96-43.2-96-96s43.2-96 96-96c51.2 0 96 44.8 96 96 0 49.6-43.2 96-96 96zM560 329.6c0 26.51-21.49 48-48 48s-48-21.49-48-48c0-26.51 21.49-48 48-48s48 21.49 48 48z"
892
+ ],
893
+ "attrs": [],
894
+ "isMulticolor": false,
895
+ "tags": [
896
+ "rocket"
897
+ ],
898
+ "defaultCode": 106,
899
+ "grid": 0,
900
+ "colorPermutations": {}
901
+ },
902
+ {
903
+ "id": 7,
904
+ "paths": [
905
+ "M797.496 32.018c0-3.36-0.111-5.277-0.139-5.804-0.472-8.415-4.721-16.135-11.581-21.023-6.86-4.916-15.552-6.443-23.662-4.138-5.388 1.416-162.048 47.823-387.305 306.712-98.062 16.358-160.549 52.878-197.291 97.062-38.908 46.657-47.712 98.701-47.656 135.36 0.028 31.021 6.026 52.044 6.526 53.794 3.166 10.942 12.719 18.857 24.050 19.912 11.359 1.083 22.217-4.916 27.383-15.080l0.361-0.667c2.138-4.138 14.136-26.078 30.549-45.879 2.138-2.611 4.499-4.943 6.776-7.415 0.417 0.305 0.639 0.833 1.083 1.139l91.314 63.931-14.775 56.682c-1.472 5.554 0.667 11.47 5.332 14.802 4.693 3.333 10.942 3.444 15.747 0.305l49.545-32.687 90.258 63.209c0.444 0.305 1.028 0.361 1.5 0.667-6.415 12.331-14.469 24.384-21.551 33.798-4.666 6.249-8.887 11.414-11.886 14.941l-3.471 3.971-0.861 0.972-0.167 0.194c-7.721 8.276-9.637 20.496-4.832 30.743 4.832 10.248 15.469 16.552 26.744 15.913 2.638-0.305 49.406-2.86 98.618-34.132 24.495-15.663 49.462-38.936 67.93-72.262 18.468-33.298 30.16-76.206 30.105-129.722 0-25.828-2.86-54.349-8.693-85.537 151.19-270.636 160.104-428.047 160.049-459.762v0zM636.142 135.69c43.796-32.521 78.455-52.489 102.617-64.625-10.664 80.372-58.487 276.579-265.998 579.486l-84.176-58.932 141.275-200.401c4.416-6.249 2.916-14.913-3.36-19.329s-14.941-2.944-19.357 3.333l-141.303 200.457-84.454-59.126c143.025-199.874 266.776-315.432 354.757-380.862v0zM189.877 501.583c4.666-19.94 13.636-41.213 30.299-61.181 18.774-22.467 48.323-44.379 94.841-60.709-20.94 26.244-42.296 54.155-64.097 84.065-15.774 3.583-29.466 11.164-41.186 19.968-7.248 5.499-13.719 11.609-19.857 17.857v0zM339.123 638.609l3.027-11.692 7.137 4.999-10.164 6.693zM590.596 577.317c-0.028 45.657-9.665 78.4-23.162 102.783-13.691 24.661-31.826 41.297-50.184 52.85 1.722-3.527 3.61-6.887 5.166-10.609 6.304-15.274 11.136-31.938 11.192-50.017 0-3.749-0.278-7.582-0.778-11.442 20.634-30.688 40.075-60.543 57.599-89.12 0.028 1.833 0.167 3.777 0.167 5.554zM213.4 843.065l63.681-90.953c8.804-12.581 5.749-29.882-6.804-38.686-12.581-8.804-29.882-5.749-38.686 6.832l-63.681 90.953c-8.804 12.581-5.749 29.882 6.832 38.686 12.553 8.804 29.882 5.749 38.658-6.832zM326.848 798.297l-127.417 181.989c-8.804 12.553-5.749 29.882 6.832 38.686 12.553 8.804 29.855 5.749 38.658-6.832l127.417-181.989c8.804-12.553 5.749-29.855-6.832-38.658-12.553-8.804-29.882-5.749-38.658 6.804zM171.104 680.406c-12.553-8.804-29.882-5.749-38.658 6.804l-127.417 181.989c-8.804 12.553-5.749 29.882 6.832 38.686 12.553 8.776 29.855 5.749 38.658-6.832l127.417-181.961c8.804-12.581 5.749-29.882-6.832-38.686zM543.218 346.394c7.609 5.304 16.302 7.859 24.911 7.859 13.691 0 27.161-6.443 35.631-18.524 13.775-19.69 9.026-46.768-10.664-60.543-7.582-5.332-16.274-7.887-24.884-7.887-13.719 0-27.189 6.471-35.659 18.552-13.719 19.662-8.998 46.768 10.664 60.543z"
906
+ ],
907
+ "attrs": [],
908
+ "isMulticolor": false,
909
+ "width": 800,
910
+ "grid": 0,
911
+ "tags": [
912
+ "rocket"
913
+ ],
914
+ "colorPermutations": {}
915
+ },
916
+ {
917
+ "id": 25,
918
+ "paths": [
919
+ "M568 848h-112l20.8-120c-28.8-12.8-48-41.6-48-75.2 0-46.4 36.8-83.2 83.2-83.2s83.2 36.8 83.2 83.2c0 33.6-19.2 62.4-48 75.2l20.8 120zM624 456h-224v-168c0-62.4 51.2-112 112-112s112 49.6 112 112v168zM736 456v-168c0-123.2-100.8-224-224-224s-224 100.8-224 224v168h-56c-30.4 0-56 25.6-56 56v392c0 30.4 25.6 56 56 56h560c30.4 0 56-25.6 56-56v-392c0-30.4-25.6-56-56-56h-56z"
920
+ ],
921
+ "attrs": [],
922
+ "isMulticolor": false,
923
+ "tags": [
924
+ "lock"
925
+ ],
926
+ "defaultCode": 97,
927
+ "grid": 0,
928
+ "colorPermutations": {}
929
+ },
930
+ {
931
+ "id": 26,
932
+ "paths": [
933
+ "M800 448h-64v-160c0-123.2-100.8-224-224-224s-224 100.8-224 224c0 0 0 40 0 48s8 16 16 16 72 0 80 0c8 0 16-8 16-16s0-48 0-48c0-62.4 51.2-112 112-112 62.4 0 112 49.6 112 112v160h-400c-30.4 0-48 17.6-48 48v408c0 30.4 25.6 56 56 56h560c30.4 0 56-25.6 56-56v-408c0-30.4-17.6-48-48-48zM547.2 728l20.8 120h-112l20.8-120c-28.8-12.8-48-41.6-48-75.2 0-46.4 36.8-83.2 83.2-83.2s83.2 36.8 83.2 83.2c0 32-19.2 60.8-48 75.2z"
934
+ ],
935
+ "attrs": [],
936
+ "isMulticolor": false,
937
+ "tags": [
938
+ "unlock"
939
+ ],
940
+ "defaultCode": 99,
941
+ "grid": 0,
942
+ "colorPermutations": {}
943
+ },
944
+ {
945
+ "id": 27,
946
+ "paths": [
947
+ "M272 224c16-16 544 512 528 528-65.6 65.6-160 112-272 112-75.2 0-164.8 0-224 0-12.8 0-24 4.8-32 12.8-20.8 17.6-38.4 38.4-59.2 57.6-35.2 33.6-86.4 33.6-120 0-35.2-33.6-35.2-84.8-1.6-121.6 17.6-19.2 38.4-36.8 56-57.6 8-9.6 12.8-22.4 12.8-35.2 0-67.2 0-139.2 0-224 0-112 48-208 112-272zM785.6 606.4c-16 16-128-96-112-112s139.2-137.6 176-174.4c33.6-33.6 144 80 112 110.4-59.2 59.2-116.8 116.8-176 176zM545.6 366.4c-16 16-128-96-112-112s139.2-137.6 176-174.4c33.6-33.6 144 80 112 110.4-59.2 59.2-116.8 116.8-176 176z"
948
+ ],
949
+ "attrs": [],
950
+ "isMulticolor": false,
951
+ "tags": [
952
+ "plugin"
953
+ ],
954
+ "defaultCode": 100,
955
+ "grid": 0,
956
+ "colorPermutations": {}
957
+ },
958
+ {
959
+ "id": 39,
960
+ "paths": [
961
+ "M779.2 667.2c-27.2 27.2-67.2 27.2-94.4 0l-172.8-172.8-172.8 172.8c-27.2 27.2-67.2 27.2-94.4 0s-27.2-67.2 0-94.4l204.8-204.8c14.4-14.4 32-32 62.4-32s49.6 17.6 62.4 32l204.8 204.8c27.2 27.2 27.2 67.2 0 94.4z"
962
+ ],
963
+ "attrs": [],
964
+ "isMulticolor": false,
965
+ "tags": [
966
+ "caret up"
967
+ ],
968
+ "defaultCode": 114,
969
+ "grid": 0,
970
+ "colorPermutations": {}
971
+ },
972
+ {
973
+ "id": 71,
974
+ "paths": [
975
+ "M451.2 779.2l204.8-204.8c14.4-14.4 32-32 32-62.4s-17.6-49.6-32-62.4l-204.8-204.8c-27.2-27.2-67.2-27.2-94.4 0s-27.2 67.2 0 94.4l172.8 172.8-172.8 172.8c-27.2 27.2-27.2 67.2 0 94.4s67.2 27.2 94.4 0z"
976
+ ],
977
+ "attrs": [],
978
+ "isMulticolor": false,
979
+ "tags": [
980
+ "caret right"
981
+ ],
982
+ "defaultCode": 101,
983
+ "grid": 0,
984
+ "colorPermutations": {}
985
+ },
986
+ {
987
+ "id": 28,
988
+ "paths": [
989
+ "M779.2 451.2l-204.8 204.8c-14.4 14.4-32 32-62.4 32s-49.6-17.6-62.4-32l-204.8-204.8c-27.2-27.2-27.2-67.2 0-94.4s67.2-27.2 94.4 0l172.8 172.8 172.8-172.8c27.2-27.2 67.2-27.2 94.4 0s27.2 67.2 0 94.4z"
990
+ ],
991
+ "attrs": [],
992
+ "isMulticolor": false,
993
+ "tags": [
994
+ "caret down"
995
+ ],
996
+ "defaultCode": 101,
997
+ "grid": 0,
998
+ "colorPermutations": {}
999
+ },
1000
+ {
1001
+ "id": 72,
1002
+ "paths": [
1003
+ "M572.8 779.2l-204.8-204.8c-14.4-14.4-32-32-32-62.4s17.6-49.6 32-62.4l204.8-204.8c27.2-27.2 67.2-27.2 94.4 0s27.2 67.2 0 94.4l-172.8 172.8 172.8 172.8c27.2 27.2 27.2 67.2 0 94.4s-67.2 27.2-94.4 0z"
1004
+ ],
1005
+ "attrs": [],
1006
+ "isMulticolor": false,
1007
+ "tags": [
1008
+ "caret left"
1009
+ ],
1010
+ "defaultCode": 101,
1011
+ "grid": 0,
1012
+ "colorPermutations": {}
1013
+ },
1014
+ {
1015
+ "id": 29,
1016
+ "paths": [
1017
+ "M848 233.6c-16-20.8-46.4-24-67.2-6.4-20.8 16-24 46.4-6.4 67.2v0c48 59.2 75.2 131.2 75.2 212.8 0 92.8-38.4 177.6-99.2 238.4s-145.6 99.2-238.4 99.2c-92.8 0-177.6-38.4-238.4-99.2s-99.2-145.6-99.2-238.4c0-80 27.2-153.6 75.2-212.8 16-20.8 12.8-49.6-6.4-67.2-20.8-16-49.6-12.8-67.2 6.4-60.8 75.2-96 169.6-96 272 0 118.4 48 227.2 126.4 305.6s185.6 126.4 305.6 126.4c118.4 0 227.2-48 305.6-126.4s126.4-187.2 126.4-307.2c0-102.4-35.2-196.8-96-270.4zM512 561.6c27.2 0 48-20.8 48-48v-384c0-27.2-20.8-48-48-48s-48 20.8-48 48v384c0 27.2 20.8 48 48 48z"
1018
+ ],
1019
+ "attrs": [],
1020
+ "isMulticolor": false,
1021
+ "tags": [
1022
+ "power"
1023
+ ],
1024
+ "defaultCode": 102,
1025
+ "grid": 0,
1026
+ "colorPermutations": {}
1027
+ },
1028
+ {
1029
+ "id": 31,
1030
+ "paths": [
1031
+ "M512 156.8c195.2 0 355.2 158.4 355.2 355.2s-160 355.2-355.2 355.2-355.2-160-355.2-355.2 160-355.2 355.2-355.2zM512 64c-248 0-448 200-448 448s200 448 448 448 448-200 448-448-200-448-448-448z"
1032
+ ],
1033
+ "attrs": [],
1034
+ "isMulticolor": false,
1035
+ "tags": [
1036
+ "radio_default"
1037
+ ],
1038
+ "defaultCode": 104,
1039
+ "grid": 0,
1040
+ "colorPermutations": {}
1041
+ },
1042
+ {
1043
+ "id": 30,
1044
+ "paths": [
1045
+ "M512 64c-248 0-448 200-448 448s200 448 448 448 448-200 448-448-200-448-448-448zM720 464l-176 176c-3.2 3.2-28.8 32-64 32s-60.8-28.8-64-32l-112-112c-16-16-16-48 0-64s48-14.4 64 1.6l112 110.4 176-176c16-16 48-16 64 0s16 48 0 64z"
1046
+ ],
1047
+ "attrs": [],
1048
+ "isMulticolor": false,
1049
+ "tags": [
1050
+ "radio_checked"
1051
+ ],
1052
+ "defaultCode": 103,
1053
+ "grid": 0,
1054
+ "colorPermutations": {}
1055
+ },
1056
+ {
1057
+ "id": 45,
1058
+ "paths": [
1059
+ "M608 512l208-208c28.8-28.8 28.8-67.2 0-96s-67.2-28.8-96 0l-208 208-208-208c-28.8-28.8-67.2-28.8-96 0s-28.8 67.2 0 96l208 208-208 208c-28.8 28.8-28.8 67.2 0 96s67.2 28.8 96 0l208-208 208 208c28.8 28.8 67.2 28.8 96 0s28.8-67.2 0-96l-208-208z"
1060
+ ],
1061
+ "attrs": [],
1062
+ "isMulticolor": false,
1063
+ "tags": [
1064
+ "cross"
1065
+ ],
1066
+ "defaultCode": 121,
1067
+ "grid": 0,
1068
+ "colorPermutations": {}
1069
+ },
1070
+ {
1071
+ "id": 46,
1072
+ "paths": [
1073
+ "M400 667.2l-256-256c-28.8-28.8-83.2-28.8-112 0s-28.8 83.2 0 112l304 304c14.4 14.4 32 32 64 32s49.6-17.6 64-32l528-528c28.8-28.8 28.8-83.2 0-112s-83.2-28.8-112 0l-480 480z"
1074
+ ],
1075
+ "attrs": [],
1076
+ "isMulticolor": false,
1077
+ "tags": [
1078
+ "tick"
1079
+ ],
1080
+ "defaultCode": 122,
1081
+ "grid": 0,
1082
+ "colorPermutations": {}
1083
+ },
1084
+ {
1085
+ "id": 34,
1086
+ "paths": [
1087
+ "M923.2 822.4l-228.8-230.4c33.6-52.8 52.8-112 52.8-179.2-1.6-184-150.4-332.8-334.4-332.8s-332.8 148.8-332.8 332.8 148.8 332.8 332.8 332.8c67.2 0 126.4-19.2 179.2-52.8l230.4 230.4c28.8 28.8 73.6 28.8 100.8 0s27.2-73.6 0-100.8zM174.4 412.8c0-131.2 105.6-238.4 238.4-238.4s238.4 105.6 238.4 238.4-107.2 236.8-238.4 236.8-238.4-105.6-238.4-236.8z"
1088
+ ],
1089
+ "attrs": [],
1090
+ "isMulticolor": false,
1091
+ "tags": [
1092
+ "search"
1093
+ ],
1094
+ "defaultCode": 107,
1095
+ "grid": 0,
1096
+ "colorPermutations": {}
1097
+ },
1098
+ {
1099
+ "id": 37,
1100
+ "paths": [
1101
+ "M512 160c195.2 0 352 156.8 352 352s-156.8 352-352 352-352-156.8-352-352 156.8-352 352-352zM512 64c-248 0-448 200-448 448s200 448 448 448 448-200 448-448-200-448-448-448zM523.2 563.2c0 11.2 6.4 19.2 6.4 30.4 0 14.4-11.2 28.8-27.2 28.8-27.2 0-41.6-41.6-41.6-64 0-92.8 121.6-102.4 121.6-174.4 0-33.6-24-62.4-76.8-62.4-36.8 0-65.6 14.4-88 36.8-6.4 4.8-12.8 8-20.8 8-16 0-30.4-14.4-30.4-32 0-6.4 1.6-14.4 6.4-19.2 32-38.4 84.8-59.2 139.2-59.2 88 0 142.4 51.2 142.4 116.8 1.6 110.4-131.2 120-131.2 190.4zM508.8 768c-24 0-44.8-20.8-44.8-46.4 0-24 19.2-46.4 44.8-46.4 24 0 44.8 22.4 44.8 46.4-1.6 25.6-22.4 46.4-44.8 46.4z"
1102
+ ],
1103
+ "attrs": [],
1104
+ "isMulticolor": false,
1105
+ "tags": [
1106
+ "info"
1107
+ ],
1108
+ "defaultCode": 112,
1109
+ "grid": 0,
1110
+ "colorPermutations": {}
1111
+ },
1112
+ {
1113
+ "id": 10,
1114
+ "paths": [
1115
+ "M798 468c18-10 32-30 32-52 0-32-26-58-58-58-34-120-62-230-62-230s-34-128-198-128c-164 0-198 128-198 128s-28 110-62 230c-32 0-58 26-58 58 0 22 14 42 32 52-32 118-62 224-62 224 0 10 22 22 56 28 10-40 22-98 36-146 22-76 58-120 120-142-36-12-54-58-62-110l124 66 78-74 14 198h-110c0 0 70 36 146 36 8-6 4-84 0-182l22 26 126-66c-8 48-26 94-64 106 64 26 104 70 122 142 10 48 26 106 36 146 34-6 56-18 56-28-4 0-34-106-66-224zM420 304l-90-74 150 16zM604 304l-62-58 150-16zM798 728c0 0-148 66-216 66-70 0-66-58-66-66h-8c-4 8 4 66-66 66-68 0-216-66-216-66l-44 182 330 114 332-114zM458 622h108v36h-108z"
1116
+ ],
1117
+ "attrs": [],
1118
+ "isMulticolor": false,
1119
+ "tags": [
1120
+ "wpmudev-devman"
1121
+ ],
1122
+ "defaultCode": 108,
1123
+ "grid": 0,
1124
+ "colorPermutations": {}
1125
+ },
1126
+ {
1127
+ "id": 16,
1128
+ "paths": [
1129
+ "M810 356l-18-234-122-82-112-12-180 166 228 24zM16 580l176 86 26-322-198 182zM1012 580l-496 244 210 104 302-148zM984 254l-192-132 42 546 178-88zM316 0l-274 254-22 272 538-498zM0 780l514 248 212-100-710-348z"
1130
+ ],
1131
+ "attrs": [],
1132
+ "isMulticolor": false,
1133
+ "tags": [
1134
+ "wpmudev-upfront"
1135
+ ],
1136
+ "defaultCode": 68,
1137
+ "grid": 0,
1138
+ "colorPermutations": {}
1139
+ },
1140
+ {
1141
+ "id": 62,
1142
+ "paths": [
1143
+ "M757.583 355.928c11.477-11.477 18.575-27.331 18.575-44.844 0-35.025-28.394-63.419-63.419-63.419-17.513 0-33.368 7.098-44.844 18.575-10.923 11.137-17.664 26.409-17.664 43.255 0 0.372 0.003 0.744 0.010 1.115-0.009 0.316-0.013 0.754-0.013 1.193 0 34.42 27.903 62.323 62.323 62.323 0.439 0 0.877-0.005 1.314-0.014-0.064 0.001-0.062 0.001-0.061 0.001 17.106 0 32.589-6.951 43.778-18.183zM623.051 400.772c-22.791-22.051-36.94-52.915-36.94-87.082 0-1.103 0.015-2.202 0.044-3.297-0.060-1.246-0.092-2.898-0.092-4.558 0-69.717 56.517-126.234 126.234-126.234s126.234 56.517 126.234 126.234c0 1.66-0.032 3.312-0.096 4.957 0.068 1.193 0.102 2.87 0.102 4.555 0 33.365-13.531 63.569-35.405 85.426-22.405 21.845-53.059 35.319-86.861 35.319-0.498 0-0.995-0.003-1.491-0.009-1.977 0.127-4.375 0.198-6.791 0.198-33.231 0-63.289-13.581-84.928-35.496zM784.772 776.828c0-0.098 0-0.214 0-0.33 0-28.728-2.182-56.946-6.39-84.498q-6.674-51.469 6.39-64.711c-104.163 104.549 12.74 3.697 101.875-118.677-55.039 80.477 21.701-15.244 74.999-124.498-5.498 21.297 27.966-51.503 46.666-130.027 10.199-43.067 15.641-88.167 15.687-134.53q0-74.712-23.834-97.664t-95.868-21.892c-46.070 0.004-91.085 5.603-134.153 16.159 28.939-12.216-54.196 10.331-129.672 46.343 77.853-41.806-31.522 6.241-125.255 74.477 118.509-87.564-12.674-5.057-119.168 102.027q-12.226 12.226-68.722 6.047t-80.154-6.003c-3.046-0.29-6.585-0.455-10.163-0.455-25.805 0-49.602 8.597-68.684 23.082q-27.084 23.276-41.384 37.224c27.28-35.625-31.619 25.214-72.705 97.5q-36.581 63.162-46.115 81.877c-4.572 7.318-7.283 16.205-7.283 25.726 0 13.972 5.838 26.58 15.208 35.519 10.411 14.901 29.204 26.422 50.759 28.422l107.274 0.021q54.731 0 72.386 0c0.62 55.862 25.696 107.667 65.339 143.745 34.953 38.736 86.445 64.019 143.857 65.113q1.077 17.658 0.194 72.389t0 106.99c0.871 20.401 11.99 40.168 28.77 52.832 8.854 9.49 21.208 15.327 34.926 15.327 9.675 0 18.672-2.904 26.166-7.888l78.745-45.441c-29.723 23.258 42.571-18.267 100.585-74.45q13.821-13.826 37.302-41.014c14.292-18.785 22.897-42.572 22.897-68.369 0-3.652-0.172-7.264-0.51-10.828zM378.703 814.257q-50.494 0-111.228-60.734t-60.734-111.228q0.883-27.012-17.655-28.072c-0.688-0.041-1.493-0.064-2.303-0.064-11.959 0-22.741 5.038-30.339 13.107l-105.951 105.952c-7.15 6.829-11.595 16.437-11.595 27.084 0 1.655 0.107 3.285 0.316 4.884q1.922 18.526 28.052 20.292h69.208q-10.593 26.659-24.541 58.968t-27.189 60.557c-3.134 4.806-4.999 10.688-4.999 17.006 0 6.87 2.204 13.225 5.945 18.397 4.631 3.246 10.481 5.244 16.797 5.244s12.166-1.998 16.951-5.397q24.274-11.062 61.526-26.951l59.851-25.247q0 13.065 0 27.542t0 41.49c-0.233 1.233-0.367 2.652-0.367 4.102 0 11.657 8.624 21.3 19.841 22.896 2.129 0.405 4.435 0.628 6.794 0.628 10.166 0 19.363-4.151 25.988-10.851l104.875-104.875c6.815-8.468 10.939-19.352 10.939-31.2 0-1.447-0.061-2.879-0.182-4.295q-1.4-19.060-29.471-19.060z"
1144
+ ],
1145
+ "attrs": [],
1146
+ "isMulticolor": false,
1147
+ "grid": 0,
1148
+ "tags": [
1149
+ "hummingbird"
1150
+ ],
1151
+ "colorPermutations": {}
1152
+ },
1153
+ {
1154
+ "id": 69,
1155
+ "paths": [
1156
+ "M836.149 346.571c7.483-36.21-2.216 28.877-18.984 91.063 12.733-9.516-27.719 112.534-90.884 219.586 21.638-1.365-83.817 143.882-221.683 248.702l-22.964 17.090c-4.412 2.891-9.818 4.611-15.625 4.611s-11.213-1.72-15.735-4.679l-2.538-0.815-19.421-14.654c-2.618 20.020-135.11-100.592-223.789-250.229-6.611-11.597-11.025-19.365-15.262-27.134 60.454 104.853 3.792 19.941-35.933-73.884-43.388-102.226-67.491-215.092-67.526-333.584-0-1.073-0-2.132-0-3.015 0-8.828 0-17.655 0-26.306-0.023-0.422-0.037-0.916-0.037-1.412s0.013-0.991 0.040-1.481c-0.066-0.646-0.102-1.476-0.102-2.315s0.036-1.67 0.106-2.49c0.831-7.653 6.206-15.435 13.802-19.771-1.342 0.6 1.387-0.991 4.392-1.97l0.16-0.045c8.651-3.884 17.655-7.768 25.953-11.299-68.26 26.429 17.317-13.015 109.005-37.494 71.809-19.158 147.446-29.39 225.473-29.39s153.664 10.232 225.643 29.427c-63.3-19.62 30.059 3.042 116.233 39.39q8.491 3.717 22.439 10.249c9.004 4.137 15.58 13.234 16.239 23.931l0.004 0.081c0 10.063 0 20.127 0 30.19 0 1.059 0 2.119 0 3.178 0.001 0.449 0.001 0.98 0.001 1.511 0 43.386-3.274 86.007-9.588 127.63zM732.866 444.734h-2.648l-5.297 0.883c14.98-20.528-234.445 43.985-461.092 149.267l12.474-5.2-3.178 1.412-6.532 3.001c-12.357 7.588-20.477 21.030-20.48 36.369-0.008 0.316-0.013 0.688-0.013 1.061 0 8.020 2.237 15.517 6.122 21.901l-0.105-0.187c-28.723-16.918 67.487 115.537 192.366 212.951l5.196 4.031c-2.892-1.681 0.951 0.982 5.257 2.746 3.281 1.292 6.831 1.996 10.545 1.996s7.264-0.704 10.524-1.985c-2.767 1.345 1.597-0.349 5.4-2.832l3.232-2.573c-2.954 22.686 121.104-90.887 204.65-231.368-27.53 56.203 30.813-39.564 67.65-145.403 1.709-7.759 3.121-9.701 3.827-11.82v0c0.086-0.873 0.135-1.887 0.135-2.913s-0.049-2.040-0.144-3.041c-0.085-15.408-12.554-28.001-28.034-28.297zM787.597 195.972c1.65 0.612-4.461-4.267-11.547-7.308 69.21 26.78-10.842-9.765-96.458-32.707-68.289-18.189-140.156-27.892-214.29-27.892s-146.001 9.703-214.401 27.908c65.558-19.796-21.197 1.107-101.41 34.56 6.226-3.164-1.027 0.568-6.877 5.828-2.485 1.051-8.402 8.523-11.519 17.32-1.364 3.399-2.395 8.149-2.562 13.118l-0.002 2.718c0.178 93.262 18.101 188.172 50.737 275.925l0.639 1.085c4.879 9.2 14.396 15.36 25.352 15.36 0.025 0 0.050-0 0.076-0 2.876-0.001 5.68-0.453 8.313-1.289l7.22-3.301 15.007-5.297c12.421-23.546 252.262-113.836 508.637-154.443l11.131-1.453 7.062-0.883c16.607-3.504 30.083-17.498 32.981-35.059l0.034-2.37c2.806-17.151 5.717-52.069 6.346-87.545l0.010-0.731v-3.531c-0.301-11.393-5.827-22.388-14.431-29.973zM928.839 155.012v0-3.884c-1.45-19.185-13.611-37.652-31.129-48.035l-8.595-3.871c-123.554-62.554-269.36-99.192-423.724-99.192s-300.171 36.639-429.198 101.694l-0.706 0.5c-17.981 9.809-31.053 29.183-32.476 51.721l-0.009 0.185c-2.295 22.422-3.001 45.55-3.001 68.502-0 0.347-0.001 0.758-0.001 1.168 0 132.824 27.602 259.201 77.382 373.708q15.309 34.37 35.789 72.859c0.214 48.775 134.179 221.365 308.837 337.68l13.546 8.714c8.615 4.561 18.832 7.239 29.674 7.239 0.057 0 0.115-0 0.172-0 0.27 0.004 0.6 0.007 0.93 0.007 10.76 0 20.893-2.681 29.769-7.412l9.545-6.19c170.176-91.26 341.8-313.48 402.374-578.038q10.227-46.955 15.7-88.974c4.833-36.003 7.592-77.623 7.592-119.887 0-0.245-0-0.491-0-0.736q-0.353-34.213-2.825-67.758z"
1157
+ ],
1158
+ "attrs": [],
1159
+ "isMulticolor": false,
1160
+ "width": 931,
1161
+ "grid": 0,
1162
+ "tags": [
1163
+ "defender"
1164
+ ],
1165
+ "colorPermutations": {}
1166
+ },
1167
+ {
1168
+ "id": 35,
1169
+ "paths": [
1170
+ "M336 256c113.6 113.6 224 224 336 336 16 16 16 33.6 0 48-24 24-57.6 57.6-80 80-16 16-32 16-48 0-17.6-17.6-62.4-62.4-80-80-30.4-28.8-51.2-12.8-64 0-16 16-80 128-160 208-81.6 81.6-152 104-208 48s-33.6-126.4 48-208c80-80 192-144 208-160s32-32 0-64c-19.2-19.2-60.8-60.8-80-80-16-16-16-32 0-48 24-24 56-56 80-80 16-16 32-17.6 48 0zM384 160c17.6-17.6 36.8-35.2 56-52.8 27.2-25.6 62.4-19.2 94.4-16 44.8 4.8 84.8 24 121.6 51.2 32 25.6 64 52.8 99.2 75.2 81.6 54.4 169.6 92.8 268.8 73.6-80 80-176 172.8-256 252.8-16 16-32 16-48 0-30.4-30.4-310.4-308.8-337.6-336-14.4-14.4-14.4-32 1.6-48z"
1171
+ ],
1172
+ "attrs": [],
1173
+ "isMulticolor": false,
1174
+ "tags": [
1175
+ "theme"
1176
+ ],
1177
+ "defaultCode": 108,
1178
+ "grid": 0,
1179
+ "colorPermutations": {}
1180
+ },
1181
+ {
1182
+ "id": 58,
1183
+ "paths": [
1184
+ "M1005.714 124.343l-105.874-106.057c-11.205-10.989-26.57-17.772-43.52-17.772s-32.315 6.783-43.53 17.782l-90.139 89.773c-5.001 4.942-8.098 11.801-8.098 19.383s3.097 14.441 8.095 19.38l155.066 154.883c4.933 4.946 11.755 8.006 19.291 8.006s14.358-3.060 19.291-8.005l89.418-90.332c11.28-10.805 18.29-25.989 18.29-42.81 0-0.25-0.002-0.499-0.005-0.748 0.003-0.173 0.005-0.423 0.005-0.672 0-16.821-7.010-32.005-18.269-42.79zM85.577 764.343l-6.4 4.754-1.646 4.754-75.703 219.429-1.829 5.669c-0.513 1.557-0.809 3.35-0.809 5.211s0.296 3.654 0.843 5.333c-0.303 0.398 1.78 4.222 4.722 7.195 1.212 2.436 4.596 5.222 8.667 6.372 1.411 0.533 2.92 0.826 4.497 0.826s3.085-0.294 4.474-0.829l4.669-3.263 219.429-74.24 6.4-3.291 4.754-4.754c3.012-4.003 4.823-9.059 4.823-14.537s-1.811-10.534-4.868-14.6l-146.241-146.223c-3.377-2.079-7.47-3.311-11.849-3.311-0.334 0-0.667 0.007-0.998 0.021-0.021-0.003-0.101-0.003-0.181-0.003-4.96 0-9.371 2.351-12.18 6zM141.897 727.771l154.697 154.88c4.341 4.569 10.461 7.411 17.245 7.411 0.753 0 1.497-0.035 2.232-0.103 8.182-0.993 15.802-6.995 19.227-15.186l508.222-505.218c4.805-1.237 8.299-5.531 8.299-10.641 0-0.83-0.092-1.638-0.267-2.415 0.044-0.358 0.062-0.86 0.062-1.367 0-6.796-3.142-12.858-8.052-16.813l-154.739-154.912c-4.933-4.946-11.755-8.006-19.291-8.006s-14.358 3.060-19.291 8.005l-507.612 505.783c-4.946 4.933-8.006 11.755-8.006 19.291s3.060 14.358 8.005 19.291z"
1185
+ ],
1186
+ "attrs": [],
1187
+ "isMulticolor": false,
1188
+ "grid": 0,
1189
+ "tags": [
1190
+ "pencil",
1191
+ "edit"
1192
+ ],
1193
+ "colorPermutations": {}
1194
+ },
1195
+ {
1196
+ "id": 53,
1197
+ "paths": [
1198
+ "M1061.82 351.266h-294.154c-0.215 0.002-0.468 0.003-0.722 0.003-32.971 0-61.217-20.227-73.008-48.949 2.219 5.396-0.573-0.484-2.378-6.781l-86.442-257.146-2.101-6.494c-8.374-19.126-27.135-32.245-48.96-32.245-23.194 0-42.927 14.817-50.25 35.502l-0.115 0.373-87.291 257.862c1.558-5.097-0.132 1.945-2.835 8.46-12.006 28.401-40.045 48.274-72.727 48.274-0.296 0-0.592-0.002-0.887-0.005l0.045 0h-294.727c-25.642 3.248-45.271 24.925-45.271 51.186 0 0.136 0.001 0.272 0.002 0.407 0.027 16.564 8.167 31.293 20.675 40.373l2.628 1.819 229.211 161.021c20.484 13.761 33.881 36.915 34 63.206 0 0.107 0.001 0.211 0.001 0.316 0 6.067-0.767 11.955-2.208 17.572 1.142-2.679-1.008 5.384-4.459 12.715l-86.355 256.883v1.91c-1.388 4.412-2.187 9.486-2.187 14.747 0 28.061 22.748 50.808 50.808 50.808 0.702 0 1.401-0.014 2.096-0.042-0.047 0.003 0.015 0.004 0.077 0.004 9.536 0 18.494-2.478 26.264-6.826l8.705-6.163 231.885-162.74c12.206-7.704 27.058-12.276 42.977-12.276s30.771 4.572 43.314 12.474c-7.243-4.386 0.917-0.236 7.788 5.423l-0.102-0.082 231.885 162.931c7.777 4.564 17.128 7.259 27.108 7.259 0.073 0 0.145-0 0.218-0 0.221 0.004 0.495 0.006 0.77 0.006 28.12 0 51.003-22.423 51.745-50.364-0.002-5.381-0.911-10.616-2.582-15.497l0.101-2.144-88.055-258.435c1.605 4.417-1.49-2.474-3.341-9.859-1.674-6.132-2.58-12.65-2.58-19.38 0-0.062 0-0.124 0-0.186 0.066-24.265 11.745-45.936 29.802-59.64l6.108-4.338 226.155-158.729 6.303-4.011c11.197-8.706 18.704-22.538 19.1-38.138-0.050-26.51-20.083-48.268-45.805-51.043z"
1199
+ ],
1200
+ "attrs": [],
1201
+ "isMulticolor": false,
1202
+ "width": 1108,
1203
+ "grid": 0,
1204
+ "tags": [
1205
+ "star"
1206
+ ],
1207
+ "colorPermutations": {}
1208
+ },
1209
+ {
1210
+ "id": 52,
1211
+ "paths": [
1212
+ "M57.026 56.85c-0 0-0 0-0 0 0 31.397 25.452 56.85 56.85 56.85 0.062 0 0.124-0 0.177-0h568.497c0 0 0 0 0 0 31.397 0 56.85-25.452 56.85-56.85s-25.452-56.85-56.85-56.85c-0 0-0 0-0 0l-568.506 0c-31.383 0.099-56.817 25.472-57.017 56.85zM739.585 341.274c31.286-0.099 56.641-25.392 56.84-56.673l-0-57.026c0-0 0-0.001 0-0.001 0-31.397-25.452-56.85-56.85-56.85-0.124 0-0.248 0-0.353 0.001l-681.833 0c-0.062-0-0.124-0-0.186-0-31.433 0-56.926 25.431-57.026 56.85l-0 56.85c0 31.397 25.452 56.85 56.85 56.85l0 625.523c-0 0-0 0-0 0 0 31.53 25.51 57.102 57.026 57.202l568.516-0c31.457-0.2 56.908-25.713 57.007-57.203v-625.523zM170.726 341.274h113.699v569.026h-113.699v-569.026zM341.451 341.274h113.699v569.026h-113.699v-569.026zM512.177 341.274h113.699v569.026h-113.876v-569.026z"
1213
+ ],
1214
+ "attrs": [],
1215
+ "isMulticolor": false,
1216
+ "width": 796,
1217
+ "grid": 0,
1218
+ "tags": [
1219
+ "trash"
1220
+ ],
1221
+ "colorPermutations": {}
1222
+ },
1223
+ {
1224
+ "id": 56,
1225
+ "paths": [
1226
+ "M0 719.978c3.708-17.655 6.532-35.31 11.299-51.377-7.126 8.74 11.71-43.949 40.441-89.805q27.355-46.14 55.426-93.985l5.12-9.357c-17.655-11.123-33.898-21.539-50.141-33.015 5.822 5.696-10.335-5.639-22.639-20.313-4.919-5.51-7.844-12.605-7.844-20.383 0-9.889 4.727-18.675 12.046-24.219-3.645 1.351 9.614-8.768 24.869-15.010 56.421-23.003 112.387-45.249 168.178-67.494-6.106 1.961 5.043-2.664 16.931-5.336 4.708-1.271 9.284-1.923 14.013-1.923 26.118 0 47.589 19.9 50.077 45.365 0.783 4.665 1.359 11.168 1.428 17.793 0.001 57.978 0.001 116.063 0.001 173.972-0.021 10.077-2.028 20.3-5.67 29.708-4.239 12.323-16.269 21.427-30.425 21.427-3.504 0-6.878-0.558-10.037-1.589 6.52 3.21-10.628-2.488-25.818-11.211-5.909-3.025-11.736-7.615-17.032-11.499l-19.068-12.359c8.284-9.307 1.068-2.312-4.432 5.926q-27.524 46.156-54.89 92.060c-6.004 6.006-17.172 30.182-21.757 56.615-1.298 6.087-1.965 11.997-1.965 18.063 0 36.533 24.174 67.419 57.399 77.535 13.393 5.084 32.907 9.050 53.262 9.677 47.947 1.243 95.616 0.007 143.991 0.007v127.47c-2.295 0-4.767 0-7.415 0-47.669 0-95.338 0-143.007 0-1.38 0.024-3.009 0.037-4.641 0.037-53.195 0-103.050-14.302-145.929-39.269-40.348-21.217-73.7-67.505-80.455-122.039 0.117-0.52-0.434-3.603-1.382-6.506l0.065-38.965z",
1227
+ "M529.655 0c8.121 1.766 16.066 3.354 24.011 5.473 41.158 5.964 94.925 41.852 129.257 92.078 26.639 37.158 48.531 76.529 72.365 114.664 5.473 8.651 10.417 17.655 16.066 27.189 17.655-11.652 34.251-23.305 51.553-33.721-3.028 0.505 11.386-7.634 27.317-12.175 3.654-1.177 6.994-1.751 10.469-1.751 13.188 0 24.446 8.262 28.88 19.893 3.479 7.925 5.842 18.24 6.072 29.080 0.001 59.408 0.001 118.729 0.001 178.051-0.015 8.262-1.436 16.972-4.052 25.147-9.543 30.29-39.733 43.179-73.808 30.467-39.548-14.83-78.742-30.543-118.113-45.903-19.597-7.592-39.018-15.183-58.439-23.128-15.99-3.526-29.254-17.061-32.616-34.149-0.057-0.657-0.064-1.101-0.064-1.547 0-17.183 9.899-32.055 24.305-39.223 13.319-9.295 26.737-17.77 40.332-26.774 0.441 0.988-0.304-1.449-1.462-3.635-22.196-36.972-43.382-74.754-67.040-110.948 8.017 6.546-12.692-21.384-39.313-42.065-14.667-12.194-33.179-19.41-53.376-19.41s-38.71 7.216-53.099 19.211c25.271-24.464-12.142 5.895-40.479 43.481 19.652-25.731-1.942-1.266-17.598 26.949l-100.686-59.592c35.31-60.381 75.211-113.699 141.241-141.241-34.894 12.533 6.236-4.964 49.994-15.797l38.282-0.622z",
1228
+ "M735.868 799.956c7.004 0.482 15.18 0.756 23.42 0.756 23.683 0 46.837-2.267 69.257-6.596 54.391-15.17 80.344-60.543 61.453-116.334 19.88 44.969-1.019-13.112-31.86-64.551-4.156-8.188-10.689-17.899-16.515-29.022l97.633-58.439c0.396-0.012 1.445 0.414 2.31 1.070 30.175 50.13 62.661 99.035 76.255 157.297 4.796 15.802 7.557 33.964 7.557 52.77 0 36.685-10.506 70.915-28.672 99.848-15.944 29.748-59.158 63.651-110.656 76.957-28.747 8.77-62.15 14.028-96.75 14.243-17.768 0.001-34.011 0.001-53.078 0.001 0 17.655 0 33.015 0 49.258-0.026 8.341-1.711 17.96-4.778 26.939-3.703 11.521-14.901 20.166-28.118 20.166-3.391 0-6.65-0.569-9.685-1.617 1.124 1.594-12.643-3.507-24.506-11.276q-79.804-51.514-159.605-103.774c-39.371-25.777-39.018-61.44 0-87.217l149.892-97.633c5.65-3.708 11.123-7.415 17.655-10.593 32.132-17.655 58.262-3.531 59.498 33.545-0.177 17.302-0.706 34.957-0.706 54.201z"
1229
+ ],
1230
+ "attrs": [],
1231
+ "isMulticolor": false,
1232
+ "grid": 0,
1233
+ "tags": [
1234
+ "recycle"
1235
+ ],
1236
+ "colorPermutations": {}
1237
+ },
1238
+ {
1239
+ "id": 65,
1240
+ "paths": [
1241
+ "M783.177 485.669c-0.348 0.003-0.76 0.004-1.172 0.004-24.883 0-48.442-5.667-69.457-15.781-34.513-16.040-53.896-11.103-78.582 19.617-112.823 141.166-226.926 281.6-348.526 415.086q-38.766 42.24-79.36 82.834c-20.826 22.637-50.592 36.771-83.659 36.771-16.787 0-32.724-3.643-47.062-10.181-43.521-16.596-74.586-58.691-74.992-108.094-0.292-3.121-0.458-6.69-0.458-10.298 0-32.327 13.337-61.54 34.809-82.435 53.603-52.871 106.083-106.997 162.22-157.099 107.703-95.817 217.417-189.257 325.486-283.429 27.794-24.137 33.097-44.617 18.286-79.36-9.86-21.246-15.611-46.116-15.611-72.329 0-16.558 2.295-32.579 6.584-47.764 2.76-24.535 23.467-58.079 53.097-80.421-50.767 31.77 36.317-36.676 136.106-82.067 11.91-5.812 25.84-9.77 40.592-10.707 18.593-0.016 25.908 14.796 15.485 30.887 5.996-7.73-0.822 2.75-9.657 11.122-21.063 21.792-42.091 43.186-63.303 65.129-20.488 20.262-33.176 48.375-33.176 79.451s12.688 59.189 33.166 79.441c12.262 12.993 24.696 25.793 36.582 38.227 19.129 19.681 45.853 31.893 75.429 31.893s56.3-12.212 75.405-31.868c22.515-22.333 44.458-45.373 66.584-68.048 4.73-7.707 13.111-12.77 22.674-12.77 2.874 0 5.642 0.457 8.234 1.303 6.31 4.942 10.457 12.717 10.457 21.461 0 4.495-1.096 8.735-3.035 12.465 4.698-9.518-4.469 21.077-18.839 48.518-20.039 35.263-41.616 73.298-64.29 109.32-26.735 41.843-72.942 69.187-125.535 69.187-1.574 0-3.143-0.024-4.705-0.073z"
1242
+ ],
1243
+ "attrs": [],
1244
+ "isMulticolor": false,
1245
+ "width": 999,
1246
+ "grid": 0,
1247
+ "tags": [
1248
+ "fix"
1249
+ ],
1250
+ "colorPermutations": {}
1251
+ },
1252
+ {
1253
+ "id": 36,
1254
+ "paths": [
1255
+ "M380.8 547.2l96 96c6.4 6.4 17.6 6.4 24-4.8l315.2-313.6c6.4-1.6 6.4-12.8 0-19.2l-96-96c-6.4-6.4-17.6-6.4-24 0l-315.2 313.6c-6.4 6.4-6.4 17.6 0 24zM345.6 569.6l-3.2 3.2-1.6 3.2-46.4 136-1.6 3.2c-1.6 4.8 0 8 3.2 11.2s8 4.8 11.2 3.2l3.2-1.6 136-46.4 3.2-1.6 3.2-3.2c4.8-4.8 4.8-12.8 0-17.6l-91.2-91.2c-3.2-3.2-11.2-3.2-16 1.6zM916.8 172.8l-65.6-65.6c-14.4-14.4-40-14.4-54.4 0l-56 56c-6.4 6.4-6.4 17.6 0 24l96 96c6.4 6.4 17.6 6.4 24 0l56-56c14.4-14.4 14.4-40 0-54.4zM832 432c-24 0-48 24-48 48v361.6l-592 6.4v-608h352c24 0 48-24 48-48s-24-48-48-48h-400c-24 0-48 24-48 48v704c0 24 24 48 48 48h688c25.6 0 48-22.4 48-48 0-4.8 0-416 0-416 0-24-24-48-48-48z"
1256
+ ],
1257
+ "attrs": [],
1258
+ "isMulticolor": false,
1259
+ "tags": [
1260
+ "edit"
1261
+ ],
1262
+ "defaultCode": 111,
1263
+ "grid": 0,
1264
+ "colorPermutations": {}
1265
+ },
1266
+ {
1267
+ "id": 40,
1268
+ "paths": [
1269
+ "M224 512c0 61.856-50.144 112-112 112s-112-50.144-112-112c0-61.856 50.144-112 112-112s112 50.144 112 112zM624 512c0 61.856-50.144 112-112 112s-112-50.144-112-112c0-61.856 50.144-112 112-112s112 50.144 112 112zM1024 512c0 61.856-50.144 112-112 112s-112-50.144-112-112c0-61.856 50.144-112 112-112s112 50.144 112 112z"
1270
+ ],
1271
+ "attrs": [],
1272
+ "isMulticolor": false,
1273
+ "tags": [
1274
+ "options"
1275
+ ],
1276
+ "defaultCode": 115,
1277
+ "grid": 0,
1278
+ "colorPermutations": {}
1279
+ },
1280
+ {
1281
+ "id": 41,
1282
+ "paths": [
1283
+ "M740.8 512v0c0 25.6-4.8 51.2-12.8 75.2-3.2 9.6-6.4 17.6-11.2 25.6-11.2 22.4-25.6 43.2-43.2 60.8s-38.4 32-60.8 44.8c-8 4.8-17.6 8-25.6 11.2-24 8-48 12.8-75.2 12.8v0c-25.6 0-51.2-4.8-73.6-12.8-9.6-3.2-17.6-6.4-27.2-11.2-22.4-11.2-43.2-25.6-60.8-43.2s-33.6-38.4-44.8-60.8c-4.8-8-8-17.6-11.2-27.2-8-24-12.8-48-12.8-73.6s4.8-51.2 12.8-75.2c3.2-9.6 6.4-17.6 11.2-27.2 11.2-22.4 25.6-43.2 44.8-60.8 17.6-17.6 38.4-32 60.8-43.2 8-4.8 17.6-8 27.2-11.2 24-8 48-12.8 73.6-12.8v0c25.6 0 51.2 4.8 75.2 12.8 9.6 3.2 17.6 6.4 25.6 11.2 22.4 11.2 43.2 25.6 60.8 44.8 17.6 17.6 32 38.4 43.2 60.8 4.8 8 8 17.6 11.2 25.6 8 22.4 12.8 48 12.8 73.6v0 0zM958.4 470.4v0c-1.6-17.6-16-32-33.6-33.6h-20.8c-22.4 0-41.6-12.8-49.6-30.4-1.6-4.8-3.2-9.6-4.8-14.4-4.8-11.2-9.6-22.4-14.4-33.6v0c-3.2-3.2-4.8-8-6.4-12.8v0c-1.6-6.4-3.2-12.8-3.2-19.2 0-16 6.4-28.8 16-40v0l11.2-11.2c12.8-14.4 14.4-35.2 1.6-49.6v0c-8-11.2-17.6-20.8-27.2-30.4s-20.8-19.2-30.4-28.8v0c-12.8-11.2-32-11.2-44.8-1.6l-8 8-8 9.6c-16 16-40 20.8-60.8 12.8-3.2-1.6-4.8-3.2-8-3.2-12.8-6.4-25.6-11.2-40-16-3.2 0-4.8-1.6-6.4-1.6v0c-6.4-3.2-12.8-6.4-19.2-12.8-9.6-9.6-14.4-20.8-16-32 0-4.8 0-9.6 0-14.4v-12.8c0-17.6-12.8-33.6-30.4-36.8-1.6 0-4.8 0-6.4 0v0c-11.2-1.6-24-1.6-36.8-1.6s-25.6 0-36.8 1.6v0c-1.6 0-4.8 0-6.4 0-17.6 3.2-30.4 17.6-30.4 36.8v16c0 24-14.4 44.8-36.8 52.8-1.6 0-3.2 1.6-4.8 1.6-14.4 4.8-28.8 11.2-43.2 17.6v0c-1.6 0-1.6 1.6-3.2 1.6-6.4 3.2-14.4 4.8-24 4.8-16 0-28.8-6.4-40-16v0l-11.2-11.2c-12.8-12.8-33.6-14.4-48-4.8-1.6 1.6-3.2 3.2-4.8 4.8v0c-9.6 8-19.2 16-27.2 25.6-9.6 8-17.6 17.6-25.6 27.2v0c-1.6 1.6-3.2 3.2-4.8 4.8-9.6 14.4-8 35.2 4.8 48l11.2 11.2c17.6 17.6 20.8 41.6 11.2 62.4 0 1.6-1.6 3.2-1.6 3.2-6.4 14.4-12.8 28.8-17.6 43.2 0 1.6-1.6 3.2-1.6 4.8v0c-3.2 6.4-6.4 14.4-12.8 19.2-11.2 11.2-25.6 16-40 16v0h-16c-17.6 0-33.6 12.8-36.8 30.4 0 1.6 0 4.8 0 6.4-1.6 14.4-1.6 27.2-1.6 40v0 0c0 12.8 0 24 1.6 36.8v0c0 1.6 0 4.8 0 6.4 3.2 17.6 17.6 30.4 36.8 30.4v0h16c24 0 44.8 14.4 52.8 35.2v0c0 1.6 1.6 3.2 1.6 4.8v0c4.8 14.4 11.2 28.8 17.6 43.2v0c0 1.6 1.6 1.6 1.6 3.2 3.2 6.4 4.8 14.4 4.8 24 0 16-6.4 28.8-16 40v0l-11.2 11.2c-12.8 12.8-14.4 32-4.8 46.4 1.6 1.6 3.2 3.2 4.8 6.4 8 9.6 16 19.2 25.6 27.2 8 8 17.6 17.6 27.2 25.6 1.6 1.6 3.2 3.2 6.4 4.8 12.8 8 30.4 8 43.2-1.6l16-16c17.6-17.6 41.6-20.8 62.4-11.2 1.6 0 1.6 1.6 3.2 1.6v0c14.4 6.4 28.8 12.8 43.2 17.6 1.6 0 3.2 1.6 3.2 1.6 8 3.2 14.4 6.4 20.8 12.8 11.2 11.2 16 25.6 16 40v0 16c0 19.2 14.4 35.2 33.6 36.8v0c14.4 4.8 27.2 4.8 41.6 4.8s27.2 0 41.6-1.6v0c19.2-1.6 33.6-17.6 33.6-36.8v-16c0-22.4 12.8-41.6 32-51.2 3.2-1.6 8-3.2 12.8-4.8 12.8-4.8 24-9.6 35.2-14.4 3.2-1.6 6.4-4.8 11.2-4.8 6.4-1.6 12.8-3.2 19.2-3.2 14.4 0 27.2 4.8 36.8 14.4 1.6 1.6 3.2 3.2 4.8 4.8l9.6 9.6c12.8 12.8 33.6 14.4 48 3.2v0c1.6-1.6 1.6-1.6 3.2-3.2 9.6-8 19.2-17.6 28.8-25.6 9.6-9.6 17.6-19.2 25.6-28.8 1.6-1.6 1.6-3.2 3.2-3.2 9.6-14.4 9.6-33.6-3.2-46.4v0l-3.2-3.2-9.6-12.8c-16-16-20.8-41.6-11.2-62.4 1.6-1.6 1.6-3.2 3.2-6.4 6.4-12.8 12.8-27.2 17.6-41.6 0-1.6 1.6-3.2 1.6-6.4 3.2-6.4 6.4-12.8 12.8-19.2 11.2-11.2 25.6-16 40-16v0h16c19.2 0 36.8-16 36.8-35.2v0c1.6-11.2 1.6-24 1.6-36.8 0-14.4 0-27.2-1.6-41.6z"
1284
+ ],
1285
+ "attrs": [],
1286
+ "isMulticolor": false,
1287
+ "tags": [
1288
+ "cog",
1289
+ "gear"
1290
+ ],
1291
+ "defaultCode": 116,
1292
+ "grid": 0,
1293
+ "colorPermutations": {}
1294
+ },
1295
+ {
1296
+ "id": 38,
1297
+ "paths": [
1298
+ "M683.2 683.2l-163.2-113.6-163.2 113.6 65.6-179.2-131.2-97.6h163.2l65.6-179.2 65.6 179.2h163.2l-131.2 97.6 65.6 179.2zM912 585.6c0-65.6-19.2-97.6-32-131.2-12.8-35.2-24-64-32-81.6-28.8-65.6 0-131.2 16-147.2s32-32 49.6-49.6c-19.2-20.8-62.4-59.2-81.6-81.6-33.6 16-81.6 32-147.2 32s-132.8-33.6-163.2-65.6c-33.6 35.2-116.8 67.2-180.8 67.2-67.2 0-99.2-14.4-131.2-32-17.6 17.6-54.4 54.4-81.6 81.6 12.8 12.8 30.4 30.4 49.6 49.6 16 16 44.8 97.6 16 147.2-9.6 16-32 51.2-49.6 81.6-16 32-32 65.6-32 131.2s32 168 97.6 212.8c49.6 32 131.2 32 179.2 49.6 49.6 16 113.6 81.6 131.2 113.6 16-32 83.2-97.6 131.2-113.6 49.6-17.6 131.2-16 179.2-49.6 70.4-49.6 81.6-148.8 81.6-214.4z"
1299
+ ],
1300
+ "attrs": [],
1301
+ "isMulticolor": false,
1302
+ "tags": [
1303
+ "badge"
1304
+ ],
1305
+ "defaultCode": 113,
1306
+ "grid": 0,
1307
+ "colorPermutations": {}
1308
+ },
1309
+ {
1310
+ "id": 42,
1311
+ "paths": [
1312
+ "M512 608c-212.8 0-390.4-78.4-416-160 0 20.8 0 108.8 0 108.8 0 92.8 185.6 163.2 416 163.2s416-70.4 416-163.2c0 0 0-91.2 0-108.8-25.6 81.6-203.2 160-416 160zM512 832c-212.8 0-390.4-78.4-416-160 0 27.2 0 105.6 0 105.6 0 92.8 185.6 166.4 416 166.4s416-73.6 416-166.4c0 0 0-94.4 0-105.6-25.6 81.6-203.2 160-416 160zM512 96c-230.4 0-416 73.6-416 160v80c0 91.2 185.6 160 416 160s416-68.8 416-160v-80c0-86.4-185.6-160-416-160z"
1313
+ ],
1314
+ "attrs": [],
1315
+ "isMulticolor": false,
1316
+ "tags": [
1317
+ "cylinder"
1318
+ ],
1319
+ "defaultCode": 117,
1320
+ "grid": 0,
1321
+ "colorPermutations": {}
1322
+ },
1323
+ {
1324
+ "id": 44,
1325
+ "paths": [
1326
+ "M716.8 564.8c112-75.2 259.2-168 259.2-388.8 0-32-27.2-48-48-48h-160c-25.6-48-105.6-96-256-96s-230.4 48-256 96h-160c-20.8 0-48 16-48 48 0 220.8 134.4 310.4 248 385.6 92.8 60.8 152 102.4 152 176v62.4c-81.6 8-160 54.4-160 96 0 51.2 100.8 96 224 96s224-44.8 224-96c0-41.6-81.6-86.4-160-96v-64c0-75.2 48-110.4 140.8-171.2zM784 208h112c-12.8 128-86.4 195.2-176 256 28.8-62.4 60.8-144 64-256zM128 208h112c3.2 112 35.2 193.6 64 256-89.6-60.8-163.2-128-176-256zM320 192c0-20.8 51.2-80 192-80s192 59.2 192 80-51.2 80-192 80-192-59.2-192-80z"
1327
+ ],
1328
+ "attrs": [],
1329
+ "isMulticolor": false,
1330
+ "tags": [
1331
+ "trophy"
1332
+ ],
1333
+ "defaultCode": 120,
1334
+ "grid": 0,
1335
+ "colorPermutations": {}
1336
+ },
1337
+ {
1338
+ "id": 43,
1339
+ "paths": [
1340
+ "M512 96c-307.2 0-179.2 387.2-336 544 0 0 587.2 0 672 0-148.8-148.8-30.4-544-336-544zM864 688h-704c-35.2 0-64 28.8-64 64s28.8 64 64 64h240c0 62.4 49.6 112 112 112s112-49.6 112-112h240c35.2 0 64-28.8 64-64s-28.8-64-64-64z"
1341
+ ],
1342
+ "attrs": [],
1343
+ "isMulticolor": false,
1344
+ "tags": [
1345
+ "bell"
1346
+ ],
1347
+ "defaultCode": 119,
1348
+ "grid": 0,
1349
+ "colorPermutations": {}
1350
+ }
1351
+ ],
1352
+ "invisible": false,
1353
+ "colorThemes": [],
1354
+ "colorThemeIdx": 0
1355
+ }
1356
+ ],
1357
+ "uid": -1,
1358
+ "preferences": {
1359
+ "showGlyphs": true,
1360
+ "showQuickUse": false,
1361
+ "showQuickUse2": true,
1362
+ "showSVGs": true,
1363
+ "fontPref": {
1364
+ "prefix": "dev-icon-",
1365
+ "metadata": {
1366
+ "fontFamily": "WPMU-DEV-App-Icons",
1367
+ "majorVersion": 2,
1368
+ "minorVersion": 0
1369
+ },
1370
+ "metrics": {
1371
+ "emSize": 1024,
1372
+ "baseline": 6.25,
1373
+ "whitespace": 50
1374
+ },
1375
+ "embed": false,
1376
+ "includeMetadata": false,
1377
+ "showSelector": false,
1378
+ "showMetrics": false,
1379
+ "showMetadata": false,
1380
+ "showVersion": true
1381
+ },
1382
+ "imagePref": {
1383
+ "prefix": "icon-",
1384
+ "png": true,
1385
+ "useClassSelector": true,
1386
+ "color": 4473924,
1387
+ "bgColor": 16777215,
1388
+ "classSelector": ".icon"
1389
+ },
1390
+ "historySize": 100,
1391
+ "showCodes": true,
1392
+ "gridSize": 16,
1393
+ "showGrid": false,
1394
+ "showLiga": false
1395
+ }
1396
+ }
assets/shared-ui/font/WPMU-DEV-App-Icons.eot ADDED
Binary file
assets/shared-ui/font/WPMU-DEV-App-Icons.svg ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+ <svg xmlns="http://www.w3.org/2000/svg">
4
+ <metadata>Generated by IcoMoon</metadata>
5
+ <defs>
6
+ <font id="WPMU-DEV-App-Icons" horiz-adv-x="1024">
7
+ <font-face units-per-em="1024" ascent="960" descent="-64" />
8
+ <missing-glyph horiz-adv-x="1024" />
9
+ <glyph unicode="&#x20;" horiz-adv-x="512" d="" />
10
+ <glyph unicode="&#x30;" glyph-name="logo_alt" d="M514 960c-284 0-514-230-514-514s230-514 514-514c284 0 514 230 514 514s-230 514-514 514zM514 10c-242 0-436 196-436 436 0 242 194 436 436 436 240 0 436-194 436-436 0-240-196-436-436-436zM774 732l-60-48v-322c0-20-14-34-30-34-18 0-32 14-32 34v172c0 56-40 100-90 100s-90-44-90-100v-172c0-20-14-34-30-34s-30 14-30 34v172c0 56-40 100-90 100s-90-44-90-100v0-370l58 46v324c0 18 14 34 32 34 16 0 30-16 30-34v-172c0-56 40-102 90-102s90 46 90 102v0 172c0 18 14 34 30 34 18 0 32-16 32-34v-172c0-56 40-102 90-102s90 46 90 102v0 370z" />
11
+ <glyph unicode="&#x31;" glyph-name="devman" d="M798 492c18 10 32 30 32 52 0 32-26 58-58 58-34 120-62 230-62 230s-34 128-198 128c-164 0-198-128-198-128s-28-110-62-230c-32 0-58-26-58-58 0-22 14-42 32-52-32-118-62-224-62-224 0-10 22-22 56-28 10 40 22 98 36 146 22 76 58 120 120 142-36 12-54 58-62 110l124-66 78 74 14-198h-110c0 0 70-36 146-36 8 6 4 84 0 182l22-26 126 66c-8-48-26-94-64-106 64-26 104-70 122-142 10-48 26-106 36-146 34 6 56 18 56 28-4 0-34 106-66 224zM420 656l-90 74 150-16zM604 656l-62 58 150 16zM798 232c0 0-148-66-216-66-70 0-66 58-66 66h-8c-4-8 4-66-66-66-68 0-216 66-216 66l-44-182 330-114 332 114zM458 338h108v-36h-108z" />
12
+ <glyph unicode="&#x32;" glyph-name="fix" horiz-adv-x="999" d="M783.177 474.331c-0.348-0.003-0.76-0.004-1.172-0.004-24.883 0-48.442 5.667-69.457 15.781-34.513 16.040-53.896 11.103-78.582-19.617-112.823-141.166-226.926-281.6-348.526-415.086q-38.766-42.24-79.36-82.834c-20.826-22.637-50.592-36.771-83.659-36.771-16.787 0-32.724 3.643-47.062 10.181-43.521 16.596-74.586 58.691-74.992 108.094-0.292 3.121-0.458 6.69-0.458 10.298 0 32.327 13.337 61.54 34.809 82.435 53.603 52.871 106.083 106.997 162.22 157.099 107.703 95.817 217.417 189.257 325.486 283.429 27.794 24.137 33.097 44.617 18.286 79.36-9.86 21.246-15.611 46.116-15.611 72.329 0 16.558 2.295 32.579 6.584 47.764 2.76 24.535 23.467 58.079 53.097 80.421-50.767-31.77 36.317 36.676 136.106 82.067 11.91 5.812 25.84 9.77 40.592 10.707 18.593 0.016 25.908-14.796 15.485-30.887 5.996 7.73-0.822-2.75-9.657-11.122-21.063-21.792-42.091-43.186-63.303-65.129-20.488-20.262-33.176-48.375-33.176-79.451s12.688-59.189 33.166-79.441c12.262-12.993 24.696-25.793 36.582-38.227 19.129-19.681 45.853-31.893 75.429-31.893s56.3 12.212 75.405 31.868c22.515 22.333 44.458 45.373 66.584 68.048 4.73 7.707 13.111 12.77 22.674 12.77 2.874 0 5.642-0.457 8.234-1.303 6.31-4.942 10.457-12.717 10.457-21.461 0-4.495-1.096-8.735-3.035-12.465 4.698 9.518-4.469-21.077-18.839-48.518-20.039-35.263-41.616-73.298-64.29-109.32-26.735-41.843-72.942-69.187-125.535-69.187-1.574 0-3.143 0.024-4.705 0.073z" />
13
+ <glyph unicode="&#x33;" glyph-name="caret_right" d="M451.2 180.8l204.8 204.8c14.4 14.4 32 32 32 62.4s-17.6 49.6-32 62.4l-204.8 204.8c-27.2 27.2-67.2 27.2-94.4 0s-27.2-67.2 0-94.4l172.8-172.8-172.8-172.8c-27.2-27.2-27.2-67.2 0-94.4s67.2-27.2 94.4 0z" />
14
+ <glyph unicode="&#x37;" glyph-name="upfront" d="M810 604l-18 234-122 82-112 12-180-166 228-24zM16 380l176-86 26 322-198-182zM1012 380l-496-244 210-104 302 148zM984 706l-192 132 42-546 178 88zM316 960l-274-254-22-272 538 498zM0 180l514-248 212 100-710 348z" />
15
+ <glyph unicode="&#x39;" glyph-name="logo" d="M1004 290v670l-108-84v-586c0-34-24-62-54-62-32 0-56 28-56 62v312c0 100-74 182-164 182s-162-82-162-182v-312c0-34-26-62-56-62s-54 28-54 62v312c0 100-74 182-164 182s-164-82-164-182v0-670l108 84v586c0 34 26 62 56 62s56-28 56-62l-2-312c0-100 74-182 164-182s164 82 164 182v0 312c0 34 24 62 54 62 32 0 56-28 56-62v-312c0-100 72-182 164-182 90 0 162 82 162 182z" />
16
+ <glyph unicode="&#x3d;" glyph-name="speach_alt" d="M558 182c-42-14-86-22-134-22-26 0-50 2-76 8-22-20-74-52-150-58-2-2-2-2-4-2-6 0-14 4-4 8 22 14 62 40 62 80-120 52-202 156-202 276 0 174 168 314 374 314 156 0 290-80 346-194 22-2 42-8 60-14-52 148-214 258-406 258-234 0-424-164-424-364 0-120 70-232 186-298-6-6-14-10-22-14-28-16-32-42-28-60 6-20 24-42 58-42 2 0 6 2 8 2 74 6 128 32 160 54 20-2 42-4 62-4 70 0 134 16 192 40-22 8-42 18-58 32zM732 570c138 0 248-94 248-208 0-82-54-152-134-186 10-28 40-50 58-60 10-4 2-8-4-8-2 0-2 0-4 2-62 4-108 26-134 46-10-2-20-2-30-2-138 0-250 92-250 208 0 114 112 208 250 208zM732 620c-166 0-300-116-300-258s134-258 300-258c4 0 10 0 18 0 32-20 80-40 142-44 2 0 4-2 8-2 34 0 52 22 58 42 4 18 0 44-30 60-2 2-2 2-4 4 66 48 106 120 106 198 0 142-134 258-298 258z" />
17
+ <glyph unicode="&#x41;" glyph-name="comment" horiz-adv-x="1048" d="M0 769.427c0.213 105.296 85.621 190.573 190.947 190.573 0.066 0 0.132 0 0.198 0h666.058c0.056 0 0.122 0 0.188 0 105.325 0 190.734-85.277 190.947-190.552v-492.364c0-105.354-85.406-190.76-190.76-190.76h-38.938l-60.279-149.762-146.018 149.762h-421.955c-105.17 0.107-190.385 85.388-190.385 190.572 0 0.066 0 0.132 0 0.198v492.333z" />
18
+ <glyph unicode="&#x42;" glyph-name="download" horiz-adv-x="1365" d="M1050.836-64h-749.992c-0.424-0.002-0.925-0.003-1.426-0.003-15.013 0-29.805 0.942-44.322 2.77-117.762 14.242-218.304 105.483-247.147 224.715-3.005 14.041-5.359 25.576-7.949 36.169v69.208c-0.121-0.517 1.417 1.772 2.319 4.359 11.525 110.342 91.606 206.428 199.228 241.984 7.938 1.803 12.284 6.922 12.284 13.057 0 1.006-0.117 1.986-0.338 2.925 0.011 0.63 0.007 1.476 0.007 2.323 0 163.941 132.901 296.842 296.842 296.842 20.495 0 40.506-2.077 59.832-6.032-0.203-0.254 1.768-0.59 3.817-0.59 6.46 0 12.14 3.336 15.413 8.378 26.059 43.611 96.992 96.055 180.393 117.272-11.657-2.522 15.599 5.389 44.039 9.689 10.816 1.059 21.262 1.533 31.817 1.533 18.246 0 36.161-1.416 53.642-4.144 69.441-4.088 148.797-45.322 204.691-107.946 55.785-58.363 89.947-137.21 89.947-224.035 0-13.662-0.846-27.126-2.488-40.343-0.163 0.309-0.348-1.151-0.348-2.653 0-6.791 3.784-12.699 9.359-15.729 68.861-34.597 134.23-117.504 155.763-216.754-1.424 7.797 3.362-11.618 5.916-31.73 1.696-13.937 2.586-28.537 2.586-43.344s-0.889-29.407-2.618-43.748c-15.395-134.38-118.284-249.368-253.362-283.546-10.044-3.904-33.128-8.976-57.16-10.586zM780.359 642.207h-146.42c-12.397-1.14-22.314-11.010-23.532-23.433l-0.009-194.314c-0.974-12.508-10.94-22.506-23.448-23.534l-99.432-0.006c-14.36 0-48.493 0 0-48.728l195.149-196.326c6.226-6.256 14.843-10.128 24.364-10.128s18.139 3.872 24.363 10.127l195.15 194.914c49.199 49.199 11.535 48.728 0 48.728h-97.692c-13.001 0-23.54 10.539-23.54 23.54v195.384c-0.63 13.496-11.616 24.24-25.165 24.482z" />
19
+ <glyph unicode="&#x43;" glyph-name="pos_header" d="M0 511.81c0-35.241 28.456-63.81 64.056-63.81h895.888c35.377 0 64.056 28.994 64.056 63.81v384.38c0 35.241-28.456 63.81-64.056 63.81h-895.888c-35.377 0-64.056-28.994-64.056-63.81v-384.38zM0 224c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 96c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0-32c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 352c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32z" />
20
+ <glyph unicode="&#x44;" glyph-name="defender" horiz-adv-x="931" d="M836.149 613.429c7.483 36.21-2.216-28.877-18.984-91.063 12.733 9.516-27.719-112.534-90.884-219.586 21.638 1.365-83.817-143.882-221.683-248.702l-22.964-17.090c-4.412-2.891-9.818-4.611-15.625-4.611s-11.213 1.72-15.735 4.679l-2.538 0.815-19.421 14.654c-2.618-20.020-135.11 100.592-223.789 250.229-6.611 11.597-11.025 19.365-15.262 27.134 60.454-104.853 3.792-19.941-35.933 73.884-43.388 102.226-67.491 215.092-67.526 333.584 0 1.073 0 2.132 0 3.015 0 8.828 0 17.655 0 26.306-0.023 0.422-0.037 0.916-0.037 1.412s0.013 0.991 0.040 1.481c-0.066 0.646-0.102 1.476-0.102 2.315s0.036 1.67 0.106 2.49c0.831 7.653 6.206 15.435 13.802 19.771-1.342-0.6 1.387 0.991 4.392 1.97l0.16 0.045c8.651 3.884 17.655 7.768 25.953 11.299-68.26-26.429 17.317 13.015 109.005 37.494 71.809 19.158 147.446 29.39 225.473 29.39s153.664-10.232 225.643-29.427c-63.3 19.62 30.059-3.042 116.233-39.39q8.491-3.717 22.439-10.249c9.004-4.137 15.58-13.234 16.239-23.931l0.004-0.081c0-10.063 0-20.127 0-30.19 0-1.059 0-2.119 0-3.178 0.001-0.449 0.001-0.98 0.001-1.511 0-43.386-3.274-86.007-9.588-127.63zM732.866 515.266h-2.648l-5.297-0.883c14.98 20.528-234.445-43.985-461.092-149.267l12.474 5.2-3.178-1.412-6.532-3.001c-12.357-7.588-20.477-21.030-20.48-36.369-0.008-0.316-0.013-0.688-0.013-1.061 0-8.020 2.237-15.517 6.122-21.901l-0.105 0.187c-28.723 16.918 67.487-115.537 192.366-212.951l5.196-4.031c-2.892 1.681 0.951-0.982 5.257-2.746 3.281-1.292 6.831-1.996 10.545-1.996s7.264 0.704 10.524 1.985c-2.767-1.345 1.597 0.349 5.4 2.832l3.232 2.573c-2.954-22.686 121.104 90.887 204.65 231.368-27.53-56.203 30.813 39.564 67.65 145.403 1.709 7.759 3.121 9.701 3.827 11.82v0c0.086 0.873 0.135 1.887 0.135 2.913s-0.049 2.040-0.144 3.041c-0.085 15.408-12.554 28.001-28.034 28.297zM787.597 764.028c1.65-0.612-4.461 4.267-11.547 7.308 69.21-26.78-10.842 9.765-96.458 32.707-68.289 18.189-140.156 27.892-214.29 27.892s-146.001-9.703-214.401-27.908c65.558 19.796-21.197-1.107-101.41-34.56 6.226 3.164-1.027-0.568-6.877-5.828-2.485-1.051-8.402-8.523-11.519-17.32-1.364-3.399-2.395-8.149-2.562-13.118l-0.002-2.718c0.178-93.262 18.101-188.172 50.737-275.925l0.639-1.085c4.879-9.2 14.396-15.36 25.352-15.36 0.025 0 0.050 0 0.076 0 2.876 0.001 5.68 0.453 8.313 1.289l7.22 3.301 15.007 5.297c12.421 23.546 252.262 113.836 508.637 154.443l11.131 1.453 7.062 0.883c16.607 3.504 30.083 17.498 32.981 35.059l0.034 2.37c2.806 17.151 5.717 52.069 6.346 87.545l0.010 0.731v3.531c-0.301 11.393-5.827 22.388-14.431 29.973zM928.839 804.988v0 3.884c-1.45 19.185-13.611 37.652-31.129 48.035l-8.595 3.871c-123.554 62.554-269.36 99.192-423.724 99.192s-300.171-36.639-429.198-101.694l-0.706-0.5c-17.981-9.809-31.053-29.183-32.476-51.721l-0.009-0.185c-2.295-22.422-3.001-45.55-3.001-68.502 0-0.347-0.001-0.758-0.001-1.168 0-132.824 27.602-259.201 77.382-373.708q15.309-34.37 35.789-72.859c0.214-48.775 134.179-221.365 308.837-337.68l13.546-8.714c8.615-4.561 18.832-7.239 29.674-7.239 0.057 0 0.115 0 0.172 0 0.27-0.004 0.6-0.007 0.93-0.007 10.76 0 20.893 2.681 29.769 7.412l9.545 6.19c170.176 91.26 341.8 313.48 402.374 578.038q10.227 46.955 15.7 88.974c4.833 36.003 7.592 77.623 7.592 119.887 0 0.245 0 0.491 0 0.736q-0.353 34.213-2.825 67.758z" />
21
+ <glyph unicode="&#x45;" glyph-name="error" horiz-adv-x="1142" d="M1133.686 32.886l-507.668 894.818c-10.931 19.443-31.427 32.362-54.942 32.362s-44.011-12.919-54.779-32.047l-507.831-895.133c-5.349-9.287-8.504-20.423-8.504-32.295s3.155-23.008 8.673-32.615c10.799-19.015 31.273-31.902 54.762-31.976h1015.346c23.439 0.050 43.924 12.919 54.778 31.984 5.512 9.599 8.667 20.734 8.667 32.607s-3.155 23.008-8.673 32.615zM571.077 60.455c-47.431 2.299-85.016 41.314-85.016 89.108s37.585 86.808 84.811 89.1c47.636-2.291 85.221-41.306 85.221-89.1s-37.585-86.808-84.811-89.1zM640.985 353.477c-1.182-27.372-31.311-48.443-71.089-48.443s-67.545 21.071-68.726 48.443c-6.105 98.462-19.692 275.692-19.692 294.006 0 36.037 39.385 64.197 90.388 64.197s86.843-28.16 86.843-64.197c0.591-17.526-11.422-196.135-17.526-293.809z" />
22
+ <glyph unicode="&#x46;" glyph-name="facebook" horiz-adv-x="495" d="M109.909-64v512h-109.909v176.469h109.739v105.984c0.171 144.213 62.123 229.547 238.251 229.547h146.603v-176.469h-91.648c-68.267 0-73.216-24.747-73.216-70.656v-88.235h166.059l-19.627-176.64h-146.603v-512h-219.648z" />
23
+ <glyph unicode="&#x47;" glyph-name="wordpress" d="M510.72-64c-282.192 0.764-510.657 229.701-510.657 511.998 0 282.77 229.23 512 512 512s512-229.23 512-512c0-2.828-0.023-5.651-0.069-8.469-3.807-278.716-230.984-503.536-510.67-503.536-0.916 0-1.831 0.002-2.746 0.007zM801.829 773.669c-192 178.103-514.011 136.594-652.069-83.383 1.457-0.351 5.118-0.794 8.862-0.912l128.098 4.569c1.526 0.428 3.279 0.673 5.089 0.673 9.947 0 18.161-7.423 19.403-17.033 0.021-0.347 0.027-0.638 0.027-0.931 0-11.21-9.087-20.297-20.297-20.297-0.714 0-1.42 0.037-2.116 0.109-13.81-1.653-27.89-2.75-43.616-4.213l157.074-469.76c2.56 6.766 4.023 10.606 5.303 14.629 28.343 85.029 56.686 170.24 85.211 256 1.679 4.231 2.652 9.133 2.652 14.263s-0.973 10.032-2.745 14.532c-18.192 48.005-36.478 96.097-52.752 144.919-6.583 19.749-14.811 31.451-36.571 28.526-0.546-0.016-1.189-0.025-1.834-0.025-5.843 0-11.513 0.743-16.92 2.139-8.938 0.769-16.246 8.623-16.246 18.183 0 10.14 8.22 18.36 18.36 18.36 0.579 0 1.153-0.027 1.718-0.079 14.007 0.005 28.27-1.457 42.35-2.555 22.64-1.451 49.092-2.278 75.736-2.278 38.096 0 75.797 1.69 113.032 5-3.065 0.267-1.049 0.621 1.050 0.621 9.86 0 17.897-7.804 18.272-17.572 0.040-0.495 0.062-1.031 0.062-1.572 0-10.705-8.678-19.383-19.383-19.383-0.601 0-1.195 0.027-1.782 0.081-14.37-1.651-28.816-2.931-44.542-4.577l156.16-464.457c-2.265-4.5 0.24-0.213 1.921 4.467 22.399 75.076 45.439 149.864 66.833 224.836 5.267 17.232 8.3 37.039 8.3 57.555 0 37.519-10.143 72.669-27.837 102.857-7.891 14.4-17.765 28.845-25.994 44.571 3.982-11.641-12.885 20.218-22.608 55.057-1.764 7.159-2.529 13.298-2.529 19.616 0 39.446 29.81 71.93 68.131 76.153-2.341-0.849 2.341 0.302 6.655 2.147zM655.726 36.023l-134.766 367.177h-2.926l-128.914-374.674c36.697-11.121 78.871-17.524 122.541-17.524 51.481 0 100.884 8.898 146.754 25.239zM318.72 56.686l-206.629 566.857c-23.247-51.636-36.791-111.934-36.791-175.395 0-170.748 98.044-318.596 240.906-390.319zM899.291 649.143c0-6.217 0-9.143 0-12.069 0.474-7.029 0.745-15.236 0.745-23.506 0-43.384-7.439-85.030-21.111-123.733q-54.057-156.852-108.914-316.12l-34.743-100.571c197.303 111.726 272.823 371.383 164.571 575.817z" />
24
+ <glyph unicode="&#x48;" glyph-name="hummingbird" d="M757.583 604.072c11.477 11.477 18.575 27.331 18.575 44.844 0 35.025-28.394 63.419-63.419 63.419-17.513 0-33.368-7.098-44.844-18.575-10.923-11.137-17.664-26.409-17.664-43.255 0-0.372 0.003-0.744 0.010-1.115-0.009-0.316-0.013-0.754-0.013-1.193 0-34.42 27.903-62.323 62.323-62.323 0.439 0 0.877 0.005 1.314 0.014-0.064-0.001-0.062-0.001-0.061-0.001 17.106 0 32.589 6.951 43.778 18.183zM623.051 559.228c-22.791 22.051-36.94 52.915-36.94 87.082 0 1.103 0.015 2.202 0.044 3.297-0.060 1.246-0.092 2.898-0.092 4.558 0 69.717 56.517 126.234 126.234 126.234s126.234-56.517 126.234-126.234c0-1.66-0.032-3.312-0.096-4.957 0.068-1.193 0.102-2.87 0.102-4.555 0-33.365-13.531-63.569-35.405-85.426-22.405-21.845-53.059-35.319-86.861-35.319-0.498 0-0.995 0.003-1.491 0.009-1.977-0.127-4.375-0.198-6.791-0.198-33.231 0-63.289 13.581-84.928 35.496zM784.772 183.172c0 0.098 0 0.214 0 0.33 0 28.728-2.182 56.946-6.39 84.498q-6.674 51.469 6.39 64.711c-104.163-104.549 12.74-3.697 101.875 118.677-55.039-80.477 21.701 15.244 74.999 124.498-5.498-21.297 27.966 51.503 46.666 130.027 10.199 43.067 15.641 88.167 15.687 134.53q0 74.712-23.834 97.664t-95.868 21.892c-46.070-0.004-91.085-5.603-134.153-16.159 28.939 12.216-54.196-10.331-129.672-46.343 77.853 41.806-31.522-6.241-125.255-74.477 118.509 87.564-12.674 5.057-119.168-102.027q-12.226-12.226-68.722-6.047t-80.154 6.003c-3.046 0.29-6.585 0.455-10.163 0.455-25.805 0-49.602-8.597-68.684-23.082q-27.084-23.276-41.384-37.224c27.28 35.625-31.619-25.214-72.705-97.5q-36.581-63.162-46.115-81.877c-4.572-7.318-7.283-16.205-7.283-25.726 0-13.972 5.838-26.58 15.208-35.519 10.411-14.901 29.204-26.422 50.759-28.422l107.274-0.021q54.731 0 72.386 0c0.62-55.862 25.696-107.667 65.339-143.745 34.953-38.736 86.445-64.019 143.857-65.113q1.077-17.658 0.194-72.389t0-106.99c0.871-20.401 11.99-40.168 28.77-52.832 8.854-9.49 21.208-15.327 34.926-15.327 9.675 0 18.672 2.904 26.166 7.888l78.745 45.441c-29.723-23.258 42.571 18.267 100.585 74.45q13.821 13.826 37.302 41.014c14.292 18.785 22.897 42.572 22.897 68.369 0 3.652-0.172 7.264-0.51 10.828zM378.703 145.743q-50.494 0-111.228 60.734t-60.734 111.228q0.883 27.012-17.655 28.072c-0.688 0.041-1.493 0.064-2.303 0.064-11.959 0-22.741-5.038-30.339-13.107l-105.951-105.952c-7.15-6.829-11.595-16.437-11.595-27.084 0-1.655 0.107-3.285 0.316-4.884q1.922-18.526 28.052-20.292h69.208q-10.593-26.659-24.541-58.968t-27.189-60.557c-3.134-4.806-4.999-10.688-4.999-17.006 0-6.87 2.204-13.225 5.945-18.397 4.631-3.246 10.481-5.244 16.797-5.244s12.166 1.998 16.951 5.397q24.274 11.062 61.526 26.951l59.851 25.247q0-13.065 0-27.542t0-41.49c-0.233-1.233-0.367-2.652-0.367-4.102 0-11.657 8.624-21.3 19.841-22.896 2.129-0.405 4.435-0.628 6.794-0.628 10.166 0 19.363 4.151 25.988 10.851l104.875 104.875c6.815 8.468 10.939 19.352 10.939 31.2 0 1.447-0.061 2.879-0.182 4.295q-1.4 19.060-29.471 19.060z" />
25
+ <glyph unicode="&#x49;" glyph-name="twitter" horiz-adv-x="1311" d="M1310.792 838.865c-14.89-10.709-81.418-32.19-151.988-40.433 39.699 16.967 91.224 72.488 115.047 140.977-5.215-8.61-82.434-44.54-166.562-61.314-53.177 49.795-122.171 81.005-198.455 81.005-0.51 0-1.019-0.001-1.529-0.004-1.417 0.031-3.181 0.048-4.948 0.048-143.894 0-260.897-115.137-263.907-258.31-0.005-0.394-0.005-0.528-0.005-0.663 0-20.801 2.555-41.005 7.367-60.315-213.432 6.91-416.518 110.697-554.535 271.859-23.725-35.825-37.265-80.55-37.265-128.437 0-0.162 0-0.324 0-0.486 0.318-89.914 47.503-169.25 118.519-214.509-40.056-0.282-83.88 11.67-122.242 32.426s1.463-2.758 1.463-3.888c1.807-126.237 93.452-231.003 213.999-253.1-19.642-6.049-44.035-9.384-69.208-9.384-17.872 0-35.351 1.681-52.289 4.894 39.032-104.987 137.304-178.977 252.959-179.717-91.27-69.137-206.805-110.743-332.057-110.743-0.661 0-1.321 0.001-1.981 0.003-21.669 0.002-43.945 1.315-65.843 3.869 119.49-73.177 261.363-116.418 413.335-116.418 0.546 0 1.091 0.001 1.636 0.002 494.626 0 765.147 393.916 765.147 735.4q0 16.724 0 33.448c-10.131-19.157 72.941 47.501 132.196 132.070z" />
26
+ <glyph unicode="&#x4a;" glyph-name="github" horiz-adv-x="1058" d="M692.495 215.53c63.126 15.876 116.235 46.872 145.341 107.73 18.195 36.716 28.841 79.951 28.841 125.673 0 26.693-3.629 52.539-10.419 77.070 1.36 8.143-14.763 42.914-38.675 70.812-2.053 2.82-3.417 6.692-3.417 10.883 0 1.408 0.154 2.78 0.446 4.1 4.58 15.767 7.227 34.023 7.227 52.897 0 24.881-4.601 48.687-12.998 70.614-0.751 4.264-5.676 8.414-11.569 8.414-0.625 0-1.24-0.047-1.84-0.137-22.795-0.222-48.918-7.221-71.926-19.338-17.97-8.815-36.87-20.344-55.77-30.361-3.497-1.961-7.675-3.117-12.123-3.117-1.324 0-2.625 0.102-3.894 0.3-37.228 9.592-80.127 15.108-124.315 15.108s-87.087-5.516-128.047-15.898c2.499 0.603 1.24 0.507-0.042 0.507-4.959 0-9.583 1.436-13.479 3.916-6.299 9.525-54.471 35.184-107.814 47.174l-8.319 1.338c-18.9 2.079-20.412 1.701-26.46-17.577-6.368-18.236-10.046-39.259-10.046-61.14 0-19.234 2.842-37.804 8.129-55.314-0.014 0.17 0.18-1.189 0.18-2.593 0-3.031-0.903-5.852-2.455-8.206-47.593-55.132-56.665-119.959-46.081-188.944-2.207-0.821 5.952-38.105 19.692-72.558 26.046-66.924 81.045-103.59 150.408-121.545 21.357-5.481 43.281-8.883 66.339-13.608-12.638-11.215-26.514-36.191-31.088-64.29-1.070-3.438-4.041-6.294-7.755-7.504-56.791-21.761-111.412-12.122-145.999 45.145-10.683 23.925-37.497 46.215-69.98 53.542-4.020 0.649-7.843 0.943-11.734 0.943-5.736 0-11.323-0.639-16.694-1.849-7.811-1.416-9.134-7.842-3.842-14.079-2.725 1.877 4.644-6.466 13.756-12.335 19.054-7.885 45.767-36.705 59.057-72.092 17.056-43.824 58.023-73.933 106.097-74.521 4.852-0.123 10.481-0.193 16.125-0.193 20.964 0 41.704 0.962 62.177 2.844-2.629-32.514-2.629-66.534-2.629-100.365 0-17.199-18.9-25.137-39.123-18.9 7.828-9.482-65.118 19.649-127.215 63.198-158.175 112.005-238.689 266.229-230.562 461.276 11.099 242.804 190.67 443.514 425.429 487.122 34.55 7.142 70.546 10.946 107.43 10.946 289.868 0 524.852-234.984 524.852-524.852 0-229.409-147.183-424.441-352.272-495.818-29.388-9.621-44.886 1.152-44.886 27.99q0 65.961 0 132.3c0.271 3.25 0.426 7.035 0.426 10.856 0 35.003-12.981 66.973-34.392 91.36 23.382 4.379 44.928 7.781 65.907 13.073z" />
27
+ <glyph unicode="&#x4b;" glyph-name="stackoverflow" horiz-adv-x="807" d="M750.421 580.096l-232.448 328.704 69.973 51.2c6.315-7.68 12.629-14.336 17.067-21.675 64.171-95.573 127.488-191.488 192.341-286.379 12.288-17.92 14.165-29.696-6.315-41.643 76.886 48.048 12.89 14.204-41.447-30.876zM734.72 562.176l-52.736-59.221-304.299 277.163 60.075 64.171zM270.677 614.912l34.133 63.317c9.899 17.067 21.333 6.656 31.403 0.853q140.459-80.555 280.576-161.621c59.051-34.133 59.904-41.813 11.776-97.792zM620.203 389.803c-2.56-10.581-3.072-13.312-3.925-16.213-17.067-60.587-5.461-54.784-64.683-38.059-106.667 30.208-213.333 61.269-320.341 90.112-25.088 6.827-29.525 17.067-20.992 40.448 25.429 70.656 11.947 59.221 74.923 39.765 103.253-31.744 205.995-65.365 308.736-99.157-5.62 4.303 11.983-4.578 26.432-17.021zM595.285 268.288c-1.877-49.323-2.731-51.2-48.469-46.421-117.077 11.264-233.984 23.381-351.061 34.133-21.333 2.048-27.136 9.899-23.211 31.915 10.923 63.659 9.728 62.635 75.264 53.589q158.891-22.016 318.293-40.277c25.259-2.56 35.328-11.435 29.355-32.939zM378.027 194.219c59.904 0 119.467 0 179.712 0 22.869 0 33.109-5.291 32.256-30.549-2.389-72.704 9.899-63.317-62.805-63.659-108.203 0-216.405 0-324.267 0-27.136-0.512-38.229 6.656-38.229 35.157 1.877 70.827-2.731 58.027 59.221 58.88 51.712 0.683 102.912 0.171 154.112 0.171zM91.136 29.525h576.512v38.741c0 87.040 0 173.909 0 260.949 0 23.040 6.997 30.208 29.696 29.525 73.387-2.219 60.587 8.875 61.099-61.44 0-110.080 0-220.331 0-330.411 0-24.576-8.021-30.891-31.573-30.72q-347.819 1.024-695.808 0c-24.064 0-31.403 7.168-31.232 31.232 1.024 119.467 1.195 238.933 0 359.424 0 26.283 8.533 32.597 33.28 32.256 57.856-1.195 57.856 0 57.856-59.051v-270.507z" />
28
+ <glyph unicode="&#x4c;" glyph-name="linkedin" horiz-adv-x="1096" d="M378.839-64h234.818v380.6c-0.115 2.18-0.181 4.732-0.181 7.299 0 17.148 2.933 33.61 8.325 48.913 18.477 47.756 64.975 81.744 119.411 81.744 0.217 0 0.434-0.001 0.65-0.002 85.088 0 118.941-62.422 118.941-154.001v-364.554h235.013v391.363c0 209.379-115.843 306.633-270.431 306.633-3.397 0.176-7.375 0.276-11.377 0.276-85.454 0-160.246-45.646-201.324-113.886l0.974-1.058v97.841h-234.818c3.131-63.596 0-681.166 0-681.166zM131.302 696.613c1.841-0.096 3.997-0.15 6.166-0.15 70.031 0 126.801 56.771 126.801 126.801 0 1.773-0.036 3.538-0.108 5.293-1.362 74.499-50.869 131.442-131.294 131.442-1.841 0.096-3.997 0.15-6.166 0.15-70.031 0-126.801-56.771-126.801-126.801 0-1.773 0.036-3.538 0.108-5.293-0.091-1.46-0.139-3.466-0.139-5.482 0-69.598 56.421-126.019 126.019-126.019 1.353 0 2.702 0.021 4.045 0.064l1.369-0.005zM248.711-64v681.166h-234.818v-681.166h234.818z" />
29
+ <glyph unicode="&#x4d;" glyph-name="medium" horiz-adv-x="1293" d="M0 809.32v151.349h484.806v-1.783l17.832-65.087 109.667-407.906q15.603-58.177 31.206-116.354c0-2.452 2.006-3.566 4.235-2.675 0.899 0.591 1.747 1.849 2.001 3.312l111.454 414.179 48.146 176.313h483.469v-151.572h-4.235c-14.934 0-29.646 0-44.58 0-4.902-0.022-10.177-1.17-14.975-3.221-4.709-0.532-16.911-9.762-25.001-21.956-5.298-7.041-8.399-15.65-8.399-24.983 0-0.233 0.002-0.465 0.006-0.697q0-313.139 0-626.535c-0.011-0.319-0.017-0.695-0.017-1.071 0-8.082 2.868-15.495 7.641-21.275-7.498 8.847 0.66-2.521 10.991-11.442 8.277-7.432 19.135-11.92 31.042-11.92 0.409 0 0.817 0.005 1.224 0.016 13.983-0.001 28.025-0.001 41.845-0.001h4.458v-3.566q0-73.111 0-146.445h-462.739c-0.034 0.533-0.053 1.156-0.053 1.783s0.019 1.25 0.057 1.868q-0.004 71.912-0.004 143.685c0 1.114 0 2.229 0 3.789h96.515v668.698c-3.566 1.337-4.904 0-5.795-3.343q-29.2-103.871-57.285-207.296l-161.379-583.997c-2.229-8.47-4.458-16.717-6.687-25.188h-175.199s0 2.229-1.114 3.343l-60.852 222.899-160.488 588.677c-1.337 4.904-1.337 4.904-6.687 4.012v-668.698h96.738v-4.458q0-73.111 0-146.445h-387.845v152.017h49.707c0.97-0.123 2.093-0.193 3.232-0.193s2.262 0.070 3.364 0.206c11.449 1.849 25.89 12 34.716 26.038 3.75 4.782 6.060 10.819 6.165 17.391q0 316.541 0 633.281c-0.021 3.62-0.924 7.669-2.528 11.342 0.243 2.833-7.367 14.032-17.619 21.991-8.527 7.722-19.721 12.387-32.005 12.387-0.551 0-1.099-0.009-1.645-0.028-14.409 0.002-28.675 0.002-43.163 0.002z" />
30
+ <glyph unicode="&#x4e;" glyph-name="minify" d="M244.524 72.828c3.553 5.798-0.865-3.084-6.972-10.526-35.223-35.201-68.945-69.452-103.726-103.703-14.1-13.997-33.525-22.647-54.969-22.647-11.348 0-22.131 2.422-31.859 6.778-27.618 12.237-46.878 39.882-46.878 72.026 0 22.325 9.291 42.48 24.217 56.81l101.544 101.366c-16.571-15.614-4.263-2.16 10.381 8.213-4.202 5.204-7.027 8.559-10.205 11.56l-89.335 89.512c-0.261-0.319-3.339 2.282-5.427 5.573-2.997 5.565-4.731 12.087-4.731 19.013 0 0.978 0.035 1.948 0.103 2.909 4.057 4.921 10.436 8.32 17.615 8.521 43.288 0.001 86.543 0.001 129.798 0.001h179.023c1.53 0.095 3.319 0.149 5.12 0.149s3.59-0.054 5.364-0.16c-0.168 0.013-0.077 0.014 0.013 0.014 9.751 0 17.655-7.904 17.655-17.655 0-1.061-0.094-2.1-0.273-3.11 0.016-29.907 0.016-59.921 0.016-89.758q0-112.11 0-224.221c0.66-1.778 1.041-3.831 1.041-5.974 0-7.121-4.216-13.258-10.289-16.050-2.023-0.657-4.224-1.009-6.508-1.009-7.33 0-13.812 3.632-17.744 9.194q-45.949 45.971-91.499 92.051c3.89-5.539-2.709 2.264-7.247 11.283zM886.113 185.997c5.826-6.179 8.121-9.004 10.77-11.652 35.31-35.31 69.385-69.032 103.636-104.166 14.141-14.205 22.884-33.795 22.884-55.426 0-36.978-25.546-67.989-59.952-76.347-6.248-1.654-12.806-2.541-19.57-2.541-21.704 0-41.275 9.129-55.085 23.756l-104.023 103.849-7.945 7.768-9.357-8.828-89.159-89.335c0.312-0.541-3.553-4.67-8.341-7.347-4.333-2.131-9.274-3.337-14.497-3.337-1.911 0-3.784 0.161-5.606 0.471-4.663 3.855-7.749 9.78-7.749 16.426 0 0.050 0 0.1 0.001 0.15 0 73.261 0 146.53 0 219.799 0 32.662 0 65.324 0 97.986-0.459 1.497-0.723 3.218-0.723 5.001 0 9.751 7.904 17.655 17.655 17.655 1.833 0 3.6-0.279 5.262-0.797l317.668 0.034c0.522 0.060 1.127 0.093 1.74 0.093 8.971 0 16.243-7.272 16.243-16.243 0-4.019-1.46-7.697-3.878-10.533 4.384 5.383-1.42-3.319-8.937-10.174q-44.716-44.711-89.56-89.202c3.812 2.402-3.136-3.205-11.14-6.922zM245.76 823.172l89.688 90.041c-6.447-6.153 4.178 6.713 17.378 16.229 5.098 3.007 10.891 4.67 17.072 4.67 1.423 0 2.826-0.088 4.203-0.259 8.486-1.396 8.31-10.4 8.31-17.638q0-157.837 0-315.498c0-18.538-4.943-23.128-24.011-23.128-104.342 0-208.861 0-313.203 0-6.749 0.104-13.125 3.133-17.643 7.932-1.432 2.499-2.269 5.477-2.269 8.651 0 5.661 2.665 10.7 6.808 13.931 15.399 15.743 31.112 31.279 46.649 46.816l57.026 57.909-9.181 9.71c-35.31 35.31-69.385 69.032-103.636 104.166-14.223 13.509-23.071 32.559-23.071 53.676 0 8.596 1.466 16.85 4.162 24.525 6.485 26.059 29.621 47.893 58.533 53.086 5.633 1.325 11.579 2.046 17.693 2.046 21.959 0 41.746-9.302 55.635-24.18l102.264-102.444c-11.027 12.493-0.547 2.233 7.359-9.861zM775.062 822.466c39.901 40.077 76.623 77.33 114.052 114.052 14.357 14.968 34.522 24.269 56.859 24.269 43.488 0 78.742-35.254 78.742-78.742 0-22.645-9.559-43.057-24.861-57.421-33.94-34.29-68.191-68.188-102.266-102.263-2.825-2.825-5.65-6.003-9.534-10.24l62.323-61.263c13.418-13.418 27.189-26.483 40.077-40.43 3.281-2.891 7.111-9.74 8.444-17.445 1.443-10.097-5.443-15.394-17.625-15.57h-312.32c-23.658 0-27.719 4.061-27.719 27.895q0 154.306 0 308.789c-0.413 1.424-0.651 3.059-0.651 4.749 0 6.691 3.722 12.513 9.21 15.508 2.175 0.813 4.58 1.256 7.088 1.256 6.687 0 12.638-3.151 16.45-8.049q45.938-45.421 91.312-91.147c-15.147 17.038-0.765 3.060 10.102-13.439z" />
31
+ <glyph unicode="&#x4f;" glyph-name="archive" horiz-adv-x="833" d="M382.025 265.41h-238.592c-1.362-0.048-2.963-0.075-4.569-0.075-76.722 0-138.918 62.196-138.918 138.918 0 1.37 0.020 2.735 0.059 4.095q-0.005 206.441-0.005 412.734c0 76.722 62.196 138.918 138.918 138.918 161.666 0 324.026 0 486.213 0 0.971 0.025 2.113 0.040 3.26 0.040 56.17 0 104.23-34.726 123.881-83.881 14.209-31.287-1.593-54.73-34.412-54.73h-503.578c-1.857 0.176-4.014 0.277-6.195 0.277-38.361 0-69.459-31.098-69.459-69.459 0-2.237 0.106-4.45 0.313-6.633q-0.021-131.52-0.021-263.318c0-50.705 27.784-77.968 78.662-77.968h501.321c1.458 0.217 3.141 0.341 4.852 0.341 19.181 0 34.73-15.549 34.73-34.73 0-6.532-1.803-12.643-4.94-17.862-21.008-51.071-70.552-86.546-128.396-86.667h-243.122zM451.484 213.315h208.377v-121.553c25.7 0 15.802 0 40.634 0 2.535 0.441 5.797 2.794 7.78 6.017 12.82 17.355 33.139 28.447 56.049 28.447 38.361 0 69.459-31.098 69.459-69.459 0-2.169-0.099-4.314-0.294-6.432-2.734-30.281-26.005-55.449-56.157-61.132-4.598-1.004-9.383-1.54-14.293-1.54-22.154 0-41.758 10.918-53.726 27.666-2.948 4.367-7.652 7.070-12.987 7.070-0.611 0-1.215-0.036-1.807-0.105-22.676 0.007-10.694 0.007-33.268 0.007 0-29.867-28.826-86.824-105.578-86.824-1.14-0.046-2.478-0.072-3.822-0.072-50.887 0-93.019 37.48-100.298 86.34-24.726 0.555-14.828 0.555-39.833 0.555-2.535-0.441-5.797-2.794-7.78-6.017-12.746-18.188-33.546-29.892-57.081-29.892-38.361 0-69.459 31.098-69.459 69.459 0 2.741 0.159 5.444 0.468 8.102 2.724 30.229 25.995 55.398 56.147 61.080 4.598 1.004 9.383 1.54 14.293 1.54 22.154 0 41.758-10.918 53.726-27.666 2.935-4.459 7.69-7.232 13.094-7.232 0.574 0 1.14 0.031 1.698 0.092 22.679-0.006 10.697-0.006 34.661-0.006v121.553zM664.376 601.070l-217.58 80.746v80.92l217.58-80.92v-80.746zM664.376 739.815l-217.58 80.92h217.58v-80.92zM664.376 462.326l-217.58 80.746v80.746l217.58-80.746v-80.746zM446.795 404.328v80.746l217.58-80.746h-217.58z" />
32
+ <glyph unicode="&#x50;" glyph-name="pencil" d="M1005.714 835.657l-105.874 106.057c-11.205 10.989-26.57 17.772-43.52 17.772s-32.315-6.783-43.53-17.782l-90.139-89.773c-5.001-4.942-8.098-11.801-8.098-19.383s3.097-14.441 8.095-19.38l155.066-154.883c4.933-4.946 11.755-8.006 19.291-8.006s14.358 3.060 19.291 8.005l89.418 90.332c11.28 10.805 18.29 25.989 18.29 42.81 0 0.25-0.002 0.499-0.005 0.748 0.003 0.173 0.005 0.423 0.005 0.672 0 16.821-7.010 32.005-18.269 42.79zM85.577 195.657l-6.4-4.754-1.646-4.754-75.703-219.429-1.829-5.669c-0.513-1.557-0.809-3.35-0.809-5.211s0.296-3.654 0.843-5.333c-0.303-0.398 1.78-4.222 4.722-7.195 1.212-2.436 4.596-5.222 8.667-6.372 1.411-0.533 2.92-0.826 4.497-0.826s3.085 0.294 4.474 0.829l4.669 3.263 219.429 74.24 6.4 3.291 4.754 4.754c3.012 4.003 4.823 9.059 4.823 14.537s-1.811 10.534-4.868 14.6l-146.241 146.223c-3.377 2.079-7.47 3.311-11.849 3.311-0.334 0-0.667-0.007-0.998-0.021-0.021 0.003-0.101 0.003-0.181 0.003-4.96 0-9.371-2.351-12.18-6zM141.897 232.229l154.697-154.88c4.341-4.569 10.461-7.411 17.245-7.411 0.753 0 1.497 0.035 2.232 0.103 8.182 0.993 15.802 6.995 19.227 15.186l508.222 505.218c4.805 1.237 8.299 5.531 8.299 10.641 0 0.83-0.092 1.638-0.267 2.415 0.044 0.358 0.062 0.86 0.062 1.367 0 6.796-3.142 12.858-8.052 16.813l-154.739 154.912c-4.933 4.946-11.755 8.006-19.291 8.006s-14.358-3.060-19.291-8.005l-507.612-505.783c-4.946-4.933-8.006-11.755-8.006-19.291s3.060-14.358 8.005-19.291z" />
33
+ <glyph unicode="&#x51;" glyph-name="quora" horiz-adv-x="911" d="M695.79 106.019c3.596-15.101 23.817-39.586 50.242-54.246-40.601 22.728 2.827-5.557 50.912-24.625 9.205-2.488 13.998-8.286 13.998-15.204 0-0.382-0.015-0.761-0.043-1.136 0.003-17.605 0.003-35.261 0.003-52.916 0.257-1.013 0.404-2.177 0.404-3.375 0-7.898-6.403-14.301-14.301-14.301-0.266 0-0.531 0.007-0.794 0.022-59.108-9.182-115.605-5.828-166.805 29.129-7.085-0.7-40.335 30.641-61.431 69.534-3.148 6.217-8.387 9.67-14.433 9.67-1.336 0-2.632-0.169-3.869-0.486 2.529-0.954-45.655-7.205-94.816-9.766-3.969-0.12-5.873-0.132-7.78-0.132-94.629 0-182.061 30.815-252.809 82.957-85.845 51.128-164.078 162.048-186.131 292.088-5.712 28.702-8.77 58.662-8.77 89.337 0 116.169 43.862 222.094 115.928 302.117 45.578 64.244 143.675 127.546 256.753 147.171 27.893 5.565 56.97 8.538 86.741 8.538 104.131 0 199.769-36.366 274.906-97.090 75.283-48.643 146.935-154.036 168.449-276.688 5.832-29.094 8.949-59.458 8.949-90.549 0-103.708-34.672-199.318-93.057-275.871 16.652 8.453-41.705-60.467-114.896-108.714l-7.526-5.466zM629.407 245.495c1.236 1.766 4.237 5.473 7.062 9.534 33.173 48.522 52.973 108.474 52.973 173.049 0 0.735-0.003 1.469-0.008 2.203 0.319 11.927 0.501 26.1 0.501 40.317 0 51.28-2.361 102.009-6.982 152.083-3.832 61.431-43.719 131.186-103.212 176.534-33.71 26.441-75.921 42.117-121.793 42.117-51.63 0-98.622-19.858-133.754-52.353-59.034-54.74-96.017-132.976-96.090-219.851-1.412-44.858 0-89.878 0-134.722-0.011-0.992-0.017-2.164-0.017-3.337 0-42.177 8.042-82.475 22.677-119.446 31.895-82.723 109.754-169.41 226.985-158.817 10.417 0.883 20.657 3.708 33.368 6.003-26.659 40.96-57.732 69.385-103.283 79.095-4.557 1.173-8.784 5.253-10.387 10.481-0.912 24.477-0.030 49.017-0.030 73.382-0.027 0.266-0.043 0.574-0.043 0.886 0 5.070 4.11 9.181 9.181 9.181 0.64 0 1.265-0.065 1.868-0.19 4.087 0.251 8.936 0.389 13.818 0.389 42.722 0 82.986-10.523 118.342-29.118 29.503-15.928 57.751-37.291 89.001-57.771z" />
34
+ <glyph unicode="&#x52;" glyph-name="recycle" d="M0 240.022c3.708 17.655 6.532 35.31 11.299 51.377-7.126-8.74 11.71 43.949 40.441 89.805q27.355 46.14 55.426 93.985l5.12 9.357c-17.655 11.123-33.898 21.539-50.141 33.015 5.822-5.696-10.335 5.639-22.639 20.313-4.919 5.51-7.844 12.605-7.844 20.383 0 9.889 4.727 18.675 12.046 24.219-3.645-1.351 9.614 8.768 24.869 15.010 56.421 23.003 112.387 45.249 168.178 67.494-6.106-1.961 5.043 2.664 16.931 5.336 4.708 1.271 9.284 1.923 14.013 1.923 26.118 0 47.589-19.9 50.077-45.365 0.783-4.665 1.359-11.168 1.428-17.793 0.001-57.978 0.001-116.063 0.001-173.972-0.021-10.077-2.028-20.3-5.67-29.708-4.239-12.323-16.269-21.427-30.425-21.427-3.504 0-6.878 0.558-10.037 1.589 6.52-3.21-10.628 2.488-25.818 11.211-5.909 3.025-11.736 7.615-17.032 11.499l-19.068 12.359c8.284 9.307 1.068 2.312-4.432-5.926q-27.524-46.156-54.89-92.060c-6.004-6.006-17.172-30.182-21.757-56.615-1.298-6.087-1.965-11.997-1.965-18.063 0-36.533 24.174-67.419 57.399-77.535 13.393-5.084 32.907-9.050 53.262-9.677 47.947-1.243 95.616-0.007 143.991-0.007v-127.47c-2.295 0-4.767 0-7.415 0-47.669 0-95.338 0-143.007 0-1.38-0.024-3.009-0.037-4.641-0.037-53.195 0-103.050 14.302-145.929 39.269-40.348 21.217-73.7 67.505-80.455 122.039 0.117 0.52-0.434 3.603-1.382 6.506l0.065 38.965zM529.655 960c8.121-1.766 16.066-3.354 24.011-5.473 41.158-5.964 94.925-41.852 129.257-92.078 26.639-37.158 48.531-76.529 72.365-114.664 5.473-8.651 10.417-17.655 16.066-27.189 17.655 11.652 34.251 23.305 51.553 33.721-3.028-0.505 11.386 7.634 27.317 12.175 3.654 1.177 6.994 1.751 10.469 1.751 13.188 0 24.446-8.262 28.88-19.893 3.479-7.925 5.842-18.24 6.072-29.080 0.001-59.408 0.001-118.729 0.001-178.051-0.015-8.262-1.436-16.972-4.052-25.147-9.543-30.29-39.733-43.179-73.808-30.467-39.548 14.83-78.742 30.543-118.113 45.903-19.597 7.592-39.018 15.183-58.439 23.128-15.99 3.526-29.254 17.061-32.616 34.149-0.057 0.657-0.064 1.101-0.064 1.547 0 17.183 9.899 32.055 24.305 39.223 13.319 9.295 26.737 17.77 40.332 26.774 0.441-0.988-0.304 1.449-1.462 3.635-22.196 36.972-43.382 74.754-67.040 110.948 8.017-6.546-12.692 21.384-39.313 42.065-14.667 12.194-33.179 19.41-53.376 19.41s-38.71-7.216-53.099-19.211c25.271 24.464-12.142-5.895-40.479-43.481 19.652 25.731-1.942 1.266-17.598-26.949l-100.686 59.592c35.31 60.381 75.211 113.699 141.241 141.241-34.894-12.533 6.236 4.964 49.994 15.797l38.282 0.622zM735.868 160.044c7.004-0.482 15.18-0.756 23.42-0.756 23.683 0 46.837 2.267 69.257 6.596 54.391 15.17 80.344 60.543 61.453 116.334 19.88-44.969-1.019 13.112-31.86 64.551-4.156 8.188-10.689 17.899-16.515 29.022l97.633 58.439c0.396 0.012 1.445-0.414 2.31-1.070 30.175-50.13 62.661-99.035 76.255-157.297 4.796-15.802 7.557-33.964 7.557-52.77 0-36.685-10.506-70.915-28.672-99.848-15.944-29.748-59.158-63.651-110.656-76.957-28.747-8.77-62.15-14.028-96.75-14.243-17.768-0.001-34.011-0.001-53.078-0.001 0-17.655 0-33.015 0-49.258-0.026-8.341-1.711-17.96-4.778-26.939-3.703-11.521-14.901-20.166-28.118-20.166-3.391 0-6.65 0.569-9.685 1.617 1.124-1.594-12.643 3.507-24.506 11.276q-79.804 51.514-159.605 103.774c-39.371 25.777-39.018 61.44 0 87.217l149.892 97.633c5.65 3.708 11.123 7.415 17.655 10.593 32.132 17.655 58.262 3.531 59.498-33.545-0.177-17.302-0.706-34.957-0.706-54.201z" />
35
+ <glyph unicode="&#x53;" glyph-name="seo" d="M640 324.32h-151.52v87.84h126.24c8.837 0 16 7.163 16 16v66.080c0 8.837-7.163 16-16 16h-126.24v73.6h150.72c8.837 0 16 7.163 16 16v66.080c0 8.837-7.163 16-16 16h-249.6c-8.837 0-16-7.163-16-16v-423.68c0-8.837 7.163-16 16-16h250.4c8.837 0 16 7.163 16 16v66.080c0 8.837-7.163 16-16 16v0zM295.040 449.12c-27.243 25.69-60.119 44.648-96 55.36-12.16 5.28-22.24 10.24-30.56 14.88-6.525 3.489-12.689 7.616-18.4 12.32-3.204 2.715-5.771 6.102-7.52 9.92-1.675 3.943-2.493 8.197-2.4 12.48-0.196 5.436 0.618 10.861 2.4 16 1.559 4.269 3.952 8.185 7.040 11.52 2.931 2.939 6.485 5.181 10.4 6.56 5.121 1.88 10.545 2.802 16 2.72 5.868 0.144 11.7-0.947 17.12-3.2 4.517-1.996 8.474-5.073 11.52-8.96 3.693-4.755 6.412-10.192 8-16 2.034-7.016 3.004-14.297 2.88-21.6 0-8.837 7.163-16 16-16h80c6.879-0.018 12.999 4.363 15.2 10.88v1.76c0.51 1.55 0.78 3.169 0.8 4.8v4c0.199 18.749-3.337 37.351-10.4 54.72-6.484 17.080-16.394 32.653-29.12 45.76-14.215 13.736-31.172 24.314-49.76 31.040-19.396 6.945-39.88 10.359-60.48 10.080-20.14 0.235-40.186-2.791-59.36-8.96-17.943-5.928-34.569-15.273-48.96-27.52-14.061-11.771-25.321-26.529-32.96-43.2-7.485-16.923-11.25-35.256-11.040-53.76-0.308-17.979 2.842-35.85 9.28-52.64 6.347-15.934 16.381-30.136 29.28-41.44 30.757-24.553 65.881-43.065 103.52-54.56 14.493-5.372 27.766-13.586 39.040-24.16 2.89-3.307 5.069-7.174 6.4-11.36 1.694-5.545 2.504-11.323 2.4-17.12 0.050-5.427-0.76-10.827-2.4-16-1.304-3.972-3.43-7.625-6.24-10.72l11.84-10.72-11.68 10.080c-2.624-2.855-5.926-5.001-9.6-6.24-5.624-1.846-11.523-2.712-17.44-2.56-8.13-0.199-16.237 0.936-24 3.36-5.492 1.716-10.487 4.736-14.56 8.8-4.135 4.554-7.1 10.045-8.64 16-2.43 9.347-3.561 18.984-3.36 28.64 0 8.837-7.163 16-16 16h-81.28c-6.879 0.018-12.999-4.363-15.2-10.88v-1.76c-0.494-1.499-0.764-3.062-0.8-4.64v-4.48c-0.349-21.369 3.794-42.573 12.16-62.24 8.179-18.8 20.875-35.288 36.96-48 32.617-25.906 73.234-39.653 114.88-38.88 20.378 0.054 40.622 3.293 60 9.6 17.592 5.53 33.909 14.504 48 26.4 13.909 11.625 24.873 26.373 32 43.040 7.182 17.558 10.72 36.393 10.4 55.36 0.036 17.877-2.994 35.628-8.96 52.48-5.571 16.093-14.579 30.78-26.4 43.040v0zM996.96 584.64c-7.145 20.974-18.775 40.138-34.080 56.16-14.863 15.548-32.935 27.669-52.96 35.52-42.728 15.595-89.592 15.595-132.32 0-19.961-7.869-37.937-20.053-52.64-35.68-15.124-16.074-26.587-35.233-33.6-56.16-7.557-23.019-11.234-47.135-10.88-71.36v-118.72c-0.368-24.279 3.309-48.449 10.88-71.52 7.046-20.853 18.568-39.912 33.76-55.84 14.748-15.457 32.721-27.475 52.64-35.2 42.865-15.442 89.775-15.442 132.64 0 19.957 7.741 37.978 19.756 52.8 35.2 15.254 15.909 26.832 34.97 33.92 55.84 7.595 23.065 11.272 47.24 10.88 71.52v118.72c0.371 24.291-3.361 48.471-11.040 71.52v0zM794.4 514.080c-0.139 12.101 1.096 24.178 3.68 36 1.741 8.286 5.054 16.162 9.76 23.2 3.551 5.173 8.409 9.314 14.080 12 13.895 5.682 29.465 5.682 43.36 0 5.828-2.793 10.841-7.035 14.56-12.32 4.796-6.91 8.218-14.678 10.080-22.88 2.661-11.864 3.896-24.003 3.68-36.16v-119.68c0.189-12.156-1.046-24.292-3.68-36.16-1.735-8.364-5.106-16.303-9.92-23.36-3.719-5.285-8.732-9.527-14.56-12.32-13.738-5.637-29.142-5.637-42.88 0-5.778 2.728-10.742 6.92-14.4 12.16-4.815 7.115-8.185 15.106-9.92 23.52-2.646 12.029-3.881 24.325-3.68 36.64v119.36h-0.16z" />
36
+ <glyph unicode="&#x54;" glyph-name="trash" horiz-adv-x="796" d="M57.026 903.15c0 0 0 0 0 0 0-31.397 25.452-56.85 56.85-56.85 0.062 0 0.124 0 0.177 0h568.497c0 0 0 0 0 0 31.397 0 56.85 25.452 56.85 56.85s-25.452 56.85-56.85 56.85c0 0 0 0 0 0h-568.506c-31.383-0.099-56.817-25.472-57.017-56.85zM739.585 618.726c31.286 0.099 56.641 25.392 56.84 56.673v57.026c0 0 0 0.001 0 0.001 0 31.397-25.452 56.85-56.85 56.85-0.124 0-0.248 0-0.353-0.001h-681.833c-0.062 0-0.124 0-0.186 0-31.433 0-56.926-25.431-57.026-56.85v-56.85c0-31.397 25.452-56.85 56.85-56.85v-625.523c0 0 0 0 0 0 0-31.53 25.51-57.102 57.026-57.202h568.516c31.457 0.2 56.908 25.713 57.007 57.203v625.523zM170.726 618.726h113.699v-569.026h-113.699v569.026zM341.451 618.726h113.699v-569.026h-113.699v569.026zM512.177 618.726h113.699v-569.026h-113.876v569.026z" />
37
+ <glyph unicode="&#x55;" glyph-name="uptime" horiz-adv-x="1134" d="M57.234 390.583h217.051l164.571-418.011c8.581-21.457 29.195-36.339 53.284-36.339 28.233 0 51.692 20.443 56.381 47.334l119.455 695.199 89.966-250.149c8.129-22.356 29.192-38.034 53.918-38.034 0.009 0 0.018 0 0.026 0h264.593c31.711 0 57.417 25.707 57.417 57.417s-25.707 57.417-57.417 57.417h-223.817l-150.126 416.549c-8.447 21.735-29.2 36.861-53.486 36.861-27.832 0-51.024-19.866-56.17-46.191l-122.207-707.105-103.314 263.497c-8.551 21.544-29.217 36.526-53.389 36.571h-256.006c-31.711 0-57.417-25.707-57.417-57.417s25.707-57.417 57.417-57.417v0z" />
38
+ <glyph unicode="&#x56;" glyph-name="upload" horiz-adv-x="1365" d="M1050.836-64h-749.992c-0.424-0.002-0.925-0.003-1.426-0.003-15.013 0-29.805 0.942-44.322 2.77-117.762 14.242-218.304 105.483-247.147 224.715-3.005 14.041-5.359 25.576-7.949 36.169v69.208c-0.121-0.517 1.417 1.772 2.319 4.359 11.525 110.342 91.606 206.428 199.228 241.984 7.938 1.803 12.284 6.922 12.284 13.057 0 1.006-0.117 1.986-0.338 2.925 0.011 0.63 0.007 1.476 0.007 2.323 0 163.941 132.901 296.842 296.842 296.842 20.495 0 40.506-2.077 59.832-6.032-0.203-0.254 1.768-0.59 3.817-0.59 6.46 0 12.14 3.336 15.413 8.378 26.059 43.611 96.992 96.055 180.393 117.272-11.657-2.522 15.599 5.389 44.039 9.689 10.816 1.059 21.262 1.533 31.817 1.533 18.246 0 36.161-1.416 53.642-4.144 69.441-4.088 148.797-45.322 204.691-107.946 55.785-58.363 89.947-137.21 89.947-224.035 0-13.662-0.846-27.126-2.488-40.343-0.163 0.309-0.348-1.151-0.348-2.653 0-6.791 3.784-12.699 9.359-15.729 68.861-34.597 134.23-117.504 155.763-216.754-1.424 7.797 3.362-11.618 5.916-31.73 1.696-13.937 2.586-28.537 2.586-43.344s-0.889-29.407-2.618-43.748c-15.395-134.38-118.284-249.368-253.362-283.546-10.044-3.904-33.128-8.976-57.16-10.586zM633.468 145.743h146.185c12.397 1.14 22.314 11.010 23.532 23.433l0.009 195.727c0.974 12.508 10.94 22.506 23.448 23.534l97.549 0.006c14.36 0 48.493 0 0 48.728l-195.149 194.913c-6.226 6.256-14.843 10.128-24.364 10.128s-18.139-3.872-24.363-10.127l-195.15-194.914c-49.199-49.199-11.535-48.728 0-48.728h97.457c13.001 0 23.54-10.539 23.54-23.54v-194.913c0.741-13.575 11.929-24.302 25.623-24.302 0.592 0 1.18 0.020 1.763 0.060z" />
39
+ <glyph unicode="&#x57;" glyph-name="world" d="M365.714 18.103c5.976-10.646 28.073-27.415 54.041-35.262 31.188-10.424 66.163-16.318 102.515-16.318 38.771 0 75.977 6.704 110.52 19.015-13.109-5.71 1.945-0.090 15.19 8.16-33.216 43.97-73.627 69.57-128.484 67.193s-103.131-25.783-153.783-42.789zM125.074 219.246c-3.508 4.984-5.606 11.179-5.606 17.865 0 9.726 4.44 18.414 11.404 24.149 7.002 8.637 15.414 15.952 21.631 24.912-4.73-9.278 15.3 15.941 28.060 45.071 11.803 37.763 8.328 48.369-17.82 67.203-1.097 0-2.011 1.829-3.109 2.56-14.538 5.499-40.503 33.064-54.492 66.844-3.657 7.945-7.497 14.527-10.423 21.659-15.909 34.194-29.989 68.206-21.577 108.434 8.298 9.68-1.302 0.041-8.378-11.33 20.448 38.773-2.988 0.547-18.783-41.421-10.326-34.045-15.799-70.328-15.799-107.889s5.474-73.844 15.667-108.095c-0.221-16.144 12.884-49.446 33.481-76.783 3.135-7.668 21.778-23.63 44.121-32.032zM454.217 861.257l1.28-2.194c8.042 10.711 0.704-0.748-8.764-10.044-18.299-15.19-36.584-30.184-54.87-45.361 59.907 40.798 9.274 11.484-33.074-26.82-1.783-2.523-3.062-6.094-3.062-9.964 0-1.683 0.242-3.309 0.693-4.846 2.261-3.854 6.823-6.973 12.148-7.552 0.898-0.057 1.861-0.085 2.832-0.085 6.38 0 12.471 1.238 18.045 3.486q91.104 35.176 180.521 71.382c2.854 1.477 5.345 4.779 6.024 8.702 0.122 0.926 0.186 1.91 0.186 2.909 0 12.725-10.315 23.040-23.040 23.040-1.615 0-3.192-0.166-4.713-0.482-0.754-0.189-1.792-0.313-2.859-0.313-6.948 0-12.673 5.237-13.443 11.979-2.099 5.094-3.315 10.939-3.315 17.068 0 0.45 0.007 0.898 0.020 1.345 0.23 0.933 0.363 2.080 0.363 3.259 0 7.25-5.023 13.327-11.779 14.94 8.614-5.016-0.37 1.021-10.353 5.127-9.261 4.806-26.68 9.694-45.095 10.962-78.148-2.53-171.621-39.469-246.413-98.904 37.597 34.161-25.949-13.059-74.639-72.857l13.606-28.078c4.925-1.539 10.588-2.426 16.458-2.426 9.768 0 18.962 2.455 27 6.781 6.459 3.32 14.452 5.354 22.919 5.354s16.46-2.034 23.515-5.639c-4.164 1.729 1.135-0.895 6.854-2.522 4.053-1.832 8.393-2.851 12.97-2.851 16.663 0 30.171 13.508 30.171 30.171 0 0.137-0.001 0.273-0.003 0.409 0.016-0.566 0.75 3.026 1.083 6.734 0.525 10.233 6.505 19.572 15.231 24.801-11.879-9.884-0.573 0.973 12.66 8.961q56.969 30.067 113.837 59.141c-6.309-2.273 3.829 2.272 14.694 4.98zM503.223 618.789c13.531 6.4 26.514 12.069 39.314 18.286 5.65 2.873 12.322 4.556 19.386 4.556 4.433 0 8.71-0.663 12.74-1.894-1.772 5.663 56.736-14.645 107.651-46.072-11.303 9.775 12.401-6.356 30.666-27.346 12.963-14.089 23.386-30.18 35.272-44.992-6.989 3.404 18.165-26.478 49.745-47.457 10.514-6.811 22.49-10.592 35.348-10.592 3.984 0 7.883 0.363 11.666 1.058 11.396 0.105 20.89 9.701 20.89 21.515 0 4.048-1.114 7.835-3.053 11.072-0.976 1.882-1.581 4.226-1.581 6.711 0 1.416 0.196 2.787 0.563 4.086 2.929 2.032 6.625 3.313 10.621 3.313 0.759 0 1.507-0.046 2.242-0.136 2.334-0.111 7.185-2.578 10.887-6.212 25.231-20.659 50.099-41.688 75.699-61.985 12.069-9.509 21.211-6.949 25.783 7.863 3.369 9.396 5.316 20.237 5.316 31.532 0 0.55-0.005 1.099-0.014 1.647-0.263 42.389-13.256 99.616-36.027 151.584 7.501-12.427-6.079 20.844-26.073 49.278 118.608-161.488 35.527-28.798-71.081 80.907 50.945-50.529 7.397-0.455-45.169 38.030-7.394 5.781-15.317 8.763-23.936 8.763-5.84 0-11.361-1.369-16.258-3.804-12.222-5.39-24.473-11.424-36.359-18.19-16.64-8.046-18.286-7.314-25.234 9.326-1.026 10.748-10.008 19.088-20.939 19.088-5.21 0-9.977-1.894-13.65-5.032-22.28-13.69-43.857-28.867-65.434-43.679-4.895-3.332-8.068-8.878-8.068-15.165 0-2.441 0.478-4.771 1.347-6.9q2.882-8.289 5.259-17.066c1.995-2.751 3.191-6.194 3.191-9.917 0-8.97-6.946-16.319-15.752-16.96-21.084-8.049-42.661-15.546-63.141-24.689 2.909 3.329-14.693-6.197-28.765-19.435-6.227-5.566-10.163-13.695-10.163-22.744 0-6.523 2.045-12.568 5.529-17.53zM593.554 562.834c-20.993 12.338-46.239 19.625-73.188 19.625-1.463 0-2.921-0.021-4.373-0.064-65.067-5.298-106.027-42.966-133.821-97.824-3.271-5.69-5.2-12.511-5.2-19.782 0-12.99 6.157-24.542 15.711-31.897-8.384 4.063 15.818-14.994 43.748-27.058-34.324 12.321 16.004-9.664 69.761-22.946 21.284-3.464 36.121-17.656 39.951-35.897-2.367 6.813 0.391-0.114 2.137-7.433 6.143-39.307 12.36-78.073 18.395-116.838-2.344 10.411 2.408-32.601 10.992-74.213 6.928-25.261 26.676-31.295 52.459-13.924-12.475-9.056 4.526 1.252 18.3 14.826-29.756-26.513 2.517-1.845 27.796 28.806 26.681 35.728 52.647 71.202 77.332 107.408 1.65 7.609 18.879 26.348 40.565 37.757 21.975 7.156 37.189 26.885 37.189 50.166 0 0.718-0.014 1.433-0.043 2.144-0.063 0.2-0.1 0.548-0.1 0.904s0.038 0.703 0.109 1.038c0.586 1.261 0.931 2.772 0.931 4.365 0 4.378-2.608 8.147-6.355 9.838 36.045-26.123 5.795-0.803-28.714 17.572-17.225 5.638-35.937 23.326-45.206 45.89 10.205-22.437 0.183 4.434-14.439 28.168 14.264-22.666 0.548 3.173-17.978 24.763-1.787 2.226-6.771 5.211-12.43 6.305-19.907 4.414-40.204 7.34-59.587 12.643 26.012-9.617-12.883 1.666-48.169 19.14-4.050 0.727-8.367 6.070-8.367 12.422 0 1.803 0.348 3.525 0.981 5.102zM539.977-64h-55.954c2.685-0.476-3.199 1.009-9.304 1.788-65.31 1.008-144.474 24.437-212.994 64.186-120.342 57.945-225.505 193.667-253.256 355.816-4.080 22.553-5.909 42.484-8.469 62.233v55.954c-0.579-3.095 0.961 2.979 1.785 9.279 1.727 81.753 33.964 174.177 87.408 250.693 62.601 105.24 193.094 195.584 345.686 217.516 18.059 2.695 33.601 4.341 49.144 6.17h55.954c-2.808 0.507 3.133-0.994 9.296-1.787 44.675-0.295 103.039-13.054 156.284-35.552 169.597-73.29 274.922-202.57 310.579-387.438 3.84-19.749 5.303-40.046 7.863-60.16v-54.857c0.445 2.562-1.023-3.265-1.789-9.311-0.264-42.76-13.201-101.078-35.915-154.22-75.118-174.938-208.604-281.544-400.055-314.458-15.177-2.56-30.72-3.84-46.263-5.851z" />
40
+ <glyph unicode="&#x58;" glyph-name="pos_middle" d="M0 255.81c0-35.241 28.456-63.81 64.056-63.81h895.888c35.377 0 64.056 28.994 64.056 63.81v384.38c0 35.241-28.456 63.81-64.056 63.81h-895.888c-35.377 0-64.056-28.994-64.056-63.81v-384.38zM0 800c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 96c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0-32c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 928c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32z" />
41
+ <glyph unicode="&#x59;" glyph-name="pos_footer" d="M0 384.19c0 35.241 28.456 63.81 64.056 63.81h895.888c35.377 0 64.056-28.994 64.056-63.81v-384.38c0-35.241-28.456-63.81-64.056-63.81h-895.888c-35.377 0-64.056 28.994-64.056 63.81v384.38zM0 672c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 800c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 928c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 544c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32z" />
42
+ <glyph unicode="&#x5a;" glyph-name="star" horiz-adv-x="1108" d="M1061.82 608.734h-294.154c-0.215-0.002-0.468-0.003-0.722-0.003-32.971 0-61.217 20.227-73.008 48.949 2.219-5.396-0.573 0.484-2.378 6.781l-86.442 257.146-2.101 6.494c-8.374 19.126-27.135 32.245-48.96 32.245-23.194 0-42.927-14.817-50.25-35.502l-0.115-0.373-87.291-257.862c1.558 5.097-0.132-1.945-2.835-8.46-12.006-28.401-40.045-48.274-72.727-48.274-0.296 0-0.592 0.002-0.887 0.005h-294.682c-25.642-3.248-45.271-24.925-45.271-51.186 0-0.136 0.001-0.272 0.002-0.407 0.027-16.564 8.167-31.293 20.675-40.373l2.628-1.819 229.211-161.021c20.484-13.761 33.881-36.915 34-63.206 0-0.107 0.001-0.211 0.001-0.316 0-6.067-0.767-11.955-2.208-17.572 1.142 2.679-1.008-5.384-4.459-12.715l-86.355-256.883v-1.91c-1.388-4.412-2.187-9.486-2.187-14.747 0-28.061 22.748-50.808 50.808-50.808 0.702 0 1.401 0.014 2.096 0.042-0.047-0.003 0.015-0.004 0.077-0.004 9.536 0 18.494 2.478 26.264 6.826l8.705 6.163 231.885 162.74c12.206 7.704 27.058 12.276 42.977 12.276s30.771-4.572 43.314-12.474c-7.243 4.386 0.917 0.236 7.788-5.423l-0.102 0.082 231.885-162.931c7.777-4.564 17.128-7.259 27.108-7.259 0.073 0 0.145 0 0.218 0 0.221-0.004 0.495-0.006 0.77-0.006 28.12 0 51.003 22.423 51.745 50.364-0.002 5.381-0.911 10.616-2.582 15.497l0.101 2.144-88.055 258.435c1.605-4.417-1.49 2.474-3.341 9.859-1.674 6.132-2.58 12.65-2.58 19.38 0 0.062 0 0.124 0 0.186 0.066 24.265 11.745 45.936 29.802 59.64l6.108 4.338 226.155 158.729 6.303 4.011c11.197 8.706 18.704 22.538 19.1 38.138-0.050 26.51-20.083 48.268-45.805 51.043z" />
43
+ <glyph unicode="&#x61;" glyph-name="lock" d="M568 112h-112l20.8 120c-28.8 12.8-48 41.6-48 75.2 0 46.4 36.8 83.2 83.2 83.2s83.2-36.8 83.2-83.2c0-33.6-19.2-62.4-48-75.2l20.8-120zM624 504h-224v168c0 62.4 51.2 112 112 112s112-49.6 112-112v-168zM736 504v168c0 123.2-100.8 224-224 224s-224-100.8-224-224v-168h-56c-30.4 0-56-25.6-56-56v-392c0-30.4 25.6-56 56-56h560c30.4 0 56 25.6 56 56v392c0 30.4-25.6 56-56 56h-56z" />
44
+ <glyph unicode="&#x62;" glyph-name="book" horiz-adv-x="727" d="M707.467 808.92c-2.704 9.436-9.638 16.489-18.143 19.762-0.335 0.134-0.671 0.263-1.011 0.385-0.338 0.116-0.678 0.224-1.020 0.328-3.334 1.063-6.841 1.586-10.376 1.438-0.732-0.032-1.507-0.048-2.322-0.048-4.964-0.008-11.389 0.645-18.57 2.063-12.594 2.459-27.479 7.227-42.21 13.683-11.060 4.833-22.069 10.603-32.15 16.917-7.561 4.732-14.603 9.77-20.762 14.877-4.621 3.827-8.744 7.693-12.233 11.443-5.247 5.621-9.006 11-11.161 15.356-1.087 2.179-1.496 4.090-1.911 5.683-0.417 1.597-0.265 2.865-0.265 3.929v0.147c0 9.547-4.633 18.687-12.259 24.436-7.624 5.749-17.788 7.537-26.931 4.782l-474.675-143.044c-12.698-3.827-21.469-15.534-21.469-28.795v-666.072c0-10.182 1.798-20.104 4.889-29.476 2.707-8.21 6.395-16.027 10.827-23.458 7.77-13.003 17.797-24.86 29.448-35.633 17.493-16.137 38.693-29.876 62.282-40.397 23.591-10.496 49.603-17.75 76.729-20.243 3.777-0.346 7.663 0.039 11.299 1.119 0.985 0.293 2.247 0.677 3.919 1.192 6.43 1.98 18.749 5.841 35.546 11.126 117.454 36.968 452.335 143.268 452.35 143.274 12.466 3.956 20.976 15.585 20.976 28.664v653.767c0.633 4.15 0.433 8.495-0.798 12.795v0zM542.709 817.019c8.776-5.86 17.982-11.248 27.4-16.17-39.795-11.404-87.554-25.093-135.832-38.936-59.784-17.143-120.357-34.518-167.561-48.078-23.603-6.78-43.863-12.604-59.017-16.971-7.579-2.183-13.88-4.001-18.692-5.395-1.489-0.43-2.812-0.814-4.006-1.161-15.907 1.901-31.585 5.708-46.115 10.997-12.141 4.412-23.481 9.844-33.481 15.902-7.501 4.541-14.245 9.436-20.027 14.452-7.916 6.848-13.95 13.929-17.953 20.448l416.585 125.558c1.54-3.032 3.209-5.977 5.006-8.824 4.783-7.561 10.395-14.531 16.585-21.076 10.842-11.437 23.473-21.618 37.108-30.746v0zM105.647 46.507c-7.508 4.95-14.299 10.286-20.161 15.755-8.803 8.197-15.457 16.72-19.586 24.403-2.075 3.839-3.531 7.454-4.447 10.723-0.916 3.275-1.302 6.188-1.302 8.803v568.871c14.659-10.516 31.171-19.49 48.965-26.74 14.961-6.078 30.833-10.922 47.275-14.275v-610.805c-5.932 1.717-11.765 3.705-17.43 5.962-12.018 4.782-23.302 10.699-33.314 17.302v0zM256.541 40.302c-15.080-4.762-28.58-9.019-40-12.613v609.125c15.947 4.6 40.601 11.481 69.172 19.743v-267.943l83.133 83.765 55.211-27.922v252.161c45.112 12.656 89.321 25.505 129.125 36.914 37.621 10.783 71.111 20.275 94.933 27.1v-596.265c-42.103-13.361-141.164-44.792-237.658-75.363-56.069-17.762-111.271-35.236-153.917-48.702v0z" />
45
+ <glyph unicode="&#x63;" glyph-name="unlock" d="M800 512h-64v160c0 123.2-100.8 224-224 224s-224-100.8-224-224c0 0 0-40 0-48s8-16 16-16 72 0 80 0c8 0 16 8 16 16s0 48 0 48c0 62.4 51.2 112 112 112 62.4 0 112-49.6 112-112v-160h-400c-30.4 0-48-17.6-48-48v-408c0-30.4 25.6-56 56-56h560c30.4 0 56 25.6 56 56v408c0 30.4-17.6 48-48 48zM547.2 232l20.8-120h-112l20.8 120c-28.8 12.8-48 41.6-48 75.2 0 46.4 36.8 83.2 83.2 83.2s83.2-36.8 83.2-83.2c0-32-19.2-60.8-48-75.2z" />
46
+ <glyph unicode="&#x64;" glyph-name="plugin" d="M272 736c16 16 544-512 528-528-65.6-65.6-160-112-272-112-75.2 0-164.8 0-224 0-12.8 0-24-4.8-32-12.8-20.8-17.6-38.4-38.4-59.2-57.6-35.2-33.6-86.4-33.6-120 0-35.2 33.6-35.2 84.8-1.6 121.6 17.6 19.2 38.4 36.8 56 57.6 8 9.6 12.8 22.4 12.8 35.2 0 67.2 0 139.2 0 224 0 112 48 208 112 272zM785.6 353.6c-16-16-128 96-112 112s139.2 137.6 176 174.4c33.6 33.6 144-80 112-110.4-59.2-59.2-116.8-116.8-176-176zM545.6 593.6c-16-16-128 96-112 112s139.2 137.6 176 174.4c33.6 33.6 144-80 112-110.4-59.2-59.2-116.8-116.8-176-176z" />
47
+ <glyph unicode="&#x65;" glyph-name="caret_down" d="M779.2 508.8l-204.8-204.8c-14.4-14.4-32-32-62.4-32s-49.6 17.6-62.4 32l-204.8 204.8c-27.2 27.2-27.2 67.2 0 94.4s67.2 27.2 94.4 0l172.8-172.8 172.8 172.8c27.2 27.2 67.2 27.2 94.4 0s27.2-67.2 0-94.4z" />
48
+ <glyph unicode="&#x66;" glyph-name="power" d="M848 726.4c-16 20.8-46.4 24-67.2 6.4-20.8-16-24-46.4-6.4-67.2v0c48-59.2 75.2-131.2 75.2-212.8 0-92.8-38.4-177.6-99.2-238.4s-145.6-99.2-238.4-99.2c-92.8 0-177.6 38.4-238.4 99.2s-99.2 145.6-99.2 238.4c0 80 27.2 153.6 75.2 212.8 16 20.8 12.8 49.6-6.4 67.2-20.8 16-49.6 12.8-67.2-6.4-60.8-75.2-96-169.6-96-272 0-118.4 48-227.2 126.4-305.6s185.6-126.4 305.6-126.4c118.4 0 227.2 48 305.6 126.4s126.4 187.2 126.4 307.2c0 102.4-35.2 196.8-96 270.4zM512 398.4c27.2 0 48 20.8 48 48v384c0 27.2-20.8 48-48 48s-48-20.8-48-48v-384c0-27.2 20.8-48 48-48z" />
49
+ <glyph unicode="&#x67;" glyph-name="radio_checked" d="M512 896c-248 0-448-200-448-448s200-448 448-448 448 200 448 448-200 448-448 448zM720 496l-176-176c-3.2-3.2-28.8-32-64-32s-60.8 28.8-64 32l-112 112c-16 16-16 48 0 64s48 14.4 64-1.6l112-110.4 176 176c16 16 48 16 64 0s16-48 0-64z" />
50
+ <glyph unicode="&#x68;" glyph-name="radio_default, radio" d="M512 803.2c195.2 0 355.2-158.4 355.2-355.2s-160-355.2-355.2-355.2-355.2 160-355.2 355.2 160 355.2 355.2 355.2zM512 896c-248 0-448-200-448-448s200-448 448-448 448 200 448 448-200 448-448 448z" />
51
+ <glyph unicode="&#x69;" glyph-name="download_alt" d="M753.6 112c-174.4 0-318.4 0-492.8 0-16 0-27.2 1.6-28.8 1.6-80 11.2-145.6 70.4-163.2 150.4-1.6 8-3.2 14.4-4.8 22.4 0 14.4 0 30.4 0 44.8 0 1.6 1.6 1.6 1.6 3.2 12.8 78.4 57.6 131.2 132.8 160 6.4 1.6 6.4 4.8 6.4 9.6-1.6 123.2 112 217.6 233.6 193.6 6.4-1.6 9.6 0 14.4 4.8 32 38.4 72 64 120 76.8 9.6 1.6 19.2 4.8 28.8 6.4 25.6 3.2 52.8-1.6 54.4-1.6 54.4-8 99.2-30.4 136-70.4 44.8-49.6 64-105.6 57.6-172.8 0-6.4 1.6-9.6 6.4-12.8 54.4-33.6 88-81.6 102.4-144 1.6-8 3.2-12.8 3.2-20.8 3.2-28.8 0-54.4 0-56-12.8-91.2-78.4-164.8-168-188.8-12.8-3.2-27.2-6.4-40-6.4zM560 560c-32 0-73.6 0-96 0-8 0-16-8-16-16 0-43.2 0-84.8 0-128 0-9.6-8-16-16-16-27.2 0-38.4 0-64 0-9.6 0-32 0 0-32 44.8-44.8 84.8-84.8 128-128 8-8 22.4-9.6 32 0 43.2 43.2 84.8 84.8 128 128 32 32 8 32 0 32-16 0-48 0-64 0-9.6 0-16 8-16 16 0 48 0 80 0 128 0 9.6-8 16-16 16z" />
52
+ <glyph unicode="&#x6a;" glyph-name="rocket" d="M603.2 182.4c-36.8-36.8-148.8-36.8-184 0-19.2 19.2-35.2 0-35.2-19.2 0-33.6 0-78.4 0-112 0-19.2 17.6-36.8 36.8-19.2 11.2 11.2 24 24 36.8 36.8 11.2-27.2 25.6-64 36.8-92.8 9.6-24 27.2-24 36.8 0 9.6 25.6 27.2 70.4 36.8 92.8 9.6-9.6 17.6-17.6 36.8-36.8 17.6-17.6 36.8 0 36.8 19.2 0 32 0 78.4 0 112-1.6 19.2-19.2 38.4-38.4 19.2zM800 419.2c-19.2 19.2-80 60.8-80 80 0 168-51.2 307.2-144 400-52.8 52.8-76.8 51.2-128 0-92.8-92.8-144-232-144-400 0-17.6-62.4-62.4-80-80-36.8-36.8-32-76.8-32-96 0-56 25.6-140.8 32-160 11.2-36.8 60.8-35.2 80-16 36.8 36.8 83.2 83.2 96 96 56-56 168-56 224 0 12.8-12.8 59.2-59.2 96-96 19.2-19.2 70.4-20.8 80 16 4.8 19.2 32 104 32 160 0 19.2 4.8 59.2-32 96zM512 534.4c-52.8 0-96 43.2-96 96s43.2 96 96 96c51.2 0 96-44.8 96-96 0-49.6-43.2-96-96-96zM560 630.4c0-26.51-21.49-48-48-48s-48 21.49-48 48c0 26.51 21.49 48 48 48s48-21.49 48-48z" />
53
+ <glyph unicode="&#x6b;" glyph-name="search" d="M923.2 137.6l-228.8 230.4c33.6 52.8 52.8 112 52.8 179.2-1.6 184-150.4 332.8-334.4 332.8s-332.8-148.8-332.8-332.8 148.8-332.8 332.8-332.8c67.2 0 126.4 19.2 179.2 52.8l230.4-230.4c28.8-28.8 73.6-28.8 100.8 0s27.2 73.6 0 100.8zM174.4 547.2c0 131.2 105.6 238.4 238.4 238.4s238.4-105.6 238.4-238.4-107.2-236.8-238.4-236.8-238.4 105.6-238.4 236.8z" />
54
+ <glyph unicode="&#x6c;" glyph-name="theme" d="M336 704c113.6-113.6 224-224 336-336 16-16 16-33.6 0-48-24-24-57.6-57.6-80-80-16-16-32-16-48 0-17.6 17.6-62.4 62.4-80 80-30.4 28.8-51.2 12.8-64 0-16-16-80-128-160-208-81.6-81.6-152-104-208-48s-33.6 126.4 48 208c80 80 192 144 208 160s32 32 0 64c-19.2 19.2-60.8 60.8-80 80-16 16-16 32 0 48 24 24 56 56 80 80 16 16 32 17.6 48 0zM384 800c17.6 17.6 36.8 35.2 56 52.8 27.2 25.6 62.4 19.2 94.4 16 44.8-4.8 84.8-24 121.6-51.2 32-25.6 64-52.8 99.2-75.2 81.6-54.4 169.6-92.8 268.8-73.6-80-80-176-172.8-256-252.8-16-16-32-16-48 0-30.4 30.4-310.4 308.8-337.6 336-14.4 14.4-14.4 32 1.6 48z" />
55
+ <glyph unicode="&#x6d;" glyph-name="speach" d="M699.206 589.081h-345.743c-13.632 0-24.696-11.014-24.696-24.696 0-13.632 11.064-24.696 24.696-24.696h345.743c13.632 0 24.696 11.064 24.696 24.696 0 13.682-11.064 24.696-24.696 24.696zM699.206 292.729h-345.743c-13.632 0-24.696-11.014-24.696-24.696 0-13.632 11.064-24.696 24.696-24.696h345.743c13.632 0 24.696 11.064 24.696 24.696 0 13.682-11.064 24.696-24.696 24.696zM699.206 440.905h-345.743c-13.632 0-24.696-11.014-24.696-24.696 0-13.632 11.064-24.696 24.696-24.696h345.743c13.632 0 24.696 11.064 24.696 24.696 0 13.682-11.064 24.696-24.696 24.696zM501.639 931.12c-272.742 0-493.919-221.226-493.919-493.919 0-109.897 35.908-211.447 96.611-293.437l-51.318-177.218 175.983 58.727c78.089-51.911 171.884-81.991 272.643-81.991 272.742 0 493.919 221.078 493.919 493.919 0 272.693-221.177 493.919-493.919 493.919v0zM501.639 42.065c-78.138 0-153.461 22.671-217.917 65.494-16.398 10.916-35.463 16.497-54.726 16.497-9.681 0-19.362-1.432-28.845-4.297 7.162 28.598 1.185 59.023-16.398 82.781-50.528 68.21-77.249 149.312-77.249 234.661 0 217.868 177.268 395.135 395.135 395.135s395.135-177.268 395.135-395.135c0-217.868-177.268-395.135-395.135-395.135v0z" />
56
+ <glyph unicode="&#x6e;" glyph-name="support" horiz-adv-x="847" d="M504.231 4.118c22.087 9.699 42.18 20.276 60.268 31.085 39.815 23.797 69.925 48.698 90.442 68.056 1.536-0.142 3.092-0.214 4.664-0.214 27.658 0 50.078 22.421 50.078 50.078v206.037c0 27.658-22.421 50.078-50.078 50.078s-50.078-22.421-50.078-50.078v-200.346c-6.829-6.618-15.244-14.275-25.222-22.478-15.543-12.784-34.873-26.902-57.905-40.556-14.759-8.751-31.036-17.312-48.824-25.227-11.141 4.622-23.975 5.258-36.212 0.833-16.277-5.886-33.641-11.126-52.114-15.437-26.934-6.284-43.674-33.213-37.388-60.147 6.284-26.934 33.213-43.674 60.147-37.388 22.439 5.235 43.588 11.614 63.421 18.787 13.406 4.849 23.478 14.826 28.803 26.918zM101.589 257.573v277.577c0.007 42.612 8.608 82.95 24.154 119.726 23.312 55.141 62.386 102.213 111.51 135.39 24.558 16.59 51.606 29.709 80.464 38.686 28.862 8.974 59.532 13.819 91.496 13.822 42.612-0.007 82.948-8.608 119.726-24.154 55.141-23.312 102.213-62.386 135.39-111.51 16.59-24.558 29.709-51.605 38.686-80.463 8.974-28.864 13.819-59.533 13.822-91.497v-277.577c0-27.658 22.421-50.078 50.078-50.078s50.078 22.421 50.078 50.078v277.577c0.007 56.165-11.411 109.929-32.066 158.743-30.991 73.243-82.631 135.406-147.685 179.366-32.532 21.979-68.44 39.405-106.787 51.33-38.341 11.929-79.124 18.344-121.243 18.342-56.165 0.007-109.929-11.411-158.743-32.066-73.243-30.991-135.406-82.629-179.366-147.685-21.977-32.532-39.405-68.44-51.33-106.787-11.929-38.34-18.344-79.124-18.342-121.243v-277.577c0-27.658 22.421-50.078 50.078-50.078s50.078 22.421 50.078 50.078zM108.743 357.729v-206.037c0-27.658 22.421-50.078 50.078-50.078s50.078 22.421 50.078 50.078v206.037c0 27.658-22.421 50.078-50.078 50.078s-50.078-22.421-50.078-50.078z" />
57
+ <glyph unicode="&#x6f;" glyph-name="edit" d="M380.8 412.8l96-96c6.4-6.4 17.6-6.4 24 4.8l315.2 313.6c6.4 1.6 6.4 12.8 0 19.2l-96 96c-6.4 6.4-17.6 6.4-24 0l-315.2-313.6c-6.4-6.4-6.4-17.6 0-24zM345.6 390.4l-3.2-3.2-1.6-3.2-46.4-136-1.6-3.2c-1.6-4.8 0-8 3.2-11.2s8-4.8 11.2-3.2l3.2 1.6 136 46.4 3.2 1.6 3.2 3.2c4.8 4.8 4.8 12.8 0 17.6l-91.2 91.2c-3.2 3.2-11.2 3.2-16-1.6zM916.8 787.2l-65.6 65.6c-14.4 14.4-40 14.4-54.4 0l-56-56c-6.4-6.4-6.4-17.6 0-24l96-96c6.4-6.4 17.6-6.4 24 0l56 56c14.4 14.4 14.4 40 0 54.4zM832 528c-24 0-48-24-48-48v-361.6l-592-6.4v608h352c24 0 48 24 48 48s-24 48-48 48h-400c-24 0-48-24-48-48v-704c0-24 24-48 48-48h688c25.6 0 48 22.4 48 48 0 4.8 0 416 0 416 0 24-24 48-48 48z" />
58
+ <glyph unicode="&#x70;" glyph-name="info" d="M512 800c195.2 0 352-156.8 352-352s-156.8-352-352-352-352 156.8-352 352 156.8 352 352 352zM512 896c-248 0-448-200-448-448s200-448 448-448 448 200 448 448-200 448-448 448zM523.2 396.8c0-11.2 6.4-19.2 6.4-30.4 0-14.4-11.2-28.8-27.2-28.8-27.2 0-41.6 41.6-41.6 64 0 92.8 121.6 102.4 121.6 174.4 0 33.6-24 62.4-76.8 62.4-36.8 0-65.6-14.4-88-36.8-6.4-4.8-12.8-8-20.8-8-16 0-30.4 14.4-30.4 32 0 6.4 1.6 14.4 6.4 19.2 32 38.4 84.8 59.2 139.2 59.2 88 0 142.4-51.2 142.4-116.8 1.6-110.4-131.2-120-131.2-190.4zM508.8 192c-24 0-44.8 20.8-44.8 46.4 0 24 19.2 46.4 44.8 46.4 24 0 44.8-22.4 44.8-46.4-1.6-25.6-22.4-46.4-44.8-46.4z" />
59
+ <glyph unicode="&#x71;" glyph-name="badge" d="M683.2 276.8l-163.2 113.6-163.2-113.6 65.6 179.2-131.2 97.6h163.2l65.6 179.2 65.6-179.2h163.2l-131.2-97.6 65.6-179.2zM912 374.4c0 65.6-19.2 97.6-32 131.2-12.8 35.2-24 64-32 81.6-28.8 65.6 0 131.2 16 147.2s32 32 49.6 49.6c-19.2 20.8-62.4 59.2-81.6 81.6-33.6-16-81.6-32-147.2-32s-132.8 33.6-163.2 65.6c-33.6-35.2-116.8-67.2-180.8-67.2-67.2 0-99.2 14.4-131.2 32-17.6-17.6-54.4-54.4-81.6-81.6 12.8-12.8 30.4-30.4 49.6-49.6 16-16 44.8-97.6 16-147.2-9.6-16-32-51.2-49.6-81.6-16-32-32-65.6-32-131.2s32-168 97.6-212.8c49.6-32 131.2-32 179.2-49.6 49.6-16 113.6-81.6 131.2-113.6 16 32 83.2 97.6 131.2 113.6 49.6 17.6 131.2 16 179.2 49.6 70.4 49.6 81.6 148.8 81.6 214.4z" />
60
+ <glyph unicode="&#x72;" glyph-name="caret_up" d="M779.2 292.8c-27.2-27.2-67.2-27.2-94.4 0l-172.8 172.8-172.8-172.8c-27.2-27.2-67.2-27.2-94.4 0s-27.2 67.2 0 94.4l204.8 204.8c14.4 14.4 32 32 62.4 32s49.6-17.6 62.4-32l204.8-204.8c27.2-27.2 27.2-67.2 0-94.4z" />
61
+ <glyph unicode="&#x73;" glyph-name="options" d="M224 448c0-61.856-50.144-112-112-112s-112 50.144-112 112c0 61.856 50.144 112 112 112s112-50.144 112-112zM624 448c0-61.856-50.144-112-112-112s-112 50.144-112 112c0 61.856 50.144 112 112 112s112-50.144 112-112zM1024 448c0-61.856-50.144-112-112-112s-112 50.144-112 112c0 61.856 50.144 112 112 112s112-50.144 112-112z" />
62
+ <glyph unicode="&#x74;" glyph-name="cog" d="M740.8 448v0c0-25.6-4.8-51.2-12.8-75.2-3.2-9.6-6.4-17.6-11.2-25.6-11.2-22.4-25.6-43.2-43.2-60.8s-38.4-32-60.8-44.8c-8-4.8-17.6-8-25.6-11.2-24-8-48-12.8-75.2-12.8v0c-25.6 0-51.2 4.8-73.6 12.8-9.6 3.2-17.6 6.4-27.2 11.2-22.4 11.2-43.2 25.6-60.8 43.2s-33.6 38.4-44.8 60.8c-4.8 8-8 17.6-11.2 27.2-8 24-12.8 48-12.8 73.6s4.8 51.2 12.8 75.2c3.2 9.6 6.4 17.6 11.2 27.2 11.2 22.4 25.6 43.2 44.8 60.8 17.6 17.6 38.4 32 60.8 43.2 8 4.8 17.6 8 27.2 11.2 24 8 48 12.8 73.6 12.8v0c25.6 0 51.2-4.8 75.2-12.8 9.6-3.2 17.6-6.4 25.6-11.2 22.4-11.2 43.2-25.6 60.8-44.8 17.6-17.6 32-38.4 43.2-60.8 4.8-8 8-17.6 11.2-25.6 8-22.4 12.8-48 12.8-73.6v0 0zM958.4 489.6v0c-1.6 17.6-16 32-33.6 33.6h-20.8c-22.4 0-41.6 12.8-49.6 30.4-1.6 4.8-3.2 9.6-4.8 14.4-4.8 11.2-9.6 22.4-14.4 33.6v0c-3.2 3.2-4.8 8-6.4 12.8v0c-1.6 6.4-3.2 12.8-3.2 19.2 0 16 6.4 28.8 16 40v0l11.2 11.2c12.8 14.4 14.4 35.2 1.6 49.6v0c-8 11.2-17.6 20.8-27.2 30.4s-20.8 19.2-30.4 28.8v0c-12.8 11.2-32 11.2-44.8 1.6l-8-8-8-9.6c-16-16-40-20.8-60.8-12.8-3.2 1.6-4.8 3.2-8 3.2-12.8 6.4-25.6 11.2-40 16-3.2 0-4.8 1.6-6.4 1.6v0c-6.4 3.2-12.8 6.4-19.2 12.8-9.6 9.6-14.4 20.8-16 32 0 4.8 0 9.6 0 14.4v12.8c0 17.6-12.8 33.6-30.4 36.8-1.6 0-4.8 0-6.4 0v0c-11.2 1.6-24 1.6-36.8 1.6s-25.6 0-36.8-1.6v0c-1.6 0-4.8 0-6.4 0-17.6-3.2-30.4-17.6-30.4-36.8v-16c0-24-14.4-44.8-36.8-52.8-1.6 0-3.2-1.6-4.8-1.6-14.4-4.8-28.8-11.2-43.2-17.6v0c-1.6 0-1.6-1.6-3.2-1.6-6.4-3.2-14.4-4.8-24-4.8-16 0-28.8 6.4-40 16v0l-11.2 11.2c-12.8 12.8-33.6 14.4-48 4.8-1.6-1.6-3.2-3.2-4.8-4.8v0c-9.6-8-19.2-16-27.2-25.6-9.6-8-17.6-17.6-25.6-27.2v0c-1.6-1.6-3.2-3.2-4.8-4.8-9.6-14.4-8-35.2 4.8-48l11.2-11.2c17.6-17.6 20.8-41.6 11.2-62.4 0-1.6-1.6-3.2-1.6-3.2-6.4-14.4-12.8-28.8-17.6-43.2 0-1.6-1.6-3.2-1.6-4.8v0c-3.2-6.4-6.4-14.4-12.8-19.2-11.2-11.2-25.6-16-40-16v0h-16c-17.6 0-33.6-12.8-36.8-30.4 0-1.6 0-4.8 0-6.4-1.6-14.4-1.6-27.2-1.6-40v0 0c0-12.8 0-24 1.6-36.8v0c0-1.6 0-4.8 0-6.4 3.2-17.6 17.6-30.4 36.8-30.4v0h16c24 0 44.8-14.4 52.8-35.2v0c0-1.6 1.6-3.2 1.6-4.8v0c4.8-14.4 11.2-28.8 17.6-43.2v0c0-1.6 1.6-1.6 1.6-3.2 3.2-6.4 4.8-14.4 4.8-24 0-16-6.4-28.8-16-40v0l-11.2-11.2c-12.8-12.8-14.4-32-4.8-46.4 1.6-1.6 3.2-3.2 4.8-6.4 8-9.6 16-19.2 25.6-27.2 8-8 17.6-17.6 27.2-25.6 1.6-1.6 3.2-3.2 6.4-4.8 12.8-8 30.4-8 43.2 1.6l16 16c17.6 17.6 41.6 20.8 62.4 11.2 1.6 0 1.6-1.6 3.2-1.6v0c14.4-6.4 28.8-12.8 43.2-17.6 1.6 0 3.2-1.6 3.2-1.6 8-3.2 14.4-6.4 20.8-12.8 11.2-11.2 16-25.6 16-40v0-16c0-19.2 14.4-35.2 33.6-36.8v0c14.4-4.8 27.2-4.8 41.6-4.8s27.2 0 41.6 1.6v0c19.2 1.6 33.6 17.6 33.6 36.8v16c0 22.4 12.8 41.6 32 51.2 3.2 1.6 8 3.2 12.8 4.8 12.8 4.8 24 9.6 35.2 14.4 3.2 1.6 6.4 4.8 11.2 4.8 6.4 1.6 12.8 3.2 19.2 3.2 14.4 0 27.2-4.8 36.8-14.4 1.6-1.6 3.2-3.2 4.8-4.8l9.6-9.6c12.8-12.8 33.6-14.4 48-3.2v0c1.6 1.6 1.6 1.6 3.2 3.2 9.6 8 19.2 17.6 28.8 25.6 9.6 9.6 17.6 19.2 25.6 28.8 1.6 1.6 1.6 3.2 3.2 3.2 9.6 14.4 9.6 33.6-3.2 46.4v0l-3.2 3.2-9.6 12.8c-16 16-20.8 41.6-11.2 62.4 1.6 1.6 1.6 3.2 3.2 6.4 6.4 12.8 12.8 27.2 17.6 41.6 0 1.6 1.6 3.2 1.6 6.4 3.2 6.4 6.4 12.8 12.8 19.2 11.2 11.2 25.6 16 40 16v0h16c19.2 0 36.8 16 36.8 35.2v0c1.6 11.2 1.6 24 1.6 36.8 0 14.4 0 27.2-1.6 41.6z" />
63
+ <glyph unicode="&#x75;" glyph-name="cylinder" d="M512 352c-212.8 0-390.4 78.4-416 160 0-20.8 0-108.8 0-108.8 0-92.8 185.6-163.2 416-163.2s416 70.4 416 163.2c0 0 0 91.2 0 108.8-25.6-81.6-203.2-160-416-160zM512 128c-212.8 0-390.4 78.4-416 160 0-27.2 0-105.6 0-105.6 0-92.8 185.6-166.4 416-166.4s416 73.6 416 166.4c0 0 0 94.4 0 105.6-25.6-81.6-203.2-160-416-160zM512 864c-230.4 0-416-73.6-416-160v-80c0-91.2 185.6-160 416-160s416 68.8 416 160v80c0 86.4-185.6 160-416 160z" />
64
+ <glyph unicode="&#x76;" glyph-name="rocket_alt" horiz-adv-x="800" d="M797.496 927.982c0 3.36-0.111 5.277-0.139 5.804-0.472 8.415-4.721 16.135-11.581 21.023-6.86 4.916-15.552 6.443-23.662 4.138-5.388-1.416-162.048-47.823-387.305-306.712-98.062-16.358-160.549-52.878-197.291-97.062-38.908-46.657-47.712-98.701-47.656-135.36 0.028-31.021 6.026-52.044 6.526-53.794 3.166-10.942 12.719-18.857 24.050-19.912 11.359-1.083 22.217 4.916 27.383 15.080l0.361 0.667c2.138 4.138 14.136 26.078 30.549 45.879 2.138 2.611 4.499 4.943 6.776 7.415 0.417-0.305 0.639-0.833 1.083-1.139l91.314-63.931-14.775-56.682c-1.472-5.554 0.667-11.47 5.332-14.802 4.693-3.333 10.942-3.444 15.747-0.305l49.545 32.687 90.258-63.209c0.444-0.305 1.028-0.361 1.5-0.667-6.415-12.331-14.469-24.384-21.551-33.798-4.666-6.249-8.887-11.414-11.886-14.941l-3.471-3.971-0.861-0.972-0.167-0.194c-7.721-8.276-9.637-20.496-4.832-30.743 4.832-10.248 15.469-16.552 26.744-15.913 2.638 0.305 49.406 2.86 98.618 34.132 24.495 15.663 49.462 38.936 67.93 72.262 18.468 33.298 30.16 76.206 30.105 129.722 0 25.828-2.86 54.349-8.693 85.537 151.19 270.636 160.104 428.047 160.049 459.762v0zM636.142 824.31c43.796 32.521 78.455 52.489 102.617 64.625-10.664-80.372-58.487-276.579-265.998-579.486l-84.176 58.932 141.275 200.401c4.416 6.249 2.916 14.913-3.36 19.329s-14.941 2.944-19.357-3.333l-141.303-200.457-84.454 59.126c143.025 199.874 266.776 315.432 354.757 380.862v0zM189.877 458.417c4.666 19.94 13.636 41.213 30.299 61.181 18.774 22.467 48.323 44.379 94.841 60.709-20.94-26.244-42.296-54.155-64.097-84.065-15.774-3.583-29.466-11.164-41.186-19.968-7.248-5.499-13.719-11.609-19.857-17.857v0zM339.123 321.391l3.027 11.692 7.137-4.999-10.164-6.693zM590.596 382.683c-0.028-45.657-9.665-78.4-23.162-102.783-13.691-24.661-31.826-41.297-50.184-52.85 1.722 3.527 3.61 6.887 5.166 10.609 6.304 15.274 11.136 31.938 11.192 50.017 0 3.749-0.278 7.582-0.778 11.442 20.634 30.688 40.075 60.543 57.599 89.12 0.028-1.833 0.167-3.777 0.167-5.554zM213.4 116.935l63.681 90.953c8.804 12.581 5.749 29.882-6.804 38.686-12.581 8.804-29.882 5.749-38.686-6.832l-63.681-90.953c-8.804-12.581-5.749-29.882 6.832-38.686 12.553-8.804 29.882-5.749 38.658 6.832zM326.848 161.703l-127.417-181.989c-8.804-12.553-5.749-29.882 6.832-38.686 12.553-8.804 29.855-5.749 38.658 6.832l127.417 181.989c8.804 12.553 5.749 29.855-6.832 38.658-12.553 8.804-29.882 5.749-38.658-6.804zM171.104 279.594c-12.553 8.804-29.882 5.749-38.658-6.804l-127.417-181.989c-8.804-12.553-5.749-29.882 6.832-38.686 12.553-8.776 29.855-5.749 38.658 6.832l127.417 181.961c8.804 12.581 5.749 29.882-6.832 38.686zM543.218 613.606c7.609-5.304 16.302-7.859 24.911-7.859 13.691 0 27.161 6.443 35.631 18.524 13.775 19.69 9.026 46.768-10.664 60.543-7.582 5.332-16.274 7.887-24.884 7.887-13.719 0-27.189-6.471-35.659-18.552-13.719-19.662-8.998-46.768 10.664-60.543z" />
65
+ <glyph unicode="&#x77;" glyph-name="bell" d="M512 864c-307.2 0-179.2-387.2-336-544 0 0 587.2 0 672 0-148.8 148.8-30.4 544-336 544zM864 272h-704c-35.2 0-64-28.8-64-64s28.8-64 64-64h240c0-62.4 49.6-112 112-112s112 49.6 112 112h240c35.2 0 64 28.8 64 64s-28.8 64-64 64z" />
66
+ <glyph unicode="&#x78;" glyph-name="trophy" d="M716.8 395.2c112 75.2 259.2 168 259.2 388.8 0 32-27.2 48-48 48h-160c-25.6 48-105.6 96-256 96s-230.4-48-256-96h-160c-20.8 0-48-16-48-48 0-220.8 134.4-310.4 248-385.6 92.8-60.8 152-102.4 152-176v-62.4c-81.6-8-160-54.4-160-96 0-51.2 100.8-96 224-96s224 44.8 224 96c0 41.6-81.6 86.4-160 96v64c0 75.2 48 110.4 140.8 171.2zM784 752h112c-12.8-128-86.4-195.2-176-256 28.8 62.4 60.8 144 64 256zM128 752h112c3.2-112 35.2-193.6 64-256-89.6 60.8-163.2 128-176 256zM320 768c0 20.8 51.2 80 192 80s192-59.2 192-80-51.2-80-192-80-192 59.2-192 80z" />
67
+ <glyph unicode="&#x79;" glyph-name="cross" d="M608 448l208 208c28.8 28.8 28.8 67.2 0 96s-67.2 28.8-96 0l-208-208-208 208c-28.8 28.8-67.2 28.8-96 0s-28.8-67.2 0-96l208-208-208-208c-28.8-28.8-28.8-67.2 0-96s67.2-28.8 96 0l208 208 208-208c28.8-28.8 67.2-28.8 96 0s28.8 67.2 0 96l-208 208z" />
68
+ <glyph unicode="&#x7a;" glyph-name="tick" d="M400 292.8l-256 256c-28.8 28.8-83.2 28.8-112 0s-28.8-83.2 0-112l304-304c14.4-14.4 32-32 64-32s49.6 17.6 64 32l528 528c28.8 28.8 28.8 83.2 0 112s-83.2 28.8-112 0l-480-480z" />
69
+ <glyph unicode="&#x7c;" glyph-name="caret_left" d="M572.8 180.8l-204.8 204.8c-14.4 14.4-32 32-32 62.4s17.6 49.6 32 62.4l204.8 204.8c27.2 27.2 67.2 27.2 94.4 0s27.2-67.2 0-94.4l-172.8-172.8 172.8-172.8c27.2-27.2 27.2-67.2 0-94.4s-67.2-27.2-94.4 0z" />
70
+ </font></defs></svg>
assets/shared-ui/font/WPMU-DEV-App-Icons.ttf ADDED
Binary file
assets/shared-ui/font/WPMU-DEV-App-Icons.woff ADDED
Binary file
assets/shared-ui/font/fontawesome-webfont.eot ADDED
Binary file
assets/shared-ui/font/fontawesome-webfont.svg ADDED
@@ -0,0 +1,255 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+ <svg xmlns="http://www.w3.org/2000/svg">
4
+ <metadata></metadata>
5
+ <defs>
6
+ <font id="FontAwesomeRegular" horiz-adv-x="1843" >
7
+ <font-face units-per-em="2048" ascent="1536" descent="-512" />
8
+ <missing-glyph horiz-adv-x="512" />
9
+ <glyph horiz-adv-x="0" />
10
+ <glyph horiz-adv-x="0" />
11
+ <glyph unicode="&#xd;" horiz-adv-x="512" />
12
+ <glyph unicode=" " horiz-adv-x="512" />
13
+ <glyph unicode="&#x09;" horiz-adv-x="512" />
14
+ <glyph unicode="&#xa0;" horiz-adv-x="512" />
15
+ <glyph unicode="o" horiz-adv-x="1591" />
16
+ <glyph unicode="&#xa8;" horiz-adv-x="2048" />
17
+ <glyph unicode="&#xa9;" horiz-adv-x="2048" />
18
+ <glyph unicode="&#xae;" horiz-adv-x="2048" />
19
+ <glyph unicode="&#xb4;" horiz-adv-x="2048" />
20
+ <glyph unicode="&#xc6;" horiz-adv-x="2048" />
21
+ <glyph unicode="&#xcd;" horiz-adv-x="2048" />
22
+ <glyph unicode="&#x2000;" horiz-adv-x="784" />
23
+ <glyph unicode="&#x2001;" horiz-adv-x="1569" />
24
+ <glyph unicode="&#x2002;" horiz-adv-x="784" />
25
+ <glyph unicode="&#x2003;" horiz-adv-x="1569" />
26
+ <glyph unicode="&#x2004;" horiz-adv-x="523" />
27
+ <glyph unicode="&#x2005;" horiz-adv-x="392" />
28
+ <glyph unicode="&#x2006;" horiz-adv-x="261" />
29
+ <glyph unicode="&#x2007;" horiz-adv-x="261" />
30
+ <glyph unicode="&#x2008;" horiz-adv-x="196" />
31
+ <glyph unicode="&#x2009;" horiz-adv-x="313" />
32
+ <glyph unicode="&#x200a;" horiz-adv-x="87" />
33
+ <glyph unicode="&#x202f;" horiz-adv-x="313" />
34
+ <glyph unicode="&#x203a;" horiz-adv-x="2048" />
35
+ <glyph unicode="&#x205f;" horiz-adv-x="392" />
36
+ <glyph unicode="&#x2122;" horiz-adv-x="2048" />
37
+ <glyph unicode="&#x221e;" horiz-adv-x="2048" />
38
+ <glyph unicode="&#xe000;" horiz-adv-x="1024" d="M0 0z" />
39
+ <glyph unicode="&#xf000;" horiz-adv-x="1536" d="M6 1489q20 47 70 47h1382q51 0 72 -47q20 -47 -17 -84l-610 -610v-641h248q33 0 55.5 -22.5t22.5 -53.5q0 -33 -22.5 -55.5t-55.5 -22.5h-768q-31 0 -53.5 22.5t-22.5 55.5q0 31 22.5 53.5t53.5 22.5h250v641l-610 610q-37 37 -17 84z" />
40
+ <glyph unicode="&#xf001;" horiz-adv-x="1488" d="M0 213q0 57 27.5 103t72.5 77t98.5 47.5t106.5 16.5q25 0 50.5 -4t50.5 -11v779q0 27 16 48t43 29q23 6 99.5 29t178 52.5t215 62.5t211 60.5t164 46t74.5 18.5q35 0 58.5 -23.5t23.5 -58.5v-1028q0 -59 -27.5 -104.5t-73 -76t-99.5 -47t-105 -16.5t-105.5 16.5t-98.5 47 t-71.5 75.5t-27.5 105q0 57 27.5 103t71.5 77t98.5 47t105.5 16q27 0 52.5 -4t49.5 -10v537l-678 -195v-815q0 -59 -27.5 -104.5t-71.5 -76t-98.5 -47t-105.5 -16.5q-53 0 -106.5 16.5t-98.5 47t-72.5 76t-27.5 104.5z" />
41
+ <glyph unicode="&#xf002;" horiz-adv-x="1597" d="M0 901q0 137 52 258t143.5 212t212 143.5t258.5 52.5q137 0 257.5 -52.5t212 -143.5t143.5 -212t52 -258q0 -98 -28.5 -191.5t-81.5 -174.5l358 -359q18 -18 18 -47q0 -16 -18 -43t-45 -53.5t-53.5 -45t-42.5 -18.5q-29 0 -47 19l-359 358q-82 -53 -175 -81.5t-191 -28.5 q-137 0 -258 52t-212.5 143t-143.5 212t-52 258zM266 901q0 -84 32 -156.5t86 -126t127 -85t155 -31.5t154.5 31.5t126.5 85t86 126t32 156.5q0 82 -32 154.5t-86 127t-126.5 86t-154.5 31.5t-155 -31.5t-127 -86t-86 -127t-32 -154.5zM414 901q0 51 19.5 97t54 81t80 54.5 t98.5 19.5q20 0 34.5 -14.5t14.5 -36.5q0 -20 -14.5 -34.5t-34.5 -14.5q-63 0 -107.5 -44t-44.5 -108q0 -20 -14.5 -34.5t-34.5 -14.5q-23 0 -37 14.5t-14 34.5z" />
42
+ <glyph unicode="&#xf003;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h1536v852q-31 -31 -58 -50q-106 -80 -212.5 -159.5t-211.5 -163.5q-61 -49 -131.5 -94t-156.5 -45q-82 0 -153 45t-132 94 q-104 84 -211 164t-213 159q-27 18 -57 50v-852zM154 1317q0 -31 14 -65.5t35.5 -66.5t47 -59.5t50.5 -46.5q100 -76 199.5 -150.5t199.5 -152.5q20 -16 48 -37.5t58 -42t59.5 -35t54.5 -14.5h2h2q25 0 54.5 14.5t59 35t57 42t48.5 37.5q100 78 199.5 153t199.5 150 q25 18 50.5 46t47 60t36 66.5t14.5 65.5v65h-1536v-65z" />
43
+ <glyph unicode="&#xf004;" horiz-adv-x="1802" d="M0 1073q0 113 34 205t97.5 155.5t153.5 98.5t202 35q59 0 117 -18.5t110 -48.5t99 -68.5t88 -77.5q39 39 87 77.5t100.5 68.5t109 48.5t115.5 18.5q113 0 204 -35t154.5 -98.5t97 -155.5t33.5 -205q0 -66 -18.5 -130t-51 -124.5t-74.5 -115t-87 -99.5l-615 -612 q-23 -23 -55 -23q-31 0 -57 23l-615 614q-45 45 -87 99.5t-73.5 114t-50 124t-18.5 129.5z" />
44
+ <glyph unicode="&#xf005;" horiz-adv-x="1675" d="M1 959.5q9 27.5 54 33.5l506 74l227 459q20 41 49 41t50 -41l227 -459l506 -74q45 -6 54 -33.5t-23 -60.5l-367 -356l86 -504q8 -45 -15.5 -62.5t-64.5 5.5l-452 237l-453 -237q-41 -23 -64.5 -5.5t-15.5 62.5l86 504l-364 356q-35 33 -26 60.5z" />
45
+ <glyph unicode="&#xf006;" horiz-adv-x="1675" d="M0 948q0 23 18.5 32t36.5 13l506 74l227 459q6 14 20 27.5t30 13.5q18 0 30.5 -13.5t18.5 -27.5l227 -459l506 -74q18 -4 36.5 -13t18.5 -32q0 -14 -7 -26.5t-17 -22.5l-367 -356l86 -504q0 -4 1 -9t1 -12q0 -20 -9 -34.5t-32 -14.5t-41 13l-452 237l-453 -237 q-18 -12 -39 -13q-23 0 -33 14.5t-10 34.5q0 6 1 11.5t1 9.5l86 504l-364 356q-10 10 -18.5 22.5t-8.5 26.5zM289 866l274 -268l-65 -377l340 178l340 -178l-66 377l274 268l-378 56l-170 344l-170 -344z" />
46
+ <glyph unicode="&#xf007;" horiz-adv-x="1566" d="M0 57v387q0 37 18.5 82t48 86t65.5 74t71 43q18 6 66 13.5t102.5 14.5t104.5 13t77 10q-92 59 -144.5 153.5t-52.5 205.5q0 88 34 165.5t91.5 136t135 92.5t165.5 34t166 -34t136.5 -92.5t92 -136t33.5 -165.5q0 -109 -52 -204.5t-144 -154.5q27 -4 77 -10t104 -13 t101 -14.5t68 -13.5q35 -10 70.5 -42t65.5 -74t48.5 -87t18.5 -82v-387q-10 -4 -22.5 -14t-27 -19.5t-27.5 -16.5t-22 -7h-1370q-35 0 -53 21.5t-45 35.5z" />
47
+ <glyph unicode="&#xf008;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM115 154q0 -16 11 -27.5t28 -11.5h153q16 0 27.5 11t11.5 28v153q0 16 -11 27.5t-28 11.5h-153q-16 0 -27.5 -11t-11.5 -28v-153zM115 512 q0 -16 11 -27.5t28 -11.5h153q16 0 27.5 11.5t11.5 27.5v154q0 16 -11 27.5t-28 11.5h-153q-16 0 -27.5 -11.5t-11.5 -27.5v-154zM115 870q0 -16 11 -27.5t28 -11.5h153q16 0 27.5 11.5t11.5 27.5v154q0 16 -11 27.5t-28 11.5h-153q-16 0 -27.5 -11.5t-11.5 -27.5v-154z M115 1229q0 -16 11 -27.5t28 -11.5h153q16 0 27.5 11t11.5 28v153q0 16 -11 27.5t-28 11.5h-153q-16 0 -27.5 -11t-11.5 -28v-153zM461 154q0 -16 11 -27.5t28 -11.5h843q16 0 27.5 11t11.5 28v512q0 16 -11 27.5t-28 11.5h-843q-16 0 -27.5 -11.5t-11.5 -27.5v-512z M461 870q0 -16 11 -27.5t28 -11.5h843q16 0 27.5 11.5t11.5 27.5v512q0 16 -11 27.5t-28 11.5h-843q-16 0 -27.5 -11t-11.5 -28v-512zM1497 154q0 -16 11.5 -27.5t27.5 -11.5h154q16 0 27.5 11t11.5 28v153q0 16 -11.5 27.5t-27.5 11.5h-154q-16 0 -27.5 -11t-11.5 -28v-153 zM1497 512q0 -16 11.5 -27.5t27.5 -11.5h154q16 0 27.5 11.5t11.5 27.5v154q0 16 -11.5 27.5t-27.5 11.5h-154q-16 0 -27.5 -11.5t-11.5 -27.5v-154zM1497 870q0 -16 11.5 -27.5t27.5 -11.5h154q16 0 27.5 11.5t11.5 27.5v154q0 16 -11.5 27.5t-27.5 11.5h-154 q-16 0 -27.5 -11.5t-11.5 -27.5v-154zM1497 1229q0 -16 11.5 -27.5t27.5 -11.5h154q16 0 27.5 11t11.5 28v153q0 16 -11.5 27.5t-27.5 11.5h-154q-16 0 -27.5 -11t-11.5 -28v-153z" />
48
+ <glyph unicode="&#xf009;" d="M0 78v536q0 33 22.5 55.5t55.5 22.5h690q33 0 55.5 -22.5t22.5 -55.5v-536q0 -33 -22.5 -55.5t-55.5 -22.5h-690q-33 0 -55.5 22.5t-22.5 55.5zM0 922v538q0 31 22.5 53.5t55.5 22.5h690q33 0 55.5 -22.5t22.5 -53.5v-538q0 -33 -22.5 -54.5t-55.5 -21.5h-690 q-33 0 -55.5 21.5t-22.5 54.5zM999 78v536q0 33 21.5 55.5t54.5 22.5h692q31 0 53.5 -22.5t22.5 -55.5v-536q0 -33 -22.5 -55.5t-53.5 -22.5h-692q-33 0 -54.5 22.5t-21.5 55.5zM999 922v538q0 31 21.5 53.5t54.5 22.5h692q31 0 53.5 -22.5t22.5 -53.5v-538 q0 -33 -22.5 -54.5t-53.5 -21.5h-692q-33 0 -54.5 21.5t-21.5 54.5z" />
49
+ <glyph unicode="&#xf00a;" d="M0 78v270q0 33 22.5 54.5t55.5 21.5h358q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5h-358q-33 0 -55.5 22.5t-22.5 55.5zM0 655v226q0 33 22.5 54t55.5 21h358q31 0 53.5 -21.5t22.5 -53.5v-226q0 -33 -22.5 -55t-53.5 -22h-358q-33 0 -55.5 22.5 t-22.5 54.5zM0 1188v272q0 31 22.5 53.5t55.5 22.5h358q31 0 53.5 -22.5t22.5 -53.5v-272q0 -33 -22.5 -55.5t-53.5 -22.5h-358q-33 0 -55.5 22.5t-22.5 55.5zM666 78v270q0 33 22.5 54.5t54.5 21.5h359q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5 h-359q-33 0 -55 22.5t-22 55.5zM666 655v226q0 33 22.5 54t54.5 21h359q31 0 53.5 -21.5t22.5 -53.5v-226q0 -33 -22.5 -55t-53.5 -22h-359q-33 0 -55 22.5t-22 54.5zM666 1188v272q0 31 22.5 53.5t54.5 22.5h359q31 0 53.5 -22.5t22.5 -53.5v-272q0 -33 -22.5 -55.5 t-53.5 -22.5h-359q-33 0 -55 22.5t-22 55.5zM1331 78v270q0 33 22.5 54.5t55.5 21.5h358q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5h-358q-33 0 -55.5 22.5t-22.5 55.5zM1331 655v226q0 33 22.5 54t55.5 21h358q31 0 53.5 -21.5t22.5 -53.5v-226 q0 -33 -22.5 -55t-53.5 -22h-358q-33 0 -55.5 22.5t-22.5 54.5zM1331 1188v272q0 31 22.5 53.5t55.5 22.5h358q31 0 53.5 -22.5t22.5 -53.5v-272q0 -33 -22.5 -55.5t-53.5 -22.5h-358q-33 0 -55.5 22.5t-22.5 55.5z" />
50
+ <glyph unicode="&#xf00b;" d="M0 78v270q0 33 22.5 54.5t55.5 21.5h297q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5h-297q-33 0 -55.5 22.5t-22.5 55.5zM0 655v226q0 33 22.5 54t55.5 21h297q31 0 53.5 -21.5t22.5 -53.5v-226q0 -33 -22.5 -55t-53.5 -22h-297q-33 0 -55.5 22.5 t-22.5 54.5zM0 1188v272q0 31 22.5 53.5t55.5 22.5h297q31 0 53.5 -22.5t22.5 -53.5v-272q0 -33 -22.5 -55.5t-53.5 -22.5h-297q-33 0 -55.5 22.5t-22.5 55.5zM604 78v270q0 33 22.5 54.5t55.5 21.5h1085q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5 h-1085q-33 0 -55.5 22.5t-22.5 55.5zM604 655v226q0 33 22.5 54t55.5 21h1085q31 0 53.5 -21.5t22.5 -53.5v-226q0 -33 -22.5 -55t-53.5 -22h-1085q-33 0 -55.5 22.5t-22.5 54.5zM604 1188v272q0 31 22.5 53.5t55.5 22.5h1085q31 0 53.5 -22.5t22.5 -53.5v-272 q0 -33 -22.5 -55.5t-53.5 -22.5h-1085q-33 0 -55.5 22.5t-22.5 55.5z" />
51
+ <glyph unicode="&#xf00c;" d="M0 732.5q0 33.5 23 55.5l174 175q23 23 56.5 22.5t55.5 -22.5l365 -365q23 -23 56.5 -23t55.5 23l746 745q23 23 56.5 23t56.5 -23l174 -174q23 -23 22.5 -56.5t-22.5 -55.5l-910 -910q-23 -23 -62.5 -39t-72.5 -16h-88q-35 0 -75 16.5t-62 38.5l-526 529 q-23 23 -23 56.5z" />
52
+ <glyph unicode="&#xf00d;" horiz-adv-x="1536" d="M0 192.5q0 38.5 29 67.5l508 510l-508 500q-29 29 -29 67.5t29 67.5l100 100q29 29 68 29t67 -29l504 -504l504 504q29 29 67.5 29t67.5 -29l100 -100q29 -29 29 -68t-29 -67l-508 -510l508 -500q29 -29 29 -66.5t-29 -66.5l-100 -102q-29 -29 -68 -29t-67 29l-504 505 l-506 -505q-29 -29 -66.5 -29t-66.5 29l-100 100q-29 29 -29 67.5z" />
53
+ <glyph unicode="&#xf00e;" horiz-adv-x="1597" d="M0 901q0 137 52 258t143.5 212t212 143.5t258.5 52.5q137 0 259 -52.5t212 -143.5t142 -212t52 -258q0 -102 -28.5 -195.5t-81.5 -170.5l358 -359q18 -18 18 -46t-18 -48l-94 -94q-20 -18 -48 -18.5t-46 18.5l-359 358q-78 -53 -171 -81.5t-195 -28.5q-137 0 -258 52 t-212.5 142t-143.5 211t-52 260zM266 901q0 -84 32 -156.5t86 -126t127 -85t155 -31.5t155.5 31.5t126.5 85t85 126t32 156.5q0 82 -32 154.5t-85 127t-126.5 86t-155.5 31.5t-155 -31.5t-127 -86t-86 -127t-32 -154.5zM399 868v66q0 33 33 33h168v168q0 33 33 32h65 q14 0 24.5 -9t10.5 -23v-168h166q33 0 33 -33v-66q0 -14 -9.5 -24t-23.5 -10h-166v-166q0 -14 -10 -23.5t-25 -9.5h-65q-33 0 -33 33v166h-168q-14 0 -23.5 10t-9.5 24z" />
54
+ <glyph unicode="&#xf010;" horiz-adv-x="1597" d="M0 901q0 137 52 258t143.5 212t212 143.5t258.5 52.5q137 0 259 -52.5t212 -143.5t142 -212t52 -258q0 -102 -28.5 -195.5t-81.5 -170.5l358 -359q18 -18 18 -46t-18 -48l-94 -94q-20 -18 -48 -18.5t-46 18.5l-359 358q-78 -53 -171 -81.5t-195 -28.5q-137 0 -258 52 t-212.5 142t-143.5 211t-52 260zM266 901q0 -84 32 -156.5t86 -126t127 -85t155 -31.5t155.5 31.5t126.5 85t85 126t32 156.5q0 82 -32 154.5t-85 127t-126.5 86t-155.5 31.5t-155 -31.5t-127 -86t-86 -127t-32 -154.5zM399 868v66q0 33 33 33h467q33 0 33 -33v-66 q0 -14 -9.5 -24t-23.5 -10h-467q-14 0 -23.5 10t-9.5 24z" />
55
+ <glyph unicode="&#xf011;" horiz-adv-x="1488" d="M0 713q0 186 86 349t240 267q12 10 28 6q18 -4 25 -16l90 -131q10 -12 6 -27.5t-16 -25.5q-106 -72 -164.5 -182.5t-58.5 -239.5q0 -104 39.5 -197.5t108.5 -162t162 -108.5t197 -40t197.5 40t163.5 108.5t109.5 161.5t39.5 198q0 129 -59 239.5t-164 182.5 q-14 10 -16 24q-4 16 6 29l88 131q10 12 25.5 15t29.5 -5q154 -104 240 -267t86 -349q0 -154 -58.5 -289t-160 -236.5t-237.5 -160t-290 -58.5t-289 58.5t-236 160t-159.5 236.5t-58.5 289zM627 793v704q0 16 11 27.5t28 11.5h157q16 0 27.5 -11.5t11.5 -27.5v-704 q0 -16 -11 -27.5t-28 -11.5h-157q-16 0 -27.5 11t-11.5 28z" />
56
+ <glyph unicode="&#xf012;" d="M0 39v260q0 16 11.5 27.5t27.5 11.5h192q16 0 26.5 -11.5t10.5 -27.5v-260q0 -16 -10 -27.5t-27 -11.5h-192q-39 0 -39 39zM393 39v434q0 16 11.5 27.5t27.5 11.5h193q16 0 26.5 -11.5t10.5 -27.5v-434q0 -16 -10.5 -27.5t-26.5 -11.5h-193q-16 0 -27.5 11.5t-11.5 27.5z M786 39v676q0 16 11.5 27.5t27.5 11.5h193q16 0 27.5 -11.5t11.5 -27.5v-676q0 -16 -11.5 -27.5t-27.5 -11.5h-193q-16 0 -27.5 11.5t-11.5 27.5zM1182 39v995q0 16 10 27.5t27 11.5h192q16 0 27.5 -11t11.5 -28v-995q0 -16 -11.5 -27.5t-27.5 -11.5h-192q-16 0 -26.5 11.5 t-10.5 27.5zM1575 39v1458q0 39 39 39h190q39 0 39 -39v-1458q0 -39 -39 -39h-190q-39 0 -39 39z" />
57
+ <glyph unicode="&#xf013;" horiz-adv-x="1593" d="M0 651v236q0 12 30.5 21.5t68.5 15.5t74 9t48 5q18 61 49 117q-55 82 -120 157l-7 15q0 8 28 38.5t62.5 65.5t66.5 62.5t40 27.5q2 0 26.5 -18.5t54.5 -41t56.5 -43t32.5 -24.5q29 16 58.5 26.5t60.5 20.5q0 12 3 49t9 75t15.5 69t21.5 31h237q14 0 19 -15 q12 -49 17 -103t14 -106q31 -8 59.5 -19t56.5 -28q8 6 34 26.5t55.5 43t53 40t29.5 17.5t37 -27.5t65 -62.5t61.5 -65.5t27.5 -38.5q0 -4 -17.5 -28.5t-39 -53.5t-42 -55.5t-24.5 -32.5q33 -55 51 -123q49 -10 103.5 -13t101.5 -20q16 -4 16 -18v-236q0 -12 -29.5 -21.5 t-68.5 -15.5t-76 -9t-49 -5q-14 -57 -47 -117q55 -82 121 -157l6 -15q0 -8 -27.5 -38.5t-62.5 -65.5t-66.5 -62.5t-40.5 -27.5q-2 0 -26.5 18.5t-54 41t-56 43t-33.5 24.5q-29 -16 -58.5 -27.5t-59.5 -19.5q-2 -12 -5.5 -49.5t-9.5 -76t-14 -69.5t-21 -31h-237q-14 0 -19 17 q-14 49 -19 103t-11 103q-61 18 -117 50q-41 -31 -81 -60.5t-79 -62.5l-12 -4q-6 0 -37 27.5t-64.5 62.5t-61 65.5t-27.5 38.5q0 2 16 26.5t37.5 53.5t42 55.5t26.5 34.5q-33 55 -51 123q-51 10 -104.5 13t-100.5 20q-16 4 -16 18zM557 768q0 -49 18.5 -93t51 -77t77 -52.5 t93.5 -19.5t93 19.5t75.5 52.5t51 77t19.5 93t-19.5 92t-51 76t-75.5 51.5t-93 18.5t-93.5 -18.5t-77 -51.5t-51 -76t-18.5 -92z" />
58
+ <glyph unicode="&#xf014;" horiz-adv-x="1304" d="M0 1175.5v34.5v36t2 36q25 14 71 23.5t98 15.5t102.5 9t78.5 5q-8 82 11.5 128t59.5 68.5t98.5 29t131.5 6.5q55 0 109.5 -3t97.5 -20.5t68.5 -54.5t25.5 -105v-24t-2 -25q29 -2 79 -5t102.5 -9t99.5 -15.5t72 -23.5v-72v-69q-37 -20 -123 -32.5t-185.5 -19t-193.5 -7.5 t-150 -1q-55 0 -150 1t-194.5 7.5t-184.5 18.5t-122 33q-2 16 -2 34.5zM133 154v837q123 -16 244 -21t244 -5h32q129 2 258 6t258 20v-837q0 -63 -44 -108.5t-107 -45.5h-731q-63 0 -108.5 45t-45.5 109zM303 199q0 -16 10.5 -26.5t26.5 -10.5h39q16 0 27.5 10t11.5 27v614 q0 16 -11.5 27.5t-27.5 11.5h-39q-16 0 -26.5 -11.5t-10.5 -27.5v-614zM504 1384q0 -10 1 -22t3 -23q144 2 291 0q0 12 2 23.5t0 21.5v15q-35 10 -74 11t-74 1q-37 0 -75.5 -1t-73.5 -11v-15zM596 199q0 -16 10 -26.5t27 -10.5h39q16 0 27.5 10t11.5 27v614q0 16 -11.5 27.5 t-27.5 11.5h-39q-16 0 -26.5 -11.5t-10.5 -27.5v-614zM887 199q0 -16 11 -26.5t28 -10.5h39q16 0 27.5 10t11.5 27v614q0 16 -11.5 27.5t-27.5 11.5h-39q-16 0 -27.5 -11.5t-11.5 -27.5v-614z" />
59
+ <glyph unicode="&#xf015;" horiz-adv-x="1880" d="M0 809.5q2 15.5 14 26.5l867 710q27 20 59 21q33 0 59 -21l240 -196v102q0 16 11.5 27.5t27.5 11.5h223q16 0 26.5 -11.5t10.5 -27.5v-348l328 -268q12 -10 14 -25.5t-8 -28.5l-45 -53q-10 -14 -29 -14h-65q-16 0 -25 8l-743 608q-25 20 -50 0l-743 -608q-8 -8 -25 -8 h-65q-18 0 -29 14l-45 53q-10 12 -8 27.5zM266 76v622l674 553l674 -553v-622q0 -33 -21.5 -54.5t-54.5 -21.5h-422v498h-352v-498h-422q-33 0 -54.5 21.5t-21.5 54.5z" />
60
+ <glyph unicode="&#xf016;" horiz-adv-x="1228" d="M0 78v1382q0 31 22.5 53.5t55.5 22.5h614q33 0 71 -16.5t60 -38.5l351 -351q23 -23 39 -60.5t16 -70.5v-921q0 -33 -22.5 -55.5t-53.5 -22.5h-1075q-33 0 -55.5 22.5t-22.5 55.5zM154 154h921v692h-459q-31 0 -53 22.5t-22 55.5v458h-387v-1228zM268 326v116h693v-116 h-693zM268 596v115h693v-115h-693zM694 999h381q0 4 -4 13.5t-6 11.5l-350 348q-2 4 -9.5 6t-11.5 4v-383z" />
61
+ <glyph unicode="&#xf017;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM635 608v465q0 33 23.5 56.5t56.5 23.5h80q35 0 57 -23.5t22 -56.5v-305h201q33 0 56.5 -23.5t23.5 -56.5v-80q0 -33 -23.5 -56.5t-56.5 -23.5h-360q-33 0 -56.5 23.5 t-23.5 56.5z" />
62
+ <glyph unicode="&#xf018;" d="M2 35l594 1466q6 14 21.5 24.5t31.5 10.5h195l-8 -170h172l-9 170h195q16 0 31.5 -10t21.5 -25l594 -1466q6 -14 -1 -24.5t-23 -10.5h-740l-26 512h-258l-27 -512h-739q-16 0 -23.5 10t-1.5 25zM807 797h229l-20 413h-189z" />
63
+ <glyph unicode="&#xf019;" d="M0 39v614q0 16 11.5 27.5t27.5 11.5h229q16 0 27.5 -11t11.5 -28v-346h1229v346q0 16 11.5 27.5t27.5 11.5h229q16 0 27.5 -11t11.5 -28v-614q0 -39 -39 -39h-1765q-39 0 -39 39zM345.5 944.5q6.5 16.5 39.5 16.5h307v499q0 31 21.5 53.5t54.5 22.5h307q33 0 55.5 -22.5 t22.5 -53.5v-499h307q31 0 37 -16.5t-16 -39.5l-504 -506q-23 -23 -55.5 -22.5t-55.5 22.5l-504 506q-23 23 -16.5 39.5z" />
64
+ <glyph unicode="&#xf01a;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM414 743q10 25 37 25h208v358q0 16 11.5 28.5t27.5 12.5h201q16 0 27.5 -12t11.5 -29v-358h209q27 0 37 -25t-10 -43l-347 -346q-14 -10 -28 -10t-29 10l-346 346 q-20 18 -10 43z" />
65
+ <glyph unicode="&#xf01b;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177 120t-218 44t-218.5 -44t-177 -120t-119.5 -177t-44 -218zM414 793q-10 25 10 43l346 346q14 10 29 10q14 0 28 -10l347 -346q20 -18 10 -43t-37 -25h-209v-360q0 -16 -11.5 -27.5t-27.5 -11.5h-201q-16 0 -27.5 11t-11.5 28v360h-208 q-27 0 -37 25z" />
66
+ <glyph unicode="&#xf01c;" d="M0 78v577q0 33 9 76t22 72l284 663q12 29 44 49.5t63 20.5h999q31 0 63 -20.5t44 -49.5l284 -663q12 -29 21.5 -72t9.5 -76v-577q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM238 694h387l114 -231h383l117 231h367q-2 4 -2 9.5t-2 9.5l-256 594 h-848l-256 -596q-2 -2 -2 -7.5t-2 -9.5z" />
67
+ <glyph unicode="&#xf01d;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM582 453v628q0 18 16 29q20 8 31 0l545 -315q16 -6 16 -27q0 -20 -16 -27l-545 -315q-8 -4 -15 -4q-8 0 -16 4q-16 10 -16 27z" />
68
+ <glyph unicode="&#xf01e;" horiz-adv-x="1591" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5q141 0 271 -48.5t239 -140.5l161 162q35 35 58.5 24.5t23.5 -57.5v-463q0 -33 -22 -55q-10 -10 -23.5 -16t-29.5 -6h-463q-47 0 -58.5 23.5t23.5 58.5l160 159q-72 57 -159 88t-181 31q-117 0 -218.5 -44t-177 -120 t-119.5 -177t-44 -218t44 -218t119.5 -177t177 -120t218.5 -44q104 0 198.5 37t169 101.5t123.5 153.5t64 191q0 16 14 27q14 10 31 8l157 -20q16 -4 26.5 -16.5t8.5 -28.5q-20 -147 -89.5 -274.5t-176 -220.5t-242 -145.5t-284.5 -52.5q-166 0 -311.5 62.5t-254 171 t-171 254t-62.5 311.5z" />
69
+ <glyph unicode="&#xf021;" horiz-adv-x="1916" d="M6 311l150 437q10 33 39 45t59 4l438 -150q45 -16 46 -40.5t-42 -47.5l-202 -100q53 -78 123.5 -134.5t160.5 -86.5q111 -37 221.5 -28t207 56t170 129t110.5 193q6 16 20.5 22t30.5 2l152 -51q16 -6 23 -20.5t1 -30.5q-53 -158 -159.5 -274.5t-243.5 -184t-296 -81 t-315 39.5q-135 47 -241.5 134t-179.5 208l-205 -100q-43 -23 -63.5 -5.5t-4.5 64.5zM203 1024q53 156 159.5 273.5t243.5 185t295 81t316 -39.5q133 -47 240.5 -134t180.5 -208l205 100q43 23 63.5 5.5t4.5 -62.5l-150 -439q-10 -33 -39 -45t-59 -4l-438 150 q-45 16 -46 40.5t40 47.5l202 100q-51 78 -122.5 134.5t-159.5 86.5q-111 37 -221.5 28t-207 -56t-170 -129t-110.5 -193q-6 -16 -20.5 -22t-30.5 -2l-152 51q-16 6 -23 20.5t-1 30.5z" />
70
+ <glyph unicode="&#xf022;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h1536v1075h-1536v-1075zM307 346v76q0 39 39 39h154q16 0 27.5 -11.5t11.5 -27.5v-76q0 -16 -11.5 -27.5t-27.5 -11.5h-154q-39 0 -39 39 zM307 653v76q0 39 39 39h154q16 0 27.5 -11.5t11.5 -27.5v-76q0 -16 -11.5 -27.5t-27.5 -11.5h-154q-39 0 -39 39zM307 961v75q0 39 39 39h154q16 0 27.5 -11t11.5 -28v-75q0 -16 -11.5 -27.5t-27.5 -11.5h-154q-39 0 -39 39zM692 346v76q0 16 10.5 27.5t26.5 11.5h768 q39 0 39 -39v-76q0 -39 -39 -39h-768q-16 0 -26.5 11.5t-10.5 27.5zM692 653v76q0 16 10.5 27.5t26.5 11.5h768q39 0 39 -39v-76q0 -39 -39 -39h-768q-16 0 -26.5 11.5t-10.5 27.5zM692 961v75q0 16 10.5 27.5t26.5 11.5h768q39 0 39 -39v-75q0 -39 -39 -39h-768 q-16 0 -26.5 11t-10.5 28z" />
71
+ <glyph unicode="&#xf023;" horiz-adv-x="1253" d="M0 117v626q0 39 21.5 69t56.5 42v164q0 113 43 213t117.5 175t175 118t213.5 43t213 -43t175 -118t118 -175.5t43 -212.5v-164q35 -12 56 -42t21 -69v-626q0 -47 -34.5 -82t-81.5 -35h-1020q-47 0 -82 35t-35 82zM313 862h627v156q0 66 -24.5 123t-67.5 99t-100.5 66.5 t-120.5 24.5q-66 0 -122 -24.5t-99.5 -66.5t-68 -99.5t-24.5 -122.5v-156zM494 164h266l-66 285q29 18 47.5 48.5t18.5 65.5q0 55 -39 95t-94 40t-94 -40t-39 -95q0 -35 18 -65.5t47 -46.5z" />
72
+ <glyph unicode="&#xf024;" d="M0 1382q0 63 45 108.5t109 45.5q63 0 108 -45.5t45 -108.5q0 -41 -20.5 -74.5t-55.5 -56.5v-1212q0 -16 -11 -27.5t-27 -11.5h-78q-16 0 -26.5 11.5t-10.5 27.5v1212q-35 23 -56.5 56.5t-21.5 74.5zM307 416v745q0 33 19.5 66t48.5 49q104 55 188 86t144 45q70 16 124 18 q68 0 124.5 -11t107.5 -29.5t99 -43t100 -51.5q63 -29 145 -33q70 -4 164 15.5t207 87.5q29 16 47 6t18 -43v-748q0 -31 -18.5 -64.5t-46.5 -49.5q-113 -68 -207 -87.5t-164 -15.5q-82 4 -145 33q-51 27 -99.5 51.5t-99.5 43t-107.5 29.5t-124.5 11q-55 -2 -124 -18 q-59 -14 -143.5 -45t-188.5 -88q-29 -16 -48.5 -4t-19.5 45z" />
73
+ <glyph unicode="&#xf025;" horiz-adv-x="1916" d="M0 729q0 172 85 324.5t221 266.5t307 180.5t345 66.5t345.5 -66.5t307.5 -180.5t221 -266.5t85 -326.5q0 -182 -78 -350l-27 -60l-174 -26q-27 -104 -110.5 -173t-196.5 -69v-41q0 -16 -12 -27.5t-29 -11.5h-80q-16 0 -27.5 11.5t-11.5 27.5v719q0 16 11.5 28.5 t27.5 12.5h80q16 0 28.5 -12.5t12.5 -28.5v-39q88 0 161 -44t114 -116l39 7q33 90 32 192q0 125 -65.5 233.5t-170 190.5t-232.5 129t-251 47t-250.5 -47t-232 -128t-170 -190.5t-65.5 -232.5q0 -104 32 -194l39 -7q41 72 114 116t161 44v39q0 16 12 28.5t29 12.5h80 q16 0 27 -12.5t11 -28.5v-719q0 -16 -11 -27.5t-27 -11.5h-80q-16 0 -28.5 11.5t-12.5 27.5v41q-55 0 -106.5 18.5t-91.5 50.5t-68.5 76t-40.5 97l-175 26l-26 60q-78 168 -78 352z" />
74
+ <glyph unicode="&#xf026;" horiz-adv-x="905" d="M0 578v380q0 16 11.5 27.5t27.5 11.5h420l325 326q49 51 84 37t35 -86v-1012q0 -72 -34.5 -86t-84.5 37l-325 326h-420q-16 0 -27.5 11t-11.5 28z" />
75
+ <glyph unicode="&#xf027;" horiz-adv-x="1277" d="M0 578v380q0 16 11.5 27.5t27.5 11.5h420l325 326q49 51 84 37t35 -86v-1012q0 -72 -34.5 -86t-84.5 37l-325 326h-420q-16 0 -27.5 11t-11.5 28zM1027 406q-9 32 7 61q84 145 84 301t-84 301q-16 29 -7 61t38 48t60.5 8t48.5 -37q104 -182 104 -381q0 -201 -104 -381 q-23 -41 -70 -41q-20 0 -39 12q-29 16 -38 48z" />
76
+ <glyph unicode="&#xf028;" horiz-adv-x="1916" d="M0 578v380q0 16 11.5 27.5t27.5 11.5h420l325 326q49 51 84 37t35 -86v-1012q0 -72 -34.5 -86t-84.5 37l-325 326h-420q-16 0 -27.5 11t-11.5 28zM1027 406q-9 32 7 61q84 145 84 301t-84 301q-16 29 -7 61t38 48t60.5 8t48.5 -37q104 -182 104 -381q0 -201 -104 -381 q-23 -41 -70 -41q-20 0 -39 12q-29 16 -38 48zM1285 219q-7 33 11 62q141 225 142 487q0 262 -142 487q-18 29 -11 62t36 49q29 18 61 11t50 -36q82 -131 123.5 -275t41.5 -298q0 -309 -167 -573q-10 -18 -29 -27.5t-37 -9.5q-25 0 -43 12q-29 16 -36 49zM1540 33 q-6 33 12 59q100 154 152.5 325t52.5 351t-52 351t-153 323q-18 29 -12 61.5t35 50.5q29 16 61 10.5t50 -32.5q115 -174 173 -366.5t58 -397.5t-58.5 -397.5t-172.5 -364.5q-10 -18 -29 -27.5t-37 -9.5q-25 0 -45 13q-29 18 -35 51z" />
77
+ <glyph unicode="&#xf029;" horiz-adv-x="1536" d="M0 0v698h698v-698h-698zM0 838v698h698v-698h-698zM139 139h420v420h-420v-420zM139 977h420v420h-420v-420zM279 279v141h141v-141h-141zM279 1116v139h141v-139h-141zM838 0v698h417v-139h142v139h139v-419h-420v139h-139v-418h-139zM838 838v698h698v-698h-698z M977 977h420v420h-420v-420zM1116 0v139h139v-139h-139zM1116 1116v139h139v-139h-139zM1397 0v139h139v-139h-139z" />
78
+ <glyph unicode="&#xf02a;" d="M0 0v1536h154v-1536h-154zM227 0v1536h37v-1536h-37zM356 0v1536h117v-1536h-117zM545 0v1536h78v-1536h-78zM715 0v1536h76v-1536h-76zM903 0v1536h37v-1536h-37zM1014 0v1536h153v-1536h-153zM1221 0v1536h77v-1536h-77zM1409 0v1536h39v-1536h-39zM1579 0v1536h37 v-1536h-37zM1690 0v1536h153v-1536h-153z" />
79
+ <glyph unicode="&#xf02b;" horiz-adv-x="1488" d="M0 961v454q0 49 35 85t86 36h454q51 0 113 -24.5t94 -61.5l672 -748q33 -39 34 -88t-34 -84l-526 -526q-35 -35 -86 -36t-86 36l-670 750q-35 37 -60.5 96t-25.5 111zM197 1223q0 -49 33.5 -83t82.5 -34t83 34t34 83t-34 82.5t-83 33.5t-82.5 -33.5t-33.5 -82.5z" />
80
+ <glyph unicode="&#xf02c;" horiz-adv-x="1875" d="M0 961v454q0 49 35 85t86 36h454q25 0 53.5 -6t57.5 -18.5t54.5 -28t41.5 -33.5l670 -748q33 -37 34 -86t-34 -84l-526 -524q-35 -35 -86.5 -37t-83.5 37l-670 746q-35 39 -60.5 98t-25.5 109zM195 1223q0 -47 34.5 -82t83.5 -35q47 0 82 35t35 82q0 49 -35 83.5 t-82 34.5q-49 0 -83.5 -34.5t-34.5 -83.5zM791 1534h174q51 0 112.5 -24.5t93.5 -61.5l670 -748q35 -37 35 -87t-35 -85l-524 -524q-35 -35 -86 -36t-86 36l-12 14l514 514q35 35 34.5 84.5t-34.5 85.5l-670 748q-31 35 -84 56.5t-102 27.5z" />
81
+ <glyph unicode="&#xf02d;" horiz-adv-x="1710" d="M10 311q2 16 4 31.5t4 34.5q0 10 -4 20.5t-2 20.5q2 16 15.5 31.5t25.5 35.5q23 37 45.5 90.5t32.5 92.5q4 16 -1 30.5t-1 26.5q4 16 16.5 27.5t20.5 23.5q10 18 21.5 42t21.5 49.5t16 50t8 40.5t-2 33t0 29q6 16 20.5 26.5t24.5 24.5q10 12 21.5 34.5t23 49.5t19.5 52.5 t10 45.5q2 12 -4 24.5t-2 27.5q4 14 18.5 29.5t26.5 31.5q16 25 28.5 58.5t30 61t46 43t77.5 1.5l-2 -4q31 10 54 10h780q78 0 119 -57q41 -53 18 -129l-283 -906q-18 -63 -77.5 -107t-126.5 -44h-893q-10 0 -20.5 -2t-18.5 -12q-12 -20 0 -56q16 -43 60 -75.5t87 -32.5h946 q29 0 57.5 21.5t37.5 47.5l309 987q4 16 5 29.5t-1 28.5q41 -14 61 -43q41 -53 19 -129l-283 -905q-18 -66 -77.5 -109t-127.5 -43h-946q-41 0 -79.5 14.5t-73.5 39t-61.5 58t-41.5 72.5q-25 68 -2 127zM500 961q-10 -39 26 -39h615q16 0 30.5 11t18.5 28l24 75 q4 16 -3 27.5t-23 11.5h-615q-16 0 -31.5 -11t-19.5 -28zM569 1190q-4 -16 3.5 -26.5t23.5 -10.5h614q16 0 30.5 10.5t21.5 26.5l22 78q4 16 -3 27.5t-24 11.5h-614q-16 0 -30.5 -11.5t-20.5 -27.5z" />
82
+ <glyph unicode="&#xf02e;" horiz-adv-x="1253" d="M0 84v1337q0 47 34 81t81 34h1024q47 0 80.5 -34t33.5 -81v-1337q0 -47 -33.5 -81t-80.5 -34t-80 33l-432 432l-432 -432q-33 -33 -80 -33t-81 34t-34 81z" />
83
+ <glyph unicode="&#xf02f;" d="M0 39v346q0 47 18.5 89t50 73t73.5 49t89 18h1383q47 0 89 -18t72.5 -49t49 -73t18.5 -89v-346q0 -39 -39 -39h-1765q-39 0 -39 39zM268 193q0 -16 11.5 -26.5t27.5 -10.5h1229q16 0 27.5 10t11.5 27v38q0 16 -11.5 27.5t-27.5 11.5h-1229q-16 0 -27.5 -11t-11.5 -28v-38 zM307 729v731q0 31 22.5 53.5t55.5 22.5h651v-383q0 -49 34 -83t81 -34h385v-307h-1229zM1151 1153v383l385 -383h-385z" />
84
+ <glyph unicode="&#xf030;" d="M0 115v1075q0 47 34 82t81 35h366l58 125q18 43 66 73.5t95 30.5h443q47 0 95 -30.5t67 -73.5l57 -125h367q47 0 80.5 -35t33.5 -82v-1075q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM442 653q0 -100 38 -187t102.5 -152.5t153 -103.5t186.5 -38t186 38 t152.5 103.5t102.5 152.5t38 187q0 98 -38 186.5t-102.5 153t-152.5 102.5t-186 38t-186.5 -38t-153 -102.5t-102.5 -152.5t-38 -187zM596 653q0 68 25.5 127.5t69.5 103.5t103.5 69.5t127.5 25.5t127 -25.5t103 -69.5t69.5 -103.5t25.5 -127.5t-25.5 -127t-69.5 -104 t-103.5 -70.5t-126.5 -25.5q-68 0 -127.5 25.5t-103.5 70.5t-69.5 104.5t-25.5 126.5z" />
85
+ <glyph unicode="&#xf031;" horiz-adv-x="1644" d="M0 0l2 80q10 4 29.5 8t48.5 8q92 18 108 33q16 10 50 68l233 614l277 725h73h53l11 -20l202 -482q33 -78 64 -151.5t59 -145.5q29 -72 52.5 -130t42.5 -103q12 -29 28.5 -70t36.5 -94q23 -66 64 -150q25 -49 34 -57q20 -18 68 -24q25 -2 49.5 -9.5t52.5 -17.5 q6 -37 7 -55v-10.5t-3 -16.5q-43 0 -90 2t-98 6q-53 4 -99 6t-87 2h-80t-53 -2l-199 -10l-57 -2q0 20 1 39.5t3 38.5l129 26q57 14 67 25q12 8 13 27q0 14 -7 30l-47 115l-90 227l-446 2q-12 -29 -37 -96t-66 -178q-23 -63 -22 -84q0 -27 16 -43q14 -10 40 -17.5t63 -13.5 q14 -4 84 -12v-59q0 -16 -2 -27q-35 0 -121 5t-224 16l-49 -9q-43 -8 -83 -11t-81 -3h-20zM549 655q135 -2 216 -4t105 0l29 2q-18 51 -40.5 111.5t-51.5 130.5t-51.5 122t-38.5 87z" />
86
+ <glyph unicode="&#xf032;" horiz-adv-x="1419" d="M0 0l2 94q27 6 68 12q39 6 69.5 13.5t55.5 17.5q8 14 13 26.5t7 24.5q6 33 8 81t2 112l-2 498q-2 39 -3 139t-5 266q-4 88 -12 109q-4 8 -13 10q-20 14 -69 16q-23 0 -115 13l-4 84l262 6l383 12h45q8 2 15.5 2h13.5t21.5 -1t39.5 -1h76q92 0 193 -27q18 -4 42.5 -13 t53.5 -26q63 -31 104 -75q45 -47 66 -105q10 -29 15 -58.5t5 -62.5q0 -72 -32 -129q-31 -57 -95 -104q-16 -12 -54 -30.5t-97 -47.5q178 -41 268 -145q92 -104 92 -236q0 -72 -28 -162q-23 -66 -72 -116q-66 -72 -141 -109q-78 -35 -205 -59q-70 -12 -199 -11l-199 5 q-63 2 -138 -2.5t-163 -10.5q-25 -2 -93 -4t-181 -6zM537 1419q0 -12 1 -31.5t3 -44.5q2 -51 4 -119.5t0 -158.5v-98v-78q25 -4 52.5 -6t57.5 -2q176 0 267 65q90 66 90 225q0 113 -86 187q-84 76 -258 76q-53 0 -131 -15zM545 457l4 -271q0 -16 10 -43q74 -33 141 -32 q131 0 220 41q82 39 122 112q18 37 28.5 82t10.5 100q0 113 -43 181q-59 94 -141 125q-80 33 -250 32q-37 0 -61.5 -3t-40.5 -7v-143v-174z" />
87
+ <glyph unicode="&#xf033;" horiz-adv-x="1054" d="M0 0l18 84q12 4 32 9t46 11q41 10 71 19.5t50 19.5q29 39 41 103l29 137l57 268l12 64q23 119 41.5 178t18.5 63l30 156l17 64l22 135l9 49v39q-45 23 -148 28q-14 0 -23.5 1.5t-17.5 1.5l21 104l325 -14q31 -2 49.5 -2h26.5q35 0 89 2t132 6q41 4 68.5 6t38.5 2 q-2 -10 -3 -19.5t-3 -19.5q-4 -10 -7.5 -22.5t-7.5 -28.5q-49 -16 -110 -31q-66 -16 -105 -31q-12 -33 -24 -88q-6 -25 -9.5 -45t-5.5 -37q-23 -100 -40 -175.5t-27 -129.5l-64 -311l-39 -158l-43 -235l-14 -45v-10.5t2 -16.5q35 -8 64.5 -13t58.5 -9q4 0 21.5 -2.5 l45.5 -6.5q-2 -18 -3 -32.5t-3 -26.5q-2 -6 -4 -16.5t-6 -22.5q-8 0 -14 -1t-10 -1q-18 -2 -28.5 -2h-14.5h-11.5t-17.5 4q-8 0 -45 4t-105 12l-202 2q-61 0 -181 -12q-39 -4 -63.5 -6t-36.5 -2z" />
88
+ <glyph unicode="&#xf034;" d="M0 1151q14 37 34.5 110.5t45.5 184.5q8 33 13 54.5t9 31.5h58q4 -6 6 -10t4 -9q29 -57 41 -71q16 -4 129 -4q35 0 66.5 1t60.5 1l20 2l113 2l213 -2h289l55 10q10 8 27 53q2 6 4 12.5t6 16.5l43 2h10.5t16.5 -2q2 -39 1 -97.5t1 -138.5v-100v-57q0 -14 -1 -27.5t-3 -23.5 q-20 -8 -37 -11.5t-31 -7.5q-27 51 -53 129q-29 82 -37 92q-12 14 -27 21q-10 4 -60 4h-138h-31t-35 -4q-6 -43 -6 -72l2 -151v-334l2 -359v-147q0 -72 10 -117q8 -4 21.5 -8t34.5 -8q4 0 21 -4t50 -13q27 -10 49 -18q4 -20 4 -33.5v-17.5v-11.5t-2 -17.5h-34q-47 0 -88 2 t-76 6t-95.5 6t-148.5 2q-16 0 -57 -4t-109 -10q-29 -2 -45 -3t-24 -1q0 10 -1.5 16.5t-1.5 10.5l-2 24v10q18 31 80 50q94 27 135 49q4 10 6.5 25.5t4.5 31.5q4 68 6 176.5t0 255.5l-4 428q-2 90 -2 142.5t-4 72.5q0 8 -7 15q-4 6 -12 6q-16 4 -63 4h-127q-90 0 -119 -21 q-41 -29 -121 -153q-23 -35 -35 -35q-23 12 -36 23.5t-19 19.5zM1383 1305.5q-5 13.5 14 33.5l184 185q14 12 33 12q14 0 31 -12l184 -185q18 -20 13 -33.5t-34 -13.5h-118v-1048h118q29 0 34 -13.5t-13 -31.5l-184 -187q-16 -12 -33 -12q-16 0 -31 12l-184 187 q-18 18 -13 31.5t31 13.5h121v1048h-121q-27 0 -32 13.5z" />
89
+ <glyph unicode="&#xf035;" horiz-adv-x="1536" d="M0 233q0 18 12 31l187 185q18 20 31.5 14t13.5 -33v-121h1048v121q0 27 13.5 33t33.5 -14l185 -185q12 -12 12 -31q0 -18 -12 -30l-185 -187q-20 -18 -33.5 -13t-13.5 34v119h-1048v-119q0 -29 -13.5 -34t-31.5 13l-187 187q-12 12 -12 30zM0 1233q14 29 33.5 87 t44.5 146q6 27 11 43.5t9 26.5h56q8 -12 10 -14q27 -47 37 -58q2 0 35.5 -1t77.5 -1h90.5h74.5h123l19 2h108h203h416l53 6q12 10 24 46l4.5 9l6.5 13h39h28v-188v-80v-45q0 -12 -1 -21.5t-3 -19.5q-33 -10 -63 -15q-25 37 -52 103q-27 59 -34 74q-12 10 -27 14q-6 2 -42 3 t-85 1h-103.5h-97.5h-28.5t-34.5 -2q-2 -18 -3 -32.5t-1 -24.5l4 -445l-2 -119q0 -61 12 -92q12 -6 53 -12q4 0 20.5 -4t45.5 -10q14 -4 26.5 -7.5t22.5 -7.5q2 -16 3 -25.5t1 -13.5t-1 -10t-1 -14h-33q-94 0 -157 6q-66 6 -236 6q-14 0 -53 -3t-105 -7q-27 -2 -43 -3 t-24 -1q0 16 -2 20v21v8q20 27 73 39q90 20 132 41q4 8 6 19t4 26q0 18 1 70.5t1 120t-1 142t-2 139t-2 107.5t-1 47q0 8 -6 13q-2 2 -13 6q-14 2 -59 2h-123q-20 0 -62 -1t-85 -2t-78 -4t-41 -7q-41 -25 -117 -123q-20 -29 -33 -29q-23 10 -35 19.5t-18 15.5z" />
90
+ <glyph unicode="&#xf036;" d="M0 78v115q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM0 500v114q0 33 22.5 55.5t55.5 22.5h1075q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1075 q-33 0 -55.5 22.5t-22.5 55.5zM0 922v114q0 33 22.5 55.5t55.5 22.5h1536q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1536q-33 0 -55.5 21.5t-22.5 54.5zM0 1343v117q0 31 22.5 53.5t55.5 22.5h921q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53 t-53.5 -22h-921q-33 0 -55.5 22.5t-22.5 52.5z" />
91
+ <glyph unicode="&#xf037;" d="M0 78v115q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM78 922v114q0 33 21.5 55.5t54.5 22.5h1536q33 0 55 -22.5t22 -55.5v-114q0 -33 -22.5 -54.5t-54.5 -21.5h-1536 q-33 0 -54.5 21.5t-21.5 54.5zM307 500v114q0 33 22.5 55.5t55.5 22.5h1075q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1075q-33 0 -55.5 22.5t-22.5 55.5zM385 1343v117q0 31 21.5 53.5t54.5 22.5h921q33 0 55.5 -22.5t22.5 -53.5v-117 q0 -31 -22.5 -53t-55.5 -22h-921q-33 0 -54.5 22.5t-21.5 52.5z" />
92
+ <glyph unicode="&#xf038;" d="M0 78v115q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM154 922v114q0 33 22.5 55.5t54.5 22.5h1536q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1536 q-33 0 -55 21.5t-22 54.5zM614 500v114q0 33 22.5 55.5t55.5 22.5h1075q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1075q-33 0 -55.5 22.5t-22.5 55.5zM768 1343v117q0 31 22.5 53.5t55.5 22.5h921q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53 t-53.5 -22h-921q-33 0 -55.5 22.5t-22.5 52.5z" />
93
+ <glyph unicode="&#xf039;" d="M0 78v115q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM0 500v114q0 33 22.5 55.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1689 q-33 0 -55.5 22.5t-22.5 55.5zM0 922v114q0 33 22.5 55.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1689q-33 0 -55.5 21.5t-22.5 54.5zM0 1343v117q0 31 22.5 53.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -53.5v-117 q0 -31 -22.5 -53t-53.5 -22h-1689q-33 0 -55.5 22.5t-22.5 52.5z" />
94
+ <glyph unicode="&#xf03a;" d="M0 78v115q0 31 22.5 53t55.5 22h153q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-153q-33 0 -55.5 22.5t-22.5 55.5zM0 500v114q0 33 22.5 55.5t55.5 22.5h153q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-153 q-33 0 -55.5 22.5t-22.5 55.5zM0 922v114q0 33 22.5 55.5t55.5 22.5h153q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-153q-33 0 -55.5 21.5t-22.5 54.5zM0 1343v117q0 31 22.5 53.5t55.5 22.5h153q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53 t-53.5 -22h-153q-33 0 -55.5 22.5t-22.5 52.5zM461 78v115q0 31 22.5 53t55.5 22h1228q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1228q-33 0 -55.5 22.5t-22.5 55.5zM461 500v114q0 33 22.5 55.5t55.5 22.5h1228q31 0 53.5 -22.5t22.5 -55.5v-114 q0 -33 -22.5 -55.5t-53.5 -22.5h-1228q-33 0 -55.5 22.5t-22.5 55.5zM461 922v114q0 33 22.5 55.5t55.5 22.5h1228q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1228q-33 0 -55.5 21.5t-22.5 54.5zM461 1343v117q0 31 22.5 53.5t55.5 22.5h1228 q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53t-53.5 -22h-1228q-33 0 -55.5 22.5t-22.5 52.5z" />
95
+ <glyph unicode="&#xf03b;" d="M0 756v75q0 39 39 39h213v154q0 31 16.5 37t38.5 -17l215 -215q16 -16 17 -36q0 -18 -17 -35l-215 -215q-23 -23 -39 -17t-16 39v152h-213q-39 0 -39 39zM614 39v1458q0 39 39 39h76q39 0 39 -39v-1458q0 -39 -39 -39h-76q-39 0 -39 39zM922 78v115q0 31 22.5 53t54.5 22 h768q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-768q-33 0 -55 22.5t-22 55.5zM922 500v114q0 33 22.5 55.5t54.5 22.5h615q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-615q-33 0 -55 22.5t-22 55.5zM922 922v114 q0 33 22.5 55.5t54.5 22.5h691q33 0 55 -22.5t22 -55.5v-114q0 -33 -22.5 -54.5t-54.5 -21.5h-691q-33 0 -55 21.5t-22 54.5zM922 1343v117q0 31 22.5 53.5t54.5 22.5h537q33 0 55.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53t-55.5 -22h-537q-33 0 -55 22.5t-22 52.5z" />
96
+ <glyph unicode="&#xf03c;" d="M0 78v115q0 31 22.5 53t53.5 22h768q33 0 55.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-55.5 -22.5h-768q-31 0 -53.5 22.5t-22.5 55.5zM0 500v114q0 33 22.5 55.5t53.5 22.5h614q33 0 55.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-55.5 -22.5h-614 q-31 0 -53.5 22.5t-22.5 55.5zM0 922v114q0 33 22.5 55.5t53.5 22.5h692q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-692q-31 0 -53.5 21.5t-22.5 54.5zM0 1343v117q0 31 22.5 53.5t53.5 22.5h538q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53 t-53.5 -22h-538q-31 0 -53.5 22.5t-22.5 52.5zM1075 39v1458q0 39 39 39h76q16 0 27.5 -11.5t11.5 -27.5v-1458q0 -16 -11.5 -27.5t-27.5 -11.5h-76q-39 0 -39 39zM1305 743q0 16 14 35l217 215q23 23 38 17t15 -39v-152h215q16 0 27.5 -11t11.5 -28v-75q0 -16 -11 -27.5 t-28 -11.5h-215v-154q0 -31 -15 -38t-38 15l-217 218q-14 18 -14 36z" />
97
+ <glyph unicode="&#xf03d;" d="M0 324v768q0 47 18.5 89t50 72.5t73.5 49t89 18.5h768q47 0 89 -18.5t73 -49t49.5 -72.5t18.5 -89v-240l483 471q23 23 55 23q13 -1 29 -7q47 -20 47 -69v-1127q0 -49 -47 -69q-16 -6 -29 -6q-33 0 -55 22l-483 471v-237q0 -47 -18.5 -89t-49.5 -74t-72.5 -50.5 t-89.5 -18.5h-768q-47 0 -89 18.5t-73.5 50.5t-50 73.5t-18.5 89.5z" />
98
+ <glyph unicode="&#xf03e;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h1536v1228h-1536v-1228zM307 307v105l277 360l188 -156l354 537l410 -424v-422h-1229zM307 1073q0 66 45 111t111 45q63 0 108 -45 t45 -111q0 -63 -45 -108t-108 -45q-66 0 -111 45t-45 108z" />
99
+ <glyph unicode="&#xf040;" horiz-adv-x="1536" d="M0 0l137 418l867 866l280 -280l-866 -867zM287 407.5q0 -12.5 10 -22.5q8 -8 22 -8q12 0 21 8l690 690q20 20 0 43q-10 10 -22.5 10t-20.5 -10l-690 -688q-10 -10 -10 -22.5zM1102 1382l119 119q35 35 84 35t84 -35l57 -55l55 -57q35 -35 35 -84.5t-35 -83.5l-119 -119z " />
100
+ <glyph unicode="&#xf041;" horiz-adv-x="1128" d="M0 1001q0 117 44 220.5t121 180.5t180.5 121t219.5 44q117 0 219.5 -44t179 -121t120.5 -180.5t44 -220.5q0 -84 -24.5 -159.5t-65.5 -143.5l-379 -661q-41 -68 -95 -68t-93 68l-381 663q-41 68 -65.5 143t-24.5 158zM285 1001q0 -57 21.5 -108t60.5 -89t89 -59.5 t109 -21.5q57 0 108.5 21.5t89.5 59.5t59.5 89t21.5 108t-21.5 108.5t-59.5 90.5t-89 60.5t-109 21.5q-59 0 -109 -21.5t-89 -60.5t-60.5 -90t-21.5 -109z" />
101
+ <glyph unicode="&#xf042;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44v1118q-117 0 -218.5 -44 t-177 -120t-119.5 -177t-44 -218z" />
102
+ <glyph unicode="&#xf043;" horiz-adv-x="1130" d="M0 535q0 86 23.5 161.5t66.5 141.5q20 33 69.5 99.5t108 154.5t113.5 193.5t90 217.5q10 35 37 51.5t57 12.5q31 4 57.5 -12.5t36.5 -51.5q33 -113 89.5 -218t115 -193t107.5 -154.5t69 -99.5q43 -66 66.5 -141.5t23.5 -161.5q0 -117 -44 -220.5t-120.5 -180.5t-180 -121 t-220.5 -44t-220 44t-180 121t-121 180.5t-44 220.5zM248 410q0 -59 41 -100.5t100 -41.5t100 41t41 101q0 43 -22 75q-6 8 -18.5 24.5t-26.5 39t-28.5 48.5t-22.5 54q-4 20 -23 17q-18 4 -24 -17q-8 -29 -21.5 -54.5t-28 -48t-27 -38.5t-18.5 -25q-23 -33 -22 -75z" />
103
+ <glyph unicode="&#xf044;" d="M0 307v922q0 63 24.5 119.5t65.5 97.5t97.5 65.5t119.5 24.5h1075q4 0 10.5 -1t10.5 -1l-191 -191h-905q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h1075q47 0 81 33.5t34 80.5v445l193 192v-637q0 -63 -25 -118.5t-67 -97.5t-97 -66.5t-119 -24.5 h-1075q-63 0 -119.5 24.5t-97.5 66.5t-65.5 97.5t-24.5 118.5zM631 324l108 329l652 652l221 -222l-651 -651zM866 629q6 -8 17 -8q10 0 16 8l512 510q18 18 0 35q-18 16 -35 0l-510 -510q-18 -18 0 -35zM1501 1415l92 94q29 29 68 29t65 -29l46 -45l45 -45 q27 -29 27.5 -66.5t-27.5 -66.5l-95 -92z" />
104
+ <glyph unicode="&#xf045;" d="M0 307v922q0 63 24.5 119.5t65.5 97.5t97.5 65.5t119.5 24.5h836q-6 -31 -6 -63v-52q-164 -20 -310 -78h-520q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h1075q47 0 81 33.5t34 80.5v111q16 10 31.5 21.5t32.5 27.5l129 127v-287q0 -63 -25 -118.5 t-67 -97.5t-97 -66.5t-119 -24.5h-1075q-63 0 -119.5 24.5t-97.5 66.5t-65.5 97.5t-24.5 118.5zM385 388.5v37.5q0 166 56.5 312.5t173 256t293.5 173t419 65.5v231q0 57 28.5 69.5t69.5 -28.5l392 -391q27 -25 26 -65q0 -39 -26 -64l-392 -391q-41 -41 -69.5 -28.5 t-28.5 69.5v260q-207 0 -364.5 -43t-266 -116.5t-170 -174t-77.5 -215.5q-4 -27 -31 -27q-25 0 -29 27q-4 23 -4 42.5z" />
105
+ <glyph unicode="&#xf046;" d="M0 307v922q0 63 24.5 119.5t65.5 97.5t97.5 65.5t119.5 24.5h1075q27 0 52 -6l-187 -187h-940q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h1075q47 0 81 33.5t34 80.5v326l193 192v-518q0 -63 -25 -118.5t-67 -97.5t-97 -66.5t-119 -24.5h-1075 q-63 0 -119.5 24.5t-97.5 66.5t-65.5 97.5t-24.5 118.5zM385 966.5q0 32.5 23 55.5l98 98q23 23 55.5 23t54.5 -23l340 -340l654 656q23 23 56.5 22.5t55.5 -22.5l99 -99q23 -23 22.5 -55.5t-22.5 -54.5l-711 -711l-98 -98q-23 -23 -55.5 -23t-55.5 23l-100 98l-393 395 q-23 23 -23 55.5z" />
106
+ <glyph unicode="&#xf047;" horiz-adv-x="1597" d="M0 768q0 25 18 43l256 256q27 27 45.5 19.5t18.5 -46.5v-170h360v359h-172q-37 0 -45 18.5t19 44.5l256 256q18 18 43 19q25 0 43 -19l256 -256q27 -27 19.5 -45t-46.5 -18h-172v-359h361v170q0 39 18 46.5t45 -19.5l256 -256q18 -18 18 -43t-18 -43l-256 -256 q-27 -27 -45 -19.5t-18 46.5v176h-361v-365h172q39 0 47 -18.5t-20 -44.5l-256 -256q-18 -18 -43 -19q-25 0 -43 19l-256 256q-27 27 -20 45t46 18h172v365h-360v-176q0 -39 -18.5 -46.5t-45.5 19.5l-256 256q-18 18 -18 43z" />
107
+ <glyph unicode="&#xf048;" horiz-adv-x="1075" d="M0 76q0 -31 22.5 -53.5t53.5 -22.5h153q33 0 55.5 22.5t22.5 53.5v1382q0 33 -22.5 55.5t-55.5 22.5h-153q-31 0 -53.5 -22.5t-22.5 -55.5v-1382zM307.5 768q-0.5 27 16.5 43l653 707q14 18 41 18q6 0 22 -4q35 -18 35 -59v-1412q0 -41 -35 -57q-39 -14 -63 14l-653 705 q-16 18 -16.5 45z" />
108
+ <glyph unicode="&#xf049;" d="M0 76q0 -31 22.5 -53.5t53.5 -22.5h153q33 0 55.5 22.5t22.5 53.5v1382q0 33 -22.5 55.5t-55.5 22.5h-153q-31 0 -53.5 -22.5t-22.5 -55.5v-1382zM307.5 768q-0.5 27 16.5 43l653 707q14 18 41 18q6 0 22 -4q35 -18 35 -59v-1412q0 -41 -35 -57q-39 -14 -63 14l-653 705 q-16 18 -16.5 45zM1075.5 768q-0.5 27 16.5 43l653 707q14 18 41 18q6 0 22 -4q35 -18 35 -59v-1412q0 -41 -35 -57q-39 -14 -63 14l-653 705q-16 18 -16.5 45z" />
109
+ <glyph unicode="&#xf04a;" horiz-adv-x="1536" d="M0 767q0 26 16 44l654 707q14 18 41 18q10 0 22 -6q35 -14 35 -57v-1412q0 -41 -35 -57q-37 -16 -63 14l-654 705q-16 18 -16 44zM768 767q0 26 16 44l654 707q14 18 41 18q10 0 22 -6q35 -14 35 -57v-1412q0 -41 -35 -57q-37 -16 -63 14l-654 705q-16 18 -16 44z" />
110
+ <glyph unicode="&#xf04b;" horiz-adv-x="1349" d="M0 70v1396q0 39 35 60q37 23 69 0l1211 -697q35 -25 35 -61q0 -37 -35 -61l-1211 -697q-16 -10 -34 -10t-35 10q-35 20 -35 60z" />
111
+ <glyph unicode="&#xf04c;" horiz-adv-x="1536" d="M0 70v1396q0 29 20.5 49.5t49.5 20.5h489q29 0 49.5 -20.5t20.5 -49.5v-1396q0 -29 -20.5 -49.5t-49.5 -20.5h-489q-29 0 -49.5 20.5t-20.5 49.5zM907 70v1396q0 29 20.5 49.5t49.5 20.5h489q29 0 49.5 -20.5t20.5 -49.5v-1396q0 -29 -20.5 -49.5t-49.5 -20.5h-489 q-29 0 -49.5 20.5t-20.5 49.5z" />
112
+ <glyph unicode="&#xf04d;" horiz-adv-x="1536" d="M0 70v1396q0 29 20.5 49.5t49.5 20.5h1396q29 0 49.5 -20.5t20.5 -49.5v-1396q0 -29 -20.5 -49.5t-49.5 -20.5h-1396q-29 0 -49.5 20.5t-20.5 49.5z" />
113
+ <glyph unicode="&#xf04e;" horiz-adv-x="1536" d="M0 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57zM768 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57z" />
114
+ <glyph unicode="&#xf050;" d="M0 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57zM768 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57zM1536 76 q0 -31 22.5 -53.5t53.5 -22.5h153q33 0 55.5 22.5t22.5 53.5v1382q0 33 -22.5 55.5t-55.5 22.5h-153q-31 0 -53.5 -22.5t-22.5 -55.5v-1382z" />
115
+ <glyph unicode="&#xf051;" horiz-adv-x="1075" d="M0 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57zM768 76q0 -31 22.5 -53.5t53.5 -22.5h153q33 0 55.5 22.5t22.5 53.5v1382q0 33 -22.5 55.5t-55.5 22.5h-153q-31 0 -53.5 -22.5t-22.5 -55.5 v-1382z" />
116
+ <glyph unicode="&#xf052;" horiz-adv-x="1536" d="M0 70v198q0 29 20.5 49.5t49.5 20.5h1396q29 0 49.5 -20.5t20.5 -49.5v-198q0 -29 -20.5 -49.5t-49.5 -20.5h-1396q-29 0 -49.5 20.5t-20.5 49.5zM6 594q-18 43 14 76l699 698q20 20 49 20.5t49 -20.5l699 -698q33 -33 14 -76q-16 -43 -64 -43h-1396q-47 0 -64 43z" />
117
+ <glyph unicode="&#xf053;" horiz-adv-x="964" d="M0 765q0 38 29 66l671 674q29 29 68 29t68 -29l100 -100q29 -29 29 -68t-29 -67l-508 -510l508 -500q29 -29 29 -66.5t-29 -66.5l-100 -102q-29 -29 -68 -29t-68 29l-671 673q-29 29 -29 67z" />
118
+ <glyph unicode="&#xf054;" horiz-adv-x="964" d="M0 194.5q0 38.5 29 67.5l508 508l-508 502q-29 29 -29 66.5t29 66.5l100 102q29 29 68 29t67 -29l672 -673q29 -29 29 -68t-29 -68l-672 -671q-29 -29 -67.5 -29t-67.5 29l-100 100q-29 29 -29 67.5z" />
119
+ <glyph unicode="&#xf055;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM338 688q0 -33 33 -33h313v-344q0 -33 33 -32h164q33 0 32 32v344h314 q12 0 22.5 9.5t10.5 23.5v158q0 14 -10.5 23.5t-22.5 9.5h-314v346q0 33 -32 32h-164q-33 0 -33 -32v-346h-313q-33 0 -33 -33v-158z" />
120
+ <glyph unicode="&#xf056;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM338 688q0 -33 33 -33h856q12 0 22.5 9.5t10.5 23.5v158q0 14 -10.5 23.5 t-22.5 9.5h-856q-33 0 -33 -33v-158z" />
121
+ <glyph unicode="&#xf057;" horiz-adv-x="1597" d="M0 770q0 154 58.5 301.5t174.5 263.5q117 117 264.5 175.5t301 58.5t301 -58.5t264.5 -175.5t175 -264t58 -301t-58 -301t-175 -264t-264.5 -175.5t-301 -58.5t-301 58.5t-264.5 175.5t-175 264t-58 301zM385 505q0 -13 10 -24l115 -116q10 -10 23.5 -10.5t23.5 10.5 l244 243l219 -221q10 -10 23.5 -10t23.5 10l113 113q23 23 0 47l-222 219l246 246q23 23 0 47l-117 115q-25 25 -47 0l-243 -244l-222 221q-10 10 -23 10t-24 -10l-110 -113q-25 -23 0 -47l219 -219l-242 -244q-10 -10 -10 -23z" />
122
+ <glyph unicode="&#xf058;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 718q0 -20 14 -34l319 -319q14 -14 38 -24.5t44 -10.5h56q20 0 43.5 10 t38.5 25l550 550q14 14 14.5 34t-14.5 34l-104 107q-16 14 -35.5 14t-34.5 -14l-452 -453q-14 -14 -33.5 -14t-34.5 14l-221 221q-14 14 -33.5 14t-36.5 -14l-104 -106q-14 -14 -14 -34z" />
123
+ <glyph unicode="&#xf059;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM532 1100l95 -115q4 -8 20 -12q12 0 23 6l10 8t27.5 17.5t39 16.5t46.5 7 q41 0 69.5 -22.5t28.5 -57.5q0 -37 -24.5 -64.5t-61.5 -60.5q-23 -18 -46.5 -40.5t-43 -51.5t-31.5 -63.5t-12 -79.5v-64q0 -12 9 -21t21 -9h164q12 0 20.5 9t8.5 21v51q0 39 25.5 66.5t62.5 60.5q25 20 49.5 46t46 57t34.5 69.5t13 90.5q0 68 -27.5 121t-73.5 87.5 t-103.5 53t-114.5 18.5q-63 0 -113.5 -16.5t-85.5 -35.5t-53 -35.5t-20 -18.5q-16 -16 -3 -39zM672 252q0 -12 9 -21.5t21 -9.5h164q12 0 20.5 9.5t8.5 21.5v156q0 12 -8 21t-21 9h-164q-12 0 -21 -9t-9 -21v-156z" />
124
+ <glyph unicode="&#xf05a;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM573 858q0 -29 29 -29h86v-409h-78q-12 0 -21 -8.5t-9 -20.5v-139q0 -12 9 -21.5 t21 -9.5h402q12 0 20 9.5t8 21.5v139q0 29 -28 29h-78v577q0 12 -8 21.5t-21 9.5h-303q-12 0 -20.5 -9t-8.5 -22v-139zM686 1151q0 -12 9.5 -21.5t21.5 -9.5h188q12 0 20.5 9.5t8.5 21.5v166q0 29 -29 29h-188q-12 0 -21.5 -8.5t-9.5 -20.5v-166z" />
125
+ <glyph unicode="&#xf05b;" horiz-adv-x="1536" d="M0 692v154q0 16 11.5 26.5t27.5 10.5h164q18 84 59 158.5t99.5 133t133 99.5t158.5 59v164q0 39 39 39h154q16 0 26.5 -11.5t10.5 -27.5v-164q84 -18 158.5 -59t133 -99.5t99.5 -133t59 -158.5h164q16 0 27.5 -10.5t11.5 -26.5v-154q0 -39 -39 -39h-164 q-18 -84 -59 -158.5t-99.5 -133t-133 -99.5t-158.5 -59v-164q0 -16 -10.5 -27.5t-26.5 -11.5h-154q-39 0 -39 39v164q-84 18 -158.5 59t-133 99.5t-99.5 133t-59 158.5h-164q-39 0 -39 39zM365 653q29 -106 105.5 -183t182.5 -105v174q0 16 11.5 26t27.5 10h154 q16 0 26.5 -10t10.5 -26v-174q106 29 183 105.5t105 182.5h-172q-39 0 -38 39v154q0 16 11 26.5t27 10.5h172q-29 106 -105.5 183t-182.5 105v-172q0 -16 -10.5 -27t-26.5 -11h-154q-39 0 -39 38v172q-106 -29 -183 -105.5t-105 -182.5h174q16 0 26 -10.5t10 -26.5v-154 q0 -16 -10 -27.5t-26 -11.5h-174z" />
126
+ <glyph unicode="&#xf05c;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM451 573.5q0 16.5 12 28.5l166 166l-166 166q-12 12 -12 28.5t12 28.5l112 113q29 29 58 0l166 -166l166 166q29 29 57 0l113 -113q29 -29 0 -57l-166 -166l166 -166 q29 -29 0 -57l-113 -113q-12 -12 -28.5 -12t-28.5 12l-166 166l-166 -166q-12 -12 -28.5 -12t-29.5 12l-112 113q-12 12 -12 28.5z" />
127
+ <glyph unicode="&#xf05d;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM332 717.5q0 17.5 10 27.5l115 115q10 10 27.5 10t27.5 -10l178 -180q29 -25 58 0l337 340q10 10 27.5 10t28.5 -10l114 -115q10 -10 10.5 -27.5t-10.5 -27.5l-409 -410 q-12 -12 -32.5 -20t-37.5 -8h-114q-16 0 -37 8t-33 20l-250 250q-10 10 -10 27.5z" />
128
+ <glyph unicode="&#xf05e;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -84 23.5 -160t66.5 -141l770 770q-66 43 -141.5 66.5t-159.5 23.5 q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM498 297q66 -41 141.5 -64.5t159.5 -23.5q117 0 218 44t177 120t120 177t44 218q0 84 -23.5 160t-64.5 141z" />
129
+ <glyph unicode="&#xf060;" horiz-adv-x="1536" d="M0 768q0 39 29 68l671 673q29 29 68 29t68 -29l100 -100q29 -29 29 -67.5t-29 -67.5l-338 -338h842q41 0 68.5 -27.5t27.5 -68.5v-144q0 -39 -27.5 -66.5t-66.5 -27.5h-844l338 -338q29 -29 29 -67.5t-29 -67.5l-100 -100q-29 -29 -68 -29t-68 29l-671 671q-29 29 -29 68 z" />
130
+ <glyph unicode="&#xf061;" horiz-adv-x="1536" d="M0 698v144q0 39 27.5 66.5t66.5 27.5h844l-338 338q-29 29 -29 67.5t29 67.5l100 100q29 29 68 29t68 -29l671 -673q29 -29 29 -67t-29 -67l-671 -673q-29 -29 -68 -29t-68 29l-100 100q-29 29 -29 68t29 67l338 338h-844q-39 0 -66.5 27.5t-27.5 68.5z" />
131
+ <glyph unicode="&#xf062;" horiz-adv-x="1536" d="M-1 768q-1 39 28 68l673 671q29 29 68 29t68 -29l671 -671q29 -29 29 -68t-29 -68l-100 -100q-29 -29 -66.5 -29t-66.5 29l-340 338v-844q0 -39 -27.5 -66.5t-66.5 -27.5h-144q-41 0 -67.5 27.5t-26.5 66.5v844l-338 -338q-29 -29 -67.5 -29t-67.5 29l-100 100 q-29 29 -30 68z" />
132
+ <glyph unicode="&#xf063;" horiz-adv-x="1536" d="M0 766q0 39 29 68l100 100q29 29 68 29t67 -29l338 -338v844q0 39 27.5 66.5t66.5 27.5h144q41 0 67.5 -27.5t26.5 -66.5v-844l340 338q29 29 66.5 29t66.5 -29l102 -100q29 -29 29 -68t-29 -68l-673 -671q-29 -29 -68 -29t-68 29l-671 671q-29 29 -29 68z" />
133
+ <glyph unicode="&#xf064;" d="M0 135q0 209 71.5 393.5t218 322.5t371 219t531.5 83v293q0 72 36 87t89 -36l491 -493q35 -33 35 -82q0 -47 -35 -82l-491 -494q-51 -51 -88 -35.5t-37 86.5v330q-262 -2 -461 -56.5t-336 -147.5t-215 -219t-98 -271q-4 -33 -37 -33h-2q-33 0 -37 33q-6 51 -6 102z" />
134
+ <glyph unicode="&#xf065;" horiz-adv-x="1536" d="M0 86v522q0 53 26.5 64.5t65.5 -25.5l166 -166l274 275q12 12 31 12t33 -12l160 -160q12 -14 12 -32.5t-12 -31.5l-275 -274l166 -166q39 -39 27 -65.5t-66 -26.5h-520q-37 0 -61 25q-27 27 -27 61zM768 972.5q0 18.5 12 31.5l275 274l-166 166q-39 39 -27 65.5t66 26.5 h520q37 0 61 -25q27 -27 27 -61v-522q0 -53 -26.5 -64.5t-65.5 25.5l-166 166l-274 -273q-12 -14 -31 -14t-33 14l-160 158q-12 14 -12 32.5z" />
135
+ <glyph unicode="&#xf066;" horiz-adv-x="1536" d="M0 202.5q0 18.5 12 33.5l275 272l-166 166q-39 39 -27 65.5t66 26.5h520q38 0 61 -25q27 -27 27 -61v-522q0 -53 -26.5 -64.5t-65.5 27.5l-166 166l-274 -275q-12 -14 -31 -14t-33 14l-160 160q-12 12 -12 30.5zM768 854v522q0 53 26.5 64.5t65.5 -27.5l166 -166l274 275 q12 14 31 14t33 -14l160 -160q12 -12 12 -30.5t-12 -33.5l-275 -272l166 -166q39 -39 27 -65.5t-66 -26.5h-520q-41 0 -61 25q-27 27 -27 61z" />
136
+ <glyph unicode="&#xf067;" horiz-adv-x="1536" d="M0 696v144q0 39 27.5 66.5t66.5 27.5h508v506q0 41 26.5 68.5t67.5 27.5h144q39 0 66.5 -27.5t27.5 -66.5v-508h508q39 0 66.5 -27.5t27.5 -66.5v-144q0 -39 -27.5 -66.5t-66.5 -27.5h-508v-506q0 -41 -27.5 -68.5t-66.5 -27.5h-144q-39 0 -66.5 27.5t-27.5 66.5v508 h-506q-41 0 -68.5 26.5t-27.5 67.5z" />
137
+ <glyph unicode="&#xf068;" horiz-adv-x="1536" d="M0 696v144q0 39 27.5 66.5t66.5 27.5h1348q39 0 66.5 -27.5t27.5 -66.5v-144q0 -39 -27.5 -66.5t-66.5 -27.5h-1346q-41 0 -68.5 26.5t-27.5 67.5z" />
138
+ <glyph unicode="&#xf069;" horiz-adv-x="1427" d="M2 1018q-10 37 10 72l72 124q20 35 58 44.5t73 -9.5l332 -192v383q0 41 27.5 68.5t68.5 27.5h141q41 0 69 -27.5t28 -66.5v-385l331 192q35 18 73 9t58 -44l70 -124q20 -35 11 -72t-44 -57l-333 -193l333 -193q35 -20 44.5 -57t-9.5 -72l-72 -124q-20 -35 -58 -44.5 t-73 9.5l-331 192v-383q0 -41 -28 -68.5t-69 -27.5h-141q-41 0 -68.5 27.5t-27.5 66.5v385l-332 -192q-35 -20 -73 -10t-58 45l-72 124q-18 35 -9 72t44 57l334 193l-334 193q-35 20 -45 57z" />
139
+ <glyph unicode="&#xf06a;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM672 1274l14 -739q4 -29 31 -29h162q12 0 21 8t9 21l17 739q0 10 -8 22q-8 8 -23 9 h-193q-14 0 -22 -9q-8 -12 -8 -22zM680 236q0 -12 8 -21.5t21 -9.5h180q12 0 21.5 9t9.5 22v174q0 12 -9.5 21t-21.5 9h-180q-12 0 -20.5 -9t-8.5 -21v-174z" />
140
+ <glyph unicode="&#xf06b;" horiz-adv-x="1880" d="M0 588v391q0 16 11.5 27.5t27.5 11.5h539q-57 0 -107.5 21.5t-87.5 58.5t-58.5 87t-21.5 107t21.5 107.5t58.5 87.5t87 58.5t108 21.5q61 0 115.5 -24.5t88.5 -69.5l158 -203l158 203q35 45 89 69.5t116 24.5q57 0 107 -21.5t87 -58.5t58.5 -87t21.5 -108 q0 -57 -21.5 -107t-58.5 -87t-87 -58.5t-107 -21.5h538q16 0 27.5 -11.5t11.5 -27.5v-391q0 -16 -11 -27.5t-28 -11.5h-117v-432q0 -47 -34.5 -82t-83.5 -35h-1332q-49 0 -82.5 35t-33.5 82v432h-119q-16 0 -27.5 11t-11.5 28zM461 1292q0 -49 33.5 -82.5t83.5 -33.5h237 l-151 196q-10 10 -32 24.5t-54 14.5q-49 0 -83 -35t-34 -84zM743 221q0 -33 24 -56.5t56 -23.5h234q33 0 56.5 23.5t23.5 56.5v797h-394v-797zM1065 1176h238q49 0 82.5 33.5t33.5 82.5t-33.5 84t-82.5 35q-33 0 -54.5 -14.5t-31.5 -24.5z" />
141
+ <glyph unicode="&#xf06c;" horiz-adv-x="1916" d="M6 135q20 53 56 89t71 65q29 23 50.5 43t27.5 43q2 6 0 12t-10 25q-6 12 -11.5 27.5t-9.5 35.5q-25 160 13 295t120 242.5t195 185.5t235 121q82 29 179.5 34t203.5 7q61 0 127 2t127.5 11t113.5 28.5t85 54.5q20 20 38.5 41t38 36t43 24.5t58.5 9.5q23 0 42.5 -11.5 t29.5 -31.5q66 -133 83 -281.5t-18 -322.5q-90 -487 -579 -740q-231 -123 -467 -123q-154 0 -307 54q-23 8 -45.5 20t-44.5 25q-29 16 -57.5 30.5t-49.5 14.5q-10 -2 -23.5 -17.5t-27.5 -35t-26.5 -41t-20.5 -33.5q-14 -23 -26.5 -41.5t-22.5 -32.5q-25 -31 -64 -31h-4 q-29 2 -49.5 12.5t-33.5 24.5t-20.5 28.5t-9.5 22.5q-27 37 -10 78zM401 507.5q2 -32.5 29 -54.5q20 -18 51 -19q37 0 62 27q90 102 181 175t191.5 117t212 62t242.5 14q33 -4 57.5 19.5t26.5 56.5q2 35 -20.5 58.5t-57.5 25.5q-147 6 -277 -16.5t-247 -73.5t-223.5 -133 t-206.5 -199q-23 -27 -21 -59.5z" />
142
+ <glyph unicode="&#xf06d;" horiz-adv-x="1445" d="M0 442q0 123 63.5 254t174.5 238q10 16 33.5 13t31.5 -21q4 -16 0 -29q-8 -35 -14 -84t-4 -101.5t13 -101.5t38 -84q31 -37 78 -49q-49 154 -40 293t49 259t101.5 217t118.5 167t98 106.5t43 39.5q25 18 47 0q10 -8 13.5 -21.5t-0.5 -24.5q0 -2 -15.5 -42.5t-21.5 -102 t7 -134.5t71 -136q37 -43 67.5 -85t52 -93.5t34 -120t12.5 -162.5q0 -33 -31 -39q-12 -2 -24.5 4t-16.5 19q-14 31 -42 49t-63 18q-47 0 -79.5 -33.5t-32.5 -81.5q0 -121 156 -120q98 0 153 63q37 43 53.5 101.5t20.5 114.5t2 102.5t-4 62.5q-6 12 0 29q8 18 31.5 21 t35.5 -13q111 -106 173.5 -237.5t62.5 -254.5q0 -109 -51.5 -195.5t-145.5 -148t-228 -95.5t-298 -34t-298 34t-228.5 95.5t-145.5 148.5t-51 195z" />
143
+ <glyph unicode="&#xf06e;" d="M0 722q0 44 25 83q78 125 178 224t216 168t242.5 104.5t260.5 35.5q135 0 262 -35.5t241.5 -103.5t215 -167t180.5 -226q23 -39 22.5 -83t-22.5 -81q-80 -127 -180.5 -226.5t-215 -167t-241.5 -103t-262 -35.5q-133 0 -260 35.5t-243 104t-216.5 168t-177.5 224.5 q-25 37 -25 81zM154 723q66 -104 149.5 -190.5t182 -145.5t208 -92t228.5 -33t228.5 33t207.5 92t182 145t150 191q-80 129 -187.5 226.5t-236.5 156.5q51 -59 79.5 -133t28.5 -160q0 -96 -35.5 -179t-99 -146.5t-147.5 -99.5t-179 -36q-96 0 -179 36t-146.5 99.5t-99 146.5 t-35.5 179q0 78 25.5 148.5t68.5 128.5q-117 -59 -217.5 -152.5t-175.5 -214.5zM614 813q0 -23 16.5 -40t41.5 -17t41 17.5t16 39.5q0 78 53.5 131t130.5 53q25 0 41.5 17.5t16.5 40.5q0 25 -16.5 41t-41.5 16q-61 0 -116.5 -23.5t-95 -63.5t-63.5 -95.5t-24 -116.5z" />
144
+ <glyph unicode="&#xf070;" d="M0 767q0 44 25 83q78 125 178 224.5t216 168t242.5 104t260.5 35.5q53 0 105 -7t103 -17l89 158q8 14 24 18q12 6 29 -2l133 -76q14 -8 19.5 -23.5t-3.5 -29.5l-774 -1383q-6 -14 -22 -18q-4 -2 -11 -2q-6 0 -18 4l-135 76q-14 8 -18.5 23.5t3.5 29.5l66 115 q-145 68 -269 178.5t-218 259.5q-25 37 -25 81zM154 768q82 -131 191.5 -229.5t240.5 -157.5l57 104q-86 63 -138 159.5t-52 213.5q0 78 25.5 148.5t68.5 130.5q-117 -61 -217.5 -153.5t-175.5 -215.5zM614 858q0 -23 16.5 -40t41.5 -17t41 17.5t16 39.5q0 78 53.5 131 t130.5 53q25 0 41.5 17.5t16.5 40.5q0 25 -16.5 41t-41.5 16q-61 0 -116.5 -23.5t-95 -63.5t-63.5 -95.5t-24 -116.5zM928 154l88 159q209 25 382 145t292 310q-109 170 -263 283l76 137q92 -66 172 -150t146 -188q23 -39 22.5 -83t-22.5 -81q-160 -254 -392.5 -392 t-500.5 -140zM1081 430l285 510q4 -20 6 -39.5t2 -42.5q0 -74 -21.5 -140.5t-60.5 -121.5t-93 -98t-118 -68z" />
145
+ <glyph unicode="&#xf071;" horiz-adv-x="1775" d="M0 92q0 20 6 39t17 35l768 1331q16 27 39.5 48.5t56.5 21.5t56.5 -21.5t39.5 -48.5l770 -1331q10 -16 16.5 -34.5t6.5 -39.5q0 -49 -38 -70.5t-81 -21.5h-1538q-43 0 -81 21.5t-38 70.5zM770 1114l12 -633q0 -14 10.5 -24.5t24.5 -10.5h139q14 0 24.5 10.5t10.5 24.5 l15 633q0 14 -10.5 24.5t-24.5 10.5h-166q-16 0 -25.5 -10.5t-9.5 -24.5zM776 168q0 -16 10.5 -25.5t24.5 -9.5h154q35 0 34 35v147q0 16 -9 26.5t-25 10.5h-154q-14 0 -24.5 -10t-10.5 -27v-147z" />
146
+ <glyph unicode="&#xf072;" horiz-adv-x="1597" d="M0 541v4q0 31 23 57l30 29q20 25 56 24q8 0 10 -2l280 -32q39 63 93.5 134.5t125.5 151.5l-583 457q-31 25 -31 59v4q0 31 23 58l57 57q27 23 57 23h13.5t13.5 -4l803 -293l151 149q70 70 161 110t167 40q72 0 109 -37q20 -18 28 -46t8 -63q0 -76 -38.5 -167t-110.5 -160 l-150 -152l293 -803q6 -12 6 -26q0 -33 -24 -58l-58 -57q-23 -25 -57 -25h-4q-35 4 -59 31l-455 586q-82 -72 -153.5 -126t-135.5 -93l35 -281v-10q0 -33 -22 -55l-31 -31q-23 -23 -58 -23h-4q-39 4 -59 31l-205 272l-274 207q-29 25 -31 60z" />
147
+ <glyph unicode="&#xf073;" horiz-adv-x="1566" d="M0 117v1147q0 47 35 81.5t82 34.5h39v13q0 31 10 62.5t32.5 56t59.5 40t90 15.5t90 -15.5t59.5 -40t33 -56.5t10.5 -62v-13h49v13q0 31 10 62.5t32.5 56t59.5 40t90 15.5t90 -15.5t60.5 -40t34 -56.5t10.5 -62v-13h49v13q0 31 10.5 62.5t33 56t59 40t90.5 15.5 q53 0 90 -15.5t59.5 -40t32.5 -56.5t10 -62v-13h39q47 0 82 -34.5t35 -81.5v-1147q0 -47 -35 -82t-82 -35h-1333q-47 0 -82 35t-35 82zM158 158h282v250h-282v-250zM158 446h282v252h-282v-252zM158 737h282v252h-282v-252zM272 1165q0 -57 76 -57t76 57v228q0 57 -76 57 t-76 -57v-228zM479 158h285v250h-285v-250zM479 446h285v252h-285v-252zM479 737h285v252h-285v-252zM709 1165q0 -31 16 -44t57 -13t58.5 13.5t17.5 43.5v228q0 29 -17.5 43t-58.5 14t-57 -14.5t-16 -42.5v-228zM803 158h284v250h-284v-250zM803 446h284v252h-284v-252z M803 737h284v252h-284v-252zM1126 158h283v250h-283v-250zM1126 446h283v252h-283v-252zM1126 737h283v252h-283v-252zM1143 1165q0 -57 76 -57t75 57v228q0 57 -75 57q-76 0 -76 -57v-228z" />
148
+ <glyph unicode="&#xf074;" d="M0 252v154q0 16 11.5 27t27.5 11h219q51 0 99.5 31t93.5 83t90 119.5t90 139.5q55 88 114.5 175t127 156t147.5 110.5t180 41.5h203v185q0 41 24.5 49t59.5 -21l334 -278q23 -18 22 -45q0 -29 -22 -47l-334 -277q-35 -29 -59.5 -20.5t-24.5 49.5v174h-203 q-53 0 -100 -31.5t-93 -84t-91.5 -120t-90.5 -139.5q-55 -88 -113.5 -174t-126 -154.5t-148.5 -110.5t-179 -42h-219q-16 0 -27.5 11.5t-11.5 27.5zM0 1108v154q0 39 39 38h219q68 0 127 -20t111.5 -56t97.5 -84t88 -104q-61 -90 -117 -178q-4 -8 -9 -14t-9 -15 q-70 102 -139.5 172t-149.5 70h-219q-16 0 -27.5 10.5t-11.5 26.5zM778 481q29 41 56.5 85t56.5 87q4 10 10 17.5t10 17.5q70 -102 139.5 -170.5t149.5 -68.5h203v190q0 41 24.5 49t59.5 -20l334 -277q23 -18 22 -47q0 -27 -22 -45l-334 -279q-35 -29 -59.5 -20.5 t-24.5 49.5v168h-203q-68 0 -127 20.5t-110.5 56.5t-97.5 84t-87 103z" />
149
+ <glyph unicode="&#xf075;" horiz-adv-x="1916" d="M0 866q0 145 76 272.5t206 222.5t303.5 150.5t372.5 55.5t373 -55.5t304 -150.5t206 -222t76 -273q0 -145 -76 -272t-206 -222.5t-304 -150.5t-373 -55q-92 0 -180 12q-176 -139 -411 -192q-25 -4 -50.5 -8.5t-54.5 -8.5q-16 -2 -27.5 6.5t-15.5 24.5t5 26.5t20 20.5 q23 23 43 44.5t36.5 51t30 69.5t23.5 97q-174 98 -275.5 241.5t-101.5 315.5z" />
150
+ <glyph unicode="&#xf076;" horiz-adv-x="1566" d="M0 621v288q0 16 11.5 27.5t27.5 11.5h391q16 0 28.5 -11t12.5 -28v-288q0 -29 22.5 -60t63.5 -58.5t98.5 -45t128.5 -17.5q70 0 128.5 17.5t99.5 45t63.5 58.5t22.5 60v288q0 39 39 39h391q16 0 27.5 -11t11.5 -28v-288q0 -135 -61.5 -254t-168 -207t-249 -139.5 t-304.5 -51.5q-164 0 -306 51.5t-248.5 139.5t-168 206.5t-61.5 254.5zM0 1106v391q0 16 11.5 27.5t27.5 11.5h391q16 0 28.5 -11.5t12.5 -27.5v-391q0 -16 -12.5 -27.5t-28.5 -11.5h-391q-16 0 -27.5 11.5t-11.5 27.5zM1098 1106v391q0 16 11 27.5t28 11.5h391 q16 0 27.5 -11.5t11.5 -27.5v-391q0 -16 -11.5 -27.5t-27.5 -11.5h-391q-39 0 -39 39z" />
151
+ <glyph unicode="&#xf077;" horiz-adv-x="1536" d="M-1 355.5q-1 37.5 28 66.5l673 674q29 29 68 28.5t68 -28.5l671 -674q29 -29 29 -67t-29 -66l-100 -103q-29 -29 -68 -28.5t-67 28.5l-508 510l-500 -510q-29 -29 -67.5 -28.5t-67.5 28.5l-100 103q-29 29 -30 66.5z" />
152
+ <glyph unicode="&#xf078;" horiz-adv-x="1536" d="M0 918.5q0 37.5 29 66.5l100 102q29 29 68 29t67 -29l508 -509l500 509q29 29 67.5 29t67.5 -29l100 -102q29 -29 30 -66.5t-28 -66.5l-673 -674q-29 -29 -68 -28.5t-68 28.5l-671 674q-29 29 -29 66.5z" />
153
+ <glyph unicode="&#xf079;" horiz-adv-x="1916" d="M2.5 1038.5q-12.5 30.5 28.5 75.5l385 424q25 29 63 29q39 0 64 -29l385 -424q41 -45 28.5 -75.5t-67.5 -30.5h-250v-680h174q6 -10 12 -19.5t17 -19.5l252 -281h-695q-33 0 -56.5 23.5t-23.5 56.5v920h-249q-55 0 -67.5 30.5zM823 1526h695q33 0 56 -22.5t23 -57.5v-918 h250q55 0 67.5 -30.5t-28.5 -75.5l-385 -424q-25 -29 -63 -29q-39 0 -64 29l-385 424q-41 45 -28.5 75.5t67.5 30.5h250v678h-174q-6 10 -12.5 20.5t-14.5 20.5z" />
154
+ <glyph unicode="&#xf07a;" d="M0 1421v76q0 39 39 39h231q16 0 38 -4t36 -8q6 -4 14.5 -14.5t15.5 -23.5t12 -26.5t7 -21.5l27 -125h1347q35 0 58 -27t16 -59l-108 -578q-6 -25 -26.5 -42t-49.5 -17h-1084l35 -168q4 -16 17.5 -26.5t29.5 -10.5h856q16 0 27.5 -11.5t11.5 -27.5v-78q0 -16 -11 -26.5 t-28 -10.5h-163h-652h-104q-16 0 -36.5 3.5t-35.5 9.5q-6 2 -14 13t-15.5 24.5t-12.5 27t-7 21.5l-215 1016q-4 16 -17.5 26t-29.5 10h-170q-39 0 -39 39zM582 115q0 47 33.5 81.5t80.5 34.5q49 0 83 -34.5t34 -81.5t-34 -81t-83 -34q-47 0 -80.5 34t-33.5 81zM1233 115 q0 47 33.5 81.5t81.5 34.5q47 0 80.5 -34.5t33.5 -81.5t-33.5 -81t-80.5 -34t-81 34t-34 81z" />
155
+ <glyph unicode="&#xf07b;" d="M0 115v1306q0 47 34 81t81 34h692q47 0 81 -34t34 -81t33.5 -80.5t80.5 -33.5h693q47 0 80.5 -35t33.5 -82v-1075q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81z" />
156
+ <glyph unicode="&#xf07c;" d="M0 379v1042q0 47 34 81t81 34h692q47 0 81 -34t34 -81t33.5 -80.5t80.5 -33.5h443q47 0 80.5 -35t33.5 -82v-221h-1228q-37 0 -72 -12.5t-65.5 -34t-53 -51t-35.5 -64.5zM43 0l246 760q6 23 30.5 39t47.5 16h1476l-260 -758q-6 -23 -30.5 -40t-47.5 -17h-1462z" />
157
+ <glyph unicode="&#xf07d;" horiz-adv-x="798" d="M2 368.5q10 22.5 57 22.5h203v754h-203q-47 0 -57 22.5t25 57.5l319 319q23 23 53 23q31 0 54 -23l321 -319q33 -35 22.5 -57.5t-57.5 -22.5h-202v-754h202q47 0 57.5 -22.5t-24.5 -57.5l-319 -319q-23 -23 -54 -23t-53 23l-321 319q-33 35 -23 57.5z" />
158
+ <glyph unicode="&#xf07e;" horiz-adv-x="1597" d="M0 729q0 31 23 53l319 322q35 33 57.5 23.5t22.5 -56.5v-205h754v203q0 47 22.5 57.5t56.5 -22.5l320 -322q23 -23 22 -53q0 -31 -22 -53l-320 -322q-35 -33 -57 -22.5t-22 57.5v203h-754v-203q0 -47 -22.5 -57t-57.5 24l-319 320q-23 23 -23 53z" />
159
+ <glyph unicode="&#xf080;" d="M0 115v1306q0 47 35 81t82 34h1612q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1612q-47 0 -82 34t-35 81zM154 154h1536v1228h-1536v-1228zM307 264v363h203v-363h-203zM649 264v776h201v-776h-201zM993 264v592h203v-592h-203zM1333 264v922h203v-922 h-203z" />
160
+ <glyph unicode="&#xf081;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t73 15.5h1153q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-1153q-39 0 -73.5 15.5t-60 41t-41 60.5t-15.5 76zM201 559q80 -111 198.5 -169t259.5 -58q96 0 184.5 26.5t160 73.5 t124 112.5t76.5 143.5q82 6 129 57q14 14 4 33q-8 18 -30 15h-4q23 23 30 45q8 20 -8 32q-14 14 -33 2q-8 -4 -29.5 -10t-45.5 -6q-4 0 -7.5 1t-7.5 1q0 2 -1 4t-1 4q-16 61 -57 110.5t-94 72.5q4 4 6 8t6 8q6 16 0 33q-2 6 -12.5 16t-34.5 8q-2 4 -6 8q-12 12 -25 9 q-25 -4 -49 -13l-2 2q-14 8 -31 -2q-59 -37 -98 -100t-68 -135q-35 31 -57 41q-61 35 -129 63.5t-154 61.5q-14 4 -24 -4q-10 -6 -15 -21q-2 -27 8.5 -58.5t38.5 -62.5q-25 -6 -20 -32q12 -68 68 -101l-13 -12q-14 -14 -4 -33q4 -12 26.5 -37.5t65.5 -38.5q-6 -12 -6 -22 t2 -14q6 -33 39 -50q-37 -25 -79 -34t-85 -5.5t-83 20.5t-70 46q-8 8 -19.5 8t-19.5 -8q-23 -18 -4 -39z" />
161
+ <glyph unicode="&#xf082;" horiz-adv-x="1536" d="M2 193v1150q0 39 15.5 75t41 61.5t60.5 41t74 15.5h1153q80 0 136 -56.5t56 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-74 -15.5h-486v643h172q12 0 21.5 8t9.5 21l12 168q0 14 -8 24q-10 10 -23 10h-184v74q0 41 10.5 54.5t53.5 13.5q25 0 55.5 -4t58.5 -11 q6 0 13.5 1.5t11.5 5.5q10 6 14 22l23 162q4 29 -25 35q-90 25 -188 24q-301 0 -301 -293v-84h-103q-33 0 -32 -32v-168q0 -12 9 -21.5t23 -9.5h103v-643h-393q-39 0 -74 15.5t-60.5 41t-41 60.5t-15.5 76z" />
162
+ <glyph unicode="&#xf083;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 160h1536v114h-1536v-114zM154 1145h1536v231h-957l-14 -92h-565v-139zM266 1341h316v93h-316v-93zM557 709q0 -76 28.5 -142.5t78 -116 t116 -78t142.5 -28.5t142 28.5t115.5 78t78 116t28.5 142.5t-28.5 142.5t-78 115.5t-116 77.5t-141.5 28.5q-76 0 -142.5 -28.5t-116 -77.5t-78 -115.5t-28.5 -142.5zM672 709q0 51 19.5 97t53 80t79.5 53t98 19q51 0 97 -19t80 -53t53 -80t19 -97t-19 -97.5t-53 -80 t-80 -53t-97 -19.5t-97.5 19.5t-80 53t-53 79.5t-19.5 98zM743 709q0 -16 12.5 -28.5t28.5 -12.5q18 0 30.5 12.5t12.5 28.5q0 41 28 67.5t67 26.5v2q18 0 30.5 12t12.5 29q0 18 -12.5 30.5t-30.5 12.5q-74 0 -126.5 -53.5t-52.5 -126.5z" />
163
+ <glyph unicode="&#xf084;" horiz-adv-x="1916" d="M0 803.5q-6 111.5 30 230.5t113 228q78 109 179.5 180t209 102t213 17.5t191.5 -74.5q76 -53 121 -134t59 -176.5t-4 -199t-68 -203.5l414 -297l101 139l-105 74q-14 10 -17 27.5t7 32.5l51 69q10 14 26.5 17.5t32.5 -7.5l344 -247q16 -10 18.5 -27.5t-7.5 -32.5l-49 -69 q-10 -14 -27.5 -17.5t-32.5 6.5l-102 76l-101 -139l248 -178q43 -31 52.5 -83t-21.5 -95q-33 -43 -84 -51.5t-94 22.5l-803 573q-78 -80 -170 -130t-186.5 -68.5t-185.5 -2t-167 71.5q-86 61 -133 157.5t-53 208zM230.5 766q7.5 -41 30 -78t58.5 -63q37 -27 79 -36t83 -2 t78 29.5t64 59.5q39 53 41 114.5t-27 114.5q59 -10 116.5 11.5t96.5 74.5q27 37 36 79t2 84t-29.5 79t-59.5 63q-37 27 -79 36t-84 2t-79 -29.5t-63 -59.5q-37 -53 -39 -114.5t26 -114.5q-59 10 -116.5 -12.5t-96.5 -75.5q-27 -37 -36 -79t-1.5 -83z" />
164
+ <glyph unicode="&#xf085;" horiz-adv-x="1916" d="M0 801v180q0 8 22.5 15.5t52 11.5t56.5 7t37 3q12 49 37 88q-23 31 -45.5 61.5t-46.5 59.5l-4 10q0 6 20.5 29.5t47 50t50 47t29.5 20.5q2 0 20.5 -13t41 -30.5t43 -34t24.5 -20.5q43 25 90 37q0 8 3 37t7 57.5t10.5 52t16.5 23.5h178q8 0 15.5 -23.5t11.5 -52t7 -57.5 t5 -37q45 -12 86 -35q31 23 62.5 45.5t60.5 46.5l8 4q4 0 27.5 -21.5t49.5 -47t47.5 -49t21.5 -29.5q0 -4 -13.5 -22.5t-30 -40t-32 -41t-19.5 -25.5q23 -39 39 -92q10 -2 37 -5t55.5 -8.5t51 -11.5t22.5 -14v-178q0 -10 -22.5 -16.5t-51 -11.5t-56.5 -7t-36 -4 q-14 -43 -37 -88q23 -31 44.5 -60.5t48.5 -58.5l2 -10q0 -6 -20.5 -30t-47.5 -50.5t-50.5 -47t-29.5 -20.5q-2 0 -20.5 13.5t-41 31t-42 32.5t-25.5 20q-45 -23 -88 -37q0 -10 -3 -37t-8 -56.5t-12.5 -52t-15.5 -22.5h-178q-8 0 -15.5 22.5t-11.5 52t-7 56t-3 37.5 q-45 12 -88 37q-31 -23 -61.5 -46.5t-59.5 -48.5l-10 -2q-4 0 -27.5 20.5t-49 47t-46 50.5t-20.5 30q0 2 13 20.5t29.5 40t31 41t18.5 25.5q-23 43 -39 94q-10 2 -37 5t-55.5 7t-51 10.5t-22.5 14.5zM420 889q0 -37 14.5 -70t39 -57.5t58 -38.5t70.5 -14t70 14t57.5 38.5 t38.5 57.5t14 70t-14 70.5t-38.5 58t-57.5 39t-70 14.5q-76 0 -129 -53t-53 -129zM1114 373q0 6 13.5 13t31 14.5t33.5 12.5t22 7q4 23 9.5 39t15.5 37q-4 4 -13 17t-18.5 27.5t-16.5 28t-7 17.5t18.5 23.5t43 41t47 40t28.5 24.5l8 4q4 0 16.5 -8.5t25.5 -19.5t25.5 -21.5 t16.5 -14.5q35 12 76 19q2 6 9 21.5t16.5 30.5t17.5 27.5t14 12.5q4 0 34 -7t63.5 -18.5t60.5 -23.5t27 -23q0 -23 -5.5 -47t-9.5 -47q16 -12 28.5 -26.5t22.5 -30.5q25 2 49.5 3t47.5 1q8 0 18 -26.5t17.5 -60.5t12.5 -64.5t5 -39.5q0 -6 -13.5 -13t-29.5 -13t-32.5 -12.5 t-22.5 -8.5q-9 -38 -23 -71q2 -6 11.5 -18.5t18.5 -27t16 -27.5t7 -18q0 -4 -18.5 -23.5t-43 -41t-47 -40.5t-28.5 -26l-8 -4q-4 0 -16.5 8.5t-25.5 19.5t-25.5 21.5t-16.5 14.5q-37 -12 -78 -19q-2 -6 -9 -21.5t-15.5 -30.5t-16.5 -27.5t-14 -12.5t-35 7.5t-62.5 18.5 t-60 23.5t-26.5 22.5q0 23 5 47.5t9 46.5q-16 12 -28.5 26.5t-22.5 30.5q-23 -2 -45.5 -3t-44.5 -1h-14.5t-8.5 11q-2 8 -8 35.5t-13.5 58t-12.5 55.5t-5 29zM1192 1264q0 6 12.5 12t29.5 10t33.5 6t22.5 4q10 33 31 64q-2 4 -8 17.5t-12.5 27.5t-11.5 25.5t-5 15.5 q0 6 21.5 22.5t49 35t51.5 32.5t28 14t13 -9t20.5 -21.5t20.5 -23.5t13 -15q14 4 28.5 6t29.5 0h14q2 4 11 16.5t18.5 25.5t17.5 23.5t12 10.5t30 -11.5t55.5 -26t53 -28.5t23.5 -20q0 -4 -4 -15.5t-8 -26t-8.5 -27.5t-6.5 -17q20 -25 39 -60q51 -4 74 -7t29 -18.5t5 -52 t3 -106.5q0 -6 -12.5 -12.5t-28.5 -10.5t-32.5 -6t-22.5 -4q-13 -36 -31 -63q2 -4 8 -16.5t13.5 -27t12.5 -26.5t5 -14q0 -6 -22.5 -23.5t-50 -36t-51.5 -33t-26 -14.5q-4 0 -14 9.5t-21.5 21.5t-20.5 23.5t-13 15.5q-14 -4 -28.5 -6t-29.5 0h-14q-4 -4 -12 -16.5t-17.5 -26 t-18.5 -23.5t-13 -10t-30 11t-54.5 25.5t-52 29t-23.5 20.5q0 2 3 14.5t8 26.5t9 27.5t6 17.5q-23 23 -38 59q-53 2 -75 5t-29 18.5t-5 52.5t-4 109zM1397 367q0 -49 34.5 -85t84.5 -36q49 0 84.5 34.5t35.5 86.5q0 49 -34.5 83.5t-85.5 34.5q-49 0 -84 -34.5t-35 -83.5z M1446 1206q0 -47 31.5 -78.5t76.5 -31.5q47 0 79 31.5t32 76.5q0 47 -31.5 79t-77.5 32q-47 0 -78.5 -32t-31.5 -77z" />
165
+ <glyph unicode="&#xf086;" horiz-adv-x="1916" d="M0 997q0 119 61.5 222.5t167 180.5t246.5 122t303 45t303.5 -45t247 -122t166.5 -180.5t61 -222.5q0 -117 -61 -221t-166.5 -181t-247 -122t-303.5 -45q-37 0 -73.5 3t-71.5 7q-147 -113 -336 -155q-20 -4 -40.5 -7.5t-43.5 -7.5q-12 -2 -21.5 6.5t-13.5 18.5v2 q-4 12 3 19.5t18 17.5q18 18 34.5 36.5t29.5 42t24.5 55.5t19.5 79q-141 78 -224 195.5t-83 256.5zM649 258q6 4 13.5 8t13.5 8q51 -6 102 -6q197 0 369 56.5t298 155t198.5 231.5t72.5 286q0 41 -6 84q96 -78 151.5 -175t55.5 -208q0 -139 -83 -256.5t-224 -195.5 q8 -47 19 -79t25.5 -55.5t30 -42t33.5 -36.5q10 -10 17.5 -18.5t3.5 -18.5v-2q-2 -12 -12.5 -19.5t-22.5 -5.5q-23 4 -43.5 7.5t-40.5 7.5q-96 20 -180 60t-156 95q-35 -4 -71.5 -7t-73.5 -3q-141 0 -265 35t-225 94z" />
166
+ <glyph unicode="&#xf087;" horiz-adv-x="1597" d="M0 193v643q0 49 35 83.5t84 34.5h348q27 14 43 30.5t35 39.5q16 20 32.5 38.5t34.5 37.5q33 35 76 68.5t66 74.5q16 29 23 64.5t12.5 71.5t12.5 70t23.5 60.5t47 42t81.5 15.5q61 0 111.5 -25.5t85.5 -68.5t54.5 -98.5t19.5 -112.5q0 -59 -17.5 -112.5t-42.5 -107.5 q35 2 70 4.5t70 2.5q55 0 107 -10.5t93 -35t66.5 -67.5t25.5 -109q0 -29 -5 -57t-15 -57q18 -43 18 -90q0 -78 -41 -142q10 -59 -7 -118.5t-58 -104.5q-4 -84 -45 -139.5t-102.5 -89t-135 -47t-143.5 -13.5q-72 0 -144.5 10.5t-142.5 28.5q-70 20 -139.5 43t-142.5 23h-375 q-49 0 -84 34.5t-35 84.5zM236 276q0 -35 22 -57t57 -22q33 0 56.5 22.5t23.5 56.5q0 33 -23.5 56.5t-56.5 23.5q-35 0 -57 -23.5t-22 -56.5zM492 193q70 0 136 -16.5t133.5 -35t141.5 -35t160 -16.5q45 0 98 6t99.5 26.5t78 56.5t31.5 95q0 10 -1 18.5t-3 18.5 q35 16 53.5 53t18.5 74q0 39 -21 68q60 49 60 123q0 23 -12.5 43t-26.5 35q16 29 28.5 57.5t12.5 62.5q0 35 -17.5 55.5t-43 31t-56.5 12.5t-57 2q-45 0 -90.5 -3t-90.5 -3q-31 0 -61.5 3t-58.5 15q0 41 16 78t35.5 74.5t35 78.5t15.5 91q0 33 -10.5 65.5t-29.5 59t-47 44 t-65 17.5h-11t-11 -2q-8 -4 -9 -8t-3 -13q-12 -59 -22.5 -123.5t-39.5 -117.5q-29 -51 -74 -88t-86 -78q-29 -31 -49 -56.5t-41.5 -48t-48.5 -42t-65 -35.5h-2v-643z" />
167
+ <glyph unicode="&#xf088;" horiz-adv-x="1597" d="M0 309q0 29 5 57.5t15 57.5q-18 43 -18 90q0 78 41 141q-10 59 7.5 119t58.5 105q4 84 45 139t102 89t135 47t144 13q72 0 144.5 -10t141.5 -29q70 -20 139.5 -42.5t143.5 -22.5h375q49 0 83.5 -35t34.5 -84v-643q0 -49 -34.5 -84t-83.5 -35h-349q-27 -14 -43 -30.5 t-34 -38.5q-16 -20 -32.5 -39t-35.5 -37q-33 -35 -76 -69t-65 -74q-25 -43 -31 -99.5t-18.5 -106.5t-44 -84t-107.5 -34q-61 0 -111.5 25.5t-85 68.5t-54 98.5t-19.5 112.5q0 59 17.5 112.5t41.5 106.5q-35 -2 -69.5 -4t-69.5 -2q-55 0 -107.5 10.5t-93.5 35t-66.5 67.5 t-25.5 108zM119 309q0 -35 17.5 -55.5t43 -30.5t56 -12t57.5 -2q47 0 91 3t89 3q31 0 61.5 -3t59.5 -15q0 -41 -16.5 -78t-36 -75t-34.5 -79t-15 -90q0 -33 10 -65.5t29.5 -59t47 -43t64.5 -16.5q4 0 11.5 -1t11.5 1q8 4 9 8l3 12q12 59 22.5 124t38.5 118q29 51 74 88 t86 78q29 31 49.5 56.5t42 48t47 42t66.5 35.5h2v643q-72 0 -137.5 16.5t-133 36t-141 36t-159.5 16.5q-45 0 -98.5 -7.5t-99.5 -27t-78 -56t-32 -96.5q0 -10 1 -18t3 -19q-35 -16 -53 -53t-18 -74q0 -39 20 -67q-59 -49 -59 -123q0 -23 12 -43.5t27 -34.5 q-16 -29 -28.5 -57.5t-12.5 -63.5zM1202 860q0 -33 23.5 -56.5t56.5 -23.5q35 0 57.5 23.5t22.5 56.5q0 35 -22.5 57.5t-57.5 22.5q-33 0 -56.5 -22.5t-23.5 -57.5z" />
168
+ <glyph unicode="&#xf089;" horiz-adv-x="837" d="M1 959.5q9 27.5 54 33.5l506 74l227 459q23 41 50 41v-1348l-453 -237q-41 -23 -64.5 -6.5t-15.5 63.5l86 504l-364 356q-35 33 -26 60.5z" />
169
+ <glyph unicode="&#xf08a;" horiz-adv-x="1802" d="M0 1073q0 137 43 231.5t112.5 153t156.5 84t177 25.5q63 0 125 -21.5t115 -53.5t97 -70t75 -68q31 31 76 68.5t98 69.5t113.5 53.5t126.5 21.5q88 0 175 -25.5t156.5 -84t112.5 -153t43 -231.5q0 -94 -34.5 -177t-76.5 -146.5t-79 -102.5t-39 -43l-615 -612 q-26 -23 -57 -23q-33 0 -55 23l-617 614q-4 2 -39.5 41t-77.5 102.5t-77 146.5t-35 177zM160 1073q0 -68 27.5 -131t61.5 -112.5t63 -79.5l28 -29l561 -559l561 559l29 29q29 30 62.5 79.5t61 113t27.5 130.5q0 104 -29.5 169t-77.5 101.5t-106.5 50t-113.5 13.5 q-53 0 -107.5 -25.5t-102.5 -61.5t-86 -74t-56 -60q-25 -31 -62 -31t-61 31q-18 23 -56.5 60.5t-86.5 73.5t-102.5 61.5t-105.5 25.5q-57 0 -115.5 -13.5t-106.5 -50t-77.5 -101t-29.5 -169.5z" />
170
+ <glyph unicode="&#xf08b;" horiz-adv-x="1689" d="M0 307v922q0 63 24.5 118.5t66.5 97.5t97.5 66.5t118.5 24.5h461v-193h-461q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h461v-193h-461q-63 0 -118.5 24.5t-97.5 66.5t-66.5 97.5t-24.5 118.5zM508 584v368q0 33 22.5 54.5t55.5 21.5h428v293 q0 41 39 57q39 14 65 -14l553 -553q18 -18 18.5 -44t-18.5 -42l-553 -553q-18 -18 -43 -18q-10 0 -22 4q-39 16 -39 57v291h-428q-33 0 -55.5 22.5t-22.5 55.5z" />
171
+ <glyph unicode="&#xf08c;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-1150q-80 0 -136.5 56.5t-56.5 136.5zM207 1192q0 -57 40 -97t95 -40q57 0 97 40t40 97q0 55 -40 95t-97 40q-55 0 -95 -40 t-40 -95zM213 240q0 -10 9 -19.5t20 -9.5h200q12 0 20.5 9t8.5 20v706q0 29 -29 29h-200q-10 0 -19.5 -8.5t-9.5 -20.5v-706zM580 240q0 -10 9 -19.5t19 -9.5h201q12 0 20.5 9t8.5 20v383q0 68 26.5 113.5t102.5 45.5q59 0 79.5 -28.5t20.5 -81.5v-432q0 -10 8 -19.5 t21 -9.5h204q10 0 19.5 9t9.5 20v477q0 141 -81 208.5t-216 67.5q-55 0 -107.5 -15t-93.5 -56q0 16 -3 34.5t-25 18.5h-195q-10 0 -19 -8.5t-9 -20.5v-706z" />
172
+ <glyph unicode="&#xf08d;" horiz-adv-x="1916" d="M2 950q8 82 45 172t100 176t139 147.5t152 92.5t145.5 30t121.5 -40q53 -41 73.5 -107.5t12.5 -148.5l301 -225q111 63 215 73t180 -47q55 -41 80.5 -108.5t23.5 -150.5t-30.5 -177t-83.5 -188l428 -410q25 -25 4 -53q-12 -16 -33 -17q-10 0 -18 6l-517 293 q-74 -80 -155.5 -135t-161.5 -80.5t-151.5 -19.5t-127.5 47q-76 55 -95 158.5t9 228.5l-303 223q-76 -33 -145.5 -32t-122.5 40q-51 39 -72.5 104.5t-13.5 147.5zM171 858.5q3 -16.5 15 -27.5q21 -14 50 -14q31 0 65.5 17.5t71.5 46t72.5 66.5t66.5 79q10 14 7 30.5 t-15 26.5q-14 10 -30.5 8.5t-27.5 -16.5q-78 -104 -138 -143t-72 -35q-14 10 -31 7t-27 -15q-10 -14 -7 -30.5zM465 754l364 -271q8 -8 23 -8q20 0 33 17q10 14 8 29.5t-16 25.5l-347 258q-16 -14 -32.5 -27.5t-32.5 -23.5zM829.5 239.5q1.5 -16.5 16.5 -26.5q29 -23 69 -23 q41 0 88.5 21.5t95.5 57.5t94 84.5t87 101.5q10 12 8 28.5t-16 26.5q-12 10 -28.5 8t-26.5 -16q-51 -68 -102.5 -116t-95.5 -75.5t-78 -36t-48 4.5q-14 10 -29.5 7t-25.5 -18q-10 -12 -8.5 -28.5z" />
173
+ <glyph unicode="&#xf08e;" d="M0 307v922q0 63 24.5 119.5t65.5 97.5t97.5 65.5t119.5 24.5h582q-2 -14 -4 -27.5t-2 -29.5v-88q0 -23 6 -48h-582q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h1075q47 0 81 33.5t34 80.5v340q41 -31 90 -49t103 -20v-271q0 -63 -25 -118.5 t-67 -97.5t-97 -66.5t-119 -24.5h-1075q-63 0 -119.5 24.5t-97.5 66.5t-65.5 97.5t-24.5 118.5zM692.5 522q-0.5 25 16.5 41l770 772h-269q-25 0 -41 16.5t-16 41.5v86q-2 23 15.5 40t41.5 17h576q23 0 40 -17.5t17 -39.5v-86v-490q0 -25 -17.5 -42t-39.5 -15h-86 q-25 0 -41.5 16.5t-16.5 40.5v268l-772 -770q-16 -16 -40.5 -16t-41.5 16l-79 80q-16 16 -16.5 41z" />
174
+ <glyph unicode="&#xf090;" horiz-adv-x="1689" d="M0 584v368q0 33 22.5 54.5t55.5 21.5h428v293q0 41 37 57q39 14 67 -14l553 -553q16 -18 16.5 -44t-16.5 -42l-553 -553q-18 -18 -43 -18q-8 0 -24 4q-37 16 -37 57v291h-428q-33 0 -55.5 22.5t-22.5 55.5zM922 0v193h460q47 0 81 33.5t34 80.5v922q0 47 -33.5 80.5 t-81.5 33.5h-460v193h460q63 0 118.5 -24.5t97.5 -65.5t67 -97.5t25 -119.5v-922q0 -63 -25 -118.5t-67 -97.5t-97 -66.5t-119 -24.5h-460z" />
175
+ <glyph unicode="&#xf091;" horiz-adv-x="1689" d="M0 1042v187q0 33 22.5 54.5t55.5 21.5h323q-2 12 -2 25v24v4q0 53 4.5 88t15.5 54.5t31.5 27.5t55.5 8h678q33 0 54.5 -8t32.5 -27.5t15 -54.5t4 -88v-25.5t-2 -27.5h324q33 0 55.5 -21.5t22.5 -54.5v-187q0 -63 -45.5 -130.5t-122 -128t-180 -106.5t-222.5 -65 q-51 -10 -91 -41.5t-40 -70.5q0 -35 17.5 -51.5t39 -31t40 -31.5t22.5 -52q4 -23 -2 -47q-4 -14 23.5 -23.5t67.5 -18.5t82 -22.5t64 -34.5q12 -10 19.5 -39.5t9.5 -64.5q2 -33 -6 -58.5t-29 -25.5h-985q-20 0 -28.5 25.5t-6.5 58.5q2 35 9.5 64.5t19.5 39.5q23 20 64 34 t80.5 23t68.5 18t25 24q-4 14 -4 25.5v21.5q2 35 21.5 52t42 31.5t39.5 31t17 51.5q0 39 -39.5 70.5t-93.5 41.5q-117 20 -220 66.5t-180 106t-122 127t-45 130.5zM154 1042q0 -20 23.5 -54t67.5 -70.5t106.5 -71.5t140.5 -60q-25 80 -44.5 175.5t-33.5 189.5h-260v-109z M1198 786q78 25 140.5 60t106.5 71.5t67.5 70.5t23.5 54v109h-262q-12 -94 -31.5 -189.5t-44.5 -175.5z" />
176
+ <glyph unicode="&#xf092;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-337v25q0 39 2 97t-3.5 115.5t-24.5 104.5t-65 66q188 20 290 110t102 287q0 66 -22.5 128t-67.5 114q6 23 8 45t2 45 q0 41 -9.5 91t-31.5 85h-12q-43 2 -79 -8.5t-68 -27.5t-62.5 -37.5t-65.5 -39.5q-33 4 -65.5 6t-65.5 2t-65.5 -2t-65.5 -6q-35 18 -65.5 39t-62.5 38t-67.5 27.5t-79.5 8.5h-12q-23 -35 -32 -85t-9 -91q0 -23 2 -45.5t8 -44.5q-45 -51 -66.5 -114t-21.5 -128 q0 -193 95.5 -283t281.5 -112q-39 -16 -59.5 -50t-32.5 -75q-27 -8 -49.5 -15.5t-50.5 -7.5q-55 0 -88 28.5t-59.5 62.5t-56.5 62.5t-79 28.5q-4 0 -20.5 -2t-16.5 -12q0 -23 19.5 -32t31.5 -19q39 -31 56.5 -71t39 -76.5t62.5 -62.5t127 -26q35 0 80 11q0 -10 -1 -18.5 t-1 -16.5q0 -29 2 -59.5t-2 -59.5h-317q-80 0 -136.5 56.5t-56.5 136.5z" />
177
+ <glyph unicode="&#xf093;" d="M0 39v614q0 16 11.5 27.5t27.5 11.5h229q16 0 27.5 -11t11.5 -28v-346h1229v346q0 16 11.5 27.5t27.5 11.5h229q16 0 27.5 -11t11.5 -28v-614q0 -39 -39 -39h-1765q-39 0 -39 39zM346 969.5q-6 15.5 16 38.5l504 505q23 23 55.5 23t55.5 -23l506 -505q23 -23 15.5 -38.5 t-38.5 -15.5h-307v-499q0 -33 -22.5 -55.5t-55.5 -22.5h-307q-33 0 -54.5 22.5t-21.5 55.5v499h-307q-33 0 -39 15.5z" />
178
+ <glyph unicode="&#xf094;" horiz-adv-x="1609" d="M2 514q-2 35 1 68.5t7 74.5q4 35 7 72t10 66q14 66 30.5 128t44.5 117q20 41 45 81t54 79q10 14 21 24.5t24 20.5q23 23 45 45.5t49 42.5t57.5 36.5t65.5 33.5q33 16 67.5 29.5t71.5 27.5q70 29 156 51l2 2q45 12 85 17.5t79 5.5q59 0 112.5 -9t106.5 -20q41 -8 85 -15 t93 -7h2q29 0 62.5 5t66.5 5q25 0 45.5 -6t32.5 -25q23 -31 26 -71.5t-2 -75.5q-4 -35 -8 -71t2 -72q4 -23 11.5 -39.5t15.5 -36.5q8 -18 11 -40t7 -42q18 -104 15.5 -195.5t-23 -170.5t-56.5 -148.5t-81 -132.5q-37 -49 -79 -97.5t-92 -91.5t-110.5 -77.5t-134.5 -59.5 q-76 -27 -158.5 -34t-158.5 -11h-31q-104 0 -194.5 16.5t-192.5 16.5h-4q-35 0 -77 -10.5t-83 -12.5h-2q-37 0 -65.5 17.5t-42.5 42.5q-20 35 -17.5 72.5t12.5 68.5t10.5 66.5t-5 75.5t-12.5 81t-9 82z" />
179
+ <glyph unicode="&#xf095;" horiz-adv-x="1597" d="M0 1169q0 55 14.5 114.5t43 114t68.5 98.5t93 69q12 -2 26.5 0t26.5 2q10 0 30 -1l40 -2t38.5 -4.5t27.5 -7.5q8 -6 15 -18t12 -26.5t9.5 -30t8.5 -25.5q6 -18 23.5 -65.5t35.5 -97.5t32.5 -93t14.5 -53q0 -37 -24.5 -68t-54 -57.5t-54.5 -50t-25 -45.5q0 -20 16.5 -49 t26.5 -46q84 -145 188.5 -248.5t252.5 -187.5q18 -10 45.5 -27.5t50.5 -17.5t52.5 32t60 70.5t62 70.5t58.5 32q10 0 51.5 -22.5t89.5 -50t93 -55.5t61 -36q16 -10 46 -25.5t40 -35.5q2 -6 2 -23q0 -16 -3 -36.5t-8 -43t-12 -43t-13 -35.5q-18 -39 -59.5 -71.5t-92.5 -55 t-104.5 -36t-92.5 -13.5q-80 0 -153.5 25.5t-145.5 54.5q-123 45 -232.5 118t-203.5 164t-175 196.5t-144 215.5q-25 41 -52.5 95.5t-51 112t-39 113.5t-15.5 105z" />
180
+ <glyph unicode="&#xf096;" d="M0 307v922q0 63 24.5 118.5t66.5 97.5t97.5 66.5t118.5 24.5h1075q63 0 118.5 -24.5t97.5 -66.5t67 -97.5t25 -118.5v-922q0 -63 -25 -118.5t-67 -97.5t-97 -66.5t-119 -24.5h-1075q-63 0 -118.5 24.5t-97.5 66.5t-66.5 97.5t-24.5 118.5zM193 307q0 -47 33.5 -80.5 t80.5 -33.5h1075q47 0 81 33.5t34 80.5v922q0 47 -34 80.5t-81 33.5h-1075q-47 0 -80.5 -33.5t-33.5 -80.5v-922z" />
181
+ <glyph unicode="&#xf097;" horiz-adv-x="1253" d="M0 84v1337q0 47 34 81t81 34h1024q47 0 80.5 -34t33.5 -81v-1337q0 -47 -33.5 -81t-80.5 -34t-80 33l-432 432l-432 -432q-33 -33 -80 -33t-81 34t-34 81zM158 186l469 471l469 -471v1194h-938v-1194z" />
182
+ <glyph unicode="&#xf098;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-1150q-80 0 -136.5 56.5t-56.5 136.5zM193 1040q2 -35 15 -76.5t30 -78.5q16 -37 33.5 -72t33.5 -63q74 -129 176.5 -241 t225.5 -190q31 -18 67.5 -36.5t75.5 -32.5q41 -16 83 -31.5t81 -21.5q63 -10 112.5 2t90.5 34q27 12 57.5 33.5t44.5 52.5q4 8 9 27t9 38t6.5 37.5t-2.5 29.5q-4 12 -24.5 22t-36.5 21q-43 25 -71.5 41t-67.5 38q-16 10 -36 23.5t-38 13.5q-23 0 -46.5 -27.5t-37.5 -43.5 q-12 -14 -36.5 -43t-47.5 -31q-14 -2 -32.5 10t-37.5 23q-106 59 -182 136t-135 177q-10 16 -21.5 37.5t-7.5 38.5q2 18 24.5 33.5t35.5 29.5q14 16 31.5 37t19.5 43q4 16 -5 38t-16 42q-16 43 -28.5 76t-26.5 76q-6 16 -12 40.5t-21 30.5q-8 4 -26.5 7t-39 4.5t-37.5 0 t-24 -1.5h-8q-33 -16 -62.5 -45.5t-51 -69.5t-34 -88t-9.5 -100z" />
183
+ <glyph unicode="&#xf099;" d="M0 399q0 20 13.5 33.5t33.5 13.5q14 0 31 -12q123 -109 287 -108q59 0 117.5 15t107.5 48q-29 16 -47.5 42t-18.5 58q0 23 8 39q-18 6 -44.5 20.5t-51 34t-41 43t-16.5 46.5q0 16 10 28.5t25 22.5q-41 25 -76 74t-35 98q0 33 33 43q-35 35 -55.5 81t-20.5 95 q0 23 9.5 41.5t37.5 18.5q18 0 84 -27t142.5 -60.5t146.5 -67.5t98 -48q25 -14 47.5 -31.5t44.5 -36.5q20 51 47 106.5t60 106.5t73 96t89 74q8 6 24 6q18 0 27 -8q16 6 41.5 13.5t42.5 7.5q29 0 43 -27q31 0 56.5 -15.5t25.5 -50.5q0 -31 -27 -53q96 -43 159.5 -125 t90.5 -182q6 -2 23 -2q47 0 88 16.5t57 16.5q18 0 31.5 -14.5t13.5 -32.5q0 -23 -19.5 -48.5t-33.5 -39.5q23 4 42 -7.5t19 -38.5q0 -29 -26.5 -50t-61.5 -37.5t-72.5 -25.5t-58.5 -11q-43 -139 -133 -246t-210 -178.5t-258 -109.5t-275 -38q-219 0 -415 93.5t-325 273.5 q-8 16 -8 26z" />
184
+ <glyph unicode="&#xf09a;" horiz-adv-x="790" d="M0 862v203q0 16 11.5 28.5t27.5 12.5h125v102q0 358 366 359q123 0 232 -31q33 -10 29 -43l-27 -199q-4 -16 -16 -26q-16 -10 -31 -6q-35 8 -72.5 12t-66.5 4q-53 0 -65.5 -16.5t-12.5 -67.5v-88h223q14 0 29 -14q10 -10 10 -29l-17 -205q0 -16 -11 -25.5t-27 -9.5h-207 v-784q0 -16 -11.5 -27.5t-27.5 -11.5h-258q-16 0 -27.5 11.5t-11.5 27.5v784h-125q-16 0 -27.5 11.5t-11.5 27.5z" />
185
+ <glyph unicode="&#xf09b;" horiz-adv-x="1847" d="M0 743q0 115 37 222.5t113 193.5l-3 4l3 2q-16 39 -21.5 81t-5.5 85q0 25 2 56.5t8 65.5t15.5 63.5t23.5 50.5h8q61 0 110.5 -12.5t94.5 -35t87 -52t91 -60.5q86 25 178.5 33t182.5 8t182 -8t180 -33q47 31 90 60.5t87 52t93.5 35t110.5 12.5h10q12 -20 21.5 -50 t15.5 -64t9 -65.5t3 -56.5q0 -43 -6 -85t-20 -81v-2l-2 -4q76 -86 112.5 -193.5t36.5 -222.5q0 -233 -66.5 -383.5t-188.5 -236.5t-292 -120t-376 -34q-207 0 -378 34t-292 120t-187.5 236.5t-66.5 383.5zM250 483q0 -145 64.5 -224t165 -116t219 -43t227.5 -6q74 0 152.5 2 t153.5 12.5t142.5 34t117.5 67.5t80 111.5t30 165.5q0 84 -27 147.5t-75 106.5t-114.5 64.5t-146.5 21.5q-78 0 -156.5 -7t-156.5 -7t-157 7t-157 7q-162 0 -262 -87t-100 -257zM494 524q0 66 26.5 113t65.5 47t66.5 -47t27.5 -113t-27.5 -112.5t-66.5 -46.5t-65.5 46.5 t-26.5 112.5zM795 258q-6 16 12 25q16 6 24 -13q27 -76 93 -75q31 0 56.5 20.5t35.5 54.5q8 20 26 13q16 -6 13 -25q-16 -47 -51 -75.5t-80 -28.5q-43 0 -78 28.5t-51 75.5zM864 369q0 -12 17.5 -21.5t42.5 -9.5t42 9.5t17 21.5t-17.5 21t-41.5 9q-25 0 -42.5 -9t-17.5 -21z M1167 524q0 -66 28 -112.5t67 -46.5t65.5 46.5t26.5 112.5t-27 113t-65 47q-39 0 -67 -47t-28 -113z" />
186
+ <glyph unicode="&#xf09c;" horiz-adv-x="1880" d="M0 117v626q0 49 35 84t82 35h665v156q0 113 43 213t118 175t175 118t213 43t213.5 -43t175 -118t117.5 -175.5t43 -212.5v-152q0 -33 -22.5 -55.5t-55.5 -22.5h-80q-33 0 -55 23t-22 55v152q0 66 -25 123t-67 99t-99 66.5t-123 24.5t-122 -24.5t-99 -66.5t-67.5 -99.5 t-24.5 -122.5v-156h119q47 0 81.5 -34.5t34.5 -84.5v-626q0 -47 -34.5 -82t-81.5 -35h-1020q-47 0 -82 35t-35 82zM494 164h266l-66 285q29 18 47.5 48.5t18.5 65.5q0 55 -39 95t-94 40t-94 -40t-39 -95q0 -35 18 -65.5t47 -46.5z" />
187
+ <glyph unicode="&#xf09d;" d="M0 154v1228q0 63 45 108.5t109 45.5h1536q63 0 108 -45t45 -109v-1228q0 -63 -45 -108.5t-108 -45.5h-1536q-63 0 -108.5 45t-45.5 109zM154 154h1536v575h-1536v-575zM154 1114h1536v268h-1536v-268zM260 250v115h307v-115h-307zM676 250v115h446v-115h-446z" />
188
+ <glyph unicode="&#xf09e;" horiz-adv-x="1566" d="M0 236q0 49 18.5 91t50 74.5t75 51t92.5 18.5t91 -18.5t74.5 -51t51 -74.5t18.5 -91t-18.5 -92.5t-51 -75t-74.5 -50t-91 -18.5t-92.5 18.5t-75 50t-50 74.5t-18.5 93zM0 819v158q0 35 25 57q23 23 53 23q2 0 3 -1t3 -1q193 -14 362.5 -95t301 -212.5t212 -301.5 t95.5 -362q4 -35 -21 -59q-23 -25 -57 -25h-158q-29 0 -51.5 20.5t-26.5 51.5q-12 133 -68.5 249.5t-145.5 205.5t-205.5 145.5t-249.5 68.5q-31 4 -51.5 27t-20.5 51zM0 1331v158q0 33 25 55q23 23 53 23h4q301 -16 565 -137t463 -320t319.5 -463t137.5 -565q4 -31 -23 -57 q-23 -25 -55 -25h-158q-31 0 -53.5 21.5t-24.5 52.5q-14 238 -110 446.5t-255 367.5t-368 255t-446 110q-31 2 -52.5 24.5t-21.5 53.5z" />
189
+ <glyph unicode="&#xf0a0;" d="M0 193v382q0 23 6 45.5t12 45.5l238 727q20 63 75.5 103t121.5 40h938q66 0 121 -40t75 -103l238 -727q6 -23 12 -45.5t6 -45.5v-382q0 -41 -15.5 -76t-41 -60.5t-61 -41t-74.5 -15.5h-1458q-80 0 -136.5 56.5t-56.5 136.5zM154 193q0 -16 11 -27.5t28 -11.5h1458 q16 0 27.5 11t11.5 28v382q0 16 -11.5 27.5t-27.5 11.5h-1458q-16 0 -27.5 -11t-11.5 -28v-382zM213 768h1417l-188 578q-4 16 -19.5 26t-31.5 10h-938q-16 0 -31.5 -10t-20.5 -26zM1057 385q0 39 27.5 66.5t68.5 27.5q39 0 66.5 -27.5t27.5 -66.5q0 -41 -27.5 -68.5 t-66.5 -27.5q-41 0 -68.5 27.5t-27.5 68.5zM1364 385q0 39 27.5 66.5t68.5 27.5q39 0 66.5 -27.5t27.5 -66.5q0 -41 -27.5 -68.5t-66.5 -27.5q-41 0 -68.5 27.5t-27.5 68.5z" />
190
+ <glyph unicode="&#xf0a1;" d="M0 754v229q0 63 45 108.5t109 45.5h499q115 0 245 33.5t255 90t235.5 128t186.5 147.5q63 0 108.5 -45t45.5 -109v-368q49 -12 81.5 -52.5t32.5 -93.5t-32.5 -93t-81.5 -52v-369q0 -63 -45.5 -108t-108.5 -45q-68 68 -164 132t-206.5 117.5t-227.5 91.5t-227 50 q-43 -12 -70 -40t-37 -62.5t-2 -70.5t37 -65q-25 -41 -23 -75.5t20.5 -66.5t49.5 -61.5t66 -58.5q-20 -43 -69.5 -65.5t-106 -25.5t-110.5 10.5t-85 43.5q-18 61 -40 125t-36 130.5t-14 138t24 151.5h-200q-63 0 -108.5 45t-45.5 109zM807 741q102 -16 206.5 -49t205 -78 t191.5 -99t165 -112v930q-76 -59 -166 -113.5t-190.5 -98.5t-205 -77.5t-206.5 -48.5v-254z" />
191
+ <glyph unicode="&#xf0a2;" horiz-adv-x="1759" d="M0 317q104 78 172 172.5t109 201t60 224t28 240.5q6 84 56 159t126 131t163 89t167 33q74 0 163 -33t165.5 -88t129 -129t52.5 -158q6 -121 27.5 -239.5t63.5 -227t109.5 -204t167.5 -171.5q-4 -70 -56 -114.5t-120 -44.5h-469q-18 -82 -82.5 -135.5t-150.5 -53.5 t-151.5 53.5t-84.5 135.5h-469q-68 0 -120 45t-56 114zM238 317h1284q-78 86 -129.5 183.5t-84 202t-50 214t-25.5 222.5q-4 55 -41 104t-89 86t-111.5 57.5t-110.5 20.5q-47 0 -107.5 -21.5t-114 -56.5t-91.5 -83t-40 -99q-6 -111 -23.5 -222.5t-51 -218t-87 -205 t-128.5 -184.5zM713 209q0 -70 49 -119t119 -49q18 0 18 20t-18 21q-53 0 -91 37t-38 90q0 20 -19 20q-20 0 -20 -20z" />
192
+ <glyph unicode="&#xf0a3;" horiz-adv-x="1597" d="M0 573q0 33 23 56l143 139l-143 139q-23 23 -23 56q0 25 16.5 45t40.5 26l195 49q-6 18 -15.5 48t-18.5 61t-16 59.5t-7 46.5q0 31 21.5 52.5t51.5 21.5q18 0 47 -7t60 -16.5t60.5 -18.5t47.5 -15l49 194q6 25 27 41.5t45 16.5q35 0 53 -23l142 -143l139 143q23 23 53 23 q27 0 47.5 -15.5t26.5 -42.5l49 -194q18 6 48 15t60.5 18.5t59.5 16.5t47 7q29 0 51.5 -21.5t22.5 -52.5q0 -18 -7 -46.5t-16.5 -59.5t-18.5 -60.5t-15 -48.5l194 -49q25 -6 41 -26.5t16 -44.5q0 -33 -22 -56l-145 -139l145 -139q23 -23 22 -56q0 -25 -16 -45t-41 -26 l-194 -49q6 -18 15 -48t18.5 -61t16.5 -59.5t7 -46.5q0 -29 -21.5 -51.5t-52.5 -22.5q-18 0 -47 7t-59.5 16.5t-60 18.5t-48.5 15l-49 -194q-6 -25 -26.5 -41.5t-45.5 -16.5q-33 0 -55 23l-139 143l-142 -143q-18 -23 -53 -23q-25 0 -45 16.5t-27 41.5l-49 194 q-18 -6 -47.5 -15t-60.5 -18.5t-59.5 -16.5t-47.5 -7q-31 0 -52 22.5t-21 51.5q0 18 7 46.5t16 59.5t18.5 60.5t15.5 48.5l-195 49q-25 6 -41 26.5t-16 44.5z" />
193
+ <glyph unicode="&#xf0a4;" horiz-adv-x="1916" d="M0 193v643q0 49 35 83.5t84 34.5h348q27 14 42 30.5t34 39.5q16 20 33.5 38.5t33.5 37.5q35 35 77 68.5t65 74.5q25 43 29.5 99.5t17 106.5t44 84t109.5 34q61 0 111.5 -25.5t85.5 -68.5t54.5 -98.5t19.5 -112.5q0 -53 -15.5 -104.5t-38.5 -98.5h134l376 -2 q49 0 93.5 -17.5t76 -49.5t50 -75t18.5 -94q0 -49 -18.5 -92t-50 -74.5t-75.5 -49t-94 -17.5h-200q-10 -59 -39 -107q10 -59 -7.5 -117.5t-56.5 -103.5q0 -76 -28.5 -131t-75.5 -90t-109.5 -52.5t-132.5 -17.5q-78 0 -148.5 16.5t-136 36t-128 36t-123.5 16.5h-375 q-49 0 -84 34.5t-35 84.5zM233 276q0 -35 22.5 -57t57.5 -22q33 0 56.5 22.5t23.5 56.5q0 33 -23.5 56.5t-56.5 23.5q-35 0 -57.5 -23.5t-22.5 -56.5zM489 193q70 0 136.5 -16.5t133 -35t133 -35t138.5 -16.5q43 0 84 8t72 27.5t50 52.5t19 82q0 14 -1 26.5t-3 24.5 q35 16 53.5 53t18.5 74q0 39 -20 68q59 49 59 123q0 23 -12.5 43.5t-26.5 34.5q90 0 178 1t178 1q51 0 84 30.5t33 81.5q0 53 -32.5 85t-84.5 32q-172 0 -340 1t-338 1q0 41 16.5 78t35 74.5t34 78.5t15.5 91q0 33 -10.5 65.5t-29 59t-46 44t-64.5 17.5h-11t-11 -2 q-8 -4 -9 -8t-3 -13q-12 -59 -22.5 -123.5t-39.5 -117.5q-29 -51 -73 -88t-85 -78q-29 -31 -49 -56.5t-41.5 -48t-48.5 -42t-65 -35.5h-5v-643z" />
194
+ <glyph unicode="&#xf0a5;" horiz-adv-x="1916" d="M0 821q0 51 18.5 94t50 75t75.5 49.5t94 17.5l376 2h134q-23 47 -38.5 98t-15.5 105q0 57 19.5 112.5t54.5 98.5t85 68.5t112 25.5q78 0 109.5 -34t43.5 -84t17.5 -106.5t29.5 -99.5q23 -41 65 -74.5t77 -68.5q16 -18 33.5 -37t33.5 -39q18 -23 33.5 -39t42.5 -31h348 q49 0 84 -34.5t35 -83.5v-643q0 -49 -35 -84t-84 -35h-375q-61 0 -123.5 -16.5t-128 -36t-136 -36t-148.5 -16.5q-70 0 -132.5 17.5t-109.5 52.5t-75.5 90t-28.5 131q-39 45 -56.5 103.5t-7.5 117.5q-29 47 -39 107h-200q-49 0 -93.5 17.5t-76 49t-50 74.5t-18.5 92z M121 821q0 -51 32.5 -81.5t84.5 -30.5q90 0 178 -1t178 -1q-14 -14 -26.5 -35t-12.5 -43q0 -74 59 -123q-20 -29 -20 -68q0 -37 18.5 -73.5t53.5 -53.5q-2 -12 -3 -24.5t-1 -26.5q0 -49 19 -82t50 -52.5t72 -27.5t84 -8q70 0 137.5 16.5t134 35t133 35t135.5 16.5v643h-4 q-41 16 -66.5 35.5t-47 42t-42 48t-48.5 56.5q-41 41 -85 78t-73 88q-29 53 -39 117.5t-23 123.5q-2 8 -3 12.5t-9 8.5q-4 2 -11 2h-11q-37 0 -65 -17.5t-46 -44t-28.5 -59.5t-10.5 -65q0 -49 15.5 -90.5t34 -79t34.5 -74.5t16 -78q-170 0 -337.5 -1t-339.5 -1 q-51 0 -84 -32t-33 -85zM1524 276q0 -35 23.5 -57t56.5 -22q35 0 57 22.5t22 56.5q0 33 -22.5 56.5t-56.5 23.5q-33 0 -56.5 -23.5t-23.5 -56.5z" />
195
+ <glyph unicode="&#xf0a6;" horiz-adv-x="1597" d="M0 602q0 61 25.5 111.5t68.5 85.5t98.5 54t112.5 19q53 0 104.5 -15t98.5 -38v133l2 377q0 49 17.5 93t49 76t74.5 50.5t94 18.5q49 0 92.5 -18.5t75 -50.5t49 -76t17.5 -93v-201q59 -10 106 -38q59 10 118 -7.5t104 -56.5q76 0 131 -28.5t90 -76t52 -109.5t17 -132 q0 -78 -16 -148.5t-35.5 -136t-36 -128t-16.5 -124.5v-374q0 -49 -35 -84t-84 -35h-643q-49 0 -84 34.5t-35 84.5v348q-14 27 -30.5 42t-38.5 34q-20 16 -39 33.5t-37 33.5q-35 35 -68.5 77t-74.5 64q-43 25 -99.5 30t-106.5 17.5t-84 44t-34 109.5zM120 591q-1 -7 1 -11 q4 -8 8 -9.5t12 -3.5q59 -12 124 -22t118 -39q51 -29 88 -73t78 -85q31 -29 56.5 -49t48 -41.5t42 -48.5t35.5 -66v-4h643q0 70 16.5 136.5t35 133t35 133t16.5 138.5q0 43 -8.5 84t-28 71.5t-52 50t-81.5 19.5q-14 0 -26.5 -1t-25.5 -3q-16 35 -53 53.5t-74 18.5 q-39 0 -67 -21q-49 59 -123 60q-23 0 -43.5 -12.5t-34.5 -26.5q0 90 -1 178t-1 178q0 51 -30.5 84t-82.5 33q-53 0 -84.5 -33t-31.5 -84q0 -172 -1 -340t-1 -338q-41 0 -78 16.5t-75 35t-79 34t-90 15.5q-33 0 -65.5 -10.5t-59 -29t-43 -46t-16.5 -64.5q0 -4 -1 -11z M1210 -37q0 -35 23.5 -57.5t56.5 -22.5q35 0 57.5 22.5t22.5 57.5q0 33 -22.5 56.5t-57.5 23.5q-33 0 -56.5 -23.5t-23.5 -56.5z" />
196
+ <glyph unicode="&#xf0a7;" horiz-adv-x="1597" d="M0 584q0 78 34 109.5t84 44t106.5 17.5t99.5 29q41 23 74.5 65t68.5 77q18 16 36.5 33.5t39.5 33.5q23 18 39 33.5t30 42.5v348q0 49 35 84t84 35h643q49 0 84 -35t35 -84v-375q0 -61 16.5 -123.5t36 -128t35.5 -136t16 -148.5q0 -70 -17 -132.5t-52 -109.5t-90.5 -75.5 t-130.5 -28.5q-45 -39 -103.5 -56.5t-118.5 -7.5q-47 -29 -106 -39v-200q0 -49 -17.5 -93.5t-49 -76t-74.5 -50t-93 -18.5q-51 0 -94 18.5t-74.5 50t-49 75.5t-17.5 94l-2 376v134q-47 -23 -98.5 -38.5t-104.5 -15.5q-57 0 -112.5 19.5t-98.5 54.5t-68.5 85t-25.5 112z M120 595q1 -7 1 -11q0 -37 16.5 -64.5t43 -46t59 -29t65.5 -10.5q49 0 90 15.5t79 34t75 35t78 16.5q0 -170 1 -338t1 -340q0 -51 31.5 -84t84.5 -33q51 0 82 32.5t31 84.5q0 90 1 178t1 178q14 -14 34.5 -26.5t43.5 -12.5q74 0 123 59q29 -20 67 -20q37 0 74 18.5t53 53.5 q12 -2 24.5 -3t27.5 -1q49 0 81.5 19t52 50t28 72t8.5 84q0 70 -16.5 137.5t-35 134t-35 133t-16.5 136.5h-643v-5q-16 -41 -35.5 -66.5t-42 -47t-48 -42t-56.5 -48.5q-41 -41 -78 -85t-88 -73q-53 -29 -117.5 -39t-124.5 -23l-12 -3t-8 -9q-2 -4 -1 -11zM1210 1223 q0 -33 23.5 -56.5t56.5 -23.5q35 0 57.5 23.5t22.5 56.5q0 35 -22.5 57.5t-57.5 22.5q-33 0 -56.5 -23t-23.5 -57z" />
197
+ <glyph unicode="&#xf0a8;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -29 20 -49l490 -490q20 -20 48.5 -20t49.5 20l74 74q20 20 20 48 t-20 50l-246 246h612q29 0 49.5 19.5t20.5 48.5v104q0 29 -20.5 49.5t-49.5 20.5h-612l246 246q20 20 20 48.5t-20 49.5l-74 74q-20 20 -48 20t-50 -20l-490 -490q-20 -20 -20 -49z" />
198
+ <glyph unicode="&#xf0a9;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 717q0 -29 20.5 -49.5t48.5 -20.5h613l-246 -246q-20 -20 -20.5 -48.5 t20.5 -49.5l74 -74q20 -20 47.5 -20t50.5 20l489 490q20 20 20.5 49t-20.5 49l-489 490q-20 20 -49 20t-49 -20l-74 -74q-20 -20 -20.5 -48t20.5 -50l246 -246h-613q-29 0 -49 -19.5t-20 -48.5v-104z" />
199
+ <glyph unicode="&#xf0aa;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -29 20 -49l74 -74q20 -20 48 -20t50 20l246 246v-612q0 -29 19.5 -49.5 t47.5 -20.5h105q29 0 49.5 20.5t20.5 49.5v612l245 -246q20 -20 49 -20t50 20l73 74q20 20 20.5 48t-20.5 50l-489 490q-20 20 -49 20t-49 -20l-490 -490q-20 -20 -20 -49z" />
200
+ <glyph unicode="&#xf0ab;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 769q0 -28 20 -50l490 -490q20 -20 48.5 -20t49.5 20l489 490q20 20 20.5 49 t-20.5 49l-73 74q-20 20 -48 20t-51 -20l-245 -246v612q0 29 -19.5 49.5t-48.5 20.5h-104q-29 0 -49.5 -20.5t-20.5 -49.5v-612l-246 246q-20 20 -49 20t-49 -20l-74 -74q-20 -20 -20 -48z" />
201
+ <glyph unicode="&#xf0ac;" horiz-adv-x="1597" d="M0 768q0 162 63.5 307.5t173 255t254 173t308.5 63.5q162 0 307 -63.5t254.5 -173t173 -255t63.5 -307.5q0 -164 -63.5 -308.5t-173 -254t-254.5 -173t-307 -63.5q-164 0 -308.5 63.5t-254 173t-173 254t-63.5 308.5zM186 1141h4q4 0 12.5 3t8.5 -9q0 -4 -3 -10.5 t11 -6.5q4 0 5 6t3 0l4 -16v-2q0 -4 -5 -6t-3 -6q4 -4 9.5 -4h9.5l4 2l2 2q0 -6 6 -8.5t10 -2.5h2q0 -2 -4 -4t0 -6l23 -4v-2l14 -29q0 -4 -3 -10t-7 -6t-3 3t1 7t-2 7t-15 3q-2 0 -5 -1t-1 -5l12 -26l3 -2l2 -2q-10 0 -13.5 -24t-3.5 -34l4 -18l2 -6v-4l-4 -19l29 -43h6 q2 -4 -2 -8t-2 -8l8 -8q0 -10 4 -14.5t13 -12.5q-2 -12 20.5 -22.5t28.5 -14.5q8 -23 20 -45.5t29 -38.5l2 -14q0 -2 -5 -4t-1 -6l16 -7q4 4 10.5 -8t10.5 -16l-2 -6l12 -17l6 -2l4 8q-4 10 -14 26.5t-20.5 32t-17.5 28t-7 14.5t-2 16t-4 17q6 -4 15 -7.5t15 -7.5 q4 -25 19.5 -40t27.5 -34q-4 -4 0 -5t7 -1q4 -4 4 -14q14 -16 36.5 -44t22.5 -44v-2l-4 -14q6 -16 20.5 -25.5t28.5 -15.5h4q20 -10 41 -21.5t43 -19.5l23 14q8 -2 17 -10t20.5 -18.5t27 -19.5t35.5 -11q14 10 14 -5v-4l25 -30l4 -15q10 -6 20.5 -15t16.5 -20h4 q10 0 16.5 -9t16.5 -9q6 0 6 6q0 14 2 18.5t5 5.5t6 1t3 4l-4 6q-4 0 -6 -5t-6 -1l-14 -8l-17 4l-24 41l8 57q2 4 -7.5 9t-5.5 10q-14 8 -34 8q-4 0 -20.5 -3t-16.5 3t3 16t7 21.5t6 19.5t2 10l13 27l-3 4l-16 4q-4 0 -13 -6t-17.5 -14.5t-14.5 -16.5t-6 -14l-45 -10 q-14 0 -23 12q-4 16 -17 35.5t-13 34.5q0 23 8 43t-6 43q2 0 5 2t1 6l12 14l2 2l2 -2q14 10 37 7t29 14l16 -13q4 -2 9 4.5t5 10.5l-8 4l39 10l2 -6l19 2l22 -14q4 0 8 5t9 1l20 -21q-4 -8 -1 -12t3 -8q0 -6 10.5 -27.5t18.5 -21.5q10 0 9 13t-1 17q0 20 -8 39t-15 39v6 q0 10 12.5 17.5t12.5 9.5q10 8 22.5 16t18.5 19l8 16v10h6t4 6q0 2 -3 3.5t-7 5.5q-4 2 -8 6l6 4q4 6 6 15t-2 16l15 8q-2 -6 4 -8t10 0l10 16q-4 10 -5 7t5 7q10 4 19.5 9.5t19.5 5.5q2 -2 4 -2q6 0 6 2q0 10 -4 12l12 25q14 0 21 12l18 2q6 2 6 8v2l35 10l4 11l-10 14 q2 0 2 4t-4 6t-7 4t-7 4l-4 -2l4 2h6h13t9 9q0 12 -14 12q-18 0 -41.5 -8.5t-32.5 -28.5l-14 -8l18 18l3 6q0 4 -9.5 5.5t-5.5 1.5q18 0 27.5 4t15.5 9t12.5 10t18.5 9q23 -4 44 -2t44 2q6 4 12 8.5t8 10.5l23 4q4 -4 12 2t8 10q0 10 -11 13t-11 14q0 2 1 6t-3 4 q-6 0 -19.5 -6t-19.5 -10q-4 -2 -5 1t-1 7l2 -2l8 4l23 8l4 4q0 6 -7.5 8t-11.5 2t-12 -3t-8 3l2 4q-12 10 -21.5 22.5t-9.5 16.5t1 8.5t-5 4.5q-4 0 -7 -1t-3 5q0 4 -5 17t-14 13l-8 -8q0 -6 -6 -9t-6 -7h-4l-21 -12q-2 4 -5 2t-7 -2h-2l-2 -2q8 0 7 9t-7 9l-16 -4 q-4 0 -4.5 1t2 4t4.5 7t0 8t-6.5 1t-4.5 1h6l5 5q2 2 -1.5 7t-5.5 7l-22 4l-14 12q-2 -2 -7.5 3t-9.5 7l-16 -6l-39 9q-4 0 -8 -2.5t-4 -6.5t4 -6t4 -6t3 -21.5t-5 -13.5l-10 -14q2 -4 7 -7t10 -7.5t9 -10.5t2 -18l-45 -31v-4q0 -8 4 -15t8 -18q10 -4 9.5 -7t-7 -6t-12.5 -6 t-6 -5t-4 -2h-8h-4q0 2 2 3t2 5l-19 12v-2l-8 16q4 10 1 14.5t-3 10.5q0 16 -14.5 16t-30.5 -4q4 2 -1 6.5t-7 4.5q-16 0 -38 14t-36 14q-6 0 -14 -2t-15 -4q4 2 5 10l-13 23l-2 2q-6 0 -14 -5t-8 9q0 2 2 4t0 4q-2 12 5 20.5t11 18.5q4 4 4 8t4 4q8 0 15.5 4.5t17.5 6.5 l2 6q0 4 -21.5 7t-21.5 7l2 2q20 -6 30.5 -7t17.5 2t16.5 8t29.5 14q0 4 -21.5 8t-27.5 8h12q4 0 10.5 -2t10.5 -4q0 -4 6 -5t10 -1l15 10v6l-4 6l22 4q-2 2 1 4t5 2q6 0 12.5 -6t8.5 -6l20 8q-2 2 5.5 3t4.5 6l-14 16q-2 0 -3 3t1 3q10 0 6 10q-8 4 -17 9.5t-20 5.5 q-4 0 -9 -2t-5 -7q0 -4 5 -4t7 -4q4 -4 -2 -4t-6 -2q-8 0 -15 -12t-18 -17q-4 0 -3 2.5t-1 4.5q-2 4 -7 5t-5 5t5 13t-13 9q-8 0 -11.5 -6t-7.5 -12l-22 25l-17 2q0 8 3.5 14t-9.5 16q-6 4 -11 7.5t-11 3.5q-2 0 -9.5 -4.5t-13.5 -8.5t-6 -8t10 -4h-2q-6 0 -6 -8 q0 -2 9.5 -5t13.5 -3q4 2 6 -1.5t6 -3.5l8 3v-5q-2 -2 -2 -4l2 -8l-20 -10q-2 -2 -4 -2t-5 -2q0 -6 5.5 -12.5t-11.5 -6.5l-6 4q0 8 -16.5 13.5t-40 7.5t-47 3t-35.5 1l-33 -10l8 -19q-4 0 -5 -3t3 -5q-4 4 -15 14.5t-15 10.5l-17 4q-35 -2 -78 -33t-84 -72t-75.5 -84 t-53.5 -71zM471 674h2h-2zM487 1413q14 2 25.5 8t24.5 6l6 -4q6 -2 11 -2t9 -4q8 2 17 -2l6 4v8l-2 5l6 -2q6 0 12 10l-2 4q-4 2 -10 4t-10 2t-16.5 -5t-28 -11.5t-29.5 -12.5t-19 -8zM918 86q0 -4 3 -9t3 -9q0 -5 -2 -7q115 20 217 74.5t182 140.5h-2q-8 -4 -14 0l-5 -4 l-12 4h-4l-4 -8l2 8q-6 8 -14 15l-4 2q-4 0 -4 -8q2 16 -8.5 27.5t-26.5 11.5q0 -2 -2 -2h-4l-5 4h7l4 12l-11 8l-2 -2q-14 2 -20 16l-4 2l-2 -2l-4 -2q-12 -4 -21 -8q-12 4 -18 10l-27 -2q0 6 -4 12.5t-12 6.5q-10 0 -20.5 -2t-14.5 -13q0 -4 2 -8t4 -6v-8l-2 -6l-4 -2h-2 l-6 16l6 10q-2 4 -2 10.5t-2 10.5l-2 4h-6l-15 -10h-8l-4 -4q-2 -2 -2 -4t-2 -3l-2 3h-8q-8 -8 -9 -19l3 -4l-9 -6l-2 -4l-6 -4q0 -2 -1 -2t-1 -2v-2v-9l-2 -2v4l-2 2q-2 12 -23 21h-6v-4q2 -6 8.5 -10.5t10.5 -8.5q-2 2 -5 1t-3 -3v-4l14 -20v-39l4 -10q-4 -16 -16 -27v2 l-4 -2l-3 -2l-2 -10l2 -2v-2l-4 4l-2 -13l-12 -4q-6 -4 -5 -11t-5 -11l2 -4l-6 -6q0 -4 -1 -6.5t-1 -6.5l2 -14l6 -4l4 4l2 6l2 -12q0 -4 -4 -8q-6 -4 -12 -9.5t-6 -15.5z" />
202
+ <glyph unicode="&#xf0ad;" horiz-adv-x="1593" d="M8 242q0 33 12.5 62.5t34.5 51.5l609 609q-16 66 -17 122q0 98 38 186.5t102.5 153t151.5 102.5t185 38q94 0 181.5 -36t154.5 -101l-442 -162l-43 -236l184 -153l443 159q-10 -92 -50.5 -171t-104 -137t-145 -91t-174.5 -33q-61 0 -127 17l-606 -607q-47 -47 -112 -47 q-68 0 -115 47q-23 23 -50.5 47.5t-52 52t-41 58.5t-16.5 68zM203 242q0 -33 22.5 -56.5t57.5 -23.5q33 0 56 23.5t23 56.5q0 35 -23.5 57.5t-55.5 22.5q-35 0 -57.5 -23t-22.5 -57z" />
203
+ <glyph unicode="&#xf0ae;" d="M0 76v217q0 31 22.5 53.5t53.5 22.5h1689q33 0 55.5 -22.5t22.5 -53.5v-217q0 -31 -22.5 -53.5t-55.5 -22.5h-1689q-31 0 -53.5 22.5t-22.5 53.5zM0 662v215q0 31 22.5 53t53.5 22h1689q33 0 55.5 -22.5t22.5 -52.5v-215q0 -33 -22.5 -55.5t-55.5 -22.5h-1689 q-31 0 -53.5 22.5t-22.5 55.5zM0 1243v217q0 31 22.5 53.5t53.5 22.5h1689q33 0 55.5 -22.5t22.5 -53.5v-217q0 -31 -22.5 -53.5t-55.5 -22.5h-1689q-31 0 -53.5 22.5t-22.5 53.5zM752 692h999v154h-999v-154zM1059 109h692v153h-692v-153zM1366 1274h385v153h-385v-153z " />
204
+ <glyph unicode="&#xf0b0;" horiz-adv-x="1566" d="M0 1458q0 33 22.5 55.5t55.5 22.5h1411q33 0 55.5 -22.5t22.5 -55.5t-23 -55l-565 -565v-791q0 -33 -22.5 -55.5t-55.5 -22.5t-55 23l-236 235q-23 23 -22 56v555l-565 565q-23 23 -23 55z" />
205
+ <glyph unicode="&#xf0b1;" d="M0 115v512h713q-2 -6 -2 -19v-153q0 -55 38.5 -95.5t96.5 -40.5h153q55 0 94.5 40t39.5 96v153q0 12 -3 19h713v-512q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM0 743v371q0 47 34 81t81 34h424v231q0 31 21.5 53.5t53.5 22.5h615q33 0 55.5 -22.5 t22.5 -53.5v-231h422q47 0 80.5 -34t33.5 -81v-371h-1843zM692 1229h461v153h-461v-153zM825 455v153q0 18 21 19h153q18 0 19 -19v-153q0 -18 -19 -19h-153q-20 0 -21 19z" />
206
+ <glyph unicode="&#xf0b2;" horiz-adv-x="1536" d="M0 80v477q0 51 24.5 61.5t59.5 -24.5l162 -162l340 338l-338 338l-164 -164q-35 -35 -59.5 -25.5t-24.5 60.5v477q0 31 23 57q27 23 57 23h477q51 0 61.5 -24.5t-24.5 -59.5l-160 -158l338 -338l332 334l-162 162q-35 35 -24.5 59.5t61.5 24.5h477q33 0 55 -23 q25 -25 25 -57v-477q0 -51 -24.5 -61.5t-59.5 24.5l-162 162l-334 -334l338 -336l158 160q35 35 59.5 24.5t24.5 -61.5v-477q0 -35 -25 -55q-23 -25 -55 -25h-477q-51 0 -61.5 24.5t24.5 59.5l166 166l-336 336l-340 -340l162 -162q35 -35 24.5 -59.5t-61.5 -24.5h-477 q-31 0 -55 25q-25 20 -25 55z" />
207
+ <glyph unicode="&#xf0c0;" horiz-adv-x="1880" d="M0 852v152q0 18 1 47.5t10 56.5t29.5 46.5t57.5 19.5q-45 29 -71.5 75.5t-26.5 104.5q0 43 16.5 82t46 68.5t68.5 46t82 16.5q45 0 84 -16.5t67.5 -46t46 -68.5t17.5 -82q0 -57 -27.5 -104t-72.5 -76q37 0 57.5 -19.5t29.5 -46.5t11 -56.5t2 -47.5v-152 q-14 -8 -23.5 -18.5t-27.5 -10.5h-328q-16 0 -26.5 10.5t-22.5 18.5zM158 57v387q0 78 45 138.5t98 109.5q10 10 25.5 21.5t33.5 15.5q18 6 41 7t45 5q61 10 130 19.5t135 19.5q-90 57 -144.5 151.5t-54.5 207.5q0 88 34 166.5t92 136t136 91.5t166 34t166 -34t136 -91.5 t92 -136t34 -166.5q0 -113 -54 -207t-145 -152q66 -10 134.5 -19t130.5 -20q23 -4 45 -5t41 -7q18 -4 33.5 -15.5t27.5 -21.5q66 -59 103.5 -116.5t37.5 -131.5v-387q-12 -6 -20 -13t-18.5 -14t-23.5 -14.5t-36 -15.5h-1368q-35 0 -54.5 22.5t-43.5 34.5zM1452 852v152 q0 18 2 47.5t11.5 56.5t30 46.5t56.5 19.5q-45 29 -72.5 75.5t-27.5 104.5q0 43 16.5 82t46 68.5t68.5 46t84 16.5q43 0 82 -16.5t68.5 -46t46 -68.5t16.5 -82q0 -57 -26.5 -104t-71.5 -76q37 0 56.5 -19.5t28.5 -46.5t11 -56.5t2 -47.5v-152q-12 -8 -22.5 -18.5 t-26.5 -10.5h-328q-18 0 -27.5 10.5t-23.5 18.5z" />
208
+ <glyph unicode="&#xf0c1;" horiz-adv-x="1597" d="M0 1137q0 88 34 166.5t92 137t136 92.5t168 34q86 0 166 -33t139 -92q8 -8 21.5 -20.5t26 -25t21.5 -25.5t9 -25q0 -18 -12 -31q-6 -8 -25 -12q-47 -10 -88 -22.5t-86 -31.5q-4 -4 -16 -4t-25.5 10.5t-31 21.5t-42 21.5t-57.5 10.5q-35 0 -66.5 -13.5t-54 -37t-36 -54 t-13.5 -67.5q0 -41 17.5 -75t43 -63.5t56.5 -56.5t57 -53l180 -178q23 -25 54.5 -37t66.5 -12q43 0 73 16t46 16q12 0 39 -21.5t55.5 -49t50 -55t21.5 -42.5q0 -29 -36 -51t-83 -38.5t-94 -26t-72 -9.5q-86 0 -164.5 33t-140.5 92l-303 305q-61 59 -94 139.5t-33 166.5z M578 1010q0 29 35.5 51t82.5 38.5t94 26t72 9.5q86 0 166 -33t139 -92l303 -305q61 -59 94 -139.5t33 -166.5q0 -90 -33.5 -167.5t-92 -136t-137.5 -92.5t-167 -34q-86 0 -165.5 34t-139.5 93q-8 8 -21.5 19.5t-25.5 25t-21.5 26.5t-9.5 26q0 18 13 28q6 8 24 12 q47 10 88 22.5t86 33.5q12 4 17 4q12 0 25.5 -10.5t30.5 -21.5t41 -21.5t58 -10.5q72 0 121 49.5t49 120.5q0 41 -17 76t-44 63.5t-56.5 55.5t-56.5 53l-178 180q-53 49 -123 50q-43 0 -72.5 -17.5t-46.5 -17.5q-12 0 -38.5 21.5t-55 49t-50 56t-21.5 41.5z" />
209
+ <glyph unicode="&#xf0c2;" horiz-adv-x="1880" d="M0 391q0 70 23.5 132.5t64.5 113.5t96.5 86t120.5 51q-33 41 -51 90t-18 105q0 66 24.5 123t66.5 99t99 66.5t123 24.5q113 0 196 -72q18 76 61.5 141.5t103 113.5t133 75t157.5 27q96 0 182 -37t149.5 -100.5t100.5 -149.5t37 -182q0 -57 -13 -109.5t-36 -99.5 q117 -59 188.5 -170t71.5 -248q0 -98 -37 -183t-101.5 -149.5t-149.5 -101.5t-183 -37h-1018q-80 0 -151.5 30.5t-125 84t-84 125t-30.5 151.5z" />
210
+ <glyph unicode="&#xf0c3;" horiz-adv-x="1536" d="M16 72q-39 72 7 141l516 803v366h-78q-33 0 -54.5 22.5t-21.5 55.5q0 31 21.5 53.5t54.5 22.5h614q33 0 55.5 -22.5t22.5 -53.5q0 -33 -22.5 -55.5t-55.5 -22.5h-76v-368l514 -801q45 -70 7 -141q-18 -35 -51 -53.5t-70 -18.5h-1262q-37 0 -69.5 18.5t-51.5 53.5z M377 479h782l-313 490v413h-154v-411z" />
211
+ <glyph unicode="&#xf0c4;" horiz-adv-x="1916" d="M0 180q0 86 44 168t113.5 146.5t154.5 103.5t169 39h13q18 25 57 60.5t63 58.5v12v12q-12 12 -28.5 27.5t-35 32t-33.5 32t-23 27.5q-84 -6 -172.5 33t-160 105.5t-116.5 150.5t-45 168q0 98 62.5 154.5t160.5 56.5q82 0 168 -39t155.5 -103.5t114 -146.5t44.5 -168 q0 -10 -1.5 -21.5t-3.5 -21.5l86 -76l34 17q34 18 90.5 46.5t129 65.5t148.5 76t150.5 77t135 69.5t102.5 52t52 26.5q16 8 37 9q14 0 39 -4.5t52.5 -9.5t53 -11t41.5 -8q29 -4 47.5 -26.5t18.5 -51.5q0 -43 -35 -66l-700 -485l700 -485q35 -23 35 -66q0 -29 -18.5 -51.5 t-47.5 -26.5q-16 -4 -41.5 -9t-53 -10t-52.5 -9.5t-39 -4.5q-10 0 -18.5 2.5t-18.5 6.5l-842 430l-86 -76q2 -10 3.5 -21.5t1.5 -21.5q0 -86 -44.5 -168t-114 -146.5t-155.5 -103.5t-168 -39q-98 0 -160.5 56.5t-62.5 154.5zM197 1358q0 -23 11 -49.5t27.5 -51t35 -45 t34.5 -34.5q35 -29 82 -54.5t94 -25.5q10 0 27 4v6q0 23 -11.5 48.5t-27.5 50t-34.5 46t-35.5 35.5q-35 29 -82 54.5t-94 25.5q-14 0 -26 -4v-6zM199 180q0 -6 2 -10q6 0 11 -1t11 -1q41 0 90 24.5t92.5 61.5t72 83t28.5 89q0 4 -1 5t-1 5q-8 2 -23 2q-41 0 -90 -24.5 t-92 -61.5t-71.5 -83t-28.5 -89zM586 616q53 -25 82 -69l108 96l45 -27l1016 703l-172 31l-975 -498l6 -127zM586 920l35 -35q12 29 36.5 41t53.5 26l-43 37q-29 -45 -82 -69zM741 768q0 35 23.5 57.5t58.5 22.5q33 0 55.5 -22.5t22.5 -57.5q0 -33 -22.5 -56.5t-57.5 -23.5 q-33 0 -56.5 23.5t-23.5 56.5zM903 575l762 -389l172 31l-727 502z" />
212
+ <glyph unicode="&#xf0c5;" horiz-adv-x="1597" d="M0 385v707q0 33 16.5 70.5t38.5 60.5l258 258q23 23 61 39t70 16h463q31 0 53.5 -22.5t22.5 -53.5v-250q16 8 35.5 13.5t40.5 5.5h463q31 0 53 -22.5t22 -53.5v-1075q0 -33 -22.5 -55.5t-52.5 -22.5h-830q-33 0 -55.5 22.5t-22.5 55.5v229h-536q-33 0 -55.5 22.5 t-22.5 55.5zM154 461h460v293q0 45 10.5 87t45.5 74l159 162v305h-278v-321q0 -31 -22.5 -53.5t-53.5 -22.5h-321v-524zM186 1139h211v211zM768 154h676v921h-279v-321q0 -31 -22.5 -53.5t-52.5 -22.5h-322v-524zM801 831h211v211z" />
213
+ <glyph unicode="&#xf0c6;" horiz-adv-x="1470" d="M0 1128q0 90 35 170t94 139.5t139 94.5t170 35q88 0 169 -34t143 -95l655 -656q12 -12 12 -28q0 -10 -11 -26.5t-26.5 -32t-32 -27t-26.5 -11.5q-16 0 -29 13l-655 655q-41 41 -92 61.5t-107 20.5q-57 0 -108 -21.5t-89 -59.5t-59.5 -89t-21.5 -109q0 -55 20.5 -106 t61.5 -92l745 -746q55 -55 133 -55q39 0 74 15.5t60.5 41t41 60.5t15.5 73q0 78 -56 134l-563 563q-29 29 -69 28q-41 0 -71 -29.5t-30 -70.5t29 -70l475 -475q12 -12 12 -28q0 -10 -11 -26.5t-26.5 -32t-32 -27t-26.5 -11.5q-16 0 -29 13l-475 473q-35 37 -55.5 85 t-20.5 99q0 53 20.5 100.5t55.5 83t83.5 56t101.5 20.5q51 0 99 -20.5t85 -55.5l561 -563q102 -102 102 -246q0 -74 -27.5 -137t-74.5 -110t-110.5 -75t-137.5 -28q-143 0 -246 103l-745 745q-61 61 -95 142t-34 169z" />
214
+ <glyph unicode="&#xf0c7;" horiz-adv-x="1536" d="M0 154v1228q0 63 45 108.5t109 45.5h1075q63 0 108 -45l154 -154q45 -45 45 -108v-1075q0 -63 -45 -108.5t-109 -45.5h-1228q-63 0 -108.5 45t-45.5 109zM154 846h1075v536h-1075v-536zM846 922v385h190v-385h-190z" />
215
+ <glyph unicode="&#xf0c8;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-1150q-80 0 -136.5 56.5t-56.5 136.5z" />
216
+ <glyph unicode="&#xf0c9;" d="M0 78v215q0 31 22.5 53.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -53.5v-215q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM0 659v218q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-218q0 -31 -22.5 -53t-53.5 -22h-1689 q-33 0 -55.5 22.5t-22.5 52.5zM0 1243v217q0 31 22.5 53.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -53.5v-217q0 -31 -22.5 -53.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 53.5z" />
217
+ <glyph unicode="&#xf0ca;" d="M0 211q0 39 15.5 75t41 61.5t60.5 40.5t76 15q39 0 73.5 -15t61 -40.5t42 -61.5t15.5 -75q0 -41 -15.5 -76t-42 -60.5t-61.5 -41t-73 -15.5q-80 0 -136.5 56.5t-56.5 136.5zM0 768q0 39 15.5 75t41 61.5t60.5 41t76 15.5q39 0 73.5 -15.5t61 -41t42 -61.5t15.5 -75 q0 -41 -15.5 -76t-42 -60.5t-61.5 -41t-73 -15.5q-41 0 -76 15.5t-60.5 41t-41 60.5t-15.5 76zM0 1325q0 39 15.5 75t41 61.5t60.5 41t76 15.5q39 0 73.5 -15.5t61 -41t42 -61.5t15.5 -75q0 -41 -15.5 -76t-42 -60.5t-61.5 -40.5t-73 -15q-41 0 -76 15t-60.5 40.5t-41 60.5 t-15.5 76zM522 154v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1167q-33 0 -55.5 21.5t-22.5 54.5zM522 711v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5 h-1167q-33 0 -55.5 22.5t-22.5 55.5zM522 1268v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1167q-33 0 -55.5 22.5t-22.5 55.5z" />
218
+ <glyph unicode="&#xf0cb;" d="M0 594q0 55 30.5 90t68.5 61.5t69 50t31 56.5q0 29 -17.5 44t-46.5 15q-25 0 -44 -15t-34 -36l-53 37q23 39 58.5 60.5t78.5 21.5q55 0 96.5 -32t41.5 -91q0 -49 -30 -80t-67 -55.5t-67.5 -47t-30.5 -55.5h143v54h66v-115h-289q-2 10 -3 18.5t-1 18.5zM4 55l37 54 q6 -4 12 -10.5t15 -10.5q12 -8 29.5 -14t37.5 -6q35 0 55.5 18t20.5 47q0 31 -23.5 48.5t-58.5 17.5h-23l-16 37l90 108l6 6t7 6l4 6h-9q-4 -2 -14 -2h-92v-49h-66v111h263v-53l-97 -115q41 -6 74 -35t33 -82t-38 -95t-110 -42q-35 0 -60.5 9t-41.5 20q-25 14 -35 26z M14 1434l105 102h67v-360h93v-62h-259v62h93v258v8h-2q-10 -16 -22.5 -28.5t-29.5 -27.5zM522 154v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1167q-33 0 -55.5 21.5t-22.5 54.5zM522 711v114q0 33 22.5 55.5 t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1167q-33 0 -55.5 22.5t-22.5 55.5zM522 1268v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1167q-33 0 -55.5 22.5t-22.5 55.5z " />
219
+ <glyph unicode="&#xf0cc;" horiz-adv-x="1536" d="M0 692v152h1536v-152h-1536zM268 1114q0 117 44 202t118 141t170 83t203 27q88 0 176 -20.5t172 -49.5q20 -72 27.5 -156t7.5 -157q0 -10 -1 -22.5t-3 -24.5l-13 -2q-23 2 -50 2t-50 6q-18 59 -44 114.5t-62.5 98.5t-88 68.5t-122.5 25.5q-49 0 -94.5 -13.5t-80 -40 t-56 -66.5t-21.5 -93q0 -59 28.5 -102t75.5 -75t105.5 -54.5t118 -42t113.5 -39t93 -41.5h-696q-33 53 -51.5 110.5t-18.5 120.5zM285 310v63v45l110 2q31 -72 64 -134.5t76 -108.5t104 -71.5t152 -25.5q55 0 110 16.5t100.5 48t74 78.5t28.5 109q0 76 -49 128t-119 88 t-146.5 59.5t-132.5 45.5h617q8 -16 15 -38.5t10.5 -48t5.5 -50t2 -43.5q0 -131 -47.5 -226t-127 -156.5t-186 -91.5t-225.5 -30q-53 0 -93 4t-78 12.5t-78 20.5t-93 29q-12 4 -38 12t-36 16q-8 6 -12 50.5t-6 96.5t-2 100z" />
220
+ <glyph unicode="&#xf0cd;" horiz-adv-x="1536" d="M0 0v154h1536v-154h-1536zM0 1532q10 2 19.5 2h19.5q72 0 140.5 -5t137.5 -5q100 0 200.5 2t199.5 6q-4 -16 -1 -36.5t3 -37.5v-8q-66 -10 -108 -7t-65.5 -5t-32.5 -39t-9 -109q0 -137 4 -272t10 -273q8 -147 88 -237t238 -90q125 0 207 29.5t131 88t69.5 146.5t20.5 203 q0 20 -2 65t-5 102.5t-8.5 119t-11.5 113.5t-13 89t-15 45q-33 33 -78 33q-6 0 -23.5 -1t-36 -1t-34 1t-21.5 3l2 82q82 4 163 -3t165 -7q39 0 77.5 5t79.5 5q4 0 9.5 -1t9.5 -1q2 -12 4 -24.5t2 -24.5t-4 -29q-23 -6 -52.5 -8t-58 -7t-48 -16.5t-19.5 -38.5q0 -14 1 -27 t3 -28q2 -6 5 -38.5t5 -79t4 -101.5t4 -103t3 -85t1 -50q0 -37 -2 -80.5t-8 -89t-17.5 -87.5t-29.5 -74q-41 -68 -104.5 -114t-137 -72.5t-153.5 -38t-154 -11.5q-72 0 -144.5 9.5t-140.5 35.5q-96 35 -151 88.5t-84 121t-36 148.5t-7 173v321v42t-1 62.5t-5 60.5t-10 38 q-12 16 -37 23.5t-53.5 10.5t-56.5 3t-44 4z" />
221
+ <glyph unicode="&#xf0ce;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h460v335h-460v-335zM154 565h460v332h-460v-332zM154 975h460v332h-460v-332zM692 154h461v335h-461v-335zM692 565h461v332h-461v-332z M692 975h461v332h-461v-332zM1229 154h461v335h-461v-335zM1229 565h461v332h-461v-332zM1229 975h461v332h-461v-332z" />
222
+ <glyph unicode="&#xf0d0;" d="M0 197q0 39 29 61l1579 1247q20 17 47 17q35 0 59 -29q10 -12 29.5 -33.5t38 -44t32 -47.5t13.5 -43q0 -39 -29 -61l-1579 -1248q-20 -16 -47 -16q-37 0 -59 29q-10 12 -30 33.5t-38 44t-31.5 47t-13.5 43.5zM256 922l117 36l37 117l34 -117l119 -36l-119 -37l-34 -117 l-37 117zM373 1229l235 71l72 236l72 -236l235 -71l-235 -72l-72 -235l-72 235zM942 1382l117 37l37 117l37 -117l116 -37l-116 -36l-37 -117l-37 117zM1286 1153l94 -121l369 291l-94 121zM1536 885l117 35l37 118l36 -118l117 -35l-117 -37l-36 -117l-37 117z" />
223
+ <glyph unicode="&#xf0d1;" d="M0 358v404q0 25 6 51.5t17.5 53t27 51t31.5 40.5l223 222q16 16 41 31.5t51.5 26.5t53 17.5t51.5 6.5h80v198q0 31 22.5 53.5t52.5 22.5h1108q33 0 55.5 -22.5t22.5 -53.5v-1102q0 -31 -22.5 -53t-55.5 -22h-75v-7q0 -63 -25 -119.5t-65.5 -97.5t-97 -65.5t-120.5 -24.5 q-63 0 -119.5 24.5t-97.5 65.5t-65.5 97.5t-24.5 119.5v7h-307v-7q0 -63 -24.5 -119.5t-65.5 -97.5t-97.5 -65.5t-119.5 -24.5t-119.5 24.5t-97.5 65.5t-65.5 97.5t-24.5 119.5v7h-78q-31 0 -53.5 22.5t-22.5 52.5zM193 700h387v369h-78q-10 0 -31.5 -8t-30.5 -17l-223 -221 q-8 -8 -16 -29.5t-8 -31.5v-62zM346 276q0 -47 34 -80.5t81 -33.5t80.5 33.5t33.5 80.5t-33.5 81t-80.5 34t-81 -33.5t-34 -81.5zM1268 276q0 -47 33.5 -80.5t80.5 -33.5t81 33.5t34 80.5t-33.5 81t-81.5 34q-47 0 -80.5 -33.5t-33.5 -81.5z" />
224
+ <glyph unicode="&#xf0d2;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5q-59 0 -115.5 8.5t-112.5 24.5q23 35 46.5 80t35.5 92l11 41q6 23 16 66t29 112q23 -41 76 -70.5t118 -29.5q96 0 176 41 t136.5 114.5t88 174t31.5 217.5q0 88 -35.5 171t-102.5 147.5t-160 102t-208 37.5q-141 0 -248.5 -46t-179 -118.5t-107.5 -160.5t-36 -174q0 -104 40 -187.5t124 -117.5q31 -10 41 20q2 10 7 31.5t9 32.5q4 16 1 23t-13 22q-53 59 -53 155q0 76 27.5 145.5t78.5 122t124 84 t163 31.5q80 0 142.5 -23.5t105.5 -64.5t64.5 -96t21.5 -121q0 -86 -18.5 -164t-52.5 -136t-80 -92t-103 -34q-31 0 -57.5 12.5t-45 34t-25.5 49t1 60.5q18 76 44.5 151.5t26.5 130.5q0 49 -26.5 84t-81.5 35q-66 0 -110 -58.5t-44 -146.5q-2 -23 2 -45q2 -18 7.5 -40.5 t15.5 -41.5q-33 -141 -53.5 -225t-30.5 -131q-12 -55 -18 -80q-10 -45 -13.5 -93t-1.5 -89q-104 45 -192 119.5t-151.5 169t-98.5 207t-35 235.5z" />
225
+ <glyph unicode="&#xf0d3;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-829q27 39 59.5 95.5t49.5 117.5l10 41q6 25 17.5 68t29.5 112q20 -41 75.5 -70.5t121.5 -29.5q96 0 176 42t137 115.5 t89 175t32 220.5q0 90 -37 173t-103.5 147.5t-161 102.5t-208.5 38q-143 0 -251 -46.5t-180.5 -120t-108.5 -162.5t-36 -175q0 -104 40 -188.5t124 -118.5q14 -6 25.5 -1t15.5 21q4 10 8 31.5t8 34.5q8 23 -12 43q-23 29 -37 67.5t-14 91.5q0 76 27.5 145.5t79 123t124 85 t164.5 31.5q82 0 144.5 -23.5t105.5 -64.5t64.5 -97t21.5 -124q0 -86 -18.5 -164t-52 -136t-81 -93t-104.5 -35q-31 0 -57.5 12.5t-45 34t-25.5 49t1 60.5q18 78 45 154.5t27 131.5q0 49 -26.5 85t-82.5 36q-66 0 -110.5 -59t-44.5 -150q-2 -23 2 -45q4 -43 22 -84 q-35 -141 -54.5 -226t-29.5 -132q-12 -55 -18 -80q-16 -70 -14 -142.5t6 -117.5h-260q-80 0 -136.5 56.5t-56.5 136.5z" />
226
+ <glyph unicode="&#xf0d4;" horiz-adv-x="1536" d="M0 342v438q55 -68 120.5 -96.5t153.5 -28.5h36t34 4q-8 -23 -14 -42t-6 -42q0 -41 18 -77.5t43 -67.5q-104 -4 -198.5 -22.5t-186.5 -65.5zM0 1214v129q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5 t-61.5 -41t-75 -15.5h-583q23 39 36 81t13 89q0 70 -21.5 121t-54.5 90t-70.5 69.5t-70.5 57.5t-54.5 53.5t-21.5 59.5q0 49 34 81.5t76 72.5t75.5 99.5t33.5 163.5q0 78 -39 157t-106 122h131l133 76h-428q-129 0 -237.5 -36t-188.5 -143zM2 170q14 57 55 96t96.5 61.5 t115 33t110.5 10.5h31.5t31.5 -2q37 -27 78 -54.5t75 -61.5t55.5 -75t21.5 -92q0 -47 -19 -86h-460q-72 0 -126.5 49t-64.5 121zM102 1094q0 43 11.5 85t35 73.5t59.5 51t85 19.5q68 0 118 -41t81.5 -100.5t47 -128t15.5 -123.5q0 -45 -9 -84t-30.5 -68.5t-56.5 -47 t-84 -17.5q-66 0 -116 39t-85 96t-53.5 123.5t-18.5 122.5zM854 1051h223v-224h109v224h223v108h-223v225h-109v-225h-223v-108z" />
227
+ <glyph unicode="&#xf0d5;" horiz-adv-x="1536" d="M0 262q0 100 56.5 166t139.5 105.5t179 56t174 18.5q-23 29 -41.5 64t-18.5 76q0 23 6.5 41t14.5 40q-16 -4 -33.5 -4h-34.5q-68 0 -130 23.5t-108 66.5t-74 101.5t-28 130.5q0 68 25 128t67 109.5t98 84t120 49.5q88 18 176 18h411l-127 -74h-127q72 -43 107 -120.5 t35 -157.5q0 -94 -33 -149.5t-73 -94.5t-72.5 -70.5t-32.5 -78.5q0 -45 44 -82t97 -82t97 -107.5t44 -161.5q0 -102 -50 -175.5t-126.5 -121t-170 -70t-181.5 -22.5q-66 0 -141.5 15.5t-140 50.5t-106.5 90t-42 137zM174 307q0 -68 35 -116t87 -78.5t114.5 -44t117.5 -13.5 q51 0 104.5 11.5t96.5 38t69.5 68.5t26.5 103q0 49 -21.5 89.5t-53 72t-70.5 59t-76 52.5q-14 2 -29.5 3t-29.5 1q-57 0 -123 -12.5t-121 -41t-91 -75.5t-36 -117zM276 1247q0 -53 17.5 -117.5t51.5 -120t82.5 -92t111.5 -36.5q96 0 134 61.5t38 147.5q0 53 -14.5 118.5 t-45 124t-78 97t-112.5 38.5q-47 0 -82 -18t-57.5 -49t-34 -71t-11.5 -83zM999 1206h215v-215h107v215h215v105h-215v217h-107v-217h-215v-105z" />
228
+ <glyph unicode="&#xf0d6;" d="M0 78v1382q0 31 22.5 53.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -53.5v-1382q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM154 461q63 0 119.5 -24.5t97.5 -65.5t65.5 -97.5t24.5 -119.5h921q0 63 25 119.5t65.5 97.5t97 65.5t120.5 24.5v614 q-63 0 -120 24.5t-97.5 65.5t-65.5 97.5t-25 119.5h-921q0 -63 -24.5 -119.5t-65.5 -97.5t-97.5 -65.5t-119.5 -24.5v-614zM539 768q0 104 29.5 195.5t81.5 159t122 106.5t150 39t149.5 -39t121.5 -106.5t83 -159t31 -195.5t-31 -195.5t-83 -159t-122 -106.5t-149 -39 q-80 0 -150 39t-122 106.5t-81.5 159t-29.5 195.5zM692 969l94 -99l39 35q8 6 11.5 13.5t7.5 11.5q4 2 8 10h2v-16q0 -8 -1 -16.5t-1 -18.5v-283h-139v-129h438v129h-141v529h-140z" />
229
+ <glyph unicode="&#xf0d7;" horiz-adv-x="1228" d="M6 967q20 47 72 47h1075q50 0 70 -47t-17 -84l-536 -537q-27 -23 -56 -22q-29 0 -55 22l-536 537q-37 37 -17 84z" />
230
+ <glyph unicode="&#xf0d8;" horiz-adv-x="1228" d="M6 371q-20 47 17 84l536 536q23 23 55 23q31 0 54 -23l538 -536q37 -37 17 -84t-70 -47h-1077q-50 0 -70 47z" />
231
+ <glyph unicode="&#xf0d9;" horiz-adv-x="692" d="M0 768q0 33 23 55l538 537q16 16 38 21t44 -5q23 -8 36 -27.5t13 -41.5v-1076q0 -25 -13 -43t-36 -28t-44 -5t-38 21l-538 539q-23 23 -23 53z" />
232
+ <glyph unicode="&#xf0da;" horiz-adv-x="692" d="M0 231v1076q0 49 47 69t84 -16l539 -537q23 -23 22 -55q0 -31 -22 -53l-539 -539q-37 -37 -84 -16q-47 20 -47 71z" />
233
+ <glyph unicode="&#xf0db;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h692v1153h-692v-1153zM999 154h691v1153h-691v-1153z" />
234
+ <glyph unicode="&#xf0dc;" horiz-adv-x="1228" d="M0 584q0 31 22.5 54.5t53.5 23.5h1075q33 0 55.5 -23t22.5 -55q0 -33 -23 -56l-536 -536q-23 -23 -56 -23t-55 23l-536 536q-23 23 -23 56zM0 952q0 33 23 56l536 536q23 23 55 23q33 0 56 -23l536 -536q23 -23 23 -56q0 -31 -22.5 -54.5t-55.5 -23.5h-1075 q-31 0 -53.5 23t-22.5 55z" />
235
+ <glyph unicode="&#xf0dd;" horiz-adv-x="1228" d="M0 584q0 31 22.5 54.5t53.5 23.5h1077q31 0 53.5 -23t22.5 -55q0 -33 -23 -56l-536 -536q-23 -23 -56 -23q-35 0 -53 23l-538 536q-23 23 -23 56z" />
236
+ <glyph unicode="&#xf0de;" horiz-adv-x="1228" d="M0 952q0 33 23 56l536 536q23 23 55 23q33 0 56 -23l536 -536q23 -23 23 -56q0 -31 -22.5 -54.5t-53.5 -23.5h-1077q-31 0 -53.5 23t-22.5 55z" />
237
+ <glyph unicode="&#xf0e0;" d="M0 115v905q10 -10 20.5 -17.5t20.5 -15.5q129 -96 256 -191.5t252 -195.5q39 -31 82 -62.5t89 -57t96.5 -41t103.5 -15.5q55 0 105 15.5t96 40t89 56t84 64.5q125 100 252 195.5t256 191.5q10 8 20.5 15.5t20.5 17.5v-905q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34 t-34 81zM2 1434q0 41 36 71.5t77 30.5h1614q41 0 76.5 -30.5t35.5 -71.5q0 -31 -18.5 -69t-45 -75t-57 -67.5t-53.5 -48.5q-123 -92 -241.5 -182.5t-239.5 -182.5q-25 -18 -57.5 -45t-67.5 -51.5t-71 -42t-66 -17.5h-2h-2q-31 0 -67 17.5t-70.5 42t-67.5 51.5t-58 45 q-121 92 -239.5 182t-241.5 183q-23 18 -53.5 48.5t-57 67.5t-45 75t-18.5 69z" />
238
+ <glyph unicode="&#xf0e1;" horiz-adv-x="1576" d="M0 1376q0 39 15.5 74t41 60.5t60 41t73.5 15.5t74 -15.5t61.5 -41t41 -60.5t14.5 -74t-14.5 -73.5t-41 -60t-61.5 -41t-74 -15.5t-73.5 15.5t-60 41t-41 60t-15.5 73.5zM10 41v991q0 16 12.5 28.5t28.5 12.5h281q16 0 28.5 -12t12.5 -29v-991q0 -16 -12.5 -28.5 t-28.5 -12.5h-281q-16 0 -28.5 12.5t-12.5 28.5zM524 41v991q0 16 12.5 28.5t28.5 12.5h273q33 0 37 -25.5t4 -48.5q57 53 129.5 76t150.5 23q190 0 304 -95.5t114 -293.5v-668q0 -16 -12.5 -28.5t-28.5 -12.5h-289q-16 0 -27.5 12.5t-11.5 28.5v604q0 76 -27.5 116 t-111.5 40q-53 0 -89 -17.5t-56.5 -47t-28.5 -70.5t-8 -88v-537q0 -16 -12.5 -28.5t-28.5 -12.5h-281q-16 0 -28.5 12.5t-12.5 28.5z" />
239
+ <glyph unicode="&#xf0e2;" horiz-adv-x="1591" d="M0 662q-4 39 35 45l158 20q12 2 30 -8q12 -8 15 -27q14 -102 63 -191t123 -153.5t169 -101.5t200 -37q115 0 217 44t178 120t120 177t44 218t-44 218t-120 177t-178.5 120t-216.5 44q-94 0 -181.5 -30.5t-158.5 -88.5l159 -159q35 -35 24 -58.5t-58 -23.5h-463 q-16 0 -29.5 6t-24.5 16q-25 25 -24 55v463q0 47 24.5 57.5t59.5 -24.5l162 -162q109 92 238.5 140.5t271.5 48.5q166 0 311 -62.5t253.5 -171t171 -254t62.5 -311.5t-62.5 -311.5t-171 -254t-254 -171t-310.5 -62.5q-150 0 -285 52.5t-241.5 145.5t-176.5 220t-90 275z" />
240
+ <glyph unicode="&#xf0e3;" horiz-adv-x="1916" d="M0 651q0 49 37 91t88 42q35 0 68 -22q-20 14 -21 37q0 8 8 24l334 502q14 20 37 21q16 0 24 -9q-25 18 -40 43t-15 56q0 49 38 90t87 41q33 0 62 -19l514 -342q23 -16 36 -40.5t13 -53.5q0 -25 -10.5 -48.5t-26.5 -41.5t-40 -29.5t-48 -11.5q-33 0 -68 23q20 -14 21 -37 q0 -14 -8 -25l-105 -158l227 -151q14 4 28 6t28 2q53 0 94 -29l475 -315q37 -27 58.5 -65.5t21.5 -84.5q0 -74 -52.5 -126t-125.5 -52q-55 0 -99 31l-475 315q-70 47 -75 131l-228 152l-106 -158q-14 -20 -37 -20q-14 0 -25 8q55 -39 56 -100q0 -25 -10.5 -47.5t-28 -41 t-40 -29.5t-46.5 -11q-35 0 -62 18l-514 342q-49 33 -49 92z" />
241
+ <glyph unicode="&#xf0e4;" horiz-adv-x="1880" d="M0 627q0 195 73.5 365.5t201.5 298.5t299 202t366 74t366 -74t299 -202t201.5 -299t73.5 -365q0 -78 -14.5 -159t-42 -159t-68.5 -149.5t-92 -130.5q-23 -29 -59 -29h-1328q-37 0 -59 29q-53 59 -93 130.5t-67.5 149.5t-42 159t-14.5 159zM158 627q0 -49 33.5 -83 t82.5 -34t83 34t34 83t-34.5 82.5t-82.5 33.5q-49 0 -82.5 -33.5t-33.5 -82.5zM352 1098q0 -49 35 -84t82 -35q49 0 84 35t35 84t-35 82.5t-84 33.5q-47 0 -82 -33.5t-35 -82.5zM743 313q0 -82 57.5 -139t139.5 -57t139.5 57t57.5 139q0 49 -26 91t-67 71q4 14 15.5 55 t27 95.5t33 114t30.5 110.5t22.5 88t9.5 43q0 23 -17.5 40t-40.5 17q-20 0 -35.5 -12t-21.5 -31l-135 -487q-39 -2 -74 -17.5t-60.5 -42t-40 -61.5t-14.5 -74zM823 1292q0 -49 34 -82.5t83 -33.5t83 33.5t34 82.5t-34 83t-83 34t-83 -34t-34 -83zM1292 1098q0 -49 35 -83 t84 -34t83 34t34 83t-34 82.5t-83 33.5t-84 -33.5t-35 -82.5zM1489 627q0 -49 34 -83t83 -34t82.5 34t33.5 83t-33.5 82.5t-82.5 33.5t-83 -33.5t-34 -82.5z" />
242
+ <glyph unicode="&#xf0e5;" horiz-adv-x="1916" d="M0 866q0 123 49 225.5t130 183.5t184.5 139.5t209.5 92.5q94 31 190.5 45.5t194.5 14.5t194.5 -14.5t190.5 -45.5q106 -35 210 -93t185 -139t130 -183.5t49 -225.5t-49 -225t-130 -183t-184.5 -140.5t-210.5 -92.5q-94 -31 -190 -45t-195 -14q-92 0 -180 12 q-92 -72 -195.5 -119t-215.5 -73q-27 -4 -55.5 -10.5t-53.5 -6.5q-16 0 -27.5 11.5t-11.5 27.5q0 12 8.5 21.5t16.5 17.5q31 33 53 60.5t37.5 57.5t25 64.5t17.5 79.5q-78 43 -145.5 100.5t-120 128t-82 153.5t-29.5 175zM160 866q0 -72 24.5 -133t65.5 -113.5t94 -95.5 t111 -75q27 -14 51 -27.5t49 -28.5q-10 -47 -17.5 -94t-19.5 -94q59 29 111.5 64.5t105.5 76.5q55 -8 110.5 -14t112.5 -6q156 0 308 43q84 25 171 68.5t158.5 107t116.5 143.5t45 178t-45 178t-116.5 143.5t-158.5 107.5t-171 69q-152 43 -308 43q-158 0 -307 -43 q-84 -25 -171 -69t-158.5 -107.5t-116.5 -143t-45 -178.5z" />
243
+ <glyph unicode="&#xf0e6;" horiz-adv-x="1916" d="M0 997q0 98 40 182.5t106.5 151t150.5 113.5t170 76q76 25 154.5 36t156.5 11q80 0 159 -11.5t155 -35.5q86 -29 170 -76t149.5 -113.5t105 -150.5t39.5 -183q0 -98 -39.5 -182t-105 -149.5t-149.5 -113.5t-170 -77q-154 -47 -314 -47q-37 0 -72.5 3t-72.5 7 q-150 -115 -336 -155q-20 -4 -43 -9.5t-45 -5.5q-12 0 -21.5 9.5t-9.5 23.5q0 10 7.5 17.5l13.5 13.5q51 51 72.5 96t35.5 117q-63 35 -118.5 82t-97.5 104t-66.5 124t-24.5 142zM160 997q0 -72 30.5 -127t77.5 -99t104.5 -78t112.5 -64l-20 -111q33 18 63.5 42t59.5 46 q47 -6 95 -12t95 -6q135 0 264 41q61 18 124 52t114 81t84 105.5t33 129.5q0 72 -33 131.5t-84 105.5t-113.5 80t-124.5 52q-63 23 -129.5 32t-134.5 9q-66 0 -132 -9t-132 -32q-59 -18 -122.5 -52t-115 -80t-84 -105.5t-32.5 -131.5zM649 258l27 16q51 -6 102 -6 q197 0 381 62q111 37 211 99.5t177 147.5t123 190t46 230q0 41 -6 84q90 -72 148.5 -169t58.5 -214q0 -76 -24.5 -142.5t-66.5 -123.5t-97.5 -104t-118.5 -82q14 -72 35.5 -117t72.5 -96q6 -6 13.5 -14.5t7.5 -18.5q0 -16 -10.5 -23.5t-24.5 -7.5q-20 0 -43 5.5t-41 9.5 q-186 41 -336 155q-37 -4 -72.5 -7t-72.5 -3q-129 0 -254 32t-236 97z" />
244
+ <glyph unicode="&#xf0e7;" horiz-adv-x="933" d="M0 557q0 8 2 10l209 932q4 16 16.5 26.5t28.5 10.5h344q18 0 31.5 -13.5t13.5 -33.5q0 -6 -1 -10t-3 -11l-180 -524q12 4 47 13.5t81 21.5t95 26.5t93 25.5t75 18.5t37 7.5q18 0 31.5 -13.5t13.5 -33.5q0 -12 -2 -19l-565 -1306q-10 -29 -43 -29q-18 0 -33 13.5t-15 33.5 q0 6 3 10l204 914q-12 -4 -48 -14.5t-82 -22.5t-97 -26.5t-95 -27t-76 -19.5t-38 -7q-20 0 -33.5 14.5t-13.5 32.5z" />
245
+ <glyph unicode="&#xf0e8;" d="M0 78v383q0 33 22.5 55.5t55.5 22.5h133v153q0 55 40 94t95 39h518v174h-135q-31 0 -53.5 21.5t-22.5 54.5v385q0 31 22.5 53.5t53.5 22.5h385q31 0 53.5 -22.5t22.5 -53.5v-385q0 -33 -22.5 -54.5t-53.5 -21.5h-135v-174h518q55 0 95 -38.5t40 -94.5v-153h135 q31 0 53.5 -22.5t22.5 -55.5v-383q0 -33 -22.5 -55.5t-53.5 -22.5h-385q-33 0 -54 22.5t-21 55.5v383q0 33 21.5 55.5t53.5 22.5h136v153q0 18 -21 19h-518v-172h135q31 0 53.5 -22.5t22.5 -55.5v-383q0 -33 -22.5 -55.5t-53.5 -22.5h-385q-31 0 -53.5 22.5t-22.5 55.5v383 q0 33 22.5 55.5t53.5 22.5h135v172h-518q-20 0 -20 -19v-153h135q33 0 55.5 -22.5t22.5 -55.5v-383q0 -33 -22.5 -55.5t-55.5 -22.5h-383q-33 0 -55.5 22.5t-22.5 55.5z" />
246
+ <glyph unicode="&#xf0e9;" horiz-adv-x="1884" d="M0 770q31 137 109.5 253t193.5 204t257 141t302 66v53q0 35 23.5 57.5t56.5 22.5q35 0 57.5 -22.5t22.5 -57.5v-53q160 -12 303 -65.5t258 -141.5t192.5 -204t108.5 -253q6 -29 -20 -43q-10 -6 -19 -6q-20 0 -28 12q-98 102 -218 103q-86 0 -163.5 -54.5t-130.5 -152.5 q-10 -23 -35 -23t-35 23q-82 150 -213 194v-526q0 -68 -23.5 -127t-63.5 -104.5t-93.5 -71t-114.5 -25.5t-115.5 25.5t-94.5 71t-63.5 104.5t-23.5 127q0 35 23.5 57.5t56.5 22.5q35 0 57.5 -22.5t22.5 -57.5q0 -70 40 -119t97 -49q55 0 95 49t40 119v526 q-131 -45 -213 -194q-10 -23 -35 -23t-34 23q-53 98 -130 152.5t-163 54.5q-121 0 -217 -103q-12 -12 -31 -12q-10 0 -19 6q-25 14 -20 43z" />
247
+ <glyph unicode="&#xf0ea;" horiz-adv-x="1597" d="M0 385v1075q0 31 22.5 53.5t55.5 22.5h921q31 0 53.5 -22.5t22.5 -53.5v-231h33h61q25 0 55.5 -13.5t49.5 -29.5l280 -281q18 -18 30.5 -49t12.5 -55v-62v-678q0 -27 -17 -44t-44 -17h-860q-27 0 -44.5 17.5t-17.5 43.5v246h-536q-33 0 -55.5 22.5t-22.5 55.5zM276 1321 q0 -12 9.5 -21.5t21.5 -9.5h461q12 0 21.5 9.5t9.5 21.5v61q0 12 -9.5 21.5t-21.5 9.5h-461q-12 0 -21.5 -9t-9.5 -22v-61zM737 123h738v555h-367q-27 0 -44 17.5t-17 43.5v367h-310v-983zM1169 801h306q0 2 -3.5 8t-5.5 10l-280 279q0 4 -6 4q-2 0 -2 1t-2 1t-3.5 1t-3.5 1 v-305z" />
248
+ <glyph unicode="&#xf105;" horiz-adv-x="2048" />
249
+ <glyph unicode="&#xf200;" horiz-adv-x="1536" d="M0 57v379q0 39 20.5 87t54.5 90t74.5 73t81.5 35q-35 -59 -34 -129q0 -59 16 -124t59 -106q-18 -37 -18 -75q0 -72 50 -122t122 -50q37 0 68.5 13t55 36.5t37 55.5t13.5 67t-13.5 66.5t-37 55t-55 38t-68.5 14.5q-18 0 -36.5 -5t-35.5 -14q-12 12 -20 31t-13.5 40.5 t-7.5 41.5t-2 37q0 47 28 86t62 67l142 21q-92 57 -142.5 150.5t-50.5 201.5q0 86 33 162t90 133t133 90t162 33t162 -33t133 -90t90 -133t33 -162q0 -109 -50.5 -202t-142.5 -150l158 -23q18 -16 34.5 -36.5t16.5 -47.5q0 -45 -18 -77q-59 33 -121 32q-45 0 -87 -17 t-77 -46q-6 2 -11 3t-11 1q-47 0 -82 -34t-35 -81t34.5 -80.5t82.5 -33.5q47 0 80.5 33.5t33.5 80.5q0 8 -2 15.5t-4 13.5q16 12 35.5 20.5t42.5 8.5q55 0 95 -39t40 -94q0 -23 -8 -41.5t-19 -34.5q-25 10 -45 10q-47 0 -81.5 -34t-34.5 -81t34.5 -80.5t81.5 -33.5t81 33.5 t34 80.5l-2 4q74 74 74 177q0 74 -41 137q45 70 45 157q0 31 -12 62q41 -4 83 -34t74.5 -72t53 -90t20.5 -89v-379q-10 -6 -22.5 -15t-25.5 -18.5t-26.5 -16.5t-21.5 -7h-1344q-35 0 -52 20.5t-44 36.5zM369 287q0 25 17 41t40 16q25 0 41 -16t16 -41q0 -23 -16 -40.5 t-41 -17.5q-23 0 -40 17.5t-17 40.5z" />
250
+ <glyph unicode="&#xf201;" horiz-adv-x="1597" />
251
+ <glyph unicode="&#xf202;" horiz-adv-x="1597" />
252
+ <glyph unicode="&#xf203;" horiz-adv-x="1597" />
253
+ <glyph unicode="&#xf204;" horiz-adv-x="1597" />
254
+ </font>
255
+ </defs></svg>
assets/shared-ui/font/fontawesome-webfont.svgz ADDED
Binary file
assets/shared-ui/font/fontawesome-webfont.ttf ADDED
Binary file
assets/shared-ui/font/fontawesome-webfont.woff ADDED
Binary file
assets/shared-ui/img/spin-grey.gif ADDED
Binary file
assets/shared-ui/img/spin.gif ADDED
Binary file
assets/shared-ui/notice.css ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ****************************************************************************
2
+ * NOTIFICATION STYLES
3
+ *
4
+ * Those styles are identical with the free-dashboard-notification submodule.
5
+ * Any changes made in this section should also be made to the other module!
6
+ */
7
+
8
+ .wrap .frash-notice.notice {
9
+ padding: 0;
10
+ margin: 5px 0 10px;
11
+ border: 1px solid #E5E5E5;
12
+ background: #FFF;
13
+ overflow: hidden;
14
+ -webkit-border-radius: 6px;
15
+ border-radius: 6px;
16
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.05);
17
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.05);
18
+ position: relative;
19
+ z-index: 1;
20
+ min-height: 80px;
21
+ display: table; /* The magic ingredient! */
22
+ font: 13px "Open Sans", sans-serif;
23
+ }
24
+ .wrap .frash-notice.notice.loading:before {
25
+ content: attr(data-message);
26
+ position: absolute;
27
+ left: 0;
28
+ right: 0;
29
+ top: 0;
30
+ bottom: 0;
31
+ background-color: rgba(255, 255, 255, 0.7);
32
+ z-index: 5;
33
+ text-align: center;
34
+ line-height: 80px;
35
+ font-size: 22px;
36
+ font-weight: bold;
37
+ }
38
+ .frash-notice > div {
39
+ display: table-cell; /* The magic ingredient! */
40
+ vertical-align: middle;
41
+ cursor: default;
42
+ }
43
+ .frash-notice.notice.loading > div {
44
+ -webkit-filter: blur(2px);
45
+ -moz-filter: blur(2px);
46
+ -o-filter: blur(2px);
47
+ -ms-filter: blur(2px);
48
+ filter: blur(2px);
49
+ }
50
+ .frash-notice-logo {
51
+ background-color: #0B2F3F;
52
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgODAgODAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+DQoJPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiBmaWxsPSJub25lIj48L3JlY3Q+DQoJPGVsbGlwc2UgZmlsbD0iIzJEQThERSIgY3g9IjQwIiBjeT0iNDAuMDAxOTgyOCIgcng9IjI4IiByeT0iMjguMDAxOTgyOCI+PC9lbGxpcHNlPg0KCTxwYXRoIGQ9Ik0zNC45MDc1LDM3LjYzMDU2NDkgTDM0LjkwNzUsMzUuMTgwMzkxNCBDMzQuOTA3NSwzMi4wMzg5MTg5IDMyLjY0MTI1LDI5LjQ5MjQ4ODYgMjkuODQxMjUsMjkuNDkyNDg4NiBDMjcuMDQxMjUsMjkuNDkyNDg4NiAyNC43NzUsMzIuMDM4OTE4OSAyNC43NzUsMzUuMTgwMzkxNCBMMjQuNzc1LDM1LjE4MDM5MTQgTDI0Ljc3NSw1MC41MDI3MjYzIEwyOC4xMTc1LDQ3Ljg3NzU0MDQgTDI4LjExNzUsMzUuMTgwMzkxNCBDMjguMTMzMzk1NSwzNC4xODk3Mzg1IDI4Ljg4MjkwOTksMzMuMzY1MjE0MiAyOS44Njc1LDMzLjI1NTI1NTEgQzMxLjU3Mzc1LDMzLjAwMTQ4NzEgMzQuMzgyNSwzNC44MDQxMTQ3IDM0LjkwNzUsMzcuNjMwNTY0OSBMMzQuOTA3NSwzNy42MzA1NjQ5IFoiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4NCgk8cGF0aCBkPSJNNDMuMzg2MjUsMzMuMjU1MjU1MSBDNDUuMTM2MjUsMzMuMDEwMjM3NyA0Ny45Mjc1LDM0LjgwNDExNDcgNDguNDUyNSwzNy42MzA1NjQ5IEw0OC40NTI1LDM1LjE4MDM5MTQgQzQ4LjQ1MjUsMzIuMDM4OTE4OSA0Ni4xODYyNSwyOS40OTI0ODg2IDQzLjM4NjI1LDI5LjQ5MjQ4ODYgQzQwLjk2MjUsMjkuNDkyNDg4NiAzOC4zMiwzMS41OTI2MzczIDM4LjMyLDM1LjE5Nzg5MjYgTDM4LjMyLDQzLjc2NDc0OTIgQzM4LjMyLDQ1LjAzMzU4OTEgMzcuNTg1LDQ2LjA2NjE2MjIgMzYuNjY2MjUsNDUuOTUyNDA0MSBDMzkuMzg3NSw0Ni4yOTM2NzgzIDQxLjc3NjI1LDQyLjI0MjE0MTQgNDEuNjYyNSwzOC43NTkzOTQ4IEw0MS42NjI1LDM1LjE5Nzg5MjYgQzQxLjYwNzYxMDcsMzQuMTg3MzMxMSA0Mi4zNzY0MDI0LDMzLjMyMDkxNTYgNDMuMzg2MjUsMzMuMjU1MjU1MSBMNDMuMzg2MjUsMzMuMjU1MjU1MSBaIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+DQoJPHBhdGggZD0iTTUxLjg2NSwzMi4xMjY0MjUxIEw1MS44NjUsNDMuNzU1OTk4NiBDNTEuODY1LDQ1LjAyNDgzODQgNTEuMTIxMjUsNDYuMDU3NDExNiA1MC4yMiw0NS45NDM2NTM1IEM1Mi45NDEyNSw0Ni4yODQ5Mjc3IDU1LjMzLDQyLjIzMzM5MDggNTUuMjE2MjUsMzguNzUwNjQ0MiBMNTUuMjE2MjUsMjkuNTAxMjM5MiBMNTEuODY1LDMyLjEyNjQyNTEgWiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPg0KCTxwYXRoIGQ9Ik01MC4xNTg3NSw0Ni43Mzk5NTk5IEM1MS45MDg3NSw0Ni45NDk5NzQ4IDU0LjcsNDUuMTkxMTAwMiA1NS4yMjUsNDIuMzY0NjUwMSBMNTUuMjI1LDQ0LjgxNDgyMzYgQzU1LjIyNSw0Ny45NTYyOTYgNTIuOTU4NzUsNTAuNTAyNzI2MyA1MC4xNTg3NSw1MC41MDI3MjYzIEM0Ny44NjYyNSw1MC41MDI3MjYzIDQ1LjA5MjUsNDguNjM4ODQ0MyA0NS4wOTI1LDQ0LjgxNDgyMzYgTDQ1LjA5MjUsMzYuMjQ3OTY3IEM0NS4wOTI1LDM0Ljk3OTEyNzEgNDQuMzQ4NzUsMzMuOTQ2NTU0IDQzLjQzODc1LDM0LjA2MDMxMjEgQzQ2LjE2LDMzLjcxOTAzNzkgNDguNTQ4NzUsMzcuNzcwNTc0OCA0OC40MzUsNDEuMjUzMzIxNCBMNDguNDM1LDQ0LjgxNDgyMzYgQzQ4LjQ0NTM5NTksNDUuNzk4MDk0MSA0OS4xODI2NTY0LDQ2LjYyMTQ4OSA1MC4xNTg3NSw0Ni43Mzk5NTk5IEw1MC4xNTg3NSw0Ni43Mzk5NTk5IFoiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4NCgk8cGF0aCBkPSJNMzYuNjEzNzUsNDYuNzQ4NzEwNSBDMzguMzYzNzUsNDYuOTg0OTc3MiA0MS4xNTUsNDUuMTk5ODUwOCA0MS42OCw0Mi4zNzM0MDA3IEw0MS42OCw0NC44MjM1NzQyIEM0MS42OCw0Ny45NjUwNDY2IDM5LjQxMzc1LDUwLjUxMTQ3NjkgMzYuNjEzNzUsNTAuNTExNDc2OSBDMzQuMTksNTAuNTExNDc2OSAzMS41NDc1LDQ4LjQxMTMyODIgMzEuNTQ3NSw0NC44MDYwNzMgTDMxLjU0NzUsMzYuMjM5MjE2MyBDMzEuNTQ3NSwzNC45NzAzNzY1IDMwLjgwMzc1LDMzLjkzNzgwMzQgMjkuOTAyNSwzNC4wNTE1NjE0IEMzMi42MjM3NSwzMy43MTAyODczIDM1LjAxMjUsMzcuNzYxODI0MiAzNC44OTg3NSw0MS4yNDQ1NzA4IEwzNC44OTg3NSw0NC44MDYwNzMgQzM0Ljg0MzcxMTgsNDUuODEzNDQ3MyAzNS42MDczOTA5LDQ2LjY3ODQ5MiAzNi42MTM3NSw0Ni43NDg3MTA1IEwzNi42MTM3NSw0Ni43NDg3MTA1IFoiIGZpbGw9IiNGRkZGRkYiID48L3BhdGg+DQo8L3N2Zz4=);
53
+ background-repeat: no-repeat;
54
+ background-position: 50% 50%;
55
+ }
56
+ .frash-notice-logo span {
57
+ display: block;
58
+ width: 80px;
59
+ }
60
+ .frash-notice-message {
61
+ width: 100%;
62
+ padding: 10px 20px;
63
+ color: #444;
64
+ }
65
+ .frash-notice-message strong {
66
+ color: #000;
67
+ }
68
+ .frash-notice-cta {
69
+ border-left: 1px solid #E5E5E5;
70
+ background: #F8F8F8;
71
+ padding: 0 30px;
72
+ position: relative;
73
+ white-space: nowrap;
74
+ }
75
+ .wp-core-ui .frash-notice-cta button,
76
+ .wp-core-ui .frash-notice-cta .button-primary:active {
77
+ vertical-align: middle;
78
+ }
79
+ .wp-core-ui .frash-notice-cta input[type="email"] {
80
+ vertical-align: middle;
81
+ line-height: 20px;
82
+ margin: 0;
83
+ min-width: 50px;
84
+ max-width: 320px;
85
+ text-align: center;
86
+ padding-left: 0;
87
+ padding-right: 0;
88
+ }
89
+ .frash-notice-dismiss {
90
+ background: transparent;
91
+ border: 0;
92
+ cursor: pointer;
93
+ color: #BBB;
94
+ }
95
+ .frash-notice-dismiss:hover {
96
+ color: #666;
97
+ }
98
+
99
+ .frash-notice .frash-notice-logo {
100
+ position: relative;
101
+ }
102
+ .frash-notice .frash-notice-logo:before,
103
+ .frash-notice .frash-notice-logo:after {
104
+ content: '';
105
+ position: absolute;
106
+ z-index: 0;
107
+ background: inherit;
108
+ left: 0;
109
+ top: 0;
110
+ width: 80px;
111
+ bottom: 0;
112
+ }
113
+ .frash-notice .frash-notice-logo:before {
114
+ background-image: none;
115
+ z-index: 1;
116
+ }
117
+ .frash-notice .frash-notice-logo:after {
118
+ animation: spin 30s linear infinite;
119
+ background-color: rgba(0, 0, 0, 0);
120
+ z-index: 2;
121
+ }
122
+
123
+ @media only all and (max-width: 1200px) {
124
+ .frash-notice-dismiss {
125
+ display: block;
126
+ margin: 0 auto;
127
+ line-height: 18px;
128
+ padding-top: 8px;
129
+ padding-bottom: 2px;
130
+ }
131
+ }
132
+
133
+ @media only all and (max-width: 1000px) {
134
+ .wrap .frash-notice.notice {
135
+ display: block;
136
+ font-size: 13px;
137
+ }
138
+ .frash-notice > .frash-notice-logo {
139
+ float: left;
140
+ display: inline-block;
141
+ height: 80px;
142
+ margin: 10px;
143
+ border-radius: 4px;
144
+ }
145
+ .frash-notice > .frash-notice-message {
146
+ width: auto;
147
+ display: block;
148
+ padding: 10px;
149
+ min-height: 80px;
150
+ }
151
+ .frash-notice > .frash-notice-cta {
152
+ display: block;
153
+ border-top: 1px solid #E5E5E5;
154
+ border-left: 0;
155
+ text-align: center;
156
+ white-space: normal;
157
+ line-height: 30px;
158
+ padding: 10px 20px;
159
+ }
160
+ .wp-core-ui .frash-notice > .frash-notice-cta > input[type="email"],
161
+ .frash-notice > .frash-notice-cta > button {
162
+ font-size: 14px;
163
+ }
164
+ .frash-notice > .frash-notice-cta > .frash-notice-dismiss {
165
+ display: inline-block;
166
+ float: none;
167
+ line-height: 26px;
168
+ padding-top: 0;
169
+ padding-bottom: 0;
170
+ font-size: 13px;
171
+ }
172
+ }
173
+
174
+ @media only all and (max-width: 500px) {
175
+ .wp-core-ui .frash-notice > .frash-notice-cta > input[type="email"],
176
+ .frash-notice > .frash-notice-cta > button {
177
+ display: block;
178
+ width: 100% !important;
179
+ max-width: none;
180
+ margin-bottom: 4px;
181
+ font-size: 16px;
182
+ height: 34px;
183
+ }
184
+ .frash-notice > .frash-notice-cta > .frash-notice-dismiss {
185
+ margin-top: 5px;
186
+ font-size: 14px;
187
+ height: 23px;
188
+ }
189
+ }
assets/shared-ui/notice.js ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(function() {
2
+ var el_notice, msg_id = el_notice, btn_dismiss;
3
+
4
+ // Display the notice after the page was loaded.
5
+ function initialize() {
6
+ if (! jQuery(".frash-notice:visible").length) {
7
+ el_notice = jQuery(".frash-notice");
8
+ msg_id = el_notice.find("input[name=msg_id]").val();
9
+ btn_dismiss = el_notice.find(".frash-notice-dismiss");
10
+
11
+ // Dismiss the notice without any action.
12
+ btn_dismiss.click(function(ev) {
13
+ ev.preventDefault();
14
+ notify_wordpress("wdev_notice_dismiss", btn_dismiss.data("msg"));
15
+ });
16
+
17
+ // Display the notification.
18
+ el_notice.fadeIn(500);
19
+ }
20
+ }
21
+
22
+ // Hide the notice after a CTA button was clicked
23
+ function remove_notice() {
24
+ el_notice.fadeTo(100 , 0, function() {
25
+ el_notice.slideUp(100, function() {
26
+ el_notice.remove();
27
+ });
28
+ });
29
+ }
30
+
31
+ // Notify WordPress about the users choice and close the message.
32
+ function notify_wordpress(action, message) {
33
+ var ajax_data = {};
34
+
35
+ if ('0' !== msg_id) {
36
+ el_notice.attr("data-message", message);
37
+ el_notice.addClass("loading");
38
+
39
+ ajax_data.msg_id = msg_id;
40
+ ajax_data.action = action;
41
+ jQuery.post(
42
+ window.ajaxurl,
43
+ ajax_data,
44
+ remove_notice
45
+ );
46
+ } else {
47
+ remove_notice();
48
+ }
49
+ }
50
+
51
+ window.setTimeout(initialize, 550);
52
+ });
assets/shared-ui/plugin-ui.php ADDED
@@ -0,0 +1,267 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Provides PHP support for simple use of the WPMUDEV plugin UI.
4
+ *
5
+ * @package WPMUDEV_UI
6
+ */
7
+
8
+ if ( ! class_exists( 'WDEV_Plugin_Ui' ) ) {
9
+
10
+ /**
11
+ * UI class that encapsulates all module functions.
12
+ */
13
+ class WDEV_Plugin_Ui {
14
+
15
+ /**
16
+ * Current module version.
17
+ */
18
+ const VERSION = '1.0';
19
+
20
+ /**
21
+ * Internal translation container.
22
+ *
23
+ * @var array
24
+ */
25
+ static protected $i10n = array();
26
+
27
+ /**
28
+ * Internal storage that holds additional classes for body tag.
29
+ *
30
+ * @var array
31
+ */
32
+ static protected $body_class = '';
33
+
34
+ /**
35
+ * URL to this module (directory). Used to enqueue the css/js files.
36
+ *
37
+ * @var string
38
+ */
39
+ static protected $module_url = '';
40
+
41
+ /**
42
+ * Initializes all UI components.
43
+ *
44
+ * @since 1.0.0
45
+ * @internal
46
+ */
47
+ static public function reset() {
48
+ self::$i10n = array(
49
+ 'empty_search' => __( 'Nothing found', 'wpmudev' ),
50
+ 'default_msg_ok' => __( 'Okay, we saved your changes!', 'wpmudev' ),
51
+ 'default_msg_err' => __( 'Oops, we could not do this...', 'wpmudev' ),
52
+ );
53
+ }
54
+
55
+ /**
56
+ * Enqueues the CSS and JS files needed for plugin UI
57
+ *
58
+ * @since 1.0.0
59
+ * @api Call this function before/in `admin_head`.
60
+ * @param string $module_url URL to this module (directory).
61
+ * @param string $body_class List of additional classes for the body tag.
62
+ */
63
+ static public function load( $module_url, $body_class = '' ) {
64
+ self::$module_url = trailingslashit( $module_url );
65
+ self::$body_class = trim( $body_class );
66
+ add_filter(
67
+ 'admin_body_class',
68
+ array( __CLASS__, 'admin_body_class' )
69
+ );
70
+
71
+ if ( ! did_action( 'admin_enqueue_scripts' ) ) {
72
+ add_action(
73
+ 'admin_enqueue_scripts',
74
+ array( __CLASS__, 'enqueue' )
75
+ );
76
+ } else {
77
+ self::enqueue();
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Enqueues the CSS and JS files.
83
+ *
84
+ * @since 1.0.0
85
+ * @internal Do not call this method manually. It's called by `load()`!
86
+ */
87
+ static public function enqueue() {
88
+ wp_enqueue_style(
89
+ 'wdev-plugin-google_fonts',
90
+ 'https://fonts.googleapis.com/css?family=Roboto+Condensed:400,700|Roboto:400,500,300,300italic',
91
+ false,
92
+ self::VERSION
93
+ );
94
+
95
+ wp_enqueue_style(
96
+ 'wdev-plugin-ui',
97
+ self::$module_url . 'wdev-ui.css',
98
+ array( 'wdev-plugin-google_fonts' ),
99
+ self::VERSION
100
+ );
101
+
102
+ wp_enqueue_script(
103
+ 'wdev-plugin-ui',
104
+ self::$module_url . 'wdev-ui.js',
105
+ array( 'jquery' ),
106
+ self::VERSION
107
+ );
108
+ }
109
+
110
+ /**
111
+ * Adds the page-specific class to the admin page body tag.
112
+ *
113
+ * @since 1.0.0
114
+ * @internal Action hook
115
+ * @param string $classes List of CSS classes of the body tag.
116
+ * @return string Updated list of CSS classes.
117
+ */
118
+ static public function admin_body_class( $classes ) {
119
+ $classes .= ' wpmud';
120
+ if ( self::$body_class ) {
121
+ $classes .= ' ' . self::$body_class;
122
+ }
123
+ $classes .= ' ';
124
+
125
+ return $classes;
126
+ }
127
+
128
+ /**
129
+ * Sets a translation from javascript.
130
+ *
131
+ * @since 1.0.0
132
+ * @api Use this before calling `output_header()`.
133
+ * @param string $key The translation key (used in javascript).
134
+ * @param string $value Human readable text.
135
+ */
136
+ static public function translate( $key, $value ) {
137
+ self::$i10n[ $key ] = (string) $value;
138
+ }
139
+
140
+ /**
141
+ * Outputs code in the page header.
142
+ *
143
+ * This function must be called by the plugin!
144
+ * It's not important if it's in the header or in the footer of the page,
145
+ * but in top/header is recommended.
146
+ *
147
+ * @since 1.0.0
148
+ * @api Call this function somewhere after output started.
149
+ * @param array $commands Optinal list of additional JS commands that
150
+ * are executed when page loaded.
151
+ */
152
+ static public function output( $commands = array() ) {
153
+ $data = array();
154
+ $data[] = 'window.WDP = window.WDP || {}';
155
+ $data[] = 'WDP.data = WDP.data || {}';
156
+ $data[] = 'WDP.data.site_url = ' . json_encode( get_site_url() );
157
+ $data[] = 'WDP.lang = ' . json_encode( self::$i10n );
158
+
159
+ // Add custom JS commands to the init-code.
160
+ if ( is_array( $commands ) ) {
161
+ $data = array_merge( $data, $commands );
162
+ }
163
+
164
+ /**
165
+ * Display a custom success message on the WPMU Dashboard pages.
166
+ *
167
+ * @var string|array The message to display.
168
+ * Array options:
169
+ * 'type' => [ok|err] (default: 'ok')
170
+ * 'delay' => 3000 (default: 3000ms)
171
+ * 'message' => '...' (required!)
172
+ */
173
+ $notice = apply_filters( 'wpmudev-admin-notice', false );
174
+ if ( $notice ) {
175
+ $command = 'WDP';
176
+ if ( is_array( $notice ) && ! empty( $notice['type'] ) ) {
177
+ $command .= sprintf( '.showMessage("type", "%s")', esc_attr( $notice['type'] ) );
178
+ }
179
+ if ( is_array( $notice ) && ! empty( $notice['delay'] ) ) {
180
+ $command .= sprintf( '.showMessage("delay", %s)', intval( $notice['delay'] ) );
181
+ }
182
+ if ( is_array( $notice ) && ! empty( $notice['message'] ) ) {
183
+ $command .= sprintf( '.showMessage("message", "%s")', esc_html( $notice['message'] ) );
184
+ } elseif ( is_string( $notice ) ) {
185
+ $command .= sprintf( '.showMessage("message", "%s")', esc_html( $notice ) );
186
+ }
187
+ $command .= '.showMessage("show")';
188
+ $data[] = $command;
189
+ }
190
+
191
+ foreach ( $data as $item ) {
192
+ printf(
193
+ "<script>;jQuery(function(){%s;});</script>\n",
194
+ // @codingStandardsIgnoreStart: This is javascript code, no escaping!
195
+ $item
196
+ // @codingStandardsIgnoreEnd
197
+ );
198
+ }
199
+ }
200
+
201
+ /**
202
+ * Output the HTML code to display the notification.
203
+ *
204
+ * @since 1.0.0
205
+ * @param string $module_url URL to this module (directory).
206
+ * @param array $msg The message details.
207
+ * id .. Required, can be any valid class-name.
208
+ * content .. Required, can contain HTML.
209
+ * dismissed .. Optional. If true then no message is output.
210
+ * can_dismiss .. Optional. If true a Dismiss button is added.
211
+ * cta .. Optional. Can be HTML code of a button/link.
212
+ */
213
+ static public function render_dev_notification( $module_url, $msg ) {
214
+ if ( ! is_array( $msg ) ) { return; }
215
+ if ( ! isset( $msg['id'] ) ) { return; }
216
+ if ( empty( $msg['content'] ) ) { return; }
217
+ if ( $msg['dismissed'] ) { return; }
218
+
219
+ $css_url = $module_url . 'notice.css';
220
+ $js_url = $module_url . 'notice.js';
221
+
222
+ if ( empty( $msg['id'] ) ) {
223
+ $msg_dismiss = '';
224
+ } else {
225
+ $msg_dismiss = __( 'Saving', 'wpmudev' );
226
+ }
227
+
228
+ $show_actions = $msg['can_dismiss'] || $msg['cta'];
229
+
230
+ $allowed = array(
231
+ 'a' => array( 'href' => array(), 'title' => array(), 'target' => array(), 'class' => array() ),
232
+ 'br' => array(),
233
+ 'hr' => array(),
234
+ 'em' => array(),
235
+ 'i' => array(),
236
+ 'strong' => array(),
237
+ 'b' => array(),
238
+ );
239
+
240
+ ?>
241
+ <link rel="stylesheet" type="text/css" href="<?php echo esc_url( $css_url ); ?>" />
242
+ <div class="notice frash-notice" style="display:none">
243
+ <input type="hidden" name="msg_id" value="<?php echo esc_attr( $msg['id'] ); ?>" />
244
+
245
+ <div class="frash-notice-logo"><span></span></div>
246
+ <div class="frash-notice-message">
247
+ <?php echo wp_kses( $msg['content'], $allowed ); ?>
248
+ </div>
249
+ <?php if ( $show_actions ) : ?>
250
+ <div class="frash-notice-cta">
251
+ <?php echo wp_kses( $msg['cta'], $allowed ); ?>
252
+ <?php if ( $msg['can_dismiss'] ) : ?>
253
+ <button class="frash-notice-dismiss" data-msg="<?php echo esc_attr( $msg_dismiss ); ?>">
254
+ <?php esc_html_e( 'Dismiss', 'wpmudev' ); ?>
255
+ </button>
256
+ <?php endif; ?>
257
+ </div>
258
+ <?php endif; ?>
259
+ </div>
260
+ <script src="<?php echo esc_url( $js_url ); ?>"></script>
261
+ <?php
262
+ }
263
+ };
264
+
265
+ // Initialize the UI.
266
+ WDEV_Plugin_Ui::reset();
267
+ }
assets/shared-ui/wdev-ui.css ADDED
@@ -0,0 +1,2499 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * CSS Styles used by WPMUDEV plugins.
3
+ *
4
+ * To apply these styles add these classes to the mentioned tags:
5
+ * <html> .. add class "wpmud-html"
6
+ * <body> .. add class "wpmud"
7
+ *
8
+ * -----------------------------------------------------------------------------
9
+ *
10
+ * 1. GLOBAL STYLES, TYPOGRAPHY
11
+ * 2. ELEMENT STATES
12
+ * 3. ELEMENT: BOX
13
+ * 4. ELEMENT: LIST
14
+ * 5. ELEMENT: LIST-TABLE
15
+ * 6. ELEMENT: GRID
16
+ * 7. ELEMENT: HORIZONTAL TABS
17
+ * 8. ELEMENT: VERTICAL TABS
18
+ * 9. ELEMENT: TOOLTIPS
19
+ * 10. ELEMENT: OVERLAYS
20
+ * 11. ELEMENT: DASHBOARD NOTIFICATONS (enhancements)
21
+ * 12. ELEMENT: BUTTONS
22
+ * 13. ELEMENT: FORMS
23
+ * 14. ELEMENT: INPUT (general styles)
24
+ * 15. ELEMENT: TOGGLE (styled checkbox)
25
+ * 16. ELEMENT: RADIO GROUP (styled radio)
26
+ * 17. ELEMENT: SELECT
27
+ * 18. ELEMENT: LISTINGS
28
+ * 19. ELEMENT: USER NOTIFICATIONS
29
+ * 20. ELEMENT: SEARCH BOX
30
+ * 21. ELEMENT: COUNT-BADGE
31
+ * 22. ELEMENT: PAGE HEADER
32
+ * 23. FONTAWESOME
33
+ * 24. WPMUDEV ICONFONT
34
+ * 25. CUSTOM ANIMATIONS
35
+ *
36
+ * -----------------------------------------------------------------------------
37
+ */
38
+
39
+ /* ****************************************************************************
40
+ * 1. GLOBAL STYLES, TYPOGRAPHY
41
+ */
42
+ .wpmud-html {
43
+ background-color: #F4F4F4;
44
+ }
45
+ .wpmud #wpbody {
46
+ background: #F4F4F4;
47
+ -webkit-font-smoothing: antialiased !important;
48
+ }
49
+ .wpmud #wpbody * {
50
+ box-sizing: border-box;
51
+ -moz-box-sizing: border-box;
52
+ }
53
+ .wpmud #container {
54
+ margin-top: 30px;
55
+ font-family: 'Roboto', sans-serif;
56
+ font-weight: 400;
57
+ font-size: 15px;
58
+ line-height: 1.5em;
59
+ color: #777771;
60
+ letter-spacing: -0.015em;
61
+ }
62
+ .wpmud h1,
63
+ .wpmud h2,
64
+ .wpmud h3,
65
+ .wpmud h4,
66
+ .wpmud h5,
67
+ .wpmud h6 {
68
+ display: block;
69
+ margin: 0.5em auto;
70
+ padding: 0;
71
+ line-height: 1em;
72
+ text-align: center;
73
+ color: #777771;
74
+ }
75
+ .wpmud h1,
76
+ .wpmud h2,
77
+ .wpmud h3 {
78
+ font-family: 'Roboto Condensed', 'Roboto', sans-serif;
79
+ font-weight: 400;
80
+ max-width: 900px;
81
+ text-transform: uppercase;
82
+ }
83
+ .wpmud h4,
84
+ .wpmud h5,
85
+ .wpmud h6 {
86
+ font-family: 'Roboto', sans-serif;
87
+ font-weight: 500;
88
+ }
89
+ .wpmud h1 {
90
+ font-size: 60px;
91
+ font-weight: 700;
92
+ }
93
+ .wpmud h2 {
94
+ font-size: 50px;
95
+ text-transform: none;
96
+ }
97
+ .wpmud h3 {
98
+ font-size: 50px;
99
+ }
100
+ .wpmud h4 {
101
+ font-size: 36px;
102
+ text-transform: uppercase;
103
+ }
104
+ .wpmud h5 {
105
+ font-size: 36px;
106
+ }
107
+ .wpmud h6 {
108
+ font-size: 28px;
109
+ font-weight: 400;
110
+ }
111
+ .wpmud p {
112
+ display: block;
113
+ margin: 0.5em 0;
114
+ padding: 0;
115
+ font-family: 'Roboto', sans-serif;
116
+ font-weight: 400;
117
+ font-size: 15px;
118
+ line-height: 21px;
119
+ color: #777771;
120
+ }
121
+ .wpmud p small {
122
+ font-size: 12.5px;
123
+ line-height: 17px;
124
+ display: inline-block;
125
+ color: #555550;
126
+ }
127
+ .wpmud p big {
128
+ font-size: 18px;
129
+ line-height: 24px;
130
+ display: inline-block;
131
+ font-weight: 400;
132
+ color: #888882;
133
+ }
134
+ .wpmud p:first-child {
135
+ margin-top: 0;
136
+ }
137
+ .wpmud p:last-child {
138
+ margin-bottom: 0;
139
+ }
140
+ .wpmud .notice p {
141
+ margin:5px 0;
142
+ }
143
+ .wpmud dfn {
144
+ font-style: normal;
145
+ font-weight: normal;
146
+ border-bottom: 1px dotted #999;
147
+ }
148
+ .wpmud code,
149
+ .wpmud pre {
150
+ font: 400 13px/15px Consolas, Monaco, monospace;
151
+ border-left: 2px solid rgba(0,0,0,0.2);
152
+ padding: 5px 10px 5px 10px;
153
+ background: rgba(0,0,0,0.05);
154
+ border-radius: 3px;
155
+ color: #555;
156
+ margin: 1em 0;
157
+ overflow: auto;
158
+ vertical-align: middle;
159
+ }
160
+ .wpmud code {
161
+ display: inline-block;
162
+ margin: 0;
163
+ }
164
+ #wpfooter {
165
+ display: none;
166
+ }
167
+ .wpmud a {
168
+ text-decoration: none;
169
+ color: #19B4CF;
170
+ }
171
+ .wpmud a:active,
172
+ .wpmud a:focus,
173
+ .wpmud a:hover {
174
+ color: #477B92;
175
+ }
176
+ .wpmud a.disabled,
177
+ .wpmud a.disabled:active,
178
+ .wpmud a.disabled:hover,
179
+ .wpmud a.disabled:focus {
180
+ color: 788084;
181
+ cursor: default;
182
+ }
183
+
184
+ /* ****************************************************************************
185
+ * 2. ELEMENT STATES
186
+ */
187
+ .wpmud .block {
188
+ display: block;
189
+ width: 100%;
190
+ float: none;
191
+ }
192
+ .wpmud .button.block,
193
+ .wpmud button.block,
194
+ .wpmud input.block {
195
+ text-align: center;
196
+ }
197
+ .wpmud .space-t {
198
+ margin-top: 20px;
199
+ }
200
+ .wpmud .space-b {
201
+ margin-bottom: 20px;
202
+ }
203
+ .wpmud .tl {
204
+ text-align: left;
205
+ }
206
+ .wpmud .tc {
207
+ text-align: center;
208
+ }
209
+ .wpmud .tr {
210
+ text-align: right;
211
+ }
212
+ .wpmud .group {
213
+ clear: both;
214
+ margin: 0 0 30px;
215
+ }
216
+ .wpmud .group:after {
217
+ content: '';
218
+ display: table;
219
+ clear: both;
220
+ }
221
+ .wpmud .input-group {
222
+ display: inline-block;
223
+ white-space: nowrap;
224
+ }
225
+ .wpmud .float-r {
226
+ float: right;
227
+ }
228
+ .wpmud .float-l {
229
+ float: left;
230
+ }
231
+ .wpmud .pointer {
232
+ cursor: pointer;
233
+ }
234
+ .wpmud .dev-label {
235
+ background: #ECECEC;
236
+ border: 1px solid #E5E5E5;
237
+ color: #BABABA;
238
+ line-height: 30px;
239
+ padding: 0 10px;
240
+ border-radius: 3px;
241
+ display: inline-block;
242
+ vertical-align: middle;
243
+ margin: 0 5px;
244
+ cursor: default;
245
+ }
246
+ .wpmud .can-close .box-title .close,
247
+ .wpmud .can-close .close-icon {
248
+ cursor: pointer;
249
+ position: relative;
250
+ display: inline-block;
251
+ width: 22px;
252
+ height: 22px;
253
+ line-height: 22px;
254
+ float: right;
255
+ }
256
+ .wpmud .can-close .box-title .close {
257
+ float: right;
258
+ margin: 20px -10px 0 0;
259
+ }
260
+ .wpmud .can-close .box-title .close:after,
261
+ .wpmud .can-close .close-icon:after {
262
+ content: "\79";
263
+ font-family: 'WPMU-DEV-App-Icons';
264
+ speak: none;
265
+ font-style: normal;
266
+ font-weight: normal;
267
+ font-variant: normal;
268
+ text-transform: none;
269
+ line-height: 22px;
270
+ text-align: center;
271
+ font-size: 14px;
272
+ -webkit-font-smoothing: antialiased;
273
+ -moz-osx-font-smoothing: grayscale;
274
+ position: absolute;
275
+ left: 0;
276
+ right: 0;
277
+ top: 0;
278
+ bottom: 0;
279
+ background: #FFF;
280
+ color: #777771;
281
+ transition: color 0.3s;
282
+ }
283
+ .wpmud .can-close .box-title .close:hover:after,
284
+ .wpmud .can-close .close-icon:hover:after {
285
+ color: #333;
286
+ }
287
+ /* http://loading.io/loader/?use=eyJzaXplIjo2MCwic3BlZWQiOjEsImNiayI6IiM5OTk5OTkiLCJjMSI6IiMwMDAiLCJjMiI6IjciLCJjMyI6IjEwIiwiYzQiOiJ5LWF4aXMiLCJ0eXBlIjoic3BpbiJ9 */
288
+ .wpmud .loading.disabled:before,
289
+ .wpmud .loading:before {
290
+ content: '';
291
+ background: transparent url(img/spin.gif) center center no-repeat;
292
+ background-size: contain;
293
+ display: inline-block;
294
+ width: 18px;
295
+ height: 18px;
296
+ vertical-align: top;
297
+ position: static;
298
+ border: none;
299
+ margin: 0;
300
+ z-index: 1;
301
+ opacity: 1;
302
+ }
303
+ .wpmud .has-hover .show-on-hover {
304
+ opacity: 0;
305
+ transition-property: opacity;
306
+ transition-duration: 0.3s;
307
+ }
308
+ .wpmud .has-hover:hover .show-on-hover,
309
+ .wpmud .has-hover .show-on-hover.loading {
310
+ opacity: 1;
311
+ }
312
+
313
+ /* ****************************************************************************
314
+ * 3. ELEMENT: BOX
315
+ */
316
+ .wpmud .dev-box {
317
+ border-radius: 5px;
318
+ background-color: #FFF;
319
+ box-shadow: 0 2px 0 #EAEAEA;
320
+ padding: 30px;
321
+ margin: 0 0 30px;
322
+ }
323
+ .wpmud .dev-box .box-title {
324
+ height: 60px;
325
+ padding: 0 30px;
326
+ border-bottom: 1px solid #EAEAEA;
327
+ margin: -30px -30px 30px -30px;
328
+ }
329
+ .wpmud .dev-box .box-title .buttons {
330
+ float: right;
331
+ margin: 15px -5px 0 0;
332
+ }
333
+ .wpmud .dev-box .box-title .button {
334
+ font-weight: 700;
335
+ }
336
+ .wpmud .dev-box .box-title h3 {
337
+ font-family: 'Roboto Condensed', 'Roboto', sans-serif;
338
+ font-size: 18px;
339
+ font-weight: 700;
340
+ color: #777771;
341
+ line-height: 60px;
342
+ margin: 0;
343
+ text-align: left;
344
+ white-space: nowrap;
345
+ overflow: hidden;
346
+ text-overflow: ellipsis;
347
+ }
348
+ .wpmud .dev-box .box-title .buttons .dev-icon {
349
+ font-size: 18px;
350
+ }
351
+ .wpmud .box-footer {
352
+ text-align: center;
353
+ margin-top: 32px;
354
+ font-size: 16px;
355
+ }
356
+
357
+ /* ****************************************************************************
358
+ * 4. ELEMENT: LIST
359
+ */
360
+ .wpmud .dev-list {
361
+ list-style: none;
362
+ margin: -20px 0 20px;
363
+ padding: 0;
364
+ }
365
+ .wpmud .dev-list.inline {
366
+ margin-top: 20px;
367
+ margin-bottom: 0;
368
+ }
369
+ .wpmud .dev-list.standalone {
370
+ margin-bottom: -20px;
371
+ }
372
+ .wpmud .dev-list > li {
373
+ position: relative;
374
+ display: table;
375
+ width: 100%;
376
+ padding: 6px 0;
377
+ margin: 0;
378
+ border-collapse: collapse;
379
+ border-spacing: 0;
380
+ }
381
+ .wpmud .dev-list > li > div {
382
+ display: table-row; /* give each list item the full width */
383
+ }
384
+ .wpmud .dev-list > li.list-header {
385
+ text-transform: uppercase;
386
+ font-weight: bold;
387
+ font-family: 'Roboto Condensed';
388
+ padding-top: 0;
389
+ }
390
+ .wpmud .dev-list > li .list-label {
391
+ padding: 10px 10px 10px 0;
392
+ }
393
+ .wpmud .dev-list > li .list-label.list-header {
394
+ font-family: 'Roboto Condensed';
395
+ color: #777771;
396
+ width: 200px;
397
+ }
398
+ .wpmud .dev-list > li .list-label,
399
+ .wpmud .dev-list > li .list-detail {
400
+ display: table-cell;
401
+ vertical-align: middle;
402
+ cursor: default;
403
+ border-bottom: 1px solid #EEEEEE;
404
+ }
405
+ .wpmud .dev-list > li:last-child .list-label,
406
+ .wpmud .dev-list > li:last-child .list-detail {
407
+ border-bottom: 1px solid transparent;
408
+ }
409
+ .wpmud .dev-list > li .list-detail {
410
+ text-align: right;
411
+ padding: 10px 0;
412
+ }
413
+ .wpmud .dev-list.top > li .list-label,
414
+ .wpmud .dev-list.top > li .list-detail {
415
+ vertical-align: top;
416
+ }
417
+ .wpmud .dev-list.left > li .list-label,
418
+ .wpmud .dev-list.left > li .list-detail {
419
+ text-align: left;
420
+ }
421
+ .wpmud .dev-list.top > li strong {
422
+ font-family: 'Roboto Condensed';
423
+ }
424
+ .wpmud .dev-list.nowrap > li .list-label,
425
+ .wpmud .dev-list.nowrap > li .list-detail {
426
+ overflow: hidden;
427
+ text-overflow: ellipsis;
428
+ white-space: nowrap;
429
+ }
430
+ .wpmud .dev-list.nowrap > li .list-label {
431
+ position: absolute;
432
+ top: 0;
433
+ left: 0;
434
+ right: 50px;
435
+ border-bottom: 0;
436
+ }
437
+ .wpmud .dev-list.hover-effect > li.list-header:hover {
438
+ background: transparent;
439
+ }
440
+ .wpmud .dev-list.hover-effect > li.list-header:hover:before,
441
+ .wpmud .dev-list.hover-effect > li.list-header:hover:after {
442
+ display: none;
443
+ }
444
+ .wpmud .dev-list.hover-effect > li:hover {
445
+ background: #FBFBFB;
446
+ }
447
+ .wpmud .dev-list.hover-effect > li:hover .list-label,
448
+ .wpmud .dev-list.hover-effect > li:hover .list-detail {
449
+ border-bottom: 1px solid #EEE;
450
+ }
451
+ .wpmud .dev-list.hover-effect > li:hover:before,
452
+ .wpmud .dev-list.hover-effect > li:hover:after {
453
+ content: '';
454
+ position: absolute;
455
+ left: -30px;
456
+ width: 30px;
457
+ bottom: 0;
458
+ top: -1px;
459
+ background: #FBFBFB;
460
+ border-top: 1px solid #EEE;
461
+ border-bottom: 1px solid #EEE;
462
+ }
463
+ .wpmud .dev-list.hover-effect > li:hover:after {
464
+ right: -30px;
465
+ left: auto;
466
+ }
467
+
468
+ /* ****************************************************************************
469
+ * 5. ELEMENT: LIST-TABLE
470
+ */
471
+ .wpmud .list-table {
472
+ border: 0;
473
+ width: 100%;
474
+ border-spacing: 0;
475
+ border-collapse: collapse;
476
+ }
477
+ .wpmud .list-table > thead > tr > th {
478
+ font-weight: bold;
479
+ text-transform: uppercase;
480
+ text-align: left;
481
+ padding: 8px 10px;
482
+ cursor: default;
483
+ }
484
+ .wpmud .list-table > thead > tr > th:first-child {
485
+ padding-left: 0;
486
+ }
487
+ .wpmud .list-table > thead > tr > th:last-child {
488
+ padding-right: 0;
489
+ }
490
+ .wpmud .list-table > tbody > tr > td {
491
+ padding: 8px 10px;
492
+ border-top: 1px solid #EEE;
493
+ cursor: default;
494
+ position: relative;
495
+ z-index: 1;
496
+ }
497
+ .wpmud .list-table > tbody > tr:last-child > td {
498
+ border-bottom: 1px solid transparent;
499
+ }
500
+ .wpmud .list-table > tbody > tr > td:first-child {
501
+ padding-left: 0;
502
+ }
503
+ .wpmud .list-table > tbody > tr > td:last-child {
504
+ padding-right: 0;
505
+ }
506
+ .wpmud .list-table.hover-effect > tbody > tr:hover > td:first-child:after,
507
+ .wpmud .list-table.hover-effect > tbody > tr:hover > td:last-child:after {
508
+ content: '';
509
+ position: absolute;
510
+ left: -30px;
511
+ top: -1px;
512
+ bottom: -1px;
513
+ width: 30px;
514
+ border-top: 1px solid #EEE;
515
+ border-bottom: 1px solid #EEE;
516
+ background: #FBFBFB;
517
+ }
518
+ .wpmud .list-table.hover-effect > tbody > tr:hover > td:last-child:after {
519
+ right: -30px;
520
+ left: auto;
521
+ }
522
+ .wpmud .list-table.hover-effect > tbody > tr:hover {
523
+ background: #FBFBFB;
524
+ }
525
+ .wpmud .list-table.hover-effect > tbody > tr:hover > td {
526
+ border-top: 1px solid #EEE;
527
+ border-bottom: 1px solid #EEE;
528
+ z-index: 2;
529
+ }
530
+
531
+ /* ****************************************************************************
532
+ * 6. ELEMENT: GRID
533
+ */
534
+ .wpmud .row,
535
+ .wpmud .row-sep {
536
+ clear: both;
537
+ margin: 0 0 0 0;
538
+ position: relative;
539
+ display: table;
540
+ width: 100%;
541
+ table-layout: fixed;
542
+ }
543
+ .wpmud .row:after,
544
+ .wpmud .row-sep:after {
545
+ content: '';
546
+ display: table;
547
+ clear: both;
548
+ }
549
+ .wpmud .row-sep {
550
+ height: 1px;
551
+ margin-bottom: 30px;
552
+ width: auto;
553
+ display: block;
554
+ }
555
+ .wpmud .row-sep:before {
556
+ content: '';
557
+ display: block;
558
+ position: absolute;
559
+ left: 0;
560
+ right: 0;
561
+ bottom: 0;
562
+ border-bottom: 1px solid #E5E5E5;
563
+ }
564
+ .wpmud .row-sep .button {
565
+ margin: 20px auto 0;
566
+ display: block;
567
+ width: 480px;
568
+ text-align: center;
569
+ position: relative;
570
+ top: -20px;
571
+ position: relative;
572
+ z-index: 1;
573
+ background: #FFF;
574
+ }
575
+ .wpmud .row-sep .button.button-small {
576
+ top: -14px;
577
+ }
578
+ .wpmud .row-sep .button:before,
579
+ .wpmud .row-sep .button:after {
580
+ content: '';
581
+ position: absolute;
582
+ z-index: 0;
583
+ left: -30px;
584
+ width: 30px;
585
+ top: 0;
586
+ bottom: 0;
587
+ background: #FFF;
588
+ }
589
+ .wpmud .row-sep .button:after {
590
+ right: -30px;
591
+ left: auto;
592
+ }
593
+ .wpmud .row-space {
594
+ margin-bottom: 30px;
595
+ }
596
+ .wpmud .row .col-third,
597
+ .wpmud .row .col-two-third,
598
+ .wpmud .row .col-half {
599
+ display: table-cell;
600
+ padding: 0 15px 0 15px;
601
+ position: relative;
602
+ vertical-align: top;
603
+ }
604
+ .wpmud .row .col-third {
605
+ width: 33.3333%;
606
+ }
607
+ .wpmud .row .col-two-third {
608
+ width: 66.6666%;
609
+ }
610
+ .wpmud .row .col-half {
611
+ width: 50%;
612
+ }
613
+ .wpmud .row .col-third:first-child,
614
+ .wpmud .row .col-two-third:first-child,
615
+ .wpmud .row .col-half:first-child {
616
+ padding-left: 0;
617
+ }
618
+ .wpmud .row .col-third:last-child,
619
+ .wpmud .row .col-two-third:last-child,
620
+ .wpmud .row .col-half:last-child {
621
+ padding-right: 0;
622
+ }
623
+
624
+ /* ****************************************************************************
625
+ * 7. ELEMENT: HORIZONTAL TABS
626
+ */
627
+ .wpmud .tabs {
628
+ float: none;
629
+ position: relative;
630
+ padding: 0;
631
+ margin: 0 0 30px;
632
+ background-color: #FFF;
633
+ border-top-left-radius: 5px;
634
+ border-top-right-radius: 5px;
635
+ }
636
+ .wpmud .tabs:before,
637
+ .wpmud .tabs:after {
638
+ content: '';
639
+ display: table;
640
+ clear: both;
641
+ }
642
+ .wpmud .tabs .tab {
643
+ float: left;
644
+ }
645
+ .wpmud .tabs .tab:first-child label {
646
+ border-top-left-radius: 5px;
647
+ }
648
+ .wpmud .tabs .tab label {
649
+ display: block;
650
+ padding: 10px 30px;
651
+ line-height: 40px;
652
+ margin: 0;
653
+ top: 0;
654
+ height: 60px;
655
+ cursor: pointer;
656
+ position: relative;
657
+ background-color: #FEFEFE;
658
+ color: #BFBABA;
659
+ border-right: 1px solid #EAEAEA;
660
+ text-transform: uppercase;
661
+ }
662
+ .wpmud .tabs .tab input[type=radio] {
663
+ display: none;
664
+ }
665
+ .wpmud .tabs .tab input[type=radio]:checked + label {
666
+ background-color: #FFF;
667
+ color: #777771;
668
+ height: 61px;
669
+ z-index: 3;
670
+ }
671
+ .wpmud .tabs .tab .content {
672
+ z-index: 2;
673
+ display: none;
674
+ text-align: left;
675
+ left: 0;
676
+ right: 0;
677
+ width: auto;
678
+ padding: 30px;
679
+ position: absolute;
680
+ top: 60px;
681
+ min-height: 150px;
682
+ border-top: 1px solid #EAEAEA;
683
+ background-color: #FFF;
684
+ overflow: auto;
685
+ border-bottom-left-radius: 5px;
686
+ border-bottom-right-radius: 5px;
687
+ box-shadow: 0 2px 0 #EAEAEA;
688
+ }
689
+ .wpmud .tabs .tab input[type=radio]:checked ~ .content {
690
+ display: block;
691
+ }
692
+ .wpmud .dev-box .tabs {
693
+ border: 1px solid #EAEAEA;
694
+ }
695
+ .wpmud .dev-box .tabs .tab .content {
696
+ border: 1px solid #EAEAEA;
697
+ left: -1px;
698
+ right: -1px;
699
+ box-shadow: none;
700
+ }
701
+
702
+ /* ****************************************************************************
703
+ * 8. ELEMENT: VERTICAL TABS
704
+ */
705
+ .wpmud .vertical-tabs {
706
+ display: block;
707
+ position: relative;
708
+ margin-bottom: 30px;
709
+ }
710
+ .wpmud .vertical-tabs > .tab > input[type="radio"] {
711
+ /* NO `top: -9999px` - else page scrolls to top when tab is clicked! */
712
+ left: -9999px;
713
+ position: absolute;
714
+ z-index: -10;
715
+ opacity: 0;
716
+ }
717
+ .wpmud .vertical-tabs > .tab {
718
+ display: block;
719
+ }
720
+ .wpmud .vertical-tabs > .tab > label {
721
+ cursor: pointer;
722
+ display: block;
723
+ padding: 15px 20px;
724
+ text-transform: uppercase;
725
+ font-size: 13px;
726
+ line-height: 28px;
727
+ position: relative;
728
+ width: 200px;
729
+ color: #AAA;
730
+ margin: 0;
731
+ border-radius: 5px 0 0 5px;
732
+ z-index: 10;
733
+ transition: color 0.3s, background 0.3s;
734
+ }
735
+ .wpmud .vertical-tabs > .tab > label * {
736
+ line-height: 28px;
737
+ }
738
+ .wpmud .vertical-tabs > .tab > label:hover {
739
+ color: #777771;
740
+ }
741
+ .wpmud .vertical-tabs > .tab > label:after {
742
+ content: '';
743
+ position: absolute;
744
+ left: 20px;
745
+ right: 20px;
746
+ bottom: -1px;
747
+ height: 1px;
748
+ border-bottom: 1px solid #E5E5E5;
749
+ }
750
+ .wpmud .vertical-tabs > .tab:last-child > label:after {
751
+ display: none;
752
+ }
753
+ .wpmud .vertical-tabs > .tab > .content {
754
+ display: none;
755
+ left: 200px;
756
+ right: 0;
757
+ min-width: 300px;
758
+ padding: 20px;
759
+ position: absolute;
760
+ top: 0;
761
+ background: #FFF;
762
+ box-shadow: 0 2px 0 #EAEAEA;
763
+ }
764
+ .wpmud .vertical-tabs > .tab > input[type="radio"]:checked + label {
765
+ background: #FFF;
766
+ color: #333;
767
+ box-shadow: 0 2px 0 #EAEAEA;
768
+ }
769
+ .wpmud .vertical-tabs > .tab > input[type="radio"]:checked + label:after {
770
+ display: none;
771
+ }
772
+ .wpmud .vertical-tabs > .tab > input[type="radio"]:checked ~ .content {
773
+ display: block;
774
+ }
775
+ .wpmud .vertical-tabs .tab-title {
776
+ border-bottom: 1px solid #EAEAEA;
777
+ margin: -20px -20px 20px -20px;
778
+ line-height: 28px;
779
+ padding: 15px 20px;
780
+ text-align: left;
781
+ font-size: 16px;
782
+ text-transform: uppercase;
783
+ font-weight: bold;
784
+ }
785
+
786
+ /* ****************************************************************************
787
+ * 9. ELEMENT: TOOLTIPS
788
+ */
789
+ .wpmud .dev-tip {
790
+ width: 420px;
791
+ margin: 0 auto 10px;
792
+ padding: 20px;
793
+ background-color: #0B2F3F;
794
+ border-radius: 5px;
795
+ position: relative;
796
+ }
797
+ .wpmud .dev-tip:after {
798
+ content: '';
799
+ position: absolute;
800
+ bottom: -14px;
801
+ left: 50%;
802
+ margin-left: -7px;
803
+ border: 7px solid transparent;
804
+ border-top-color: #0B2F3F;
805
+ }
806
+ .wpmud .dev-tip,
807
+ .wpmud .dev-tip p {
808
+ font-size: 15px;
809
+ line-height: 18px;
810
+ color: #EEE;
811
+ }
812
+ .wpmud [tooltip] {
813
+ position: relative;
814
+ overflow: visible;
815
+ }
816
+ .wpmud [tooltip]:before {
817
+ content: '';
818
+ position: absolute;
819
+ border: 5px solid transparent;
820
+ border-top-color: #0B2F3F;
821
+ bottom: 100%;
822
+ left: 50%;
823
+ margin-left: -5px;
824
+ margin-bottom: -5px;
825
+ opacity: 0;
826
+ z-index: -1;
827
+ transition: margin .2s, opacity .2s, z-index .2s linear .2s;
828
+ pointer-events: none;
829
+ }
830
+ .wpmud [tooltip]:after {
831
+ content: attr(tooltip);
832
+ position: absolute;
833
+ background: #0B2F3F;
834
+ color: #FFF;
835
+ bottom: 100%;
836
+ left: 50%;
837
+ width: 200px;
838
+ margin-left: -100px;
839
+ margin-bottom: 5px;
840
+ text-align: center;
841
+ padding: 5px;
842
+ border-radius: 4px;
843
+ text-transform: uppercase;
844
+ font: 600 13px/20px 'Roboto Condensed';
845
+ opacity: 0;
846
+ z-index: -1;
847
+ transition: margin .2s, opacity .2s, z-index .2s linear .2s;
848
+ white-space: pre-wrap;
849
+ pointer-events: none;
850
+ }
851
+ .wpmud [tooltip].tooltip-s:after {
852
+ width: 150px;
853
+ margin-left: -75px;
854
+ }
855
+ .wpmud [tooltip].tooltip-l:after {
856
+ width: 280px;
857
+ margin-left: -140px;
858
+ }
859
+ .wpmud [tooltip].tooltip-right:after {
860
+ margin-left: -180px;
861
+ }
862
+ .wpmud [tooltip].tooltip-s.tooltip-right:after {
863
+ margin-left: -130px;
864
+ }
865
+ .wpmud [tooltip].tooltip-l.tooltip-right:after {
866
+ margin-left: -260px;
867
+ }
868
+ .wpmud [tooltip].tooltip-bottom:before {
869
+ border-color: transparent;
870
+ border-bottom-color: #0B2F3F;
871
+ top: 100%;
872
+ bottom: auto;
873
+ margin-top: -5px;
874
+ margin-bottom: 0;
875
+ }
876
+ .wpmud [tooltip].tooltip-bottom:after {
877
+ bottom: auto;
878
+ top: 100%;
879
+ margin-top: 5px;
880
+ margin-bottom: 0;
881
+ }
882
+ .wpmud [tooltip]:hover:before {
883
+ opacity: 1;
884
+ z-index: 1;
885
+ margin-bottom: 0;
886
+ transition: margin .2s, opacity .2s;
887
+ }
888
+ .wpmud [tooltip]:hover:after {
889
+ opacity: 1;
890
+ z-index: 1;
891
+ margin-bottom: 10px;
892
+ transition: margin .2s, opacity .2s;
893
+ }
894
+ .wpmud .disabled[tooltip]:before,
895
+ .wpmud .disabled[tooltip]:after {
896
+ display: none;
897
+ }
898
+
899
+ /* ****************************************************************************
900
+ * 10. ELEMENT: OVERLAYS
901
+ */
902
+ .wpmud dialog {
903
+ display: none;
904
+ }
905
+ .wpmud .dev-overlay {
906
+ position: fixed;
907
+ left: 160px;
908
+ top: 32px;
909
+ right: 0;
910
+ bottom: 0;
911
+ z-index: 1000; /* fixed position is always on top */
912
+ display: none; /* hidden by default */
913
+ overflow: visible;
914
+ }
915
+ .wpmud.folded .dev-overlay {
916
+ left: 36px;
917
+ }
918
+ .wpmud .dev-overlay .back {
919
+ position: absolute;
920
+ top: 0;
921
+ left: 0;
922
+ right: 0;
923
+ bottom: 0;
924
+ background: rgba(20, 72, 95, .85);
925
+ z-index: 0;
926
+ }
927
+ .wpmud .dev-overlay .box-scroll {
928
+ position: absolute;
929
+ left: 0;
930
+ top: 0;
931
+ right: 0;
932
+ bottom: 0;
933
+ z-index: 1;
934
+ overflow: auto;
935
+ }
936
+ .wpmud .dev-overlay .box {
937
+ position: absolute;
938
+ top: 0;
939
+ min-height: 120px;
940
+ left: 50%;
941
+ margin: 20px 0 20px -420px;
942
+ width: 840px;
943
+ background: #FFF;
944
+ border-radius: 5px;
945
+ padding: 40px;
946
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
947
+ box-sizing: border-box;
948
+ z-index: 2;
949
+ overflow: hidden;
950
+ }
951
+ .wpmud .dev-overlay.small .box {
952
+ width: 600px;
953
+ margin-left: -300px;
954
+ }
955
+ .wpmud .dev-overlay .box.loading:before {
956
+ position: absolute;
957
+ left: 0;
958
+ top: 0;
959
+ right: 0;
960
+ bottom: 0;
961
+ background-color: rgba(255,255,255,0.75);
962
+ z-index: 1;
963
+ width: auto;
964
+ height: auto;
965
+ background-size: 18px;
966
+ }
967
+ .wpmud .dev-overlay.no-margin .content {
968
+ margin: -40px;
969
+ }
970
+ .wpmud .dev-overlay.no-margin .fullsize {
971
+ display: block;
972
+ width: 100%;
973
+ }
974
+ .wpmud .dev-overlay .box .title {
975
+ min-height: 60px;
976
+ padding: 0 60px 0 40px;
977
+ border-bottom: 1px solid #EAEAEA;
978
+ margin: -40px -40px 40px -40px;
979
+ }
980
+ .wpmud .dev-overlay .title .close {
981
+ position: absolute;
982
+ right: 0;
983
+ top: 0;
984
+ padding: 0 24px;
985
+ line-height: 60px;
986
+ font-size: 24px;
987
+ font-weight: 400;
988
+ color: #BABABA;
989
+ cursor: pointer;
990
+ }
991
+ .wpmud .dev-overlay .title .close:hover {
992
+ color: #777771;
993
+ }
994
+ .wpmud .dev-overlay .title h3 {
995
+ font-family: 'Roboto Condensed', 'Roboto', sans-serif;
996
+ font-size: 18px;
997
+ font-weight: 700;
998
+ color: #777771;
999
+ line-height: 30px;
1000
+ margin: 0;
1001
+ padding: 15px 0;
1002
+ text-align: left;
1003
+ }
1004
+ .wpmud .dev-overlay .title .title-action {
1005
+ position: absolute;
1006
+ right: 60px;
1007
+ top: 0;
1008
+ height: 60px;
1009
+ vertical-align: middle;
1010
+ box-sizing: border-box;
1011
+ padding: 10px 0;
1012
+ }
1013
+ .wpmud .dev-overlay .title .title-action .button-small {
1014
+ margin: 5px 0;
1015
+ }
1016
+ .wpmud-html.has-overlay {
1017
+ overflow: hidden;
1018
+ }
1019
+ .wpmud-html.has-overlay ul#adminmenu a.wp-has-current-submenu:after,
1020
+ .wpmud-html.has-overlay ul#adminmenu > li.current > a.current:after {
1021
+ border-right-color: #356175;
1022
+ }
1023
+
1024
+ /* ****************************************************************************
1025
+ * 11. ELEMENT: DASHBOARD NOTIFICATONS (enhancements)
1026
+ */
1027
+ .wpmud .wrap .frash-notice.notice {
1028
+ box-shadow: 0 0 0 2px #E8E8E5;
1029
+ }
1030
+ .wpmud .frash-notice .frash-notice-message {
1031
+ font-family: 'Roboto', sans-serif;
1032
+ font-weight: 400;
1033
+ font-size: 15px;
1034
+ line-height: 1.65em;
1035
+ color: #777771;
1036
+ }
1037
+ .wpmud .frash-notice .frash-notice-message b.block {
1038
+ display: block;
1039
+ font-size: 16.5px;
1040
+ }
1041
+
1042
+ /* ****************************************************************************
1043
+ * 12. ELEMENT: BUTTONS
1044
+ */
1045
+ .wpmud button:focus,
1046
+ .wpmud .button:focus {
1047
+ outline-color: transparent;
1048
+ outline-style: none;
1049
+ border: 0;
1050
+ box-shadow: none;
1051
+ }
1052
+ .wpmud button,
1053
+ .wpmud .button {
1054
+ font: 500 15px/20px 'Roboto';
1055
+ background: #00ACCA;
1056
+ color: #FFF;
1057
+ text-transform: uppercase;
1058
+ padding: 11px 20px 9px;
1059
+ height: auto;
1060
+ display: inline-block;
1061
+ margin: 0;
1062
+ border: 0;
1063
+ border-radius: 5px;
1064
+ -moz-border-radius: 5px;
1065
+ cursor: pointer;
1066
+ box-shadow: none;
1067
+ -moz-transition: color 0.3s, opacity 0.3s;
1068
+ transition: color 0.3s, opacity 0.3s;
1069
+ text-shadow: none;
1070
+ }
1071
+ .wpmud button + button,
1072
+ .wpmud .button + button,
1073
+ .wpmud button + .button,
1074
+ .wpmud .button + .button,
1075
+ .wpmud a + button,
1076
+ .wpmud a + .button {
1077
+ margin-left: 10px;
1078
+ }
1079
+ .wpmud button:hover:not(:focus):not(:active),
1080
+ .wpmud .button:hover:not(:focus):not(:active) {
1081
+ background-color: #0093B1;
1082
+ color: #FFF;
1083
+ box-shadow: none;
1084
+ }
1085
+ /* http://www.colorzilla.com/gradient-editor/#0082a1+0,008fae+100 */
1086
+ .wpmud button:active,
1087
+ .wpmud button:focus,
1088
+ .wpmud .button:active,
1089
+ .wpmud .button:focus {
1090
+ color: #FFF;
1091
+ box-shadow: none;
1092
+ background: #0082a1;
1093
+ background: -moz-linear-gradient(top, #0082a1 0%, #008fae 100%);
1094
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#0082a1), color-stop(100%,#008fae));
1095
+ background: -webkit-linear-gradient(top, #0082a1 0%,#008fae 100%);
1096
+ background: -o-linear-gradient(top, #0082a1 0%,#008fae 100%);
1097
+ background: -ms-linear-gradient(top, #0082a1 0%,#008fae 100%);
1098
+ background: linear-gradient(to bottom, #0082a1 0%,#008fae 100%);
1099
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#0082a1', endColorstr='#008fae',GradientType=0 );
1100
+ }
1101
+ /* Variation: Green button */
1102
+ .wpmud .button-green {
1103
+ background: #1ABC9C;
1104
+ }
1105
+ .wpmud .button-green:hover:not(:focus):not(:active) {
1106
+ background: #148F77;
1107
+ }
1108
+ /* http://www.colorzilla.com/gradient-editor/#0a6550+0,0e9272+100 */
1109
+ .wpmud .button-green:active,
1110
+ .wpmud .button-green:focus {
1111
+ color: #FFF;
1112
+ background: #0a6550;
1113
+ background: -moz-linear-gradient(top, #0a6550 0%, #0e9272 100%);
1114
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#0a6550), color-stop(100%,#0e9272));
1115
+ background: -webkit-linear-gradient(top, #0a6550 0%,#0e9272 100%);
1116
+ background: -o-linear-gradient(top, #0a6550 0%,#0e9272 100%);
1117
+ background: -ms-linear-gradient(top, #0a6550 0%,#0e9272 100%);
1118
+ background: linear-gradient(to bottom, #0a6550 0%,#0e9272 100%);
1119
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#0a6550', endColorstr='#0e9272',GradientType=0 );
1120
+ }
1121
+ /* Variation: Secondary Button */
1122
+ .wpmud .button-secondary {
1123
+ background: transparent;
1124
+ color: #00ACCA;
1125
+ box-shadow: 0 0 0 2px #00ACCA inset;
1126
+ }
1127
+ /* Variation: Red Button */
1128
+ .wpmud .button-red {
1129
+ background: transparent;
1130
+ color: #fd6e70;
1131
+ box-shadow: 0 0 0 2px #fd6e70 inset;
1132
+ }
1133
+ .wpmud .button-red:hover:not(:focus):not(:active) {
1134
+ background: #fd6e70;
1135
+ }
1136
+ /* http://www.colorzilla.com/gradient-editor/#E24A4C+0,fd6e70+100 */
1137
+ .wpmud .button-red:active,
1138
+ .wpmud .button-red:focus {
1139
+ color: #FFFFFF;
1140
+ box-shadow: 0 0 0 1px #e24a4c inset;
1141
+ background: #e24a4c;
1142
+ background: -moz-linear-gradient(top, #e24a4c 0%, #fd6e70 100%);
1143
+ background: -webkit-linear-gradient(top, #e24a4c 0%,#fd6e70 100%);
1144
+ background: linear-gradient(to bottom, #e24a4c 0%,#fd6e70 100%);
1145
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e24a4c', endColorstr='#fd6e70',GradientType=0 );
1146
+ }
1147
+ /* Variation: Grey */
1148
+ .wpmud .button-grey {
1149
+ background: #AEAEAE;
1150
+ }
1151
+ .wpmud .button-grey:hover:not(:focus):not(:active) {
1152
+ background: #9E9E9E;
1153
+ }
1154
+ /* http://www.colorzilla.com/gradient-editor/#8e8e8e+0,9e9e9e+100 */
1155
+ .wpmud .button-grey:active,
1156
+ .wpmud .button-grey:focus {
1157
+ color: #FFFFFF;
1158
+ box-shadow: 0 0 0 1px #D8D8D8 inset;
1159
+ background: #8e8e8e;
1160
+ background: -moz-linear-gradient(top, #8e8e8e 0%, #9e9e9e 100%);
1161
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#8e8e8e), color-stop(100%,#9e9e9e));
1162
+ background: -webkit-linear-gradient(top, #8e8e8e 0%,#9e9e9e 100%);
1163
+ background: -o-linear-gradient(top, #8e8e8e 0%,#9e9e9e 100%);
1164
+ background: -ms-linear-gradient(top, #8e8e8e 0%,#9e9e9e 100%);
1165
+ background: linear-gradient(to bottom, #8e8e8e 0%,#9e9e9e 100%);
1166
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#8e8e8e', endColorstr='#9e9e9e',GradientType=0 );
1167
+ }
1168
+ /* Variation: Yellow */
1169
+ .wpmud .button-yellow {
1170
+ background: #FDCE43;
1171
+ }
1172
+ .wpmud .button-yellow:hover:not(:focus):not(:active) {
1173
+ background: #E6BB3B;
1174
+ }
1175
+ /* http://www.colorzilla.com/gradient-editor/#E6BB3B+0,FDCE43+100 */
1176
+ .wpmud .button-yellow:active,
1177
+ .wpmud .button-yellow:focus {
1178
+ color: #FFFFFF;
1179
+ box-shadow: 0 0 0 1px #d6a719 inset;
1180
+ background: #d6a719;
1181
+ background: -moz-linear-gradient(top, #d6a719 0%, #e6bb3b 100%);
1182
+ background: -webkit-linear-gradient(top, #d6a719 0%,#e6bb3b 100%);
1183
+ background: linear-gradient(to bottom, #d6a719 0%,#e6bb3b 100%);
1184
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#d6a719', endColorstr='#e6bb3b',GradientType=0 );
1185
+ }
1186
+ /* Variation: Light */
1187
+ .wpmud .button-light {
1188
+ background: transparent;
1189
+ color: #777771;
1190
+ box-shadow: 0 0 0 1px #E3E3E3 inset;
1191
+ }
1192
+ /* http://www.colorzilla.com/gradient-editor/#f4f4f4+0,e8e8e8+100 */
1193
+ .wpmud .button-light:hover:not(:focus):not(:active) {
1194
+ color: #555;
1195
+ box-shadow: 0 0 0 1px #D8D8D8 inset;
1196
+ background: #f1f1f1;
1197
+ }
1198
+ /* http://www.colorzilla.com/gradient-editor/#d0d0d0+0,f4f4f4+100 */
1199
+ .wpmud .button-light:active,
1200
+ .wpmud .button-light:focus {
1201
+ color: #444;
1202
+ box-shadow: 0 0 0 1px #D0D0D0 inset;
1203
+ background: #d8d8d8;
1204
+ background: -moz-linear-gradient(top, #d8d8d8 0%, #f4f4f4 100%);
1205
+ background: -webkit-linear-gradient(top, #d8d8d8 0%,#f4f4f4 100%);
1206
+ background: linear-gradient(to bottom, #d8d8d8 0%,#f4f4f4 100%);
1207
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#d8d8d8', endColorstr='#f4f4f4',GradientType=0 );
1208
+ }
1209
+ /* Variation: Light */
1210
+ .wpmud .button-deactivated,
1211
+ .wpmud .button-deactivated:hover:not(:focus):not(:active),
1212
+ .wpmud .button-deactivated:active,
1213
+ .wpmud .button-deactivated:focus {
1214
+ color: #AAA;
1215
+ box-shadow: 0 0 0 1px #F3F3F3 inset;
1216
+ background: #F8F8F8;
1217
+ }
1218
+ /* Variation: Text button */
1219
+ .wpmud .button-text {
1220
+ background: transparent;
1221
+ color: #777771;
1222
+ box-shadow: none;
1223
+ border: none;
1224
+ padding-left: 0;
1225
+ padding-right: 0;
1226
+ }
1227
+ .wpmud .button-text:hover:not(:focus):not(:active) {
1228
+ color: #0093B1;
1229
+ box-shadow: none;
1230
+ background: transparent;
1231
+ }
1232
+ /* http://www.colorzilla.com/gradient-editor/#e8e8e8+0,f4f4f4+100 */
1233
+ .wpmud .button-text:active,
1234
+ .wpmud .button-text:focus {
1235
+ color: #0093B1;
1236
+ background: transparent;
1237
+ box-shadow: none;
1238
+ }
1239
+ .wpmud .button.button-text.button-small,
1240
+ .wpmud .button.button-text.button-big {
1241
+ padding-left: 0;
1242
+ padding-right: 0;
1243
+ }
1244
+ .wpmud .button-text.disabled,
1245
+ .wpmud .button-text:disabled {
1246
+ background: transparent !important;
1247
+ }
1248
+ /* Variation: Small button */
1249
+ .wpmud .button.button-small {
1250
+ font: 500 14px/20px 'Roboto Condensed';
1251
+ padding: 6px 12px 4px;
1252
+ height: auto;
1253
+ }
1254
+ /* Variation: Big button */
1255
+ .wpmud .button.button-big {
1256
+ padding: 18px 24px 17px;
1257
+ height: auto;
1258
+ }
1259
+ /* Variation: CTA (normal) */
1260
+ .wpmud .button.button-cta {
1261
+ box-shadow: 0px 3px 0px 0px #0093B1;
1262
+ }
1263
+ .wpmud .button.button-cta:hover:not(:focus):not(:active),
1264
+ .wpmud .button.button-cta:active,
1265
+ .wpmud .button.button-cta:focus {
1266
+ box-shadow: 0px 3px 0px 0px #007391;
1267
+ }
1268
+ /* Variation: CTA (green) */
1269
+ .wpmud .button.button-green.button-cta {
1270
+ box-shadow: 0px 3px 0px 0px #1F947B;
1271
+ }
1272
+ .wpmud .button.button-green.button-cta:hover:not(:focus):not(:active),
1273
+ .wpmud .button.button-green.button-cta:active,
1274
+ .wpmud .button.button-green.button-cta:focus {
1275
+ box-shadow: 0px 3px 0px 0px #00745B;
1276
+ }
1277
+ /* Restore the default WP dismiss button */
1278
+ .wpmud .notice-dismiss,
1279
+ .wpmud .notice-dismiss:hover:not(:focus):not(:active),
1280
+ .wpmud .notice-dismiss:hover,
1281
+ .wpmud .notice-dismiss:focus,
1282
+ .wpmud .notice-dismiss:active {
1283
+ border: none;
1284
+ margin: 0;
1285
+ padding: 9px;
1286
+ background: none;
1287
+ color: #b4b9be;
1288
+ cursor: pointer;
1289
+ }
1290
+
1291
+ /* ****************************************************************************
1292
+ * 13. ELEMENT: FORMS
1293
+ */
1294
+ .wpmud label {
1295
+ display: block;
1296
+ padding: 7px 10px;
1297
+ font-weight: 500;
1298
+ font-family: 'Roboto', sans-serif;
1299
+ font-size: 16px;
1300
+ margin: 0 0 4px;
1301
+ color: #777771;
1302
+ }
1303
+ .wpmud label.inline-label {
1304
+ display: inline-block;
1305
+ margin: 0;
1306
+ padding: 0;
1307
+ font-weight: inherit;
1308
+ font-size: inherit;
1309
+ }
1310
+ .wpmud form > div {
1311
+ padding-top: 5px;
1312
+ }
1313
+ .wpmud form > div:first-child,
1314
+ .wpmud form > div.buttons {
1315
+ padding-top: 0;
1316
+ }
1317
+
1318
+ /* ****************************************************************************
1319
+ * 14. ELEMENT: INPUT (general styles)
1320
+ */
1321
+ .wpmud :focus,
1322
+ .wpmud textarea:focus,
1323
+ .wpmud select:focus,
1324
+ .wpmud input:focus {
1325
+ outline-color: transparent;
1326
+ outline-style: none;
1327
+ box-shadow: none;
1328
+ }
1329
+ .wpmud .input,
1330
+ .wpmud input[type="text"],
1331
+ .wpmud input[type="email"],
1332
+ .wpmud input[type="search"],
1333
+ .wpmud input[type="password"],
1334
+ .wpmud select,
1335
+ .wpmud textarea {
1336
+ color: #999;
1337
+ display: block;
1338
+ font: 500 15px/25px 'Roboto';
1339
+ width: 100%;
1340
+ max-width: 100%;
1341
+ padding: 7px 15px 6px;
1342
+ margin: 0px 0px 15px 0px;
1343
+ border: 1px solid #DDD;
1344
+ background: #FFF;
1345
+ border-radius: 4px;
1346
+ box-shadow: none;
1347
+ transition-property: background, color, border-color;
1348
+ transition-duration: 0.3s;
1349
+ }
1350
+ .wpmud .input:hover,
1351
+ .wpmud .input:focus,
1352
+ .wpmud input[type="text"]:hover,
1353
+ .wpmud input[type="text"]:focus,
1354
+ .wpmud input[type="email"]:hover,
1355
+ .wpmud input[type="email"]:focus,
1356
+ .wpmud input[type="search"]:hover,
1357
+ .wpmud input[type="search"]:focus,
1358
+ .wpmud input[type="password"]:hover,
1359
+ .wpmud input[type="password"]:focus,
1360
+ .wpmud select:hover,
1361
+ .wpmud select:focus,
1362
+ .wpmud textarea:hover,
1363
+ .wpmud textarea:focus {
1364
+ border-color: #BBB;
1365
+ color: #3D464D;
1366
+ }
1367
+ .wpmud .input:hover:not(:focus),
1368
+ .wpmud input[type="text"]:hover:not(:focus),
1369
+ .wpmud input[type="email"]:hover:not(:focus),
1370
+ .wpmud input[type="search"]:hover:not(:focus),
1371
+ .wpmud input[type="password"]:hover:not(:focus),
1372
+ .wpmud select:hover:not(:focus),
1373
+ .wpmud textarea:hover:not(:focus) {
1374
+ color: #3D464D;
1375
+ }
1376
+ .wpmud .input:disabled,
1377
+ .wpmud .input.disabled,
1378
+ .wpmud input[type="text"]:disabled,
1379
+ .wpmud input[type="text"].disabled,
1380
+ .wpmud input[type="email"]:disabled,
1381
+ .wpmud input[type="email"].disabled,
1382
+ .wpmud input[type="search"]:disabled,
1383
+ .wpmud input[type="search"].disabled,
1384
+ .wpmud input[type="password"]:disabled,
1385
+ .wpmud input[type="password"].disabled,
1386
+ .wpmud select:disabled,
1387
+ .wpmud select.disabled,
1388
+ .wpmud textarea:disabled,
1389
+ .wpmud textarea.disabled {
1390
+ background: #F6F6F6 !important;
1391
+ color: #AAA !important;
1392
+ border-color: #DDD !important;
1393
+ cursor: default;
1394
+ }
1395
+ .wpmud input[type="text"]::-webkit-input-placeholder,
1396
+ .wpmud input[type="email"]::-webkit-input-placeholder,
1397
+ .wpmud input[type="search"]::-webkit-input-placeholder,
1398
+ .wpmud input[type="password"]::-webkit-input-placeholder,
1399
+ .wpmud textarea::-webkit-input-placeholder {
1400
+ position: relative;
1401
+ top: 0;
1402
+ }
1403
+ .wpmud input[type="text"]:focus::-webkit-input-placeholder,
1404
+ .wpmud input[type="email"]:focus::-webkit-input-placeholder,
1405
+ .wpmud input[type="search"]:focus::-webkit-input-placeholder,
1406
+ .wpmud input[type="password"]:focus::-webkit-input-placeholder,
1407
+ .wpmud textarea:focus::-webkit-input-placeholder {
1408
+ transition: opacity 0.3s 0.4s ease;
1409
+ opacity: 0.25;
1410
+ }
1411
+
1412
+ /* ****************************************************************************
1413
+ * 15. ELEMENT: TOGGLE (styled checkbox)
1414
+ */
1415
+ .wpmud .toggle {
1416
+ position: relative;
1417
+ display: inline-block;
1418
+ vertical-align: middle;
1419
+ white-space: nowrap;
1420
+ }
1421
+ .wpmud .toggle .toggle-checkbox {
1422
+ display: none;
1423
+ }
1424
+ .wpmud .toggle .toggle-label {
1425
+ background: #1ABC9C;
1426
+ display: inline-block;
1427
+ position: relative;
1428
+ height: 21px;
1429
+ width: 34px;
1430
+ padding: 0;
1431
+ margin: 0;
1432
+ border-radius: 11px;
1433
+ transition: background .2s;
1434
+ }
1435
+ .wpmud .toggle .toggle-label:before {
1436
+ content: '';
1437
+ position: absolute;
1438
+ transition: all .2s;
1439
+ border-radius: 11px;
1440
+ background: #DDD;
1441
+ }
1442
+ .wpmud .toggle .toggle-label:after {
1443
+ content: '';
1444
+ background: #FCFCFC;
1445
+ display: inline-block;
1446
+ position: relative;
1447
+ width: 19px;
1448
+ height: 19px;
1449
+ transition: margin .2s;
1450
+ border-radius: 11px;
1451
+ margin: 1px;
1452
+ box-shadow: 0 0 0 1px rgba(0,0,0,0.1);
1453
+ }
1454
+ .wpmud .toggle .toggle-checkbox:hover + .toggle-label:after,
1455
+ .wpmud .toggle .toggle-label:hover:after {
1456
+ background: #FFF;
1457
+ box-shadow: 0 0 15px 0px rgba(0,0,0,0.03), 0 5px 2px 0px rgba(0,0,0,0.05), 0 0 0 1px rgba(0,0,0,0.2);
1458
+ }
1459
+ .wpmud .toggle .toggle-checkbox + .toggle-label {
1460
+ background: transparent;
1461
+ }
1462
+ .wpmud .toggle .toggle-checkbox + .toggle-label:before {
1463
+ top: 0;
1464
+ left: 0;
1465
+ right: 0;
1466
+ bottom: 0;
1467
+ }
1468
+ .wpmud .toggle .toggle-checkbox + .toggle-label:after {
1469
+ margin-left: 1px;
1470
+ }
1471
+ .wpmud .toggle .toggle-checkbox:checked + .toggle-label {
1472
+ background: #1ABC9C;
1473
+ }
1474
+ .wpmud .toggle .toggle-checkbox:checked + .toggle-label:before {
1475
+ top: 1px;
1476
+ left: 14px;
1477
+ right: 1px;
1478
+ bottom: 1px;
1479
+ }
1480
+ .wpmud .toggle .toggle-checkbox:checked + .toggle-label:after {
1481
+ margin-left: 14px;
1482
+ }
1483
+ .wpmud .toggle.disabled label,
1484
+ .wpmud .toggle.loading label {
1485
+ opacity: 0.6;
1486
+ cursor: default;
1487
+ }
1488
+ .wpmud .toggle.disabled .toggle-checkbox:hover + .toggle-label:after,
1489
+ .wpmud .toggle.loading .toggle-checkbox:hover + .toggle-label:after,
1490
+ .wpmud .toggle.disabled .toggle-label:hover:after,
1491
+ .wpmud .toggle.loading .toggle-label:hover:after {
1492
+ background: #FCFCFC;
1493
+ box-shadow: 0 0 0 1px rgba(0,0,0,0.1);
1494
+ }
1495
+ .wpmud .toggle.disabled:before,
1496
+ .wpmud .toggle.loading:before {
1497
+ vertical-align: middle;
1498
+ margin-right: 6px;
1499
+ }
1500
+
1501
+ /* ****************************************************************************
1502
+ * 16. ELEMENT: RADIO GROUP (styled radio)
1503
+ */
1504
+ .wpmud .radio-group {
1505
+ border: 1px solid #DDD;
1506
+ border-radius: 5px;
1507
+ display: inline-block;
1508
+ border-spacing: 0;
1509
+ border-collapse: separate;
1510
+ position: relative;
1511
+ }
1512
+ .wpmud .radio-group input[type="radio"] {
1513
+ display: none;
1514
+ }
1515
+ .wpmud .radio-group input[type="radio"] + label {
1516
+ background: rgba(255,255,255,0.35);
1517
+ color: #C6C6C6;
1518
+ display: table-cell;
1519
+ border-right: 1px solid #DDD;
1520
+ position: relative;
1521
+ padding: 8px 10px;
1522
+
1523
+ transition-property: background, color;
1524
+ transition-duration: 0.3s;
1525
+ }
1526
+ .wpmud .radio-group input[type="radio"] + label > [tooltip] {
1527
+ position: absolute;
1528
+ left: 0;
1529
+ top: 0;
1530
+ bottom: 0;
1531
+ right: 0;
1532
+ z-index: 9;
1533
+ }
1534
+ .wpmud .radio-group input[type="radio"]:first-child + label {
1535
+ border-radius: 4px 0 0 4px;
1536
+ }
1537
+ .wpmud .radio-group input[type="radio"] + label:last-child {
1538
+ border-radius: 0 4px 4px 0;
1539
+ border-right: 0;
1540
+ }
1541
+ .wpmud .radio-group input[type="radio"] + label:hover {
1542
+ box-shadow: 0 0 0 1px rgba(0,0,0,0.05) inset;
1543
+ color: #777771;
1544
+ }
1545
+ .wpmud .radio-group input[type="radio"]:checked + label {
1546
+ box-shadow: 0 0 0 1px rgba(0,0,0,0.2) inset;
1547
+ background: #F9F9F9;
1548
+ color: #555;
1549
+ }
1550
+ .wpmud .radio-group.with-icon input[type="radio"] + label {
1551
+ padding-right: 36px;
1552
+ }
1553
+ .wpmud .radio-group.with-icon input[type="radio"] + label:after {
1554
+ content: '\68';
1555
+
1556
+ font-size: 22px;
1557
+ vertical-align: middle;
1558
+ position: absolute;
1559
+ right: 8px;
1560
+ top: 50%;
1561
+ width: 22px;
1562
+ height: 22px;
1563
+ margin-top: -11px;
1564
+ opacity: 0.8;
1565
+ font-family: 'WPMU-DEV-App-Icons';
1566
+ speak: none;
1567
+ font-style: normal;
1568
+ font-weight: normal;
1569
+ font-variant: normal;
1570
+ text-transform: none;
1571
+ line-height: 22px;
1572
+ -webkit-font-smoothing: antialiased;
1573
+ -moz-osx-font-smoothing: grayscale;
1574
+ transition-property: color, opacity;
1575
+ transition-duration: 0.2s;
1576
+ }
1577
+ .wpmud .radio-group.with-icon input[type="radio"] + label:hover:after {
1578
+ color: #1ABC9C;
1579
+ }
1580
+ .wpmud .radio-group.with-icon input[type="radio"]:checked + label {
1581
+ box-shadow: none;
1582
+ }
1583
+ .wpmud .radio-group.with-icon input[type="radio"]:checked + label:after {
1584
+ content: '\67';
1585
+ color: #1ABC9C;
1586
+ box-shadow: none;
1587
+ opacity: 1;
1588
+ }
1589
+
1590
+ /* ****************************************************************************
1591
+ * 17. ELEMENT: SELECT
1592
+ */
1593
+ .wpmud .select-container {
1594
+ position: relative;
1595
+ z-index: 1;
1596
+ display: block;
1597
+ border: 1px solid #ddd;
1598
+ background: #FFF;
1599
+ cursor: pointer;
1600
+ border-radius: 4px;
1601
+ transition-property: background, border-color;
1602
+ transition-duration: 0.3s;
1603
+ z-index: 1;
1604
+ text-align: left;
1605
+ }
1606
+ .wpmud .select-container .dropdown-handle {
1607
+ transition: border-color 0.3s;
1608
+ display: inline-block;
1609
+ position: absolute;
1610
+ width: 45px;
1611
+ height: 41px;
1612
+ top: -1px;
1613
+ right: -1px;
1614
+ z-index: 1011;
1615
+ border-radius: 0 4px 4px 0;
1616
+ border: 1px solid #DDD;
1617
+ border-bottom: 0;
1618
+ border-left-color: transparent;
1619
+ background: #FFF;
1620
+ padding: 0;
1621
+ text-align: center;
1622
+ line-height: 40px;
1623
+ color: #DDD;
1624
+ transition-property: color, border-color;
1625
+ transition-duration: 0.3s;
1626
+ }
1627
+ .wpmud .select-list-container {
1628
+ position: relative;
1629
+ display: block;
1630
+ vertical-align: middle;
1631
+ padding-right: 45px;
1632
+ zoom: 1;
1633
+ }
1634
+ .wpmud .select-list-container .list-value {
1635
+ position: relative;
1636
+ display: block;
1637
+ overflow: hidden;
1638
+ text-overflow: ellipsis;
1639
+ background-clip: padding-box;
1640
+ text-decoration: none;
1641
+ white-space: nowrap;
1642
+ line-height: 24px;
1643
+ height: auto;
1644
+ width: 100%;
1645
+ padding: 8px 8px 8px 15px;
1646
+ border: 0;
1647
+ color: #999;
1648
+ font: 500 15px/25px 'Roboto';
1649
+ transition-property: color;
1650
+ transition-duration: 0.3s;
1651
+ }
1652
+ .wpmud .select-list-container .list-results {
1653
+ position: absolute;
1654
+ top: 41px;
1655
+ left: -9999px;
1656
+ right: -9999px;
1657
+ z-index: 1010;
1658
+ width: 0;
1659
+ border-top: 0;
1660
+ background: #FFF;
1661
+ border: 1px solid #ddd;
1662
+ margin-left: -1px;
1663
+ margin-right: -1px;
1664
+ margin-top: -2px;
1665
+ opacity: 0;
1666
+ border-radius: 0 0 4px 4px;
1667
+ font: 500 15px/25px 'Roboto';
1668
+ transition-property: opacity, border-color;
1669
+ transition-duration: 0.3s;
1670
+ }
1671
+ .wpmud .select-list-container .list-results li {
1672
+ padding: 10px 15px;
1673
+ background: none;
1674
+ color: #777;
1675
+ cursor: pointer;
1676
+ list-style: none;
1677
+ line-height: 15px;
1678
+ word-wrap: break-word;
1679
+ margin: 0;
1680
+ opacity: 0.8;
1681
+ transition-property: opacity;
1682
+ transition-duration: 0.3s;
1683
+ }
1684
+ .wpmud .select-list-container .list-results li:last-child {
1685
+ border-radius: 0 0 3px 3px;
1686
+ }
1687
+ .wpmud .select-list-container .list-results li:hover {
1688
+ background: #b5e6f8;
1689
+ color: #3d464d;
1690
+ }
1691
+ .wpmud .select-list-container .list-results .current {
1692
+ background: #FFF;
1693
+ color: #19b4cf;
1694
+ }
1695
+ .wpmud .select-container:hover {
1696
+ border-color: #BBB;
1697
+ }
1698
+ .wpmud .select-container:hover .list-value {
1699
+ color: #3D464D;
1700
+ }
1701
+ .wpmud .select-container:hover .list-results {
1702
+ border-left-color: #BBB;
1703
+ border-right-color: #BBB;
1704
+ border-bottom-color: #BBB;
1705
+ }
1706
+ .wpmud .select-container:hover .dropdown-handle {
1707
+ border-top-color: #BBB;
1708
+ border-right-color: #BBB;
1709
+ }
1710
+ .wpmud .select-container.active {
1711
+ z-index: 99999;
1712
+ }
1713
+ .wpmud .select-container.active .list-value {
1714
+ background: #FCFCFC;
1715
+ border-radius: 3px 0 0 0;
1716
+ color: #999;
1717
+ }
1718
+ .wpmud .select-container.active .dropdown-handle {
1719
+ border-color: #DDD;
1720
+ border-bottom-right-radius: 0;
1721
+ }
1722
+ .wpmud .select-container.active .list-results {
1723
+ left: 0;
1724
+ right: 0;
1725
+ width: auto;
1726
+ opacity: 1;
1727
+ transition-duration: 0;
1728
+ }
1729
+ .wpmud .select-container.active:hover {
1730
+ border-color: #DDD;
1731
+ }
1732
+ .wpmud .select-container.active:hover .list-value {
1733
+ color: #999;
1734
+ }
1735
+ .wpmud .select-container.active:hover .list-results {
1736
+ border-color: #BBB;
1737
+ }
1738
+ .wpmud .select-container.active:hover .list-results li {
1739
+ opacity: 1;
1740
+ }
1741
+ .wpmud .select-container.active:hover .dropdown-handle {
1742
+ border-color: #BBB;
1743
+ color: #BBB;
1744
+ }
1745
+ .wpmud .list-table > thead > .select-open th,
1746
+ .wpmud .list-table > tfoot > .select-open th,
1747
+ .wpmud .list-table > tbody > .select-open td {
1748
+ z-index: 9;
1749
+ }
1750
+
1751
+ /* ****************************************************************************
1752
+ * 18. ELEMENT: LISTINGS
1753
+ */
1754
+ .wpmud .listing li {
1755
+ color: #777771;
1756
+ line-height: 26px;
1757
+ padding: 2px 0 2px 34px;
1758
+ position: relative;
1759
+ }
1760
+ .wpmud .listing.bold li {
1761
+ font-weight: bold;
1762
+ }
1763
+ .wpmud .listing li:before {
1764
+ content: "\67";
1765
+ color: #0093B1;
1766
+ font-size: 22px;
1767
+ vertical-align: middle;
1768
+ position: absolute;
1769
+ left: 0;
1770
+ top: 3px;
1771
+ width: 22px;
1772
+ height: 22px;
1773
+ opacity: 0.8;
1774
+
1775
+ font-family: 'WPMU-DEV-App-Icons';
1776
+ speak: none;
1777
+ font-style: normal;
1778
+ font-weight: normal;
1779
+ font-variant: normal;
1780
+ text-transform: none;
1781
+ line-height: 1;
1782
+ -webkit-font-smoothing: antialiased;
1783
+ -moz-osx-font-smoothing: grayscale;
1784
+ }
1785
+ .wpmud .listing li.circle:before {
1786
+ content: "\68";
1787
+ }
1788
+ .wpmud .listing li.help:before {
1789
+ content: "\70";
1790
+ }
1791
+ .wpmud .listing li.up:before {
1792
+ content: "\72";
1793
+ }
1794
+ .wpmud .listing li.down:before {
1795
+ content: "\65";
1796
+ }
1797
+ .wpmud .listing li.logo:before {
1798
+ content: "\30";
1799
+ }
1800
+ .wpmud .listing li.cross:before {
1801
+ content: "\79";
1802
+ }
1803
+ .wpmud .listing li.tick:before {
1804
+ content: "\7a";
1805
+ }
1806
+ .wpmud .listing li.lock:before {
1807
+ content: "\61";
1808
+ }
1809
+ .wpmud .listing li.unlock:before {
1810
+ content: "\63";
1811
+ }
1812
+ .wpmud .listing li.black:before {
1813
+ color: #777771;
1814
+ }
1815
+ .wpmud .listing li.red:before {
1816
+ color: #fd6e70;
1817
+ }
1818
+ .wpmud .listing li.green:before {
1819
+ color: #1ABC9C;
1820
+ }
1821
+ .wpmud .listing li.yellow:before {
1822
+ color: #FDCE43;
1823
+ }
1824
+
1825
+ /* ****************************************************************************
1826
+ * 19. ELEMENT: USER NOTIFICATIONS
1827
+ */
1828
+ .wpmud .update-notice,
1829
+ .wpmud .wpmud-loading-info {
1830
+ position: fixed;
1831
+ z-index: 999998;
1832
+ top: 32px;
1833
+ left: 160px;
1834
+ right: 0;
1835
+ margin: 0;
1836
+ padding: 6px 50px;
1837
+ text-align: center;
1838
+ border-radius: 0;
1839
+ text-shadow: 0 1px 1px rgba(0,0,0,0.3);
1840
+ box-shadow: 0 4px 7px -3px rgba(0,0,0,0.3);
1841
+ }
1842
+ .wpmud .update-notice.ok {
1843
+ background: #1ABC9C;
1844
+ }
1845
+ .wpmud .update-notice.err {
1846
+ background: #d54e21;
1847
+ }
1848
+ .wpmud .update-notice p {
1849
+ color: #FFF;
1850
+ font-weight: 400;
1851
+ }
1852
+ .wpmud .update-notice .check-animation {
1853
+ border-color: #FFF;
1854
+ }
1855
+ .wpmud .update-notice .wdv-icon {
1856
+ position: absolute;
1857
+ left: 15px;
1858
+ top: 14px;
1859
+ color: #FFF;
1860
+ font-size: 32px;
1861
+ opacity: 0.75;
1862
+ }
1863
+ .wpmud .update-notice .close {
1864
+ position: absolute;
1865
+ right: 0;
1866
+ top: 0;
1867
+ width: 48px;
1868
+ height: 48px;
1869
+ text-align: center;
1870
+ line-height: 48px;
1871
+ padding: 0;
1872
+ margin: 0;
1873
+ color: #FFF;
1874
+ cursor: pointer;
1875
+ opacity: 0.35;
1876
+ transition: opacity 0.3s;
1877
+ font-weight: 100;
1878
+ font-size: 20px;
1879
+ }
1880
+ .wpmud .update-notice .close:hover {
1881
+ opacity: 1;
1882
+ }
1883
+ .wpmud .update-notice .extra-text {
1884
+ display: block;
1885
+ max-height: 100px;
1886
+ overflow: auto;
1887
+ }
1888
+ .wpmud .wpmud-loading-info {
1889
+ z-index: 999999;
1890
+ padding: 20px 50px;
1891
+ background: rgba(255, 255, 255, 0.9);
1892
+ }
1893
+ .wpmud .wpmud-loading-info p {
1894
+ color: #000;
1895
+ text-shadow: 0 -1px 1px #FFFFFF;
1896
+ }
1897
+ .wpmud.folded .update-notice,
1898
+ .wpmud.folded .wpmud-loading-info {
1899
+ left: 36px;
1900
+ }
1901
+
1902
+ /* ****************************************************************************
1903
+ * 20. ELEMENT: SEARCH BOX
1904
+ */
1905
+ .wpmud .search-box {
1906
+ position: relative;
1907
+ text-align: left;
1908
+ z-index: 999;
1909
+ background: transparent;
1910
+ }
1911
+ .wpmud .search-box .input-box {
1912
+ position: relative;
1913
+ width: 360px;
1914
+ }
1915
+ .wpmud .search-box .input-box input {
1916
+ padding: 6px 40px 7px 15px;
1917
+ margin: 0;
1918
+ }
1919
+ .wpmud .search-box .input-box .search-icon {
1920
+ position: absolute;
1921
+ right: 0;
1922
+ top: 0;
1923
+ height: 40px;
1924
+ width: 40px;
1925
+ text-align: center;
1926
+ line-height: 40px;
1927
+ color: #DDD;
1928
+ cursor: pointer;
1929
+ background: transparent url(img/spin.gif) 500px 500px no-repeat;
1930
+ background-size: 16px;
1931
+ transition-property: color;
1932
+ transition-duration: 0.3s;
1933
+ }
1934
+ .wpmud .search-box .input-box:hover .search-icon {
1935
+ color: #BBB;
1936
+ }
1937
+ .wpmud .search-box .input-box .search-icon:hover {
1938
+ color: #666;
1939
+ }
1940
+ .wpmud .search-box.progress .search-icon {
1941
+ background-position: center;
1942
+ cursor: default;
1943
+ }
1944
+ .wpmud .search-box.progress .search-icon:before {
1945
+ display: none;
1946
+ }
1947
+ .wpmud .tr > .search-box .input-box {
1948
+ margin: 0 0 0 auto;
1949
+ }
1950
+ .wpmud .search-box .current-item {
1951
+ display: none;
1952
+ margin: 0 0;
1953
+ padding: 8px 44px 8px 44px;
1954
+ position: relative;
1955
+ height: 40px;
1956
+ overflow: hidden;
1957
+ white-space: nowrap;
1958
+ text-overflow: ellipsis;
1959
+ cursor: pointer;
1960
+ font: 500 15px/25px 'Roboto';
1961
+ margin: 0;
1962
+ border: 1px solid #DDD;
1963
+ background: #FFF;
1964
+ border-radius: 4px;
1965
+ box-shadow: none;
1966
+ transition-property: border;
1967
+ transition-duration: 0.3s;
1968
+ }
1969
+ .wpmud .search-box .current-item:after {
1970
+ content: "\f153";
1971
+ position: absolute;
1972
+ right: 6px;
1973
+ top: 50%;
1974
+ margin: -14px 0 0;
1975
+ height: 28px;
1976
+ width: 28px;
1977
+ text-align: center;
1978
+ cursor: pointer;
1979
+ color: #EEE;
1980
+ font: 400 16px/28px 'dashicons';
1981
+ transition-property: color;
1982
+ transition-duration: 0.3s;
1983
+ }
1984
+ .wpmud .search-box .search-results {
1985
+ display: block;
1986
+ position: absolute;
1987
+ z-index: 9999;
1988
+ margin: 6px 0 30px;
1989
+ padding: 0;
1990
+ width: 100%;
1991
+ box-sizing: content-box;
1992
+ background: #fff;
1993
+ border: 1px solid rgba(0,0,0,0.12);
1994
+ background-clip: padding-box;
1995
+ box-shadow: 0 3px 7px rgba(0,0,0,0.12);
1996
+ border-radius: 5px;
1997
+ max-height: 460px;
1998
+ overflow: auto;
1999
+ }
2000
+ .wpmud .search-box .no-results {
2001
+ display: none;
2002
+ position: absolute;
2003
+ z-index: 9999;
2004
+ margin: 6px 0 30px;
2005
+ width: 100%;
2006
+ background: #fcfcfc;
2007
+ border: 1px solid rgba(0,0,0,0.08);
2008
+ background-clip: padding-box;
2009
+ box-shadow: 0 3px 7px rgba(0,0,0,0.08);
2010
+ border-radius: 5px;
2011
+ max-height: 460px;
2012
+ overflow: auto;
2013
+ text-align: center;
2014
+ padding: 7px;
2015
+ font-style: italic;
2016
+ cursor: default;
2017
+ color: #999;
2018
+ }
2019
+ .wpmud .search-box .search-results > ul {
2020
+ margin: 0;
2021
+ padding: 0;
2022
+ list-style: none;
2023
+ }
2024
+ .wpmud .search-box .search-results > ul > li {
2025
+ margin: 0 0;
2026
+ padding: 8px 8px 8px 44px;
2027
+ position: relative;
2028
+ min-height: 40px;
2029
+ cursor: pointer;
2030
+ border-bottom: 1px solid #eee;
2031
+ color: #777771;
2032
+ font-size: 13px;
2033
+ transition-property: background, color;
2034
+ transition-duration: 0.3s;
2035
+ }
2036
+ .wpmud .search-box .search-results > ul > li:first-child {
2037
+ border-top-left-radius: 4px;
2038
+ border-top-right-radius: 4px;
2039
+ }
2040
+ .wpmud .search-box .search-results > ul > li:last-child {
2041
+ border-bottom: 0;
2042
+ border-bottom-left-radius: 4px;
2043
+ border-bottom-right-radius: 4px;
2044
+ }
2045
+ .wpmud .search-box .search-results > ul > li:hover {
2046
+ background-color: #F4F4F4;
2047
+ color: #333331;
2048
+ }
2049
+ .wpmud .search-box .current-item .title,
2050
+ .wpmud .search-box .search-results .title {
2051
+ color: #0089d7;
2052
+ font-size: 15px;
2053
+ display: block;
2054
+ overflow: hidden;
2055
+ text-overflow: ellipsis;
2056
+ white-space: nowrap;
2057
+ transition-property: color;
2058
+ transition-duration: 0.3s;
2059
+ }
2060
+ .wpmud .search-box .current-item .title {
2061
+ color: #999;
2062
+ }
2063
+ .wpmud .search-box .current-item:hover {
2064
+ border-color: #BBB;
2065
+ }
2066
+ .wpmud .search-box .current-item:hover:after {
2067
+ color: #BBB;
2068
+ }
2069
+ .wpmud .search-box .current-item:hover .title {
2070
+ color: #19B4CF;
2071
+ }
2072
+ .wpmud .search-box .current-item .thumb,
2073
+ .wpmud .search-box .search-results .thumb {
2074
+ position: absolute;
2075
+ left: 8px;
2076
+ top: 50%;
2077
+ margin: -14px 0 0;
2078
+ width: 28px;
2079
+ height: 28px;
2080
+ background-size: cover;
2081
+ background-position: center;
2082
+ }
2083
+
2084
+ /* ****************************************************************************
2085
+ * 21. ELEMENT: COUNT-BADGE
2086
+ */
2087
+ .wpmud .count {
2088
+ display: inline-block;
2089
+ text-align: center;
2090
+ padding: 2px 10px;
2091
+ min-width: 35px;
2092
+ position: relative;
2093
+ border-radius: 5px;
2094
+ border: 2px solid #DDDDDD;
2095
+ vertical-align: middle;
2096
+ height: 30px;
2097
+ line-height: 24px;
2098
+ color: #b6b6b6;
2099
+ cursor: default;
2100
+ font-weight: normal;
2101
+ }
2102
+ .wpmud .count.reply:before {
2103
+ content: '';
2104
+ position: absolute;
2105
+ bottom: -8px;
2106
+ right: 4px;
2107
+ border-width: 8px 0px 0px 12px;
2108
+ border-style: solid;
2109
+ border-color: #DDDDDD transparent;
2110
+ display: block;
2111
+ width: 0;
2112
+ }
2113
+ .wpmud .count.reply:after {
2114
+ content: '';
2115
+ position: absolute;
2116
+ bottom: -4px;
2117
+ right: 6px;
2118
+ border-width: 4px 0px 0px 6px;
2119
+ border-style: solid;
2120
+ border-color: #fff transparent;
2121
+ display: block;
2122
+ width: 0;
2123
+ }
2124
+ .wpmud .count.reply.mirror:before {
2125
+ left: 4px;
2126
+ border-width: 8px 12px 0px 0px;
2127
+ }
2128
+ .wpmud .count.reply.mirror:after {
2129
+ left: 6px;
2130
+ border-width: 4px 6px 0px 0px;
2131
+ }
2132
+ .wpmud .count.notification {
2133
+ background: #fecf2f;
2134
+ border-color: #fecf2f;
2135
+ color: #fff;
2136
+ }
2137
+ .wpmud .count.notification:before,
2138
+ .wpmud .count.notification:after {
2139
+ border-color: #fecf2f transparent;
2140
+ }
2141
+
2142
+ /* ****************************************************************************
2143
+ * 22. ELEMENT: PAGE HEADER
2144
+ */
2145
+ .wpmud #header {
2146
+ margin-bottom: 40px;
2147
+ }
2148
+ .wpmud #header h1 {
2149
+ text-align: left;
2150
+ text-transform: uppercase;
2151
+ font-size: 32px;
2152
+ font-weight: bold;
2153
+ max-width: none;
2154
+ white-space: nowrap;
2155
+ overflow: hidden;
2156
+ text-overflow: ellipsis;
2157
+ line-height: 40px;
2158
+ }
2159
+ .wpmud #header .actions {
2160
+ float: right;
2161
+ }
2162
+ .wpmud #header .actions .button + .button {
2163
+ margin-left: 2px;
2164
+ }
2165
+ .wpmud #header .actions .flag {
2166
+ position: absolute;
2167
+ top: 0;
2168
+ background: #CAA;
2169
+ color: #fff;
2170
+ border-radius: 0;
2171
+ margin-left: -41px;
2172
+ line-height: 30px;
2173
+ height: 40px;
2174
+ width: 26px;
2175
+ text-align: center;
2176
+ font-size: 18px;
2177
+ z-index: 1000;
2178
+ }
2179
+ .wpmud #header .actions .flag:before {
2180
+ content: '';
2181
+ position: absolute;
2182
+ bottom: 0;
2183
+ left: 0;
2184
+ border: 13px solid transparent;
2185
+ border-width: 8px 13px;
2186
+ border-bottom-color: #F4F4F4;
2187
+ }
2188
+ .wpmud #header .actions .flag [tooltip] {
2189
+ position: absolute;
2190
+ left: 0;
2191
+ right: 0;
2192
+ top: 0;
2193
+ bottom: 5px;
2194
+ }
2195
+ .wpmud #subheader {
2196
+ min-height: 60px;
2197
+ margin-top: -34px;
2198
+ margin-bottom: 20px;
2199
+ }
2200
+
2201
+ /* ****************************************************************************
2202
+ * 23. FONTAWESOME
2203
+ */
2204
+ @font-face {
2205
+ font-family: 'FontAwesomeWdv';
2206
+ src: url('font/fontawesome-webfont.eot');
2207
+ src: url('font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),
2208
+ url('font/fontawesome-webfont.woff') format('woff'),
2209
+ url('font/fontawesome-webfont.ttf') format('truetype'),
2210
+ url('font/fontawesome-webfont.svgz#FontAwesomeRegular') format('svg'),
2211
+ url('font/fontawesome-webfont.svg#FontAwesomeRegular') format('svg');
2212
+ font-weight: normal;
2213
+ font-style: normal;
2214
+ }
2215
+ .wdv-icon:before{font-family:FontAwesomeWdv;font-weight:normal;font-style:normal;display:inline-block;text-decoration:inherit}a .wdv-icon{display:inline-block;text-decoration:inherit}.wdv-icon-large:before{vertical-align:top;font-size:1.3333333333333333em}.btn .wdv-icon{line-height:.9em}li .wdv-icon, .action_links .wdv-icon, .wdv-icon.wdv-icon-fw{display:inline-block;width:1.25em;text-align:center}li .wdv-icon-large.wdv-icon,li .wdv-icon-large.wdv-icon{width:1.875em}li.wdv-icon{margin-left:0;list-style-type:none}li.wdv-icon:before{text-indent:-2em;text-align:center}li.wdv-icon.wdv-icon-large:before{text-indent:-1.3333333333333333em}.wdv-icon-glass:before{content:"\f000"}.wdv-icon-music:before{content:"\f001"}.wdv-icon-search:before{content:"\f002"}.wdv-icon-envelope:before{content:"\f003"}.wdv-icon-heart:before{content:"\f004"}.wdv-icon-star:before{content:"\f005"}.wdv-icon-star-empty:before{content:"\f006"}.wdv-icon-user:before{content:"\f007"}.wdv-icon-film:before{content:"\f008"}.wdv-icon-th-large:before{content:"\f009"}.wdv-icon-th:before{content:"\f00a"}.wdv-icon-th-list:before{content:"\f00b"}.wdv-icon-ok:before{content:"\f00c"}.wdv-icon-remove:before{content:"\f00d"}.wdv-icon-zoom-in:before{content:"\f00e"}.wdv-icon-zoom-out:before{content:"\f010"}.wdv-icon-off:before{content:"\f011"}.wdv-icon-signal:before{content:"\f012"}.wdv-icon-cog:before{content:"\f013"}.wdv-icon-trash:before{content:"\f014"}.wdv-icon-home:before{content:"\f015"}.wdv-icon-file:before{content:"\f016"}.wdv-icon-time:before{content:"\f017"}.wdv-icon-road:before{content:"\f018"}.wdv-icon-download-alt:before{content:"\f019"}.wdv-icon-download:before{content:"\f01a"}.wdv-icon-upload:before{content:"\f01b"}.wdv-icon-inbox:before{content:"\f01c"}.wdv-icon-play-circle:before{content:"\f01d"}.wdv-icon-repeat:before{content:"\f01e"}.wdv-icon-refresh:before{content:"\f021"}.wdv-icon-list-alt:before{content:"\f022"}.wdv-icon-lock:before{content:"\f023"}.wdv-icon-flag:before{content:"\f024"}.wdv-icon-headphones:before{content:"\f025"}.wdv-icon-volume-off:before{content:"\f026"}.wdv-icon-volume-down:before{content:"\f027"}.wdv-icon-volume-up:before{content:"\f028"}.wdv-icon-qrcode:before{content:"\f029"}.wdv-icon-barcode:before{content:"\f02a"}.wdv-icon-tag:before{content:"\f02b"}.wdv-icon-tags:before{content:"\f02c"}.wdv-icon-book:before{content:"\f02d"}.wdv-icon-bookmark:before{content:"\f02e"}.wdv-icon-print:before{content:"\f02f"}.wdv-icon-camera:before{content:"\f030"}.wdv-icon-font:before{content:"\f031"}.wdv-icon-bold:before{content:"\f032"}.wdv-icon-italic:before{content:"\f033"}.wdv-icon-text-height:before{content:"\f034"}.wdv-icon-text-width:before{content:"\f035"}.wdv-icon-align-left:before{content:"\f036"}.wdv-icon-align-center:before{content:"\f037"}.wdv-icon-align-right:before{content:"\f038"}.wdv-icon-align-justify:before{content:"\f039"}.wdv-icon-list:before{content:"\f03a"}.wdv-icon-indent-left:before{content:"\f03b"}.wdv-icon-indent-right:before{content:"\f03c"}.wdv-icon-facetime-video:before{content:"\f03d"}.wdv-icon-picture:before{content:"\f03e"}.wdv-icon-pencil:before{content:"\f040"}.wdv-icon-map-marker:before{content:"\f041"}.wdv-icon-adjust:before{content:"\f042"}.wdv-icon-tint:before{content:"\f043"}.wdv-icon-edit:before{content:"\f044"}.wdv-icon-share:before{content:"\f045"}.wdv-icon-check:before{content:"\f046"}.wdv-icon-move:before{content:"\f047"}.wdv-icon-step-backward:before{content:"\f048"}.wdv-icon-fast-backward:before{content:"\f049"}.wdv-icon-backward:before{content:"\f04a"}.wdv-icon-play:before{content:"\f04b"}.wdv-icon-pause:before{content:"\f04c"}.wdv-icon-stop:before{content:"\f04d"}.wdv-icon-forward:before{content:"\f04e"}.wdv-icon-fast-forward:before{content:"\f050"}.wdv-icon-step-forward:before{content:"\f051"}.wdv-icon-eject:before{content:"\f052"}.wdv-icon-chevron-left:before{content:"\f053"}.wdv-icon-chevron-right:before{content:"\f054"}.wdv-icon-plus-sign:before{content:"\f055"}.wdv-icon-minus-sign:before{content:"\f056"}.wdv-icon-remove-sign:before{content:"\f057"}.wdv-icon-ok-sign:before{content:"\f058"}.wdv-icon-question-sign:before{content:"\f059"}.wdv-icon-info-sign:before{content:"\f05a"}.wdv-icon-screenshot:before{content:"\f05b"}.wdv-icon-remove-circle:before{content:"\f05c"}.wdv-icon-ok-circle:before{content:"\f05d"}.wdv-icon-ban-circle:before{content:"\f05e"}.wdv-icon-arrow-left:before{content:"\f060"}.wdv-icon-arrow-right:before{content:"\f061"}.wdv-icon-arrow-up:before{content:"\f062"}.wdv-icon-arrow-down:before{content:"\f063"}.wdv-icon-share-alt:before{content:"\f064"}.wdv-icon-resize-full:before{content:"\f065"}.wdv-icon-resize-small:before{content:"\f066"}.wdv-icon-plus:before{content:"\f067"}.wdv-icon-minus:before{content:"\f068"}.wdv-icon-asterisk:before{content:"\f069"}.wdv-icon-exclamation-sign:before{content:"\f06a"}.wdv-icon-gift:before{content:"\f06b"}.wdv-icon-leaf:before{content:"\f06c"}.wdv-icon-fire:before{content:"\f06d"}.wdv-icon-eye-open:before{content:"\f06e"}.wdv-icon-eye-close:before{content:"\f070"}.wdv-icon-warning-sign:before{content:"\f071"}.wdv-icon-plane:before{content:"\f072"}.wdv-icon-calendar:before{content:"\f073"}.wdv-icon-random:before{content:"\f074"}.wdv-icon-comment:before{content:"\f075"}.wdv-icon-magnet:before{content:"\f076"}.wdv-icon-chevron-up:before{content:"\f077"}.wdv-icon-chevron-down:before{content:"\f078"}.wdv-icon-retweet:before{content:"\f079"}.wdv-icon-shopping-cart:before{content:"\f07a"}.wdv-icon-folder-close:before{content:"\f07b"}.wdv-icon-folder-open:before{content:"\f07c"}.wdv-icon-resize-vertical:before{content:"\f07d"}.wdv-icon-resize-horizontal:before{content:"\f07e"}.wdv-icon-bar-chart:before{content:"\f080"}.wdv-icon-twitter-sign:before{content:"\f081"}.wdv-icon-facebook-sign:before{content:"\f082"}.wdv-icon-camera-retro:before{content:"\f083"}.wdv-icon-key:before{content:"\f084"}.wdv-icon-cogs:before{content:"\f085"}.wdv-icon-comments:before{content:"\f086"}.wdv-icon-thumbs-up:before{content:"\f087"}.wdv-icon-thumbs-down:before{content:"\f088"}.wdv-icon-star-half:before{content:"\f089"}.wdv-icon-heart-empty:before{content:"\f08a"}.wdv-icon-signout:before{content:"\f08b"}.wdv-icon-linkedin-sign:before{content:"\f08c"}.wdv-icon-pushpin:before{content:"\f08d"}.wdv-icon-external-link:before{content:"\f08e"}.wdv-icon-signin:before{content:"\f090"}.wdv-icon-trophy:before{content:"\f091"}.wdv-icon-github-sign:before{content:"\f092"}.wdv-icon-upload-alt:before{content:"\f093"}.wdv-icon-lemon:before{content:"\f094"}.wdv-icon-phone:before{content:"\f095"}.wdv-icon-check-empty:before{content:"\f096"}.wdv-icon-bookmark-empty:before{content:"\f097"}.wdv-icon-phone-sign:before{content:"\f098"}.wdv-icon-twitter:before{content:"\f099"}.wdv-icon-facebook:before{content:"\f09a"}.wdv-icon-github:before{content:"\f09b"}.wdv-icon-unlock:before{content:"\f09c"}.wdv-icon-credit-card:before{content:"\f09d"}.wdv-icon-rss:before{content:"\f09e"}.wdv-icon-hdd:before{content:"\f0a0"}.wdv-icon-bullhorn:before{content:"\f0a1"}.wdv-icon-bell:before{content:"\f0a2"}.wdv-icon-certificate:before{content:"\f0a3"}.wdv-icon-hand-right:before{content:"\f0a4"}.wdv-icon-hand-left:before{content:"\f0a5"}.wdv-icon-hand-up:before{content:"\f0a6"}.wdv-icon-hand-down:before{content:"\f0a7"}.wdv-icon-circle-arrow-left:before{content:"\f0a8"}.wdv-icon-circle-arrow-right:before{content:"\f0a9"}.wdv-icon-circle-arrow-up:before{content:"\f0aa"}.wdv-icon-circle-arrow-down:before{content:"\f0ab"}.wdv-icon-globe:before{content:"\f0ac"}.wdv-icon-wrench:before{content:"\f0ad"}.wdv-icon-tasks:before{content:"\f0ae"}.wdv-icon-filter:before{content:"\f0b0"}.wdv-icon-briefcase:before{content:"\f0b1"}.wdv-icon-fullscreen:before{content:"\f0b2"}.wdv-icon-group:before{content:"\f0c0"}.wdv-icon-link:before{content:"\f0c1"}.wdv-icon-cloud:before{content:"\f0c2"}.wdv-icon-beaker:before{content:"\f0c3"}.wdv-icon-cut:before{content:"\f0c4"}.wdv-icon-copy:before{content:"\f0c5"}.wdv-icon-paper-clip:before{content:"\f0c6"}.wdv-icon-save:before{content:"\f0c7"}.wdv-icon-sign-blank:before{content:"\f0c8"}.wdv-icon-reorder:before{content:"\f0c9"}.wdv-icon-list-ul:before{content:"\f0ca"}.wdv-icon-list-ol:before{content:"\f0cb"}.wdv-icon-strikethrough:before{content:"\f0cc"}.wdv-icon-underline:before{content:"\f0cd"}.wdv-icon-table:before{content:"\f0ce"}.wdv-icon-magic:before{content:"\f0d0"}.wdv-icon-truck:before{content:"\f0d1"}.wdv-icon-pinterest:before{content:"\f0d2"}.wdv-icon-pinterest-sign:before{content:"\f0d3"}.wdv-icon-google-plus-sign:before{content:"\f0d4"}.wdv-icon-google-plus:before{content:"\f0d5"}.wdv-icon-money:before{content:"\f0d6"}.wdv-icon-caret-down:before{content:"\f0d7"}.wdv-icon-caret-up:before{content:"\f0d8"}.wdv-icon-caret-left:before{content:"\f0d9"}.wdv-icon-caret-right:before{content:"\f0da"}.wdv-icon-columns:before{content:"\f0db"}.wdv-icon-sort:before{content:"\f0dc"}.wdv-icon-sort-down:before{content:"\f0dd"}.wdv-icon-sort-up:before{content:"\f0de"}.wdv-icon-envelope-alt:before{content:"\f0e0"}.wdv-icon-linkedin:before{content:"\f0e1"}.wdv-icon-undo:before{content:"\f0e2"}.wdv-icon-legal:before{content:"\f0e3"}.wdv-icon-dashboard:before{content:"\f0e4"}.wdv-icon-comment-alt:before{content:"\f0e5"}.wdv-icon-comments-alt:before{content:"\f0e6"}.wdv-icon-bolt:before{content:"\f0e7"}.wdv-icon-sitemap:before{content:"\f0e8"}.wdv-icon-umbrella:before{content:"\f0e9"}.wdv-icon-paste:before{content:"\f0ea"}.wdv-icon-user-md:before{content:"\f200"}
2216
+
2217
+ /* ****************************************************************************
2218
+ * 24. WPMUDEV ICONFONT
2219
+ */
2220
+ @font-face {
2221
+ font-family: 'WPMU-DEV-App-Icons';
2222
+ src:url('font/WPMU-DEV-App-Icons.eot?yhrhds');
2223
+ src:url('font/WPMU-DEV-App-Icons.eot?#iefixyhrhds') format('embedded-opentype'),
2224
+ url('font/WPMU-DEV-App-Icons.ttf?yhrhds') format('truetype'),
2225
+ url('font/WPMU-DEV-App-Icons.woff?yhrhds') format('woff'),
2226
+ url('font/WPMU-DEV-App-Icons.svg?yhrhds#WPMU-DEV-App-Icons') format('svg');
2227
+ font-weight: normal;
2228
+ font-style: normal;
2229
+ }
2230
+ .dev-icon {
2231
+ font-family: 'WPMU-DEV-App-Icons';
2232
+ speak: none;
2233
+ font-style: normal;
2234
+ font-weight: normal;
2235
+ font-variant: normal;
2236
+ text-transform: none;
2237
+ line-height: 1;
2238
+ font-size: 14px;
2239
+ -webkit-font-smoothing: antialiased;
2240
+ -moz-osx-font-smoothing: grayscale;
2241
+ }
2242
+ .dev-icon-comment:before {
2243
+ content: "\41";
2244
+ }
2245
+ .dev-icon-speach:before {
2246
+ content: "\6d";
2247
+ }
2248
+ .dev-icon-speach_alt:before {
2249
+ content: "\3d";
2250
+ }
2251
+ .dev-icon-download:before {
2252
+ content: "\42";
2253
+ }
2254
+ .dev-icon-download_alt:before {
2255
+ content: "\69";
2256
+ }
2257
+ .dev-icon-upload:before {
2258
+ content: "\56";
2259
+ }
2260
+ .dev-icon-error:before {
2261
+ content: "\45";
2262
+ }
2263
+ .dev-icon-archive:before {
2264
+ content: "\4f";
2265
+ }
2266
+ .dev-icon-logo:before {
2267
+ content: "\39";
2268
+ }
2269
+ .dev-icon-logo_alt:before {
2270
+ content: "\30";
2271
+ }
2272
+ .dev-icon-wordpress:before {
2273
+ content: "\47";
2274
+ }
2275
+ .dev-icon-facebook:before {
2276
+ content: "\46";
2277
+ }
2278
+ .dev-icon-twitter:before {
2279
+ content: "\49";
2280
+ }
2281
+ .dev-icon-github:before {
2282
+ content: "\4a";
2283
+ }
2284
+ .dev-icon-stackoverflow:before {
2285
+ content: "\4b";
2286
+ }
2287
+ .dev-icon-linkedin:before {
2288
+ content: "\4c";
2289
+ }
2290
+ .dev-icon-medium:before {
2291
+ content: "\4d";
2292
+ }
2293
+ .dev-icon-quora:before {
2294
+ content: "\51";
2295
+ }
2296
+ .dev-icon-seo:before {
2297
+ content: "\53";
2298
+ }
2299
+ .dev-icon-minify:before {
2300
+ content: "\4e";
2301
+ }
2302
+ .dev-icon-uptime:before {
2303
+ content: "\55";
2304
+ }
2305
+ .dev-icon-world:before {
2306
+ content: "\57";
2307
+ }
2308
+ .dev-icon-pos_footer:before {
2309
+ content: "\59";
2310
+ }
2311
+ .dev-icon-pos_middle:before {
2312
+ content: "\58";
2313
+ }
2314
+ .dev-icon-pos_header:before {
2315
+ content: "\43";
2316
+ }
2317
+ .dev-icon-book:before {
2318
+ content: "\62";
2319
+ }
2320
+ .dev-icon-support:before {
2321
+ content: "\6e";
2322
+ }
2323
+ .dev-icon-rocket:before {
2324
+ content: "\6a";
2325
+ }
2326
+ .dev-icon-rocket_alt:before {
2327
+ content: "\76";
2328
+ }
2329
+ .dev-icon-lock:before {
2330
+ content: "\61";
2331
+ }
2332
+ .dev-icon-unlock:before {
2333
+ content: "\63";
2334
+ }
2335
+ .dev-icon-plugin:before {
2336
+ content: "\64";
2337
+ }
2338
+ .dev-icon-caret_up:before {
2339
+ content: "\72";
2340
+ }
2341
+ .dev-icon-caret_right:before {
2342
+ content: "\33";
2343
+ }
2344
+ .dev-icon-caret_down:before {
2345
+ content: "\65";
2346
+ }
2347
+ .dev-icon-caret_left:before {
2348
+ content: "\7c";
2349
+ }
2350
+ .dev-icon-power:before {
2351
+ content: "\66";
2352
+ }
2353
+ .dev-icon-radio_default:before {
2354
+ content: "\68";
2355
+ }
2356
+ .dev-icon-radio:before {
2357
+ content: "\68";
2358
+ }
2359
+ .dev-icon-radio_checked:before {
2360
+ content: "\67";
2361
+ }
2362
+ .dev-icon-cross:before {
2363
+ content: "\79";
2364
+ }
2365
+ .dev-icon-tick:before {
2366
+ content: "\7a";
2367
+ }
2368
+ .dev-icon-search:before {
2369
+ content: "\6b";
2370
+ }
2371
+ .dev-icon-info:before {
2372
+ content: "\70";
2373
+ }
2374
+ .dev-icon-devman:before {
2375
+ content: "\31";
2376
+ }
2377
+ .dev-icon-upfront:before {
2378
+ content: "\37";
2379
+ }
2380
+ .dev-icon-hummingbird:before {
2381
+ content: "\48";
2382
+ }
2383
+ .dev-icon-defender:before {
2384
+ content: "\44";
2385
+ }
2386
+ .dev-icon-theme:before {
2387
+ content: "\6c";
2388
+ }
2389
+ .dev-icon-pencil:before {
2390
+ content: "\50";
2391
+ }
2392
+ .dev-icon-star:before {
2393
+ content: "\5a";
2394
+ }
2395
+ .dev-icon-trash:before {
2396
+ content: "\54";
2397
+ }
2398
+ .dev-icon-recycle:before {
2399
+ content: "\52";
2400
+ }
2401
+ .dev-icon-fix:before {
2402
+ content: "\32";
2403
+ }
2404
+ .dev-icon-edit:before {
2405
+ content: "\6f";
2406
+ }
2407
+ .dev-icon-options:before {
2408
+ content: "\73";
2409
+ }
2410
+ .dev-icon-cog:before {
2411
+ content: "\74";
2412
+ }
2413
+ .dev-icon-badge:before {
2414
+ content: "\71";
2415
+ }
2416
+ .dev-icon-cylinder:before {
2417
+ content: "\75";
2418
+ }
2419
+ .dev-icon-trophy:before {
2420
+ content: "\78";
2421
+ }
2422
+ .dev-icon-bell:before {
2423
+ content: "\77";
2424
+ }
2425
+
2426
+ /* ****************************************************************************
2427
+ * 25. CUSTOM ANIMATIONS
2428
+ */
2429
+ @keyframes fade-in {
2430
+ 0% { opacity: 0; }
2431
+ 90% { opacity: 1; }
2432
+ 100% { opacity: 1; }
2433
+ }
2434
+ @keyframes bounce-in {
2435
+ 0% { transform: translateY(-200%) scale(1.5); opacity:0; }
2436
+ 30% { opacity:1; }
2437
+ 58% { transform: translateY(0) rotate(1deg) scale(1); opacity: 1 }
2438
+ 72% { transform: translateY(-30px) rotate(-1deg); }
2439
+ 80% { transform: translateY(0) rotate(0.5deg); }
2440
+ 100% { transform: translateY(0) rotate(0deg); }
2441
+ }
2442
+ @keyframes bounce-out {
2443
+ 0% { transform: translateY(0); }
2444
+ 10% { transform: translateY(-10px) rotate(-0.5deg); }
2445
+ 30% { transform: translateY(20px) rotate(8deg); }
2446
+ 70% { opacity: 1; }
2447
+ 90% { transform: translateY(300%) translateX(40px) rotate(35deg); opacity: 0; }
2448
+ 100% { display: none; }
2449
+ }
2450
+ @keyframes check {
2451
+ 0% { height: 0; width: 0; opacity: 0; }
2452
+ 24.9% { opacity: 0; }
2453
+ 25% { height: 0; width: 0; opacity: 1; }
2454
+ 35% { height: 0; width: 10px; }
2455
+ 50% { height: 20px; width: 10px; }
2456
+ }
2457
+ @keyframes spin {
2458
+ 100% { transform:rotate(360deg); }
2459
+ }
2460
+ @keyframes collapse {
2461
+ 0% { opacity: 1; transform: scale(1); }
2462
+ 40% { opacity: 1; transform: translateY(0); }
2463
+ 90% { opacity: 0; height: 0; }
2464
+ 100% { transform: scale(1); transform: translateY(-30px) scale(0.9); }
2465
+ }
2466
+ .wpmud .check-animation {
2467
+ transform: scaleX(-1) rotate(135deg);
2468
+ transform-origin: left top;
2469
+ border-right: 4px solid #cee;
2470
+ border-top: 4px solid #cee;
2471
+ display: block;
2472
+ height: 20px;
2473
+ left: 14px;
2474
+ position: absolute;
2475
+ top: 26px;
2476
+ width: 10px;
2477
+ animation: check 3s;
2478
+ border-color: #6aa;
2479
+ }
2480
+ .wpmud .fade-in {
2481
+ animation: fade-in 0.5s ease-in;
2482
+ }
2483
+ .wpmud .fade-out {
2484
+ transition: opacity 0.5s ease-in-out;
2485
+ opacity: 0;
2486
+ }
2487
+ .wpmud .bounce-in {
2488
+ animation: bounce-in 0.8s ease-in;
2489
+ }
2490
+ .wpmud .bounce-out {
2491
+ animation: bounce-out 0.6s ease-out;
2492
+ }
2493
+ .wpmud .spin {
2494
+ animation: spin 1s linear infinite;
2495
+ }
2496
+ .wpmud .animated.collapse {
2497
+ overflow: hidden;
2498
+ animation: collapse 0.5s linear;
2499
+ }
assets/shared-ui/wdev-ui.js ADDED
@@ -0,0 +1,1203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * JS used for UI of WPMUDEV plugins.
3
+ */
4
+
5
+ /*
6
+ * Initialize the Dashboard once the page is fully loaded.
7
+ */
8
+ jQuery(function() {
9
+ // Small layout fix (changes the global background color).
10
+ jQuery("html").addClass("wpmud-html");
11
+
12
+ // Add event handlers to show overlay dialogs.
13
+ jQuery(".wpmud").on("click", "a[rel=dialog]", showDialog);
14
+
15
+ // Open any auto-show overlays.
16
+ jQuery("dialog.auto-show").first().each(showDialog);
17
+
18
+ // Select code content on click.
19
+ jQuery(".wpmud").on("click", "code, pre, .sel-all", selectOnClick);
20
+
21
+ // Disable the one-time-click buttons on first click.
22
+ jQuery(".wpmud").on("click", ".one-click", disableOnClick);
23
+
24
+ // Start animation when clicking on spinner-icons.
25
+ jQuery(".wpmud").on("click", ".has-spinner", spinOnClick);
26
+
27
+ // Make Ajax-submit buttons behave as Ajax-submit buttons.
28
+ jQuery(".wpmud").on("click", ".as-ajax", ajaxSubmitLink);
29
+
30
+ // Handle close buttons inside boxes.
31
+ jQuery(".wpmud").on("click", ".can-close .close", closeElement);
32
+
33
+ // Initialize all tab-areas.
34
+ jQuery(".wpmud .tabs").each(function(){
35
+ WDP.wpmuTabs(this);
36
+ });
37
+
38
+ // Initialize all vertical tab-areas.
39
+ jQuery(".wpmud .vertical-tabs").each(function(){
40
+ WDP.wpmuVerticalTabs(this);
41
+ });
42
+
43
+ // Convert all select lists to fancy WPMU Select lists.
44
+ jQuery(".wpmud select").each(function(){
45
+ WDP.wpmuSelect(this);
46
+ });
47
+
48
+ // Convert all all search-fields to WPMU search areas.
49
+ jQuery(".wpmud input[type=search]").each(function(){
50
+ WDP.wpmuSearchfield(this);
51
+ });
52
+
53
+ // Check the page URL for special actions
54
+ checkLocalRoutes();
55
+
56
+ // Add new jQuery function jQuery().loading(true|false)
57
+ jQuery.fn.extend({
58
+ loading: function(state, message) {
59
+ if (undefined === state) { state = true; }
60
+ this.each(function() {
61
+ if (state) {
62
+ jQuery(this).addClass("loading");
63
+ } else {
64
+ jQuery(this).removeClass("loading");
65
+ }
66
+ });
67
+ if (state && message) {
68
+ jQuery(".wpmud-loading-info").remove();
69
+ message = "<p><span class='loading'></span> " + message + "</p>";
70
+ jQuery("<div></div>")
71
+ .addClass("wpmud-loading-info")
72
+ .appendTo("body")
73
+ .html(message);
74
+ } else if (!state) {
75
+ jQuery(".wpmud-loading-info").remove();
76
+ }
77
+ return this;
78
+ }
79
+ });
80
+
81
+ // When a rel=dialog element was clicked we find and open the target dialog.
82
+ function showDialog(ev) {
83
+ var el = jQuery(this);
84
+ var args = {};
85
+
86
+ if (el.data("width")) { args.width = el.data("width"); }
87
+ if (el.data("height")) { args.height = el.data("height"); }
88
+ if (el.data("class")) { args.class = el.data("class"); }
89
+ if (el.data("title")) { args.title = el.data("title"); }
90
+
91
+ if (el.is("dialog")) {
92
+ WDP.showOverlay("#" + el.attr("id"), args);
93
+ } else if (el.attr("href")) {
94
+ WDP.showOverlay(el.attr("href"), args);
95
+ }
96
+ return false;
97
+ }
98
+
99
+ // Select all text inside the element.
100
+ function selectOnClick(ev) {
101
+ WDP.selectText(this);
102
+ }
103
+
104
+ // Disable the element on click.
105
+ function disableOnClick(ev) {
106
+ var form, el = jQuery(this);
107
+
108
+ window.setTimeout(function() {
109
+ el.prop("disabled", true).addClass("disabled").loading(true);
110
+
111
+ if (el.hasClass("button")) {
112
+ form = el.closest("form");
113
+ if ( form.length ) {
114
+ form.find(":input").prop("disabled", true).addClass("disabled");
115
+ form.prop("disabled", true).addClass("disabled");
116
+ }
117
+ }
118
+ }, 20);
119
+ }
120
+
121
+ // Start animating the element on click.
122
+ function spinOnClick(ev) {
123
+ var icon, el = jQuery(this);
124
+ if (el.hasClass("spin-on-click")) { icon = el; }
125
+ else { icon = el.find(".spin-on-click"); }
126
+ icon.addClass("spin");
127
+ }
128
+
129
+ // Submit a link as ajax request instead of refreshing the window.
130
+ function ajaxSubmitLink(ev) {
131
+ var el = jQuery(this),
132
+ url = el.attr("href");
133
+
134
+ if (! url) { return false; }
135
+
136
+ el.addClass("loading disabled").prop("disabled", true);
137
+ jQuery.post(url)
138
+ .always(function() {
139
+ el.removeClass("loading disabled").prop("disabled", false);
140
+ }).fail(function() {
141
+ WDP.showError({"message": false});
142
+ });
143
+
144
+ return false;
145
+ }
146
+
147
+ // Parses the hash-tag in the current address bar.
148
+ function checkLocalRoutes() {
149
+ var route = window.location.hash.substr(1);
150
+ parts = route.split("=");
151
+
152
+ WDP.localRoutes = {
153
+ "action": false,
154
+ "param": false
155
+ };
156
+ if (! route.length ) { return; }
157
+
158
+ WDP.localRoutes.action = parts[0];
159
+ if (parts.length > 1) {
160
+ WDP.localRoutes.param = parts[1];
161
+ }
162
+ }
163
+
164
+ // Closes an element (i.e. hides and removes it)
165
+ function closeElement() {
166
+ var box = jQuery(this).closest(".can-close");
167
+
168
+ box.css({height: box.outerHeight() });
169
+ box.addClass("animated collapse");
170
+
171
+ function removeElementBox() {
172
+ box.remove();
173
+ }
174
+
175
+ window.setTimeout(removeElementBox, 450);
176
+ }
177
+ });
178
+
179
+ /*
180
+ * Define Dashboard namespace with all the functions.
181
+ * WDP = WPMUDEV Dashboard Plugin
182
+ */
183
+ window.WDP = window.WDP || {};
184
+
185
+ /**
186
+ * Display a modal overlay on the screen.
187
+ * Only one overlay can be displayed at once.
188
+ *
189
+ * The dialog source must be (or contain) an <dialog> element.
190
+ * Only the <dialog> element is parsed and displayed in the overlay.
191
+ *
192
+ * @since 4.0.0
193
+ * @param string dialogSource Either CSS class/ID, URL or HTML string.
194
+ * - ID must start with a hash '#'.
195
+ * - Class must start with a dot '.'.
196
+ * - URL contains '://' (absolute URL).
197
+ * - URL starts with slash '/' (relative URL).
198
+ * - Everything else is considered HTML string.
199
+ * @param array args Optional arguments, like callbacks
200
+ * @var callback onShow
201
+ * @var int width (only for iframes)
202
+ * @var int height (only for iframes)
203
+ * @var string class
204
+ * @var string title
205
+ */
206
+ WDP.showOverlay = function(dialogSource, args) {
207
+ var retry = false;
208
+
209
+ if ('object' !== typeof args) { args = {}; }
210
+ args.onShow = args.onShow || false;
211
+
212
+ // 1.) fetch the dialog code from the appropriate source.
213
+ if ('#' === dialogSource[0] || '.' === dialogSource[0]) {
214
+ /*
215
+ * Type 1: CSS selector
216
+ * The page contains a <dialog> element that is instantly displayed.
217
+ */
218
+ var dialog = jQuery('dialog' + dialogSource);
219
+ showTheDialog(dialog);
220
+ } else if (-1 !== dialogSource.indexOf('://') || '/' === dialogSource[0]) {
221
+ var type;
222
+ if ('/' === dialogSource[0]) { type = 'ajax'; }
223
+ else if (0 === dialogSource.indexOf(WDP.data.site_url)) { type = 'ajax'; }
224
+ else { type = 'iframe'; }
225
+
226
+ if ('ajax' === type) {
227
+ /*
228
+ * Type 2a: AJAX handler
229
+ * The URL is relative or starts with the WordPress site_url. The
230
+ * URL is called as ajax handler. Result can be either HTML code or
231
+ * a JSON object with attributes `obj.success` and `obj.data.html`
232
+ * In either case, the returned HTML needs to contain a <dialog> tag
233
+ */
234
+ jQuery.get(
235
+ dialogSource,
236
+ '',
237
+ function(resp) {
238
+ var el;
239
+ if ('{' === resp[0]) { resp = jQuery.parseJSON(resp); }
240
+ if ('object' === typeof resp) {
241
+ if (resp && resp.success && resp.data.html) {
242
+ el = jQuery(resp.data.html);
243
+ }
244
+ } else {
245
+ el = jQuery(resp);
246
+ }
247
+
248
+ if (!el || !el.length) { return; }
249
+ if (el.is('dialog')) { showTheDialog(el); }
250
+ else { showTheDialog(el.find('dialog')); }
251
+ }
252
+ );
253
+ } else if ('iframe' === type) {
254
+ /*
255
+ * Type 2b: iframe container
256
+ * An external URL is loaded inside an iframe which is displayed
257
+ * inside the dialog. The external URL may return any content.
258
+ */
259
+ var iframe = jQuery('<div><iframe class="fullsize"></iframe></div>');
260
+ iframe.find('iframe').attr('src', dialogSource);
261
+ if (args.width) { iframe.find('iframe').attr('width', args.width); }
262
+ if (args.height) { iframe.find('iframe').attr('height', args.height); }
263
+ showTheDialog(iframe);
264
+ }
265
+ } else {
266
+ /*
267
+ * Type 3: Plain HTML code
268
+ * The dialog source is plain HTML code that is parsed and displayed;
269
+ * the code needs to contain an <dialog> element.
270
+ */
271
+ var el = jQuery(dialogSource);
272
+ if (el.is('dialog')) { showTheDialog(el); }
273
+ else { showTheDialog(el.find('dialog')); }
274
+ }
275
+
276
+ // 2.) Render the dialog.
277
+ function showTheDialog(dialog) {
278
+ if ( ! dialog.length ) { return; }
279
+ if ( ! WDP.prepareOverlay() ) {
280
+ if ( ! retry ) {
281
+ retry = true;
282
+ WDP.closeOverlay();
283
+ window.setTimeout(function() { showTheDialog(dialog); }, 610);
284
+ }
285
+ return;
286
+ }
287
+
288
+ if (! args.title) {
289
+ args.title = dialog.attr('title');
290
+ }
291
+ if (args.class) {
292
+ dialog.addClass(args.class);
293
+ }
294
+
295
+ WDP.overlay.box_title.find('h3').html(args.title);
296
+ WDP.overlay.box_content.html(dialog.html());
297
+
298
+ WDP.overlay.wrapper.addClass(dialog.attr('class'));
299
+ if (dialog.hasClass('no-close')) {
300
+ WDP.overlay.wrapper.addClass('no-close');
301
+ WDP.overlay.close.remove();
302
+ }
303
+ if (dialog.find('.title-action').length) {
304
+ WDP.overlay.box_content.find('.title-action').appendTo(WDP.overlay.box_title);
305
+ }
306
+
307
+ WDP.overlay.box_content.on('click', '.close', WDP.closeOverlay);
308
+ jQuery(window).on('resize', WDP.positionOverlay);
309
+
310
+ WDP.overlay.container.addClass('has-overlay');
311
+ WDP.overlay.wrapper.show();
312
+ WDP.overlay.box.addClass('bounce-in');
313
+ WDP.overlay.back.addClass('fade-in');
314
+ WDP.overlay.visible = true;
315
+
316
+ WDP.positionOverlay();
317
+
318
+ window.setTimeout(function(){
319
+ WDP.overlay.box.removeClass('bounce-in');
320
+ WDP.overlay.back.removeClass('fade-in');
321
+ }, 1000);
322
+
323
+ if ('function' === typeof args.onShow) { args.onShow(); }
324
+ }
325
+
326
+ return WDP;
327
+ };
328
+
329
+ /**
330
+ * Closes the current modal overlay again.
331
+ *
332
+ * @since 4.0.0
333
+ */
334
+ WDP.closeOverlay = function() {
335
+ if ( WDP.prepareOverlay() ) { return WDP; }
336
+
337
+ WDP.overlay.container.removeClass('has-overlay');
338
+ WDP.overlay.box.addClass('bounce-out');
339
+ WDP.overlay.back.addClass('fade-out');
340
+ jQuery(window).off('resize', WDP.positionOverlay);
341
+
342
+ window.setTimeout(function() {
343
+ WDP.overlay.wrapper.hide()
344
+ }, 550);
345
+ window.setTimeout(function() {
346
+ WDP.overlay.wrapper.remove();
347
+ WDP.overlay.wrapper = null;
348
+ WDP.overlay.visible = false;
349
+ }, 600);
350
+
351
+ return WDP;
352
+ };
353
+
354
+ /**
355
+ * Updates the position of the overlay to keep it vertically centered on the
356
+ * screen.
357
+ *
358
+ * @since 4.0.0
359
+ */
360
+ WDP.positionOverlay = function() {
361
+ var availHeight, needHeight, newOffset;
362
+
363
+ if ( WDP.prepareOverlay() ) { return WDP; }
364
+
365
+ availHeight = WDP.overlay.scroll.height();
366
+ needHeight = WDP.overlay.box.outerHeight();
367
+ newOffset = (availHeight - needHeight) / 2;
368
+
369
+ if ( newOffset < 20 ) { newOffset = 20; }
370
+ WDP.overlay.box.css({ marginTop: newOffset });
371
+
372
+ return WDP;
373
+ };
374
+
375
+ /**
376
+ * Creates all the DOM elements needed to display the overlay element.
377
+ *
378
+ * @since 4.0.0
379
+ * @return bool True if the modal is ready to be displayed.
380
+ */
381
+ WDP.prepareOverlay = function() {
382
+ var offset = jQuery('#wpcontent').offset();
383
+
384
+ WDP.overlay = WDP.overlay || {};
385
+
386
+ if ( WDP.overlay.visible ) { return false; }
387
+
388
+ if ( ! WDP.overlay.wrapper ) {
389
+ WDP.overlay.container = jQuery('.wpmud-html');
390
+ WDP.overlay.wrapper = jQuery('<div class="dev-overlay"></div>');
391
+ WDP.overlay.back = jQuery('<div class="back"></div>');
392
+ WDP.overlay.scroll = jQuery('<div class="box-scroll"></div>');
393
+ WDP.overlay.box = jQuery('<div class="box"></div>');
394
+ WDP.overlay.box_title = jQuery('<div class="title"><h3></h3></div>');
395
+ WDP.overlay.box_content = jQuery('<div class="content"></div>');
396
+ WDP.overlay.close = jQuery('<div class="close">&times;</div>');
397
+
398
+ WDP.overlay.back.appendTo(WDP.overlay.wrapper);
399
+ WDP.overlay.scroll.appendTo(WDP.overlay.wrapper);
400
+ WDP.overlay.box.appendTo(WDP.overlay.scroll);
401
+ WDP.overlay.box_title.appendTo(WDP.overlay.box);
402
+ WDP.overlay.box_content.appendTo(WDP.overlay.box);
403
+ WDP.overlay.close.appendTo(WDP.overlay.box_title);
404
+ WDP.overlay.wrapper.appendTo('body');
405
+
406
+ WDP.overlay.close.click(WDP.closeOverlay);
407
+ }
408
+
409
+ return true;
410
+ };
411
+
412
+ /**
413
+ * Select all text inside the HTML element. This can be a div/code/input/etc.
414
+ *
415
+ * @since 4.0.0
416
+ * @param object el The HTML element.
417
+ */
418
+ WDP.selectText = function(el) {
419
+ var range, jq;
420
+ jq = jQuery( el );
421
+ el = jq[0];
422
+
423
+ if ( jq.is(':input') ) {
424
+ jq.focus().select();
425
+ } else if ( document.selection ) {
426
+ range = document.body.createTextRange();
427
+ range.moveToElementText(el);
428
+ range.select();
429
+ } else if ( window.getSelection ) {
430
+ range = document.createRange();
431
+ range.selectNode(el);
432
+ window.getSelection().addRange(range);
433
+ }
434
+
435
+ return WDP;
436
+ };
437
+
438
+ /**
439
+ * Initialize the functions of a tab-area
440
+ *
441
+ * @since 4.0.0
442
+ * @param object el The tab-area container element.
443
+ */
444
+ WDP.wpmuTabs = function(el) {
445
+ var jq = jQuery(el).closest('.tabs');
446
+
447
+ if (! jq.length) { return; }
448
+
449
+ // Resize the tab-area after short delay.
450
+ function resizeArea() {
451
+ window.setTimeout(resizeAreaHandler, 20);
452
+ }
453
+
454
+ // Resize the tab area to match the current tab.
455
+ function resizeAreaHandler() {
456
+ var current = jq.find('.tab > input:checked').parent(),
457
+ content = current.find('.content');
458
+
459
+ jq.height(content.outerHeight() + current.outerHeight() - 6);
460
+ }
461
+
462
+ // Updates the URL hash to keep tab open during page refresh
463
+ function updateHash() {
464
+ var current = jq.find('.tab > input:checked');
465
+
466
+ if (current.attr('id').length) {
467
+ WDP.updateHash(current.attr('id'));
468
+ }
469
+ resizeArea();
470
+ }
471
+
472
+ // Open the tab that is specified in window URL hash
473
+ function switchTab() {
474
+ var curTab,
475
+ route = window.location.hash.replace( /[^\w-_]/g, '' );
476
+
477
+ if (route) {
478
+ curTab = jq.find('input#' + route);
479
+
480
+ if (curTab.length && ! curTab.prop('checked')) {
481
+ curTab.prop('checked', true);
482
+ scrollWindow();
483
+ }
484
+ }
485
+ }
486
+
487
+ // Scroll the window to top of the tab list.
488
+ function scrollWindow() {
489
+ resizeArea();
490
+ jQuery('html, body').scrollTop(
491
+ jq.offset().top
492
+ - parseInt( jQuery('html').css('paddingTop') )
493
+ - 20
494
+ );
495
+ }
496
+
497
+ // Constructor.
498
+ function init() {
499
+ jq.on('click', '.tab > input[type=radio]', updateHash);
500
+ jQuery(window).on('hashchange', switchTab);
501
+
502
+ resizeArea();
503
+ switchTab();
504
+ }
505
+
506
+ init();
507
+
508
+ return WDP;
509
+ };
510
+
511
+ /**
512
+ * Initialize the functions of a vertical tab-area
513
+ *
514
+ * @since 4.0.0
515
+ * @param object el The tab-area container element.
516
+ */
517
+ WDP.wpmuVerticalTabs = function(el) {
518
+ var jq = jQuery(el).closest('.vertical-tabs'),
519
+ minHeight = 0;
520
+
521
+ if (! jq.length) { return; }
522
+
523
+ // Resize the tab-area after short delay.
524
+ function resizeArea() {
525
+ window.setTimeout(resizeAreaHandler, 20);
526
+ }
527
+
528
+ // Resize the tab area to match the current tab.
529
+ function resizeAreaHandler() {
530
+ var current = jq.find('.tab > input:checked').parent(),
531
+ content = current.find('.content'),
532
+ newHeight = content.outerHeight();
533
+
534
+ if (newHeight < minHeight) { newHeight = minHeight; }
535
+ content.css({'min-height': minHeight});
536
+ jq.height(newHeight);
537
+ }
538
+
539
+ // Find the height of the tab labels
540
+ function calcMinHeight() {
541
+ minHeight = 0;
542
+ jq.find('.tab > label:visible').each(function() {
543
+ minHeight += jQuery(this).outerHeight();
544
+ });
545
+ }
546
+
547
+ // Updates the URL hash to keep tab open during page refresh
548
+ function updateHash() {
549
+ var current = jq.find('.tab > input:checked');
550
+
551
+ if (current.attr('id').length) {
552
+ WDP.updateHash(current.attr('id'));
553
+ }
554
+ resizeArea();
555
+ }
556
+
557
+ // Open the tab that is specified in window URL hash
558
+ function switchTab() {
559
+ var curTab,
560
+ route = window.location.hash.replace( /[^\w-_]/g, '' );
561
+
562
+ if (route) {
563
+ curTab = jq.find('input#' + route);
564
+
565
+ if (curTab.length && ! curTab.prop('checked')) {
566
+ curTab.prop('checked', true);
567
+ scrollWindow();
568
+ }
569
+ }
570
+ }
571
+
572
+ // Scroll the window to top of the tab list.
573
+ function scrollWindow() {
574
+ resizeArea();
575
+ jQuery('html, body').scrollTop(
576
+ jq.offset().top
577
+ - parseInt( jQuery('html').css('paddingTop') )
578
+ - 20
579
+ );
580
+ }
581
+
582
+ // Constructor.
583
+ function init() {
584
+ jq.on('click', '.tab > input[type=radio]', updateHash);
585
+ jQuery(window).on('resize', calcMinHeight);
586
+ jQuery(window).on('hashchange', switchTab);
587
+
588
+ calcMinHeight();
589
+ resizeArea();
590
+ switchTab();
591
+ }
592
+
593
+ init();
594
+
595
+ return WDP;
596
+ };
597
+
598
+ /**
599
+ * Update a normal select list to a fancy WPMU DEV select list!
600
+ *
601
+ * @since 4.0.0
602
+ * @param object el The select element.
603
+ */
604
+ WDP.wpmuSelect = function(el) {
605
+ var jq = jQuery(el),
606
+ wrap, handle, list, value, items;
607
+
608
+ if (! jq.is("select")) { return; }
609
+ if (jq.closest(".select-container").length) { return; }
610
+
611
+ // Add the DOM elements to style the select list.
612
+ function setupElement() {
613
+ jq.wrap("<div class='select-container'>");
614
+ jq.hide();
615
+
616
+ wrap = jq.parent();
617
+ handle = jQuery("<span class='dropdown-handle'><i class='wdv-icon wdv-icon-reorder'></i></span>").prependTo(wrap);
618
+ list = jQuery("<div class='select-list-container'></div>").appendTo(wrap);
619
+ value = jQuery("<div class='list-value'>&nbsp;</div>").appendTo(list);
620
+ items = jQuery("<ul class='list-results'></ul>").appendTo(list);
621
+
622
+ wrap.addClass(jq.attr("class"));
623
+ }
624
+
625
+ // Add all the options to the new DOM elements.
626
+ function populateList() {
627
+ items.empty();
628
+ jq.find("option").each(function onPopulateLoop() {
629
+ var opt = jQuery(this),
630
+ item;
631
+ item = jQuery("<li></li>").appendTo(items);
632
+ item.text(opt.text());
633
+ item.data("value", opt.val());
634
+
635
+ if (opt.val() == jq.val()) {
636
+ selectItem(item);
637
+ }
638
+ });
639
+ }
640
+
641
+ // Toggle the dropdown state between open/closed.
642
+ function stateToggle() {
643
+ if (! wrap.hasClass("active")) {
644
+ stateOpen();
645
+ } else {
646
+ stateClose();
647
+ }
648
+ }
649
+
650
+ // Close the dropdown list.
651
+ function stateClose(item) {
652
+ if (!item) { item = wrap; }
653
+ item.removeClass("active");
654
+ item.closest("tr").removeClass("select-open");
655
+ }
656
+
657
+ // Open the dropdown list.
658
+ function stateOpen() {
659
+ jQuery(".select-container.active").each(function() {
660
+ stateClose(jQuery(this));
661
+ });
662
+ wrap.addClass("active");
663
+ wrap.closest("tr").addClass("select-open");
664
+ }
665
+
666
+ // Visually mark the specified option as "selected".
667
+ function selectItem(opt) {
668
+ value.text(opt.text());
669
+
670
+ jQuery(".current", items).removeClass("current");
671
+ opt.addClass("current");
672
+ stateClose();
673
+
674
+ // Also update the select list value.
675
+ jq.val(opt.data("value"));
676
+ jq.trigger("change");
677
+ }
678
+
679
+ // Element constructor.
680
+ function init() {
681
+ var sel_id;
682
+
683
+ setupElement();
684
+ populateList();
685
+ items.on("click", function onItemClick(ev) {
686
+ var opt = jQuery(ev.target);
687
+ selectItem(opt);
688
+ });
689
+
690
+ handle.on("click", stateToggle);
691
+ value.on("click", stateToggle);
692
+ jq.on("focus", stateOpen);
693
+
694
+ jQuery(document).click(function onOutsideClick(ev) {
695
+ var jq = jQuery(ev.target),
696
+ sel_id;
697
+
698
+ if (jq.closest(".select-container").length) { return; }
699
+ if (jq.is("label") && jq.attr("for")) {
700
+ sel_id = jq.attr("for");
701
+ if (jQuery("select#" + sel_id).length) { return; }
702
+ }
703
+
704
+ stateClose();
705
+ });
706
+
707
+ sel_id = jq.attr("id");
708
+ if (sel_id) {
709
+ jQuery("label[for=" + sel_id + "]").on("click", stateOpen);
710
+ }
711
+ }
712
+
713
+ init();
714
+
715
+ return WDP;
716
+ };
717
+
718
+ /**
719
+ * Initialize the search-areas.
720
+ *
721
+ * @since 4.0.0
722
+ * @param object el The search input element.
723
+ */
724
+ WDP.wpmuSearchfield = function(el) {
725
+ var jq = jQuery(el),
726
+ tmrDelay = 0,
727
+ lastVal = '',
728
+ tmrHide = false,
729
+ hasResults = false,
730
+ search, wrap, inpbox, emptyMsg, emptybox, resbox, reslist, curitem;
731
+
732
+ if (! jq.is('input[type="search"]')) { return; }
733
+
734
+ // Add the DOM elements to style the select list.
735
+ function setupElement() {
736
+ var classes = jq.attr('class');
737
+
738
+ jq.prop('autocomplete', 'off');
739
+ jq.wrap('<div class="search-box">');
740
+ wrap = jq.parent();
741
+
742
+ if ( classes ) {
743
+ wrap.addClass(classes);
744
+ }
745
+
746
+ jq.wrap('<div class="input-box">');
747
+ inpbox = jq.parent();
748
+ inpbox.append('<i class="search-icon dev-icon dev-icon-search"></i>');
749
+
750
+ curitem = jQuery('<div class="current-item"></div>');
751
+ curitem.appendTo(inpbox);
752
+
753
+ resbox = jQuery('<div class="search-results"></div>');
754
+ reslist = jQuery('<ul></ul>');
755
+ reslist.appendTo(resbox);
756
+ resbox.appendTo(wrap);
757
+
758
+ emptybox = jQuery('<div class="no-results"></div>');
759
+ emptybox.appendTo(wrap);
760
+ emptybox.hide();
761
+ }
762
+
763
+ // Start a timer on each keystroke. When the timer runs out a 'search' event
764
+ // is triggered.
765
+ function startDelay() {
766
+ clearDelay();
767
+
768
+ // Ignore if value did not change (i.e. cursor keys, shift, return, ...)
769
+ if (lastVal === jq.val()) { return; }
770
+ lastVal = jq.val();
771
+
772
+ tmrDelay = window.setTimeout(function() { jq.trigger('search'); }, 400);
773
+ }
774
+
775
+ // On key-DOWN we clear the timer.
776
+ function clearDelay() {
777
+ if (tmrDelay) {
778
+ window.clearTimeout(tmrDelay);
779
+ tmrDelay = 0;
780
+ }
781
+ }
782
+
783
+ // Toggle the progress state of the search box.
784
+ function doingProgress(state) {
785
+ if (state) {
786
+ wrap.addClass('progress');
787
+ } else {
788
+ wrap.removeClass('progress');
789
+ }
790
+ }
791
+
792
+ // Clear/Hide the search-results list.
793
+ function clearResults(clearFilter) {
794
+ reslist.empty();
795
+ curitem.hide();
796
+ jq.show();
797
+ hasResults = false;
798
+ resultsVisible(false);
799
+
800
+ if (clearFilter) {
801
+ if (search) {
802
+ jq.val(search);
803
+ } else {
804
+ jq.val('');
805
+ }
806
+ }
807
+ }
808
+
809
+ // Populate/Show the search-results list.
810
+ function showResults(items) {
811
+ clearResults(false);
812
+
813
+ if (! items || ! items.length) {
814
+ resultsVisible(true);
815
+ return;
816
+ }
817
+
818
+ for (var i = 0; i < items.length; i += 1) {
819
+ var li = jQuery('<li></li>'),
820
+ item = items[i];
821
+
822
+ if (! item.label) { continue; }
823
+ li.html('<span class="item-label">' + item.label + '</span>');
824
+
825
+ if (item.thumb) {
826
+ li.prepend('<span class="thumb" style="background-image:url(' + item.thumb + ')">');
827
+ }
828
+ if (item.id) {
829
+ li.attr('data-id', item.id);
830
+ li.addClass('item item-' + item.id);
831
+ }
832
+
833
+ reslist.append(li);
834
+ hasResults = true;
835
+ }
836
+ resultsVisible(true);
837
+ }
838
+
839
+ // Toggle visibility of the results.
840
+ function resultsVisible(state) {
841
+ emptybox.hide();
842
+
843
+ if (! hasResults) {
844
+ resbox.hide();
845
+
846
+ if (jq.val() && state) {
847
+ if (jq.data('no-empty-msg') || wrap.hasClass('progress')) {
848
+ emptybox.hide();
849
+ } else {
850
+ if (!emptyMsg || !emptyMsg.length) {
851
+ if (jq.data('empty-msg')) {
852
+ emptyMsg = jq.data('empty-msg');
853
+ } else {
854
+ emptyMsg = WDP.lang.empty_search;
855
+ }
856
+ emptybox.text(emptyMsg);
857
+ }
858
+ emptybox.show();
859
+ }
860
+ }
861
+ return;
862
+ }
863
+
864
+ if (state) {
865
+ if (tmrHide) {
866
+ window.clearTimeout(tmrHide);
867
+ tmrHide = false;
868
+ }
869
+
870
+ resbox.show();
871
+ } else {
872
+ tmrHide = window.setTimeout(function() {
873
+ resbox.hide();
874
+ tmrHide = false;
875
+ }, 300 );
876
+ }
877
+ }
878
+
879
+ // Visually select a single search item
880
+ function selectItem(item) {
881
+ var item_label, title;
882
+
883
+ if (item) {
884
+ title = '';
885
+ item_label = '';
886
+
887
+ if (item.find('.thumb').length) {
888
+ title += item.find('.thumb')[0].outerHTML;
889
+ }
890
+ if (item.find('.title').length) {
891
+ item_label = item.find('.title').text();
892
+ title += item.find('.title')[0].outerHTML;
893
+ } else {
894
+ item_label = item.find('.item-label').text();
895
+ title += item.find('.item-label').html();
896
+ }
897
+
898
+ curitem.html(title);
899
+ search = jq.val();
900
+ jq.hide();
901
+ curitem.show();
902
+ resbox.hide();
903
+
904
+ if (item.data('id')) {
905
+ jq.val(item.data('id'));
906
+ } else {
907
+ jq.val(item_label);
908
+ }
909
+ jq.trigger('item:select');
910
+ } else {
911
+ jq.val(search);
912
+ curitem.hide();
913
+ jq.show();
914
+ window.setTimeout(function(){jq.focus();}, 20);
915
+ jq.trigger('item:clear');
916
+ }
917
+ }
918
+
919
+ // Constructor.
920
+ function init() {
921
+ setupElement();
922
+ clearResults(true);
923
+
924
+ jq.on('keydown', clearDelay);
925
+ jq.on('keyup', startDelay);
926
+
927
+ jq.on('focus', function() { resultsVisible(true) } );
928
+ jq.on('blur', function() { resultsVisible(false) } );
929
+
930
+ jq.on('progress:start', function() { doingProgress(true); });
931
+ jq.on('progress:stop', function() { doingProgress(false); });
932
+
933
+ jq.on('results:clear', function() { clearResults(true); });
934
+ jq.on('results:show', function(ev, data) { showResults(data); });
935
+
936
+ wrap.on('click', '.search-results .item', function() { selectItem(jQuery(this)); });
937
+ curitem.on('click', function() { selectItem(false); });
938
+
939
+ wrap.on('click', '.search-icon', function() { jq.trigger('search'); jq.focus(); });
940
+ }
941
+
942
+ init();
943
+
944
+ return WDP;
945
+ };
946
+
947
+ /**
948
+ * Displays a message in the top of the window.
949
+ *
950
+ * @since 4.0.0
951
+ */
952
+ WDP.showMessage = function(action) {
953
+ var me = this;
954
+ initDom();
955
+
956
+ // Options can also be passed in as object now :)
957
+ if (action instanceof Object) {
958
+ for (var key in action) {
959
+ if (!action.hasOwnProperty(key)) {continue;}
960
+ WDP.showMessage(key, action[key]);
961
+ }
962
+ return;
963
+ }
964
+
965
+ if (WDP.data._msg) {
966
+ me.msg = WDP.data._msg;
967
+ }
968
+
969
+ switch (action) {
970
+ case "type":
971
+ switch ( arguments[1] ) {
972
+ case "success":
973
+ case "ok":
974
+ case "green":
975
+ WDP.data._msg = me.msgSuccess;
976
+ break;
977
+
978
+ case "error":
979
+ case "err":
980
+ case "red":
981
+ WDP.data._msg = me.msgError;
982
+ break;
983
+ }
984
+ break;
985
+
986
+ case "message":
987
+ var text = arguments[1];
988
+ if (!text || !text.length) {
989
+ me.msg.find(".extra-text").html("").hide();
990
+ me.msg.find(".default-text").show();
991
+ } else {
992
+ me.msg.find(".extra-text").html(text).show();
993
+ me.msg.find(".default-text").hide();
994
+ }
995
+ break;
996
+
997
+ case "delay":
998
+ var new_delay = parseInt( arguments[1] );
999
+ if (!new_delay) {
1000
+ me.delay = 0;
1001
+ } else if (isNaN(new_delay) || new_delay < 2000) {
1002
+ me.delay = 3000;
1003
+ } else {
1004
+ me.delay = new_delay;
1005
+ }
1006
+ break;
1007
+
1008
+ case "icon":
1009
+ if (false === arguments[1] || 0 === arguments[1]) {
1010
+ me.msg.find(".the-msg-icon").hide();
1011
+ } else {
1012
+ me.msg.find(".the-msg-icon").show();
1013
+ }
1014
+ break;
1015
+
1016
+ case "hide":
1017
+ if (false === arguments[1] || 0 === arguments[1]) { break; }
1018
+ hideMessage();
1019
+ break;
1020
+
1021
+ case "show":
1022
+ default:
1023
+ if (false === arguments[1] || 0 === arguments[1]) { break; }
1024
+ showMessage();
1025
+ break;
1026
+ }
1027
+
1028
+ // Dreate the DOM elements.
1029
+ function initDom() {
1030
+ if (WDP.data._message_dom_done) { return; }
1031
+ WDP.data._message_dom_done = true;
1032
+
1033
+ if (! WDP.lang.default_msg_ok) {
1034
+ WDP.lang.default_msg_ok = "Okay, we saved your changes!";
1035
+ }
1036
+ if (! WDP.lang.default_msg_err) {
1037
+ WDP.lang.default_msg_err = "Oops, we could not do this...";
1038
+ }
1039
+
1040
+ jQuery("body").append(
1041
+ '<div class="update-notice ok" id="wdp-success" style="display:none">' +
1042
+ '<span class="the-msg-icon check-animation"></span>' +
1043
+ '<p><span class="default-text">' + WDP.lang.default_msg_ok + '</span>' +
1044
+ '<span class="extra-text" style="display:none"></span></p>' +
1045
+ '<span class="close">&times;</span>' +
1046
+ '</div>'
1047
+ );
1048
+
1049
+ jQuery("body").append(
1050
+ '<div class="update-notice err" id="wdp-error" style="display:none">' +
1051
+ '<i class="the-msg-icon wdv-icon wdv-icon-warning-sign"></i>' +
1052
+ '<p><span class="default-text">' + WDP.lang.default_msg_err + '</span>' +
1053
+ '<span class="extra-text" style="display:none"></span></p>' +
1054
+ '<span class="close">&times;</span>' +
1055
+ '</div>'
1056
+ );
1057
+
1058
+ me.msgSuccess = jQuery("#wdp-success");
1059
+ me.msgError = jQuery("#wdp-error");
1060
+ me.msg = me.msgSuccess;
1061
+ me.delay = 3000;
1062
+ }
1063
+
1064
+ // Show current message.
1065
+ function showMessage() {
1066
+ var tmr = me.msg.data("tmr");
1067
+
1068
+ hideMessage();
1069
+ if (tmr) {
1070
+ window.setTimeout(WDP.showMessage, 20);
1071
+ return;
1072
+ }
1073
+
1074
+ me.msg.show();
1075
+ me.msg.one("click", ".close", hideMessage);
1076
+
1077
+ // Hide the update notice box after a short time.
1078
+ if (me.delay) {
1079
+ tmr = window.setTimeout(function() {
1080
+ me.msg.fadeOut();
1081
+ me.msg.data("tmr", false);
1082
+ }, me.delay);
1083
+ me.msg.data("tmr", tmr);
1084
+ me.msg.find(".close").hide();
1085
+ } else {
1086
+ me.msg.find(".close").show();
1087
+ tmr = false;
1088
+ me.msg.data("tmr", false);
1089
+ }
1090
+ }
1091
+
1092
+ // Hide all messages.
1093
+ function hideMessage() {
1094
+ var tmr;
1095
+
1096
+ // Success message.
1097
+ tmr = me.msgSuccess.data("tmr");
1098
+ if (tmr) {
1099
+ window.clearTimeout(tmr);
1100
+ me.msgSuccess.data("tmr", false);
1101
+ }
1102
+ me.msgSuccess.hide();
1103
+
1104
+ // Error message.
1105
+ tmr = me.msgError.data("tmr");
1106
+ if (tmr) {
1107
+ window.clearTimeout(tmr);
1108
+ me.msgError.data("tmr", false);
1109
+ }
1110
+ me.msgError.hide();
1111
+ }
1112
+
1113
+ return WDP;
1114
+ };
1115
+
1116
+ /**
1117
+ * Displays the "Changes saved" message in the top of the window.
1118
+ *
1119
+ * @since 4.0.0
1120
+ */
1121
+ WDP.showSuccess = function(message) {
1122
+ var args = {
1123
+ "type": "success",
1124
+ "delay": 3000,
1125
+ "icon": true,
1126
+ "message": false,
1127
+ "show": false
1128
+ };
1129
+
1130
+ if (message instanceof Object) {
1131
+ WDP.showMessage(args);
1132
+ message.show = true;
1133
+ WDP.showMessage(message);
1134
+ } else if ("string" === typeof message) {
1135
+ args.message = message;
1136
+ WDP.showMessage(args);
1137
+ }
1138
+
1139
+ return WDP;
1140
+ };
1141
+
1142
+ /**
1143
+ * Displays the "Did not work" message in the top of the window.
1144
+ *
1145
+ * @since 4.0.0
1146
+ */
1147
+ WDP.showError = function(message) {
1148
+ var args = {
1149
+ "type": "error",
1150
+ "delay": false,
1151
+ "icon": true,
1152
+ "message": false,
1153
+ "show": true
1154
+ };
1155
+
1156
+ if (message instanceof Object) {
1157
+ WDP.showMessage(args);
1158
+ message.show = true;
1159
+ WDP.showMessage(message);
1160
+ } else if ("string" === typeof message) {
1161
+ args.message = message;
1162
+ WDP.showMessage(args);
1163
+ }
1164
+
1165
+ return WDP;
1166
+ };
1167
+
1168
+ /**
1169
+ * Updates the hash-value in the current windows URL without scrolling to the
1170
+ * element.
1171
+ *
1172
+ * @since 4.0.3
1173
+ */
1174
+ WDP.updateHash = function(newHash) {
1175
+ newHash = newHash.replace( /^#/, '' );
1176
+
1177
+ var fx,
1178
+ node = jQuery( '#' + newHash );
1179
+
1180
+ if (node.length) {
1181
+ // Remove the ID value from the actual element.
1182
+ node.attr('id', '');
1183
+
1184
+ // Create a dummy element at current position with the specific ID.
1185
+ fx = jQuery('<div></div>')
1186
+ .css({
1187
+ position: 'absolute',
1188
+ visibility: 'hidden',
1189
+ top: jQuery(document).scrollTop() + 'px'
1190
+ })
1191
+ .attr('id', newHash)
1192
+ .appendTo(document.body);
1193
+ }
1194
+
1195
+ // Change hash value in the URL. Browser will scroll to _current position_.
1196
+ document.location.hash = newHash;
1197
+
1198
+ // Undo the changes from first part.
1199
+ if (node.length) {
1200
+ fx.remove();
1201
+ node.attr('id', newHash);
1202
+ }
1203
+ };
languages/wp-smushit.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the WP Smush package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: WP Smush 2.1.5\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/wp-smushit\n"
7
- "POT-Creation-Date: 2016-03-08 10:06:11+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -12,6 +12,27 @@ msgstr ""
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  #: extras/free-dashboard/module.php:388
16
  msgid "We're happy that you've chosen to install %s! Are you interested in how to make the most of this plugin? How would you like a quick 5 day email crash course with actionable advice on building your membership site? Only the info you want, no subscription!"
17
  msgstr ""
@@ -20,10 +41,6 @@ msgstr ""
20
  msgid "Thanks :)"
21
  msgstr ""
22
 
23
- #: extras/free-dashboard/module.php:406 extras/free-dashboard/module.php:445
24
- msgid "Saving"
25
- msgstr ""
26
-
27
  #: extras/free-dashboard/module.php:407 extras/free-dashboard/module.php:446
28
  msgid "No thanks"
29
  msgstr ""
@@ -40,431 +57,534 @@ msgstr ""
40
  msgid "Rate %s"
41
  msgstr ""
42
 
43
- #: lib/class-wp-smush-admin.php:128 lib/class-wp-smush-admin.php:341
44
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:54
45
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:73
46
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:75
47
- msgid "WP Smush"
48
  msgstr ""
49
 
50
- #: lib/class-wp-smush-admin.php:259 lib/class-wp-smush-admin.php:1036
51
- #: lib/class-wp-smush-admin.php:1052
52
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:140
53
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:366
54
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:378
55
- msgid "Bulk Smush Now"
56
  msgstr ""
57
 
58
- #: lib/class-wp-smush-admin.php:261 lib/class-wp-smush-admin.php:1056
59
- msgid "Bulk Smush %d Attachments"
60
  msgstr ""
61
 
62
- #: lib/class-wp-smush-admin.php:265
63
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:143
64
- msgid "Smushing in Progress"
65
  msgstr ""
66
 
67
- #: lib/class-wp-smush-admin.php:266 lib/class-wp-smush-admin.php:1046
68
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:144
69
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:372
70
- msgid "All Done!"
71
  msgstr ""
72
 
73
- #: lib/class-wp-smush-admin.php:268
74
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:146
75
- msgid "Ops!... something went wrong"
76
  msgstr ""
77
 
78
- #: lib/class-wp-smush-admin.php:269 lib/class-wp-smush.php:808
79
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:147
80
- #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:230
81
- msgid "Super-Smush"
82
  msgstr ""
83
 
84
- #: lib/class-wp-smush-admin.php:270
85
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:148
86
- msgid "Smush it"
87
  msgstr ""
88
 
89
- #: lib/class-wp-smush-admin.php:271
90
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:149
91
- msgid "Smush Now"
92
  msgstr ""
93
 
94
- #: lib/class-wp-smush-admin.php:272
95
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:150
96
- msgid "Sending ..."
97
  msgstr ""
98
 
99
- #: lib/class-wp-smush-admin.php:273
100
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:151
101
- msgid "{{errors}} image(s) were skipped due to an error."
102
  msgstr ""
103
 
104
- #: lib/class-wp-smush-admin.php:274
105
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:152
106
- msgid "All images are Super-Smushed."
107
  msgstr ""
108
 
109
- #: lib/class-wp-smush-admin.php:313
110
- msgid "Smush all images, including originals."
 
 
 
111
  msgstr ""
112
 
113
- #: lib/class-wp-smush-admin.php:316 lib/class-wp-smush.php:1120
114
- msgid "When you upload an image to WordPress it automatically creates %s thumbnail sizes that are commonly used in your pages. WordPress also stores the original full-size image, but because these are not usually embedded on your site we don’t Smush them. Pro users can override this."
 
 
115
  msgstr ""
116
 
117
- #: lib/class-wp-smush-admin.php:319
118
- msgid "Smush images on upload"
 
119
  msgstr ""
120
 
121
- #: lib/class-wp-smush-admin.php:320
122
- msgid "Smush Original Image"
 
123
  msgstr ""
124
 
125
- #: lib/class-wp-smush-admin.php:321
126
- msgid "Super-Smush images"
 
127
  msgstr ""
128
 
129
- #: lib/class-wp-smush-admin.php:321
130
- msgid "Lossy Image Compression"
 
131
  msgstr ""
132
 
133
- #: lib/class-wp-smush-admin.php:322
134
- msgid "Backup Original Images"
 
135
  msgstr ""
136
 
137
- #: lib/class-wp-smush-admin.php:322
138
- msgid "Will nearly double the size of your Uploads Directory"
 
139
  msgstr ""
140
 
141
- #: lib/class-wp-smush-admin.php:323
142
- msgid "Enable NextGen Gallery integration"
143
  msgstr ""
144
 
145
- #: lib/class-wp-smush-admin.php:341
146
- msgid "WP Smush Pro"
147
  msgstr ""
148
 
149
- #: lib/class-wp-smush-admin.php:348 lib/class-wp-smush-admin.php:1114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  msgid "Settings"
151
  msgstr ""
152
 
153
- #: lib/class-wp-smush-admin.php:418
154
- msgid "PRO FEATURES"
155
  msgstr ""
156
 
157
- #: lib/class-wp-smush-admin.php:424
158
- msgid "These features are available in Pro Version of the plugin."
159
  msgstr ""
160
 
161
- #: lib/class-wp-smush-admin.php:451
162
- msgid "Save Changes"
163
  msgstr ""
164
 
165
- #: lib/class-wp-smush-admin.php:540
166
- msgid "%d image is over 1MB so will be skipped using the free version of the plugin."
167
- msgid_plural "%d images are over 1MB so will be skipped using the free version of the plugin."
168
- msgstr[0] ""
169
- msgstr[1] ""
170
 
171
- #: lib/class-wp-smush-admin.php:549
172
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:412
173
- msgid "Smush in Bulk"
174
  msgstr ""
175
 
176
- #: lib/class-wp-smush-admin.php:554
177
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:425
178
- msgid "Congratulations, all your images are currently Smushed!"
179
  msgstr ""
180
 
181
- #: lib/class-wp-smush-admin.php:563
182
- msgid "%d attachment in your media library has not been smushed."
183
- msgid_plural "%d image attachments in your media library have not been smushed yet."
184
- msgstr[0] ""
185
- msgstr[1] ""
186
 
187
- #: lib/class-wp-smush-admin.php:567
188
- msgid "Remove size limit &raquo;"
189
  msgstr ""
190
 
191
- #: lib/class-wp-smush-admin.php:572
192
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:431
193
- msgid ""
194
- "Please be aware, smushing a large number of images can take a while depending on your server and network speed.\n"
195
- "\t\t\t\t\t\t<strong>You must keep this page open while the bulk smush is processing</strong>, but you can leave at any time and come back to continue where it left off."
196
  msgstr ""
197
 
198
- #: lib/class-wp-smush-admin.php:577
199
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:436
200
- msgid "Free accounts are limited to bulk smushing %d attachments per request. You will need to click to start a new bulk job after each %d attachments."
201
  msgstr ""
202
 
203
- #: lib/class-wp-smush-admin.php:578
204
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:437
205
- msgid "Remove limits &raquo;"
206
  msgstr ""
207
 
208
- #: lib/class-wp-smush-admin.php:598
209
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:456
210
- msgid "When you <a href=\"%s\">upload some images</a> they will be available to smush here."
211
  msgstr ""
212
 
213
- #: lib/class-wp-smush-admin.php:604 lib/class-wp-smush-admin.php:844
214
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:462
215
- msgid "You can also smush images individually from your <a href=\"%s\">Media Library</a>."
216
  msgstr ""
217
 
218
- #: lib/class-wp-smush-admin.php:659
219
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:334
220
- msgid "Reduced by "
221
  msgstr ""
222
 
223
- #: lib/class-wp-smush-admin.php:669
224
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:344
225
- msgid "<span class=\"done-count\">%d</span> of <span class=\"total-count\">%d</span> total attachments have been smushed"
226
  msgstr ""
227
 
228
- #: lib/class-wp-smush-admin.php:725
229
- msgid "Smush request timed out, You can try setting a higher value for `WP_SMUSH_API_TIMEOUT`."
230
  msgstr ""
231
 
232
- #: lib/class-wp-smush-admin.php:740 lib/class-wp-smush-nextgen.php:321
233
- msgid "You don't have permission to work with uploaded files."
234
  msgstr ""
235
 
236
- #: lib/class-wp-smush-admin.php:744 lib/class-wp-smush-nextgen.php:325
237
- msgid "No attachment ID was provided."
238
  msgstr ""
239
 
240
- #: lib/class-wp-smush-admin.php:814
241
- msgid "<p>Please <a href=\"%s\">upload some images</a>.</p>"
242
  msgstr ""
243
 
244
- #: lib/class-wp-smush-admin.php:832
245
- msgid "All your images are already smushed!"
 
246
  msgstr ""
247
 
248
- #: lib/class-wp-smush-admin.php:940
249
- msgid "<strong>%d of %d images</strong> were sent for smushing:"
250
  msgstr ""
251
 
252
- #: lib/class-wp-smush-admin.php:1250
253
- msgid "Super-Smush Images"
 
254
  msgstr ""
255
 
256
- #: lib/class-wp-smush-admin.php:1251
257
- msgid "We found attachments that were previously smushed losslessly. If desired you can Super-Smush them now for more savings with almost no noticeable quality loss."
 
258
  msgstr ""
259
 
260
- #: lib/class-wp-smush-admin.php:1259
261
- msgid "<span class=\"remaining-count\">%d</span> attachment left to Super-Smush"
262
- msgid_plural "<span class=\"remaining-count\">%d</span> attachments left to Super-Smush"
263
- msgstr[0] ""
264
- msgstr[1] ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
265
 
266
- #: lib/class-wp-smush-admin.php:1290
267
- msgid "Thanks for using WP Smush Pro! You now can:"
268
  msgstr ""
269
 
270
- #: lib/class-wp-smush-admin.php:1292 lib/class-wp-smush-admin.php:1312
271
- msgid "Smush the original Full image sizes that are normally skipped by default."
272
  msgstr ""
273
 
274
- #: lib/class-wp-smush-admin.php:1293 lib/class-wp-smush-admin.php:1313
275
- msgid "NextGen Gallery integration"
276
  msgstr ""
277
 
278
- #: lib/class-wp-smush-admin.php:1294 lib/class-wp-smush-admin.php:1314
279
- msgid "\"Super-Smush\" your images with our intelligent multi-pass lossy compression. Get 2&times; more compression than lossless with almost no noticeable quality loss!"
280
  msgstr ""
281
 
282
- #: lib/class-wp-smush-admin.php:1295 lib/class-wp-smush-admin.php:1315
283
- msgid "Get the best lossless compression. We try multiple methods to squeeze every last byte out of your images."
284
  msgstr ""
285
 
286
- #: lib/class-wp-smush-admin.php:1296
287
- msgid "Smush images up to 32MB."
288
  msgstr ""
289
 
290
- #: lib/class-wp-smush-admin.php:1297
291
- msgid "Bulk smush ALL your images with one click!"
 
292
  msgstr ""
293
 
294
- #: lib/class-wp-smush-admin.php:1298 lib/class-wp-smush-admin.php:1318
295
- msgid "Keep a backup of your original un-smushed images in case you want to restore later."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
296
  msgstr ""
297
 
298
- #: lib/class-wp-smush-admin.php:1310
299
- msgid "Upgrade to WP Smush Pro to:"
300
  msgstr ""
301
 
302
- #: lib/class-wp-smush-admin.php:1316
303
- msgid "Smush images greater than 1MB."
304
  msgstr ""
305
 
306
- #: lib/class-wp-smush-admin.php:1317
307
- msgid "Bulk smush ALL your images with one click! No more rate limiting."
308
  msgstr ""
309
 
310
- #: lib/class-wp-smush-admin.php:1319
311
- msgid "Access 24/7/365 support from <a href=\"https://premium.wpmudev.org/support/?utm_source=wordpress.org&utm_medium=plugin&utm_campaign=WP%20Smush%20Upgrade\">the best WordPress support team on the planet</a>."
312
  msgstr ""
313
 
314
- #: lib/class-wp-smush-admin.php:1320
315
- msgid "Download <a href=\"https://premium.wpmudev.org/?utm_source=wordpress.org&utm_medium=plugin&utm_campaign=WP%20Smush%20Upgrade\">100+ other premium plugins and themes</a> included in your membership."
316
  msgstr ""
317
 
318
- #: lib/class-wp-smush-admin.php:1324
319
- msgid "Upgrade Now &raquo;"
320
  msgstr ""
321
 
322
- #: lib/class-wp-smush-admin.php:1327
323
- msgid "Already upgraded to a WPMU DEV membership? Install and Login to our Dashboard plugin to enable Smush Pro features."
324
  msgstr ""
325
 
326
- #: lib/class-wp-smush-admin.php:1329
327
- msgid "Unable to access Pro Features? <a href=\"%s\">Refresh Status</a>"
328
  msgstr ""
329
 
330
- #: lib/class-wp-smush-admin.php:1340
331
- msgid "Activate WPMU DEV Dashboard"
332
  msgstr ""
333
 
334
- #: lib/class-wp-smush-admin.php:1344
335
- msgid "Install WPMU DEV Dashboard"
336
  msgstr ""
337
 
338
- #: lib/class-wp-smush-nextgen.php:193 lib/class-wp-smush.php:334
339
- msgid "Size '%s' not processed correctly"
340
  msgstr ""
341
 
342
- #: lib/class-wp-smush.php:101
343
  msgid "File path is empty"
344
  msgstr ""
345
 
346
- #: lib/class-wp-smush.php:106
347
  msgid "Could not find %s"
348
  msgstr ""
349
 
350
- #: lib/class-wp-smush.php:111
351
  msgid "%s is not writable"
352
  msgstr ""
353
 
354
- #: lib/class-wp-smush.php:121
355
- msgid "Skipped (%s), image not found."
356
  msgstr ""
357
 
358
- #: lib/class-wp-smush.php:126
359
- msgid "Skipped (%s), size limit exceeded."
360
  msgstr ""
361
 
362
- #: lib/class-wp-smush.php:141
363
  msgid "Unknown API error"
364
  msgstr ""
365
 
366
- #: lib/class-wp-smush.php:366 lib/class-wp-smush.php:374
367
- msgid "Size 'full' not processed correctly"
368
- msgstr ""
369
-
370
- #: lib/class-wp-smush.php:509
371
  msgid "Error posting to API: %s"
372
  msgstr ""
373
 
374
- #: lib/class-wp-smush.php:515
375
  msgid "Error posting to API: %s %s"
376
  msgstr ""
377
 
378
- #: lib/class-wp-smush.php:532
379
  msgid "Smush data corrupted, try again."
380
  msgstr ""
381
 
382
- #: lib/class-wp-smush.php:548
383
  msgid "Image couldn't be smushed"
384
  msgstr ""
385
 
386
- #: lib/class-wp-smush.php:772
387
- #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:185
388
- msgid "Error processing request"
389
- msgstr ""
390
-
391
- #: lib/class-wp-smush.php:776
392
- #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:189
393
  msgid "Already Optimized"
394
  msgstr ""
395
 
396
- #: lib/class-wp-smush.php:778
397
  msgid "%d images reduced "
398
  msgstr ""
399
 
400
- #: lib/class-wp-smush.php:778
401
  msgid "Reduced "
402
  msgstr ""
403
 
404
- #: lib/class-wp-smush.php:779
405
  msgid "by %s ( %01.1f%% )"
406
  msgstr ""
407
 
408
- #: lib/class-wp-smush.php:784
409
- #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:195
 
 
 
 
410
  msgid "Smush stats"
411
  msgstr ""
412
 
413
- #: lib/class-wp-smush.php:814
414
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:243
415
  msgid "Not processed"
416
  msgstr ""
417
 
418
- #: lib/class-wp-smush.php:820
419
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:249
420
  msgid "Smush Now!"
421
  msgstr ""
422
 
423
- #: lib/class-wp-smush.php:1123
 
 
 
 
424
  msgid "Image couldn't be smushed as it exceeded the 1Mb size limit, Pro users can smush images with size upto 32Mb."
425
  msgstr ""
426
 
427
- #: lib/class-wp-smush.php:1125
428
  msgid " Skipped"
429
  msgstr ""
430
 
431
- #: lib/class-wp-smush.php:1143
432
- #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:329
433
  msgid "Image size"
434
  msgstr ""
435
 
436
- #: lib/class-wp-smush.php:1144
437
- #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:330
438
  msgid "Savings"
439
  msgstr ""
440
 
441
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:54
442
- msgid "WP Bulk Smush"
443
  msgstr ""
444
 
445
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:419
446
- msgid "We didn't find any images in NextGen gallery, please upload some images."
447
  msgstr ""
448
 
449
- #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:430
450
- msgid "%d attachment in NextGen Gallery has not been smushed yet."
451
- msgid_plural "%d image attachments in NextGen Gallery have not been smushed yet."
452
- msgstr[0] ""
453
- msgstr[1] ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
454
 
455
- #: lib/nextgen-integration/class-wp-smush-nextgen-bulk.php:32
456
  msgid "Smush request timed out, You can try setting a higher value ( > 60 ) for `WP_SMUSH_API_TIMEOUT`."
457
  msgstr ""
458
 
459
- #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:191
460
  msgid "Reduced by %s ( %01.1f%% )"
461
  msgstr ""
462
 
463
- #: wp-smush.php:130
464
  msgid "Get Fast"
465
  msgstr ""
466
 
467
- #: wp-smush.php:184
468
  msgid "WP Smush Free was deactivated. You have WP Smush Pro active!"
469
  msgstr ""
470
  #. Plugin Name of the plugin/theme
2
  # This file is distributed under the same license as the WP Smush package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: WP Smush 2.2\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/wp-smushit\n"
7
+ "POT-Creation-Date: 2016-04-12 10:56:34+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
+ #: assets/shared-ui/plugin-ui.php:49
16
+ msgid "Nothing found"
17
+ msgstr ""
18
+
19
+ #: assets/shared-ui/plugin-ui.php:50
20
+ msgid "Okay, we saved your changes!"
21
+ msgstr ""
22
+
23
+ #: assets/shared-ui/plugin-ui.php:51
24
+ msgid "Oops, we could not do this..."
25
+ msgstr ""
26
+
27
+ #: assets/shared-ui/plugin-ui.php:225 extras/free-dashboard/module.php:406
28
+ #: extras/free-dashboard/module.php:445
29
+ msgid "Saving"
30
+ msgstr ""
31
+
32
+ #: assets/shared-ui/plugin-ui.php:254
33
+ msgid "Dismiss"
34
+ msgstr ""
35
+
36
  #: extras/free-dashboard/module.php:388
37
  msgid "We're happy that you've chosen to install %s! Are you interested in how to make the most of this plugin? How would you like a quick 5 day email crash course with actionable advice on building your membership site? Only the info you want, no subscription!"
38
  msgstr ""
41
  msgid "Thanks :)"
42
  msgstr ""
43
 
 
 
 
 
44
  #: extras/free-dashboard/module.php:407 extras/free-dashboard/module.php:446
45
  msgid "No thanks"
46
  msgstr ""
57
  msgid "Rate %s"
58
  msgstr ""
59
 
60
+ #: lib/class-wp-smush-admin.php:153
61
+ msgid "Automatically smush my images on upload"
 
 
 
62
  msgstr ""
63
 
64
+ #: lib/class-wp-smush-admin.php:154
65
+ msgid "When you upload images to the media library, we’ll automatically optimize them."
 
 
 
 
66
  msgstr ""
67
 
68
+ #: lib/class-wp-smush-admin.php:157
69
+ msgid "Preserve image EXIF data"
70
  msgstr ""
71
 
72
+ #: lib/class-wp-smush-admin.php:158
73
+ msgid "EXIF data stores camera settings, focal length, date, time and location information in image files. EXIF data makes image files larger but if you are a photographer you may want to preserve this information."
 
74
  msgstr ""
75
 
76
+ #: lib/class-wp-smush-admin.php:161
77
+ msgid "Super-smush my images"
 
 
78
  msgstr ""
79
 
80
+ #: lib/class-wp-smush-admin.php:162
81
+ msgid "Compress images up to 10x more than regular smush with almost no visible drop in quality."
 
82
  msgstr ""
83
 
84
+ #: lib/class-wp-smush-admin.php:165
85
+ msgid "Include my original full-size images"
 
 
86
  msgstr ""
87
 
88
+ #: lib/class-wp-smush-admin.php:166
89
+ msgid "WordPress crops and resizes every image you upload for embedding on your site. By default, Smush only compresses these cropped and resized images, not your original full-size images. To save space on your server, activate this setting to smush your original images, too. Note: This doesn’t usually improve page speed."
 
90
  msgstr ""
91
 
92
+ #: lib/class-wp-smush-admin.php:169
93
+ msgid "Make a copy of my original images"
 
94
  msgstr ""
95
 
96
+ #: lib/class-wp-smush-admin.php:170
97
+ msgid "Save your original full-size images so you can restore them at any point. Note: Activating this setting will significantly increase the size of your uploads folder by nearly twice as much."
 
98
  msgstr ""
99
 
100
+ #: lib/class-wp-smush-admin.php:177
101
+ msgid "Enable NextGen Gallery integration"
 
102
  msgstr ""
103
 
104
+ #: lib/class-wp-smush-admin.php:178
105
+ msgid "Allow smushing images directly through NextGen Gallery settings."
 
106
  msgstr ""
107
 
108
+ #: lib/class-wp-smush-admin.php:197 lib/class-wp-smush-ui.php:607
109
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:70
110
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:89
111
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:91
112
+ msgid "WP Smush"
113
  msgstr ""
114
 
115
+ #: lib/class-wp-smush-admin.php:320 lib/class-wp-smush.php:939
116
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:159
117
+ #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:277
118
+ msgid "Super-Smush"
119
  msgstr ""
120
 
121
+ #: lib/class-wp-smush-admin.php:321
122
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:160
123
+ msgid "Smush Now"
124
  msgstr ""
125
 
126
+ #: lib/class-wp-smush-admin.php:322
127
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:161
128
+ msgid "{{errors}} image(s) were skipped due to an error."
129
  msgstr ""
130
 
131
+ #: lib/class-wp-smush-admin.php:323
132
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:162
133
+ msgid "All images are fully optimised."
134
  msgstr ""
135
 
136
+ #: lib/class-wp-smush-admin.php:324
137
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:163
138
+ msgid "Restoring image.."
139
  msgstr ""
140
 
141
+ #: lib/class-wp-smush-admin.php:325
142
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:164
143
+ msgid "Smushing image.."
144
  msgstr ""
145
 
146
+ #: lib/class-wp-smush-admin.php:326
147
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:165
148
+ msgid "Checking images.."
149
  msgstr ""
150
 
151
+ #: lib/class-wp-smush-admin.php:504
152
+ msgid "Smush request timed out, You can try setting a higher value for `WP_SMUSH_API_TIMEOUT`."
153
  msgstr ""
154
 
155
+ #: lib/class-wp-smush-admin.php:526 lib/class-wp-smush-nextgen.php:379
156
+ msgid "You don't have permission to work with uploaded files."
157
  msgstr ""
158
 
159
+ #: lib/class-wp-smush-admin.php:530 lib/class-wp-smush-nextgen.php:383
160
+ msgid "No attachment ID was provided."
161
+ msgstr ""
162
+
163
+ #: lib/class-wp-smush-admin.php:719
164
+ msgid "<strong>%d of %d images</strong> were sent for smushing:"
165
+ msgstr ""
166
+
167
+ #: lib/class-wp-smush-admin.php:860 lib/class-wp-smush-admin.php:873
168
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:334
169
+ msgid "Bulk Smush Now"
170
+ msgstr ""
171
+
172
+ #: lib/class-wp-smush-admin.php:867
173
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:338
174
+ msgid "All Done!"
175
+ msgstr ""
176
+
177
+ #: lib/class-wp-smush-admin.php:906
178
  msgid "Settings"
179
  msgstr ""
180
 
181
+ #: lib/class-wp-smush-admin.php:951
182
+ msgid "THANKS FOR UPDATING SMUSH!"
183
  msgstr ""
184
 
185
+ #: lib/class-wp-smush-admin.php:951
186
+ msgid "HAPPY SMUSHING!"
187
  msgstr ""
188
 
189
+ #: lib/class-wp-smush-admin.php:1104 lib/class-wp-smush-nextgen.php:466
190
+ msgid "Error in processing restore action, Fields empty."
191
  msgstr ""
192
 
193
+ #: lib/class-wp-smush-admin.php:1111 lib/class-wp-smush-nextgen.php:473
194
+ msgid "Image not restored, Nonce verification failed."
195
+ msgstr ""
 
 
196
 
197
+ #: lib/class-wp-smush-admin.php:1185 lib/class-wp-smush-nextgen.php:548
198
+ msgid "Unable to restore image"
 
199
  msgstr ""
200
 
201
+ #: lib/class-wp-smush-admin.php:1202
202
+ msgid "Image not smushed, fields empty."
 
203
  msgstr ""
204
 
205
+ #: lib/class-wp-smush-admin.php:1209 lib/class-wp-smush-nextgen.php:566
206
+ msgid "Image couldn't be smushed as the nonce verification failed, try reloading the page."
207
+ msgstr ""
 
 
208
 
209
+ #: lib/class-wp-smush-admin.php:1226
210
+ msgid "Unable to smush image"
211
  msgstr ""
212
 
213
+ #: lib/class-wp-smush-admin.php:1245
214
+ msgid "Yay! All images are optimised as per your current settings."
 
 
 
215
  msgstr ""
216
 
217
+ #: lib/class-wp-smush-admin.php:1371 lib/class-wp-smush-ui.php:584
218
+ msgid "You have images that need smushing. %sBulk smush now!%s"
 
219
  msgstr ""
220
 
221
+ #: lib/class-wp-smush-nextgen.php:334
222
+ msgid "We couldn't find the metadata for the image, possibly the image has been deleted."
 
223
  msgstr ""
224
 
225
+ #: lib/class-wp-smush-nextgen.php:559
226
+ msgid "We couldn't process the image, fields empty."
 
227
  msgstr ""
228
 
229
+ #: lib/class-wp-smush-nextgen.php:583
230
+ msgid "Unable to smush image, %s"
 
231
  msgstr ""
232
 
233
+ #: lib/class-wp-smush-ui.php:53
234
+ msgid "Dismiss Welcome notice"
 
235
  msgstr ""
236
 
237
+ #: lib/class-wp-smush-ui.php:69
238
+ msgid "WELCOME"
 
239
  msgstr ""
240
 
241
+ #: lib/class-wp-smush-ui.php:77
242
+ msgid "OH YEAH, IT'S COMPRESSION TIME!"
243
  msgstr ""
244
 
245
+ #: lib/class-wp-smush-ui.php:78
246
+ msgid "You've just installed %3$s, the most popular image compression plugin for WordPress! %1$sChoose your desired settings%2$s and get smushing!"
247
  msgstr ""
248
 
249
+ #: lib/class-wp-smush-ui.php:92
250
+ msgid "Smush individual images via your %sMedia Library%s"
251
  msgstr ""
252
 
253
+ #: lib/class-wp-smush-ui.php:92
254
+ msgid "Media Library"
255
  msgstr ""
256
 
257
+ #: lib/class-wp-smush-ui.php:97
258
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:481
259
+ msgid "BULK SMUSH"
260
  msgstr ""
261
 
262
+ #: lib/class-wp-smush-ui.php:111
263
+ msgid "SETTINGS"
264
  msgstr ""
265
 
266
+ #: lib/class-wp-smush-ui.php:126
267
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:501
268
+ msgid "Lets you check if any images can be further optimised. Useful after changing settings."
269
  msgstr ""
270
 
271
+ #: lib/class-wp-smush-ui.php:126
272
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:501
273
+ msgid "RE-CHECK IMAGES"
274
  msgstr ""
275
 
276
+ #: lib/class-wp-smush-ui.php:127
277
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:502
278
+ msgid "STATS"
279
+ msgstr ""
280
+
281
+ #: lib/class-wp-smush-ui.php:131
282
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:507
283
+ msgid "TOTAL % REDUCTIONS"
284
+ msgstr ""
285
+
286
+ #: lib/class-wp-smush-ui.php:139
287
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:519
288
+ msgid "TOTAL SIZE REDUCTIONS"
289
+ msgstr ""
290
+
291
+ #: lib/class-wp-smush-ui.php:146
292
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:528
293
+ msgid "ATTACHMENTS SMUSHED"
294
+ msgstr ""
295
+
296
+ #: lib/class-wp-smush-ui.php:159
297
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:543
298
+ msgid "ATTACHMENTS SUPER-SMUSHED"
299
+ msgstr ""
300
 
301
+ #: lib/class-wp-smush-ui.php:164
302
+ msgid "%sENABLE%s"
303
  msgstr ""
304
 
305
+ #: lib/class-wp-smush-ui.php:189
306
+ msgid "UPDATE SETTINGS"
307
  msgstr ""
308
 
309
+ #: lib/class-wp-smush-ui.php:203
310
+ msgid "%sPRO ONLY%s"
311
  msgstr ""
312
 
313
+ #: lib/class-wp-smush-ui.php:205
314
+ msgid "ADVANCED SETTINGS"
315
  msgstr ""
316
 
317
+ #: lib/class-wp-smush-ui.php:376
318
+ msgid "TRY WP SMUSH PRO - DEV TEAM"
319
  msgstr ""
320
 
321
+ #: lib/class-wp-smush-ui.php:392
322
+ msgid "BOOST YOUR PERFORMANCE - HUMMINGBIRD"
323
  msgstr ""
324
 
325
+ #: lib/class-wp-smush-ui.php:419
326
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:422
327
+ msgid "No attachments found - Upload some images"
328
  msgstr ""
329
 
330
+ #: lib/class-wp-smush-ui.php:421
331
+ msgid "We haven’t found any images in your %smedia library%s yet so there’s no smushing to be done! Once you upload images, reload this page and start playing!"
332
+ msgstr ""
333
+
334
+ #: lib/class-wp-smush-ui.php:424
335
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:427
336
+ msgid "UPLOAD IMAGES"
337
+ msgstr ""
338
+
339
+ #: lib/class-wp-smush-ui.php:429
340
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:432
341
+ msgid "No attachments need smushing. Awesome!"
342
+ msgstr ""
343
+
344
+ #: lib/class-wp-smush-ui.php:434
345
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:437
346
+ msgid "BULK SMUSH NOW"
347
+ msgstr ""
348
+
349
+ #: lib/class-wp-smush-ui.php:445
350
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:445
351
+ msgid "%s, you have %s%s%d%s image%s that need smushing!"
352
+ msgid_plural "%s, you have %s%s%d%s images%s that need smushing!"
353
+ msgstr[0] ""
354
+ msgstr[1] ""
355
+
356
+ #: lib/class-wp-smush-ui.php:454
357
+ msgid "Enable Super-smush in the Settings area to get even more savings with almost no noticeable quality loss."
358
+ msgstr ""
359
+
360
+ #: lib/class-wp-smush-ui.php:477
361
+ msgid "%sBulk smush is currently running.%s You need to keep this page open."
362
+ msgstr ""
363
+
364
+ #: lib/class-wp-smush-ui.php:487
365
+ msgid "%s%d%s of %d attachments have been smushed."
366
+ msgstr ""
367
+
368
+ #: lib/class-wp-smush-ui.php:493 lib/class-wp-smush-ui.php:523
369
+ msgid "CANCEL"
370
+ msgstr ""
371
+
372
+ #: lib/class-wp-smush-ui.php:509
373
+ msgid "%sBulk re-smush is currently running.%s You need to keep this page open."
374
+ msgstr ""
375
+
376
+ #: lib/class-wp-smush-ui.php:514
377
+ msgid "%s%d%s image left to Re-Smush"
378
+ msgid_plural "%s%d%s images left to Re-Smush"
379
+ msgstr[0] ""
380
+ msgstr[1] ""
381
+
382
+ #: lib/class-wp-smush-ui.php:562
383
+ msgid "%s, you have %s%s%d%s image%s that need re-compressing!"
384
+ msgid_plural "%s, you have %s%s%d%s images%s that need re-compressing!"
385
+ msgstr[0] ""
386
+ msgstr[1] ""
387
+
388
+ #: lib/class-wp-smush-ui.php:563
389
+ msgid "Skip"
390
  msgstr ""
391
 
392
+ #: lib/class-wp-smush-ui.php:577
393
+ msgid "Your settings have been updated!"
394
  msgstr ""
395
 
396
+ #: lib/class-wp-smush-ui.php:607
397
+ msgid "WP Smush Pro"
398
  msgstr ""
399
 
400
+ #: lib/class-wp-smush-ui.php:609
401
+ msgid "Automatic smushing is %senabled%s. Newly uploaded images will be automagically compressed."
402
  msgstr ""
403
 
404
+ #: lib/class-wp-smush-ui.php:609
405
+ msgid "Automatic smushing is %sdisabled%s. Newly uploaded images will need to be manually smushed."
406
  msgstr ""
407
 
408
+ #: lib/class-wp-smush-ui.php:636
409
+ msgid "Thanks for installing Smush. We hope you like it!"
410
  msgstr ""
411
 
412
+ #: lib/class-wp-smush-ui.php:637
413
+ msgid "And hey, if you do, you can now try out Smush Pro for double the smushy goodness (benchmarked), entirely for free!"
414
  msgstr ""
415
 
416
+ #: lib/class-wp-smush-ui.php:638
417
+ msgid "FIND OUT MORE"
418
  msgstr ""
419
 
420
+ #: lib/class-wp-smush-ui.php:640
421
+ msgid "Did you know that you can now %stry out Smush Pro%s for FREE?"
422
  msgstr ""
423
 
424
+ #: lib/class-wp-smush-ui.php:641
425
+ msgid "Yep, Super Smush your images for double the savings, save originals and batch Smush thousands of images all at once.... no charge!!!"
426
  msgstr ""
427
 
428
+ #: lib/class-wp-smush-ui.php:642
429
+ msgid "TRY SMUSH PRO FOR FREE"
430
  msgstr ""
431
 
432
+ #: lib/class-wp-smush-ui.php:665
433
+ msgid "Did you know WP Smush Pro delivers up to 10x better compression, allows you to smush your originals and removes any bulk smushing limits? – %sTry it absolutely FREE%s"
434
  msgstr ""
435
 
436
+ #: lib/class-wp-smush.php:142
437
  msgid "File path is empty"
438
  msgstr ""
439
 
440
+ #: lib/class-wp-smush.php:147
441
  msgid "Could not find %s"
442
  msgstr ""
443
 
444
+ #: lib/class-wp-smush.php:152
445
  msgid "%s is not writable"
446
  msgstr ""
447
 
448
+ #: lib/class-wp-smush.php:162
449
+ msgid "Skipped (%s), image not found. Attachment: %s"
450
  msgstr ""
451
 
452
+ #: lib/class-wp-smush.php:167
453
+ msgid "Skipped (%s), size limit exceeded. Attachment: %s"
454
  msgstr ""
455
 
456
+ #: lib/class-wp-smush.php:186
457
  msgid "Unknown API error"
458
  msgstr ""
459
 
460
+ #: lib/class-wp-smush.php:613
 
 
 
 
461
  msgid "Error posting to API: %s"
462
  msgstr ""
463
 
464
+ #: lib/class-wp-smush.php:619
465
  msgid "Error posting to API: %s %s"
466
  msgstr ""
467
 
468
+ #: lib/class-wp-smush.php:636
469
  msgid "Smush data corrupted, try again."
470
  msgstr ""
471
 
472
+ #: lib/class-wp-smush.php:652
473
  msgid "Image couldn't be smushed"
474
  msgstr ""
475
 
476
+ #: lib/class-wp-smush.php:866 lib/class-wp-smush.php:870
477
+ #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:195
478
+ #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:198
 
 
 
 
479
  msgid "Already Optimized"
480
  msgstr ""
481
 
482
+ #: lib/class-wp-smush.php:879
483
  msgid "%d images reduced "
484
  msgstr ""
485
 
486
+ #: lib/class-wp-smush.php:879
487
  msgid "Reduced "
488
  msgstr ""
489
 
490
+ #: lib/class-wp-smush.php:880
491
  msgid "by %s ( %01.1f%% )"
492
  msgstr ""
493
 
494
+ #: lib/class-wp-smush.php:914
495
+ msgid "Detailed stats for all the image sizes"
496
+ msgstr ""
497
+
498
+ #: lib/class-wp-smush.php:914
499
+ #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:238
500
  msgid "Smush stats"
501
  msgstr ""
502
 
503
+ #: lib/class-wp-smush.php:946
504
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:247
505
  msgid "Not processed"
506
  msgstr ""
507
 
508
+ #: lib/class-wp-smush.php:952
509
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:253
510
  msgid "Smush Now!"
511
  msgstr ""
512
 
513
+ #: lib/class-wp-smush.php:1286
514
+ msgid "When you upload an image to WordPress it automatically creates %s thumbnail sizes that are commonly used in your pages. WordPress also stores the original full-size image, but because these are not usually embedded on your site we don’t Smush them. Pro users can override this."
515
+ msgstr ""
516
+
517
+ #: lib/class-wp-smush.php:1289
518
  msgid "Image couldn't be smushed as it exceeded the 1Mb size limit, Pro users can smush images with size upto 32Mb."
519
  msgstr ""
520
 
521
+ #: lib/class-wp-smush.php:1291
522
  msgid " Skipped"
523
  msgstr ""
524
 
525
+ #: lib/class-wp-smush.php:1311
526
+ #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:396
527
  msgid "Image size"
528
  msgstr ""
529
 
530
+ #: lib/class-wp-smush.php:1312
531
+ #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:397
532
  msgid "Savings"
533
  msgstr ""
534
 
535
+ #: lib/class-wp-smush.php:1494
536
+ msgid "Restore original image."
537
  msgstr ""
538
 
539
+ #: lib/class-wp-smush.php:1494
540
+ msgid "Restore image"
541
  msgstr ""
542
 
543
+ #: lib/class-wp-smush.php:1539
544
+ msgid "Smush image including original file."
545
+ msgstr ""
546
+
547
+ #: lib/class-wp-smush.php:1539
548
+ msgid "Resmush image"
549
+ msgstr ""
550
+
551
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:70
552
+ msgid "Bulk WP Smush"
553
+ msgstr ""
554
+
555
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:424
556
+ msgid "We haven’t found any images in your %sgallery%s yet, so there’s no smushing to be done! Once you upload images, reload this page and start playing!"
557
+ msgstr ""
558
+
559
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:461
560
+ msgid "Enable Super-smush in the %sSettings%s area to get even more savings with almost no noticeable quality loss."
561
+ msgstr ""
562
+
563
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:476
564
+ msgid "Smush individual images via your %sManage Galleries%s section"
565
+ msgstr ""
566
+
567
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:476
568
+ msgid "Manage Galleries"
569
+ msgstr ""
570
+
571
+ #: lib/nextgen-integration/class-wp-smush-nextgen-admin.php:551
572
+ msgid "%sDISABLED%s"
573
+ msgstr ""
574
 
575
+ #: lib/nextgen-integration/class-wp-smush-nextgen-bulk.php:43
576
  msgid "Smush request timed out, You can try setting a higher value ( > 60 ) for `WP_SMUSH_API_TIMEOUT`."
577
  msgstr ""
578
 
579
+ #: lib/nextgen-integration/class-wp-smush-nextgen-stats.php:207
580
  msgid "Reduced by %s ( %01.1f%% )"
581
  msgstr ""
582
 
583
+ #: wp-smush.php:131
584
  msgid "Get Fast"
585
  msgstr ""
586
 
587
+ #: wp-smush.php:185
588
  msgid "WP Smush Free was deactivated. You have WP Smush Pro active!"
589
  msgstr ""
590
  #. Plugin Name of the plugin/theme
lib/class-wp-smush-admin.php CHANGED
@@ -7,8 +7,16 @@
7
  * @author Saurabh Shukla <saurabh@incsub.com>
8
  * @author Umesh Kumar <umesh@incsub.com>
9
  *
10
- * @copyright (c) 2015, Incsub (http://incsub.com)
11
  */
 
 
 
 
 
 
 
 
12
  if ( ! class_exists( 'WpSmushitAdmin' ) ) {
13
  /**
14
  * Show settings in Media settings and add column to media library
@@ -42,23 +50,30 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
42
  */
43
  public $smushed_count;
44
 
 
 
 
 
 
45
  /**
46
  * @array Stores the stats for all the images
47
  */
48
  public $stats;
49
 
 
 
50
  /**
51
  * @var int Limit for allowed number of images per bulk request
52
  */
53
  private $max_free_bulk = 50; //this is enforced at api level too
54
 
55
- public $upgrade_url = 'https://premium.wpmudev.org/project/wp-smush-pro/?utm_source=wordpress.org&utm_medium=plugin&utm_campaign=WP%20Smush%20Upgrade';
56
 
57
  //Stores unsmushed ids
58
  private $ids = '';
59
 
60
  //Stores all lossless smushed ids
61
- private $lossless_ids = '';
62
 
63
  /**
64
  * @var int Number of attachments exceeding free limit
@@ -70,13 +85,15 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
70
  */
71
  private $is_pro_user;
72
 
 
 
73
  /**
74
  * Constructor
75
  */
76
  public function __construct() {
77
 
78
  // Save Settings, Process Option, Need to process it early, so the pages are loaded accordingly, nextgen gallery integration is loaded at same action
79
- add_action( 'plugins_loaded', array( $this, 'process_options' ), 16 );
80
 
81
  // hook scripts and styles
82
  add_action( 'admin_init', array( $this, 'register' ) );
@@ -88,7 +105,16 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
88
  add_action( 'wp_ajax_wp_smushit_bulk', array( $this, 'process_smush_request' ) );
89
 
90
  //Handle Smush Single Ajax
91
- add_action( 'wp_ajax_wp_smushit_manual', array( $this, 'smush_single' ) );
 
 
 
 
 
 
 
 
 
92
 
93
  add_filter( 'plugin_action_links_' . WP_SMUSH_BASENAME, array(
94
  $this,
@@ -101,14 +127,57 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
101
  //Attachment status, Grid view
102
  add_filter( 'attachment_fields_to_edit', array( $this, 'filter_attachment_fields_to_edit' ), 10, 2 );
103
 
104
- // hook into admin footer to load a hidden html/css spinner
105
- add_action( 'admin_footer-upload.php', array( $this, 'print_loader' ) );
106
-
107
  /// Smush Upgrade
108
  add_action( 'admin_notices', array( $this, 'smush_upgrade' ) );
109
 
110
  //Handle the smush pro dismiss features notice ajax
111
- add_action( 'wp_ajax_dismiss_smush_notice', array( $this, 'dismiss_smush_notice' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  }
113
 
114
  /**
@@ -135,41 +204,22 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
135
  return $form_fields;
136
  }
137
 
138
- function __get( $prop ) {
139
-
140
- if ( method_exists( "WpSmushitAdmin", $prop ) ) {
141
- return $this->$prop();
142
- }
143
-
144
- $method_name = "get_" . $prop;
145
- if ( method_exists( "WpSmushitAdmin", $method_name ) ) {
146
- return $this->$method_name();
147
- }
148
- }
149
-
150
  /**
151
  * Add Bulk option settings page
152
  */
153
  function screen() {
154
- global $hook_suffix;
 
155
  $admin_page_suffix = add_media_page( 'Bulk WP Smush', 'WP Smush', 'edit_others_posts', 'wp-smush-bulk', array(
156
- $this,
157
  'ui'
158
  ) );
159
- // enqueue js only on this screen
160
- add_action( 'admin_print_scripts-' . $admin_page_suffix, array( $this, 'enqueue' ) );
161
-
162
- // Enqueue js on media screen
163
- add_action( 'admin_print_scripts-upload.php', array( $this, 'enqueue' ) );
164
-
165
- // Enqueue js on Post screen (Edit screen for media )
166
- add_action( 'admin_print_scripts-post.php', array( $this, 'enqueue' ) );
167
-
168
- // Enqueue js on Post screen (Edit screen for media )
169
- add_action( 'admin_print_scripts-post-new.php', array( $this, 'enqueue' ) );
170
 
171
  //For Nextgen gallery Pages, check later in enqueue function
172
- add_action( 'admin_print_scripts', array( $this, 'enqueue' ) );
 
 
 
173
  }
174
 
175
  /**
@@ -203,41 +253,53 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
203
 
204
  /* Register Style. */
205
  wp_register_style( 'wp-smushit-admin-css', WP_SMUSH_URL . 'assets/css/wp-smushit-admin.css', array(), $WpSmush->version );
206
- wp_register_style( 'jquery-ui', WP_SMUSH_URL . 'assets/css/jquery-ui.css', array() );
207
-
 
 
 
 
208
  }
209
 
210
  /**
211
  * enqueue js and css
212
  */
213
  function enqueue() {
 
214
  global $pagenow;
 
215
  $current_screen = get_current_screen();
216
  $current_page = $current_screen->base;
217
 
218
- //Do not enqueue, unless it is one of the required screen
219
- if ( $current_page != 'nggallery-manage-images' && $current_page != 'gallery_page_wp-smush-nextgen-bulk' && $pagenow != 'post.php' && $pagenow != 'upload.php' ) {
220
- return;
221
- }
 
 
 
 
 
222
 
223
- if ( $pagenow == 'post.php' ) {
224
- //Do not load any style or js on post types other than attachment
225
- $post_type = get_post_type();
226
- if ( empty( $post_type ) || $post_type !== 'attachment' ) {
227
  return;
228
  }
229
  }
230
 
231
  wp_enqueue_script( 'wp-smushit-admin-js' );
232
- wp_enqueue_script( 'jquery-ui-tooltip' );
233
- if ( $pagenow == 'post.php' || $pagenow == 'upload.php' ) {
234
- //For grid view, Need not load it anywhere else
235
- wp_enqueue_script( 'wp-smushit-admin-media-js' );
236
- }
237
 
238
  //Style
239
  wp_enqueue_style( 'wp-smushit-admin-css' );
240
- wp_enqueue_style( 'jquery-ui' );
 
 
 
 
 
 
 
 
 
 
241
 
242
  // localize translatable strings for js
243
  $this->localize();
@@ -247,210 +309,54 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
247
  * Localize Translations
248
  */
249
  function localize() {
250
- global $pagenow;
251
- if ( ! isset( $pagenow ) || ! in_array( $pagenow, array( "post.php", "upload.php", "post-new.php" ) ) ) {
252
- return;
253
- }
254
 
255
  $bulk = new WpSmushitBulk();
256
  $handle = 'wp-smushit-admin-js';
257
 
258
- if ( $this->is_pro_user || $this->remaining_count <= $this->max_free_bulk ) {
259
- $bulk_now = __( 'Bulk Smush Now', 'wp-smushit' );
260
- } else {
261
- $bulk_now = sprintf( __( 'Bulk Smush %d Attachments', 'wp-smushit' ), $this->max_free_bulk );
262
- }
263
 
264
  $wp_smush_msgs = array(
265
- 'progress' => __( 'Smushing in Progress', 'wp-smushit' ),
266
- 'done' => __( 'All Done!', 'wp-smushit' ),
267
- 'bulk_now' => $bulk_now,
268
- 'something_went_wrong' => __( 'Ops!... something went wrong', 'wp-smushit' ),
269
- 'resmush' => __( 'Super-Smush', 'wp-smushit' ),
270
- 'smush_it' => __( 'Smush it', 'wp-smushit' ),
271
- 'smush_now' => __( 'Smush Now', 'wp-smushit' ),
272
- 'sending' => __( 'Sending ...', 'wp-smushit' ),
273
- "error_in_bulk" => __( '{{errors}} image(s) were skipped due to an error.', 'wp-smushit' ),
274
- "all_supersmushed" => __( 'All images are Super-Smushed.', 'wp-smushit' )
275
  );
276
 
277
  wp_localize_script( $handle, 'wp_smush_msgs', $wp_smush_msgs );
278
 
279
- //Localize smushit_ids variable, if there are fix number of ids
280
- $this->ids = ! empty( $_REQUEST['ids'] ) ? explode( ',', $_REQUEST['ids'] ) : $bulk->get_attachments();
281
-
282
- //If premium, Super smush allowed, all images are smushed, localize lossless smushed ids for bulk compression
283
- if ( $this->is_pro_user &&
284
- ( $this->total_count == $this->smushed_count && empty( $this->ids ) )
285
- ) {
286
-
287
- //Check if Super smush enabled
288
- $super_smush = get_option( WP_SMUSH_PREFIX . 'lossy', false );
289
 
290
- if ( $super_smush ) {
291
- //get the attachments, and get lossless count
292
- $this->lossless_ids = $this->get_lossless_attachments();
293
- }
294
- }
295
 
296
  //Array of all smushed, unsmushed and lossless ids
297
  $data = array(
298
- 'smushed' => $this->get_smushed_image_ids(),
299
- 'unsmushed' => $this->ids,
300
- 'lossless' => $this->lossless_ids,
301
- 'timeout' => WP_SMUSH_TIMEOUT * 1000 //Convert it into ms
 
302
  );
303
 
304
  wp_localize_script( 'wp-smushit-admin-js', 'wp_smushit_data', $data );
305
 
306
  }
307
 
308
- /**
309
- * Translation ready settings
310
- */
311
- function init_settings() {
312
- if ( $this->is_pro_user ) {
313
- $smush_orgnl_txt = esc_html__( 'Smush all images, including originals.', 'wp_smushit' );
314
- } else {
315
- $count = count( get_intermediate_image_sizes() );
316
- $smush_orgnl_txt = sprintf( esc_html__( "When you upload an image to WordPress it automatically creates %s thumbnail sizes that are commonly used in your pages. WordPress also stores the original full-size image, but because these are not usually embedded on your site we don’t Smush them. Pro users can override this.", 'wp_smushit' ), $count );
317
- }
318
- $this->settings = array(
319
- 'auto' => __( 'Smush images on upload', 'wp-smushit' ),
320
- 'original' => __( 'Smush Original Image', 'wp-smushit' ) . '<span class="dashicons dashicons-info smush-original" title="' . $smush_orgnl_txt . '"></span>',
321
- 'lossy' => __( 'Super-Smush images', 'wp-smushit' ) . ' <small>(' . __( 'Lossy Image Compression', 'wp-smushit' ) . ')</small>',
322
- 'backup' => __( 'Backup Original Images', 'wp-smushit' ) . ' <small>(' . __( 'Will nearly double the size of your Uploads Directory', 'wp-smushit' ) . ')</small>',
323
- 'nextgen' => __( 'Enable NextGen Gallery integration', 'wp-smushit' )
324
- );
325
- }
326
-
327
  /**
328
  * Runs the expensive queries to get our global smush stats
 
 
 
329
  */
330
- function setup_global_stats() {
331
- $this->total_count = $this->total_count();
332
- $this->smushed_count = $this->smushed_count();
333
- $this->stats = $this->global_stats();
334
- }
335
-
336
- /**
337
- * Display the ui
338
- */
339
- function ui() {
340
- $this->setup_global_stats();
341
- $page_heading = $this->is_pro_user ? esc_html__( 'WP Smush Pro', 'wp-smushit' ) : esc_html__( 'WP Smush', 'wp-smushit' );
342
- $full_width = ( 1 == get_option( 'hide_smush_features' ) && $this->is_pro() ) ? ' smush-full-width' : '';
343
- ?>
344
- <div class="wrap">
345
- <h1><?php echo $page_heading; ?></h1>
346
- <div class="wp-smushit-container-wrap<?php echo $full_width; ?>">
347
- <div class="wp-smushit-container">
348
- <h3><?php _e( 'Settings', 'wp-smushit' ) ?></h3><?php
349
- // display the options
350
- $this->options_ui();
351
- //Bulk Smushing
352
- $this->bulk_preview();
353
- ?>
354
- </div>
355
- </div>
356
- <?php //Smush Pro Features
357
- $this->smush_pro_features(); ?>
358
- </div>
359
- <?php
360
- $this->print_loader();
361
- }
362
-
363
- /**
364
- * Process and display the options form
365
- */
366
- function options_ui() { ?>
367
- <form action="" method="post">
368
- <div id="wp-smush-options-wrap"><?php
369
- //Smush auto key
370
- $opt_auto = WP_SMUSH_PREFIX . 'auto';
371
- //Auto value
372
- $opt_auto_val = get_option( $opt_auto, false );
373
-
374
- //If value is not set for auto smushing set it to 1
375
- if ( $opt_auto_val === false ) {
376
- //default to checked
377
- $opt_auto_val = 1;
378
- }
379
-
380
- //Smush auto key
381
- $opt_original = WP_SMUSH_PREFIX . 'original';
382
- //Auto value
383
- $opt_original_val = get_option( $opt_original, false );
384
-
385
- //Smush auto key
386
- $opt_lossy = WP_SMUSH_PREFIX . 'lossy';
387
- //Auto value
388
- $opt_lossy_val = get_option( $opt_lossy, false );
389
-
390
- //Smush auto key
391
- $opt_backup = WP_SMUSH_PREFIX . 'backup';
392
- //Auto value
393
- $opt_backup_val = get_option( $opt_backup, false );
394
-
395
- //Smush NextGen key
396
- $opt_nextgen = WP_SMUSH_PREFIX . 'nextgen';
397
- //Auto value
398
- $opt_nextgen_val = get_option( $opt_nextgen, 1 );
399
-
400
- //disable lossy for non-premium members
401
- $disabled = $feature_class = '';
402
-
403
- //For free version, show unchecked
404
- if ( ! $this->is_pro_user ) {
405
- $opt_original_val = 0;
406
- $opt_lossy_val = 0;
407
- $opt_backup_val = 0;
408
- $opt_nextgen_val = 0;
409
-
410
- $disabled = ' disabled';
411
- } ?>
412
- <div class='wp-smush-setting-row'><?php
413
- // return html
414
- printf( "<label><input type='checkbox' name='%1\$s' id='%1\$s' value='1' %2\$s %3\$s>%4\$s</label>", esc_attr( $opt_auto ), checked( $opt_auto_val, 1, false ), '', $this->settings['auto'] );
415
- ?>
416
- </div>
417
- <fieldset class="wp-smush-pro-features">
418
- <legend><strong><?php esc_html_e( "PRO FEATURES", "wp-smushit" ); ?></strong></legend><?php
419
-
420
- if ( ! $this->is_pro_user ) {
421
- ?>
422
- <div class="pro-note">
423
- <div style="padding:14px 0 14px;">
424
- <span class="dashicons dashicons-info"></span><?php esc_html_e( "These features are available in Pro Version of the plugin.", "wp-smushit" ); ?>
425
- <a href="<?php echo $this->upgrade_url; ?>" target="_blank" class="button find-out-link">Find
426
- out more »</a>
427
- </div>
428
- </div>
429
- <?php
430
- $feature_class = ' disabled';
431
- }
432
-
433
- //Smush Original
434
- printf( "<div class='wp-smush-setting-row%5\$s'><label><input type='checkbox' name='%1\$s' id='%1\$s' value='1' %2\$s %3\$s>%4\$s</label></div>", esc_attr( $opt_original ), checked( $opt_original_val, 1, false ), $disabled, $this->settings['original'], $feature_class );
435
-
436
- //Lossy
437
- printf( "<div class='wp-smush-setting-row%5\$s'><label><input type='checkbox' name='%1\$s' id='%1\$s' value='1' %2\$s %3\$s>%4\$s</label></div>", esc_attr( $opt_lossy ), checked( $opt_lossy_val, 1, false ), $disabled, $this->settings['lossy'], $feature_class );
438
-
439
- //NextGen Gallery
440
- printf( "<div class='wp-smush-setting-row%5\$s'><label><input type='checkbox' name='%1\$s' id='%1\$s' value='1' %2\$s %3\$s>%4\$s</label></div>", esc_attr( $opt_nextgen ), checked( $opt_nextgen_val, 1, false ), $disabled, $this->settings['nextgen'], $feature_class );
441
-
442
- //Backup
443
- printf( "<div class='wp-smush-setting-row%5\$s'><label><input type='checkbox' name='%1\$s' id='%1\$s' value='1' %2\$s %3\$s>%4\$s</label></div>", esc_attr( $opt_backup ), checked( $opt_backup_val, 1, false ), $disabled, $this->settings['backup'], $feature_class ); ?>
444
- <!-- End of pro-only -->
445
- </fieldset>
446
- </div>
447
- <!-- End of wrap --><?php
448
- // nonce
449
- wp_nonce_field( 'save_wp_smush_options', 'wp_smush_options_nonce' );
450
- ?>
451
- <input type="submit" id="wp-smush-save-settings" class="button button-primary" value="<?php _e( 'Save Changes', 'wp-smushit' ); ?>">
452
- </form>
453
- <?php
454
  }
455
 
456
  /**
@@ -460,34 +366,41 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
460
  */
461
  function process_options() {
462
 
463
- $this->is_pro_user = $this->is_pro();
464
-
465
- $this->init_settings();
466
-
467
- //If refresh is set in URL
468
- if ( isset( $_GET['refresh'] ) && $_GET['refresh'] ) {
469
- $this->refresh_status();
470
  }
471
 
472
  // we aren't saving options
473
  if ( ! isset( $_POST['wp_smush_options_nonce'] ) ) {
474
- return;
475
  }
 
476
  // the nonce doesn't pan out
477
  if ( ! wp_verify_nonce( $_POST['wp_smush_options_nonce'], 'save_wp_smush_options' ) ) {
478
- return;
479
  }
 
 
 
 
480
  // var to temporarily assign the option value
481
  $setting = null;
482
 
 
 
 
 
483
  // process each setting and update options
484
  foreach ( $this->settings as $name => $text ) {
 
485
  // formulate the index of option
486
  $opt_name = WP_SMUSH_PREFIX . $name;
487
 
488
  // get the value to be saved
489
  $setting = isset( $_POST[ $opt_name ] ) ? 1 : 0;
490
 
 
 
491
  // update the new value
492
  update_option( $opt_name, $setting );
493
 
@@ -495,21 +408,29 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
495
  unset( $setting );
496
  }
497
 
 
 
 
 
 
 
 
 
498
  }
499
 
500
  /**
501
  * Returns number of images of larger than 1Mb size
502
  *
 
 
503
  * @return int
504
  */
505
  function get_exceeding_items_count( $force_update = false ) {
506
  $count = wp_cache_get( 'exceeding_items', 'wp_smush' );
507
  if ( ! $count || $force_update ) {
508
- $count = 0;
509
- $bulk = new WpSmushitBulk();
510
- $attachments = $bulk->get_attachments();
511
  //Check images bigger than 1Mb, used to display the count of images that can't be smushed
512
- foreach ( $attachments as $attachment ) {
513
  if ( file_exists( get_attached_file( $attachment ) ) ) {
514
  $size = filesize( get_attached_file( $attachment ) );
515
  }
@@ -524,159 +445,6 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
524
  return $count;
525
  }
526
 
527
- /**
528
- * Bulk Smushing UI
529
- */
530
- function bulk_preview() {
531
-
532
- $exceed_mb = '';
533
- if ( ! $this->is_pro_user ) {
534
-
535
- //Initialize exceeding item Count
536
- $this->exceeding_items_count = $this->get_exceeding_items_count();
537
-
538
- if ( $this->exceeding_items_count && $this->exceeding_items_count !== 0 ) {
539
- $exceed_mb = sprintf(
540
- _n( "%d image is over 1MB so will be skipped using the free version of the plugin.",
541
- "%d images are over 1MB so will be skipped using the free version of the plugin.", $this->exceeding_items_count, 'wp-smushit' ),
542
- $this->exceeding_items_count
543
- );
544
- }
545
- }
546
- ?>
547
- <hr>
548
- <div class="bulk-smush">
549
- <h3><?php _e( 'Smush in Bulk', 'wp-smushit' ) ?></h3>
550
- <?php
551
-
552
- if ( $this->remaining_count == 0 ) {
553
- ?>
554
- <p><?php _e( "Congratulations, all your images are currently Smushed!", 'wp-smushit' ); ?></p>
555
- <?php
556
- $this->progress_ui();
557
-
558
- //Display Super smush bulk progress bar
559
- $this->super_smush_bulk_ui();
560
- } else {
561
- ?>
562
- <div class="smush-instructions">
563
- <h4 class="smush-remaining-images-notice"><?php printf( _n( "%d attachment in your media library has not been smushed.", "%d image attachments in your media library have not been smushed yet.", $this->remaining_count, 'wp-smushit' ), $this->remaining_count ); ?></h4>
564
- <?php if ( $exceed_mb ) { ?>
565
- <p class="error">
566
- <?php echo $exceed_mb; ?>
567
- <a href="<?php echo $this->upgrade_url; ?>"><?php _e( 'Remove size limit &raquo;', 'wp-smushit' ); ?></a>
568
- </p>
569
-
570
- <?php } ?>
571
-
572
- <p><?php _e( "Please be aware, smushing a large number of images can take a while depending on your server and network speed.
573
- <strong>You must keep this page open while the bulk smush is processing</strong>, but you can leave at any time and come back to continue where it left off.", 'wp-smushit' ); ?></p>
574
-
575
- <?php if ( ! $this->is_pro_user ) { ?>
576
- <p class="error">
577
- <?php printf( __( "Free accounts are limited to bulk smushing %d attachments per request. You will need to click to start a new bulk job after each %d attachments.", 'wp-smushit' ), $this->max_free_bulk, $this->max_free_bulk ); ?>
578
- <a href="<?php echo $this->upgrade_url; ?>"><?php _e( 'Remove limits &raquo;', 'wp-smushit' ); ?></a>
579
- </p>
580
- <?php } ?>
581
-
582
-
583
- </div>
584
-
585
- <!-- Bulk Smushing -->
586
- <?php wp_nonce_field( 'wp-smush-bulk', '_wpnonce' ); ?>
587
- <br/><?php
588
- $this->progress_ui();
589
- ?>
590
- <p class="smush-final-log"></p>
591
- <?php
592
- $this->setup_button();
593
- }
594
-
595
- $auto_smush = get_site_option( WP_SMUSH_PREFIX . 'auto' );
596
- if ( ! $auto_smush && $this->remaining_count == 0 ) {
597
- ?>
598
- <p><?php printf( __( 'When you <a href="%s">upload some images</a> they will be available to smush here.', 'wp-smushit' ), admin_url( 'media-new.php' ) ); ?></p>
599
- <?php
600
- } else { ?>
601
- <p>
602
- <?php
603
- // let the user know that there's an alternative
604
- printf( __( 'You can also smush images individually from your <a href="%s">Media Library</a>.', 'wp-smushit' ), admin_url( 'upload.php' ) );
605
- ?>
606
- </p><?php
607
- }
608
- ?>
609
- </div>
610
- <?php
611
- }
612
-
613
- /**
614
- * Loading Image
615
- */
616
- function print_loader() {
617
- ?>
618
- <div class="wp-smush-loader-wrap hidden">
619
- <div class="floatingCirclesG">
620
- <div class="f_circleG" id="frotateG_01">
621
- </div>
622
- <div class="f_circleG" id="frotateG_02">
623
- </div>
624
- <div class="f_circleG" id="frotateG_03">
625
- </div>
626
- <div class="f_circleG" id="frotateG_04">
627
- </div>
628
- <div class="f_circleG" id="frotateG_05">
629
- </div>
630
- <div class="f_circleG" id="frotateG_06">
631
- </div>
632
- <div class="f_circleG" id="frotateG_07">
633
- </div>
634
- <div class="f_circleG" id="frotateG_08">
635
- </div>
636
- </div>
637
- </div>
638
- <?php
639
- }
640
-
641
- /**
642
- * Print out the progress bar
643
- */
644
- function progress_ui() {
645
-
646
- // calculate %ages, avoid divide by zero error with no attachments
647
- if ( $this->total_count > 0 ) {
648
- $smushed_pc = $this->smushed_count / $this->total_count * 100;
649
- } else {
650
- $smushed_pc = 0;
651
- }
652
-
653
- $progress_ui = '<div id="progress-ui">';
654
-
655
- // display the progress bars
656
- $progress_ui .= '<div id="wp-smush-progress-wrap">
657
- <div id="wp-smush-fetched-progress" class="wp-smush-progressbar"><div style="width:' . $smushed_pc . '%"></div></div>
658
- <p id="wp-smush-compression">'
659
- . __( "Reduced by ", 'wp-smushit' )
660
- . '<span id="human">' . $this->stats['human'] . '</span> ( <span id="percent">' . number_format_i18n( $this->stats['percent'], 2, '.', '' ) . '</span>% )
661
- </p>
662
- </div>';
663
-
664
- // status divs to show completed count/ total count
665
- $progress_ui .= '<div id="wp-smush-progress-status">
666
-
667
- <p id="fetched-status">' .
668
- sprintf(
669
- __(
670
- '<span class="done-count">%d</span> of <span class="total-count">%d</span> total attachments have been smushed', 'wp-smushit'
671
- ), $this->smushed_count, $this->total_count
672
- ) .
673
- '</p>
674
- </div>
675
- </div>';
676
- // print it out
677
- echo $progress_ui;
678
- }
679
-
680
  /**
681
  * Processes the Smush request and sends back the next id for smushing
682
  */
@@ -684,13 +452,16 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
684
 
685
  global $WpSmush;
686
 
 
 
 
687
  $should_continue = true;
688
 
689
  if ( empty( $_REQUEST['attachment_id'] ) ) {
690
  wp_send_json_error( 'missing id' );
691
  }
692
 
693
- if ( ! $this->is_pro_user ) {
694
  //Free version bulk smush, check the transient counter value
695
  $should_continue = $this->check_bulk_limit();
696
  }
@@ -705,18 +476,26 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
705
  );
706
  }
707
 
708
- $attachment_id = sanitize_key( $_REQUEST['attachment_id'] );
709
 
710
  $original_meta = wp_get_attachment_metadata( $attachment_id, true );
711
 
712
  $smush = $WpSmush->resize_from_meta_data( $original_meta, $attachment_id );
713
 
714
- $this->setup_global_stats();
 
715
 
716
  $stats = $this->stats;
717
 
718
  $stats['smushed'] = $this->smushed_count;
719
- $stats['total'] = $this->total_count;
 
 
 
 
 
 
 
720
 
721
  if ( is_wp_error( $smush ) ) {
722
  $error = $smush->get_error_message();
@@ -726,16 +505,23 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
726
  }
727
  wp_send_json_error( array( 'stats' => $stats, 'error_msg' => $error ) );
728
  } else {
 
 
 
 
729
  wp_send_json_success( array( 'stats' => $stats ) );
730
  }
731
  }
732
 
733
  /**
734
- * Smush single images
735
  *
736
- * @return mixed
737
  */
738
- function smush_single() {
 
 
 
739
  if ( ! current_user_can( 'upload_files' ) ) {
740
  wp_die( __( "You don't have permission to work with uploaded files.", 'wp-smushit' ) );
741
  }
@@ -744,26 +530,48 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
744
  wp_die( __( 'No attachment ID was provided.', 'wp-smushit' ) );
745
  }
746
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
747
  global $WpSmush;
748
 
749
- $attachment_id = intval( $_GET['attachment_id'] );
750
 
751
  $original_meta = wp_get_attachment_metadata( $attachment_id );
752
 
 
753
  $smush = $WpSmush->resize_from_meta_data( $original_meta, $attachment_id );
754
 
 
755
  $status = $WpSmush->set_status( $attachment_id, false, true );
756
 
 
 
757
  /** Send stats **/
758
  if ( is_wp_error( $smush ) ) {
759
- /**
760
- * @param WP_Error $smush
761
- */
762
- wp_send_json_error( $smush->get_error_message() );
 
763
  } else {
764
- wp_send_json_success( $status );
 
 
 
 
765
  }
766
-
767
  }
768
 
769
  /**
@@ -771,91 +579,43 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
771
  *
772
  * @return bool
773
  */
774
- function check_bulk_limit() {
775
 
776
  $transient_name = WP_SMUSH_PREFIX . 'bulk_sent_count';
777
- $bulk_sent_count = get_transient( $transient_name );
778
 
779
- //If bulk sent count is not set
780
- if ( false === $bulk_sent_count ) {
 
781
 
782
- //start transient at 0
783
- set_transient( $transient_name, 1, 60 );
784
 
785
- return true;
 
786
 
787
- } else if ( $bulk_sent_count < $this->max_free_bulk ) {
788
 
789
- //If lte $this->max_free_bulk images are sent, increment
790
- set_transient( $transient_name, $bulk_sent_count + 1, 60 );
791
 
792
- return true;
 
793
 
794
- } else { //Bulk sent count is set and greater than $this->max_free_bulk
795
 
796
- //clear it and return false to stop the process
797
- set_transient( $transient_name, 0, 60 );
798
 
799
- return false;
800
 
 
801
  }
802
- }
803
 
804
- /**
805
- * The UI for bulk smushing
806
- *
807
- * @return null
808
- */
809
- function all_ui( $send_ids ) {
810
-
811
- // if there are no images in the media library
812
- if ( $this->total_count < 1 ) {
813
- printf(
814
- __(
815
- '<p>Please <a href="%s">upload some images</a>.</p>', 'wp-smushit'
816
- ), admin_url( 'media-new.php' )
817
- );
818
 
819
- // no need to print out the rest of the UI
820
- return;
821
  }
822
-
823
- // otherwise, start displaying the UI
824
- ?>
825
- <div id="all-bulk" class="wp-smush-bulk-wrap">
826
- <?php
827
- // everything has been smushed, display a notice
828
- if ( $this->smushed_count === $this->total_count ) {
829
- ?>
830
- <p>
831
- <?php
832
- _e( 'All your images are already smushed!', 'wp-smushit' );
833
- ?>
834
- </p>
835
- <?php
836
- } else {
837
- $this->selected_ui( $send_ids, '' );
838
- // we have some smushing to do! :)
839
- // first some warnings
840
- ?>
841
- <p>
842
- <?php
843
- // let the user know that there's an alternative
844
- printf( __( 'You can also smush images individually from your <a href="%s">Media Library</a>.', 'wp-smushit' ), admin_url( 'upload.php' ) );
845
- ?>
846
- </p>
847
- <?php
848
- }
849
-
850
- // display the progress bar
851
- $this->progress_ui();
852
-
853
- // display the appropriate button
854
- $this->setup_button();
855
-
856
- ?>
857
- </div>
858
- <?php
859
  }
860
 
861
  /**
@@ -863,7 +623,13 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
863
  * @return int
864
  */
865
  function total_count() {
866
- $query = array(
 
 
 
 
 
 
867
  'fields' => 'ids',
868
  'post_type' => 'attachment',
869
  'post_status' => 'any',
@@ -890,6 +656,12 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
890
  * @return array|int
891
  */
892
  function smushed_count( $return_ids = false ) {
 
 
 
 
 
 
893
  $query = array(
894
  'fields' => 'ids',
895
  'post_type' => 'attachment',
@@ -905,14 +677,18 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
905
  $this->remove_wmf_filters();
906
 
907
  $results = new WP_Query( $query );
908
- if ( ! $return_ids ) {
909
- $count = ! empty( $results->post_count ) ? $results->post_count : 0;
 
 
 
 
 
 
 
910
  } else {
911
- return $results->posts;
912
  }
913
-
914
- // send the count
915
- return $count;
916
  }
917
 
918
  /**
@@ -926,6 +702,9 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
926
 
927
  /**
928
  * Display Thumbnails, if bulk action is choosen
 
 
 
929
  */
930
  function selected_ui( $send_ids, $received_ids ) {
931
  if ( empty( $received_ids ) ) {
@@ -958,18 +737,43 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
958
 
959
  /**
960
  * Display the bulk smushing button
 
 
 
 
 
 
961
  */
962
- function setup_button( $super_smush = false ) {
963
- $button = $this->button_state( $super_smush );
964
  $disabled = ! empty( $button['disabled'] ) ? ' disabled="disabled"' : '';
965
- ?>
966
- <button class="button button-primary<?php echo ' ' . $button['class']; ?>" name="smush-all" <?php echo $disabled; ?>>
967
- <span><?php echo $button['text'] ?></span>
968
- </button>
969
- <?php
 
 
 
 
 
 
970
  }
971
 
972
- function global_stats() {
 
 
 
 
 
 
 
 
 
 
 
 
 
973
 
974
  global $wpdb, $WpSmush;
975
 
@@ -984,16 +788,21 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
984
  * Allows to set a limit of mysql query
985
  * Default value is 2000
986
  */
987
- $limit = apply_filters( 'wp_smush_media_query_limit', 2000 );
988
- $limit = intval( $limit );
989
- $offset = 0;
 
 
 
990
 
991
- while ( $global_data = $wpdb->get_col( $wpdb->prepare( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key=%s LIMIT $offset, $limit", "wp-smpro-smush-data" ) ) ) {
992
 
993
  if ( ! empty( $global_data ) ) {
 
994
  foreach ( $global_data as $data ) {
995
  $data = maybe_unserialize( $data );
996
  if ( ! empty( $data['stats'] ) ) {
 
997
  $smush_data['size_before'] += ! empty( $data['stats']['size_before'] ) ? (int) $data['stats']['size_before'] : 0;
998
  $smush_data['size_after'] += ! empty( $data['stats']['size_after'] ) ? (int) $data['stats']['size_after'] : 0;
999
  }
@@ -1001,7 +810,18 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
1001
  }
1002
 
1003
  $smush_data['bytes'] = $smush_data['size_before'] - $smush_data['size_after'];
 
 
1004
  $offset += $limit;
 
 
 
 
 
 
 
 
 
1005
  }
1006
 
1007
  if ( ! isset( $smush_data['bytes'] ) || $smush_data['bytes'] < 0 ) {
@@ -1017,27 +837,28 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
1017
 
1018
  $smush_data['human'] = $WpSmush->format_bytes( $smush_data['bytes'] );
1019
 
 
 
 
1020
  return $smush_data;
1021
  }
1022
 
1023
  /**
1024
  * Returns Bulk smush button id and other details, as per if bulk request is already sent or not
1025
  *
 
 
1026
  * @return array
1027
  */
1028
 
1029
- private function button_state( $super_smush ) {
1030
  $button = array(
1031
  'cancel' => false,
1032
  );
1033
- if ( $super_smush ) {
1034
- if ( $this->is_pro_user || $this->remaining_count <= $this->max_free_bulk ) { //if premium or under limit
1035
 
1036
- $button['text'] = __( 'Bulk Smush Now', 'wp-smushit' );
1037
- $button['class'] = 'wp-smush-button wp-smush-send';
1038
- } else {
1039
- return array();
1040
- }
1041
 
1042
  } else {
1043
 
@@ -1047,14 +868,10 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
1047
  $button['class'] = 'wp-smush-finished disabled wp-smush-finished';
1048
  $button['disabled'] = 'disabled';
1049
 
1050
- } else if ( $this->is_pro_user || $this->remaining_count <= $this->max_free_bulk ) { //if premium or under limit
1051
 
1052
  $button['text'] = __( 'Bulk Smush Now', 'wp-smushit' );
1053
- $button['class'] = 'wp-smush-button wp-smush-send';
1054
-
1055
- } else { //if not premium and over limit
1056
- $button['text'] = sprintf( __( 'Bulk Smush %d Attachments', 'wp-smushit' ), $this->max_free_bulk );
1057
- $button['class'] = 'wp-smush-button wp-smush-send';
1058
 
1059
  }
1060
  }
@@ -1062,37 +879,12 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
1062
  return $button;
1063
  }
1064
 
1065
- /**
1066
- * Queries all the attachments which have smushe meta
1067
- *
1068
- * @return array
1069
- */
1070
- function get_smushed_image_ids() {
1071
- $args = array(
1072
- 'fields' => 'ids',
1073
- 'post_type' => 'attachment',
1074
- 'post_status' => 'any',
1075
- 'post_mime_type' => array( 'image/jpeg', 'image/gif', 'image/png' ),
1076
- 'order' => 'ASC',
1077
- 'posts_per_page' => - 1,
1078
- 'meta_query' => array(
1079
- array(
1080
- 'key' => 'wp-is-smushed',
1081
- 'value' => '1',
1082
- )
1083
- ),
1084
- 'no_found_rows' => true
1085
- );
1086
- //Remove the Filters added by WP Media Folder
1087
- $this->remove_wmf_filters();
1088
-
1089
- $query = new WP_Query( $args );
1090
-
1091
- return $query->posts;
1092
- }
1093
-
1094
  /**
1095
  * Get the smush button text for attachment
 
 
 
 
1096
  */
1097
  function smush_status( $id ) {
1098
  $response = trim( $this->set_status( $id, false ) );
@@ -1114,9 +906,9 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
1114
  $settings = '<a href="' . $settings_page . '">' . __( 'Settings', 'wp-smushit' ) . '</a>';
1115
 
1116
  //Added a fix for weird warning in multisite, "array_unshift() expects parameter 1 to be array, null given"
1117
- if( !empty( $links ) ) {
1118
  array_unshift( $links, $settings );
1119
- }else{
1120
  $links = array( $settings );
1121
  }
1122
 
@@ -1128,40 +920,41 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
1128
  */
1129
  function smush_upgrade() {
1130
 
1131
- if ( ! current_user_can( 'edit_others_posts' ) || ! is_super_admin() ) {
 
1132
  return;
1133
  }
1134
 
 
1135
  if ( isset( $_GET['page'] ) && 'wp-smush-bulk' == $_GET['page'] ) {
1136
  return;
1137
  }
1138
 
1139
- if ( isset( $_GET['dismiss_smush_upgrade'] ) ) {
1140
- update_option( 'dismiss_smush_upgrade', 1 );
1141
- }
1142
-
1143
- if ( get_option( 'dismiss_smush_upgrade' ) || $this->is_pro_user ) {
1144
  return;
1145
- }
1146
- ?>
1147
- <div class="updated">
1148
- <a href="<?php echo admin_url( 'index.php' ); ?>?dismiss_smush_upgrade=1" style="float:right;margin-top: 10px;text-decoration: none;"><span class="dashicons dashicons-dismiss" style="color:gray;"></span>Dismiss</a>
1149
 
1150
- <h3><span class="dashicons dashicons-megaphone" style="color:red"></span> Happy Smushing!</h3>
1151
 
1152
- <p>Welcome to the all new WP Smush, now running on the WPMU DEV Smush infrastructure!</p>
 
 
 
 
 
 
 
1153
 
1154
- <p>That means that you can continue smushing your images for free, now with added https support, speed,
1155
- and reliability... enjoy!</p>
1156
 
1157
- <p>And now, if you'd like to upgrade to the WP Smush Pro plugin you can smush images up to 32MB in size,
1158
- get 'Super Smushing' of, on average, 2&times; more reduction than lossless, backup all non smushed
1159
- images and bulk smush an
1160
- unlimited number of images at once.
1161
- <a href="https://premium.wpmudev.org/?coupon=SMUSH50OFF#pricing"> Click here to upgrade with a 50%
1162
- discount</a>.</p>
1163
- </div>
1164
- <?php
1165
  }
1166
 
1167
  /**
@@ -1169,29 +962,41 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
1169
  *
1170
  * @global object $wpdb
1171
  *
1172
- * @param int|bool|array $attachment_id
1173
- *
1174
  * @return object query results
1175
  */
1176
- function get_attachments() {
1177
 
1178
  global $wpdb;
1179
 
1180
  $allowed_images = "( 'image/jpeg', 'image/jpg', 'image/png' )";
1181
 
1182
- // get the attachment id, smush data
1183
- $sql = "SELECT p.ID as attachment_id, p.post_mime_type as type, ms.meta_value as smush_data"
1184
- . " FROM $wpdb->posts as p"
1185
- . " LEFT JOIN $wpdb->postmeta as ms"
1186
- . " ON (p.ID= ms.post_id AND ms.meta_key='wp-smpro-smush-data')"
1187
- . " WHERE"
1188
- . " p.post_type='attachment'"
1189
- . " AND p.post_mime_type IN " . $allowed_images
1190
- . " ORDER BY p . ID DESC"
1191
- // add a limit
1192
- . " LIMIT " . $this->total_count();
1193
- $results = $wpdb->get_results( $sql );
1194
- unset( $sql );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1195
 
1196
  return $results;
1197
  }
@@ -1201,12 +1006,20 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
1201
  *
1202
  * @return array
1203
  */
1204
- function get_lossless_attachments() {
1205
 
1206
- $lossless_attachments = array();
 
1207
 
1208
- //Fetch all the smushed attachment ids
1209
- $attachments = $this->get_attachments();
 
 
 
 
 
 
 
1210
 
1211
  //Check if image is lossless or lossy
1212
  foreach ( $attachments as $attachment ) {
@@ -1214,6 +1027,11 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
1214
  //Check meta for lossy value
1215
  $smush_data = ! empty( $attachment->smush_data ) ? maybe_unserialize( $attachment->smush_data ) : '';
1216
 
 
 
 
 
 
1217
  //Return if not smushed
1218
  if ( empty( $smush_data ) ) {
1219
  continue;
@@ -1223,163 +1041,712 @@ if ( ! class_exists( 'WpSmushitAdmin' ) ) {
1223
  if ( empty( $smush_data['stats'] ) || ! isset( $smush_data['stats']['lossy'] ) ) {
1224
  continue;
1225
  }
 
1226
  //Add to array if lossy is not 1
1227
- if ( $smush_data['stats']['lossy'] != 1 ) {
1228
- $lossless_attachments[] = $attachment->attachment_id;
 
 
 
 
 
1229
  }
1230
-
1231
  }
1232
  unset( $attachments );
1233
 
1234
- return $lossless_attachments;
 
 
 
 
1235
  }
1236
 
1237
  /**
1238
- * Adds progress bar for Super Smush bulk, if there are any lossless smushed images
1239
  */
1240
- function super_smush_bulk_ui() {
 
 
 
 
 
 
 
 
 
1241
 
1242
- //Check if Super smush enabled
1243
- $super_smush = get_option( WP_SMUSH_PREFIX . 'lossy', false );
 
 
 
 
 
1244
 
1245
- //Need to check, if there are any lossless ids
1246
- if ( ! $super_smush || empty( $this->lossless_ids ) || count( $this->lossless_ids ) <= 0 ) {
1247
- return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1248
  }
 
 
1249
 
1250
- $ss_progress_ui = '<h4>' . __( 'Super-Smush Images', 'wp-smushit' ) . '</h4>';
1251
- $ss_progress_ui .= '<p>' . __( 'We found attachments that were previously smushed losslessly. If desired you can Super-Smush them now for more savings with almost no noticeable quality loss.', 'wp-smushit' ) . '</p>';
1252
- $ss_progress_ui .= '<div id="progress-ui" class="super-smush">';
1253
-
1254
- // display the progress bars
1255
- $ss_progress_ui .= '<div id="wp-smush-ss-progress-wrap">
1256
- <div id="wp-smush-ss-progress" class="wp-smush-progressbar"><div style="width:0%"></div></div>
1257
- <p id="wp-smush-compression">'
1258
- . sprintf(
1259
- _n( '<span class="remaining-count">%d</span> attachment left to Super-Smush',
1260
- '<span class="remaining-count">%d</span> attachments left to Super-Smush',
1261
- count( $this->lossless_ids ),
1262
- 'wp-smushit' ), count( $this->lossless_ids ), count( $this->lossless_ids ) )
1263
- . '</p>
1264
- </div>
1265
- </div><!-- End of progress ui -->';
1266
- echo $ss_progress_ui;
1267
- $this->setup_button( true );
1268
  }
1269
 
1270
  /**
1271
- * Displays the features available in Smush pro
 
 
 
1272
  */
1273
- function smush_pro_features() {
1274
- /**
1275
- * Allows to filter whether to display or not, features divison
1276
- */
1277
- $show_features = apply_filters( 'smush_pro_features', true );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1278
 
1279
- if ( ! is_super_admin() || ! $show_features ) {
1280
- return;
1281
  }
1282
- if ( $this->is_pro_user ) {
1283
- //If User choose to hide the notice
1284
- if ( 1 == get_option( 'hide_smush_features' ) ) {
1285
- return;
1286
- } ?>
1287
- <div class="wp-smushit-features-wrap">
1288
- <div class="wp-smushit-features-inner notice inline wp-smush-pro-user">
1289
- <a href="#" class="wp-smush-pro-feature-dismiss notice-dismiss"></a>
1290
- <h3><?php _e( 'Thanks for using WP Smush Pro! You now can:', 'wp-smushit' ) ?></h3>
1291
- <ol>
1292
- <li><?php _e( 'Smush the original Full image sizes that are normally skipped by default.', 'wp-smushit' ); ?></li>
1293
- <li><?php _e( 'NextGen Gallery integration', 'wp-smushit' ); ?></li>
1294
- <li><?php _e( '"Super-Smush" your images with our intelligent multi-pass lossy compression. Get 2&times; more compression than lossless with almost no noticeable quality loss!', 'wp-smushit' ); ?></li>
1295
- <li><?php _e( 'Get the best lossless compression. We try multiple methods to squeeze every last byte out of your images.', 'wp-smushit' ); ?></li>
1296
- <li><?php _e( 'Smush images up to 32MB.', 'wp-smushit' ); ?></li>
1297
- <li><?php _e( 'Bulk smush ALL your images with one click!', 'wp-smushit' ); ?></li>
1298
- <li><?php _e( 'Keep a backup of your original un-smushed images in case you want to restore later.', 'wp-smushit' ); ?></li>
1299
- </ol>
1300
- </div>
1301
- </div>
1302
- <?php } else {
1303
- if( $this->_get_api_key() ) {
1304
- $refresh_url = add_query_arg( array( 'refresh' => 1 ) );
1305
- }else{
1306
- $refresh_url = '';
1307
- }?>
1308
- <div class="wp-smushit-features-wrap">
1309
- <div class="wp-smushit-features-inner notice inline">
1310
- <h3><?php _e( 'Upgrade to WP Smush Pro to:', 'wp-smushit' ) ?></h3>
1311
- <ol>
1312
- <li><?php _e( 'Smush the original Full image sizes that are normally skipped by default.', 'wp-smushit' ); ?></li>
1313
- <li><?php _e( 'NextGen Gallery integration', 'wp-smushit' ); ?></li>
1314
- <li><?php _e( '"Super-Smush" your images with our intelligent multi-pass lossy compression. Get 2&times; more compression than lossless with almost no noticeable quality loss!', 'wp-smushit' ); ?></li>
1315
- <li><?php _e( 'Get the best lossless compression. We try multiple methods to squeeze every last byte out of your images.', 'wp-smushit' ); ?></li>
1316
- <li><?php _e( 'Smush images greater than 1MB.', 'wp-smushit' ); ?></li>
1317
- <li><?php _e( 'Bulk smush ALL your images with one click! No more rate limiting.', 'wp-smushit' ); ?></li>
1318
- <li><?php _e( 'Keep a backup of your original un-smushed images in case you want to restore later.', 'wp-smushit' ); ?></li>
1319
- <li><?php _e( 'Access 24/7/365 support from <a href="https://premium.wpmudev.org/support/?utm_source=wordpress.org&utm_medium=plugin&utm_campaign=WP%20Smush%20Upgrade">the best WordPress support team on the planet</a>.', 'wp-smushit' ); ?></li>
1320
- <li><?php _e( 'Download <a href="https://premium.wpmudev.org/?utm_source=wordpress.org&utm_medium=plugin&utm_campaign=WP%20Smush%20Upgrade">100+ other premium plugins and themes</a> included in your membership.', 'wp-smushit' ); ?></li>
1321
- </ol>
1322
- <p>
1323
- <a class="button-primary"
1324
- href="<?php echo $this->upgrade_url; ?>"><?php _e( 'Upgrade Now &raquo;', 'wp-smushit' ); ?></a>
1325
- </p>
1326
-
1327
- <p><?php _e( 'Already upgraded to a WPMU DEV membership? Install and Login to our Dashboard plugin to enable Smush Pro features.', 'wp-smushit' ); ?></p><?php
1328
- if ( ! empty( $refresh_url ) ) { ?>
1329
- <p><?php echo sprintf( __( 'Unable to access Pro Features? <a href="%s">Refresh Status</a>', 'wp-smushit' ), $refresh_url ); ?></p><?php }
1330
- ?>
1331
-
1332
- <p>
1333
- <?php
1334
- if ( ! class_exists( 'WPMUDEV_Dashboard' ) ) {
1335
- if ( file_exists( WP_PLUGIN_DIR . '/wpmudev-updates/update-notifications.php' ) ) {
1336
- $function = is_multisite() ? 'network_admin_url' : 'admin_url';
1337
- $url = wp_nonce_url( $function( 'plugins.php?action=activate&plugin=wpmudev-updates%2Fupdate-notifications.php' ), 'activate-plugin_wpmudev-updates/update-notifications.php' );
1338
- ?>
1339
- <a class="button-secondary"
1340
- href="<?php echo $url; ?>"><?php _e( 'Activate WPMU DEV Dashboard', 'wp-smushit' ); ?></a><?php
1341
- } else { //dashboard not installed at all
1342
- ?>
1343
- <a class="button-secondary" target="_blank"
1344
- href="https://premium.wpmudev.org/project/wpmu-dev-dashboard/"><?php _e( 'Install WPMU DEV Dashboard', 'wp-smushit' ); ?></a><?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1345
  }
1346
  }
1347
- ?>
1348
- </p>
1349
- </div>
1350
- </div>
1351
- <?php }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1352
  }
1353
 
1354
  /**
1355
- * Delete Site Option, stored for api status
 
 
 
 
1356
  */
1357
- function refresh_status() {
 
 
 
 
 
 
 
 
 
 
1358
 
1359
- delete_site_option('wp_smush_api_auth');
 
 
 
 
 
 
1360
  }
1361
 
1362
  /**
1363
- * Remove any pre_get_posts_filters added by WP Media Folder plugin
 
 
 
 
1364
  */
1365
- function remove_wmf_filters() {
1366
- //remove any filters added b WP media Folder plugin to get the all attachments
1367
- if( class_exists('Wp_Media_Folder') ) {
1368
- global $wp_media_folder;
1369
- if( is_object( $wp_media_folder ) ) {
1370
- remove_filter( 'pre_get_posts', array( $wp_media_folder, 'wpmf_pre_get_posts1' ) );
1371
- remove_filter( 'pre_get_posts', array( $wp_media_folder, 'wpmf_pre_get_posts' ), 0, 1 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1372
  }
 
 
1373
  }
 
 
1374
  }
1375
 
1376
  /**
1377
- * Store a key/value to hide the smush features on bulk page
 
 
 
 
 
 
 
1378
  */
1379
- function dismiss_smush_notice() {
1380
- update_option( 'hide_smush_features', 1 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1381
  wp_send_json_success();
1382
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1383
  }
1384
 
1385
  global $wpsmushit_admin;
7
  * @author Saurabh Shukla <saurabh@incsub.com>
8
  * @author Umesh Kumar <umesh@incsub.com>
9
  *
10
+ * @copyright (c) 2016, Incsub (http://incsub.com)
11
  */
12
+ //Include Bulk UI
13
+ require_once WP_SMUSH_DIR . 'lib/class-wp-smush-ui.php';
14
+
15
+ //Load Shared UI
16
+ if ( ! class_exists( 'WDEV_Plugin_Ui' ) ) {
17
+ require_once WP_SMUSH_DIR . 'assets/shared-ui/plugin-ui.php';
18
+ }
19
+
20
  if ( ! class_exists( 'WpSmushitAdmin' ) ) {
21
  /**
22
  * Show settings in Media settings and add column to media library
50
  */
51
  public $smushed_count;
52
 
53
+ /**
54
+ * @var Smushed attachments out of total attachments
55
+ */
56
+ public $super_smushed;
57
+
58
  /**
59
  * @array Stores the stats for all the images
60
  */
61
  public $stats;
62
 
63
+ public $bulk_ui = '';
64
+
65
  /**
66
  * @var int Limit for allowed number of images per bulk request
67
  */
68
  private $max_free_bulk = 50; //this is enforced at api level too
69
 
70
+ public $upgrade_url = 'https://premium.wpmudev.org/project/wp-smush-pro/';
71
 
72
  //Stores unsmushed ids
73
  private $ids = '';
74
 
75
  //Stores all lossless smushed ids
76
+ public $resmush_ids = array();
77
 
78
  /**
79
  * @var int Number of attachments exceeding free limit
85
  */
86
  private $is_pro_user;
87
 
88
+ private $attachments = '';
89
+
90
  /**
91
  * Constructor
92
  */
93
  public function __construct() {
94
 
95
  // Save Settings, Process Option, Need to process it early, so the pages are loaded accordingly, nextgen gallery integration is loaded at same action
96
+ // add_action( 'plugins_loaded', array( $this, 'process_options' ), 16 );
97
 
98
  // hook scripts and styles
99
  add_action( 'admin_init', array( $this, 'register' ) );
105
  add_action( 'wp_ajax_wp_smushit_bulk', array( $this, 'process_smush_request' ) );
106
 
107
  //Handle Smush Single Ajax
108
+ add_action( 'wp_ajax_wp_smushit_manual', array( $this, 'smush_manual' ) );
109
+
110
+ //Handle Restore operation
111
+ add_action( 'wp_ajax_smush_restore_image', array( $this, 'restore_image' ) );
112
+
113
+ //Handle Restore operation
114
+ add_action( 'wp_ajax_smush_resmush_image', array( $this, 'resmush_image' ) );
115
+
116
+ //Handle Restore operation
117
+ add_action( 'wp_ajax_scan_for_resmush', array( $this, 'scan_images' ) );
118
 
119
  add_filter( 'plugin_action_links_' . WP_SMUSH_BASENAME, array(
120
  $this,
127
  //Attachment status, Grid view
128
  add_filter( 'attachment_fields_to_edit', array( $this, 'filter_attachment_fields_to_edit' ), 10, 2 );
129
 
 
 
 
130
  /// Smush Upgrade
131
  add_action( 'admin_notices', array( $this, 'smush_upgrade' ) );
132
 
133
  //Handle the smush pro dismiss features notice ajax
134
+ add_action( 'wp_ajax_dismiss_upgrade_notice', array( $this, 'dismiss_upgrade_notice' ) );
135
+
136
+ //Handle the smush pro dismiss features notice ajax
137
+ add_action( 'wp_ajax_dismiss_welcome_notice', array( $this, 'dismiss_welcome_notice' ) );
138
+
139
+ //Update the Super Smush count, after the smushing
140
+ add_action( 'wp_smush_image_optimised', array( $this, 'update_lists' ), '', 2 );
141
+
142
+ //Delete ReSmush list
143
+ add_action( 'wp_ajax_delete_resmush_list', array( $this, 'delete_resmush_list' ), '', 2 );
144
+
145
+ add_action( 'admin_init', array( $this, 'init_settings' ) );
146
+
147
+ $this->bulk_ui = new WpSmushBulkUi();
148
+ }
149
+
150
+ function init_settings() {
151
+ $this->settings = array(
152
+ 'auto' => array(
153
+ 'label' => esc_html__( 'Automatically smush my images on upload', 'wp-smushit' ),
154
+ 'desc' => esc_html__( 'When you upload images to the media library, we’ll automatically optimize them.', 'wp-smushit' )
155
+ ),
156
+ 'keep_exif' => array(
157
+ 'label' => esc_html__( 'Preserve image EXIF data', 'wp-smushit' ),
158
+ 'desc' => esc_html__( 'EXIF data stores camera settings, focal length, date, time and location information in image files. EXIF data makes image files larger but if you are a photographer you may want to preserve this information.', 'wp-smushit' )
159
+ ),
160
+ 'lossy' => array(
161
+ 'label' => esc_html__( 'Super-smush my images', 'wp-smushit' ),
162
+ 'desc' => esc_html__( 'Compress images up to 10x more than regular smush with almost no visible drop in quality.', 'wp-smushit' )
163
+ ),
164
+ 'original' => array(
165
+ 'label' => esc_html__( 'Include my original full-size images', 'wp-smushit' ),
166
+ 'desc' => esc_html__( 'WordPress crops and resizes every image you upload for embedding on your site. By default, Smush only compresses these cropped and resized images, not your original full-size images. To save space on your server, activate this setting to smush your original images, too. Note: This doesn’t usually improve page speed.', 'wp-smushit' )
167
+ ),
168
+ 'backup' => array(
169
+ 'label' => esc_html__( 'Make a copy of my original images', 'wp-smushit' ),
170
+ 'desc' => esc_html__( 'Save your original full-size images so you can restore them at any point. Note: Activating this setting will significantly increase the size of your uploads folder by nearly twice as much.', 'wp-smushit' )
171
+ )
172
+ );
173
+
174
+ //Show NextGen settings only if Nextgen is installed
175
+ if ( class_exists( 'C_NextGEN_Bootstrap' ) ) {
176
+ $this->settings['nextgen'] = array(
177
+ 'label' => esc_html__( 'Enable NextGen Gallery integration', 'wp-smushit' ),
178
+ 'desc' => esc_html__( 'Allow smushing images directly through NextGen Gallery settings.', 'wp-smushit' )
179
+ );
180
+ }
181
  }
182
 
183
  /**
204
  return $form_fields;
205
  }
206
 
 
 
 
 
 
 
 
 
 
 
 
 
207
  /**
208
  * Add Bulk option settings page
209
  */
210
  function screen() {
211
+ global $admin_page_suffix;
212
+
213
  $admin_page_suffix = add_media_page( 'Bulk WP Smush', 'WP Smush', 'edit_others_posts', 'wp-smush-bulk', array(
214
+ $this->bulk_ui,
215
  'ui'
216
  ) );
 
 
 
 
 
 
 
 
 
 
 
217
 
218
  //For Nextgen gallery Pages, check later in enqueue function
219
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
220
+
221
+ //Reset Transient
222
+ $this->check_bulk_limit( true );
223
  }
224
 
225
  /**
253
 
254
  /* Register Style. */
255
  wp_register_style( 'wp-smushit-admin-css', WP_SMUSH_URL . 'assets/css/wp-smushit-admin.css', array(), $WpSmush->version );
256
+ //Get resmush list
257
+ //If we have a resmush list already, localize those ids
258
+ if ( $resmush_ids = get_option( "wp-smush-resmush-list" ) ) {
259
+ //get the attachments, and get lossless count
260
+ $this->resmush_ids = $resmush_ids;
261
+ }
262
  }
263
 
264
  /**
265
  * enqueue js and css
266
  */
267
  function enqueue() {
268
+
269
  global $pagenow;
270
+
271
  $current_screen = get_current_screen();
272
  $current_page = $current_screen->base;
273
 
274
+ /**
275
+ * Allows to disable enqueuing smush files on a particular page
276
+ */
277
+ $enqueue_smush = apply_filters( 'wp_smush_enqueue', true );
278
+
279
+ //If we upgrade/install message is dismissed
280
+ if( get_option( 'wp-smush-hide_upgrade_notice' ) ) {
281
+ //Do not enqueue, unless it is one of the required screen
282
+ if ( ! $enqueue_smush || ( $current_page != 'nggallery-manage-images' && $current_page != 'gallery_page_wp-smush-nextgen-bulk' && $pagenow != 'post.php' && $pagenow != 'post-new.php' && $pagenow != 'upload.php' ) ) {
283
 
 
 
 
 
284
  return;
285
  }
286
  }
287
 
288
  wp_enqueue_script( 'wp-smushit-admin-js' );
 
 
 
 
 
289
 
290
  //Style
291
  wp_enqueue_style( 'wp-smushit-admin-css' );
292
+
293
+ $this->load_shared_ui( $current_page );
294
+
295
+ //Enqueue Google Fonts for Tooltip On Media Pages, These are loaded by shared UI, but we
296
+ // aren't loading shared UI on media library pages
297
+ if ( ! wp_style_is( 'wdev-plugin-google_fonts', 'enqueued' ) ) {
298
+ wp_enqueue_style(
299
+ 'wdev-plugin-google_fonts',
300
+ 'https://fonts.googleapis.com/css?family=Roboto+Condensed:400,700|Roboto:400,500,300,300italic'
301
+ );
302
+ }
303
 
304
  // localize translatable strings for js
305
  $this->localize();
309
  * Localize Translations
310
  */
311
  function localize() {
 
 
 
 
312
 
313
  $bulk = new WpSmushitBulk();
314
  $handle = 'wp-smushit-admin-js';
315
 
316
+ //Setup all the stats
317
+ $this->setup_global_stats();
 
 
 
318
 
319
  $wp_smush_msgs = array(
320
+ 'resmush' => esc_html__( 'Super-Smush', 'wp-smushit' ),
321
+ 'smush_now' => esc_html__( 'Smush Now', 'wp-smushit' ),
322
+ 'error_in_bulk' => esc_html__( '{{errors}} image(s) were skipped due to an error.', 'wp-smushit' ),
323
+ 'all_resmushed' => esc_html__( 'All images are fully optimised.', 'wp-smushit' ),
324
+ 'restore' => esc_html__( "Restoring image..", "wp-smushit" ),
325
+ 'smushing' => esc_html__( "Smushing image..", "wp-smushit" ),
326
+ 'checking' => esc_html__( "Checking images..", "wp-smushit" )
 
 
 
327
  );
328
 
329
  wp_localize_script( $handle, 'wp_smush_msgs', $wp_smush_msgs );
330
 
331
+ $this->attachments = $bulk->get_attachments();
 
 
 
 
 
 
 
 
 
332
 
333
+ //Localize smushit_ids variable, if there are fix number of ids
334
+ $this->ids = ! empty( $_REQUEST['ids'] ) ? array_map( 'intval', explode( ',', $_REQUEST['ids'] ) ) : $this->attachments;
 
 
 
335
 
336
  //Array of all smushed, unsmushed and lossless ids
337
  $data = array(
338
+ 'count_smushed' => $this->smushed_count,
339
+ 'count_total' => $this->total_count,
340
+ 'unsmushed' => $this->ids,
341
+ 'resmush' => $this->resmush_ids,
342
+ 'timeout' => WP_SMUSH_TIMEOUT * 1000, //Convert it into ms
343
  );
344
 
345
  wp_localize_script( 'wp-smushit-admin-js', 'wp_smushit_data', $data );
346
 
347
  }
348
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
349
  /**
350
  * Runs the expensive queries to get our global smush stats
351
+ *
352
+ * @param bool $force_update Whether to Force update the Global Stats or not
353
+ *
354
  */
355
+ function setup_global_stats( $force_update = false ) {
356
+ $this->total_count = $this->total_count();
357
+ $this->smushed_count = $this->smushed_count();
358
+ $this->remaining_count = $this->remaining_count();
359
+ $this->stats = $this->global_stats( $force_update );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
360
  }
361
 
362
  /**
366
  */
367
  function process_options() {
368
 
369
+ if ( ! is_admin() ) {
370
+ return false;
 
 
 
 
 
371
  }
372
 
373
  // we aren't saving options
374
  if ( ! isset( $_POST['wp_smush_options_nonce'] ) ) {
375
+ return false;
376
  }
377
+
378
  // the nonce doesn't pan out
379
  if ( ! wp_verify_nonce( $_POST['wp_smush_options_nonce'], 'save_wp_smush_options' ) ) {
380
+ return false;
381
  }
382
+
383
+ //Store that we need not redirect again on plugin activation
384
+ update_option( 'wp-smush-hide_smush_welcome', true );
385
+
386
  // var to temporarily assign the option value
387
  $setting = null;
388
 
389
+ //Store Option Name and their values in an array
390
+ $settings = array();
391
+
392
+
393
  // process each setting and update options
394
  foreach ( $this->settings as $name => $text ) {
395
+
396
  // formulate the index of option
397
  $opt_name = WP_SMUSH_PREFIX . $name;
398
 
399
  // get the value to be saved
400
  $setting = isset( $_POST[ $opt_name ] ) ? 1 : 0;
401
 
402
+ $settings[ $opt_name ] = $setting;
403
+
404
  // update the new value
405
  update_option( $opt_name, $setting );
406
 
408
  unset( $setting );
409
  }
410
 
411
+ //Store the option in table
412
+ update_option( 'wp-smush-settings_updated', 1 );
413
+
414
+ //Delete Show Resmush option
415
+ if ( isset( $_POST['wp-smush-keep_exif'] ) && ! isset( $_POST['wp-smush-original'] ) && ! isset( $_POST['wp-smush-lossy'] ) ) {
416
+ //@todo: Update Resmush ids
417
+ }
418
+
419
  }
420
 
421
  /**
422
  * Returns number of images of larger than 1Mb size
423
  *
424
+ * @param bool $force_update Whether to Force update the Global Stats or not
425
+ *
426
  * @return int
427
  */
428
  function get_exceeding_items_count( $force_update = false ) {
429
  $count = wp_cache_get( 'exceeding_items', 'wp_smush' );
430
  if ( ! $count || $force_update ) {
431
+ $count = 0;
 
 
432
  //Check images bigger than 1Mb, used to display the count of images that can't be smushed
433
+ foreach ( $this->attachments as $attachment ) {
434
  if ( file_exists( get_attached_file( $attachment ) ) ) {
435
  $size = filesize( get_attached_file( $attachment ) );
436
  }
445
  return $count;
446
  }
447
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
448
  /**
449
  * Processes the Smush request and sends back the next id for smushing
450
  */
452
 
453
  global $WpSmush;
454
 
455
+ // turn off errors for ajax result
456
+ @error_reporting( 0 );
457
+
458
  $should_continue = true;
459
 
460
  if ( empty( $_REQUEST['attachment_id'] ) ) {
461
  wp_send_json_error( 'missing id' );
462
  }
463
 
464
+ if ( ! $this->is_pro() ) {
465
  //Free version bulk smush, check the transient counter value
466
  $should_continue = $this->check_bulk_limit();
467
  }
476
  );
477
  }
478
 
479
+ $attachment_id = (int) ( $_REQUEST['attachment_id'] );
480
 
481
  $original_meta = wp_get_attachment_metadata( $attachment_id, true );
482
 
483
  $smush = $WpSmush->resize_from_meta_data( $original_meta, $attachment_id );
484
 
485
+ //Get the updated Global Stats
486
+ $this->setup_global_stats( true );
487
 
488
  $stats = $this->stats;
489
 
490
  $stats['smushed'] = $this->smushed_count;
491
+
492
+ if ( $WpSmush->lossy_enabled ) {
493
+ $stats['super_smushed'] = $this->super_smushed_count();
494
+ }
495
+
496
+ $stats['resmush_count'] = count( $this->resmush_ids );
497
+
498
+ $stats['total'] = $this->total_count();
499
 
500
  if ( is_wp_error( $smush ) ) {
501
  $error = $smush->get_error_message();
505
  }
506
  wp_send_json_error( array( 'stats' => $stats, 'error_msg' => $error ) );
507
  } else {
508
+ //Check if a resmush request, update the resmush list
509
+ if ( ! empty( $_REQUEST['is_bulk_resmush'] ) && 'false' != $_REQUEST['is_bulk_resmush'] && $_REQUEST['is_bulk_resmush'] ) {
510
+ $this->update_resmush_list( $attachment_id );
511
+ }
512
  wp_send_json_success( array( 'stats' => $stats ) );
513
  }
514
  }
515
 
516
  /**
517
+ * Handle the Ajax request for smushing single image
518
  *
519
+ * @uses smush_single()
520
  */
521
+ function smush_manual() {
522
+ // turn off errors for ajax result
523
+ @error_reporting( 0 );
524
+
525
  if ( ! current_user_can( 'upload_files' ) ) {
526
  wp_die( __( "You don't have permission to work with uploaded files.", 'wp-smushit' ) );
527
  }
530
  wp_die( __( 'No attachment ID was provided.', 'wp-smushit' ) );
531
  }
532
 
533
+ //Pass on the attachment id to smush single function
534
+ $this->smush_single( $_GET['attachment_id'] );
535
+ }
536
+
537
+ /**
538
+ * Smush single images
539
+ *
540
+ * @param $attachment_id
541
+ * @param bool $return Return/Echo the stats
542
+ *
543
+ * @return array|string|void
544
+ */
545
+ function smush_single( $attachment_id, $return = false ) {
546
+
547
  global $WpSmush;
548
 
549
+ $attachment_id = absint( (int) ( $attachment_id ) );
550
 
551
  $original_meta = wp_get_attachment_metadata( $attachment_id );
552
 
553
+ //Smush the image
554
  $smush = $WpSmush->resize_from_meta_data( $original_meta, $attachment_id );
555
 
556
+ //Get the button status
557
  $status = $WpSmush->set_status( $attachment_id, false, true );
558
 
559
+ //Send Json response if we are not suppose to return the results
560
+
561
  /** Send stats **/
562
  if ( is_wp_error( $smush ) ) {
563
+ if ( $return ) {
564
+ return array( 'error' => $smush->get_error_message() );
565
+ } else {
566
+ wp_send_json_error( array( 'error_msg' => $smush->get_error_message() ) );
567
+ }
568
  } else {
569
+ if ( $return ) {
570
+ return $status;
571
+ } else {
572
+ wp_send_json_success( $status );
573
+ }
574
  }
 
575
  }
576
 
577
  /**
579
  *
580
  * @return bool
581
  */
582
+ function check_bulk_limit( $reset = false ) {
583
 
584
  $transient_name = WP_SMUSH_PREFIX . 'bulk_sent_count';
 
585
 
586
+ //Do not go through this, if we need to reset
587
+ if( !$reset ) {
588
+ $bulk_sent_count = get_transient( $transient_name );
589
 
590
+ //If bulk sent count is not set
591
+ if ( false === $bulk_sent_count ) {
592
 
593
+ //start transient at 0
594
+ set_transient( $transient_name, 1, 200 );
595
 
596
+ return true;
597
 
598
+ } else if ( $bulk_sent_count < $this->max_free_bulk ) {
 
599
 
600
+ //If lte $this->max_free_bulk images are sent, increment
601
+ set_transient( $transient_name, $bulk_sent_count + 1, 200 );
602
 
603
+ return true;
604
 
605
+ } else { //Bulk sent count is set and greater than $this->max_free_bulk
 
606
 
607
+ $reset = true;
608
 
609
+ }
610
  }
 
611
 
612
+ //Reset the transient
613
+ if( $reset ) {
614
+ //clear it and return false to stop the process
615
+ set_transient( $transient_name, 0, 60 );
 
 
 
 
 
 
 
 
 
 
616
 
617
+ return false;
 
618
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
619
  }
620
 
621
  /**
623
  * @return int
624
  */
625
  function total_count() {
626
+
627
+ //Don't query again, if the variable is already set
628
+ if ( ! empty( $this->total_count ) && $this->total_count > 0 ) {
629
+ return $this->total_count;
630
+ }
631
+
632
+ $query = array(
633
  'fields' => 'ids',
634
  'post_type' => 'attachment',
635
  'post_status' => 'any',
656
  * @return array|int
657
  */
658
  function smushed_count( $return_ids = false ) {
659
+
660
+ //Don't query again, if the variable is already set
661
+ if ( ! empty( $this->smushed_count ) && $this->smushed_count > 0 ) {
662
+ return $this->smushed_count;
663
+ }
664
+
665
  $query = array(
666
  'fields' => 'ids',
667
  'post_type' => 'attachment',
677
  $this->remove_wmf_filters();
678
 
679
  $results = new WP_Query( $query );
680
+
681
+ if ( ! is_wp_error( $results ) && $results->post_count > 0 ) {
682
+ if ( ! $return_ids ) {
683
+ //return Post Count
684
+ return $results->post_count;
685
+ } else {
686
+ //Return post ids
687
+ return $results->posts;
688
+ }
689
  } else {
690
+ return false;
691
  }
 
 
 
692
  }
693
 
694
  /**
702
 
703
  /**
704
  * Display Thumbnails, if bulk action is choosen
705
+ *
706
+ * @Note: Not in use right now, Will use it in future for Media Bulk action
707
+ *
708
  */
709
  function selected_ui( $send_ids, $received_ids ) {
710
  if ( empty( $received_ids ) ) {
737
 
738
  /**
739
  * Display the bulk smushing button
740
+ *
741
+ * @param bool $resmush
742
+ *
743
+ * @param bool $return Whether to return the button content or print it
744
+ *
745
+ * @return Returns or Echo the content
746
  */
747
+ function setup_button( $resmush = false, $return = false ) {
748
+ $button = $this->button_state( $resmush );
749
  $disabled = ! empty( $button['disabled'] ) ? ' disabled="disabled"' : '';
750
+ $content = '<button class="button button-primary ' . $button['class'] . '"
751
+ name="smush-all" ' . $disabled . '>
752
+ <span>' . $button['text'] . '</span>
753
+ </button>';
754
+
755
+ //If We need to return the content
756
+ if ( $return ) {
757
+ return $content;
758
+ }
759
+
760
+ echo $content;
761
  }
762
 
763
+ /**
764
+ * Get all the attachment meta, sum up the stats and return
765
+ *
766
+ * @param bool $force_update , Whether to forcefully update the Cache
767
+ *
768
+ * @return array|bool|mixed
769
+ */
770
+ function global_stats( $force_update = false ) {
771
+
772
+ if ( ! $force_update && $stats = wp_cache_get( 'global_stats', 'wp_smush' ) ) {
773
+ if ( ! empty( $stats ) ) {
774
+ return $stats;
775
+ }
776
+ }
777
 
778
  global $wpdb, $WpSmush;
779
 
788
  * Allows to set a limit of mysql query
789
  * Default value is 2000
790
  */
791
+ $limit = apply_filters( 'wp_smush_media_query_limit', 2000 );
792
+ $limit = intval( $limit );
793
+ $offset = 0;
794
+ $query_next = true;
795
+
796
+ while ( $query_next ) {
797
 
798
+ $global_data = $wpdb->get_col( $wpdb->prepare( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key=%s LIMIT $offset, $limit", "wp-smpro-smush-data" ) );
799
 
800
  if ( ! empty( $global_data ) ) {
801
+ $smush_data['count'] = 0;
802
  foreach ( $global_data as $data ) {
803
  $data = maybe_unserialize( $data );
804
  if ( ! empty( $data['stats'] ) ) {
805
+ $smush_data['count'] += 1;
806
  $smush_data['size_before'] += ! empty( $data['stats']['size_before'] ) ? (int) $data['stats']['size_before'] : 0;
807
  $smush_data['size_after'] += ! empty( $data['stats']['size_after'] ) ? (int) $data['stats']['size_after'] : 0;
808
  }
810
  }
811
 
812
  $smush_data['bytes'] = $smush_data['size_before'] - $smush_data['size_after'];
813
+
814
+ //Update the offset
815
  $offset += $limit;
816
+
817
+ //Compare the Offset value to total images
818
+ if ( ! empty( $this->total_count ) && $this->total_count < $offset ) {
819
+ $query_next = false;
820
+ } elseif ( ! $global_data ) {
821
+ //If we didn' got any results
822
+ $query_next = false;
823
+ }
824
+
825
  }
826
 
827
  if ( ! isset( $smush_data['bytes'] ) || $smush_data['bytes'] < 0 ) {
837
 
838
  $smush_data['human'] = $WpSmush->format_bytes( $smush_data['bytes'] );
839
 
840
+ //Update Cache
841
+ wp_cache_set( 'smush_global_stats', $smush_data, '', DAY_IN_SECONDS );
842
+
843
  return $smush_data;
844
  }
845
 
846
  /**
847
  * Returns Bulk smush button id and other details, as per if bulk request is already sent or not
848
  *
849
+ * @param $resmush
850
+ *
851
  * @return array
852
  */
853
 
854
+ private function button_state( $resmush ) {
855
  $button = array(
856
  'cancel' => false,
857
  );
858
+ if ( $this->is_pro() && $resmush ) {
 
859
 
860
+ $button['text'] = __( 'Bulk Smush Now', 'wp-smushit' );
861
+ $button['class'] = 'wp-smush-button wp-smush-resmush wp-smush-all';
 
 
 
862
 
863
  } else {
864
 
868
  $button['class'] = 'wp-smush-finished disabled wp-smush-finished';
869
  $button['disabled'] = 'disabled';
870
 
871
+ } else {
872
 
873
  $button['text'] = __( 'Bulk Smush Now', 'wp-smushit' );
874
+ $button['class'] = 'wp-smush-button';
 
 
 
 
875
 
876
  }
877
  }
879
  return $button;
880
  }
881
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
882
  /**
883
  * Get the smush button text for attachment
884
+ *
885
+ * @param $id Attachment ID for which the Status has to be set
886
+ *
887
+ * @return string
888
  */
889
  function smush_status( $id ) {
890
  $response = trim( $this->set_status( $id, false ) );
906
  $settings = '<a href="' . $settings_page . '">' . __( 'Settings', 'wp-smushit' ) . '</a>';
907
 
908
  //Added a fix for weird warning in multisite, "array_unshift() expects parameter 1 to be array, null given"
909
+ if ( ! empty( $links ) ) {
910
  array_unshift( $links, $settings );
911
+ } else {
912
  $links = array( $settings );
913
  }
914
 
920
  */
921
  function smush_upgrade() {
922
 
923
+ //Return, If a pro user, or not super admin, or don't have the admin privilleges
924
+ if ( $this->is_pro() || ! current_user_can( 'edit_others_posts' ) || ! is_super_admin() ) {
925
  return;
926
  }
927
 
928
+ //No need to show it on bulk smush
929
  if ( isset( $_GET['page'] ) && 'wp-smush-bulk' == $_GET['page'] ) {
930
  return;
931
  }
932
 
933
+ //Return if notice is already dismissed
934
+ if ( get_option( 'wp-smush-hide_upgrade_notice' ) ) {
 
 
 
935
  return;
936
+ } ?>
937
+ <div class="wpmud wp-smush-updated"><?php
 
 
938
 
939
+ $install_type = get_option( 'wp-smush-install-type', false );
940
 
941
+ if ( ! $install_type ) {
942
+ if ( $this->smushed_count > 0 ) {
943
+ $install_type = 'existing';
944
+ } else {
945
+ $install_type = 'new';
946
+ }
947
+ update_option( 'wp-smush-install-type', $install_type );
948
+ }
949
 
950
+ //Whether New/Existing Installation
951
+ $box_heading = 'existing' == $install_type ? esc_html__( "THANKS FOR UPDATING SMUSH!", "wp-smushit" ) : esc_html__( "HAPPY SMUSHING!", "wp-smushit" );
952
 
953
+ //Container Header
954
+ echo $this->bulk_ui->container_header( 'wp-smush-install-thanks-box', 'wp-smush-install-thanks', $box_heading, '', true );
955
+ echo $this->bulk_ui->installation_notice();
956
+ ?>
957
+ </div><?php
 
 
 
958
  }
959
 
960
  /**
962
  *
963
  * @global object $wpdb
964
  *
 
 
965
  * @return object query results
966
  */
967
+ function get_smushed_attachments() {
968
 
969
  global $wpdb;
970
 
971
  $allowed_images = "( 'image/jpeg', 'image/jpg', 'image/png' )";
972
 
973
+ $limit = apply_filters( 'wp_smush_media_query_limit', 2000 );
974
+ $limit = intval( $limit );
975
+ $offset = 0;
976
+ $query_next = true;
977
+
978
+ while ( $query_next ) {
979
+ // get the attachment id, smush data
980
+ $sql = "SELECT p.ID as attachment_id, p.post_mime_type as type, ms.meta_value as smush_data"
981
+ . " FROM $wpdb->posts as p"
982
+ . " LEFT JOIN $wpdb->postmeta as ms"
983
+ . " ON (p.ID= ms.post_id AND ms.meta_key='wp-smpro-smush-data')"
984
+ . " WHERE"
985
+ . " p.post_type='attachment'"
986
+ . " AND p.post_mime_type IN " . $allowed_images
987
+ . " ORDER BY p . ID DESC"
988
+ // add a limit
989
+ . " LIMIT " . $limit;
990
+ $results = $wpdb->get_results( $sql );
991
+
992
+ //Update the offset
993
+ $offset += $limit;
994
+ if ( $this->total_count() && $this->total_count() < $offset ) {
995
+ $query_next = false;
996
+ } else if ( ! $results || empty( $results ) ) {
997
+ $query_next = false;
998
+ }
999
+ }
1000
 
1001
  return $results;
1002
  }
1006
  *
1007
  * @return array
1008
  */
1009
+ function get_lossy_attachments( $attachments = '', $return_count = true ) {
1010
 
1011
+ $lossy_attachments = array();
1012
+ $count = 0;
1013
 
1014
+ if ( empty( $attachments ) ) {
1015
+ //Fetch all the smushed attachment ids
1016
+ $attachments = $this->get_smushed_attachments();
1017
+ }
1018
+
1019
+ //If we dont' have any attachments
1020
+ if ( empty( $attachments ) || 0 == count( $attachments ) ) {
1021
+ return 0;
1022
+ }
1023
 
1024
  //Check if image is lossless or lossy
1025
  foreach ( $attachments as $attachment ) {
1027
  //Check meta for lossy value
1028
  $smush_data = ! empty( $attachment->smush_data ) ? maybe_unserialize( $attachment->smush_data ) : '';
1029
 
1030
+ //For Nextgen Gallery images
1031
+ if ( empty( $smush_data ) && is_array( $attachment ) && ! empty( $attachment['wp_smush'] ) ) {
1032
+ $smush_data = ! empty( $attachment['wp_smush'] ) ? $attachment['wp_smush'] : '';
1033
+ }
1034
+
1035
  //Return if not smushed
1036
  if ( empty( $smush_data ) ) {
1037
  continue;
1041
  if ( empty( $smush_data['stats'] ) || ! isset( $smush_data['stats']['lossy'] ) ) {
1042
  continue;
1043
  }
1044
+
1045
  //Add to array if lossy is not 1
1046
+ if ( 1 == $smush_data['stats']['lossy'] ) {
1047
+ $count ++;
1048
+ if ( ! empty( $attachment->attachment_id ) ) {
1049
+ $lossy_attachments[] = $attachment->attachment_id;
1050
+ } elseif ( is_array( $attachment ) && ! empty( $attachment['pid'] ) ) {
1051
+ $lossy_attachments[] = $attachment['pid'];
1052
+ }
1053
  }
 
1054
  }
1055
  unset( $attachments );
1056
 
1057
+ if ( $return_count ) {
1058
+ return $count;
1059
+ }
1060
+
1061
+ return $lossy_attachments;
1062
  }
1063
 
1064
  /**
1065
+ * Remove any pre_get_posts_filters added by WP Media Folder plugin
1066
  */
1067
+ function remove_wmf_filters() {
1068
+ //remove any filters added b WP media Folder plugin to get the all attachments
1069
+ if ( class_exists( 'Wp_Media_Folder' ) ) {
1070
+ global $wp_media_folder;
1071
+ if ( is_object( $wp_media_folder ) ) {
1072
+ remove_filter( 'pre_get_posts', array( $wp_media_folder, 'wpmf_pre_get_posts1' ) );
1073
+ remove_filter( 'pre_get_posts', array( $wp_media_folder, 'wpmf_pre_get_posts' ), 0, 1 );
1074
+ }
1075
+ }
1076
+ }
1077
 
1078
+ /**
1079
+ * Store a key/value to hide the smush features on bulk page
1080
+ */
1081
+ function dismiss_welcome_notice() {
1082
+ update_option( 'wp-smush-hide_smush_welcome', 1 );
1083
+ wp_send_json_success();
1084
+ }
1085
 
1086
+ /**
1087
+ * Store a key/value to hide the smush features on bulk page
1088
+ */
1089
+ function dismiss_upgrade_notice() {
1090
+ update_option( 'wp-smush-hide_upgrade_notice', 1 );
1091
+ wp_send_json_success();
1092
+ }
1093
+
1094
+ /**
1095
+ * Restore the image and its sizes from backup
1096
+ */
1097
+ function restore_image( $attachment = '', $resp = true ) {
1098
+
1099
+ if( empty( $attachment ) ) {
1100
+ //Check Empty fields
1101
+ if ( empty( $_POST['attachment_id'] ) || empty( $_POST['_nonce'] ) ) {
1102
+ wp_send_json_error( array(
1103
+ 'error' => 'empty_fields',
1104
+ 'message' => esc_html__( "Error in processing restore action, Fields empty.", "wp-smushit" )
1105
+ ) );
1106
+ }
1107
+ //Check Nonce
1108
+ if ( ! wp_verify_nonce( $_POST['_nonce'], "wp-smush-restore-" . $_POST['attachment_id'] ) ) {
1109
+ wp_send_json_error( array(
1110
+ 'error' => 'empty_fields',
1111
+ 'message' => esc_html__( "Image not restored, Nonce verification failed.", "wp-smushit" )
1112
+ ) );
1113
+ }
1114
+ }
1115
+
1116
+ //Store the restore success/failure for all the sizes
1117
+ $restored = array();
1118
+
1119
+ //Process Now
1120
+ $image_id = empty( $attachment ) ? absint( (int) $_POST['attachment_id'] ) : $attachment;
1121
+
1122
+ //Restore Full size -> get other image sizes -> restore other images
1123
+
1124
+ //Get the Original Path
1125
+ $file_path = get_attached_file( $image_id );
1126
+
1127
+ //Get the backup path
1128
+ $backup_name = $this->get_image_backup_path( $file_path );
1129
+
1130
+ //If file exists, corresponding to our backup path
1131
+ if ( file_exists( $backup_name ) ) {
1132
+ //Restore
1133
+ $restored[] = @copy( $backup_name, $file_path );
1134
+
1135
+ //Delete the backup
1136
+ @unlink( $backup_name );
1137
+ } elseif ( file_exists( $file_path . '_backup' ) ) {
1138
+ //Restore from other backups
1139
+ $restored[] = @copy( $file_path . '_backup', $file_path );
1140
+ }
1141
+
1142
+ //Get other sizes and restore
1143
+ //Get attachment data
1144
+ $attachment_data = wp_get_attachment_metadata( $image_id );
1145
+
1146
+ //Get the sizes
1147
+ $sizes = ! empty( $attachment_data['sizes'] ) ? $attachment_data['sizes'] : '';
1148
+
1149
+ //Loop on images to restore them
1150
+ foreach ( $sizes as $size ) {
1151
+ //Get the file path
1152
+ if ( empty( $size['file'] ) ) {
1153
+ continue;
1154
+ }
1155
+
1156
+ //Image Path and Backup path
1157
+ $image_size_path = path_join( dirname( $file_path ), $size['file'] );
1158
+ $image_bckup_path = $this->get_image_backup_path( $image_size_path );
1159
+
1160
+ //Restore
1161
+ if ( file_exists( $image_bckup_path ) ) {
1162
+ $restored[] = @copy( $image_bckup_path, $image_size_path );
1163
+ //Delete the backup
1164
+ @unlink( $image_bckup_path );
1165
+ } elseif ( file_exists( $image_size_path . '_backup' ) ) {
1166
+ $restored[] = @copy( $image_size_path . '_backup', $image_size_path );
1167
+ }
1168
  }
1169
+ //If any of the image is restored, we count it as success
1170
+ if ( in_array( true, $restored ) ) {
1171
 
1172
+ //Remove the Meta, And send json success
1173
+ delete_post_meta( $image_id, $this->smushed_meta_key );
1174
+
1175
+ //Get the Button html without wrapper
1176
+ $button_html = $this->set_status( $image_id, false, false, false );
1177
+
1178
+ if( $resp ) {
1179
+ wp_send_json_success( array( 'button' => $button_html ) );
1180
+ }else{
1181
+ return true;
1182
+ }
1183
+ }
1184
+ if( $resp ) {
1185
+ wp_send_json_error( array( 'message' => '<div class="wp-smush-error">' . __( "Unable to restore image", "wp-smushit" ) . '</div>' ) );
1186
+ }
1187
+ return false;
 
 
1188
  }
1189
 
1190
  /**
1191
+ * Restore the image and its sizes from backup
1192
+ *
1193
+ * @uses smush_single()
1194
+ *
1195
  */
1196
+ function resmush_image() {
1197
+
1198
+ //Check Empty fields
1199
+ if ( empty( $_POST['attachment_id'] ) || empty( $_POST['_nonce'] ) ) {
1200
+ wp_send_json_error( array(
1201
+ 'error' => 'empty_fields',
1202
+ 'message' => '<div class="wp-smush-error">' . esc_html__( "Image not smushed, fields empty.", "wp-smushit" ) . '</div>'
1203
+ ) );
1204
+ }
1205
+ //Check Nonce
1206
+ if ( ! wp_verify_nonce( $_POST['_nonce'], "wp-smush-resmush-" . $_POST['attachment_id'] ) ) {
1207
+ wp_send_json_error( array(
1208
+ 'error' => 'empty_fields',
1209
+ 'message' => '<div class="wp-smush-error">' . esc_html__( "Image couldn't be smushed as the nonce verification failed, try reloading the page.", "wp-smushit" ) . '</div>'
1210
+ ) );
1211
+ }
1212
+
1213
+ $image_id = intval( $_POST['attachment_id'] );
1214
+
1215
+ $smushed = $this->smush_single( $image_id, true );
1216
+
1217
+ //If any of the image is restored, we count it as success
1218
+ if ( ! empty( $smushed['status'] ) ) {
1219
+
1220
+ //Send button content
1221
+ wp_send_json_success( array( 'button' => $smushed['status'] . $smushed['stats'] ) );
1222
+
1223
+ } elseif ( ! empty( $smushed['error'] ) ) {
1224
+
1225
+ //Send Error Message
1226
+ wp_send_json_error( array( 'message' => '<div class="wp-smush-error">' . __( "Unable to smush image", "wp-smushit" ) . '</div>' ) );
1227
 
 
 
1228
  }
1229
+ }
1230
+
1231
+ /**
1232
+ * Scans all the smushed attachments to check if they need to be resmushed as per the
1233
+ * current settings, as user might have changed one of the configurations "Lossy", "Keep Original", "Preserve Exif"
1234
+ */
1235
+ function scan_images() {
1236
+
1237
+ global $WpSmush, $wpsmushnextgenadmin;
1238
+
1239
+ check_ajax_referer( 'save_wp_smush_options', 'wp_smush_options_nonce' );
1240
+
1241
+ $resmush_list = array();
1242
+
1243
+ //Default Notice, to be displayed at the top of page
1244
+ //Show a message, at the top
1245
+ $message = esc_html__( 'Yay! All images are optimised as per your current settings.', 'wp-smushit' );
1246
+ $resp = '<div class="wp-smush-notice wp-smush-resmush-message"><i class="dev-icon dev-icon-tick"></i> ' . $message . '
1247
+ <i class="dev-icon dev-icon-cross"></i>
1248
+ </div>';
1249
+
1250
+ //Scanning for NextGen or Media Library
1251
+ $type = isset( $_REQUEST['type'] ) ? sanitize_text_field( $_REQUEST['type'] ) : '';
1252
+
1253
+ //If a user manually runs smush check
1254
+ $return_ui = isset( $_REQUEST['get_ui'] ) && 'true' == $_REQUEST['get_ui'] ? true : false;
1255
+
1256
+ //Save Settings
1257
+ $this->process_options();
1258
+
1259
+ //Update the variables
1260
+ $WpSmush->initialise();
1261
+
1262
+ //Logic: If none of the required settings is on, don't need to resmush any of the images
1263
+ //We need at least one of these settings to be on, to check if any of the image needs resmush
1264
+ //Allow to smush Upfront images as well
1265
+ $upfront_active = class_exists( 'Upfront' );
1266
+
1267
+ $key = 'nextgen' == $type ? 'wp-smush-nextgen-resmush-list' : 'wp-smush-resmush-list';
1268
+
1269
+ if ( ! $WpSmush->lossy_enabled && ! $WpSmush->smush_original && $WpSmush->keep_exif && ! $upfront_active ) {
1270
+ delete_option( $key );
1271
+ wp_send_json_success( array( 'notice' => $resp ) );
1272
+ }
1273
+
1274
+ //Set to empty by default
1275
+ $ajax_response = '';
1276
+
1277
+ //Get Smushed Attachments
1278
+ if ( 'nextgen' != $type ) {
1279
+
1280
+ //Get list of Smushed images
1281
+ $attachments = $this->smushed_count( true );
1282
+ } else {
1283
+ global $wpsmushnextgenstats;
1284
+
1285
+ //Get smushed attachments list from nextgen class, We get the meta as well
1286
+ $attachments = $wpsmushnextgenstats->get_ngg_images();
1287
+
1288
+ }
1289
+
1290
+ //Check if any of the smushed image needs to be resmushed
1291
+ if ( ! empty( $attachments ) && is_array( $attachments ) ) {
1292
+ foreach ( $attachments as $attachment_k => $attachment ) {
1293
+
1294
+ //For NextGen we get the metadata in the attachment data itself
1295
+ if ( ! empty( $attachment['wp_smush'] ) ) {
1296
+ $smush_data = $attachment['wp_smush'];
1297
+ } else {
1298
+ //Check the current settings, and smush data for the image
1299
+ $smush_data = get_post_meta( $attachment, $this->smushed_meta_key, true );
1300
+ }
1301
+
1302
+ if ( ! empty( $smush_data['stats'] ) ) {
1303
+
1304
+ //If we need to optmise losslessly, add to resmush list
1305
+ $smush_lossy = $WpSmush->lossy_enabled && ! $smush_data['stats']['lossy'];
1306
+
1307
+ //If we need to strip exif, put it in resmush list
1308
+ $strip_exif = ! $WpSmush->keep_exif && isset( $smush_data['stats']['keep_exif'] ) && ( 1 == $smush_data['stats']['keep_exif'] );
1309
+
1310
+ //If Original image needs to be smushed
1311
+ $smush_original = $WpSmush->smush_original && empty( $smush_data['sizes']['full'] );
1312
+
1313
+ if ( $smush_lossy || $strip_exif || $smush_original ) {
1314
+ $resmush_list[] = 'nextgen' == $type ? $attachment_k : $attachment;
1315
+ continue;
1316
+ }
1317
+ }
1318
+ }
1319
+
1320
+ //Check for Upfront images that needs to be smushed
1321
+ if ( $upfront_active && 'nextgen' != $type ) {
1322
+ $upfront_attachments = $this->get_upfront_images( $resmush_list );
1323
+ if ( ! empty( $upfront_attachments ) && is_array( $upfront_attachments ) ) {
1324
+ foreach ( $upfront_attachments as $u_attachment_id ) {
1325
+ if ( ! in_array( $u_attachment_id, $resmush_list ) ) {
1326
+ //Check if not smushed
1327
+ $upfront_images = get_post_meta( $u_attachment_id, 'upfront_used_image_sizes', true );
1328
+ if ( ! empty( $upfront_images ) && is_array( $upfront_images ) ) {
1329
+ //Iterate over all the images
1330
+ foreach ( $upfront_images as $image ) {
1331
+ //If any of the element image is not smushed, add the id to resmush list
1332
+ //and skip to next image
1333
+ if ( empty( $image['is_smushed'] ) || 1 != $image['is_smushed'] ) {
1334
+ $resmush_list[] = $u_attachment_id;
1335
+ break;
1336
+ }
1337
+ }
1338
  }
1339
  }
1340
+ }
1341
+ }
1342
+ }//End Of Upfront loop
1343
+
1344
+ //Store the resmush list in Options table
1345
+ update_option( $key, $resmush_list );
1346
+
1347
+ //Return the Remsmush list and UI to be appended to Bulk Smush UI
1348
+ if ( $return_ui ) {
1349
+ if ( 'nextgen' != $type ) {
1350
+ //Set the variables
1351
+ $this->resmush_ids = $resmush_list;
1352
+ } else {
1353
+ //To avoid the php warning
1354
+ $wpsmushnextgenadmin->resmush_ids = $resmush_list;
1355
+ }
1356
+
1357
+ //Initialize stats
1358
+ if ( empty( $this->remaining_count ) ) {
1359
+ $this->setup_global_stats();
1360
+ }
1361
+
1362
+ if ( ( $count = count( $resmush_list ) ) > 0 || $this->remaining_count > 0 ) {
1363
+ $show = true;
1364
+
1365
+ if ( empty( $wpsmushnextgenadmin->remaining_count ) && 'nextgen' == $type ) {
1366
+ $wpsmushnextgenadmin->setup_stats();
1367
+ }
1368
+ $count += 'nextgen' == $type ? $wpsmushnextgenadmin->remaining_count : $this->remaining_count;
1369
+
1370
+ $ajax_response = $this->bulk_ui->bulk_resmush_content( $count, $show );
1371
+ $message = sprintf( esc_html__("You have images that need smushing. %sBulk smush now!%s", "wp-smushit"), '<a href="#" class="wp-smush-trigger-bulk">', '</a>' );
1372
+ $resp = '<div class="wp-smush-notice wp-smush-resmush-message wp-smush-resmush-pending"><i class="dev-icon dev-icon-tick"></i> ' . $message . '
1373
+ <i class="dev-icon dev-icon-cross"></i>
1374
+ </div>';
1375
+ } else {
1376
+ //Delete the resmush list
1377
+ delete_option( $key );
1378
+ }
1379
+ }
1380
+ }
1381
+
1382
+ //If there is a Ajax response return it, else return null
1383
+ $return = ! empty( $ajax_response ) ? array(
1384
+ "resmush_ids" => $resmush_list,
1385
+ "content" => $ajax_response
1386
+ ) : '';
1387
+ $return['notice'] = $resp;
1388
+
1389
+ wp_send_json_success( $return );
1390
+
1391
  }
1392
 
1393
  /**
1394
+ * Remove the given attachment id from resmush list and updates it to db
1395
+ *
1396
+ * @param $attachment_id
1397
+ * @param string $mkey
1398
+ *
1399
  */
1400
+ function update_resmush_list( $attachment_id, $mkey = 'wp-smush-resmush-list' ) {
1401
+ $resmush_list = get_option( $mkey );
1402
+
1403
+ //If there are any items in the resmush list, Unset the Key
1404
+ if ( ! empty( $resmush_list ) && count( $resmush_list ) > 0 ) {
1405
+ $key = array_search( $attachment_id, $resmush_list );
1406
+ if ( $resmush_list ) {
1407
+ unset( $resmush_list[ $key ] );
1408
+ }
1409
+ $resmush_list = array_values( $resmush_list );
1410
+ }
1411
 
1412
+ //If Resmush List is empty
1413
+ if ( empty( $resmush_list ) || 0 == count( $resmush_list ) ) {
1414
+ //Delete resmush list
1415
+ delete_option( $mkey );
1416
+ } else {
1417
+ update_option( $mkey, $resmush_list );
1418
+ }
1419
  }
1420
 
1421
  /**
1422
+ * Get the attachment ids with Upfront images
1423
+ *
1424
+ * @param array $skip_ids
1425
+ *
1426
+ * @return array|bool
1427
  */
1428
+ function get_upfront_images( $skip_ids = array() ) {
1429
+
1430
+ $query = array(
1431
+ 'fields' => 'ids',
1432
+ 'post_type' => 'attachment',
1433
+ 'post_status' => 'any',
1434
+ 'post_mime_type' => array( 'image/jpeg', 'image/gif', 'image/png' ),
1435
+ 'order' => 'ASC',
1436
+ 'posts_per_page' => - 1,
1437
+ 'meta_key' => 'upfront_used_image_sizes',
1438
+ 'no_found_rows' => true
1439
+ );
1440
+
1441
+ //Skip all the ids which are already in resmush list
1442
+ if ( ! empty( $skip_ids ) && is_array( $skip_ids ) ) {
1443
+ $query['post__not_in'] = $skip_ids;
1444
+ }
1445
+
1446
+ $results = new WP_Query( $query );
1447
+
1448
+ if ( ! is_wp_error( $results ) && $results->post_count > 0 ) {
1449
+ return $results->posts;
1450
+ } else {
1451
+ return false;
1452
+ }
1453
+ }
1454
+
1455
+ /**
1456
+ * Returns current user name to be displayed
1457
+ * @return string
1458
+ */
1459
+ function get_user_name() {
1460
+ //Get username
1461
+ $current_user = wp_get_current_user();
1462
+ $name = ! empty( $current_user->first_name ) ? $current_user->first_name : $current_user->display_name;
1463
+
1464
+ return $name;
1465
+ }
1466
+
1467
+ /**
1468
+ * Format Numbers to short form 1000 -> 1k
1469
+ *
1470
+ * @param $number
1471
+ *
1472
+ * @return string
1473
+ */
1474
+ function format_number( $number ) {
1475
+ if ( $number >= 1000 ) {
1476
+ return $number / 1000 . "k"; // NB: you will want to round this
1477
+ } else {
1478
+ return $number;
1479
+ }
1480
+ }
1481
+
1482
+ /**
1483
+ * Returns/Updates the number of images Super Smushed
1484
+ *
1485
+ * @param string $type media/nextgen, Type of images to get/set the super smushed count for
1486
+ *
1487
+ * @param array $attachments Optional, By default Media attachments will be fetched
1488
+ *
1489
+ * @return array|mixed|void
1490
+ *
1491
+ */
1492
+ function super_smushed_count( $type = 'media', $attachments = '' ) {
1493
+
1494
+ if ( 'media' == $type ) {
1495
+ $count = $this->media_super_smush_count();
1496
+ } else {
1497
+ $key = 'wp-smush-super_smushed_nextgen';
1498
+
1499
+ //Flag to check if we need to re-evaluate the count
1500
+ $revaluate = false;
1501
+
1502
+ $super_smushed = get_option( $key, false );
1503
+
1504
+ //Check if need to revalidate
1505
+ if ( ! $super_smushed || empty( $super_smushed ) || empty( $super_smushed['ids'] ) ) {
1506
+
1507
+ $super_smushed = array(
1508
+ 'ids' => array()
1509
+ );
1510
+
1511
+ $revaluate = true;
1512
+ } else {
1513
+ $last_checked = $super_smushed['timestamp'];
1514
+
1515
+ $diff = $last_checked - current_time( 'timestamp' );
1516
+
1517
+ //Difference in hour
1518
+ $diff_h = $diff / 3600;
1519
+
1520
+ //if last checked was more than 1 hours.
1521
+ if ( $diff_h > 1 ) {
1522
+ $revaluate = true;
1523
+ }
1524
+ }
1525
+ //Do not Revaluate stats if nextgen attachments are not provided
1526
+ if ( 'nextgen' == $type && empty( $attachments ) && $revaluate ) {
1527
+ $revaluate = false;
1528
+ }
1529
+
1530
+ //Need to scan all the image
1531
+ if ( $revaluate ) {
1532
+ //Get all the Smushed attachments ids
1533
+ $super_smushed_images = $this->get_lossy_attachments( $attachments, false );
1534
+
1535
+ if ( ! empty( $super_smushed_images ) && is_array( $super_smushed_images ) ) {
1536
+ //Iterate over all the attachments to check if it's already there in list, else add it
1537
+ foreach ( $super_smushed_images as $id ) {
1538
+ if ( ! in_array( $id, $super_smushed['ids'] ) ) {
1539
+ $super_smushed['ids'][] = $id;
1540
+ }
1541
+ }
1542
+ }
1543
+
1544
+ $super_smushed['timestamp'] = current_time( 'timestamp' );
1545
+
1546
+ update_option( $key, $super_smushed );
1547
  }
1548
+
1549
+ $count = ! empty( $super_smushed['ids'] ) ? count( $super_smushed['ids'] ) : 0;
1550
  }
1551
+
1552
+ return $count;
1553
  }
1554
 
1555
  /**
1556
+ * Add/Remove image id from Super Smushed images count
1557
+ *
1558
+ * @param int $id Image id
1559
+ *
1560
+ * @param string $op_type Add/remove, whether to add the image id or remove it from the list
1561
+ *
1562
+ * @return bool Whether the Super Smushed option was update or not
1563
+ *
1564
  */
1565
+ function update_super_smush_count( $id, $op_type = 'add', $key = 'wp-smush-super_smushed' ) {
1566
+
1567
+ //Get the existing count
1568
+ $super_smushed = get_option( $key, false );
1569
+
1570
+ //Initialize if it doesn't exists
1571
+ if ( ! $super_smushed || empty( $super_smushed['ids'] ) ) {
1572
+ $super_smushed = array(
1573
+ 'ids' => array()
1574
+ );
1575
+ }
1576
+
1577
+ //Insert the id, if not in there already
1578
+ if ( 'add' == $op_type && ! in_array( $id, $super_smushed['ids'] ) ) {
1579
+
1580
+ $super_smushed['ids'][] = $id;
1581
+
1582
+ } elseif ( 'remove' == $op_type && false !== ( $k = array_search( $id, $super_smushed['ids'] ) ) ) {
1583
+
1584
+ //Else remove the id from the list
1585
+ unset( $super_smushed['ids'][ $k ] );
1586
+
1587
+ //Reset all the indexes
1588
+ $super_smushed['ids'] = array_values( $super_smushed['ids'] );
1589
+
1590
+ }
1591
+
1592
+ //Add the timestamp
1593
+ $super_smushed['timestamp'] = current_time( 'timestamp' );
1594
+
1595
+ update_option( $key, $super_smushed );
1596
+
1597
+ //Update to database
1598
+ return true;
1599
+ }
1600
+
1601
+ /**
1602
+ * Checks if the image compression is lossy, stores the image id in options table
1603
+ *
1604
+ * @param int $id Image Id
1605
+ *
1606
+ * @param array $stats Compression Stats
1607
+ *
1608
+ * @param string $key Meta Key for storing the Super Smushed ids (Optional for Media Library)
1609
+ * Need To be specified for NextGen
1610
+ *
1611
+ * @return bool
1612
+ */
1613
+ function update_lists( $id, $stats, $key = '' ) {
1614
+ //If Stats are empty or the image id is not provided, return
1615
+ if ( empty( $stats ) || empty( $id ) || empty( $stats['stats'] ) ) {
1616
+ return false;
1617
+ }
1618
+
1619
+ //Update Super Smush count
1620
+ if ( isset( $stats['stats']['lossy'] ) && 1 == $stats['stats']['lossy'] ) {
1621
+ if ( empty( $key ) ) {
1622
+ update_post_meta( $id, 'wp-smush-lossy', 1 );
1623
+ } else {
1624
+ $this->update_super_smush_count( $id, 'add', $key );
1625
+ }
1626
+ }
1627
+
1628
+ //Check and update re-smush list for media gallery
1629
+ if ( ! empty( $this->resmush_ids ) && in_array( $id, $this->resmush_ids ) ) {
1630
+ $this->update_resmush_list( $id );
1631
+ }
1632
+
1633
+ }
1634
+
1635
+ /**
1636
+ * Delete the resmush list for Nextgen or the Media Library
1637
+ */
1638
+ function delete_resmush_list() {
1639
+
1640
+ $key = ! empty( $_POST['type'] ) && 'nextgen' == $_POST['type'] ? 'wp-smush-nextgen-resmush-list' : 'wp-smush-resmush-list';
1641
+ //Delete the resmush list
1642
+ delete_option( $key );
1643
  wp_send_json_success();
1644
  }
1645
+
1646
+ /**
1647
+ * Updates the Meta for existing smushed images and retrieves the count of Super Smushed images
1648
+ *
1649
+ * @return int Count of Super Smushed images
1650
+ *
1651
+ */
1652
+ function media_super_smush_count() {
1653
+ //Check if we have updated the stats for existing images, One time
1654
+ if ( ! get_option( 'wp-smush-lossy-updated' ) ) {
1655
+
1656
+ //Get all the smushed attachments
1657
+ $attachments = $this->get_lossy_attachments( '', false );
1658
+ foreach ( $attachments as $attachment ) {
1659
+ update_post_meta( $attachment, 'wp-smush-lossy', 1 );
1660
+ }
1661
+ }
1662
+ //Get all the attachments with wp-smush-lossy
1663
+ $limit = apply_filters( 'wp_smush_query_limit', 2000 );
1664
+ $limit = intval( $limit );
1665
+ $get_posts = true;
1666
+ $super_smushed = array();
1667
+ $args = array(
1668
+ 'fields' => 'ids',
1669
+ 'post_type' => 'attachment',
1670
+ 'post_status' => 'any',
1671
+ 'post_mime_type' => array( 'image/jpeg', 'image/gif', 'image/png' ),
1672
+ 'orderby' => 'ID',
1673
+ 'order' => 'DESC',
1674
+ 'posts_per_page' => $limit,
1675
+ 'offset' => 0,
1676
+ 'meta_query' => array(
1677
+ array(
1678
+ 'key' => 'wp-smush-lossy',
1679
+ 'value' => 1
1680
+ )
1681
+ ),
1682
+ 'update_post_term_cache' => false,
1683
+ 'no_found_rows' => true,
1684
+ );
1685
+ //Loop Over to get all the attachments
1686
+ while ( $get_posts ) {
1687
+
1688
+ //Remove the Filters added by WP Media Folder
1689
+ $this->remove_wmf_filters();
1690
+
1691
+ $query = new WP_Query( $args );
1692
+
1693
+ if ( ! empty( $query->post_count ) && sizeof( $query->posts ) > 0 ) {
1694
+ //Merge the results
1695
+ $super_smushed = array_merge( $super_smushed, $query->posts );
1696
+
1697
+ //Update the offset
1698
+ $args['offset'] += $limit;
1699
+ } else {
1700
+ //If we didn't get any posts from query, set $get_posts to false
1701
+ $get_posts = false;
1702
+ }
1703
+
1704
+ //If total Count is set, and it is alread lesser than offset, don't query
1705
+ if ( ! empty( $this->total_count ) && $this->total_count < $args['offset'] ) {
1706
+ $get_posts = false;
1707
+ }
1708
+ }
1709
+ update_option( 'wp-smush-lossy-updated', true );
1710
+
1711
+ return count( $super_smushed );
1712
+ }
1713
+
1714
+ /**
1715
+ * Allows to bulk restore the images, if there is any backup for them
1716
+ */
1717
+ function bulk_restore() {
1718
+ $smushed_attachments = $this->get_smushed_attachments();
1719
+ foreach ( $smushed_attachments as $attachment ) {
1720
+ $this->restore_image( $attachment->attachment_id, false );
1721
+ }
1722
+ }
1723
+
1724
+ /**
1725
+ * Loads the Shared UI to on all admin pages
1726
+ * @param $current_page
1727
+ */
1728
+ function load_shared_ui( $current_page ) {
1729
+ //If class method exists, load shared UI
1730
+ if ( class_exists( 'WDEV_Plugin_Ui' ) ) {
1731
+
1732
+ if ( method_exists( 'WDEV_Plugin_Ui', 'load' ) ) {
1733
+
1734
+ //Load Shared UI
1735
+ WDEV_Plugin_Ui::load( WP_SMUSH_URL . '/assets/shared-ui/', false );
1736
+
1737
+ if ( ( 'media_page_wp-smush-bulk' != $current_page && 'gallery_page_wp-smush-nextgen-bulk' != $current_page ) ) {
1738
+
1739
+ //Don't add thhe WPMUD class to body to other admin pages
1740
+ remove_filter(
1741
+ 'admin_body_class',
1742
+ array( 'WDEV_Plugin_Ui', 'admin_body_class' )
1743
+ );
1744
+
1745
+ }
1746
+ }
1747
+ }
1748
+ }
1749
+
1750
  }
1751
 
1752
  global $wpsmushit_admin;
lib/class-wp-smush-bulk.php CHANGED
@@ -8,7 +8,7 @@
8
  * @author Saurabh Shukla <saurabh@incsub.com>
9
  * @author Umesh Kumar <umesh@incsub.com>
10
  *
11
- * @copyright (c) 2015, Incsub (http://incsub.com)
12
  */
13
  if ( ! class_exists( 'WpSmushitBulk' ) ) {
14
 
@@ -23,68 +23,56 @@ if ( ! class_exists( 'WpSmushitBulk' ) ) {
23
  */
24
  function get_attachments() {
25
  global $wpsmushit_admin;
 
26
  if ( ! isset( $_REQUEST['ids'] ) ) {
 
 
 
 
27
  $args = array(
28
- 'fields' => 'ids',
29
- 'post_type' => 'attachment',
30
- 'post_status' => 'any',
31
- 'post_mime_type' => array( 'image/jpeg', 'image/gif', 'image/png' ),
32
- 'orderby' => 'ID',
33
- 'order' => 'DESC',
34
- 'posts_per_page' => - 1,
35
- 'meta_query' => array(
 
36
  array(
37
  'key' => 'wp-smpro-smush-data',
38
  'compare' => 'NOT EXISTS'
39
  )
40
  ),
41
  'update_post_term_cache' => false,
42
- 'no_found_rows' => true
43
  );
 
 
44
 
45
- //Remove the Filters added by WP Media Folder
46
- $wpsmushit_admin->remove_wmf_filters();
47
 
48
- $query = new WP_Query( $args );
49
- $unsmushed_posts = $query->posts;
50
- } else {
51
- return explode( ',', $_REQUEST['ids'] );
52
- }
53
 
54
- return $unsmushed_posts;
55
- }
56
-
57
- /**
58
- * Fetches the ids of unsmushed images for NextGen Gallery
59
- * @return array
60
- */
61
- function get_nextgen_attachments() {
62
- global $wpsmushit_admin;
63
- if ( ! isset( $_REQUEST['ids'] ) ) {
64
- $args = array(
65
- 'fields' => 'ids',
66
- 'post_type' => 'attachment',
67
- 'post_status' => 'any',
68
- 'post_mime_type' => array( 'image/jpeg', 'image/gif', 'image/png' ),
69
- 'orderby' => 'ID',
70
- 'order' => 'DESC',
71
- 'posts_per_page' => - 1,
72
- 'meta_query' => array(
73
- array(
74
- 'key' => 'wp-smpro-smush-data',
75
- 'compare' => 'NOT EXISTS'
76
- )
77
- ),
78
- 'no_found_rows' => true
79
- );
80
 
81
- //Remove the Filters added by WP Media Folder
82
- $wpsmushit_admin->remove_wmf_filters();
 
 
 
 
83
 
84
- $query = new WP_Query( $args );
85
- $unsmushed_posts = $query->posts;
 
 
 
86
  } else {
87
- return explode( ',', $_REQUEST['ids'] );
88
  }
89
 
90
  return $unsmushed_posts;
8
  * @author Saurabh Shukla <saurabh@incsub.com>
9
  * @author Umesh Kumar <umesh@incsub.com>
10
  *
11
+ * @copyright (c) 2016, Incsub (http://incsub.com)
12
  */
13
  if ( ! class_exists( 'WpSmushitBulk' ) ) {
14
 
23
  */
24
  function get_attachments() {
25
  global $wpsmushit_admin;
26
+
27
  if ( ! isset( $_REQUEST['ids'] ) ) {
28
+ $limit = apply_filters( 'wp_smush_nextgen_query_limit', 2000 );
29
+ $limit = intval( $limit );
30
+ $get_posts = true;
31
+ $unsmushed_posts = array();
32
  $args = array(
33
+ 'fields' => 'ids',
34
+ 'post_type' => 'attachment',
35
+ 'post_status' => 'any',
36
+ 'post_mime_type' => array( 'image/jpeg', 'image/gif', 'image/png' ),
37
+ 'orderby' => 'ID',
38
+ 'order' => 'DESC',
39
+ 'posts_per_page' => $limit,
40
+ 'offset' => 0,
41
+ 'meta_query' => array(
42
  array(
43
  'key' => 'wp-smpro-smush-data',
44
  'compare' => 'NOT EXISTS'
45
  )
46
  ),
47
  'update_post_term_cache' => false,
48
+ 'no_found_rows' => true,
49
  );
50
+ //Loop Over to get all the attachments
51
+ while ( $get_posts ) {
52
 
53
+ //Remove the Filters added by WP Media Folder
54
+ $wpsmushit_admin->remove_wmf_filters();
55
 
56
+ $query = new WP_Query( $args );
 
 
 
 
57
 
58
+ if( !empty( $query->post_count ) && sizeof( $query->posts ) > 0 ) {
59
+ //Merge the results
60
+ $unsmushed_posts = array_merge( $unsmushed_posts, $query->posts );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
 
62
+ //Update the offset
63
+ $args['offset'] += $limit;
64
+ }else{
65
+ //If we didn't get any posts from query, set $get_posts to false
66
+ $get_posts = false;
67
+ }
68
 
69
+ //If total Count is set, and it is alread lesser than offset, don't query
70
+ if ( ! empty( $wpsmushit_admin->total_count ) && $wpsmushit_admin->total_count < $args['offset'] ) {
71
+ $get_posts = false;
72
+ }
73
+ }
74
  } else {
75
+ return array_map( 'intval', explode( ',', $_REQUEST['ids'] ) );
76
  }
77
 
78
  return $unsmushed_posts;
lib/class-wp-smush-migrate.php CHANGED
@@ -8,7 +8,7 @@
8
  * @author Umesh Kumar <umesh@incsub.com>
9
  * @author Sam Najian <sam@incsub.com>
10
  *
11
- * @copyright (c) 2015, Incsub (http://incsub.com)
12
  */
13
 
14
  class WpSmushMigrate {
8
  * @author Umesh Kumar <umesh@incsub.com>
9
  * @author Sam Najian <sam@incsub.com>
10
  *
11
+ * @copyright (c) 2016, Incsub (http://incsub.com)
12
  */
13
 
14
  class WpSmushMigrate {
lib/class-wp-smush-nextgen.php CHANGED
@@ -7,7 +7,7 @@
7
  *
8
  * @author Umesh Kumar <umesh@incsub.com>
9
  *
10
- * @copyright (c) 2015, Incsub (http://incsub.com)
11
  */
12
  if ( ! class_exists( 'WpSmushNextGen' ) ) {
13
 
@@ -22,37 +22,23 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
22
  var $is_nextgen_active = false;
23
 
24
  function __construct() {
 
25
 
26
  //Auto Smush image, if enabled, runs after Nextgen is finished uploading the image
27
- //Check if auto is enabled
28
- if ( $this->is_auto_smush_enabled() ) {
29
  add_action( 'ngg_added_new_image', array( &$this, 'auto_smush' ) );
30
  }
31
 
32
- //Handle Manual Smush request for Nextgen gallery images
33
  add_action( 'wp_ajax_smush_manual_nextgen', array( $this, 'manual_nextgen' ) );
34
 
35
- }
36
-
37
- /**
38
- * If auto smush is set to true or not, default is true
39
- *
40
- * @return int|mixed|void
41
- */
42
- function is_auto_smush_enabled() {
43
- $auto_smush = get_option( WP_SMUSH_PREFIX . 'auto' );
44
-
45
- //Keep the auto smush on by default
46
- if ( $auto_smush === false ) {
47
- $auto_smush = 1;
48
- }
49
 
50
- /**
51
- * Allows to filter the Auto Smush status for NextGen galery
52
- */
53
- $auto_smush = apply_filters('smush_nextgen_auto', $auto_smush );
54
 
55
- return $auto_smush;
56
  }
57
 
58
  /**
@@ -73,6 +59,46 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
73
  return $images;
74
  }
75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  /**
77
  * Get image mime type
78
  *
@@ -81,7 +107,7 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
81
  * @return bool|string
82
  */
83
  function get_file_type( $file_path ) {
84
- if ( empty( $file_path ) ) {
85
  return false;
86
  }
87
  if ( function_exists( 'exif_imagetype' ) ) {
@@ -109,11 +135,11 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
109
  *
110
  * @return mixed
111
  */
112
- function resize_from_meta_data( $storage, $image ) {
113
  global $WpSmush;
114
 
115
- $errors = new WP_Error();
116
- $stats = array(
117
  "stats" => array_merge( $WpSmush->_get_size_signature(), array(
118
  'api_version' => - 1,
119
  'lossy' => - 1
@@ -124,6 +150,12 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
124
 
125
  $size_before = $size_after = $compression = $total_time = $bytes_saved = 0;
126
 
 
 
 
 
 
 
127
  //File path and URL for original image
128
  // get an array of sizes available for the $image
129
  $sizes = $storage->get_image_sizes();
@@ -131,16 +163,20 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
131
  // If images has other registered size, smush them first
132
  if ( ! empty( $sizes ) ) {
133
 
134
- if( class_exists('finfo') ) {
135
  $finfo = new finfo( FILEINFO_MIME_TYPE );
136
- }else{
137
  $finfo = false;
138
  }
139
 
140
  foreach ( $sizes as $size ) {
141
 
142
- // We take the original image. Get the absolute path using the storage object
 
 
 
143
 
 
144
  $attachment_file_path_size = $storage->get_image_abspath( $image, $size );
145
 
146
  if ( $finfo ) {
@@ -150,7 +186,7 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
150
  } else {
151
  $ext = false;
152
  }
153
- if( $ext ) {
154
  $valid_mime = array_search(
155
  $ext,
156
  array(
@@ -181,21 +217,26 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
181
  return $response;
182
  }
183
 
184
- if ( ! empty( $response['data'] ) ) {
185
- $stats['sizes'][ $size ] = (object) $WpSmush->_array_fill_placeholders( $WpSmush->_get_size_signature(), (array) $response['data'] );
 
186
  }
187
 
188
- //Total Stats, store all data in bytes
189
- if ( isset( $response['data'] ) ) {
190
- list( $size_before, $size_after, $total_time, $compression, $bytes_saved )
191
- = $WpSmush->_update_stats_data( $response['data'], $size_before, $size_after, $total_time, $bytes_saved );
192
- } else {
193
- $errors->add( "image_size_error" . $size, sprintf( __( "Size '%s' not processed correctly", 'wp-smushit' ), $size ) );
194
  }
195
 
 
 
 
 
 
 
196
  if ( empty( $stats['stats']['api_version'] ) || $stats['stats']['api_version'] == - 1 ) {
197
  $stats['stats']['api_version'] = $response['data']->api_version;
198
  $stats['stats']['lossy'] = $response['data']->lossy;
 
199
  }
200
  }
201
  }
@@ -211,29 +252,53 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
211
  $existing_stats = ( ! empty( $image->meta_data ) && ! empty( $image->meta_data['wp_smush'] ) ) ? $image->meta_data['wp_smush'] : '';
212
 
213
  if ( ! empty( $existing_stats ) ) {
 
 
 
 
 
214
  //Update total bytes saved, and compression percent
215
  $stats['stats']['bytes'] = isset( $existing_stats['stats']['bytes'] ) ? $existing_stats['stats']['bytes'] + $stats['stats']['bytes'] : $stats['stats']['bytes'];
216
- $stats['stats']['percent'] = isset( $existing_stats['stats']['percent'] ) ? $existing_stats['stats']['percent'] + $stats['stats']['percent'] : $stats['stats']['percent'];
 
217
 
218
  //Update stats for each size
219
  if ( ! empty( $existing_stats['sizes'] ) && ! empty( $stats['sizes'] ) ) {
220
 
221
  foreach ( $existing_stats['sizes'] as $size_name => $size_stats ) {
222
  //if stats for a particular size doesn't exists
223
- if ( empty( $stats['sizes'] ) || empty( $stats['sizes'][$size_name] ) ) {
224
  $stats = empty( $stats ) ? array() : $stats;
225
  if ( empty( $stats['sizes'] ) ) {
226
  $stats['sizes'] = array();
227
  }
228
- $stats['sizes'][$size_name] = $existing_stats['sizes'][ $size_name ];
229
  } else {
 
 
 
 
 
230
  //Update compression percent and bytes saved for each size
231
- $stats['sizes'][$size_name]->bytes = $stats['sizes'][$size_name]->bytes + $existing_stats['sizes'][ $size_name ]->bytes;
232
- $stats['sizes'][$size_name]->percent = $stats['sizes'][$size_name]->bytes + $existing_stats['sizes'][ $size_name ]->percent;
 
233
  }
234
  }
235
  }
236
  }
 
 
 
 
 
 
 
 
 
 
 
 
237
  $image->meta_data['wp_smush'] = $stats;
238
  nggdb::update_image_meta( $image->pid, $image->meta_data );
239
 
@@ -251,35 +316,28 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
251
  *
252
  * @param string $pid , NextGen Gallery Image id
253
  * @param string $image , Nextgen gallery image object
254
- * @param bool|true $echo, Whether to echo the stats or not, false for auto smush
255
  */
256
  function smush_image( $pid = '', $image = '', $echo = true ) {
257
  global $wpsmushnextgenstats;
258
 
259
- //Get metadata For the image
260
- // Registry Object for NextGen Gallery
261
- $registry = C_Component_Registry::get_instance();
262
-
263
- //Gallery Storage Object
264
- $storage = $registry->get_utility( 'I_Gallery_Storage' );
265
-
266
  //Get image, if we have image id
267
  if ( ! empty( $pid ) ) {
268
- $image = $storage->object->_image_mapper->find( $pid );
269
  } elseif ( ! empty( $image ) ) {
270
- $pid = $storage->object->_get_image_id( $image );
271
  }
272
 
273
  $metadata = ! empty( $image ) ? $image->meta_data : '';
274
 
275
  if ( empty( $metadata ) ) {
276
- wp_send_json_error( array( 'error' => "missing_metadata" ) );
277
  }
278
 
279
  //smush the main image and its sizes
280
- $smush = $this->resize_from_meta_data( $storage, $image, $pid );
281
 
282
- if( !is_wp_error( $smush ) ) {
283
  $status = $wpsmushnextgenstats->show_stats( $pid, $smush, false, true );
284
  }
285
 
@@ -294,11 +352,11 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
294
  } else {
295
  wp_send_json_success( $status );
296
  }
297
- }else{
298
  if ( is_wp_error( $smush ) ) {
299
  return $smush;
300
- }else{
301
- return true;
302
  }
303
  }
304
  }
@@ -308,7 +366,7 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
308
  * Calls the function to update the compression stats
309
  */
310
  function manual_nextgen() {
311
- $pid = ! empty( $_GET['attachment_id'] ) ? $_GET['attachment_id'] : '';
312
  $nonce = ! empty( $_GET['_nonce'] ) ? $_GET['_nonce'] : '';
313
 
314
  //Verify Nonce
@@ -340,15 +398,203 @@ if ( ! class_exists( 'WpSmushNextGen' ) ) {
340
 
341
  }
342
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
343
  }//End of Class
344
  }//End Of if class not exists
345
 
346
  //Extend NextGen Mixin class to smush dynamic images
347
  if ( class_exists( 'WpSmushNextGen' ) ) {
 
348
  $wpsmushnextgen = new WpSmushNextGen();
349
 
350
  //Extend Nextgen Mixin class and override the generate_image_size, to optimize dynamic thumbnails, generated by nextgen, check for auto smush
351
- if ( ! class_exists( 'WpSmushNextGenDynamicThumbs' ) && class_exists( 'Mixin' ) && $wpsmushnextgen->is_auto_smush_enabled() ) {
352
 
353
  class WpSmushNextGenDynamicThumbs extends Mixin {
354
 
@@ -364,9 +610,9 @@ if ( class_exists( 'WpSmushNextGen' ) ) {
364
  */
365
  function generate_image_size( $image, $size, $params = null, $skip_defaults = false ) {
366
  global $WpSmush;
367
- $image_id = !empty( $image->pid ) ? $image->pid : '';
368
  //Get image from storage object if we don't have it already
369
- if( empty( $image_id ) ) {
370
  //Get metadata For the image
371
  // Registry Object for NextGen Gallery
372
  $registry = C_Component_Registry::get_instance();
@@ -385,7 +631,7 @@ if ( class_exists( 'WpSmushNextGen' ) ) {
385
  $response = $WpSmush->do_smushit( $filename, $image_id, 'nextgen' );
386
 
387
  //If the image was smushed
388
- if ( ! is_wp_error( $response ) && ! empty( $response['data'] ) ) {
389
  //Check for existing stats
390
  if ( ! empty( $image->meta_data ) && ! empty( $image->meta_data['wp_smush'] ) ) {
391
  $stats = $image->meta_data['wp_smush'];
@@ -394,7 +640,8 @@ if ( class_exists( 'WpSmushNextGen' ) ) {
394
  $stats = array(
395
  "stats" => array_merge( $WpSmush->_get_size_signature(), array(
396
  'api_version' => - 1,
397
- 'lossy' => - 1
 
398
  )
399
  ),
400
  'sizes' => array()
@@ -420,17 +667,6 @@ if ( class_exists( 'WpSmushNextGen' ) ) {
420
 
421
  return $success;
422
  }
423
-
424
- function update_stats( $smush_stats, $image ) {
425
- global $WpSmush;
426
- if ( is_wp_error( $smush_stats ) ) {
427
- return $smush_stats;
428
- }
429
-
430
- if ( ! empty( $smush_stats['data'] ) ) {
431
- $image['sizes'][ $size ] = (object) $WpSmush->_array_fill_placeholders( $WpSmush->_get_size_signature(), (array) $smush_stats['data'] );
432
- }
433
- }
434
  }
435
  }
436
  }
7
  *
8
  * @author Umesh Kumar <umesh@incsub.com>
9
  *
10
+ * @copyright (c) 2016, Incsub (http://incsub.com)
11
  */
12
  if ( ! class_exists( 'WpSmushNextGen' ) ) {
13
 
22
  var $is_nextgen_active = false;
23
 
24
  function __construct() {
25
+ global $WpSmush;
26
 
27
  //Auto Smush image, if enabled, runs after Nextgen is finished uploading the image
28
+ //Allows to override whether to auto smush nextgen image or not
29
+ if ( $auto_smush = apply_filters( 'smush_nextgen_auto', $WpSmush->is_auto_smush_enabled() ) ) {
30
  add_action( 'ngg_added_new_image', array( &$this, 'auto_smush' ) );
31
  }
32
 
33
+ //Single Smush/Manual Smush: Handles the Single/Manual smush request for Nextgen Gallery
34
  add_action( 'wp_ajax_smush_manual_nextgen', array( $this, 'manual_nextgen' ) );
35
 
36
+ //Restore Image: Handles the single/Manual restore image request for NextGen Gallery
37
+ add_action( 'wp_ajax_smush_restore_nextgen_image', array( $this, 'restore_image' ) );
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
+ //Resmush Image: Handles the single/Manual resmush image request for NextGen Gallery
40
+ add_action( 'wp_ajax_smush_resmush_nextgen_image', array( $this, 'resmush_image' ) );
 
 
41
 
 
42
  }
43
 
44
  /**
59
  return $images;
60
  }
61
 
62
+ /**
63
+ * Get the NextGen Image object from attachment id
64
+ *
65
+ * @param $pid
66
+ *
67
+ * @return mixed
68
+ */
69
+ function get_nextgen_image_from_id( $pid ) {
70
+
71
+ // Registry Object for NextGen Gallery
72
+ $registry = C_Component_Registry::get_instance();
73
+
74
+ //Gallery Storage Object
75
+ $storage = $registry->get_utility( 'I_Gallery_Storage' );
76
+
77
+ $image = $storage->object->_image_mapper->find( $pid );
78
+
79
+ return $image;
80
+ }
81
+
82
+ /**
83
+ * Get the NextGen attachment id from image object
84
+ *
85
+ * @param $image
86
+ *
87
+ * @return mixed
88
+ */
89
+ function get_nextgen_id_from_image( $image ) {
90
+
91
+ // Registry Object for NextGen Gallery
92
+ $registry = C_Component_Registry::get_instance();
93
+
94
+ //Gallery Storage Object
95
+ $storage = $registry->get_utility( 'I_Gallery_Storage' );
96
+
97
+ $pid = $storage->object->_get_image_id( $image );
98
+
99
+ return $pid;
100
+ }
101
+
102
  /**
103
  * Get image mime type
104
  *
107
  * @return bool|string
108
  */
109
  function get_file_type( $file_path ) {
110
+ if ( empty( $file_path ) || !file_exists( $file_path ) ) {
111
  return false;
112
  }
113
  if ( function_exists( 'exif_imagetype' ) ) {
135
  *
136
  * @return mixed
137
  */
138
+ function resize_from_meta_data( $image ) {
139
  global $WpSmush;
140
 
141
+ $errors = new WP_Error();
142
+ $stats = array(
143
  "stats" => array_merge( $WpSmush->_get_size_signature(), array(
144
  'api_version' => - 1,
145
  'lossy' => - 1
150
 
151
  $size_before = $size_after = $compression = $total_time = $bytes_saved = 0;
152
 
153
+ // Registry Object for NextGen Gallery
154
+ $registry = C_Component_Registry::get_instance();
155
+
156
+ //Gallery Storage Object
157
+ $storage = $registry->get_utility( 'I_Gallery_Storage' );
158
+
159
  //File path and URL for original image
160
  // get an array of sizes available for the $image
161
  $sizes = $storage->get_image_sizes();
163
  // If images has other registered size, smush them first
164
  if ( ! empty( $sizes ) ) {
165
 
166
+ if ( class_exists( 'finfo' ) ) {
167
  $finfo = new finfo( FILEINFO_MIME_TYPE );
168
+ } else {
169
  $finfo = false;
170
  }
171
 
172
  foreach ( $sizes as $size ) {
173
 
174
+ //Skip Full size, if smush original is not checked
175
+ if( 'full' == $size && !$WpSmush->smush_original ) {
176
+ continue;
177
+ }
178
 
179
+ // We take the original image. Get the absolute path using the storage object
180
  $attachment_file_path_size = $storage->get_image_abspath( $image, $size );
181
 
182
  if ( $finfo ) {
186
  } else {
187
  $ext = false;
188
  }
189
+ if ( $ext ) {
190
  $valid_mime = array_search(
191
  $ext,
192
  array(
217
  return $response;
218
  }
219
 
220
+ //If there are no stats
221
+ if( empty( $response['data'] ) ) {
222
+ continue;
223
  }
224
 
225
+ //If the image size grew after smushing, skip it
226
+ if( $response['data']->after_size > $response['data']->before_size ) {
227
+ continue;
 
 
 
228
  }
229
 
230
+ $stats['sizes'][ $size ] = (object) $WpSmush->_array_fill_placeholders( $WpSmush->_get_size_signature(), (array) $response['data'] );
231
+
232
+ //Total Stats, store all data in bytes
233
+ list( $size_before, $size_after, $total_time, $compression, $bytes_saved )
234
+ = $WpSmush->_update_stats_data( $response['data'], $size_before, $size_after, $total_time, $bytes_saved );
235
+
236
  if ( empty( $stats['stats']['api_version'] ) || $stats['stats']['api_version'] == - 1 ) {
237
  $stats['stats']['api_version'] = $response['data']->api_version;
238
  $stats['stats']['lossy'] = $response['data']->lossy;
239
+ $stats['stats']['keep_exif'] = !empty( $response['data']->keep_exif ) ? $response['data']->keep_exif : 0;
240
  }
241
  }
242
  }
252
  $existing_stats = ( ! empty( $image->meta_data ) && ! empty( $image->meta_data['wp_smush'] ) ) ? $image->meta_data['wp_smush'] : '';
253
 
254
  if ( ! empty( $existing_stats ) ) {
255
+ $e_size_before = !empty( $existing_stats['stats']['size_before'] ) ? $existing_stats['stats']['size_before'] : '';
256
+
257
+ //Store Original size before
258
+ $stats['stats']['size_before'] = ( !empty($e_size_before ) && $e_size_before > $stats['stats']['size_before'] ) ? $e_size_before : $stats['stats']['size_before'];
259
+
260
  //Update total bytes saved, and compression percent
261
  $stats['stats']['bytes'] = isset( $existing_stats['stats']['bytes'] ) ? $existing_stats['stats']['bytes'] + $stats['stats']['bytes'] : $stats['stats']['bytes'];
262
+
263
+ $stats['stats']['percent'] = $WpSmush->calculate_percentage( (object) $stats['stats'], (object) $existing_stats['stats'] );
264
 
265
  //Update stats for each size
266
  if ( ! empty( $existing_stats['sizes'] ) && ! empty( $stats['sizes'] ) ) {
267
 
268
  foreach ( $existing_stats['sizes'] as $size_name => $size_stats ) {
269
  //if stats for a particular size doesn't exists
270
+ if ( empty( $stats['sizes'] ) || empty( $stats['sizes'][ $size_name ] ) ) {
271
  $stats = empty( $stats ) ? array() : $stats;
272
  if ( empty( $stats['sizes'] ) ) {
273
  $stats['sizes'] = array();
274
  }
275
+ $stats['sizes'][ $size_name ] = $existing_stats['sizes'][ $size_name ];
276
  } else {
277
+ $existing_stats_size = (object)$existing_stats['sizes'][ $size_name ];
278
+
279
+ //store the original image size
280
+ $stats['sizes'][ $size_name ]->size_before = ( ! empty( $existing_stats_size->size_before ) && $existing_stats_size->size_before > $stats['sizes'][ $size_name ]->size_before ) ? $existing_stats_size->size_before : $stats['sizes'][ $size_name ]->size_before;
281
+
282
  //Update compression percent and bytes saved for each size
283
+ $stats['sizes'][ $size_name ]->bytes = $stats['sizes'][ $size_name ]->bytes + $existing_stats_size->bytes;
284
+ //Calculate percentage
285
+ $stats['sizes'][ $size_name ]->percent = $WpSmush->calculate_percentage( $stats['sizes'][ $size_name ], $existing_stats_size );
286
  }
287
  }
288
  }
289
  }
290
+ //If there was any compression and there was no error in smushing
291
+ if( isset( $stats['stats']['bytes'] ) && $stats['stats']['bytes'] >= 0 && !$has_errors ) {
292
+ /**
293
+ * Runs if the image smushing was successful
294
+ *
295
+ * @param int $ID Image Id
296
+ *
297
+ * @param array $stats Smush Stats for the image
298
+ *
299
+ */
300
+ do_action('wp_smush_image_optimised_nextgen', $image->pid, $stats );
301
+ }
302
  $image->meta_data['wp_smush'] = $stats;
303
  nggdb::update_image_meta( $image->pid, $image->meta_data );
304
 
316
  *
317
  * @param string $pid , NextGen Gallery Image id
318
  * @param string $image , Nextgen gallery image object
319
+ * @param bool|true $echo , Whether to echo the stats or not, false for auto smush
320
  */
321
  function smush_image( $pid = '', $image = '', $echo = true ) {
322
  global $wpsmushnextgenstats;
323
 
 
 
 
 
 
 
 
324
  //Get image, if we have image id
325
  if ( ! empty( $pid ) ) {
326
+ $image = $this->get_nextgen_image_from_id( $pid );
327
  } elseif ( ! empty( $image ) ) {
328
+ $pid = $this->get_nextgen_id_from_image( $image );
329
  }
330
 
331
  $metadata = ! empty( $image ) ? $image->meta_data : '';
332
 
333
  if ( empty( $metadata ) ) {
334
+ wp_send_json_error( array( 'error_msg' => esc_html__( "We couldn't find the metadata for the image, possibly the image has been deleted.", "wp-smushit" ) ) );
335
  }
336
 
337
  //smush the main image and its sizes
338
+ $smush = $this->resize_from_meta_data( $image );
339
 
340
+ if ( ! is_wp_error( $smush ) ) {
341
  $status = $wpsmushnextgenstats->show_stats( $pid, $smush, false, true );
342
  }
343
 
352
  } else {
353
  wp_send_json_success( $status );
354
  }
355
+ } else {
356
  if ( is_wp_error( $smush ) ) {
357
  return $smush;
358
+ } else {
359
+ return $status;
360
  }
361
  }
362
  }
366
  * Calls the function to update the compression stats
367
  */
368
  function manual_nextgen() {
369
+ $pid = ! empty( $_GET['attachment_id'] ) ? absint( (int) $_GET['attachment_id'] ) : '';
370
  $nonce = ! empty( $_GET['_nonce'] ) ? $_GET['_nonce'] : '';
371
 
372
  //Verify Nonce
398
 
399
  }
400
 
401
+ /**
402
+ * Checks for file backup, if available for any of the size,
403
+ * Function returns true
404
+ *
405
+ * @param $pid
406
+ * @param $attachment_data
407
+ *
408
+ * @return bool
409
+ */
410
+ function show_restore_option( $pid, $attachment_data ) {
411
+ global $WpSmush;
412
+
413
+ // Registry Object for NextGen Gallery
414
+ $registry = C_Component_Registry::get_instance();
415
+
416
+ //Gallery Storage Object
417
+ $storage = $registry->get_utility( 'I_Gallery_Storage' );
418
+
419
+ $image = $storage->object->_image_mapper->find( $pid );
420
+
421
+ //Get image full path
422
+ $attachment_file_path = $storage->get_image_abspath( $image, 'full' );
423
+
424
+ //Get the backup path
425
+ $backup_path = $WpSmush->get_image_backup_path( $attachment_file_path );
426
+
427
+ //If one of the backup(Ours/NextGen) exists, show restore option
428
+ if ( file_exists( $backup_path ) || file_exists( $attachment_file_path . '_backup' ) ) {
429
+ return true;
430
+ }
431
+
432
+ //Get Sizes, and check for backup
433
+ if ( empty( $attachment_data['sizes'] ) ) {
434
+ return false;
435
+ }
436
+ foreach ( $attachment_data['sizes'] as $size => $size_data ) {
437
+ if ( 'full' == $size ) {
438
+ continue;
439
+ }
440
+ //Get file path
441
+ $attachment_size_file_path = $storage->get_image_abspath( $image, $size );
442
+
443
+ //Get the backup path
444
+ $backup_path = $WpSmush->get_image_backup_path( $attachment_size_file_path );
445
+
446
+ //If one of the backup(Ours/NextGen) exists, show restore option
447
+ if ( file_exists( $backup_path ) || file_exists( $attachment_size_file_path . '_backup' ) ) {
448
+ return true;
449
+ }
450
+ }
451
+
452
+ }
453
+
454
+ /**
455
+ * Handles the ajax request to restore a image from backup and return button HTML
456
+ *
457
+ * @uses WpSmushNextGenAdmin::wp_smush_column_options()
458
+ */
459
+ function restore_image() {
460
+ global $WpSmush, $wpsmushnextgenadmin;
461
+
462
+ //Check Empty fields
463
+ if ( empty( $_POST['attachment_id'] ) || empty( $_POST['_nonce'] ) ) {
464
+ wp_send_json_error( array(
465
+ 'error' => 'empty_fields',
466
+ 'message' => esc_html__( "Error in processing restore action, Fields empty.", "wp-smushit" )
467
+ ) );
468
+ }
469
+ //Check Nonce
470
+ if ( ! wp_verify_nonce( $_POST['_nonce'], "wp-smush-restore-" . $_POST['attachment_id'] ) ) {
471
+ wp_send_json_error( array(
472
+ 'error' => 'empty_fields',
473
+ 'message' => esc_html__( "Image not restored, Nonce verification failed.", "wp-smushit" )
474
+ ) );
475
+ }
476
+
477
+ //Store the restore success/failure for all the sizes
478
+ $restored = array();
479
+
480
+ // Registry Object for NextGen Gallery
481
+ $registry = C_Component_Registry::get_instance();
482
+
483
+ //Gallery Storage Object
484
+ $storage = $registry->get_utility( 'I_Gallery_Storage' );
485
+
486
+ //Process Now
487
+ $image_id = absint( (int) $_POST['attachment_id'] );
488
+
489
+ //Get the absolute path for original image
490
+ $image = $this->get_nextgen_image_from_id( $image_id );
491
+
492
+ //Get image full path
493
+ $attachment_file_path = $storage->get_image_abspath( $image, 'full' );
494
+
495
+ //Get the backup path
496
+ $backup_path = $WpSmush->get_image_backup_path( $attachment_file_path );
497
+
498
+ //Restoring the full image
499
+ //If file exists, corresponding to our backup path
500
+ if ( file_exists( $backup_path ) ) {
501
+ //Restore
502
+ $restored[] = @copy( $backup_path, $attachment_file_path );
503
+
504
+ //Delete the backup
505
+ @unlink( $backup_path );
506
+ } elseif ( file_exists( $attachment_file_path . '_backup' ) ) {
507
+ //Restore from other backups
508
+ $restored[] = @copy( $attachment_file_path . '_backup', $attachment_file_path );
509
+ }
510
+ //Restoring the other sizes
511
+ $attachment_data = !empty( $image->meta_data['wp_smush'] ) ? $image->meta_data['wp_smush'] : '';
512
+ if( !empty( $attachment_data['sizes'] ) ) {
513
+ foreach ( $attachment_data['sizes'] as $size => $size_data ) {
514
+ if ( 'full' == $size ) {
515
+ continue;
516
+ }
517
+ //Get file path
518
+ $attachment_size_file_path = $storage->get_image_abspath( $image, $size );
519
+
520
+ //Get the backup path
521
+ $backup_path = $WpSmush->get_image_backup_path( $attachment_size_file_path );
522
+
523
+ //If file exists, corresponding to our backup path
524
+ if ( file_exists( $backup_path ) ) {
525
+ //Restore
526
+ $restored[] = @copy( $backup_path, $attachment_size_file_path );
527
+
528
+ //Delete the backup
529
+ @unlink( $backup_path );
530
+ } elseif ( file_exists( $attachment_size_file_path . '_backup' ) ) {
531
+ //Restore from other backups
532
+ $restored[] = @copy( $attachment_size_file_path . '_backup', $attachment_size_file_path );
533
+ }
534
+ }
535
+ }
536
+ //If any of the image is restored, we count it as success
537
+ if ( in_array( true, $restored ) ) {
538
+
539
+ //Remove the Meta, And send json success
540
+ $image->meta_data['wp_smush'] = '';
541
+ nggdb::update_image_meta( $image->pid, $image->meta_data );
542
+
543
+ //Get the Button html without wrapper
544
+ $button_html = $wpsmushnextgenadmin->wp_smush_column_options( '', $image_id, false );
545
+
546
+ wp_send_json_success( array('button' => $button_html ) );
547
+ }
548
+ wp_send_json_error( array( 'message' => '<div class="wp-smush-error">' . __( "Unable to restore image", "wp-smushit" ) . '</div>' ) );
549
+ }
550
+
551
+ /**
552
+ * Handles the Ajax request to resmush a image, if the full image wasn't smushed earlier
553
+ */
554
+ function resmush_image() {
555
+ //Check Empty fields
556
+ if ( empty( $_POST['attachment_id'] ) || empty( $_POST['_nonce'] ) ) {
557
+ wp_send_json_error( array(
558
+ 'error' => 'empty_fields',
559
+ 'message' => '<div class="wp-smush-error">' . esc_html__( "We couldn't process the image, fields empty.", "wp-smushit" ) . '</div>'
560
+ ) );
561
+ }
562
+ //Check Nonce
563
+ if ( ! wp_verify_nonce( $_POST['_nonce'], "wp-smush-resmush-" . $_POST['attachment_id'] ) ) {
564
+ wp_send_json_error( array(
565
+ 'error' => 'empty_fields',
566
+ 'message' => '<div class="wp-smush-error">' . esc_html__( "Image couldn't be smushed as the nonce verification failed, try reloading the page.", "wp-smushit" ) . '</div>'
567
+ ) );
568
+ }
569
+
570
+ $image_id = intval( $_POST['attachment_id'] );
571
+
572
+ $smushed = $this->smush_image( $image_id, '', false );
573
+
574
+ //If any of the image is restored, we count it as success
575
+ if ( ! empty( $smushed ) && !is_wp_error( $smushed ) ) {
576
+
577
+ //Send button content
578
+ wp_send_json_success( array( 'button' => $smushed['status'] . $smushed['stats'] ) );
579
+
580
+ } elseif ( is_wp_error( $smushed ) ) {
581
+
582
+ //Send Error Message
583
+ wp_send_json_error( array( 'message' => sprintf( '<div class="wp-smush-error">' . __( "Unable to smush image, %s", "wp-smushit" ) . '</div>', $smushed->get_error_message() ) ) );
584
+
585
+ }
586
+ }
587
+
588
  }//End of Class
589
  }//End Of if class not exists
590
 
591
  //Extend NextGen Mixin class to smush dynamic images
592
  if ( class_exists( 'WpSmushNextGen' ) ) {
593
+ global $WpSmush;
594
  $wpsmushnextgen = new WpSmushNextGen();
595
 
596
  //Extend Nextgen Mixin class and override the generate_image_size, to optimize dynamic thumbnails, generated by nextgen, check for auto smush
597
+ if ( ! class_exists( 'WpSmushNextGenDynamicThumbs' ) && class_exists( 'Mixin' ) && $WpSmush->is_auto_smush_enabled() ) {
598
 
599
  class WpSmushNextGenDynamicThumbs extends Mixin {
600
 
610
  */
611
  function generate_image_size( $image, $size, $params = null, $skip_defaults = false ) {
612
  global $WpSmush;
613
+ $image_id = ! empty( $image->pid ) ? $image->pid : '';
614
  //Get image from storage object if we don't have it already
615
+ if ( empty( $image_id ) ) {
616
  //Get metadata For the image
617
  // Registry Object for NextGen Gallery
618
  $registry = C_Component_Registry::get_instance();
631
  $response = $WpSmush->do_smushit( $filename, $image_id, 'nextgen' );
632
 
633
  //If the image was smushed
634
+ if ( ! is_wp_error( $response ) && ! empty( $response['data'] ) && $response['data']->bytes_saved > 0 ) {
635
  //Check for existing stats
636
  if ( ! empty( $image->meta_data ) && ! empty( $image->meta_data['wp_smush'] ) ) {
637
  $stats = $image->meta_data['wp_smush'];
640
  $stats = array(
641
  "stats" => array_merge( $WpSmush->_get_size_signature(), array(
642
  'api_version' => - 1,
643
+ 'lossy' => - 1,
644
+ 'keep_exif' => false
645
  )
646
  ),
647
  'sizes' => array()
667
 
668
  return $success;
669
  }
 
 
 
 
 
 
 
 
 
 
 
670
  }
671
  }
672
  }
lib/class-wp-smush-ui.php ADDED
@@ -0,0 +1,679 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @package WP Smush
4
+ * @subpackage Admin
5
+ * @version 1.0
6
+ *
7
+ * @author Umesh Kumar <umesh@incsub.com>
8
+ *
9
+ * @copyright (c) 2016, Incsub (http://incsub.com)
10
+ */
11
+ if ( ! class_exists( 'WpSmushBulkUi' ) ) {
12
+ /**
13
+ * Show settings in Media settings and add column to media library
14
+ *
15
+ */
16
+
17
+ /**
18
+ * Class WpSmushBulkUi
19
+ */
20
+ class WpSmushBulkUi {
21
+
22
+ function __construct() {
23
+ //Add a container for Smush Pro promo
24
+ add_action( 'wp_smush_after_stats_box', array( $this, 'wp_smush_promo' ) );
25
+ //Add a Container for Hummingbird Promo
26
+ add_action( 'wp_smush_after_stats_box', array( $this, 'wp_smush_hummingbird_promo' ) );
27
+ }
28
+
29
+ /**
30
+ * Prints the Header Section for a container as per the Shared UI
31
+ *
32
+ * @param string $classes Any additional classes that needs to be added to section
33
+ * @param string $heading Box Heading
34
+ * @param string $sub_heading Any additional text to be shown by the side of Heading
35
+ * @param bool $dismissible If the Box is dimissible
36
+ *
37
+ * @return string
38
+ */
39
+ function container_header( $classes = '', $id = '', $heading = '', $sub_heading = '', $dismissible = false ) {
40
+ if ( empty( $heading ) ) {
41
+ return '';
42
+ }
43
+ echo '<section class="dev-box ' . $classes . ' wp-smush-container" id="' . $id . '">'; ?>
44
+ <div class="wp-smush-container-header box-title">
45
+ <h3><?php echo $heading ?></h3><?php
46
+ //Sub Heading
47
+ if ( ! empty( $sub_heading ) ) { ?>
48
+ <div class="smush-container-subheading roboto-medium"><?php echo $sub_heading ?></div><?php
49
+ }
50
+ //Dismissible
51
+ if ( $dismissible ) { ?>
52
+ <div class="float-r smush-dismiss-welcome">
53
+ <a href="#" title="<?php esc_html_e( "Dismiss Welcome notice", "wp-smushit" ); ?>">
54
+ <i class="wdv-icon wdv-icon-fw wdv-icon-remove"></i>
55
+ </a>
56
+ </div><?php
57
+ } ?>
58
+ </div><?php
59
+ }
60
+
61
+ /**
62
+ * Prints the content of WelCome Screen for New Installation
63
+ * Dismissible by default
64
+ */
65
+ function welcome_screen() {
66
+ global $WpSmush;
67
+
68
+ //Header Of the Box
69
+ $this->container_header( 'wp-smush-welcome', 'wp-smush-welcome-box', esc_html__( "WELCOME", "wp-smushit" ), '', true );
70
+ //Settings Page heading
71
+ $plugin_name = $WpSmush->is_pro() ? "WP Smush Pro" : "WP Smush";
72
+ ?>
73
+ <!-- Content -->
74
+ <div class="box-content">
75
+ <div class="row">
76
+ <div class="wp-smush-welcome-content">
77
+ <h4 class="roboto-condensed-regular"><?php esc_html_e( "OH YEAH, IT'S COMPRESSION TIME!", "wp-smushit" ); ?></h4>
78
+ <p class="wp-smush-welcome-message roboto-medium"><?php printf( esc_html__( 'You\'ve just installed %3$s, the most popular image compression plugin for WordPress! %1$sChoose your desired settings%2$s and get smushing!', "wp-smushit" ), '<strong>', '</strong>', $plugin_name ); ?></p>
79
+ </div>
80
+ </div>
81
+ </div><?php
82
+ echo "</section>";
83
+ }
84
+
85
+ /**
86
+ * Bulk Smush UI and Progress bar
87
+ */
88
+ function bulk_smush_container() {
89
+ global $WpSmush;
90
+
91
+ //Subheading content
92
+ $smush_individual_msg = sprintf( esc_html__( "Smush individual images via your %sMedia Library%s", "wp-smushit" ), '<a href="' . esc_url( admin_url( 'upload.php' ) ) . '" title="' . esc_html__( 'Media Library', 'wp-smushit' ) . '">', '</a>' );
93
+
94
+ $class = $WpSmush->is_pro() ? 'bulk-smush-wrapper wp-smush-pro-install' : 'bulk-smush-wrapper';
95
+
96
+ //Contianer Header
97
+ $this->container_header( $class, 'wp-smush-bulk-wrap-box', esc_html__( "BULK SMUSH", "wp-smushit" ), $smush_individual_msg ); ?>
98
+
99
+ <div class="box-container"><?php
100
+ $this->bulk_smush_content(); ?>
101
+ </div><?php
102
+ echo "</section>";
103
+ }
104
+
105
+ /**
106
+ * All the settings for Basic and Advanced Users
107
+ */
108
+ function settings_ui() {
109
+ global $WpSmush;
110
+ $class = $WpSmush->is_pro() ? 'smush-settings-wrapper wp-smush-pro' : 'smush-settings-wrapper';
111
+ $this->container_header( $class, 'wp-smush-settings-box', esc_html__( "SETTINGS", "wp-smushit" ), '' );
112
+ // display the options
113
+ $this->options_ui();
114
+ }
115
+
116
+ /**
117
+ * Outputs the Smush stats for the site
118
+ */
119
+ function smush_stats_container() {
120
+ global $WpSmush, $wpsmushit_admin;
121
+
122
+ //If we have resmush list, smushed_count = totalcount - resmush count, else smushed_count
123
+ $smushed_count = ( $resmush_count = count( $wpsmushit_admin->resmush_ids ) ) > 0 ? $wpsmushit_admin->total_count - ( $resmush_count + $wpsmushit_admin->remaining_count ) : $wpsmushit_admin->smushed_count;
124
+ $smushed_count = $smushed_count > 0 ? $smushed_count : 0;
125
+
126
+ $button = '<span class="spinner"></span><button tooltip="' . esc_html__( "Lets you check if any images can be further optimised. Useful after changing settings.", "wp-smushit" ) . '" class="wp-smush-title button button-grey button-small wp-smush-scan">' . esc_html__( "RE-CHECK IMAGES", "wp-smushit" ) . '</button>';
127
+ $this->container_header( 'smush-stats-wrapper', 'wp-smush-stats-box', esc_html__( "STATS", "wp-smushit" ), $button ); ?>
128
+ <div class="box-content">
129
+ <div class="row smush-total-reduction-percent">
130
+ <span
131
+ class="float-l wp-smush-stats-label"><strong><?php esc_html_e( "TOTAL % REDUCTIONS", "wp-smushit" ); ?></strong></span>
132
+ <span class="float-r wp-smush-stats-wrap"><strong><span
133
+ class="wp-smush-stats"><?php echo $wpsmushit_admin->stats['percent'] > 0 ? number_format_i18n( $wpsmushit_admin->stats['percent'], 2, '.', '' ) : 0; ?></span>
134
+ %</strong></span>
135
+ </div>
136
+ <hr>
137
+ <div class="row smush-total-reduction-bytes">
138
+ <span
139
+ class="float-l wp-smush-stats-label"><strong><?php esc_html_e( "TOTAL SIZE REDUCTIONS", "wp-smushit" ); ?></strong></span>
140
+ <span
141
+ class="float-r wp-smush-stats"><strong><?php echo $wpsmushit_admin->stats['human'] > 0 ? $wpsmushit_admin->stats['human'] : "0MB"; ?></strong></span>
142
+ </div>
143
+ <hr>
144
+ <div class="row smush-attachments">
145
+ <span
146
+ class="float-l wp-smush-stats-label"><strong><?php esc_html_e( "ATTACHMENTS SMUSHED", "wp-smushit" ); ?></strong></span>
147
+ <span class="float-r wp-smush-stats"><strong><span
148
+ class="smushed-count"><?php echo intval( $smushed_count ) . '</span>/' . $wpsmushit_admin->total_count; ?>
149
+ </strong></span>
150
+ </div><?php
151
+ /**
152
+ * Allows to hide the Super Smush stats as it might be heavy for some users
153
+ */
154
+ if ( $WpSmush->is_pro() && apply_filters( 'wp_smush_show_lossy_stats', true ) ) {
155
+ $wpsmushit_admin->super_smushed = $wpsmushit_admin->super_smushed_count(); ?>
156
+ <hr>
157
+ <div class="row super-smush-attachments">
158
+ <span
159
+ class="float-l wp-smush-stats-label"><strong><?php esc_html_e( "ATTACHMENTS SUPER-SMUSHED", "wp-smushit" ); ?></strong></span>
160
+ <span class="float-r wp-smush-stats"><?php
161
+ if ( $WpSmush->lossy_enabled ) {
162
+ echo '<strong><span class="smushed-count">' . intval( $wpsmushit_admin->super_smushed ) . '</span>/' . $wpsmushit_admin->total_count . '</strong>';
163
+ } else {
164
+ printf( esc_html__( "%sENABLE%s", "wp-smushit" ), '<span class="wp-smush-lossy-enable">', '</span>' );
165
+ } ?>
166
+ </span>
167
+ </div><?php
168
+ }
169
+ /**
170
+ * Allows you to output any content within the stats box at the end
171
+ */
172
+ do_action( 'wp_smush_after_stats' );
173
+ ?>
174
+ </div><?php
175
+ echo "</section>";
176
+ }
177
+
178
+ /**
179
+ * Outputs the advanced settings for Pro users, Disabled for basic users by default
180
+ */
181
+ function advanced_settings( $configure_screen = false ) {
182
+ global $WpSmush, $wpsmushit_admin;
183
+
184
+ //Content for the End of box container
185
+ $div_end =
186
+ wp_nonce_field( 'save_wp_smush_options', 'wp_smush_options_nonce', '', false ) .
187
+ '<div class="wp-smush-submit-wrap">
188
+ <input type="submit" id="wp-smush-save-settings" class="button button-grey"
189
+ value="' . esc_html__( 'UPDATE SETTINGS', 'wp-smushit' ) . '">
190
+ <span class="spinner"></span>
191
+ </div>
192
+ </form>';
193
+ //For Configuration screen we need to show the advanced settings in single box
194
+ if ( ! $configure_screen ) {
195
+ $div_end .= '</div><!-- Box Content -->
196
+ </section><!-- Main Section -->';
197
+ }
198
+
199
+ //For Basic User, Show advanced settings in a separate box
200
+ if ( ! $WpSmush->is_pro() ) {
201
+ echo $div_end;
202
+
203
+ $pro_only = sprintf( esc_html__( '%sPRO ONLY%s', 'wp-smushit' ), '<a href="' . esc_url( $wpsmushit_admin->upgrade_url ) . '" target="_blank">', '</a>' );
204
+
205
+ $this->container_header( 'wp-smush-premium', 'wp-smush-pro-settings-box', esc_html__( "ADVANCED SETTINGS", "wp-smushit" ), $pro_only, false ); ?>
206
+ <div class="box-content"><?php
207
+ }
208
+
209
+ //Available advanced settings
210
+ $pro_settings = array(
211
+ 'original',
212
+ 'lossy',
213
+ 'backup',
214
+ 'nextgen'
215
+ );
216
+
217
+ if ( $WpSmush->is_pro() ) {
218
+ echo "<hr />";
219
+ }
220
+
221
+ //Iterate Over all the available settings, and print a row for each of them
222
+ foreach ( $pro_settings as $setting_key ) {
223
+ if ( isset( $wpsmushit_admin->settings[ $setting_key ] ) ) {
224
+ $setting_m_key = WP_SMUSH_PREFIX . $setting_key;
225
+ $setting_val = $WpSmush->is_pro() ? get_option( $setting_m_key, false ) : 0; ?>
226
+ <div class='wp-smush-setting-row wp-smush-advanced'>
227
+ <label class="inline-label" for="<?php echo $setting_m_key; ?>">
228
+ <span
229
+ class="wp-smush-setting-label"><?php echo $wpsmushit_admin->settings[ $setting_key ]['label']; ?></span>
230
+ <br/>
231
+ <small class="smush-setting-description">
232
+ <?php echo $wpsmushit_admin->settings[ $setting_key ]['desc']; ?>
233
+ </small>
234
+ </label>
235
+ <span class="toggle float-r">
236
+ <input type="checkbox" class="toggle-checkbox"
237
+ id="<?php echo $setting_m_key; ?>" <?php checked( $setting_val, 1, true ); ?>
238
+ value="1"
239
+ name="<?php echo $setting_m_key; ?>">
240
+ <label class="toggle-label" for="<?php echo $setting_m_key; ?>"></label>
241
+ </span>
242
+ </div>
243
+ <hr><?php
244
+ }
245
+ }
246
+ //Output Form end and Submit button for pro version
247
+ if ( $WpSmush->is_pro() ) {
248
+ echo $div_end;
249
+ } else {
250
+ echo "</div><!-- Box Content -->
251
+ </section><!-- Main Section -->";
252
+ }
253
+ }
254
+
255
+ /**
256
+ * Process and display the options form
257
+ */
258
+ function options_ui( $configure_screen = false ) {
259
+ global $wpsmushit_admin;
260
+ echo '<div class="box-container">
261
+ <form id="wp-smush-settings-form" method="post">';
262
+ //Smush auto key
263
+ $opt_auto = WP_SMUSH_PREFIX . 'auto';
264
+ //Auto value
265
+ $opt_auto_val = get_option( $opt_auto, false );
266
+
267
+ //If value is not set for auto smushing set it to 1
268
+ if ( $opt_auto_val === false ) {
269
+ //default to checked
270
+ $opt_auto_val = 1;
271
+ }
272
+
273
+ //Keep Exif
274
+ $opt_keep_exif = WP_SMUSH_PREFIX . 'keep_exif';
275
+ //Keep Exif
276
+ $opt_keep_exif_val = get_option( $opt_keep_exif, false ); ?>
277
+ <div class='wp-smush-setting-row wp-smush-basic'>
278
+ <label class="inline-label" for="<?php echo $opt_auto; ?>">
279
+ <span
280
+ class="wp-smush-setting-label"><?php echo $wpsmushit_admin->settings['auto']['label']; ?></span><br/>
281
+ <small
282
+ class="smush-setting-description"><?php echo $wpsmushit_admin->settings['auto']['desc']; ?></small>
283
+ </label>
284
+ <span class="toggle float-r">
285
+ <input type="checkbox" class="toggle-checkbox"
286
+ id="<?php echo $opt_auto; ?>"
287
+ name="<?php echo $opt_auto; ?>" <?php checked( $opt_auto_val, 1, true ); ?> value="1">
288
+ <label class="toggle-label" for="<?php echo $opt_auto; ?>"></label>
289
+ </span>
290
+ </div>
291
+ <hr/>
292
+ <div class='wp-smush-setting-row wp-smush-basic'>
293
+ <label class="inline-label" for="<?php echo $opt_keep_exif; ?>"><span
294
+ class="wp-smush-setting-label"><?php echo $wpsmushit_admin->settings['keep_exif']['label']; ?></span>
295
+ <br/>
296
+ <small class="smush-setting-description">
297
+ <?php echo $wpsmushit_admin->settings['keep_exif']['desc']; ?>
298
+ </small>
299
+ </label>
300
+ <span class="toggle float-r">
301
+ <input type="checkbox" class="toggle-checkbox"
302
+ id="<?php echo $opt_keep_exif; ?>" <?php checked( $opt_keep_exif_val, 1, true ); ?>
303
+ value="1" name="<?php echo $opt_keep_exif; ?>">
304
+ <label class="toggle-label" for="<?php echo $opt_keep_exif; ?>"></label>
305
+ </span>
306
+ </div> <!-- End of Basic Settings --><?php
307
+
308
+ do_action( 'wp_smush_after_basic_settings' );
309
+ $this->advanced_settings( $configure_screen );
310
+ }
311
+
312
+ /**
313
+ * Display the Whole page ui, Call all the other functions under this
314
+ */
315
+ function ui() {
316
+ global $WpSmush, $wpsmushit_admin;
317
+ $this->smush_page_header();
318
+
319
+ //Show Configure screen for only a new installation and for only network admins
320
+ if ( 1 != get_option( 'wp-smush-hide_smush_welcome' ) && 1 != get_option( 'hide_smush_features' ) && 0 >= $wpsmushit_admin->smushed_count && is_super_admin() ) {
321
+ echo '<div class="block float-l smush-welcome-wrapper">';
322
+ $this->welcome_screen();
323
+ echo '</div>';
324
+ } ?>
325
+
326
+ <!-- Bulk Smush Progress Bar -->
327
+ <div class="wp-smushit-container-left col-two-third float-l"><?php
328
+ //Bulk Smush Container
329
+ $this->bulk_smush_container();
330
+
331
+ if ( ! $WpSmush->is_pro() ) {
332
+ //Settings
333
+ $this->settings_ui();
334
+ }
335
+ ?>
336
+ </div>
337
+
338
+ <!-- Stats -->
339
+ <div class="wp-smushit-container-right col-third float-l"><?php
340
+ //Stats
341
+ $this->smush_stats_container();
342
+ if ( ! $WpSmush->is_pro() ) {
343
+ /**
344
+ * Allows to Hook in Additional Containers after Stats Box for free version
345
+ * Pro Version has a full width settings box, so we don't want to do it there
346
+ */
347
+ do_action( 'wp_smush_after_stats_box' );
348
+ } ?>
349
+ </div><!-- End Of Smushit Container right --><?php
350
+ if ( $WpSmush->is_pro() ) { ?>
351
+ <div class="row"><?php
352
+ //Settings
353
+ $this->settings_ui(); ?>
354
+ </div><?php
355
+ }
356
+ $this->smush_page_footer();
357
+ }
358
+
359
+ /**
360
+ * Pro Version
361
+ */
362
+ function wp_smush_promo() {
363
+ global $wpsmushit_admin;
364
+ $this->container_header( 'wp-smush-pro-adv', 'wp-smush-pro-promo', "FANCY A FREE SUPER SMUSH?" ); ?>
365
+ <div class="box-content">
366
+ <p class="wp-smush-promo-content roboto-medium">You can now get Smush Pro... for FREE!</p>
367
+ <p class="wp-smush-promo-content wp-smush-promo-content-2 roboto-medium">No obligation, no contracts, no
368
+ catches. You'll get Smush Pro plus 100+ WPMU DEV plugins, Defender, Hummingbird & 24/7 WP support
369
+ for absolutely nothing for 14 days.</p>
370
+ <span class="wp-smush-pro-cta tc">
371
+ <a href="<?php echo esc_url( $wpsmushit_admin->upgrade_url ); ?>"
372
+ class="button button-cta button-green" target="_blank">FIND OUT MORE</a>
373
+ </span>
374
+ </div>
375
+ <img src="<?php echo WP_SMUSH_URL . 'assets/images/dev-team.png'; ?>"
376
+ alt="<?php esc_html_e( "TRY WP SMUSH PRO - DEV TEAM", "wp-smushit" ); ?>"><?php
377
+ echo "</section>";
378
+ }
379
+
380
+ /**
381
+ * HummingBird Promo
382
+ */
383
+ function wp_smush_hummingbird_promo() {
384
+ //Plugin Already Installed
385
+ if ( class_exists( 'WP_Hummingbird' ) ) {
386
+ return;
387
+ }
388
+ $this->container_header( 'wp-smush-hb-adv', 'wp-smush-hb-promo', "OH YEAH, SMUSHING ON STERIODS!" ); ?>
389
+ <div class="box-content">
390
+ <span class="wp-smush-hummingbird-image tc">
391
+ <img src="<?php echo WP_SMUSH_URL . 'assets/images/hummingbird.png'; ?>"
392
+ alt="<?php esc_html_e( "BOOST YOUR PERFORMANCE - HUMMINGBIRD", "wp-smushit" ); ?>">
393
+ </span>
394
+ <p class="wp-smush-promo-content tc roboto-medium">Hummingbird goes beyond Smush compression with
395
+ minification, caching, performance monitoring and more - every millisecond counts!</p>
396
+ <span class="wp-smush-hb-cta tc roboto-medium">
397
+ <a href="<?php echo esc_url( "https://premium.wpmudev.org/project/wp-hummingbird/" ); ?>"
398
+ class="button button-cta button-yellow" target="_blank">TRY HUMMINGBIRD FOR FREE</a>
399
+ </span>
400
+ </div><?php
401
+ echo "</section>";
402
+ }
403
+
404
+ /**
405
+ * Outputs the Content for Bulk Smush Div
406
+ */
407
+ function bulk_smush_content() {
408
+
409
+ global $WpSmush, $wpsmushit_admin;
410
+
411
+ $all_done = ( $wpsmushit_admin->smushed_count == $wpsmushit_admin->total_count ) && 0 == count( $wpsmushit_admin->resmush_ids );
412
+
413
+ echo $this->bulk_resmush_content();
414
+
415
+ //If there are no images in Media Library
416
+ if ( 0 >= $wpsmushit_admin->total_count ) { ?>
417
+ <span class="wp-smush-no-image tc">
418
+ <img src="<?php echo WP_SMUSH_URL . 'assets/images/smush-upload-images.png'; ?>"
419
+ alt="<?php esc_html_e( "No attachments found - Upload some images", "wp-smushit" ); ?>">
420
+ </span>
421
+ <p class="wp-smush-no-images-content tc roboto-regular"><?php printf( esc_html__( "We haven’t found any images in your %smedia library%s yet so there’s no smushing to be done! Once you upload images, reload this page and start playing!", "wp-smushit" ), '<a href="' . esc_url( admin_url( 'upload.php' ) ) . '">', '</a>' ); ?></p>
422
+ <span class="wp-smush-upload-images tc">
423
+ <a class="button button-cta"
424
+ href="<?php echo esc_url( admin_url( 'media-new.php' ) ); ?>"><?php esc_html_e( "UPLOAD IMAGES", "wp-smushit" ); ?></a>
425
+ </span><?php
426
+ } else { ?>
427
+ <!-- Hide All done div if there are images pending -->
428
+ <div class="wp-smush-notice wp-smush-all-done<?php echo $all_done ? '' : ' hidden' ?>">
429
+ <i class="dev-icon dev-icon-tick"></i><?php esc_html_e( "No attachments need smushing. Awesome!", "wp-smushit" ); ?>
430
+ </div>
431
+ <div class="wp-smush-bulk-wrapper <?php echo $all_done ? ' hidden' : ''; ?>"><?php
432
+ //If all the images in media library are smushed
433
+ //Button Text
434
+ $button_content = esc_html__( "BULK SMUSH NOW", "wp-smushit" );
435
+
436
+ //Show the notice only if there are remaining images and if we aren't showing a notice for resmush
437
+ if ( $wpsmushit_admin->remaining_count > 0 ) {
438
+ $class = count( $wpsmushit_admin->resmush_ids ) > 0 ? ' hidden' : '';
439
+ ?>
440
+ <div class="wp-smush-notice wp-smush-remaining<?php echo $class; ?>">
441
+ <i class="dev-icon">
442
+ <img src="<?php echo WP_SMUSH_URL . 'assets/images/icon-gzip.svg'; ?>" width="14px">
443
+ </i>
444
+ <span class="wp-smush-notice-text">
445
+ <?php printf( _n( "%s, you have %s%s%d%s image%s that need smushing!", "%s, you have %s%s%d%s images%s that need smushing!", $wpsmushit_admin->remaining_count, "wp-smushit" ), $wpsmushit_admin->get_user_name(), '<strong>', '<span class="wp-smush-remaining-count">', $wpsmushit_admin->remaining_count, '</span>', '</strong>' ); ?>
446
+ </span>
447
+ </div><?php
448
+ } ?>
449
+ <hr>
450
+ <div class="smush-final-log notice notice-warning inline hidden"></div>
451
+ <button type="button" class="wp-smush-all wp-smush-button"><?php echo $button_content; ?></button><?php
452
+ //Enable Super Smush
453
+ if ( $WpSmush->is_pro() && ! $WpSmush->lossy_enabled ) { ?>
454
+ <p class="wp-smush-enable-lossy"><?php esc_html_e( "Enable Super-smush in the Settings area to get even more savings with almost no noticeable quality loss.", "wp-smushit" ); ?></p><?php
455
+ } ?>
456
+ </div><?php
457
+ $this->progress_bar( $wpsmushit_admin );
458
+ $this->super_smush_promo();
459
+ }
460
+ }
461
+
462
+ /**
463
+ * Content for showing Progress Bar
464
+ */
465
+ function progress_bar( $count ) {
466
+
467
+ // calculate %ages, avoid divide by zero error with no attachments
468
+ if ( $count->total_count > 0 && $count->smushed_count > 0 ) {
469
+ $smushed_pc = $count->smushed_count / $count->total_count * 100;
470
+ } else {
471
+ $smushed_pc = 0;
472
+ }
473
+ //If we have resmush list, smushed_count = totalcount - resmush count, else smushed_count
474
+ $smushed_count = ( $resmush_count = count( $count->resmush_ids ) ) > 0 ? ( $count->total_count - $resmush_count ) : $count->smushed_count; ?>
475
+ <div class="wp-smush-bulk-progress-bar-wrapper hidden">
476
+ <p class="wp-smush-bulk-active roboto-medium"><span
477
+ class="spinner is-active"></span><?php printf( esc_html__( "%sBulk smush is currently running.%s You need to keep this page open.", "wp-smushit" ), '<strong>', '</strong>' ); ?>
478
+ </p>
479
+ <div class="wp-smush-progress-wrap">
480
+ <div class="wp-smush-progress-bar-wrap">
481
+ <div class="wp-smush-progress-bar">
482
+ <div class="wp-smush-progress-inner" style="width: <?php echo $smushed_pc; ?>%;">
483
+ </div>
484
+ </div>
485
+ </div>
486
+ <div class="wp-smush-count tc">
487
+ <?php printf( esc_html__( "%s%d%s of %d attachments have been smushed." ), '<span class="wp-smush-images-smushed">', $smushed_count, '</span>', $count->total_count ); ?>
488
+ </div>
489
+ </div>
490
+ <div class="smush-final-log notice notice-warning inline hidden"></div>
491
+ <hr class="wp-smush-sep">
492
+ <button type="button"
493
+ class="button button-grey wp-smush-cancel-bulk"><?php esc_html_e( "CANCEL", "wp-smushit" ); ?></button>
494
+ </div><?php
495
+ }
496
+
497
+ /**
498
+ * Progress Bar for Resmush UI
499
+ */
500
+ function resmush_progress_bar( $resmush_count = '', $return = false ) {
501
+ global $wpsmushit_admin;
502
+ if ( empty( $resmush_count ) ) {
503
+ //Get Resmush List
504
+ $resmush_list = get_option( 'wp-smush-resmush-list' );
505
+ $resmush_count = ! empty( $resmush_list ) ? count( $resmush_list ) : 0;
506
+ }
507
+
508
+ $content = '<div class="wp-smush-bulk-progress-bar-wrapper hidden">
509
+ <p class="wp-smush-bulk-active roboto-medium">' . sprintf( esc_html__( "%sBulk re-smush is currently running.%s You need to keep this page open.", "wp-smushit" ), '<strong>', '</strong>' ) . '</p>
510
+ <div class="wp-smush-progress-wrap">
511
+ <div class="wp-smush-progress-bar-wrap">
512
+ <div class="wp-smush-progress-bar">
513
+ <div class="wp-smush-progress-inner" style="width: 100%;">
514
+ <div class="wp-smush-progress-count">' . sprintf( _n( "%s%d%s image left to Re-Smush", "%s%d%s images left to Re-Smush", $resmush_count, "wp-smushit" ), '<span class="wp-smush-images-remaining">', $wpsmushit_admin->format_number( $resmush_count ), '</span>' ) . '
515
+ </div>
516
+ </div>
517
+ </div>
518
+ </div>
519
+ </div>
520
+ <div class="smush-final-log notice notice-warning inline hidden"></div>
521
+ <hr class="wp-smush-sep">
522
+ <button type="button"
523
+ class="button button-grey wp-smush-cancel-bulk">' . esc_html__( "CANCEL", "wp-smushit" ) . '</button>
524
+ </div>';
525
+ if ( $return ) {
526
+ return $content;
527
+ }
528
+ echo $content;
529
+ }
530
+
531
+ /**
532
+ * Shows a option to ignore the Image ids which can be resmushed while bulk smushing
533
+ *
534
+ * @param int $count Resmush + Unsmushed Image count
535
+ */
536
+ function bulk_resmush_content( $count = false, $show = false ) {
537
+
538
+ global $wpsmushit_admin;
539
+
540
+ //If we already have count, don't fetch it
541
+ if ( false === $count ) {
542
+ //If we have the resmush ids list, Show Resmush notice and button
543
+ if ( $resmush_ids = get_option( "wp-smush-resmush-list" ) ) {
544
+
545
+ $count = count( $resmush_ids );
546
+
547
+ //Whether to show the remaining re-smush notice
548
+ $show = $count > 0 ? true : false;
549
+
550
+ //Get the Actual remainaing count
551
+ if ( ! isset( $wpsmushit_admin->remaining_count ) ) {
552
+ $wpsmushit_admin->setup_global_stats();
553
+ }
554
+
555
+ $count += $wpsmushit_admin->remaining_count;
556
+ }
557
+ }
558
+ //Show only if we have any images to ber resmushed
559
+ if ( $show ) {
560
+ return '<div class="wp-smush-notice wp-smush-resmush-notice wp-smush-remaining">
561
+ <i class="dev-icon"><img src="' . WP_SMUSH_URL . 'assets/images/icon-gzip.svg" width="14px"></i>
562
+ <span class="wp-smush-notice-text">' . sprintf( _n( "%s, you have %s%s%d%s image%s that need re-compressing!", "%s, you have %s%s%d%s images%s that need re-compressing!", $count, "wp-smushit" ), $wpsmushit_admin->get_user_name(), '<strong>', '<span class="wp-smush-remaining-count">', $count, '</span>', '</strong>' ) . '</span>
563
+ <button class="button button-grey button-small wp-smush-skip-resmush">' . esc_html__( "Skip", "wp-smushit" ) . '</button>
564
+ </div>';
565
+ }
566
+ }
567
+
568
+ /**
569
+ * Displays a admin notice for settings update
570
+ */
571
+ function settings_updated() {
572
+ global $wpsmushit_admin;
573
+ //Show Setttings Saved message
574
+ if ( 1 == get_option( 'wp-smush-settings_updated', false ) ) {
575
+
576
+ //Default message
577
+ $message = esc_html__( "Your settings have been updated!", "wp-smushit" );
578
+
579
+ //Additonal message if we got work to do!
580
+ $resmush_count = is_array( $wpsmushit_admin->resmush_ids ) && count( $wpsmushit_admin->resmush_ids ) > 0;
581
+ $smush_count = is_array( $wpsmushit_admin->remaining_count ) && $wpsmushit_admin->remaining_count > 0;
582
+
583
+ if ( $smush_count || $resmush_count ) {
584
+ $message .= ' ' . sprintf( esc_html__( "You have images that need smushing. %sBulk smush now!%s", "wp-smushit" ), '<a href="#" class="wp-smush-trigger-bulk">', '</a>' );
585
+ }
586
+ echo '<div class="wp-smush-notice wp-smush-settings-updated"><i class="dev-icon dev-icon-tick"></i> ' . $message . '
587
+ <i class="dev-icon dev-icon-cross"></i>
588
+ </div>';
589
+
590
+ //Remove the option
591
+ delete_option( 'wp-smush-settings_updated' );
592
+ }
593
+ }
594
+
595
+ /**
596
+ * Prints out the page header for Bulk Smush Page
597
+ */
598
+ function smush_page_header() {
599
+ global $WpSmush, $wpsmushit_admin;
600
+ //Include Shared UI
601
+ require_once WP_SMUSH_DIR . 'assets/shared-ui/plugin-ui.php';
602
+
603
+ //Initialize global Stats
604
+ $wpsmushit_admin->setup_global_stats();
605
+
606
+ //Page Heading for Free and Pro Version
607
+ $page_heading = $WpSmush->is_pro() ? esc_html__( 'WP Smush Pro', 'wp-smushit' ) : esc_html__( 'WP Smush', 'wp-smushit' );
608
+
609
+ $auto_smush_message = $WpSmush->is_auto_smush_enabled() ? sprintf( esc_html__( "Automatic smushing is %senabled%s. Newly uploaded images will be automagically compressed." ), '<span class="wp-smush-auto-enabled">', '</span>' ) : sprintf( esc_html__( "Automatic smushing is %sdisabled%s. Newly uploaded images will need to be manually smushed." ), '<span class="wp-smush-auto-disabled">', '</span>' );
610
+ echo '<div class="wrap">
611
+ <div class="wp-smush-page-header">
612
+ <h1 class="wp-smush-page-heading">' . $page_heading . '</h1>
613
+ <div class="wp-smush-auto-message roboto-regular">' . $auto_smush_message . '</div>
614
+ </div>';
615
+ //Check if settings were updated and shoe a notice
616
+ $this->settings_updated();
617
+
618
+ echo '<div class="row wp-smushit-container-wrap">';
619
+ }
620
+
621
+ /**
622
+ * Content of the Install/ Upgrade notice based on Free or Pro version
623
+ */
624
+ function installation_notice() {
625
+ global $wpsmushit_admin;
626
+
627
+ //Whether New/Existing Installation
628
+ $install_type = get_option('wp-smush-install-type', false );
629
+
630
+ if( !$install_type ) {
631
+ $install_type = $wpsmushit_admin->smushed_count > 0 ? 'existing' : 'new';
632
+ update_option( 'wp-smush-install-type', $install_type );
633
+ }
634
+
635
+ if ( 'new' == $install_type ) {
636
+ $notice_heading = esc_html__( "Thanks for installing Smush. We hope you like it!", "wp-smushit" );
637
+ $notice_content = esc_html__( "And hey, if you do, you can now try out Smush Pro for double the smushy goodness (benchmarked), entirely for free!", "wp-smushit" );
638
+ $button_content = esc_html__( "FIND OUT MORE", "wp-smushit" );
639
+ } else {
640
+ $notice_heading = sprintf( esc_html__( "Did you know that you can now %stry out Smush Pro%s for FREE?", "wp-smushit" ), '<a href="' . esc_url( $wpsmushit_admin->upgrade_url ) . '" target="_blank">', '</a>' );
641
+ $notice_content = esc_html__( "Yep, Super Smush your images for double the savings, save originals and batch Smush thousands of images all at once.... no charge!!!", "wp-smushit" );
642
+ $button_content = esc_html__( "TRY SMUSH PRO FOR FREE", "wp-smushit" );
643
+ } ?>
644
+ <div class="box-content">
645
+ <div class="row">
646
+ <div class="wp-smush-install-welcome<?php echo 'new' == $install_type ? ' wp-smush-fresh' : ' wp-smush-existing'; ?>">
647
+ <p class="wp-smush-install-heading roboto-medium"><?php echo $notice_heading; ?></p>
648
+ <p class="wp-smush-install-content roboto-regular"><?php echo $notice_content; ?></p>
649
+ <button class="button button-green button-cta"><?php echo $button_content; ?></button>
650
+ </div>
651
+ </div>
652
+ </div><?php
653
+ }
654
+
655
+ /**
656
+ * Super Smush promo content
657
+ */
658
+ function super_smush_promo() {
659
+ global $WpSmush, $wpsmushit_admin;
660
+ if ( $WpSmush->is_pro() ) {
661
+ return;
662
+ } ?>
663
+ <div class="wp-smush-super-smush-promo">
664
+ <div class="wp-smush-super-smush-content"><?php
665
+ printf( esc_html__("Did you know WP Smush Pro delivers up to 10x better compression, allows you to smush your originals and removes any bulk smushing limits? – %sTry it absolutely FREE%s", "wp-smushit"), '<a href="' . esc_url( $wpsmushit_admin->upgrade_url ). '" target="_blank">', '</a>' ); ?>
666
+ </div>
667
+ </div>
668
+ <?php
669
+ }
670
+
671
+ /**
672
+ * Prints Out the page Footer
673
+ */
674
+ function smush_page_footer() {
675
+ echo '</div><!-- End of Container wrap -->
676
+ </div> <!-- End of div wrap -->';
677
+ }
678
+ }
679
+ }
lib/class-wp-smush.php CHANGED
@@ -30,28 +30,45 @@ if ( ! class_exists( 'WpSmush' ) ) {
30
  */
31
  var $migrated_version_key = "wp-smush-migrated-version";
32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  /**
34
  * Constructor
35
  */
36
  function __construct() {
 
 
 
 
37
  /**
38
- * Hooks
39
  */
40
- //Check if auto is enabled
41
- $auto_smush = get_option( WP_SMUSH_PREFIX . 'auto' );
42
-
43
- //Keep the uto smush on by default
44
- if ( $auto_smush === false ) {
45
- $auto_smush = 1;
46
- }
47
 
48
- //Auto Smush the new image
49
- if ( $auto_smush ) {
50
- add_filter( 'wp_update_attachment_metadata', array(
51
- $this,
52
- 'filter_generate_attachment_metadata'
53
- ), 12, 2 );
54
- }
55
 
56
  //Optimise WP Retina 2x images
57
  add_action( 'wr2x_retina_file_added', array( $this, 'smush_retina_image' ), 20, 3 );
@@ -74,14 +91,37 @@ if ( ! class_exists( 'WpSmush' ) ) {
74
 
75
  //Load NextGen Gallery, if hooked too late or early, auto smush doesn't works, also Load after settings have been saved on init action
76
  add_action( 'plugins_loaded', array( $this, 'load_nextgen' ), 90 );
 
 
 
 
77
  }
78
 
79
  function i18n() {
80
  load_plugin_textdomain( 'wp-smushit', false, WP_SMUSH_DIR . '/languages/' );
81
  }
82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  function admin_init() {
84
  wp_enqueue_script( 'common' );
 
 
85
  }
86
 
87
  /**
@@ -95,7 +135,8 @@ if ( ! class_exists( 'WpSmush' ) ) {
95
  * @returns array
96
  */
97
  function do_smushit( $file_path = '' ) {
98
- $errors = new WP_Error();
 
99
  $dir_name = dirname( $file_path );
100
  if ( empty( $file_path ) ) {
101
  $errors->add( "empty_path", __( "File path is empty", 'wp-smushit' ) );
@@ -118,18 +159,22 @@ if ( ! class_exists( 'WpSmush' ) ) {
118
 
119
  //Check if file exists
120
  if ( $file_size == 0 ) {
121
- $errors->add( "image_not_found", sprintf( __( 'Skipped (%s), image not found.', 'wp-smushit' ), $this->format_bytes( $file_size ) ) );
122
  }
123
 
124
  //Check size limit
125
  if ( $file_size > $max_size ) {
126
- $errors->add( "size_limit", sprintf( __( 'Skipped (%s), size limit exceeded.', 'wp-smushit' ), $this->format_bytes( $file_size ) ) );
127
  }
128
 
129
  if ( count( $errors->get_error_messages() ) ) {
130
  return $errors;
131
  }
132
 
 
 
 
 
133
  /** Send image for smushing, and fetch the response */
134
  $response = $this->_post( $file_path, $file_size );
135
 
@@ -159,9 +204,11 @@ if ( ! class_exists( 'WpSmush' ) ) {
159
  //handle backups if enabled
160
  $backup = get_option( WP_SMUSH_PREFIX . 'backup' );
161
  if ( $backup && $this->is_pro() ) {
162
- $path = pathinfo( $file_path );
163
- $backup_name = trailingslashit( $path['dirname'] ) . $path['filename'] . ".bak." . $path['extension'];
164
- @copy( $file_path, $backup_name );
 
 
165
  }
166
 
167
  //replace the file
@@ -169,22 +216,23 @@ if ( ! class_exists( 'WpSmush' ) ) {
169
 
170
  //if tempfile still exists, unlink it
171
  if ( file_exists( $tempfile ) ) {
172
- unlink( $tempfile );
173
  }
174
 
175
  //If file renaming failed
176
  if ( ! $success ) {
177
  @copy( $tempfile, $file_path );
178
- unlink( $tempfile );
179
  }
180
 
181
  //Some servers are having issue with file permission, this should fix it
182
- //Source: WordPress Core
183
- $stat = stat( dirname( $file_path ) );
184
- $perms = $stat['mode'] & 0000666; //same permissions as parent folder, strip off the executable bits
 
 
185
  @ chmod( $file_path, $perms );
186
 
187
-
188
  return $response;
189
  }
190
 
@@ -213,11 +261,11 @@ if ( ! class_exists( 'WpSmush' ) ) {
213
  */
214
  function _get_size_signature() {
215
  return array(
216
- 'percent' => - 1,
217
- 'bytes' => - 1,
218
- 'size_before' => - 1,
219
- 'size_after' => - 1,
220
- 'time' => - 1
221
  );
222
  }
223
 
@@ -241,12 +289,13 @@ if ( ! class_exists( 'WpSmush' ) ) {
241
 
242
  $errors = new WP_Error();
243
  $stats = array(
244
- "stats" => array_merge( $this->_get_size_signature(), array(
245
- 'api_version' => - 1,
246
- 'lossy' => - 1
247
- )
248
- ),
249
- 'sizes' => array()
 
250
  );
251
 
252
  $size_before = $size_after = $compression = $total_time = $bytes_saved = 0;
@@ -271,17 +320,16 @@ if ( ! class_exists( 'WpSmush' ) ) {
271
  }
272
  }
273
 
274
- if( class_exists('finfo') ) {
275
  $finfo = new finfo( FILEINFO_MIME_TYPE );
276
- }else{
277
  $finfo = false;
278
  }
279
- $image_path = trailingslashit( dirname( $attachment_file_path ) );
280
  foreach ( $meta['sizes'] as $size_key => $size_data ) {
281
 
282
  // We take the original image. The 'sizes' will all match the same URL and
283
  // path. So just get the dirname and replace the filename.
284
- $attachment_file_path_size = $image_path . $size_data['file'];
285
 
286
  if ( $finfo ) {
287
  $ext = file_exists( $attachment_file_path_size ) ? $finfo->file( $attachment_file_path_size ) : '';
@@ -290,15 +338,15 @@ if ( ! class_exists( 'WpSmush' ) ) {
290
  } else {
291
  $ext = false;
292
  }
293
- if( $ext ) {
294
  $valid_mime = array_search(
295
- $ext,
296
- array(
297
- 'jpg' => 'image/jpeg',
298
- 'png' => 'image/png',
299
- 'gif' => 'image/gif',
300
- ),
301
- true
302
  );
303
  if ( false === $valid_mime ) {
304
  continue;
@@ -322,24 +370,32 @@ if ( ! class_exists( 'WpSmush' ) ) {
322
  return $response;
323
  }
324
 
325
- if ( ! empty( $response['data'] ) ) {
326
- $stats['sizes'][ $size_key ] = (object) $this->_array_fill_placeholders( $this->_get_size_signature(), (array) $response['data'] );
 
327
  }
328
 
329
- //Total Stats, store all data in bytes
330
- if ( isset( $response['data'] ) ) {
331
- list( $size_before, $size_after, $total_time, $compression, $bytes_saved )
332
- = $this->_update_stats_data( $response['data'], $size_before, $size_after, $total_time, $bytes_saved );
333
- } else {
334
- $errors->add( "image_size_error" . $size_key, sprintf( __( "Size '%s' not processed correctly", 'wp-smushit' ), $size_key ) );
335
  }
336
 
 
 
 
 
 
 
 
337
  if ( empty( $stats['stats']['api_version'] ) || $stats['stats']['api_version'] == - 1 ) {
338
  $stats['stats']['api_version'] = $response['data']->api_version;
339
  $stats['stats']['lossy'] = $response['data']->lossy;
 
340
  }
341
  }
342
- }else{
 
 
343
  $smush_full = true;
344
  }
345
 
@@ -351,6 +407,9 @@ if ( ! class_exists( 'WpSmush' ) ) {
351
  */
352
  $smush_full_image = apply_filters( 'wp_smush_media_image', true, 'full' );
353
 
 
 
 
354
  //If original size is supposed to be smushed
355
  if ( $smush_full && $smush_full_image ) {
356
 
@@ -360,18 +419,24 @@ if ( ! class_exists( 'WpSmush' ) ) {
360
  return $full_image_response;
361
  }
362
 
363
- if ( ! empty( $full_image_response['data'] ) ) {
 
 
 
 
 
 
 
 
 
 
364
  $stats['sizes']['full'] = (object) $this->_array_fill_placeholders( $this->_get_size_signature(), (array) $full_image_response['data'] );
365
- } else {
366
- $errors->add( "image_size_error", __( "Size 'full' not processed correctly", 'wp-smushit' ) );
367
  }
368
 
369
  //Update stats
370
- if ( isset( $full_image_response['data'] ) ) {
371
  list( $size_before, $size_after, $total_time, $compression, $bytes_saved )
372
- = $this->_update_stats_data( $full_image_response['data'], $size_before, $size_after, $total_time, $bytes_saved );
373
- } else {
374
- $errors->add( "image_size_error", __( "Size 'full' not processed correctly", 'wp-smushit' ) );
375
  }
376
 
377
  //Api version and lossy, for some images, full image i skipped and for other images only full exists
@@ -379,15 +444,15 @@ if ( ! class_exists( 'WpSmush' ) ) {
379
  if ( empty( $stats['stats']['api_version'] ) || $stats['stats']['api_version'] == - 1 ) {
380
  $stats['stats']['api_version'] = $full_image_response['data']->api_version;
381
  $stats['stats']['lossy'] = $full_image_response['data']->lossy;
 
382
  }
383
 
384
-
385
  }
386
 
387
  $has_errors = (bool) count( $errors->get_error_messages() );
388
 
389
  list( $stats['stats']['size_before'], $stats['stats']['size_after'], $stats['stats']['time'], $stats['stats']['percent'], $stats['stats']['bytes'] ) =
390
- array( $size_before, $size_after, $total_time, $compression, $bytes_saved );
391
 
392
  //Set smush status for all the images, store it in wp-smpro-smush-data
393
  if ( ! $has_errors ) {
@@ -395,9 +460,18 @@ if ( ! class_exists( 'WpSmush' ) ) {
395
  $existing_stats = get_post_meta( $ID, $this->smushed_meta_key, true );
396
 
397
  if ( ! empty( $existing_stats ) ) {
 
 
 
 
 
 
 
 
 
398
  //Update total bytes saved, and compression percent
399
  $stats['stats']['bytes'] = isset( $existing_stats['stats']['bytes'] ) ? $existing_stats['stats']['bytes'] + $stats['stats']['bytes'] : $stats['stats']['bytes'];
400
- $stats['stats']['percent'] = isset( $existing_stats['stats']['percent'] ) ? $existing_stats['stats']['percent'] + $stats['stats']['percent'] : $stats['stats']['percent'];
401
 
402
  //Update stats for each size
403
  if ( isset( $existing_stats['sizes'] ) && ! empty( $stats['sizes'] ) ) {
@@ -407,13 +481,31 @@ if ( ! class_exists( 'WpSmush' ) ) {
407
  if ( empty( $stats['sizes'][ $size_name ] ) ) {
408
  $stats['sizes'][ $size_name ] = $existing_stats['sizes'][ $size_name ];
409
  } else {
 
 
 
 
 
 
410
  //Update compression percent and bytes saved for each size
411
- $stats['sizes'][ $size_name ]->bytes = $stats['sizes'][ $size_name ]->bytes + $existing_stats['sizes'][ $size_name ]->bytes;
412
- $stats['sizes'][ $size_name ]->percent = $stats['sizes'][ $size_name ]->percent + $existing_stats['sizes'][ $size_name ]->percent;
413
  }
414
  }
415
  }
416
  }
 
 
 
 
 
 
 
 
 
 
 
 
417
  update_post_meta( $ID, $this->smushed_meta_key, $stats );
418
  }
419
 
@@ -434,17 +526,30 @@ if ( ! class_exists( 'WpSmush' ) ) {
434
  * @return mixed
435
  */
436
  function filter_generate_attachment_metadata( $meta, $ID = null ) {
437
- //Update API url for Hostgator
 
438
 
439
- //Check for use of http url, (Hostgator mostly)
440
- $use_http = wp_cache_get( WP_SMUSH_PREFIX.'use_http', 'smush' );
441
- if( !$use_http ) {
442
- $use_http = get_option( WP_SMUSH_PREFIX.'use_http' );
443
- wp_cache_add( WP_SMUSH_PREFIX.'use_http', $use_http, 'smush' );
444
- }
445
- $use_http ? define( 'WP_SMUSH_API_HTTP', 'http://smushpro.wpmudev.org/1.0/') : '';
 
 
 
 
 
 
 
 
 
446
 
447
- $this->resize_from_meta_data( $meta, $ID );
 
 
 
448
 
449
  return $meta;
450
  }
@@ -465,8 +570,8 @@ if ( ! class_exists( 'WpSmush' ) ) {
465
  $file = @fopen( $file_path, 'r' );
466
  $file_data = fread( $file, $file_size );
467
  $headers = array(
468
- 'accept' => 'application/json', // The API returns JSON
469
- 'content-type' => 'application/binary', // Set content type to binary
470
  );
471
 
472
  //Check if premium member, add API key
@@ -475,23 +580,22 @@ if ( ! class_exists( 'WpSmush' ) ) {
475
  $headers['apikey'] = $api_key;
476
  }
477
 
478
- //Check if lossy compression allowed and add it to headers
479
- $lossy = get_option( WP_SMUSH_PREFIX . 'lossy' );
480
-
481
- if ( $lossy && $this->is_pro() ) {
482
  $headers['lossy'] = 'true';
483
  } else {
484
  $headers['lossy'] = 'false';
485
  }
486
 
 
 
487
  $api_url = defined( 'WP_SMUSH_API_HTTP' ) ? WP_SMUSH_API_HTTP : WP_SMUSH_API;
488
- $args = array(
489
- 'headers' => $headers,
490
- 'body' => $file_data,
491
- 'timeout' => WP_SMUSH_TIMEOUT,
492
- 'user-agent' => WP_SMUSH_UA,
493
  );
494
- $result = wp_remote_post( $api_url, $args );
495
 
496
  //Close file connection
497
  fclose( $file );
@@ -610,7 +714,7 @@ if ( ! class_exists( 'WpSmush' ) ) {
610
  //Flag to check if we need to revalidate the key
611
  $revalidate = false;
612
 
613
- $api_auth = get_site_option('wp_smush_api_auth');
614
 
615
  //Check if need to revalidate
616
  if ( ! $api_auth || empty( $api_auth ) || empty( $api_auth[ $api_key ] ) ) {
@@ -650,13 +754,26 @@ if ( ! class_exists( 'WpSmush' ) ) {
650
  }
651
  //If we are suppose to validate api, update the results in options table
652
  if ( $revalidate ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
653
  // call api
654
  $url = $this->api_server . '&key=' . urlencode( $api_key );
655
 
656
  $request = wp_remote_get( $url, array(
657
- "user-agent" => WP_SMUSH_UA,
658
- "timeout" => 10
659
- )
660
  );
661
 
662
  if ( ! is_wp_error( $request ) && '200' == wp_remote_retrieve_response_code( $request ) ) {
@@ -674,8 +791,8 @@ if ( ! class_exists( 'WpSmush' ) ) {
674
  //Reset Value
675
  $api_auth = array();
676
 
677
- //Update Timestamp
678
- $timestamp = current_time( 'timestamp' );
679
  $api_auth[ $api_key ] = array( 'validity' => $valid, 'timestamp' => $timestamp );
680
 
681
  //Update API validity
@@ -704,30 +821,6 @@ if ( ! class_exists( 'WpSmush' ) ) {
704
  return $api_key;
705
  }
706
 
707
-
708
- /**
709
- * Checks if image is already smushed
710
- *
711
- * @param int $id
712
- * @param array $data
713
- *
714
- * @return bool|mixed
715
- */
716
- function is_smushed( $id, $data = null ) {
717
-
718
- //For new images
719
- $wp_is_smushed = get_post_meta( $id, 'wp-is-smushed', true );
720
-
721
- //Not smushed, backward compatibility, check attachment metadata
722
- if ( ! $wp_is_smushed && $data !== null ) {
723
- if ( isset( $data['wp_smushit'] ) && ! empty( $data['wp_smushit'] ) ) {
724
- $wp_is_smushed = true;
725
- }
726
- }
727
-
728
- return $wp_is_smushed;
729
- }
730
-
731
  /**
732
  * Returns size saved from the api call response
733
  *
@@ -748,66 +841,105 @@ if ( ! class_exists( 'WpSmush' ) ) {
748
  *
749
  * @param $id
750
  * @param bool $echo
751
- * @param bool $text_only
 
752
  *
753
  * @return string|void
754
  */
755
- function set_status( $id, $echo = true, $text_only = false ) {
756
- $status_txt = $button_txt = '';
757
- $show_button = false;
758
 
759
- $wp_smush_data = get_post_meta( $id, $this->smushed_meta_key, true );
760
  $attachment_data = wp_get_attachment_metadata( $id );
761
- //
762
  // if the image is smushed
763
  if ( ! empty( $wp_smush_data ) ) {
764
 
765
- $image_count = count( $wp_smush_data['sizes'] );
766
  $bytes = isset( $wp_smush_data['stats']['bytes'] ) ? $wp_smush_data['stats']['bytes'] : 0;
767
  $bytes_readable = ! empty( $bytes ) ? $this->format_bytes( $bytes ) : '';
768
  $percent = isset( $wp_smush_data['stats']['percent'] ) ? $wp_smush_data['stats']['percent'] : 0;
769
  $percent = $percent < 0 ? 0 : $percent;
770
 
771
  if ( isset( $wp_smush_data['stats']['size_before'] ) && $wp_smush_data['stats']['size_before'] == 0 && ! empty( $wp_smush_data['sizes'] ) ) {
772
- $status_txt = __( 'Error processing request', 'wp-smushit' );
773
- $show_button = true;
774
  } else {
775
  if ( $bytes == 0 || $percent == 0 ) {
776
- $status_txt = __( 'Already Optimized', 'wp-smushit' );
 
 
 
 
 
 
 
777
  } elseif ( ! empty( $percent ) && ! empty( $bytes_readable ) ) {
778
  $status_txt = $image_count > 1 ? sprintf( __( "%d images reduced ", 'wp-smushit' ), $image_count ) : __( "Reduced ", 'wp-smushit' );
779
  $status_txt .= sprintf( __( "by %s ( %01.1f%% )", 'wp-smushit' ), $bytes_readable, number_format_i18n( $percent, 2, '.', '' ) );
780
 
781
- //Show detailed stats if available
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
782
  if ( ! empty( $wp_smush_data['sizes'] ) ) {
 
 
 
 
 
 
 
 
 
783
  //Detailed Stats Link
784
- $status_txt .= '<br /><a href="#" class="smush-stats-details">' . esc_html__( "Smush stats", 'wp-smushit' ) . ' [<span class="stats-toggle">+</span>]</a>';
785
 
786
  //Stats
787
- $status_txt .= $this->get_detailed_stats( $id, $wp_smush_data, $attachment_data );
 
 
 
 
788
  }
789
  }
790
  }
791
-
792
  //IF current compression is lossy
793
  if ( ! empty( $wp_smush_data ) && ! empty( $wp_smush_data['stats'] ) ) {
794
  $lossy = ! empty( $wp_smush_data['stats']['lossy'] ) ? $wp_smush_data['stats']['lossy'] : '';
795
  $is_lossy = $lossy == 1 ? true : false;
796
  }
797
 
798
- //Check if Lossy enabled
799
- $opt_lossy = WP_SMUSH_PREFIX . 'lossy';
800
- $opt_lossy_val = get_option( $opt_lossy, false );
801
-
802
  //Check image type
803
  $image_type = get_post_mime_type( $id );
804
 
805
  //Check if premium user, compression was lossless, and lossy compression is enabled
806
- if ( $this->is_pro() && ! $is_lossy && $opt_lossy_val && $image_type != 'image/gif' ) {
 
807
  // the button text
808
  $button_txt = __( 'Super-Smush', 'wp-smushit' );
809
  $show_button = true;
810
  }
 
811
  } else {
812
 
813
  // the status
@@ -820,10 +952,19 @@ if ( ! class_exists( 'WpSmush' ) ) {
820
  $button_txt = __( 'Smush Now!', 'wp-smushit' );
821
  }
822
  if ( $text_only ) {
823
- return $status_txt;
 
 
 
 
 
 
 
 
 
824
  }
825
 
826
- $text = $this->column_html( $id, $status_txt, $button_txt, $show_button, $wp_smush_data, $echo );
827
  if ( ! $echo ) {
828
  return $text;
829
  }
@@ -836,10 +977,13 @@ if ( ! class_exists( 'WpSmush' ) ) {
836
  * @param string $status_txt Status text
837
  * @param string $button_txt Button label
838
  * @param boolean $show_button Whether to shoe the button
 
 
 
839
  *
840
- * @return null
841
  */
842
- function column_html( $id, $status_txt = "", $button_txt = "", $show_button = true, $smushed = false, $echo = true ) {
843
  $allowed_images = array( 'image/jpeg', 'image/jpg', 'image/png', 'image/gif' );
844
 
845
  // don't proceed if attachment is not image, or if image is not a jpg, png or gif
@@ -848,8 +992,7 @@ if ( ! class_exists( 'WpSmush' ) ) {
848
  }
849
 
850
  $class = $smushed ? '' : ' hidden';
851
- $html = '
852
- <p class="smush-status' . $class . '">' . $status_txt . '</p>';
853
  // if we aren't showing the button
854
  if ( ! $show_button ) {
855
  if ( $echo ) {
@@ -863,12 +1006,13 @@ if ( ! class_exists( 'WpSmush' ) ) {
863
  $class = ' smushed';
864
  }
865
 
866
- return '<div class="smush-wrap' . $class . '">' . $html . '</div>';
867
  }
868
  }
869
  if ( ! $echo ) {
 
870
  $html .= '
871
- <button class="button button-primary wp-smush-send" data-id="' . $id . '">
872
  <span>' . $button_txt . '</span>
873
  </button>';
874
  if ( ! $smushed ) {
@@ -877,11 +1021,15 @@ if ( ! class_exists( 'WpSmush' ) ) {
877
  $class = ' smushed';
878
  }
879
 
880
- return '<div class="smush-wrap' . $class . '">' . $html . '</div>';
 
 
 
881
  } else {
882
  $html .= '<button class="button wp-smush-send" data-id="' . $id . '">
883
  <span>' . $button_txt . '</span>
884
  </button>';
 
885
  echo $html;
886
  }
887
  }
@@ -926,15 +1074,26 @@ if ( ! class_exists( 'WpSmush' ) ) {
926
  }
927
 
928
  /**
929
- * @param Object $response_data
 
 
930
  * @param $size_before
931
  * @param $size_after
932
  * @param $total_time
933
  * @param $bytes_saved
934
  *
935
- * @return array
936
  */
937
  function _update_stats_data( $response_data, $size_before, $size_after, $total_time, $bytes_saved ) {
 
 
 
 
 
 
 
 
 
938
  $size_before += ! empty( $response_data->before_size ) ? (int) $response_data->before_size : 0;
939
  $size_after += ( ! empty( $response_data->after_size ) && $response_data->after_size > 0 ) ? (int) $response_data->after_size : (int) $response_data->before_size;
940
  $total_time += ! empty( $response_data->time ) ? (float) $response_data->time : 0;
@@ -946,6 +1105,7 @@ if ( ! class_exists( 'WpSmush' ) ) {
946
 
947
  /**
948
  * Updates the smush stats for a single image size
 
949
  * @param $id
950
  * @param $stats
951
  * @param $image_size
@@ -955,8 +1115,7 @@ if ( ! class_exists( 'WpSmush' ) ) {
955
  if ( empty( $id ) || empty( $smush_stats ) || empty( $image_size ) ) {
956
  return false;
957
  }
958
- $image_size = $image_size . '@2x';
959
- $data = $smush_stats['data'];
960
  //Get existing Stats
961
  $stats = get_post_meta( $id, $this->smushed_meta_key, true );
962
  //Update existing Stats
@@ -964,7 +1123,7 @@ if ( ! class_exists( 'WpSmush' ) ) {
964
  //Update total bytes saved, and compression percent
965
  //Update Main Stats
966
  list( $stats['stats']['size_before'], $stats['stats']['size_after'], $stats['stats']['time'], $stats['stats']['percent'], $stats['stats']['bytes'] ) =
967
- $this->_update_stats_data( $data, $stats['stats']['size_before'], $stats['stats']['size_after'], $stats['stats']['time'], $stats['stats']['bytes'] );
968
 
969
 
970
  //Update stats for each size
@@ -983,18 +1142,20 @@ if ( ! class_exists( 'WpSmush' ) ) {
983
  } else {
984
  //Create new stats
985
  $stats = array(
986
- "stats" => array_merge( $this->_get_size_signature(), array(
987
- 'api_version' => - 1,
988
- 'lossy' => - 1
989
- )
990
- ),
991
- 'sizes' => array()
992
  );
993
  $stats['stats']['api_version'] = $data->api_version;
994
- $stats['stats']['lossy'] = $data->lossy;
 
 
995
  //Update Main Stats
996
  list( $stats['stats']['size_before'], $stats['stats']['size_after'], $stats['stats']['time'], $stats['stats']['percent'], $stats['stats']['bytes'] ) =
997
- array( $data->before_size, $data->after_size, $data->time, $data->compression, $data->bytes_saved );
998
  //Update size wise details
999
  $stats['sizes'][ $image_size ] = (object) $this->_array_fill_placeholders( $this->_get_size_signature(), (array) $data );
1000
  }
@@ -1039,13 +1200,17 @@ if ( ! class_exists( 'WpSmush' ) ) {
1039
 
1040
  $stats = $this->do_smushit( $retina_file );
1041
  //If we squeezed out something, Update stats
1042
- if ( !is_wp_error( $stats ) && ! empty( $stats['data'] ) && isset( $stats['data'] ) && $stats['data']->bytes_saved > 0 ) {
 
 
 
1043
  $this->update_smush_stats_single( $id, $stats, $image_size );
1044
  }
1045
  }
1046
 
1047
  /**
1048
  * Return a list of images not smushed and reason
 
1049
  * @param $image_id
1050
  * @param $size_stats
1051
  * @param $attachment_metadata
@@ -1067,23 +1232,23 @@ if ( ! class_exists( 'WpSmush' ) ) {
1067
  if ( ! $this->is_pro() ) {
1068
  //For free version, check if full size is greater than 1 Mb, show the skipped status
1069
  $file_size = file_exists( $full_image ) ? filesize( $full_image ) : '';
1070
- if ( !empty( $file_size ) && ( $file_size / WP_SMUSH_MAX_BYTES ) > 1 ) {
1071
  $skipped[] = array(
1072
- 'size' => 'full',
1073
- 'reason' => 'size_limit'
1074
  );
1075
- }else{
1076
  $skipped[] = array(
1077
- 'size' => 'full',
1078
- 'reason' => 'large_size'
1079
  );
1080
  }
1081
  } else {
1082
  //Paid version, Check if we have large size
1083
  if ( array_key_exists( 'large', $size_stats ) ) {
1084
  $skipped[] = array(
1085
- 'size' => 'full',
1086
- 'reason' => 'large_size'
1087
  );
1088
  }
1089
 
@@ -1091,44 +1256,47 @@ if ( ! class_exists( 'WpSmush' ) ) {
1091
  }
1092
  //For other sizes, check if the image was generated and not available in stats
1093
  if ( is_array( $media_size ) ) {
1094
- $dir_path = trailingslashit( dirname( $full_image ) );
1095
  foreach ( $media_size as $size ) {
1096
  if ( array_key_exists( $size, $attachment_metadata['sizes'] ) && ! array_key_exists( $size, $size_stats ) && ! empty( $size['file'] ) ) {
1097
  //Image Path
1098
- $img_path = $dir_path . $size['file'];
1099
  $image_size = file_exists( $img_path ) ? filesize( $img_path ) : '';
1100
  if ( ! empty( $image_size ) && ( $image_size / WP_SMUSH_MAX_BYTES ) > 1 ) {
1101
  $skipped[] = array(
1102
- 'size' => 'full',
1103
- 'reason' => 'size_limit'
1104
  );
1105
  }
1106
  }
1107
  }
1108
  }
 
1109
  return $skipped;
1110
  }
1111
 
1112
  /**
1113
  * Skip messages respective to their ids
 
1114
  * @param $msg_id
1115
  *
1116
  * @return bool
1117
  */
1118
  function skip_reason( $msg_id ) {
1119
- $count = count( get_intermediate_image_sizes() );
1120
- $smush_orgnl_txt = sprintf( esc_html__("When you upload an image to WordPress it automatically creates %s thumbnail sizes that are commonly used in your pages. WordPress also stores the original full-size image, but because these are not usually embedded on your site we don’t Smush them. Pro users can override this.", 'wp_smushit'), $count );
1121
- $skip_msg = array(
1122
- 'large_size' => $smush_orgnl_txt,
1123
- 'size_limit' => esc_html__( "Image couldn't be smushed as it exceeded the 1Mb size limit, Pro users can smush images with size upto 32Mb.", "wp-smushit" )
1124
  );
1125
- $skip_rsn = !empty( $skip_msg[$msg_id ] ) ? esc_html__(" Skipped", 'wp-smushit', 'wp-smushit'): '';
1126
- $skip_rsn = ! empty( $skip_rsn ) ? $skip_rsn . '<span class="dashicons dashicons-editor-help" title="' . $skip_msg[ $msg_id ] . '"></span>' : '';
 
1127
  return $skip_rsn;
1128
  }
1129
 
1130
  /**
1131
  * Shows the image size and the compression for each of them
 
1132
  * @param $image_id
1133
  * @param $wp_smush_data
1134
  *
@@ -1224,23 +1392,26 @@ if ( ! class_exists( 'WpSmush' ) ) {
1224
 
1225
  /**
1226
  * Add the Smushit Column to sortable list
 
1227
  * @param $columns
1228
  *
1229
  * @return mixed
1230
  */
1231
  function sortable_column( $columns ) {
1232
  $columns['smushit'] = 'smushit';
 
1233
  return $columns;
1234
  }
 
1235
  /**
1236
  * Orderby query for smush columns
1237
  */
1238
  function smushit_orderby( $query ) {
1239
 
1240
- global $current_screen, $wpdb;
1241
 
1242
  //Filter only media screen
1243
- if ( ! is_admin() || ( !empty( $current_screen) && $current_screen->base != 'upload' ) ) {
1244
  return;
1245
  }
1246
 
@@ -1248,21 +1419,365 @@ if ( ! class_exists( 'WpSmush' ) ) {
1248
 
1249
  if ( isset( $orderby ) && 'smushit' == $orderby ) {
1250
  $query->set( 'meta_query', array(
1251
- 'relation' => 'OR',
1252
- array(
1253
- 'key' => $this->smushed_meta_key,
1254
- 'compare' => 'EXISTS'
1255
- ),
1256
- array(
1257
- 'key' => $this->smushed_meta_key,
1258
- 'compare' => 'NOT EXISTS'
1259
- )
1260
  ) );
1261
  $query->set( 'orderby', 'meta_value_num' );
1262
  }
 
1263
  return $query;
1264
 
1265
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1266
  }
1267
 
1268
  global $WpSmush;
30
  */
31
  var $migrated_version_key = "wp-smush-migrated-version";
32
 
33
+ /**
34
+ * Super Smush is enabled or not
35
+ * @var bool
36
+ */
37
+ var $lossy_enabled = false;
38
+
39
+ /**
40
+ * Whether to Smush the original Image
41
+ * @var bool
42
+ */
43
+ var $smush_original = false;
44
+
45
+ /**
46
+ * Whether to Preserver the exif data or not
47
+ * @var bool
48
+ */
49
+ var $keep_exif = false;
50
+
51
  /**
52
  * Constructor
53
  */
54
  function __construct() {
55
+
56
+ //Redirect to Settings page
57
+ add_action( 'activated_plugin', array( $this, 'wp_smush_redirect' ) );
58
+
59
  /**
60
+ * Smush image (Auto Smush ) when `wp_update_attachment_metadata` filter is fired
61
  */
62
+ add_filter( 'wp_update_attachment_metadata', array(
63
+ $this,
64
+ 'filter_generate_attachment_metadata'
65
+ ), 12, 2 );
 
 
 
66
 
67
+ //Delete Backup files
68
+ add_action( 'delete_attachment', array(
69
+ $this,
70
+ 'delete_images'
71
+ ), 12 );
 
 
72
 
73
  //Optimise WP Retina 2x images
74
  add_action( 'wr2x_retina_file_added', array( $this, 'smush_retina_image' ), 20, 3 );
91
 
92
  //Load NextGen Gallery, if hooked too late or early, auto smush doesn't works, also Load after settings have been saved on init action
93
  add_action( 'plugins_loaded', array( $this, 'load_nextgen' ), 90 );
94
+
95
+ //Send Smush Stats for pro members
96
+ add_filter( 'wpmudev_api_project_extra_data-912164', array( $this, 'send_smush_stats') );
97
+
98
  }
99
 
100
  function i18n() {
101
  load_plugin_textdomain( 'wp-smushit', false, WP_SMUSH_DIR . '/languages/' );
102
  }
103
 
104
+ /**
105
+ * Initialise the setting variables
106
+ */
107
+ function initialise() {
108
+ //Check if Lossy enabled
109
+ $opt_lossy = WP_SMUSH_PREFIX . 'lossy';
110
+ $this->lossy_enabled = $this->is_pro() && get_option( $opt_lossy, false );
111
+
112
+ //Check if Smush Original enabled
113
+ $opt_original = WP_SMUSH_PREFIX . 'original';
114
+ $this->smush_original = $this->is_pro() && get_option( $opt_original, false );
115
+
116
+ //Check Whether to keep exif or not
117
+ $opt_keep_exif = WP_SMUSH_PREFIX . 'keep_exif';
118
+ $this->keep_exif = get_option( $opt_keep_exif, false );
119
+ }
120
+
121
  function admin_init() {
122
  wp_enqueue_script( 'common' );
123
+ //Initialize variables
124
+ $this->initialise();
125
  }
126
 
127
  /**
135
  * @returns array
136
  */
137
  function do_smushit( $file_path = '' ) {
138
+ global $wpsmushit_admin;
139
+ $errors = new WP_Error();
140
  $dir_name = dirname( $file_path );
141
  if ( empty( $file_path ) ) {
142
  $errors->add( "empty_path", __( "File path is empty", 'wp-smushit' ) );
159
 
160
  //Check if file exists
161
  if ( $file_size == 0 ) {
162
+ $errors->add( "image_not_found", '<p>' . sprintf( __( 'Skipped (%s), image not found. Attachment: %s', 'wp-smushit' ), $this->format_bytes( $file_size ), basename( $file_path ) ) . '</p>' );
163
  }
164
 
165
  //Check size limit
166
  if ( $file_size > $max_size ) {
167
+ $errors->add( "size_limit", '<p>' . sprintf( __( 'Skipped (%s), size limit exceeded. Attachment: %s', 'wp-smushit' ), $this->format_bytes( $file_size ), basename( $file_path ) ) . '</p>' );
168
  }
169
 
170
  if ( count( $errors->get_error_messages() ) ) {
171
  return $errors;
172
  }
173
 
174
+ // save original file permissions
175
+ clearstatcache();
176
+ $perms = fileperms($file_path) & 0777;
177
+
178
  /** Send image for smushing, and fetch the response */
179
  $response = $this->_post( $file_path, $file_size );
180
 
204
  //handle backups if enabled
205
  $backup = get_option( WP_SMUSH_PREFIX . 'backup' );
206
  if ( $backup && $this->is_pro() ) {
207
+ //Check for backup from other plugins, like nextgen, if it doesn't exists, create our own
208
+ if ( ! file_exists( $file_path . '_backup' ) ) {
209
+ $backup_name = $wpsmushit_admin->get_image_backup_path( $file_path );
210
+ @copy( $file_path, $backup_name );
211
+ }
212
  }
213
 
214
  //replace the file
216
 
217
  //if tempfile still exists, unlink it
218
  if ( file_exists( $tempfile ) ) {
219
+ @unlink( $tempfile );
220
  }
221
 
222
  //If file renaming failed
223
  if ( ! $success ) {
224
  @copy( $tempfile, $file_path );
225
+ @unlink( $tempfile );
226
  }
227
 
228
  //Some servers are having issue with file permission, this should fix it
229
+ if( empty( $perms ) || !$perms ) {
230
+ //Source: WordPress Core
231
+ $stat = stat( dirname( $file_path ) );
232
+ $perms = $stat['mode'] & 0000666; //same permissions as parent folder, strip off the executable bits
233
+ }
234
  @ chmod( $file_path, $perms );
235
 
 
236
  return $response;
237
  }
238
 
261
  */
262
  function _get_size_signature() {
263
  return array(
264
+ 'percent' => - 1,
265
+ 'bytes' => - 1,
266
+ 'size_before' => - 1,
267
+ 'size_after' => - 1,
268
+ 'time' => - 1
269
  );
270
  }
271
 
289
 
290
  $errors = new WP_Error();
291
  $stats = array(
292
+ "stats" => array_merge( $this->_get_size_signature(), array(
293
+ 'api_version' => - 1,
294
+ 'lossy' => - 1,
295
+ 'keep_exif' => false
296
+ )
297
+ ),
298
+ 'sizes' => array()
299
  );
300
 
301
  $size_before = $size_after = $compression = $total_time = $bytes_saved = 0;
320
  }
321
  }
322
 
323
+ if ( class_exists( 'finfo' ) ) {
324
  $finfo = new finfo( FILEINFO_MIME_TYPE );
325
+ } else {
326
  $finfo = false;
327
  }
 
328
  foreach ( $meta['sizes'] as $size_key => $size_data ) {
329
 
330
  // We take the original image. The 'sizes' will all match the same URL and
331
  // path. So just get the dirname and replace the filename.
332
+ $attachment_file_path_size = path_join( dirname( $attachment_file_path ), $size_data['file'] );
333
 
334
  if ( $finfo ) {
335
  $ext = file_exists( $attachment_file_path_size ) ? $finfo->file( $attachment_file_path_size ) : '';
338
  } else {
339
  $ext = false;
340
  }
341
+ if ( $ext ) {
342
  $valid_mime = array_search(
343
+ $ext,
344
+ array(
345
+ 'jpg' => 'image/jpeg',
346
+ 'png' => 'image/png',
347
+ 'gif' => 'image/gif',
348
+ ),
349
+ true
350
  );
351
  if ( false === $valid_mime ) {
352
  continue;
370
  return $response;
371
  }
372
 
373
+ //If there are no stats
374
+ if( empty( $response['data'] ) ) {
375
+ continue;
376
  }
377
 
378
+ //If the image size grew after smushing, skip it
379
+ if( $response['data']->after_size > $response['data']->before_size ) {
380
+ continue;
 
 
 
381
  }
382
 
383
+ //All Clear, Store the stat
384
+ $stats['sizes'][ $size_key ] = (object) $this->_array_fill_placeholders( $this->_get_size_signature(), (array) $response['data'] );
385
+
386
+ //Total Stats, store all data in bytes
387
+ list( $size_before, $size_after, $total_time, $compression, $bytes_saved )
388
+ = $this->_update_stats_data( $response['data'], $size_before, $size_after, $total_time, $bytes_saved );
389
+
390
  if ( empty( $stats['stats']['api_version'] ) || $stats['stats']['api_version'] == - 1 ) {
391
  $stats['stats']['api_version'] = $response['data']->api_version;
392
  $stats['stats']['lossy'] = $response['data']->lossy;
393
+ $stats['stats']['keep_exif'] = !empty( $response['data']->keep_exif ) ? $response['data']->keep_exif : 0;
394
  }
395
  }
396
+ //Upfront Integration
397
+ $stats = $this->smush_upfront_images( $ID, $stats );
398
+ } else {
399
  $smush_full = true;
400
  }
401
 
407
  */
408
  $smush_full_image = apply_filters( 'wp_smush_media_image', true, 'full' );
409
 
410
+ //Whether to update the image stats or not
411
+ $store_stats = true;
412
+
413
  //If original size is supposed to be smushed
414
  if ( $smush_full && $smush_full_image ) {
415
 
419
  return $full_image_response;
420
  }
421
 
422
+ //If there are no stats
423
+ if( empty( $full_image_response['data'] ) ) {
424
+ $store_stats = false;
425
+ }
426
+
427
+ //If the image size grew after smushing, skip it
428
+ if( $full_image_response['data']->after_size > $full_image_response['data']->before_size ) {
429
+ $store_stats = false;
430
+ }
431
+
432
+ if ( $store_stats ) {
433
  $stats['sizes']['full'] = (object) $this->_array_fill_placeholders( $this->_get_size_signature(), (array) $full_image_response['data'] );
 
 
434
  }
435
 
436
  //Update stats
437
+ if ( $store_stats ) {
438
  list( $size_before, $size_after, $total_time, $compression, $bytes_saved )
439
+ = $this->_update_stats_data( $full_image_response['data'], $size_before, $size_after, $total_time, $bytes_saved );
 
 
440
  }
441
 
442
  //Api version and lossy, for some images, full image i skipped and for other images only full exists
444
  if ( empty( $stats['stats']['api_version'] ) || $stats['stats']['api_version'] == - 1 ) {
445
  $stats['stats']['api_version'] = $full_image_response['data']->api_version;
446
  $stats['stats']['lossy'] = $full_image_response['data']->lossy;
447
+ $stats['stats']['keep_exif'] = !empty( $full_image_response['data']->keep_exif ) ? $full_image_response['data']->keep_exif : 0;
448
  }
449
 
 
450
  }
451
 
452
  $has_errors = (bool) count( $errors->get_error_messages() );
453
 
454
  list( $stats['stats']['size_before'], $stats['stats']['size_after'], $stats['stats']['time'], $stats['stats']['percent'], $stats['stats']['bytes'] ) =
455
+ array( $size_before, $size_after, $total_time, $compression, $bytes_saved );
456
 
457
  //Set smush status for all the images, store it in wp-smpro-smush-data
458
  if ( ! $has_errors ) {
460
  $existing_stats = get_post_meta( $ID, $this->smushed_meta_key, true );
461
 
462
  if ( ! empty( $existing_stats ) ) {
463
+ $e_size_before = isset( $existing_stats['stats']['size_before'] ) ? $existing_stats['stats']['size_before'] : '';
464
+ $e_size_after = isset( $existing_stats['stats']['size_after'] ) ? $existing_stats['stats']['size_after'] : '';
465
+ //Store Original size before
466
+ $stats['stats']['size_before'] = ! empty( $e_size_before ) && $e_size_before > $stats['stats']['size_before'] ? $e_size_before : $stats['stats']['size_before'];
467
+
468
+ if ( $size_after == 0 || empty( $stats['stats']['size_after'] ) || $stats['stats']['size_after'] == $stats['stats']['size_before'] ) {
469
+ $stats['stats']['size_after'] = $e_size_after < $stats['stats']['size_before'] ? $e_size_after : $stats['stats']['size_before'];
470
+ }
471
+
472
  //Update total bytes saved, and compression percent
473
  $stats['stats']['bytes'] = isset( $existing_stats['stats']['bytes'] ) ? $existing_stats['stats']['bytes'] + $stats['stats']['bytes'] : $stats['stats']['bytes'];
474
+ $stats['stats']['percent'] = $this->calculate_percentage( (object) $stats['stats'], (object) $existing_stats['stats'] );
475
 
476
  //Update stats for each size
477
  if ( isset( $existing_stats['sizes'] ) && ! empty( $stats['sizes'] ) ) {
481
  if ( empty( $stats['sizes'][ $size_name ] ) ) {
482
  $stats['sizes'][ $size_name ] = $existing_stats['sizes'][ $size_name ];
483
  } else {
484
+
485
+ $existing_stats_size = (object)$existing_stats['sizes'][ $size_name ];
486
+
487
+ //store the original image size
488
+ $stats['sizes'][ $size_name ]->size_before = ( !empty( $existing_stats_size->size_before ) && $existing_stats_size->size_before > $stats['sizes'][ $size_name ]->size_before ) ? $existing_stats_size->size_before : $stats['sizes'][ $size_name ]->size_before;
489
+
490
  //Update compression percent and bytes saved for each size
491
+ $stats['sizes'][ $size_name ]->bytes = $stats['sizes'][ $size_name ]->bytes + $existing_stats_size->bytes;
492
+ $stats['sizes'][ $size_name ]->percent = $this->calculate_percentage( $stats['sizes'][ $size_name ], $existing_stats_size );
493
  }
494
  }
495
  }
496
  }
497
+ //If there was any compression and there was no error in smushing
498
+ if( isset( $stats['stats']['bytes'] ) && $stats['stats']['bytes'] >= 0 && !$has_errors ) {
499
+ /**
500
+ * Runs if the image smushing was successful
501
+ *
502
+ * @param int $ID Image Id
503
+ *
504
+ * @param array $stats Smush Stats for the image
505
+ *
506
+ */
507
+ do_action('wp_smush_image_optimised', $ID, $stats );
508
+ }
509
  update_post_meta( $ID, $this->smushed_meta_key, $stats );
510
  }
511
 
526
  * @return mixed
527
  */
528
  function filter_generate_attachment_metadata( $meta, $ID = null ) {
529
+ //Check if auto is enabled
530
+ $auto_smush = $this->is_auto_smush_enabled();
531
 
532
+ //Auto Smush the new image
533
+ if ( $auto_smush ) {
534
+ //Update API url for Hostgator
535
+
536
+ //Check for use of http url, (Hostgator mostly)
537
+ $use_http = wp_cache_get( WP_SMUSH_PREFIX . 'use_http', 'smush' );
538
+ if ( ! $use_http ) {
539
+ $use_http = get_option( WP_SMUSH_PREFIX . 'use_http' );
540
+ wp_cache_add( WP_SMUSH_PREFIX . 'use_http', $use_http, 'smush' );
541
+ }
542
+ if( $use_http ) {
543
+ //HTTP Url
544
+ define( 'WP_SMUSH_API_HTTP', 'http://smushpro.wpmudev.org/1.0/' );
545
+ }
546
+
547
+ $this->resize_from_meta_data( $meta, $ID );
548
 
549
+ } else {
550
+ //remove the smush metadata
551
+ delete_post_meta( $ID, $this->smushed_meta_key );
552
+ }
553
 
554
  return $meta;
555
  }
570
  $file = @fopen( $file_path, 'r' );
571
  $file_data = fread( $file, $file_size );
572
  $headers = array(
573
+ 'accept' => 'application/json', // The API returns JSON
574
+ 'content-type' => 'application/binary', // Set content type to binary
575
  );
576
 
577
  //Check if premium member, add API key
580
  $headers['apikey'] = $api_key;
581
  }
582
 
583
+ if ( $this->lossy_enabled && $this->is_pro() ) {
 
 
 
584
  $headers['lossy'] = 'true';
585
  } else {
586
  $headers['lossy'] = 'false';
587
  }
588
 
589
+ $headers['exif'] = $this->keep_exif ? 'true' : 'false';
590
+
591
  $api_url = defined( 'WP_SMUSH_API_HTTP' ) ? WP_SMUSH_API_HTTP : WP_SMUSH_API;
592
+ $args = array(
593
+ 'headers' => $headers,
594
+ 'body' => $file_data,
595
+ 'timeout' => WP_SMUSH_TIMEOUT,
596
+ 'user-agent' => WP_SMUSH_UA,
597
  );
598
+ $result = wp_remote_post( $api_url, $args );
599
 
600
  //Close file connection
601
  fclose( $file );
714
  //Flag to check if we need to revalidate the key
715
  $revalidate = false;
716
 
717
+ $api_auth = get_site_option( 'wp_smush_api_auth' );
718
 
719
  //Check if need to revalidate
720
  if ( ! $api_auth || empty( $api_auth ) || empty( $api_auth[ $api_key ] ) ) {
754
  }
755
  //If we are suppose to validate api, update the results in options table
756
  if ( $revalidate ) {
757
+
758
+ if ( empty( $api_auth[ $api_key ] ) ) {
759
+ //For api key resets
760
+ $api_auth[ $api_key ] = array();
761
+
762
+ //Storing it as valid, unless we really get to know from api call
763
+ $api_auth[ $api_key ]['validity'] = 'valid';
764
+ }
765
+
766
+ //Aaron suggested to Update timestamp before making the api call, to avoid any concurrent calls, clever ;)
767
+ $api_auth[ $api_key ]['timestamp'] = current_time( 'timestamp' );
768
+ update_site_option( 'wp_smush_api_auth', $api_auth );
769
+
770
  // call api
771
  $url = $this->api_server . '&key=' . urlencode( $api_key );
772
 
773
  $request = wp_remote_get( $url, array(
774
+ "user-agent" => WP_SMUSH_UA,
775
+ "timeout" => 10
776
+ )
777
  );
778
 
779
  if ( ! is_wp_error( $request ) && '200' == wp_remote_retrieve_response_code( $request ) ) {
791
  //Reset Value
792
  $api_auth = array();
793
 
794
+ //Add a fresh Timestamp
795
+ $timestamp = current_time( 'timestamp' );
796
  $api_auth[ $api_key ] = array( 'validity' => $valid, 'timestamp' => $timestamp );
797
 
798
  //Update API validity
821
  return $api_key;
822
  }
823
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
824
  /**
825
  * Returns size saved from the api call response
826
  *
841
  *
842
  * @param $id
843
  * @param bool $echo
844
+ * @param bool $text_only Returns the stats text instead of button
845
+ * @param bool $wrapper required for `column_html`, to include the wrapper div or not
846
  *
847
  * @return string|void
848
  */
849
+ function set_status( $id, $echo = true, $text_only = false, $wrapper = true ) {
850
+ $status_txt = $button_txt = $stats = '';
851
+ $show_button = $show_resmush = false;
852
 
853
+ $wp_smush_data = get_post_meta( $id, $this->smushed_meta_key, true );
854
  $attachment_data = wp_get_attachment_metadata( $id );
855
+
856
  // if the image is smushed
857
  if ( ! empty( $wp_smush_data ) ) {
858
 
859
+ $image_count = count( $wp_smush_data['sizes'] );
860
  $bytes = isset( $wp_smush_data['stats']['bytes'] ) ? $wp_smush_data['stats']['bytes'] : 0;
861
  $bytes_readable = ! empty( $bytes ) ? $this->format_bytes( $bytes ) : '';
862
  $percent = isset( $wp_smush_data['stats']['percent'] ) ? $wp_smush_data['stats']['percent'] : 0;
863
  $percent = $percent < 0 ? 0 : $percent;
864
 
865
  if ( isset( $wp_smush_data['stats']['size_before'] ) && $wp_smush_data['stats']['size_before'] == 0 && ! empty( $wp_smush_data['sizes'] ) ) {
866
+ $status_txt = __( 'Already Optimized', 'wp-smushit' );
867
+ $show_button = false;
868
  } else {
869
  if ( $bytes == 0 || $percent == 0 ) {
870
+ $status_txt = __( 'Already Optimized', 'wp-smushit' );
871
+
872
+ //Show resmush link, if the settings were changed
873
+ $show_resmush = $this->show_resmush( $show_resmush, $wp_smush_data );
874
+ if ( $show_resmush ) {
875
+ $status_txt .= '<br />' . $this->get_resmsuh_link( $id );
876
+ }
877
+
878
  } elseif ( ! empty( $percent ) && ! empty( $bytes_readable ) ) {
879
  $status_txt = $image_count > 1 ? sprintf( __( "%d images reduced ", 'wp-smushit' ), $image_count ) : __( "Reduced ", 'wp-smushit' );
880
  $status_txt .= sprintf( __( "by %s ( %01.1f%% )", 'wp-smushit' ), $bytes_readable, number_format_i18n( $percent, 2, '.', '' ) );
881
 
882
+ $show_resmush = $this->show_resmush( $show_resmush, $wp_smush_data );
883
+
884
+ if ( $show_resmush ) {
885
+ $status_txt .= '<br />' . $this->get_resmsuh_link( $id );
886
+ }
887
+
888
+ //Restore Image: Check if we need to show the restore image option
889
+ $show_restore = $this->show_restore_option( $id, $attachment_data );
890
+
891
+ if ( $show_restore ) {
892
+ if ( $show_resmush ) {
893
+ //Show Separator
894
+ $status_txt .= ' | ';
895
+ } else {
896
+ //Show the link in next line
897
+ $status_txt .= '<br />';
898
+ }
899
+ $status_txt .= $this->get_restore_link( $id );
900
+ }
901
+
902
+ //Detailed Stats: Show detailed stats if available
903
  if ( ! empty( $wp_smush_data['sizes'] ) ) {
904
+
905
+ if ( $show_resmush || $show_restore ) {
906
+ //Show Separator
907
+ $status_txt .= ' | ';
908
+ } else {
909
+ //Show the link in next line
910
+ $status_txt .= '<br />';
911
+ }
912
+
913
  //Detailed Stats Link
914
+ $status_txt .= sprintf( '<a href="#" class="wp-smush-action smush-stats-details wp-smush-title" tooltip="%s">%s [<span class="stats-toggle">+</span>]</a>', esc_html__( "Detailed stats for all the image sizes", "wp-smushit" ), esc_html__( "Smush stats", 'wp-smushit' ) );
915
 
916
  //Stats
917
+ $stats = $this->get_detailed_stats( $id, $wp_smush_data, $attachment_data );
918
+
919
+ if ( ! $text_only ) {
920
+ $status_txt .= $stats;
921
+ }
922
  }
923
  }
924
  }
925
+ /** Super Smush Button */
926
  //IF current compression is lossy
927
  if ( ! empty( $wp_smush_data ) && ! empty( $wp_smush_data['stats'] ) ) {
928
  $lossy = ! empty( $wp_smush_data['stats']['lossy'] ) ? $wp_smush_data['stats']['lossy'] : '';
929
  $is_lossy = $lossy == 1 ? true : false;
930
  }
931
 
 
 
 
 
932
  //Check image type
933
  $image_type = get_post_mime_type( $id );
934
 
935
  //Check if premium user, compression was lossless, and lossy compression is enabled
936
+ //If we are displaying the resmush option already, no need to show the Super Smush button
937
+ if ( ! $show_resmush && $this->is_pro() && ! $is_lossy && $this->lossy_enabled && $image_type != 'image/gif' ) {
938
  // the button text
939
  $button_txt = __( 'Super-Smush', 'wp-smushit' );
940
  $show_button = true;
941
  }
942
+
943
  } else {
944
 
945
  // the status
952
  $button_txt = __( 'Smush Now!', 'wp-smushit' );
953
  }
954
  if ( $text_only ) {
955
+ //For ajax response
956
+ return array(
957
+ 'status' => $status_txt,
958
+ 'stats' => $stats
959
+ );
960
+ }
961
+
962
+ //If we are not showing smush button, append progree bar, else it is already there
963
+ if ( ! $show_button ) {
964
+ $status_txt .= $this->progress_bar();
965
  }
966
 
967
+ $text = $this->column_html( $id, $status_txt, $button_txt, $show_button, $wp_smush_data, $echo, $wrapper );
968
  if ( ! $echo ) {
969
  return $text;
970
  }
977
  * @param string $status_txt Status text
978
  * @param string $button_txt Button label
979
  * @param boolean $show_button Whether to shoe the button
980
+ * @param bool $smushed Whether image is smushed or not
981
+ * @param bool $echo If true, it directly outputs the HTML
982
+ * @param bool $wrapper Whether to return the button with wrapper div or not
983
  *
984
+ * @return string|void
985
  */
986
+ function column_html( $id, $status_txt = "", $button_txt = "", $show_button = true, $smushed = false, $echo = true, $wrapper = true ) {
987
  $allowed_images = array( 'image/jpeg', 'image/jpg', 'image/png', 'image/gif' );
988
 
989
  // don't proceed if attachment is not image, or if image is not a jpg, png or gif
992
  }
993
 
994
  $class = $smushed ? '' : ' hidden';
995
+ $html = '<p class="smush-status' . $class . '">' . $status_txt . '</p>';
 
996
  // if we aren't showing the button
997
  if ( ! $show_button ) {
998
  if ( $echo ) {
1006
  $class = ' smushed';
1007
  }
1008
 
1009
+ return $wrapper ? '<div class="smush-wrap' . $class . '">' . $html . '</div>' : $html;
1010
  }
1011
  }
1012
  if ( ! $echo ) {
1013
+ $button_class = $wrapper ? 'button button-primary wp-smush-send' : 'button wp-smush-send';
1014
  $html .= '
1015
+ <button class="' . $button_class . '" data-id="' . $id . '">
1016
  <span>' . $button_txt . '</span>
1017
  </button>';
1018
  if ( ! $smushed ) {
1021
  $class = ' smushed';
1022
  }
1023
 
1024
+ $html .= $this->progress_bar();
1025
+ $html = $wrapper ? '<div class="smush-wrap' . $class . '">' . $html . '</div>' : $html;
1026
+
1027
+ return $html;
1028
  } else {
1029
  $html .= '<button class="button wp-smush-send" data-id="' . $id . '">
1030
  <span>' . $button_txt . '</span>
1031
  </button>';
1032
+ $html = $html . $this->progress_bar();
1033
  echo $html;
1034
  }
1035
  }
1074
  }
1075
 
1076
  /**
1077
+ * Update the Given array by adding to existing values and returns a array of variables
1078
+ *
1079
+ * @param Object $response_data , Object containing the latest stats (before_size, after_size, time, bytes_saved)
1080
  * @param $size_before
1081
  * @param $size_after
1082
  * @param $total_time
1083
  * @param $bytes_saved
1084
  *
1085
+ * @return array('size_before', 'size_after', 'total_time', 'compression', 'bytes_saved' )
1086
  */
1087
  function _update_stats_data( $response_data, $size_before, $size_after, $total_time, $bytes_saved ) {
1088
+
1089
+ //If image is already optimised, do not add in stats
1090
+ if( $response_data->before_size == $response_data->after_size ) {
1091
+
1092
+ $compression = ( $bytes_saved > 0 && $size_before > 0 ) ? ( ( $bytes_saved / $size_before ) * 100 ) : 0;
1093
+
1094
+ return array( $size_before, $size_after, $total_time, $compression, $bytes_saved );
1095
+ }
1096
+
1097
  $size_before += ! empty( $response_data->before_size ) ? (int) $response_data->before_size : 0;
1098
  $size_after += ( ! empty( $response_data->after_size ) && $response_data->after_size > 0 ) ? (int) $response_data->after_size : (int) $response_data->before_size;
1099
  $total_time += ! empty( $response_data->time ) ? (float) $response_data->time : 0;
1105
 
1106
  /**
1107
  * Updates the smush stats for a single image size
1108
+ *
1109
  * @param $id
1110
  * @param $stats
1111
  * @param $image_size
1115
  if ( empty( $id ) || empty( $smush_stats ) || empty( $image_size ) ) {
1116
  return false;
1117
  }
1118
+ $data = $smush_stats['data'];
 
1119
  //Get existing Stats
1120
  $stats = get_post_meta( $id, $this->smushed_meta_key, true );
1121
  //Update existing Stats
1123
  //Update total bytes saved, and compression percent
1124
  //Update Main Stats
1125
  list( $stats['stats']['size_before'], $stats['stats']['size_after'], $stats['stats']['time'], $stats['stats']['percent'], $stats['stats']['bytes'] ) =
1126
+ $this->_update_stats_data( $data, $stats['stats']['size_before'], $stats['stats']['size_after'], $stats['stats']['time'], $stats['stats']['bytes'] );
1127
 
1128
 
1129
  //Update stats for each size
1142
  } else {
1143
  //Create new stats
1144
  $stats = array(
1145
+ "stats" => array_merge( $this->_get_size_signature(), array(
1146
+ 'api_version' => - 1,
1147
+ 'lossy' => - 1
1148
+ )
1149
+ ),
1150
+ 'sizes' => array()
1151
  );
1152
  $stats['stats']['api_version'] = $data->api_version;
1153
+ $stats['stats']['lossy'] = $data->lossy;
1154
+ $stats['stats']['keep_exif'] = ! empty( $data->keep_exif ) ? $data->keep_exif : 0;
1155
+
1156
  //Update Main Stats
1157
  list( $stats['stats']['size_before'], $stats['stats']['size_after'], $stats['stats']['time'], $stats['stats']['percent'], $stats['stats']['bytes'] ) =
1158
+ array( $data->before_size, $data->after_size, $data->time, $data->compression, $data->bytes_saved );
1159
  //Update size wise details
1160
  $stats['sizes'][ $image_size ] = (object) $this->_array_fill_placeholders( $this->_get_size_signature(), (array) $data );
1161
  }
1200
 
1201
  $stats = $this->do_smushit( $retina_file );
1202
  //If we squeezed out something, Update stats
1203
+ if ( ! is_wp_error( $stats ) && ! empty( $stats['data'] ) && isset( $stats['data'] ) && $stats['data']->bytes_saved > 0 ) {
1204
+
1205
+ $image_size = $image_size . '@2x';
1206
+
1207
  $this->update_smush_stats_single( $id, $stats, $image_size );
1208
  }
1209
  }
1210
 
1211
  /**
1212
  * Return a list of images not smushed and reason
1213
+ *
1214
  * @param $image_id
1215
  * @param $size_stats
1216
  * @param $attachment_metadata
1232
  if ( ! $this->is_pro() ) {
1233
  //For free version, check if full size is greater than 1 Mb, show the skipped status
1234
  $file_size = file_exists( $full_image ) ? filesize( $full_image ) : '';
1235
+ if ( ! empty( $file_size ) && ( $file_size / WP_SMUSH_MAX_BYTES ) > 1 ) {
1236
  $skipped[] = array(
1237
+ 'size' => 'full',
1238
+ 'reason' => 'size_limit'
1239
  );
1240
+ } else {
1241
  $skipped[] = array(
1242
+ 'size' => 'full',
1243
+ 'reason' => 'large_size'
1244
  );
1245
  }
1246
  } else {
1247
  //Paid version, Check if we have large size
1248
  if ( array_key_exists( 'large', $size_stats ) ) {
1249
  $skipped[] = array(
1250
+ 'size' => 'full',
1251
+ 'reason' => 'large_size'
1252
  );
1253
  }
1254
 
1256
  }
1257
  //For other sizes, check if the image was generated and not available in stats
1258
  if ( is_array( $media_size ) ) {
 
1259
  foreach ( $media_size as $size ) {
1260
  if ( array_key_exists( $size, $attachment_metadata['sizes'] ) && ! array_key_exists( $size, $size_stats ) && ! empty( $size['file'] ) ) {
1261
  //Image Path
1262
+ $img_path = path_join( dirname( $full_image ), $size['file'] );
1263
  $image_size = file_exists( $img_path ) ? filesize( $img_path ) : '';
1264
  if ( ! empty( $image_size ) && ( $image_size / WP_SMUSH_MAX_BYTES ) > 1 ) {
1265
  $skipped[] = array(
1266
+ 'size' => 'full',
1267
+ 'reason' => 'size_limit'
1268
  );
1269
  }
1270
  }
1271
  }
1272
  }
1273
+
1274
  return $skipped;
1275
  }
1276
 
1277
  /**
1278
  * Skip messages respective to their ids
1279
+ *
1280
  * @param $msg_id
1281
  *
1282
  * @return bool
1283
  */
1284
  function skip_reason( $msg_id ) {
1285
+ $count = count( get_intermediate_image_sizes() );
1286
+ $smush_orgnl_txt = sprintf( esc_html__( "When you upload an image to WordPress it automatically creates %s thumbnail sizes that are commonly used in your pages. WordPress also stores the original full-size image, but because these are not usually embedded on your site we don’t Smush them. Pro users can override this.", 'wp_smushit' ), $count );
1287
+ $skip_msg = array(
1288
+ 'large_size' => $smush_orgnl_txt,
1289
+ 'size_limit' => esc_html__( "Image couldn't be smushed as it exceeded the 1Mb size limit, Pro users can smush images with size upto 32Mb.", "wp-smushit" )
1290
  );
1291
+ $skip_rsn = ! empty( $skip_msg[ $msg_id ] ) ? esc_html__( " Skipped", 'wp-smushit', 'wp-smushit' ) : '';
1292
+ $skip_rsn = ! empty( $skip_rsn ) ? $skip_rsn . '<span tooltip="' . $skip_msg[ $msg_id ] . '"><i class="dashicons dashicons-editor-help"></i></span>' : '';
1293
+
1294
  return $skip_rsn;
1295
  }
1296
 
1297
  /**
1298
  * Shows the image size and the compression for each of them
1299
+ *
1300
  * @param $image_id
1301
  * @param $wp_smush_data
1302
  *
1392
 
1393
  /**
1394
  * Add the Smushit Column to sortable list
1395
+ *
1396
  * @param $columns
1397
  *
1398
  * @return mixed
1399
  */
1400
  function sortable_column( $columns ) {
1401
  $columns['smushit'] = 'smushit';
1402
+
1403
  return $columns;
1404
  }
1405
+
1406
  /**
1407
  * Orderby query for smush columns
1408
  */
1409
  function smushit_orderby( $query ) {
1410
 
1411
+ global $current_screen;
1412
 
1413
  //Filter only media screen
1414
+ if ( ! is_admin() || ( ! empty( $current_screen ) && $current_screen->base != 'upload' ) ) {
1415
  return;
1416
  }
1417
 
1419
 
1420
  if ( isset( $orderby ) && 'smushit' == $orderby ) {
1421
  $query->set( 'meta_query', array(
1422
+ 'relation' => 'OR',
1423
+ array(
1424
+ 'key' => $this->smushed_meta_key,
1425
+ 'compare' => 'EXISTS'
1426
+ ),
1427
+ array(
1428
+ 'key' => $this->smushed_meta_key,
1429
+ 'compare' => 'NOT EXISTS'
1430
+ )
1431
  ) );
1432
  $query->set( 'orderby', 'meta_value_num' );
1433
  }
1434
+
1435
  return $query;
1436
 
1437
  }
1438
+
1439
+ /**
1440
+ * If any of the image size have a backup file, show the restore option
1441
+ *
1442
+ * @param $attachment_data
1443
+ *
1444
+ * @return bool
1445
+ */
1446
+ function show_restore_option( $image_id, $attachment_data ) {
1447
+ global $wpsmushit_admin;
1448
+
1449
+ //No Attachment data, don't go ahead
1450
+ if ( empty( $attachment_data ) ) {
1451
+ return false;
1452
+ }
1453
+
1454
+ //Get the image path for all sizes
1455
+ $file = get_attached_file( $image_id );
1456
+
1457
+ //Check backup for Full size
1458
+ $backup = $wpsmushit_admin->get_image_backup_path( $file );
1459
+
1460
+ //Check for backup of full image
1461
+ if ( file_exists( $backup ) ) {
1462
+ return true;
1463
+ }
1464
+
1465
+ //Check for backup of image sizes
1466
+ foreach ( $attachment_data['sizes'] as $image_size ) {
1467
+ $size_path = path_join( dirname( $file ), $image_size['file'] );
1468
+ $size_backup_path = $wpsmushit_admin->get_image_backup_path( $size_path );
1469
+ if ( file_exists( $size_backup_path ) ) {
1470
+ return true;
1471
+ }
1472
+ }
1473
+
1474
+ return false;
1475
+ }
1476
+
1477
+ /**
1478
+ * Returns a restore link for given image id
1479
+ *
1480
+ * @param $image_id
1481
+ *
1482
+ * @return bool|string
1483
+ */
1484
+ function get_restore_link( $image_id, $type = 'wp' ) {
1485
+ if ( empty( $image_id ) ) {
1486
+ return false;
1487
+ }
1488
+
1489
+ $class = 'wp-smush-action wp-smush-title';
1490
+ $class .= 'wp' == $type ? ' wp-smush-restore' : ' wp-smush-nextgen-restore';
1491
+
1492
+ $ajax_nonce = wp_create_nonce( "wp-smush-restore-" . $image_id );
1493
+
1494
+ return sprintf( '<a href="#" tooltip="%s" data-id="%d" data-nonce="%s" class="%s">%s</a>', esc_html__( "Restore original image.", "wp-smushit" ), $image_id, $ajax_nonce, $class, esc_html__( "Restore image", "wp-smush" ) );
1495
+ }
1496
+
1497
+ /**
1498
+ * Returns the HTML for progress bar
1499
+ *
1500
+ * @return string
1501
+ */
1502
+ function progress_bar() {
1503
+ return '<div class="wp-smush-progress animate hidden"><span></span></div>';
1504
+ }
1505
+
1506
+ /**
1507
+ * If auto smush is set to true or not, default is true
1508
+ *
1509
+ * @return int|mixed|void
1510
+ */
1511
+ function is_auto_smush_enabled() {
1512
+ $auto_smush = get_option( WP_SMUSH_PREFIX . 'auto' );
1513
+
1514
+ //Keep the auto smush on by default
1515
+ if ( $auto_smush === false ) {
1516
+ $auto_smush = 1;
1517
+ }
1518
+
1519
+ return $auto_smush;
1520
+ }
1521
+
1522
+ /**
1523
+ * Generates a Resmush link for a image
1524
+ *
1525
+ * @param $image_id
1526
+ *
1527
+ * @return bool|string
1528
+ */
1529
+ function get_resmsuh_link( $image_id, $type = 'wp' ) {
1530
+
1531
+ if ( empty( $image_id ) ) {
1532
+ return false;
1533
+ }
1534
+ $class = 'wp-smush-action wp-smush-title';
1535
+ $class .= 'wp' == $type ? ' wp-smush-resmush' : ' wp-smush-nextgen-resmush';
1536
+
1537
+ $ajax_nonce = wp_create_nonce( "wp-smush-resmush-" . $image_id );
1538
+
1539
+ return sprintf( '<a href="#" tooltip="%s" data-id="%d" data-nonce="%s" class="%s">%s</a>', esc_html__( "Smush image including original file.", "wp-smushit" ), $image_id, $ajax_nonce, $class, esc_html__( "Resmush image", "wp-smush" ) );
1540
+ }
1541
+
1542
+ /**
1543
+ * Returns the backup path for attachment
1544
+ *
1545
+ * @param $attachment_path
1546
+ *
1547
+ * @return bool|string
1548
+ *
1549
+ */
1550
+ function get_image_backup_path( $attachment_path ) {
1551
+ //If attachment id is not available, return false
1552
+ if ( empty( $attachment_path ) ) {
1553
+ return false;
1554
+ }
1555
+ $path = pathinfo( $attachment_path );
1556
+ $backup_name = trailingslashit( $path['dirname'] ) . $path['filename'] . ".bak." . $path['extension'];
1557
+
1558
+ return $backup_name;
1559
+ }
1560
+
1561
+ /**
1562
+ * Deletes all the backup files when an attachment is deleted
1563
+ * Update Resmush List
1564
+ * Update Super Smush image count
1565
+ *
1566
+ * @param $image_id
1567
+ */
1568
+ function delete_images( $image_id ) {
1569
+
1570
+ //If no image id provided
1571
+ if ( empty( $image_id ) ) {
1572
+ return false;
1573
+ }
1574
+
1575
+ //Check and Update resmush list
1576
+ if ( $resmush_list = get_option( 'wp-smush-resmush-list' ) ) {
1577
+ global $wpsmushit_admin;
1578
+ $wpsmushit_admin->update_resmush_list( $image_id, 'wp-smush-resmush-list' );
1579
+ }
1580
+
1581
+ /** Delete Backups **/
1582
+
1583
+ //Check if we have any smush data for image
1584
+ $this->delete_backup_files( $image_id );
1585
+ }
1586
+
1587
+ /**
1588
+ * Return Global stats
1589
+ *
1590
+ * @return array|bool|mixed
1591
+ */
1592
+ function send_smush_stats() {
1593
+ global $wpsmushit_admin;
1594
+
1595
+ $stats = $wpsmushit_admin->global_stats();
1596
+
1597
+ return $stats;
1598
+
1599
+ }
1600
+
1601
+ /**
1602
+ * Smushes the upfront images and Updates the respective stats
1603
+ *
1604
+ * @param $attachment_id
1605
+ * @param $stats
1606
+ *
1607
+ * @return mixed
1608
+ */
1609
+ function smush_upfront_images( $attachment_id, $stats ) {
1610
+ //Check if upfront is active or not
1611
+ if ( empty( $attachment_id ) || ! class_exists( 'Upfront' ) ) {
1612
+ return $stats;
1613
+ }
1614
+ //Get post meta to check for Upfront images
1615
+ $upfront_images = get_post_meta( $attachment_id, 'upfront_used_image_sizes', true );
1616
+
1617
+ //If there is no upfront meta for the image
1618
+ if ( ! $upfront_images || empty( $upfront_images ) || ! is_array( $upfront_images ) ) {
1619
+ return $stats;
1620
+ }
1621
+ //Loop over all the images in upfront meta
1622
+ foreach ( $upfront_images as $element_id => $image ) {
1623
+ if ( isset( $image['is_smushed'] ) && 1 == $image['is_smushed'] ) {
1624
+ continue;
1625
+ }
1626
+ //Get the image path and smush it
1627
+ if ( isset( $image['path'] ) && file_exists( $image['path'] ) ) {
1628
+ $res = $this->do_smushit( $image['path'] );
1629
+ //If sizes key is not yet initialised
1630
+ if ( empty( $stats['sizes'] ) ) {
1631
+ $stats['sizes'] = array();
1632
+ }
1633
+
1634
+ //If the smushing was successful
1635
+ if ( ! is_wp_error( $res ) && ! empty( $res['data'] ) ) {
1636
+ if( $res['data']->bytes_saved > 0 ) {
1637
+ //Update attachment stats
1638
+ $stats['sizes'][ $element_id ] = (object) $this->_array_fill_placeholders( $this->_get_size_signature(), (array) $res['data'] );
1639
+ }
1640
+
1641
+ //Update upfront stats for the element id
1642
+ $upfront_images[ $element_id ]['is_smushed'] = 1;
1643
+ }
1644
+ }
1645
+ }
1646
+ //Finally Update the upfront meta key
1647
+ update_post_meta( $attachment_id, 'upfront_used_image_sizes', $upfront_images );
1648
+
1649
+ return $stats;
1650
+
1651
+ }
1652
+
1653
+ /**
1654
+ * Checks the current settings and returns the value whether to enable or not the resmush option
1655
+ * @param $show_resmush
1656
+ * @param $wp_smush_data
1657
+ *
1658
+ * @return bool
1659
+ */
1660
+ function show_resmush( $show_resmush, $wp_smush_data ) {
1661
+ //Resmush: Show resmush link, Check if user have enabled smushing the original and full image was skipped
1662
+ //Or: If keep exif is unchecked and the smushed image have exif
1663
+ if ( $this->smush_original ) {
1664
+ //IF full image was not smushed
1665
+ if ( ! empty( $wp_smush_data ) && empty( $wp_smush_data['sizes']['full'] ) ) {
1666
+ $show_resmush = true;
1667
+ }
1668
+ }
1669
+ if ( !$this->keep_exif ) {
1670
+ //If Keep Exif was set to tru initially, and since it is set to false now
1671
+ if ( isset( $wp_smush_data['stats']['keep_exif'] ) && $wp_smush_data['stats']['keep_exif'] == 1 ) {
1672
+ $show_resmush = true;
1673
+ }
1674
+ }
1675
+ return $show_resmush;
1676
+ }
1677
+
1678
+ /**
1679
+ * Calculate saving percentage from existing and current stats
1680
+ *
1681
+ * @param $stats
1682
+ * @param $existing_stats
1683
+ *
1684
+ * @return float
1685
+ */
1686
+ function calculate_percentage( $stats = '', $existing_stats = '' ) {
1687
+ if ( empty( $stats ) || empty( $existing_stats ) ) {
1688
+ return 0;
1689
+ }
1690
+ $size_before = ! empty( $stats->size_before ) ? $stats->size_before : $existing_stats->size_before;
1691
+ $size_after = ! empty( $stats->size_after ) ? $stats->size_after : $existing_stats->size_after;
1692
+ $savings = $size_before - $size_after;
1693
+ if ( $savings > 0 ) {
1694
+ $percentage = ( $savings / $size_before ) * 100;
1695
+ $percentage = $percentage > 0 ? round( $percentage, 2 ) : $percentage;
1696
+
1697
+ return $percentage;
1698
+ }
1699
+
1700
+ return 0;
1701
+ }
1702
+
1703
+ /**
1704
+ * Redirects the user to Plugin settings page on Plugin activation
1705
+ *
1706
+ * @param $plugin Plugin Name
1707
+ *
1708
+ * @return bool
1709
+ */
1710
+ function wp_smush_redirect( $plugin ) {
1711
+
1712
+ global $wpsmushit_admin;
1713
+
1714
+ //Run for only our plugin
1715
+ if( $plugin != WP_SMUSH_BASENAME ) {
1716
+ return false;
1717
+ }
1718
+
1719
+ //Skip if bulk activation, Or if we have to skip redirection
1720
+ if ( isset( $_GET['activate-multi'] ) || get_site_option('wp-smush-skip-redirect') ) {
1721
+ return false;
1722
+ }
1723
+
1724
+ //If images are already smushed
1725
+ if( $wpsmushit_admin->smushed_count() > 0 ) {
1726
+ return false;
1727
+ }
1728
+
1729
+ $url = admin_url( 'upload.php' );
1730
+ $url = add_query_arg(
1731
+ array(
1732
+ 'page' => 'wp-smush-bulk'
1733
+ ),
1734
+ $url
1735
+ );
1736
+
1737
+ //Store that we need not redirect again
1738
+ add_site_option('wp-smush-skip-redirect', true );
1739
+
1740
+ exit( wp_redirect( $url ) );
1741
+ }
1742
+
1743
+ /**
1744
+ * Clear up all the backup files for the image, if any
1745
+ * @param $image_id
1746
+ */
1747
+ function delete_backup_files( $image_id ) {
1748
+ $smush_meta = get_post_meta( $image_id, $this->smushed_meta_key, true );
1749
+ if ( empty( $smush_meta ) ) {
1750
+ //Return if we don't have any details
1751
+ return;
1752
+ }
1753
+
1754
+ //Get the attachment details
1755
+ $meta = wp_get_attachment_metadata( $image_id );
1756
+
1757
+ //Attachment file path
1758
+ $file = get_attached_file( $image_id );
1759
+
1760
+ //Get the backup path
1761
+ $backup_name = $this->get_image_backup_path( $file );
1762
+
1763
+ //If file exists, corresponding to our backup path, delete it
1764
+ @ unlink( $backup_name );
1765
+
1766
+ //Check meta for rest of the sizes
1767
+ if ( ! empty( $meta ) && ! empty( $meta['sizes'] ) ) {
1768
+ foreach ( $meta['sizes'] as $size ) {
1769
+ //Get the file path
1770
+ if ( empty( $size['file'] ) ) {
1771
+ continue;
1772
+ }
1773
+
1774
+ //Image Path and Backup path
1775
+ $image_size_path = path_join( dirname( $file ), $size['file'] );
1776
+ $image_bckup_path = $this->get_image_backup_path( $image_size_path );
1777
+ @unlink( $image_bckup_path );
1778
+ }
1779
+ }
1780
+ }
1781
  }
1782
 
1783
  global $WpSmush;
lib/nextgen-integration/class-wp-smush-nextgen-admin.php CHANGED
@@ -9,7 +9,7 @@
9
  *
10
  * @author Umesh Kumar <umesh@incsub.com>
11
  *
12
- * @copyright (c) 2015, Incsub (http://incsub.com)
13
  */
14
  if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
15
 
@@ -18,7 +18,12 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
18
  var $total_count = 0;
19
  var $smushed_count = 0;
20
  var $remaining_count = 0;
 
21
  var $bulk_page_handle;
 
 
 
 
22
 
23
  function __construct() {
24
 
@@ -31,9 +36,20 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
31
  //Add a bulk smush option for NextGen gallery
32
  add_action( 'admin_menu', array( &$this, 'wp_smush_bulk_menu' ) );
33
 
34
- //Localize variables for NextGen Mnaeg gallery page
35
  add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
36
 
 
 
 
 
 
 
 
 
 
 
 
37
  }
38
 
39
  /**
@@ -51,7 +67,7 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
51
  */
52
  function wp_smush_bulk_menu() {
53
  if ( defined( 'NGGFOLDER' ) ) {
54
- $this->bulk_page_handle = add_submenu_page( NGGFOLDER, esc_html__( 'WP Bulk Smush', 'wp-smushit' ), esc_html__( 'WP Smush', 'wp-smushit' ), 'NextGEN Manage gallery', 'wp-smush-nextgen-bulk', array(
55
  &$this,
56
  'wp_smush_bulk'
57
  ) );
@@ -84,7 +100,7 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
84
  * @param $column_name
85
  * @param $id
86
  */
87
- function wp_smush_column_options( $column_name, $id ) {
88
  global $wpsmushnextgenstats;
89
 
90
  //NExtGen Doesn't returns Column name, weird? yeah, right, it is proper because hook is called for the particular column
@@ -113,43 +129,40 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
113
  $image_type = $this->get_file_type( $file_path );
114
 
115
  //If image type not supported
116
- if ( ! in_array( $image_type, $supported_image ) ) {
117
  return;
118
  }
119
 
120
  //Check Image metadata, if smushed, print the stats or super smush button
121
  if ( ! empty( $image->meta_data['wp_smush'] ) ) {
122
  //Echo the smush stats
123
- $wpsmushnextgenstats->show_stats( $image->pid, $image->meta_data['wp_smush'], $image_type, false, true );
124
-
125
- return;
126
  }
127
 
128
  //Print the status of image, if Not smushed
129
- $this->set_status( $image->pid, true, false );
130
 
131
  }
132
  }
 
133
  /**
134
  * Localize Translations And Stats
135
  */
136
  function localize() {
137
  global $wpsmushnextgenstats;
138
- $handle = 'wp-smushit-admin-js';
139
 
140
- $bulk_now = __( 'Bulk Smush Now', 'wp-smushit' );
 
 
141
 
142
  $wp_smush_msgs = array(
143
- 'progress' => __( 'Smushing in Progress', 'wp-smushit' ),
144
- 'done' => __( 'All Done!', 'wp-smushit' ),
145
- 'bulk_now' => $bulk_now,
146
- 'something_went_wrong' => __( 'Ops!... something went wrong', 'wp-smushit' ),
147
- 'resmush' => __( 'Super-Smush', 'wp-smushit' ),
148
- 'smush_it' => __( 'Smush it', 'wp-smushit' ),
149
- 'smush_now' => __( 'Smush Now', 'wp-smushit' ),
150
- 'sending' => __( 'Sending ...', 'wp-smushit' ),
151
- "error_in_bulk" => __( '{{errors}} image(s) were skipped due to an error.', 'wp-smushit' ),
152
- "all_supersmushed" => __( 'All images are Super-Smushed.', 'wp-smushit' )
153
  );
154
 
155
  wp_localize_script( $handle, 'wp_smush_msgs', $wp_smush_msgs );
@@ -162,28 +175,24 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
162
  $smushed = ( ! empty( $smushed ) && is_array( $smushed ) ) ? array_keys( $smushed ) : '';
163
 
164
  if ( ! empty( $_REQUEST['ids'] ) ) {
165
- $this->ids = explode( ',', $_REQUEST['ids'] );
 
166
  } else {
167
  $this->ids = $unsmushed;
168
  }
169
  //If premium, Super smush allowed, all images are smushed, localize lossless smushed ids for bulk compression
170
- if ( ( $this->total_count == $this->smushed_count && empty( $this->ids ) ) ) {
171
-
172
- //Check if Super smush enabled
173
- $super_smush = get_option( WP_SMUSH_PREFIX . 'lossy', false );
174
 
175
- if ( $super_smush ) {
176
- //get the attachments, and get lossless count
177
- // echo "Supersmush pending";
178
- // $this->lossless_ids = $this->get_lossless_attachments();
179
- }
180
  }
181
 
182
  //Array of all smushed, unsmushed and lossless ids
183
  $data = array(
184
- 'smushed' => $smushed,
185
- 'unsmushed' => $unsmushed,
186
- 'lossless' => 0
 
 
187
  );
188
 
189
  wp_localize_script( 'wp-smushit-admin-js', 'wp_smushit_data', $data );
@@ -194,13 +203,8 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
194
  * Bulk Smush Page
195
  */
196
  function wp_smush_bulk() {
197
-
198
- global $wpsmushit_admin;
199
- ?>
200
- <div class="wrap"><?php
201
  //Bulk Smush UI, calls progress UI, Super Smush UI
202
- $this->bulk_smush_ui(); ?>
203
- </div><?php
204
 
205
  return;
206
  }
@@ -237,7 +241,7 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
237
  * @return string|void
238
  */
239
  function set_status( $pid, $echo = true, $text_only = false ) {
240
- $button_txt = '';
241
 
242
  // the status
243
  $status_txt = __( 'Not processed', 'wp-smushit' );
@@ -251,6 +255,11 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
251
  return $status_txt;
252
  }
253
 
 
 
 
 
 
254
  $text = $this->column_html( $pid, $status_txt, $button_txt, $show_button, false, $echo );
255
  if ( ! $echo ) {
256
  return $text;
@@ -267,7 +276,8 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
267
  *
268
  * @return null
269
  */
270
- function column_html( $pid, $status_txt = "", $button_txt = "", $show_button = true, $smushed = false, $echo = true ) {
 
271
 
272
  $class = $smushed ? '' : ' hidden';
273
  $html = '<p class="smush-status' . $class . '">' . $status_txt . '</p>';
@@ -275,7 +285,7 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
275
  // if we aren't showing the button
276
  if ( ! $show_button ) {
277
  if ( $echo ) {
278
- echo $html;
279
 
280
  return;
281
  } else {
@@ -285,12 +295,12 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
285
  $class = ' smushed';
286
  }
287
 
288
- return '<div class="smush-wrap' . $class . '">' . $html . '</div>';
289
  }
290
  }
291
  if ( ! $echo ) {
292
  $html .= '
293
- <button class="button button-primary wp-smush-nextgen-send" data-id="' . $pid . '">
294
  <span>' . $button_txt . '</span>
295
  </button>';
296
  if ( ! $smushed ) {
@@ -298,86 +308,40 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
298
  } else {
299
  $class = ' smushed';
300
  }
 
 
301
 
302
- return '<div class="smush-wrap' . $class . '">' . $html . '</div>';
303
  } else {
304
  $html .= '<button class="button wp-smush-nextgen-send" data-id="' . $pid . '">
305
  <span>' . $button_txt . '</span>
306
  </button>';
307
- echo $html;
308
  }
309
  }
310
 
311
- /**
312
- * Print out the progress bar
313
- */
314
- function progress_ui() {
315
- global $WpSmush, $wpsmushnextgenstats;
316
- $this->stats = $wpsmushnextgenstats->get_smush_stats();
317
-
318
- // calculate %ages, avoid divide by zero error with no attachments
319
- if ( $this->total_count > 0 ) {
320
- $smushed_pc = $this->smushed_count / $this->total_count * 100;
321
- } else {
322
- $smushed_pc = 0;
323
- }
324
- $bytes = ! empty( $this->stats['bytes'] ) ? $this->stats['bytes'] : 0;
325
- $human = ! empty( $this->stats['human'] ) ? $this->stats['human'] : $WpSmush->format_bytes( $bytes );
326
- $percent = ! empty( $this->stats['percent'] ) ? number_format_i18n( $this->stats['percent'], 2, '.', '' ) : '';
327
-
328
- $progress_ui = '<div id="progress-ui">';
329
-
330
- // display the progress bars
331
- $progress_ui .= '<div id="wp-smush-progress-wrap">
332
- <div id="wp-smush-fetched-progress" class="wp-smush-progressbar"><div style="width:' . $smushed_pc . '%"></div></div>
333
- <p id="wp-smush-compression">'
334
- . __( "Reduced by ", 'wp-smushit' )
335
- . '<span id="human">' . $human . '</span> ( <span id="percent">' . $percent . '</span>% )
336
- </p>
337
- </div>';
338
-
339
- // status divs to show completed count/ total count
340
- $progress_ui .= '<div id="wp-smush-progress-status">
341
-
342
- <p id="fetched-status">' .
343
- sprintf(
344
- __(
345
- '<span class="done-count">%d</span> of <span class="total-count">%d</span> total attachments have been smushed', 'wp-smushit'
346
- ), $this->smushed_count, $this->total_count
347
- ) .
348
- '</p>
349
- </div>
350
- </div>';
351
- // print it out
352
- echo $progress_ui;
353
- wp_nonce_field( 'wp_smush_nextgen', '_wp_smush_nonce', '', true );
354
- }
355
  /**
356
  * Returns Bulk smush button id and other details, as per if bulk request is already sent or not
357
  *
358
  * @return array
359
  */
360
 
361
- private function button_state( $super_smush ) {
362
  $button = array(
363
  'cancel' => false,
364
  );
365
- if ( $super_smush ) {
366
- $button['text'] = __( 'Bulk Smush Now', 'wp-smushit' );
367
- $button['class'] = 'wp-smush-button wp-smush-nextgen-bulk';
368
- } else {
369
-
370
- // if we have nothing left to smush, disable the buttons
371
- if ( $this->smushed_count === $this->total_count ) {
372
- $button['text'] = __( 'All Done!', 'wp-smushit' );
373
- $button['class'] = 'wp-smush-finished disabled wp-smush-finished';
374
- $button['disabled'] = 'disabled';
375
 
376
- } else {
377
 
378
- $button['text'] = __( 'Bulk Smush Now', 'wp-smushit' );
379
- $button['class'] = 'wp-smush-button wp-smush-nextgen-bulk';
380
- }
 
 
 
 
 
 
381
  }
382
 
383
  return $button;
@@ -385,87 +349,301 @@ if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
385
 
386
  /**
387
  * Display the bulk smushing button
 
 
 
 
 
 
 
388
  */
389
- function setup_button( $super_smush = false ) {
390
- $button = $this->button_state( $super_smush );
391
  $disabled = ! empty( $button['disabled'] ) ? ' disabled="disabled"' : '';
392
- ?>
393
- <button class="button button-primary<?php echo ' ' . $button['class']; ?>" name="smush-all-nextgen" <?php echo $disabled; ?>>
394
- <span><?php echo $button['text'] ?></span>
395
- </button>
396
- <?php
 
 
397
  }
398
 
399
  /**
400
  *
401
  */
402
  function bulk_smush_ui() {
403
- global $WpSmush, $wpsmushnextgenstats;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
404
 
405
- //Set the counts
406
- $this->total_count = $wpsmushnextgenstats->total_count();
407
- $this->smushed_count = $wpsmushnextgenstats->get_ngg_images( 'smushed', true );
408
- $this->remaining_count = $wpsmushnextgenstats->get_ngg_images( 'unsmushed', true );
 
409
 
410
- ?>
411
- <div class="bulk-smush">
412
- <h3><?php _e( 'Smush in Bulk', 'wp-smushit' ) ?></h3>
413
- <?php
414
- $this->get_nextgen_attachments();
415
-
416
- //Nothing to smush
417
- if ( $this->total_count == 0 ) {
418
- // if there are no images in the media library ?>
419
- <p><?php _e( "We didn't find any images in NextGen gallery, please upload some images.", 'wp-smushit'); ?></p><?php
420
-
421
- // no need to print out the rest of the UI
422
- return;
423
- }else if ( $this->remaining_count == 0 ) {
424
- ?>
425
- <p><?php _e( "Congratulations, all your images are currently Smushed!", 'wp-smushit' ); ?></p><?php
426
- $this->progress_ui();
427
- } else {
428
- ?>
429
- <div class="smush-instructions">
430
- <h4 class="smush-remaining-images-notice"><?php printf( _n( "%d attachment in NextGen Gallery has not been smushed yet.", "%d image attachments in NextGen Gallery have not been smushed yet.", $this->remaining_count, 'wp-smushit' ), $this->remaining_count ); ?></h4>
431
- <p><?php _e( "Please be aware, smushing a large number of images can take a while depending on your server and network speed.
432
- <strong>You must keep this page open while the bulk smush is processing</strong>, but you can leave at any time and come back to continue where it left off.", 'wp-smushit' ); ?></p>
433
-
434
- <?php if ( ! $WpSmush->is_pro() ) { ?>
435
- <p class="error">
436
- <?php printf( __( "Free accounts are limited to bulk smushing %d attachments per request. You will need to click to start a new bulk job after each %d attachments.", 'wp-smushit' ), $this->max_free_bulk, $this->max_free_bulk ); ?>
437
- <a href="<?php echo $this->upgrade_url; ?>"><?php _e( 'Remove limits &raquo;', 'wp-smushit' ); ?></a>
438
- </p>
439
- <?php } ?>
440
 
441
- </div>
442
 
443
- <!-- Bulk Smushing -->
444
- <?php wp_nonce_field( 'wp-smush-bulk', '_wpnonce' ); ?>
445
- <br/><?php
446
- $this->progress_ui();
447
- ?>
448
- <p class="smush-final-log"></p>
449
- <?php
450
- $this->setup_button();
451
- }
452
 
453
- $auto_smush = get_site_option( WP_SMUSH_PREFIX . 'auto' );
454
- if ( ! $auto_smush && $this->remaining_count == 0 ) {
455
- ?>
456
- <p><?php printf( __( 'When you <a href="%s">upload some images</a> they will be available to smush here.', 'wp-smushit' ), admin_url( 'media-new.php' ) ); ?></p>
457
- <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
458
  } else { ?>
459
- <p>
460
- <?php
461
- // let the user know that there's an alternative
462
- printf( __( 'You can also smush images individually from your <a href="%s">Media Library</a>.', 'wp-smushit' ), admin_url( 'upload.php' ) );
 
 
 
 
 
463
  ?>
464
- </p><?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
465
  }
 
 
 
 
466
  ?>
467
  </div><?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
468
  }
 
 
 
 
 
 
 
 
 
 
 
 
469
  }//End of Class
470
 
471
  }//End Of if class not exists
9
  *
10
  * @author Umesh Kumar <umesh@incsub.com>
11
  *
12
+ * @copyright (c) 2016, Incsub (http://incsub.com)
13
  */
14
  if ( ! class_exists( 'WpSmushNextGenAdmin' ) ) {
15
 
18
  var $total_count = 0;
19
  var $smushed_count = 0;
20
  var $remaining_count = 0;
21
+ var $super_smushed = 0;
22
  var $bulk_page_handle;
23
+ var $bulk_ui = '';
24
+
25
+ //Stores all lossless smushed ids
26
+ public $resmush_ids = array();
27
 
28
  function __construct() {
29
 
36
  //Add a bulk smush option for NextGen gallery
37
  add_action( 'admin_menu', array( &$this, 'wp_smush_bulk_menu' ) );
38
 
39
+ //Localize variables for NextGen Manage gallery page
40
  add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
41
 
42
+ //Update resmush list, if a NextGen image is deleted
43
+ add_action( 'ngg_delete_picture', array( $this, 'update_resmush_list' ) );
44
+
45
+ //Update Stats, if a NextGen image is deleted
46
+ add_action( 'ngg_delete_picture', array( $this, 'update_nextgen_stats' ) );
47
+
48
+ //Update the Super Smush count, after the smushing
49
+ add_action( 'wp_smush_image_optimised_nextgen', array( $this, 'update_lists' ), '', 2 );
50
+
51
+ $this->bulk_ui = new WpSmushBulkUi();
52
+
53
  }
54
 
55
  /**
67
  */
68
  function wp_smush_bulk_menu() {
69
  if ( defined( 'NGGFOLDER' ) ) {
70
+ $this->bulk_page_handle = add_submenu_page( NGGFOLDER, esc_html__( 'Bulk WP Smush', 'wp-smushit' ), esc_html__( 'WP Smush', 'wp-smushit' ), 'NextGEN Manage gallery', 'wp-smush-nextgen-bulk', array(
71
  &$this,
72
  'wp_smush_bulk'
73
  ) );
100
  * @param $column_name
101
  * @param $id
102
  */
103
+ function wp_smush_column_options( $column_name, $id, $echo = false ) {
104
  global $wpsmushnextgenstats;
105
 
106
  //NExtGen Doesn't returns Column name, weird? yeah, right, it is proper because hook is called for the particular column
129
  $image_type = $this->get_file_type( $file_path );
130
 
131
  //If image type not supported
132
+ if ( ! $image_type || ! in_array( $image_type, $supported_image ) ) {
133
  return;
134
  }
135
 
136
  //Check Image metadata, if smushed, print the stats or super smush button
137
  if ( ! empty( $image->meta_data['wp_smush'] ) ) {
138
  //Echo the smush stats
139
+ return $wpsmushnextgenstats->show_stats( $image->pid, $image->meta_data['wp_smush'], $image_type, false, $echo );
 
 
140
  }
141
 
142
  //Print the status of image, if Not smushed
143
+ return $this->set_status( $image->pid, $echo, false );
144
 
145
  }
146
  }
147
+
148
  /**
149
  * Localize Translations And Stats
150
  */
151
  function localize() {
152
  global $wpsmushnextgenstats;
 
153
 
154
+ $this->setup_stats();
155
+
156
+ $handle = 'wp-smushit-admin-js';
157
 
158
  $wp_smush_msgs = array(
159
+ 'resmush' => esc_html__( 'Super-Smush', 'wp-smushit' ),
160
+ 'smush_now' => esc_html__( 'Smush Now', 'wp-smushit' ),
161
+ "error_in_bulk" => esc_html__( '{{errors}} image(s) were skipped due to an error.', 'wp-smushit' ),
162
+ "all_resmushed" => esc_html__( 'All images are fully optimised.', 'wp-smushit' ),
163
+ 'restore' => esc_html__( "Restoring image..", "wp-smushit" ),
164
+ 'smushing' => esc_html__( "Smushing image..", "wp-smushit" ),
165
+ 'checking' => esc_html__( "Checking images..", "wp-smushit" )
 
 
 
166
  );
167
 
168
  wp_localize_script( $handle, 'wp_smush_msgs', $wp_smush_msgs );
175
  $smushed = ( ! empty( $smushed ) && is_array( $smushed ) ) ? array_keys( $smushed ) : '';
176
 
177
  if ( ! empty( $_REQUEST['ids'] ) ) {
178
+ //Sanitize the ids and assign it to a variable
179
+ $this->ids = array_map( 'intval', explode( ',', $_REQUEST['ids'] ) );
180
  } else {
181
  $this->ids = $unsmushed;
182
  }
183
  //If premium, Super smush allowed, all images are smushed, localize lossless smushed ids for bulk compression
184
+ if ( $resmush_ids = get_option( 'wp-smush-nextgen-resmush-list' ) ) {
 
 
 
185
 
186
+ $this->resmush_ids = $resmush_ids;
 
 
 
 
187
  }
188
 
189
  //Array of all smushed, unsmushed and lossless ids
190
  $data = array(
191
+ 'count_smushed' => $this->smushed_count,
192
+ 'count_total' => $this->total_count,
193
+ 'smushed' => $smushed,
194
+ 'unsmushed' => $unsmushed,
195
+ 'resmush' => $this->resmush_ids
196
  );
197
 
198
  wp_localize_script( 'wp-smushit-admin-js', 'wp_smushit_data', $data );
203
  * Bulk Smush Page
204
  */
205
  function wp_smush_bulk() {
 
 
 
 
206
  //Bulk Smush UI, calls progress UI, Super Smush UI
207
+ $this->bulk_smush_ui();
 
208
 
209
  return;
210
  }
241
  * @return string|void
242
  */
243
  function set_status( $pid, $echo = true, $text_only = false ) {
244
+ global $WpSmush;
245
 
246
  // the status
247
  $status_txt = __( 'Not processed', 'wp-smushit' );
255
  return $status_txt;
256
  }
257
 
258
+ //If we are not showing smush button, append progree bar, else it is already there
259
+ if ( ! $show_button ) {
260
+ $status_txt .= $WpSmush->progress_bar();
261
+ }
262
+
263
  $text = $this->column_html( $pid, $status_txt, $button_txt, $show_button, false, $echo );
264
  if ( ! $echo ) {
265
  return $text;
276
  *
277
  * @return null
278
  */
279
+ function column_html( $pid, $status_txt = "", $button_txt = "", $show_button = true, $smushed = false, $echo = true, $wrapper = false ) {
280
+ global $WpSmush;
281
 
282
  $class = $smushed ? '' : ' hidden';
283
  $html = '<p class="smush-status' . $class . '">' . $status_txt . '</p>';
285
  // if we aren't showing the button
286
  if ( ! $show_button ) {
287
  if ( $echo ) {
288
+ echo $html . $WpSmush->progress_bar();
289
 
290
  return;
291
  } else {
295
  $class = ' smushed';
296
  }
297
 
298
+ return $wrapper ? '<div class="smush-wrap' . $class . '">' . $html . '</div>' : $html;
299
  }
300
  }
301
  if ( ! $echo ) {
302
  $html .= '
303
+ <button class="button wp-smush-nextgen-send" data-id="' . $pid . '">
304
  <span>' . $button_txt . '</span>
305
  </button>';
306
  if ( ! $smushed ) {
308
  } else {
309
  $class = ' smushed';
310
  }
311
+ $html .= $WpSmush->progress_bar();
312
+ $html = $wrapper ? '<div class="smush-wrap' . $class . '">' . $html . '</div>' : $html;
313
 
314
+ return $html;
315
  } else {
316
  $html .= '<button class="button wp-smush-nextgen-send" data-id="' . $pid . '">
317
  <span>' . $button_txt . '</span>
318
  </button>';
319
+ echo $html . $WpSmush->progress_bar();
320
  }
321
  }
322
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
323
  /**
324
  * Returns Bulk smush button id and other details, as per if bulk request is already sent or not
325
  *
326
  * @return array
327
  */
328
 
329
+ private function button_state( $resmush ) {
330
  $button = array(
331
  'cancel' => false,
332
  );
 
 
 
 
 
 
 
 
 
 
333
 
334
+ $button['text'] = __( 'Bulk Smush Now', 'wp-smushit' );
335
 
336
+ //If not resmush and All the images are already smushed
337
+ if ( ! $resmush && $this->smushed_count === $this->total_count ) {
338
+ $button['text'] = __( 'All Done!', 'wp-smushit' );
339
+ $button['class'] = 'wp-smush-finished disabled wp-smush-finished';
340
+ $button['disabled'] = 'disabled';
341
+ } elseif ( $resmush ) {
342
+ $button['class'] = 'wp-smush-button wp-smush-resmush wp-smush-nextgen-bulk';
343
+ } else {
344
+ $button['class'] = 'wp-smush-button wp-smush-nextgen-bulk';
345
  }
346
 
347
  return $button;
349
 
350
  /**
351
  * Display the bulk smushing button
352
+ *
353
+ * @param bool $resmush
354
+ * @param bool $return Whether to echo the button content or echo it
355
+ *
356
+ * @return string If return is set to true, return the button content,
357
+ * else echo it
358
+ *
359
  */
360
+ function setup_button( $resmush = false, $return = false ) {
361
+ $button = $this->button_state( $resmush );
362
  $disabled = ! empty( $button['disabled'] ) ? ' disabled="disabled"' : '';
363
+ $content = '<button class="button button-primary ' . $button['class'] . '" name="smush-all-nextgen" ' . $disabled . '>
364
+ <span>' . $button['text'] . '</span>
365
+ </button>';
366
+ if ( $return ) {
367
+ return $content;
368
+ }
369
+ echo $content;
370
  }
371
 
372
  /**
373
  *
374
  */
375
  function bulk_smush_ui() {
376
+ //Page Header
377
+ $this->bulk_ui->smush_page_header(); ?>
378
+ <!-- Bulk Smush Progress Bar -->
379
+ <div class="wp-smushit-container-left col-two-third float-l"><?php
380
+ //Bulk Smush Container
381
+ $this->bulk_smush_container();
382
+ ?>
383
+ </div>
384
+
385
+ <!-- Stats -->
386
+ <div class="wp-smushit-container-right col-third float-l"><?php
387
+ //Stats
388
+ $this->smush_stats_container(); ?>
389
+ </div><!-- End Of Smushit Container right --><?php
390
+ $this->get_nextgen_attachments(); ?>
391
+ </div><?php
392
+ $this->bulk_ui->smush_page_footer();
393
+ }
394
 
395
+ /**
396
+ * Outputs the Content for Bulk Smush Div
397
+ */
398
+ function bulk_smush_content() {
399
+ global $wpsmushit_admin, $WpSmush;
400
 
401
+ //If all the images are smushed
402
+ $all_done = ( $this->smushed_count == $this->total_count ) && 0 == count( $this->resmush_ids );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
403
 
404
+ $resmush_ids = get_option( "wp-smush-nextgen-resmush-list", false );
405
 
406
+ $count = $resmush_ids ? count( $resmush_ids ) : 0;
 
 
 
 
 
 
 
 
407
 
408
+ //Whether to show the remaining re-smush notice
409
+ $show = $count > 0 ? true : false;
410
+
411
+ $count += $this->remaining_count;
412
+
413
+ //Get the counts
414
+ echo $this->bulk_ui->bulk_resmush_content( $count, $show );
415
+
416
+ /** End Of Re-Smush Notice */
417
+
418
+ //If there are no images in Media Library
419
+ if ( 0 >= $this->total_count ) { ?>
420
+ <span class="wp-smush-no-image tc">
421
+ <img src="<?php echo WP_SMUSH_URL . 'assets/images/smush-upload-images.png'; ?>"
422
+ alt="<?php esc_html_e( "No attachments found - Upload some images", "wp-smushit" ); ?>">
423
+ </span>
424
+ <p class="wp-smush-no-images-content tc roboto-regular"><?php printf( esc_html__( "We haven’t found any images in your %sgallery%s yet, so there’s no smushing to be done! Once you upload images, reload this page and start playing!", "wp-smushit" ), '<a href="' . esc_url( admin_url( 'admin.php?page=ngg_addgallery' ) ) . '">', '</a>' ); ?></p>
425
+ <span class="wp-smush-upload-images tc">
426
+ <a class="button button-cta"
427
+ href="<?php echo esc_url( admin_url( 'admin.php?page=ngg_addgallery' ) ); ?>"><?php esc_html_e( "UPLOAD IMAGES", "wp-smushit" ); ?></a>
428
+ </span><?php
429
  } else { ?>
430
+ <!-- Hide All done div if there are images pending -->
431
+ <div class="wp-smush-notice wp-smush-all-done<?php echo $all_done ? '' : ' hidden' ?>">
432
+ <i class="dev-icon dev-icon-tick"></i><?php esc_html_e( "No attachments need smushing. Awesome!", "wp-smushit" ); ?>
433
+ </div>
434
+ <div class="wp-smush-bulk-wrapper <?php echo $all_done ? ' hidden' : ''; ?>"><?php
435
+ //If all the images in media library are smushed
436
+ //Button Text
437
+ $button_content = esc_html__( "BULK SMUSH NOW", "wp-smushit" );
438
+ // DO not show the remaining notice if we have resmush ids
439
  ?>
440
+ <div class="wp-smush-notice wp-smush-remaining <?php echo count( $this->resmush_ids ) > 0 ? ' hidden' : ''; ?>">
441
+ <i class="dev-icon">
442
+ <img src="<?php echo WP_SMUSH_URL . 'assets/images/icon-gzip.svg'; ?>" width="14px">
443
+ </i>
444
+ <span
445
+ class="wp-smush-notice-text"><?php printf( _n( "%s, you have %s%s%d%s image%s that need smushing!", "%s, you have %s%s%d%s images%s that need smushing!", $this->remaining_count, "wp-smushit" ), $wpsmushit_admin->get_user_name(), '<strong>', '<span class="wp-smush-remaining-count">', $this->remaining_count, '</span>', '</strong>' ); ?></span>
446
+ </div>
447
+ <hr class="wp-smush-sep">
448
+ <div class="smush-final-log notice notice-warning inline hidden"></div>
449
+ <button type="button"
450
+ class="wp-smush-button wp-smush-nextgen-bulk"><?php echo $button_content; ?></button><?php
451
+
452
+ //Enable Super Smush
453
+ if ( ! $WpSmush->lossy_enabled ) {
454
+ $url = admin_url( 'upload.php' );
455
+ $url = add_query_arg(
456
+ array(
457
+ 'page' => 'wp-smush-bulk#wp-smush-settings-box'
458
+ ),
459
+ $url
460
+ ); ?>
461
+ <p class="wp-smush-enable-lossy"><?php printf( esc_html__( "Enable Super-smush in the %sSettings%s area to get even more savings with almost no noticeable quality loss.", "wp-smushit" ), '<a href="' . $url .'" target="_blank">', "</a>"); ?></p><?php
462
+ } ?>
463
+ </div><?php
464
+ $this->bulk_ui->progress_bar( $this );
465
+ }
466
+ }
467
+
468
+ /**
469
+ * Bulk Smush UI and Progress bar
470
+ */
471
+ function bulk_smush_container() {
472
+
473
+ global $WpSmush;
474
+
475
+ //Subheading Content
476
+ $smush_individual_msg = sprintf( esc_html__( "Smush individual images via your %sManage Galleries%s section", "wp-smushit" ), '<a href="' . esc_url( admin_url() . 'admin.php?page=nggallery-manage-gallery' ) . '" title="' . esc_html__( 'Manage Galleries', 'wp-smushit' ) . '">', '</a>' );
477
+
478
+ $class = $WpSmush->is_pro() ? 'bulk-smush-wrapper wp-smush-pro-install' : 'bulk-smush-wrapper';
479
+
480
+ //Container Header
481
+ $this->bulk_ui->container_header( $class, 'wp-smush-bulk-wrap-box', esc_html__( "BULK SMUSH", "wp-smushit" ), $smush_individual_msg ); ?>
482
+
483
+ <div class="box-container"><?php
484
+ $this->bulk_smush_content(); ?>
485
+ </div><?php
486
+ echo "</section>";
487
+ }
488
+
489
+ /**
490
+ * Outputs the Smush stats for the site
491
+ */
492
+ function smush_stats_container() {
493
+ global $WpSmush, $wpsmushnextgenstats, $wpsmushit_admin;
494
+
495
+ //If we have resmush list, smushed_count = totalcount - resmush count, else smushed_count
496
+ $smushed_count = ( $resmush_count = count( $this->resmush_ids ) ) > 0 ? ( $this->total_count - ( $resmush_count + $this->remaining_count ) ) : $this->smushed_count;
497
+
498
+ //NextGen Stats
499
+ $this->stats = $wpsmushnextgenstats->get_smush_stats();
500
+
501
+ $button = '<span class="spinner"></span><button tooltip="' . esc_html__( "Lets you check if any images can be further optimised. Useful after changing settings.", "wp-smushit" ) . '" data-type="nextgen" class="wp-smush-title button button-grey button-small wp-smush-scan">' . esc_html__( "RE-CHECK IMAGES", "wp-smushit" ) . '</button>';
502
+ $this->bulk_ui->container_header( 'smush-stats-wrapper', 'wp-smush-stats-box', esc_html__( "STATS", "wp-smushit" ), $button ); ?>
503
+
504
+ <div class="box-content">
505
+ <div class="row smush-total-reduction-percent">
506
+ <span class="float-l wp-smush-stats-label">
507
+ <strong><?php esc_html_e( "TOTAL % REDUCTIONS", "wp-smushit" ); ?></strong>
508
+ </span>
509
+ <span class="float-r wp-smush-stats-wrap">
510
+ <strong>
511
+ <span
512
+ class="wp-smush-stats"><?php echo $this->stats['percent'] > 0 ? number_format_i18n( $this->stats['percent'], 2, '.', '' ) : 0; ?></span>%
513
+ </strong>
514
+ </span>
515
+ </div>
516
+ <hr>
517
+ <div class="row smush-total-reduction-bytes">
518
+ <span class="float-l wp-smush-stats-label">
519
+ <strong><?php esc_html_e( "TOTAL SIZE REDUCTIONS", "wp-smushit" ); ?></strong>
520
+ </span>
521
+ <span class="float-r wp-smush-stats">
522
+ <strong><?php echo $this->stats['human'] > 0 ? $this->stats['human'] : "0MB"; ?></strong>
523
+ </span>
524
+ </div>
525
+ <hr>
526
+ <div class="row smush-attachments">
527
+ <span class="float-l wp-smush-stats-label">
528
+ <strong><?php esc_html_e( "ATTACHMENTS SMUSHED", "wp-smushit" ); ?></strong>
529
+ </span>
530
+ <span class="float-r wp-smush-stats">
531
+ <strong>
532
+ <span
533
+ class="smushed-count"><?php echo $smushed_count . '</span>/' . $this->total_count; ?>
534
+ </strong>
535
+ </span>
536
+ </div><?php
537
+ //Nonce Field for Ajax requests
538
+ echo wp_nonce_field( 'save_wp_smush_options', 'wp_smush_options_nonce', '', false );
539
+ if ( apply_filters( 'wp_smush_show_nextgen_lossy_stats', true ) ) { ?>
540
+ <hr>
541
+ <div class="row super-smush-attachments">
542
+ <span class="float-l wp-smush-stats-label">
543
+ <strong><?php esc_html_e( "ATTACHMENTS SUPER-SMUSHED", "wp-smushit" ); ?></strong>
544
+ </span>
545
+ <span class="float-r wp-smush-stats">
546
+ <?php
547
+ if ( $WpSmush->lossy_enabled ) {
548
+ $count = $wpsmushit_admin->super_smushed_count( 'nextgen', $wpsmushnextgenstats->get_ngg_images( 'smushed' ) );
549
+ echo '<strong><span class="smushed-count">' . $count . '</span>/' . $this->total_count . '</strong>';
550
+ } else {
551
+ printf( esc_html__( "%sDISABLED%s", "wp-smushit" ), '<span class="wp-smush-lossy-disabled">', '</span>' );
552
+ } ?>
553
+ </span>
554
+ </div><?php
555
  }
556
+ /**
557
+ * Allows you to output any content within the stats box at the end
558
+ */
559
+ do_action( 'wp_smush_after_stats' );
560
  ?>
561
  </div><?php
562
+ echo "</section>";
563
+ }
564
+
565
+ /**
566
+ * Updates the resmush list for NextGen gallery, remove the given id
567
+ *
568
+ * @param $attachment_id
569
+ */
570
+ function update_resmush_list( $attachment_id ) {
571
+ global $wpsmushit_admin;
572
+ $wpsmushit_admin->update_resmush_list( $attachment_id, 'wp-smush-nextgen-resmush-list' );
573
+ }
574
+
575
+ /**
576
+ * Fetch the stats for the given attachment id, and subtract them from Global stats
577
+ *
578
+ * @param $attachment_id
579
+ */
580
+ function update_nextgen_stats( $attachment_id ) {
581
+ global $WpSmush, $wpsmushit_admin;
582
+
583
+ if ( empty( $attachment_id ) ) {
584
+ return false;
585
+ }
586
+
587
+ $image_id = absint( (int) $attachment_id );
588
+
589
+ //Get the absolute path for original image
590
+ $image = $this->get_nextgen_image_from_id( $image_id );
591
+
592
+ //Image Meta data
593
+ $metadata = ! empty( $image ) ? $image->meta_data : '';
594
+
595
+ $smush_stats = ! empty( $metadata['wp_smush'] ) ? $metadata['wp_smush'] : '';
596
+
597
+ if ( empty( $smush_stats ) ) {
598
+ return false;
599
+ }
600
+
601
+ $nextgen_stats = get_option( 'wp_smush_stats_nextgen', false );
602
+ if ( ! $nextgen_stats ) {
603
+ return false;
604
+ }
605
+
606
+ if ( ! empty( $nextgen_stats['size_before'] ) && ! empty( $nextgen_stats['size_after'] ) && $nextgen_stats['size_before'] > 0 && $nextgen_stats['size_after'] > 0 && $nextgen_stats['size_before'] > $smush_stats['stats']['size_before'] ) {
607
+ $nextgen_stats['size_before'] = $nextgen_stats['size_before'] - $smush_stats['stats']['size_before'];
608
+ $nextgen_stats['size_after'] = $nextgen_stats['size_after'] - $smush_stats['stats']['size_after'];
609
+ $nextgen_stats['bytes'] = $nextgen_stats['size_before'] - $nextgen_stats['size_after'];
610
+ $nextgen_stats['percent'] = ( $nextgen_stats['bytes'] / $nextgen_stats['size_before'] ) * 100;
611
+ $nextgen_stats['human'] = $WpSmush->format_bytes( $nextgen_stats['bytes'] );
612
+ }
613
+
614
+ //Update Stats
615
+ update_option( 'wp_smush_stats_nextgen', $nextgen_stats );
616
+
617
+ //Remove from Super Smush list
618
+ $wpsmushit_admin->update_super_smush_count( $attachment_id, 'remove', 'wp-smush-super_smushed_nextgen' );
619
+
620
+ }
621
+
622
+ /**
623
+ * Update the Super Smush count for NextGen Gallery
624
+ *
625
+ * @param $image_id
626
+ * @param $stats
627
+ */
628
+ function update_lists( $image_id, $stats ) {
629
+ global $wpsmushit_admin;
630
+ $wpsmushit_admin->update_lists( $image_id, $stats, 'wp-smush-super_smushed_nextgen' );
631
+ if ( ! empty( $this->resmush_ids ) && in_array( $image_id, $this->resmush_ids ) ) {
632
+ $this->update_resmush_list( $image_id );
633
+ }
634
  }
635
+
636
+ /**
637
+ * Initialize NextGen Gallery Stats
638
+ */
639
+ function setup_stats() {
640
+ global $wpsmushnextgenstats;
641
+ //Set the counts
642
+ $this->total_count = $wpsmushnextgenstats->total_count();
643
+ $this->smushed_count = $wpsmushnextgenstats->get_ngg_images( 'smushed', true );
644
+ $this->remaining_count = $wpsmushnextgenstats->get_ngg_images( 'unsmushed', true );
645
+ }
646
+
647
  }//End of Class
648
 
649
  }//End Of if class not exists
lib/nextgen-integration/class-wp-smush-nextgen-bulk.php CHANGED
@@ -8,7 +8,7 @@ if ( ! class_exists( 'WPSmushNextGenBulk' ) ) {
8
 
9
  function smush_bulk() {
10
 
11
- global $wpsmushnextgenstats;
12
 
13
  $stats = array();
14
 
@@ -16,13 +16,24 @@ if ( ! class_exists( 'WPSmushNextGenBulk' ) ) {
16
  wp_send_json_error( 'missing id' );
17
  }
18
 
19
- $atchmnt_id = sanitize_key( $_GET['attachment_id'] );
20
 
21
  $smush = $this->smush_image( $atchmnt_id, '', false );
22
 
23
  $stats = $wpsmushnextgenstats->get_smush_stats();
24
 
25
  $stats['smushed'] = $wpsmushnextgenstats->get_ngg_images('smushed', true );
 
 
 
 
 
 
 
 
 
 
 
26
  $stats['total'] = $wpsmushnextgenstats->total_count();
27
 
28
  if ( is_wp_error( $smush ) ) {
@@ -33,6 +44,10 @@ if ( ! class_exists( 'WPSmushNextGenBulk' ) ) {
33
  }
34
  wp_send_json_error( array( 'stats' => $stats, 'error_msg' => $msg ) );
35
  } else {
 
 
 
 
36
  wp_send_json_success( array( 'stats' => $stats ) );
37
  }
38
  }
8
 
9
  function smush_bulk() {
10
 
11
+ global $wpsmushnextgenstats, $wpsmushit_admin, $wpsmushnextgenadmin, $WpSmush;
12
 
13
  $stats = array();
14
 
16
  wp_send_json_error( 'missing id' );
17
  }
18
 
19
+ $atchmnt_id = absint( (int) $_GET['attachment_id'] );
20
 
21
  $smush = $this->smush_image( $atchmnt_id, '', false );
22
 
23
  $stats = $wpsmushnextgenstats->get_smush_stats();
24
 
25
  $stats['smushed'] = $wpsmushnextgenstats->get_ngg_images('smushed', true );
26
+
27
+ if ( $WpSmush->lossy_enabled ) {
28
+ //Most of the time the stats would be update and the function won't need to go thorugh all the
29
+ //images to get the count, but in case it has to, we provide the SMushed attachment list
30
+ $stats['super_smushed'] = $wpsmushit_admin->super_smushed_count('nextgen', $wpsmushnextgenstats->get_ngg_images('smushed' ) );
31
+ }
32
+ if( empty( $wpsmushnextgenadmin->resmush_ids ) ) {
33
+ $wpsmushnextgenadmin->resmush_ids = get_option( 'wp-smush-nextgen-resmush-list' );
34
+ }
35
+ $stats['resmush_count'] = count( $wpsmushnextgenadmin->resmush_ids );
36
+
37
  $stats['total'] = $wpsmushnextgenstats->total_count();
38
 
39
  if ( is_wp_error( $smush ) ) {
44
  }
45
  wp_send_json_error( array( 'stats' => $stats, 'error_msg' => $msg ) );
46
  } else {
47
+ //Check if a resmush request, update the resmush list
48
+ if( !empty( $_REQUEST['is_bulk_resmush']) && $_REQUEST['is_bulk_resmush'] ) {
49
+ $wpsmushit_admin->update_resmush_list( $atchmnt_id, 'wp-smush-nextgen-resmush-list' );
50
+ }
51
  wp_send_json_success( array( 'stats' => $stats ) );
52
  }
53
  }
lib/nextgen-integration/class-wp-smush-nextgen-stats.php CHANGED
@@ -9,7 +9,7 @@
9
  *
10
  * @author Umesh Kumar <umesh@incsub.com>
11
  *
12
- * @copyright (c) 2015, Incsub (http://incsub.com)
13
  */
14
  if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
15
 
@@ -120,6 +120,14 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
120
  } else {
121
  $meta = unserialize( $attachment->meta_data );
122
  }
 
 
 
 
 
 
 
 
123
  //Check meta for wp_smush
124
  if ( ! is_array( $meta ) || empty( $meta['wp_smush'] ) ) {
125
  $unsmushed_images[ $attachment->pid ] = $meta;
@@ -129,7 +137,7 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
129
  }
130
  //Set the offset
131
  $offset += $limit;
132
- };
133
  if ( ! empty( $smushed_images ) ) {
134
  wp_cache_set( 'wp_smush_images_smushed', $smushed_images, 'nextgen', 300 );
135
  }
@@ -166,6 +174,8 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
166
  * @param bool $text_only Return only text instead of button (Useful for Ajax)
167
  * @param bool $echo Whether to echo the stats or not
168
  *
 
 
169
  * @return bool|null|string|void
170
  */
171
  function show_stats( $pid, $wp_smush_data = false, $image_type = '', $text_only = false, $echo = true ) {
@@ -173,8 +183,8 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
173
  if ( empty( $wp_smush_data ) ) {
174
  return false;
175
  }
176
- $button_txt = '';
177
- $show_button = false;
178
 
179
  $bytes = isset( $wp_smush_data['stats']['bytes'] ) ? $wp_smush_data['stats']['bytes'] : 0;
180
  $bytes_readable = ! empty( $bytes ) ? $WpSmush->format_bytes( $bytes ) : '';
@@ -182,17 +192,50 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
182
  $percent = $percent < 0 ? 0 : $percent;
183
 
184
  if ( isset( $wp_smush_data['stats']['size_before'] ) && $wp_smush_data['stats']['size_before'] == 0 && ! empty( $wp_smush_data['sizes'] ) ) {
185
- $status_txt = __( 'Error processing request', 'wp-smushit' );
186
- $show_button = true;
187
  } else {
188
  if ( $bytes == 0 || $percent == 0 ) {
189
  $status_txt = __( 'Already Optimized', 'wp-smushit' );
 
 
 
 
 
 
 
190
  } elseif ( ! empty( $percent ) && ! empty( $bytes_readable ) ) {
191
  $status_txt = sprintf( __( "Reduced by %s ( %01.1f%% )", 'wp-smushit' ), $bytes_readable, number_format_i18n( $percent, 2, '.', '' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
192
  //Show detailed stats if available
193
  if ( ! empty( $wp_smush_data['sizes'] ) ) {
 
 
 
 
 
 
 
194
  //Detailed Stats Link
195
- $status_txt .= '<br /><a href="#" class="smush-stats-details">' . esc_html__( "Smush stats", 'wp-smushit' ) . ' [<span class="stats-toggle">+</span>]</a>';
196
 
197
  //Get metadata For the image
198
  // Registry Object for NextGen Gallery
@@ -209,7 +252,11 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
209
  $full_image = $storage->get_image_abspath( $image, 'full' );
210
 
211
  //Stats
212
- $status_txt .= $this->get_detailed_stats( $pid, $wp_smush_data, array( 'sizes' => $sizes ), $full_image );
 
 
 
 
213
  }
214
  }
215
  }
@@ -225,13 +272,17 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
225
  $opt_lossy_val = get_option( $opt_lossy, false );
226
 
227
  //Check if premium user, compression was lossless, and lossy compression is enabled
228
- if ( $this->is_pro_user && ! $is_lossy && $opt_lossy_val && $image_type != 'image/gif' && ! empty( $image_type ) ) {
229
  // the button text
230
  $button_txt = __( 'Super-Smush', 'wp-smushit' );
231
  $show_button = true;
232
  }
233
  if ( $text_only ) {
234
- return $status_txt;
 
 
 
 
235
  }
236
 
237
  //If show button is true for some reason, column html can print out the button for us
@@ -255,8 +306,6 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
255
  $smush_stats = get_option( 'wp_smush_stats_nextgen', array() );
256
 
257
  if ( ! empty( $stats ) ) {
258
- //Compression Percentage
259
- $smush_stats['percent'] = ! empty( $smush_stats['percent'] ) ? ( $smush_stats['percent'] + $stats['percent'] ) : $stats['percent'];
260
 
261
  //Compression Bytes
262
  $smush_stats['bytes'] = ! empty( $smush_stats['bytes'] ) ? ( $smush_stats['bytes'] + $stats['bytes'] ) : $stats['bytes'];
@@ -269,6 +318,9 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
269
 
270
  //Size of image after compression
271
  $smush_stats['size_after'] = ! empty( $smush_stats['size_after'] ) ? ( $smush_stats['size_after'] + $stats['size_after'] ) : $stats['size_after'];
 
 
 
272
  }
273
  update_option( 'wp_smush_stats_nextgen', $smush_stats );
274
 
@@ -283,6 +335,12 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
283
  function get_smush_stats() {
284
  global $WpSmush;
285
 
 
 
 
 
 
 
286
  // Check for the wp_smush_images_smushed in the 'nextgen' group.
287
  $smushed_stats = wp_cache_get( 'wp_smush_stats_nextgen', 'nextgen' );
288
 
@@ -319,6 +377,15 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
319
  $this->get_ngg_images( 'smushed', '', true );
320
  }
321
 
 
 
 
 
 
 
 
 
 
322
  function get_detailed_stats( $image_id, $wp_smush_data, $attachment_metadata, $full_image ) {
323
  global $WpSmush;
324
 
@@ -378,8 +445,13 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
378
  */
379
  function cmp( $a, $b ) {
380
  if ( is_object( $a ) ) {
 
 
 
381
  return $a->bytes < $b->bytes;
382
  } else if ( is_array( $a ) ) {
 
 
383
  return $a['bytes'] < $b['bytes'];
384
  }
385
  }
@@ -428,6 +500,31 @@ if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
428
  return $skipped;
429
  }
430
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
431
  }//End of Class
432
 
433
  }//End Of if class not exists
9
  *
10
  * @author Umesh Kumar <umesh@incsub.com>
11
  *
12
+ * @copyright (c) 2016, Incsub (http://incsub.com)
13
  */
14
  if ( ! class_exists( 'WpSmushNextGenStats' ) ) {
15
 
120
  } else {
121
  $meta = unserialize( $attachment->meta_data );
122
  }
123
+
124
+ //Store pid in image meta
125
+ if ( is_array( $meta ) && empty( $meta['pid'] ) ) {
126
+ $meta['pid'] = $attachment->pid;
127
+ } elseif ( is_object( $meta ) && empty( $meta->pid ) ) {
128
+ $meta->pid = $attachment->pid;
129
+ }
130
+
131
  //Check meta for wp_smush
132
  if ( ! is_array( $meta ) || empty( $meta['wp_smush'] ) ) {
133
  $unsmushed_images[ $attachment->pid ] = $meta;
137
  }
138
  //Set the offset
139
  $offset += $limit;
140
+ }
141
  if ( ! empty( $smushed_images ) ) {
142
  wp_cache_set( 'wp_smush_images_smushed', $smushed_images, 'nextgen', 300 );
143
  }
174
  * @param bool $text_only Return only text instead of button (Useful for Ajax)
175
  * @param bool $echo Whether to echo the stats or not
176
  *
177
+ * @uses WpSmushNextGenAdmin::column_html(), WpSmush::get_restore_link(), WpSmush::get_resmush_link()
178
+ *
179
  * @return bool|null|string|void
180
  */
181
  function show_stats( $pid, $wp_smush_data = false, $image_type = '', $text_only = false, $echo = true ) {
183
  if ( empty( $wp_smush_data ) ) {
184
  return false;
185
  }
186
+ $button_txt = $stats = '';
187
+ $show_button = $show_resmush = $show_restore = false;
188
 
189
  $bytes = isset( $wp_smush_data['stats']['bytes'] ) ? $wp_smush_data['stats']['bytes'] : 0;
190
  $bytes_readable = ! empty( $bytes ) ? $WpSmush->format_bytes( $bytes ) : '';
192
  $percent = $percent < 0 ? 0 : $percent;
193
 
194
  if ( isset( $wp_smush_data['stats']['size_before'] ) && $wp_smush_data['stats']['size_before'] == 0 && ! empty( $wp_smush_data['sizes'] ) ) {
195
+ $status_txt = __( 'Already Optimized', 'wp-smushit' );
 
196
  } else {
197
  if ( $bytes == 0 || $percent == 0 ) {
198
  $status_txt = __( 'Already Optimized', 'wp-smushit' );
199
+
200
+ //Add resmush option if needed
201
+ $show_resmush = $this->show_resmush( $show_resmush, $wp_smush_data );
202
+ if ( $show_resmush ) {
203
+ $status_txt .= '<br />' . $WpSmush->get_resmsuh_link( $pid, 'nextgen' );
204
+ }
205
+
206
  } elseif ( ! empty( $percent ) && ! empty( $bytes_readable ) ) {
207
  $status_txt = sprintf( __( "Reduced by %s ( %01.1f%% )", 'wp-smushit' ), $bytes_readable, number_format_i18n( $percent, 2, '.', '' ) );
208
+
209
+ $show_resmush = $this->show_resmush( $show_resmush, $wp_smush_data );
210
+
211
+ if ( $show_resmush ) {
212
+ $status_txt .= '<br />' . $WpSmush->get_resmsuh_link( $pid, 'nextgen' );
213
+ }
214
+
215
+ //Restore Image: Check if we need to show the restore image option
216
+ $show_restore = $this->show_restore_option( $pid, $wp_smush_data );
217
+
218
+ if ( $show_restore ) {
219
+ if ( $show_resmush ) {
220
+ //Show Separator
221
+ $status_txt .= ' | ';
222
+ } else {
223
+ //Show the link in next line
224
+ $status_txt .= '<br />';
225
+ }
226
+ $status_txt .= $WpSmush->get_restore_link( $pid, 'nextgen' );
227
+ }
228
  //Show detailed stats if available
229
  if ( ! empty( $wp_smush_data['sizes'] ) ) {
230
+ if ( $show_resmush || $show_restore ) {
231
+ //Show Separator
232
+ $status_txt .= ' | ';
233
+ } else {
234
+ //Show the link in next line
235
+ $status_txt .= '<br />';
236
+ }
237
  //Detailed Stats Link
238
+ $status_txt .= '<a href="#" class="smush-stats-details">' . esc_html__( "Smush stats", 'wp-smushit' ) . ' [<span class="stats-toggle">+</span>]</a>';
239
 
240
  //Get metadata For the image
241
  // Registry Object for NextGen Gallery
252
  $full_image = $storage->get_image_abspath( $image, 'full' );
253
 
254
  //Stats
255
+ $stats = $this->get_detailed_stats( $pid, $wp_smush_data, array( 'sizes' => $sizes ), $full_image );
256
+
257
+ if ( ! $text_only ) {
258
+ $status_txt .= $stats;
259
+ }
260
  }
261
  }
262
  }
272
  $opt_lossy_val = get_option( $opt_lossy, false );
273
 
274
  //Check if premium user, compression was lossless, and lossy compression is enabled
275
+ if ( !$show_resmush && $this->is_pro_user && ! $is_lossy && $opt_lossy_val && ! empty( $image_type ) && $image_type != 'image/gif' ) {
276
  // the button text
277
  $button_txt = __( 'Super-Smush', 'wp-smushit' );
278
  $show_button = true;
279
  }
280
  if ( $text_only ) {
281
+ //For ajax response
282
+ return array(
283
+ 'status' => $status_txt,
284
+ 'stats' => $stats
285
+ );
286
  }
287
 
288
  //If show button is true for some reason, column html can print out the button for us
306
  $smush_stats = get_option( 'wp_smush_stats_nextgen', array() );
307
 
308
  if ( ! empty( $stats ) ) {
 
 
309
 
310
  //Compression Bytes
311
  $smush_stats['bytes'] = ! empty( $smush_stats['bytes'] ) ? ( $smush_stats['bytes'] + $stats['bytes'] ) : $stats['bytes'];
318
 
319
  //Size of image after compression
320
  $smush_stats['size_after'] = ! empty( $smush_stats['size_after'] ) ? ( $smush_stats['size_after'] + $stats['size_after'] ) : $stats['size_after'];
321
+
322
+ //Compression Percentage
323
+ $smush_stats['percent'] = ! empty( $smush_stats['size_before'] ) && !empty( $smush_stats['size_after'] ) && $smush_stats['size_before'] > 0 ? ( $smush_stats['bytes'] / $smush_stats['size_before'] ) * 100 : $stats['percent'];
324
  }
325
  update_option( 'wp_smush_stats_nextgen', $smush_stats );
326
 
335
  function get_smush_stats() {
336
  global $WpSmush;
337
 
338
+ //Clear up the stats
339
+ if( 0 == $this->total_count() ) {
340
+ delete_option('wp_smush_stats_nextgen');
341
+ wp_cache_delete( 'wp_smush_stats_nextgen', 'nextgen' );
342
+ }
343
+
344
  // Check for the wp_smush_images_smushed in the 'nextgen' group.
345
  $smushed_stats = wp_cache_get( 'wp_smush_stats_nextgen', 'nextgen' );
346
 
377
  $this->get_ngg_images( 'smushed', '', true );
378
  }
379
 
380
+ /**
381
+ * Returns the Stats for a image formatted into a nice table
382
+ * @param $image_id
383
+ * @param $wp_smush_data
384
+ * @param $attachment_metadata
385
+ * @param $full_image
386
+ *
387
+ * @return string
388
+ */
389
  function get_detailed_stats( $image_id, $wp_smush_data, $attachment_metadata, $full_image ) {
390
  global $WpSmush;
391
 
445
  */
446
  function cmp( $a, $b ) {
447
  if ( is_object( $a ) ) {
448
+ //Check and typecast $b if required
449
+ $b = is_object( $b ) ? $b : (object) $b;
450
+
451
  return $a->bytes < $b->bytes;
452
  } else if ( is_array( $a ) ) {
453
+ $b = is_array( $b ) ? $b : (array) $b;
454
+
455
  return $a['bytes'] < $b['bytes'];
456
  }
457
  }
500
  return $skipped;
501
  }
502
 
503
+ /**
504
+ * Check if image can be resmushed
505
+ * @param $status_txt
506
+ *
507
+ * @return string
508
+ */
509
+ function show_resmush( $show_resmush, $wp_smush_data ) {
510
+ global $WpSmush;
511
+ //Resmush: Show resmush link, Check if user have enabled smushing the original and full image was skipped
512
+ if ( $WpSmush->smush_original ) {
513
+ //IF full image was not smushed
514
+ if ( ! empty( $wp_smush_data ) && empty( $wp_smush_data['sizes']['full'] ) ) {
515
+ $show_resmush = true;
516
+ }
517
+ }
518
+ if ( ! $WpSmush->keep_exif ) {
519
+ //If Keep Exif was set to tru initially, and since it is set to false now
520
+ if ( ! empty( $wp_smush_data['stats']['keep_exif'] ) && $wp_smush_data['stats']['keep_exif'] == 1 ) {
521
+ $show_resmush = true;
522
+ }
523
+ }
524
+
525
+ return $show_resmush;
526
+ }
527
+
528
  }//End of Class
529
 
530
  }//End Of if class not exists
readme.txt CHANGED
@@ -1,13 +1,13 @@
1
  === WP Smush ===
2
  Plugin Name: WP Smush
3
- Version: 2.1.5
4
  Author: WPMU DEV
5
  Author URI: http://premium.wpmudev.org/
6
  Contributors: WPMUDEV, alexdunae
7
  Tags: Attachment,Attachments,Compress,Compress Image File,Compress Image Size,Compress JPG,Compressed JPG, Compression Image,Image,Images,JPG,Optimise,Optimize,Photo,Photos,Pictures,PNG,Reduce Image Size,Smush,Smush.it,Upload,WordPress Compression,WordPress Image Tool,Yahoo, Yahoo Smush.it
8
  Requires at least: 3.5
9
  Tested up to: 4.4.2
10
- Stable tag: 2.1.5
11
  License: GPL v2 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
12
 
13
  Reduce image file sizes, improve performance and boost your SEO using the free <a href="https://premium.wpmudev.org/">WPMU DEV</a> WordPress Smush API.
@@ -80,6 +80,17 @@ Yahoo's Smush.it API is gone forever. So WPMU DEV built our own free API that is
80
 
81
  == Changelog ==
82
 
 
 
 
 
 
 
 
 
 
 
 
83
  = 2.1.5 =
84
 
85
  * Fixed: WP Media Folder Plugin compatibility
1
  === WP Smush ===
2
  Plugin Name: WP Smush
3
+ Version: 2.2
4
  Author: WPMU DEV
5
  Author URI: http://premium.wpmudev.org/
6
  Contributors: WPMUDEV, alexdunae
7
  Tags: Attachment,Attachments,Compress,Compress Image File,Compress Image Size,Compress JPG,Compressed JPG, Compression Image,Image,Images,JPG,Optimise,Optimize,Photo,Photos,Pictures,PNG,Reduce Image Size,Smush,Smush.it,Upload,WordPress Compression,WordPress Image Tool,Yahoo, Yahoo Smush.it
8
  Requires at least: 3.5
9
  Tested up to: 4.4.2
10
+ Stable tag: 2.2
11
  License: GPL v2 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
12
 
13
  Reduce image file sizes, improve performance and boost your SEO using the free <a href="https://premium.wpmudev.org/">WPMU DEV</a> WordPress Smush API.
80
 
81
  == Changelog ==
82
 
83
+ = 2.2 =
84
+ * New: Option to resmush image if settings are changed after optimising images
85
+ * New: Added an option to preserve EXIF
86
+ * New: Remove Smush meta on image regeneration,
87
+ This allows user to manually smush them later, if auto smush is off ( WP Image Editor support )
88
+ * New: Manual Image restore option for Media Library and NextGen Gallery, if "Backup Original Images" was kept on while smushing ( Pro Only )
89
+ * New: Delete Backup Files (Pro Only) on attachment deletion
90
+ * Updated: Upfront Integration
91
+ * Fixed: jQuery tooltip conflict
92
+ * Code Optimisation, Updated Settings page UI
93
+
94
  = 2.1.5 =
95
 
96
  * Fixed: WP Media Folder Plugin compatibility
uninstall.php CHANGED
@@ -14,7 +14,21 @@ global $wpdb;
14
 
15
  $smushit_keys = array(
16
  'auto',
17
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  );
19
  foreach ( $smushit_keys as $key ) {
20
  $key = 'wp-smush-' . $key;
@@ -51,6 +65,7 @@ if ( is_multisite() ) {
51
  foreach ( $blogs as $blog ) {
52
  switch_to_blog( $blog['blog_id'] );
53
  delete_metadata( $meta_type, $user_id, $meta_key, $meta_value, $delete_all );
 
54
  }
55
  restore_current_blog();
56
  }
@@ -58,5 +73,7 @@ if ( is_multisite() ) {
58
  }
59
  } else {
60
  delete_metadata( $meta_type, $user_id, $meta_key, $meta_value, $delete_all );
 
61
  }
 
62
  ?>
14
 
15
  $smushit_keys = array(
16
  'auto',
17
+ 'original',
18
+ 'lossy',
19
+ 'backup',
20
+ 'nextgen',
21
+ 'keep_exif',
22
+ 'resmush-list',
23
+ 'nextgen-resmush-list',
24
+ 'super_smushed',
25
+ 'super_smushed_nextgen',
26
+ 'settings_updated',
27
+ 'skip-redirect',
28
+ 'hide_smush_welcome',
29
+ 'hide_upgrade_notice',
30
+ 'install-type',
31
+ 'lossy-updated'
32
  );
33
  foreach ( $smushit_keys as $key ) {
34
  $key = 'wp-smush-' . $key;
65
  foreach ( $blogs as $blog ) {
66
  switch_to_blog( $blog['blog_id'] );
67
  delete_metadata( $meta_type, $user_id, $meta_key, $meta_value, $delete_all );
68
+ delete_metadata( $meta_type, $user_id, 'wp-smush-lossy', '', $delete_all );
69
  }
70
  restore_current_blog();
71
  }
73
  }
74
  } else {
75
  delete_metadata( $meta_type, $user_id, $meta_key, $meta_value, $delete_all );
76
+ delete_metadata( $meta_type, $user_id, 'wp-smush-lossy', '', $delete_all );
77
  }
78
+ //@todo: Add procedure to delete backup files
79
  ?>
wp-smush.php CHANGED
@@ -4,7 +4,7 @@ Plugin Name: WP Smush
4
  Plugin URI: http://wordpress.org/extend/plugins/wp-smushit/
5
  Description: Reduce image file sizes, improve performance and boost your SEO using the free <a href="https://premium.wpmudev.org/">WPMU DEV</a> WordPress Smush API.
6
  Author: WPMU DEV
7
- Version: 2.1.5
8
  Author URI: http://premium.wpmudev.org/
9
  Textdomain: wp-smushit
10
  */
@@ -35,7 +35,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
35
  * Constants
36
  */
37
  $prefix = 'WP_SMUSH_';
38
- $version = '2.1.5';
39
 
40
  /**
41
  * Set the default timeout for API request and AJAX timeout
4
  Plugin URI: http://wordpress.org/extend/plugins/wp-smushit/
5
  Description: Reduce image file sizes, improve performance and boost your SEO using the free <a href="https://premium.wpmudev.org/">WPMU DEV</a> WordPress Smush API.
6
  Author: WPMU DEV
7
+ Version: 2.2
8
  Author URI: http://premium.wpmudev.org/
9
  Textdomain: wp-smushit
10
  */
35
  * Constants
36
  */
37
  $prefix = 'WP_SMUSH_';
38
+ $version = '2.2-1';
39
 
40
  /**
41
  * Set the default timeout for API request and AJAX timeout