Custom Twitter Feeds - Version 1.8

Version Description

  • New: The locations of the Twitter feeds on your site will now be logged and listed on a single page for easier management. After this feature has been active for awhile, a "Feed Finder" link will appear next to the Feed Type setting on the plugin Settings page which allows you to see a list of all feeds on your site along with their locations.
  • New: Added support for WordPress based translations using language files.
  • New: Install our other free social media plugins right from the Twitter Feed settings menu. Use our Instgram, Facebook, and YouTube plugins to add even more social content to your website and help further engage your viewers and increase your followers.
  • Tweak: Changed the default method of retrieving posts to use the WP_HTTP class.
  • Fix: Updated jQuery methods for compatibility with WordPress 5.7.
Download this release

Release Info

Developer smashballoon
Plugin Icon 128x128 Custom Twitter Feeds
Version 1.8
Comparing to
See all releases

Code changes from version 1.7 to 1.8

README.txt CHANGED
@@ -4,8 +4,8 @@ Contributors: smashballoon, craig-at-smash-balloon
4
  Support Website: http://smashballoon/custom-twitter-feeds/
5
  Tags: Twitter, Twitter feed, Twitter Tweets, Twitter widget, Custom Twitter Feed
6
  Requires at least: 3.4
7
- Tested up to: 5.6
8
- Stable tag: 1.7
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -233,13 +233,20 @@ If you're still having trouble displaying your Tweets after trying the common is
233
  7. To display a Twitter feed just copy and paste the shortcode into a Twitter widget or page
234
 
235
  == Changelog ==
 
 
 
 
 
 
 
236
  = 1.7 =
237
  * New: Integrations with popular GDPR cookie consent solutions added: Cookie Notice by dFactory, GDPR Cookie Consent by WebToffee, Cookiebot by Cybot A/S, Complianz by Really Simple Plugins, and Borlabs Cookie by Borlabs. Visit the Twitter Feed settings page, Customize tab, Advanced section for more information.
238
  * Tweak: Icon font support was discontinued. Only SVGs will be used for icons in feeds.
239
  * Tweak: Twitter Intents JS updated to the latest version.
240
 
241
  = 1.6.1 =
242
- * Tweak: Added support for dynamic dashboard notices on the plugin settings page.
243
  * Tweak: HTML attribute rel="noopener noreferrer" added to all outbound links for extra security.
244
  * Fix: Fixed PHP warning "non-numeric value encountered" when setting the tweet multiplier option to something that wasn't a number.
245
 
4
  Support Website: http://smashballoon/custom-twitter-feeds/
5
  Tags: Twitter, Twitter feed, Twitter Tweets, Twitter widget, Custom Twitter Feed
6
  Requires at least: 3.4
7
+ Tested up to: 5.7
8
+ Stable tag: 1.8
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
233
  7. To display a Twitter feed just copy and paste the shortcode into a Twitter widget or page
234
 
235
  == Changelog ==
236
+ = 1.8 =
237
+ * New: The locations of the Twitter feeds on your site will now be logged and listed on a single page for easier management. After this feature has been active for awhile, a "Feed Finder" link will appear next to the Feed Type setting on the plugin Settings page which allows you to see a list of all feeds on your site along with their locations.
238
+ * New: Added support for WordPress based translations using language files.
239
+ * New: Install our other free social media plugins right from the Twitter Feed settings menu. Use our Instgram, Facebook, and YouTube plugins to add even more social content to your website and help further engage your viewers and increase your followers.
240
+ * Tweak: Changed the default method of retrieving posts to use the WP_HTTP class.
241
+ * Fix: Updated jQuery methods for compatibility with WordPress 5.7.
242
+
243
  = 1.7 =
244
  * New: Integrations with popular GDPR cookie consent solutions added: Cookie Notice by dFactory, GDPR Cookie Consent by WebToffee, Cookiebot by Cybot A/S, Complianz by Really Simple Plugins, and Borlabs Cookie by Borlabs. Visit the Twitter Feed settings page, Customize tab, Advanced section for more information.
245
  * Tweak: Icon font support was discontinued. Only SVGs will be used for icons in feeds.
246
  * Tweak: Twitter Intents JS updated to the latest version.
247
 
248
  = 1.6.1 =
249
+ * Tweak: Added support for improved dashboard notices on the plugin settings page.
250
  * Tweak: HTML attribute rel="noopener noreferrer" added to all outbound links for extra security.
251
  * Fix: Fixed PHP warning "non-numeric value encountered" when setting the tweet multiplier option to something that wasn't a number.
252
 
css/ctf-admin-styles.css CHANGED
@@ -242,7 +242,7 @@
242
  max-width: 870px;
243
  margin-top: 10px;
244
  padding: 10px 10px 7px 10px;
245
-
246
  background: #E6F0E8;
247
  border: 1px solid #6AB074;
248
  color: #214F28;
@@ -748,4 +748,573 @@
748
  text-align: center;
749
  width: 20px;
750
  -webkit-font-smoothing: antialiased
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
751
  }
242
  max-width: 870px;
243
  margin-top: 10px;
244
  padding: 10px 10px 7px 10px;
245
+ clear: both;
246
  background: #E6F0E8;
247
  border: 1px solid #6AB074;
248
  color: #214F28;
748
  text-align: center;
749
  width: 20px;
750
  -webkit-font-smoothing: antialiased
751
+ }
752
+
753
+ /* Locator Summary */
754
+ .ctf-feed-locator-summary-wrap {
755
+ max-width: 1100px;
756
+ margin-bottom: 40px;
757
+ }
758
+ .ctf-full-wrap {
759
+ display: none;
760
+ }
761
+ .ctf-locator-more {
762
+ display: inline-block;
763
+ margin: 0 0 0 1px;
764
+ padding: 0 5px;
765
+ border: 1px solid rgba(0,0,0,0.1);
766
+ border-radius: 3px;
767
+ line-height: 1.6;
768
+ }
769
+
770
+ .ctf_shortcode_visible .ctf_locations_link {
771
+ display: none;
772
+ }
773
+ .ctf_locations_link a {
774
+ font-weight: normal;
775
+ text-decoration: none;
776
+ }
777
+ .ctf_locations_link svg {
778
+ width: 11px;
779
+ position: relative;
780
+ top: 1px;
781
+ }
782
+
783
+
784
+ /* More social feeds page */
785
+ #ctf-admin-about #ctf-admin-addons .addon-item .action-button .button.button-primary .fa-spinner {
786
+ color: #333;
787
+ }
788
+ #ctf-admin .ctf_more_plugins h2{
789
+ margin-top: 15px;
790
+ }
791
+ #ctf-admin .ctf_more_plugins #ctf-admin-addons .addons-container{
792
+ overflow: hidden;
793
+ margin: 0;
794
+ }
795
+ #ctf-admin .ctf_more_plugins#ctf-admin-about #ctf-admin-addons{
796
+ padding: 20px 0;
797
+ }
798
+ #ctf-admin .ctf-more-plugins-intro span{
799
+ color: #e34f0e;
800
+ }
801
+ #ctf-admin .ctf_more_plugins h3{
802
+ padding: 15px 0 0 0;
803
+ }
804
+ .sb_cross_install_modal .ctf-loader{
805
+ position: absolute;
806
+ left: 50%;
807
+ top: 50%;
808
+ margin: -10px 0 0 -10px;
809
+ }
810
+
811
+ /* Social Wall landing page */
812
+ #ctf-admin.sw-landing-page{
813
+ padding: 20px 0;
814
+ }
815
+ #ctf-admin .ctf-sw-icons{
816
+ width: 100%;
817
+ text-align: center;
818
+ }
819
+ #ctf-admin .ctf-sw-icons span{
820
+ display: inline-block;
821
+ width: 32px;
822
+ margin: 0 7px;
823
+ position: relative;
824
+ top: -2px;
825
+ }
826
+ #ctf-admin .ctf-sw-icons .ctf-sb-plus{
827
+ width: 12px;
828
+ height: 12px;
829
+ position: relative;
830
+ top: -12px;
831
+ opacity: 0.9;
832
+ }
833
+ #ctf-admin.sw-landing-page h1,
834
+ #ctf-admin.sw-landing-page h2{
835
+ width: 100%;
836
+ text-align: center;
837
+ }
838
+ #ctf-admin.sw-landing-page h1{
839
+ font-size: 44px;
840
+ margin: 20px 0 0 0;
841
+ line-height: 1.3;
842
+ }
843
+ #ctf-admin.sw-landing-page h2{
844
+ font-size: 30px;
845
+ font-weight: 100;
846
+ line-height: 1.2;
847
+ margin: 5px 0 20px 0;
848
+ }
849
+ #ctf-admin .ctf-sw-info{
850
+ width: 95%;
851
+ max-width: 1400px;
852
+ margin: 0 auto;
853
+ padding: 50px 10px;
854
+ clear: both;
855
+ overflow: hidden;
856
+ box-sizing: border-box;
857
+ }
858
+ #ctf-admin .ctf-sw-features{
859
+ float: left;
860
+ width: 40%;
861
+ margin-right: 5%;
862
+ padding: 20px 0 0 0;
863
+ }
864
+ #ctf-admin .ctf-sw-screenshot{
865
+ position: relative;
866
+ width: 55%;
867
+ float: left;
868
+ box-sizing: border-box;
869
+ border: 5px solid #fff;
870
+ box-shadow: 0 0 20px 0 rgba(0,0,0,0.05);
871
+ }
872
+ #ctf-admin .ctf-sw-features p{
873
+ margin: 35px 0;
874
+ padding: 0;
875
+ font-size: 15px;
876
+ }
877
+ #ctf-admin .ctf-sw-features p:first-child{
878
+ margin-top: 0;
879
+ }
880
+ #ctf-admin .ctf-sw-features span{
881
+ display: block;
882
+ font-size: 20px;
883
+ font-weight: bold;
884
+ }
885
+ #ctf-admin.sw-landing-page .cta {
886
+ margin: 20px 0 0 5px;
887
+ padding: 8px 40px 10px 40px;
888
+ font-size: 20px;
889
+ }
890
+ #ctf-admin .ctf-sw-screenshot img{
891
+ width: 100%;
892
+ display: block;
893
+ }
894
+ #ctf-admin .ctf-sw-screenshot .cta{
895
+ position: absolute;
896
+ top: 50%;
897
+ left: 50%;
898
+ margin-top: -32px;
899
+ margin-left: -80px;
900
+ padding: 15px 30px 17px 30px;
901
+ color: #333;
902
+ text-decoration: none;
903
+ background: rgba(255,255,255,0.95);
904
+ border-radius: 3px;
905
+ /*border: 2px solid rgba(0,0,0,0.1);*/
906
+ box-shadow: 0 0 20px 0 rgba(0,0,0,0.1);
907
+ }
908
+ #ctf-admin .ctf-sw-screenshot:hover .cta,
909
+ #ctf-admin .ctf-sw-screenshot:focus .cta{
910
+ background: #e34717;
911
+ color: #fff;
912
+ box-shadow: 0;
913
+ }
914
+ #ctf-admin .ctf-sw-footer-cta{
915
+ width: 100%;
916
+ text-align: center;
917
+ }
918
+ #ctf-admin .ctf-sw-footer-cta a{
919
+ font-size: 22px;
920
+ display: inline-block;
921
+ text-decoration: none;
922
+ line-height: 25px;
923
+ font-weight: normal;
924
+ padding: 10px 0 30px 0;
925
+ }
926
+ #ctf-admin .ctf-sw-footer-cta span{
927
+ width: 30px;
928
+ height: 30px;
929
+ display: inline-block;
930
+ margin: 0 10px 0 0;
931
+ position: relative;
932
+ top: 4px;
933
+ }
934
+ #ctf-admin .ctf-sw-footer-cta span .emoji{
935
+ width: 30px !important;
936
+ height: 30px !important;
937
+ }
938
+
939
+ @media all and (max-width: 1500px){
940
+ #ctf-admin .ctf-sw-screenshot{
941
+ width: 55%;
942
+ float: left;
943
+ height: 500px;
944
+ background: url('../img/sw-screenshot.png') no-repeat center center;
945
+ background-size: cover;
946
+ }
947
+ #ctf-admin .ctf-sw-screenshot img{
948
+ display: none;
949
+ }
950
+ }
951
+ @media all and (max-width: 900px){
952
+ #ctf-admin .ctf-sw-info{
953
+ padding: 20px 0;
954
+ }
955
+ #ctf-admin .ctf-sw-features{
956
+ width: 100%;
957
+ padding: 10px 0;
958
+ margin: 0;
959
+ }
960
+ #ctf-admin .ctf-sw-screenshot{
961
+ width: 100%;
962
+ padding: 0;
963
+ height: auto;
964
+ background: none;
965
+ }
966
+ #ctf-admin .ctf-sw-screenshot img{
967
+ display: block;
968
+ }
969
+ #ctf-admin .ctf-sw-features .cta {
970
+ width: 100%;
971
+ box-sizing: border-box;
972
+ text-align: center;
973
+ margin: 20px 0;
974
+ }
975
+ }
976
+
977
+ /* Install another plugin modal */
978
+ .sb_cross_install_modal {
979
+ position: fixed;
980
+ z-index: 999;
981
+ width: 100%;
982
+ top: 0;
983
+ right: 0;
984
+ bottom: 0;
985
+ left: 0;
986
+ background: rgba(0, 0, 0, 0.3);
987
+ }
988
+ .sb_cross_install_inner {
989
+ position: absolute;
990
+ top: 140px;
991
+ left: 50%;
992
+ width: 480px;
993
+ margin: 0 0 0 -245px;
994
+ padding: 35px;
995
+ background: #fff;
996
+ text-align: left;
997
+
998
+ -webkit-box-shadow: 0 1px 20px rgba(0, 0, 0, 0.2);
999
+ box-shadow: 0 1px 20px rgba(0, 0, 0, 0.2);
1000
+
1001
+ -moz-border-radius: 3px;
1002
+ -webkit-border-radius: 3px;
1003
+ border-radius: 3px;
1004
+ }
1005
+ .sb_cross_install_inner#ctf-admin-about #ctf-admin-addons .addon-container,
1006
+ .sb_cross_install_inner#ctf-admin-about #ctf-admin-addons .addons-container{
1007
+ width: 100%;
1008
+ margin: 0;
1009
+ padding: 0;
1010
+ min-height: 198px;
1011
+ }
1012
+ #ctf-admin-addons .addon-item .action-button button{
1013
+ background: #007cba;
1014
+ border: 0;
1015
+ }
1016
+ #ctf-admin-addons .addon-item .action-button button:hover{
1017
+ background: #0071a1;
1018
+ }
1019
+ .sb_cross_install_inner#ctf-admin-about #ctf-admin-addons{
1020
+ padding: 0;
1021
+ }
1022
+ /* More social feeds page */
1023
+ .sb_cross_install_inner#ctf-admin-about #ctf-admin-addons .addon-item .action-button .button.button-primary .fa-spinner {
1024
+ color: #333;
1025
+ }
1026
+ #ctf-admin .ctf_more_plugins h2{
1027
+ margin-top: 15px;
1028
+ }
1029
+ #ctf-admin .ctf_more_plugins #ctf-admin-addons .addons-container{
1030
+ overflow: hidden;
1031
+ margin: 0;
1032
+ }
1033
+ #ctf-admin .ctf_more_plugins#ctf-admin-about #ctf-admin-addons{
1034
+ padding: 20px 0;
1035
+ }
1036
+ #ctf-admin .ctf-more-plugins-intro span{
1037
+ color: #e34f0e;
1038
+ }
1039
+ #ctf-admin .ctf_more_plugins h3{
1040
+ padding: 15px 0 0 0;
1041
+ }
1042
+ .sb_cross_install_modal .ctf-loader{
1043
+ position: absolute;
1044
+ left: 50%;
1045
+ top: 50%;
1046
+ margin: -10px 0 0 -10px;
1047
+ }
1048
+ /* AW Addons */
1049
+ #ctf-admin-addons h3 {
1050
+ padding: 10px 10px 0 10px;
1051
+ clear: left;
1052
+ }
1053
+ #ctf-admin-addons *,#ctf-admin-addons *::before,#ctf-admin-addons *::after {
1054
+ -webkit-box-sizing: border-box;
1055
+ -moz-box-sizing: border-box;
1056
+ box-sizing: border-box
1057
+ }
1058
+
1059
+ #ctf-admin-addons .addons-container {
1060
+ margin-left: -20px;
1061
+ margin-right: -20px
1062
+ }
1063
+
1064
+ #ctf-admin-addons .unlock-msg {
1065
+ padding: 0 20px;
1066
+ margin-top: -20px;
1067
+ clear: both
1068
+ }
1069
+
1070
+ #ctf-admin-addons #ctf-admin-addons-search {
1071
+ background-color: #fff;
1072
+ border: 1px solid #ddd;
1073
+ border-radius: 3px;
1074
+ box-shadow: none;
1075
+ color: #333;
1076
+ vertical-align: middle;
1077
+ padding: 7px 12px;
1078
+ margin: -3px 10px 0 0;
1079
+ width: 200px;
1080
+ min-height: 35px;
1081
+ float: right
1082
+ }
1083
+
1084
+ #ctf-admin-addons #ctf-admin-addons-search:focus {
1085
+ border-color: #bbb
1086
+ }
1087
+
1088
+ #ctf-admin-addons .addon-container {
1089
+ padding: 0 20px;
1090
+ float: left;
1091
+ width: 33.333333%;
1092
+ margin-bottom: 20px
1093
+ }
1094
+
1095
+ @media (max-width: 1249px) {
1096
+ #ctf-admin-addons .addon-container {
1097
+ width:50%
1098
+ }
1099
+ }
1100
+
1101
+ @media (max-width: 767px) {
1102
+ #ctf-admin-addons .addon-container {
1103
+ width:100%;
1104
+ margin-bottom: 20px
1105
+ }
1106
+ }
1107
+
1108
+ #ctf-admin-addons h4 {
1109
+ font-size: 17px;
1110
+ font-weight: 700
1111
+ }
1112
+
1113
+ #ctf-admin-addons .addon-item {
1114
+ background-color: #fff;
1115
+ border: 1px solid #ddd;
1116
+ border-radius: 3px;
1117
+ margin: 0
1118
+ }
1119
+
1120
+ @media (max-width: 767px) {
1121
+ #ctf-admin-addons .addon-item {
1122
+ margin:0 0
1123
+ }
1124
+ }
1125
+
1126
+ #ctf-admin-addons .addon-item img {
1127
+ border: 1px solid #eee;
1128
+ float: left;
1129
+ max-width: 75px
1130
+ }
1131
+
1132
+ #ctf-admin-addons .addon-item h5 {
1133
+ margin: 0 0 10px 100px;
1134
+ font-size: 16px
1135
+ }
1136
+
1137
+ #ctf-admin-addons .addon-item p {
1138
+ margin: 0 0 0 100px
1139
+ }
1140
+
1141
+ #ctf-admin-addons .addon-item .details {
1142
+ padding: 30px 20px
1143
+ }
1144
+
1145
+ #ctf-admin-addons .addon-item .actions {
1146
+ background-color: #f7f7f7;
1147
+ border-top: 1px solid #ddd;
1148
+ padding: 20px;
1149
+ position: relative
1150
+ }
1151
+
1152
+ #ctf-admin-addons .addon-item .actions .msg {
1153
+ background-color: #f7f7f7;
1154
+ position: absolute;
1155
+ text-align: center;
1156
+ font-weight: 600;
1157
+ top: 0;
1158
+ left: 0;
1159
+ height: 100%;
1160
+ width: 100%;
1161
+ z-index: 99;
1162
+ padding: 20px;
1163
+ display: -webkit-box;
1164
+ display: -moz-box;
1165
+ display: -ms-flexbox;
1166
+ display: -webkit-flex;
1167
+ display: flex;
1168
+ -webkit-align-items: center;
1169
+ -ms-align-items: center;
1170
+ align-items: center;
1171
+ justify-content: center
1172
+ }
1173
+
1174
+ #ctf-admin-addons .addon-item .actions .msg.success {
1175
+ color: #2a9b39
1176
+ }
1177
+
1178
+ #ctf-admin-addons .addon-item .actions .msg.error {
1179
+ color: red
1180
+ }
1181
+
1182
+ #ctf-admin-addons .addon-item .status {
1183
+ float: left;
1184
+ padding-top: 8px
1185
+ }
1186
+
1187
+ #ctf-admin-addons .addon-item .status .status-inactive {
1188
+ color: red
1189
+ }
1190
+
1191
+ #ctf-admin-addons .addon-item .status .status-download {
1192
+ color: #666
1193
+ }
1194
+
1195
+ #ctf-admin-addons .addon-item .status .status-active {
1196
+ color: #2a9b39
1197
+ }
1198
+
1199
+ #ctf-admin-addons .addon-item .upgrade-button {
1200
+ text-align: center
1201
+ }
1202
+
1203
+ #ctf-admin-addons .addon-item .upgrade-button a {
1204
+ font-weight: 600;
1205
+ width: 140px;
1206
+ text-align: center;
1207
+ padding: 8px 5px
1208
+ }
1209
+
1210
+ #ctf-admin-about #ctf-admin-addons .addon-item .action-button .button {
1211
+ display: inline-block;
1212
+ text-decoration: none;
1213
+ font-size: 13px;
1214
+ line-height: 26px;
1215
+ height: 28px;
1216
+ margin: 0;
1217
+ padding: 0 10px 1px;
1218
+ cursor: pointer;
1219
+ -webkit-appearance: none;
1220
+ border-radius: 3px;
1221
+ border: 1px solid #cccccc;
1222
+ background: #f7f7f7;
1223
+ box-shadow: 0 1px 0 #cccccc;
1224
+ font-weight: normal
1225
+ }
1226
+
1227
+ #ctf-admin-about #ctf-admin-addons .addon-item .action-button .button:hover,#ctf-admin-about #ctf-admin-addons .addon-item .action-button .button:focus {
1228
+ background: #fafafa;
1229
+ border-color: #999;
1230
+ color: #23282d
1231
+ }
1232
+
1233
+ #ctf-admin-about #ctf-admin-addons .addon-item .action-button .button.button-primary {
1234
+ background: #0085ba;
1235
+ border-color: #0073aa #006799 #006799;
1236
+ box-shadow: 0 1px 0 #006799;
1237
+ color: #fff;
1238
+ text-shadow: 0 -1px 1px #006799, 1px 0 1px #006799, 0 1px 1px #006799, -1px 0 1px #006799
1239
+ }
1240
+
1241
+ #ctf-admin-about #ctf-admin-addons .addon-item .action-button .button.button-primary:hover,#ctf-admin-about #ctf-admin-addons .addon-item .action-button .button.button-primary:focus {
1242
+ background: #008ec2;
1243
+ border-color: #006799;
1244
+ color: #fff
1245
+ }
1246
+
1247
+ #ctf-admin #ctf-admin-about #ctf-admin-addons .addon-item .action-button .button.button-primary .fa-spinner {
1248
+ color: #fff
1249
+ }
1250
+
1251
+ #ctf-admin-about #ctf-admin-addons .addon-item .action-button .button.button-secondary {
1252
+ color: #555;
1253
+ border-color: #cccccc;
1254
+ background: #f7f7f7;
1255
+ box-shadow: 0 1px 0 #cccccc
1256
+ }
1257
+
1258
+ #ctf-admin-about #ctf-admin-addons .addon-item .action-button .button.button-secondary:hover,#ctf-admin-about #ctf-admin-addons .addon-item .action-button .button.button-secondary:focus {
1259
+ background: #fafafa;
1260
+ border-color: #999;
1261
+ color: #23282d
1262
+ }
1263
+
1264
+ #ctf-admin-about #ctf-admin-addons .addon-item .action-button .button.disabled {
1265
+ cursor: default
1266
+ }
1267
+
1268
+
1269
+ #ctf-admin-addons .addon-item .action-button {
1270
+ float: right
1271
+ }
1272
+
1273
+ #ctf-admin-addons .addon-item .action-button button {
1274
+ background: none;
1275
+ border: 1px solid #ddd;
1276
+ border-radius: 3px;
1277
+ box-shadow: none;
1278
+ cursor: pointer;
1279
+ font-weight: 600;
1280
+ width: 140px;
1281
+ text-align: center;
1282
+ padding: 8px 5px
1283
+ }
1284
+
1285
+ #ctf-admin-addons .addon-item .action-button button:hover,#ctf-admin-addons .addon-item .action-button button.loading {
1286
+ background-color: #e9e9e9
1287
+ }
1288
+
1289
+ #ctf-admin-addons .addon-item .action-button button .fa {
1290
+ margin-right: 8px
1291
+ }
1292
+
1293
+ #ctf-admin-addons .addon-item .action-button button .fa.fa-spinner {
1294
+ margin-right: 0
1295
+ }
1296
+
1297
+ #ctf-admin-addons .addon-item .action-button button.status-active .fa {
1298
+ color: #2a9b39
1299
+ }
1300
+
1301
+ #ctf-admin-addons .addon-item .action-button button.status-inactive .fa {
1302
+ color: red
1303
+ }
1304
+
1305
+ #ctf-admin-addons .addon-item .action-button button.status-download .fa {
1306
+ color: #999
1307
+ }
1308
+
1309
+ #ctf-admin-addons .addon-item .action-button button.disabled {
1310
+ cursor: default
1311
+ }
1312
+
1313
+ #ctf-admin-addons .addon-item .action-button button.loading .fa {
1314
+ color: #666
1315
+ }
1316
+ .ctf-clear:after{
1317
+ display: table;
1318
+ content: "";
1319
+ clear: both;
1320
  }
custom-twitter-feed.php CHANGED
@@ -3,13 +3,13 @@
3
  Plugin Name: Custom Twitter Feeds
4
  Plugin URI: http://smashballoon.com/custom-twitter-feeds
5
  Description: Customizable Twitter feeds for your website
6
- Version: 1.7
7
  Author: Smash Balloon
8
  Author URI: http://smashballoon.com/
9
  Text Domain: custom-twitter-feeds
10
  */
11
  /*
12
- Copyright 2020 Smash Balloon LLC (email : hey@smashballoon.com)
13
  This program is free software; you can redistribute it and/or modify
14
  it under the terms of the GNU General Public License as published by
15
  the Free Software Foundation; either version 2 of the License, or
@@ -24,7 +24,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24
  */
25
 
26
  define( 'CTF_URL', plugin_dir_path( __FILE__ ) );
27
- define( 'CTF_VERSION', '1.7' );
28
  define( 'CTF_TITLE', 'Custom Twitter Feeds' );
29
  define( 'CTF_JS_URL', plugins_url( '/js/ctf-scripts.min.js?ver=' . CTF_VERSION , __FILE__ ) );
30
  define( 'OAUTH_PROCESSOR_URL', 'https://api.smashballoon.com/twitter-login.php?return_uri=' );
@@ -38,7 +38,10 @@ if ( ! defined( 'CTF_PLUGIN_URL' ) ) {
38
  }
39
  // Db version.
40
  if ( ! defined( 'CTF_DBVERSION' ) ) {
41
- define( 'CTF_DBVERSION', '1.0' );
 
 
 
42
  }
43
 
44
  if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
@@ -56,6 +59,7 @@ function ctf_plugin_init() {
56
  $ctf_blocks->load();
57
  }
58
 
 
59
  include_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/class-ctf-tracking.php';
60
  include_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/class-ctf-gdpr-integrations.php';
61
 
@@ -69,6 +73,8 @@ function ctf_plugin_init() {
69
  require_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/admin/class-ctf-new-user.php';
70
  $ctf_new_user = new CTF_New_User();
71
  $ctf_new_user->init();
 
 
72
  }
73
  }
74
  }
@@ -133,6 +139,14 @@ function ctf_check_for_db_updates() {
133
  update_option( 'ctf_db_version', CTF_DBVERSION );
134
  }
135
 
 
 
 
 
 
 
 
 
136
  }
137
  add_action( 'wp_loaded', 'ctf_check_for_db_updates' );
138
 
@@ -205,6 +219,22 @@ function ctf_get_more_posts() {
205
  $twitter_feed->maybeCacheTweets();
206
  }
207
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208
  echo $twitter_feed->getTweetSetHtml( $is_pagination );
209
 
210
  die();
@@ -212,12 +242,61 @@ function ctf_get_more_posts() {
212
  add_action( 'wp_ajax_nopriv_ctf_get_more_posts', 'ctf_get_more_posts' );
213
  add_action( 'wp_ajax_ctf_get_more_posts', 'ctf_get_more_posts' );
214
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
215
  function ctf_plugin_action_links( $links ) {
216
  $links[] = '<a href="'. esc_url( get_admin_url( null, 'admin.php?page=custom-twitter-feeds' ) ) .'">' . __( 'Settings' ) . '</a>';
217
  return $links;
218
  }
219
  add_filter( 'plugin_action_links_' . plugin_basename(__FILE__), 'ctf_plugin_action_links' );
220
 
 
 
 
 
 
 
 
 
221
  /**
222
  * the html output is controlled by the user selecting which portions of tweets to show
223
  *
@@ -599,8 +678,43 @@ function ctf_admin_scripts_and_styles() {
599
  'sb_nonce' => wp_create_nonce( 'ctf-smash-balloon' )
600
  )
601
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
602
  wp_enqueue_style( 'wp-color-picker' );
603
  wp_enqueue_script( 'wp-color-picker' );
 
 
 
 
 
 
 
604
  }
605
  add_action( 'admin_enqueue_scripts', 'ctf_admin_scripts_and_styles' );
606
 
3
  Plugin Name: Custom Twitter Feeds
4
  Plugin URI: http://smashballoon.com/custom-twitter-feeds
5
  Description: Customizable Twitter feeds for your website
6
+ Version: 1.8
7
  Author: Smash Balloon
8
  Author URI: http://smashballoon.com/
9
  Text Domain: custom-twitter-feeds
10
  */
11
  /*
12
+ Copyright 2021 Smash Balloon LLC (email : hey@smashballoon.com)
13
  This program is free software; you can redistribute it and/or modify
14
  it under the terms of the GNU General Public License as published by
15
  the Free Software Foundation; either version 2 of the License, or
24
  */
25
 
26
  define( 'CTF_URL', plugin_dir_path( __FILE__ ) );
27
+ define( 'CTF_VERSION', '1.8' );
28
  define( 'CTF_TITLE', 'Custom Twitter Feeds' );
29
  define( 'CTF_JS_URL', plugins_url( '/js/ctf-scripts.min.js?ver=' . CTF_VERSION , __FILE__ ) );
30
  define( 'OAUTH_PROCESSOR_URL', 'https://api.smashballoon.com/twitter-login.php?return_uri=' );
38
  }
39
  // Db version.
40
  if ( ! defined( 'CTF_DBVERSION' ) ) {
41
+ define( 'CTF_DBVERSION', '1.0.1' );
42
+ }
43
+ if ( ! defined( 'CTF_FEED_LOCATOR' ) ) {
44
+ define( 'CTF_FEED_LOCATOR', 'ctf_feed_locator' );
45
  }
46
 
47
  if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
59
  $ctf_blocks->load();
60
  }
61
 
62
+ include_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/class-ctf-feed-locator.php';
63
  include_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/class-ctf-tracking.php';
64
  include_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/class-ctf-gdpr-integrations.php';
65
 
73
  require_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/admin/class-ctf-new-user.php';
74
  $ctf_new_user = new CTF_New_User();
75
  $ctf_new_user->init();
76
+
77
+ require_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/admin/addon-functions.php';
78
  }
79
  }
80
  }
139
  update_option( 'ctf_db_version', CTF_DBVERSION );
140
  }
141
 
142
+ if ( version_compare( $db_ver, '1.0.1', '<' ) ) {
143
+ include_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/class-ctf-feed-locator.php';
144
+
145
+ CTF_Feed_Locator::create_table();
146
+
147
+ update_option( 'ctf_db_version', CTF_DBVERSION );
148
+ }
149
+
150
  }
151
  add_action( 'wp_loaded', 'ctf_check_for_db_updates' );
152
 
219
  $twitter_feed->maybeCacheTweets();
220
  }
221
 
222
+ $atts = $shortcode_data;
223
+
224
+ $feed_id = isset( $_POST['feed_id'] ) ? sanitize_text_field( $_POST['feed_id'] ) : 'unknown';
225
+ $location = isset( $_POST['location'] ) && in_array( $_POST['location'], array( 'header', 'footer', 'sidebar', 'content' ), true ) ? sanitize_text_field( $_POST['location'] ) : 'unknown';
226
+ $post_id = isset( $_POST['post_id'] ) && $_POST['post_id'] !== 'unknown' ? (int)$_POST['post_id'] : 'unknown';
227
+ $feed_details = array(
228
+ 'feed_id' => $feed_id,
229
+ 'atts' => $atts,
230
+ 'location' => array(
231
+ 'post_id' => $post_id,
232
+ 'html' => $location
233
+ )
234
+ );
235
+
236
+ ctf_do_background_tasks( $feed_details );
237
+
238
  echo $twitter_feed->getTweetSetHtml( $is_pagination );
239
 
240
  die();
242
  add_action( 'wp_ajax_nopriv_ctf_get_more_posts', 'ctf_get_more_posts' );
243
  add_action( 'wp_ajax_ctf_get_more_posts', 'ctf_get_more_posts' );
244
 
245
+ function ctf_do_locator() {
246
+ if ( ! isset( $_POST['feed_id'] ) || strpos( $_POST['feed_id'], 'ctf' ) === false ) {
247
+ die( 'invalid feed ID');
248
+ }
249
+
250
+ $feed_id = sanitize_text_field( $_POST['feed_id'] );
251
+
252
+ $atts_raw = isset( $_POST['atts'] ) ? json_decode( stripslashes( $_POST['atts'] ), true ) : array();
253
+ if ( is_array( $atts_raw ) ) {
254
+ array_map( 'sanitize_text_field', $atts_raw );
255
+ } else {
256
+ $atts_raw = array();
257
+ }
258
+ $atts = $atts_raw; // now sanitized
259
+
260
+ $location = isset( $_POST['location'] ) && in_array( $_POST['location'], array( 'header', 'footer', 'sidebar', 'content' ), true ) ? sanitize_text_field( $_POST['location'] ) : 'unknown';
261
+ $post_id = isset( $_POST['post_id'] ) && $_POST['post_id'] !== 'unknown' ? (int)$_POST['post_id'] : 'unknown';
262
+ $feed_details = array(
263
+ 'feed_id' => $feed_id,
264
+ 'atts' => $atts,
265
+ 'location' => array(
266
+ 'post_id' => $post_id,
267
+ 'html' => $location
268
+ )
269
+ );
270
+
271
+ ctf_do_background_tasks( $feed_details );
272
+
273
+ wp_die( 'locating success' );
274
+ }
275
+ add_action( 'wp_ajax_ctf_do_locator', 'ctf_do_locator' );
276
+ add_action( 'wp_ajax_nopriv_ctf_do_locator', 'ctf_do_locator' );
277
+
278
+ function ctf_do_background_tasks( $feed_details ) {
279
+ $locator = new CTF_Feed_Locator( $feed_details );
280
+ $locator->add_or_update_entry();
281
+ if ( $locator->should_clear_old_locations() ) {
282
+ $locator->delete_old_locations();
283
+ }
284
+ }
285
+
286
  function ctf_plugin_action_links( $links ) {
287
  $links[] = '<a href="'. esc_url( get_admin_url( null, 'admin.php?page=custom-twitter-feeds' ) ) .'">' . __( 'Settings' ) . '</a>';
288
  return $links;
289
  }
290
  add_filter( 'plugin_action_links_' . plugin_basename(__FILE__), 'ctf_plugin_action_links' );
291
 
292
+ function ctf_json_encode( $thing ) {
293
+ if ( function_exists( 'wp_json_encode' ) ) {
294
+ return wp_json_encode( $thing );
295
+ } else {
296
+ return json_encode( $thing );
297
+ }
298
+ }
299
+
300
  /**
301
  * the html output is controlled by the user selecting which portions of tweets to show
302
  *
678
  'sb_nonce' => wp_create_nonce( 'ctf-smash-balloon' )
679
  )
680
  );
681
+ $strings = array(
682
+ 'addon_activate' => esc_html__( 'Activate', 'custom-twitter-feeds' ),
683
+ 'addon_activated' => esc_html__( 'Activated', 'custom-twitter-feeds' ),
684
+ 'addon_active' => esc_html__( 'Active', 'custom-twitter-feeds' ),
685
+ 'addon_deactivate' => esc_html__( 'Deactivate', 'custom-twitter-feeds' ),
686
+ 'addon_inactive' => esc_html__( 'Inactive', 'custom-twitter-feeds' ),
687
+ 'addon_install' => esc_html__( 'Install Addon', 'custom-twitter-feeds' ),
688
+ 'addon_error' => esc_html__( 'Could not install addon. Please download from wpforms.com and install manually.', 'custom-twitter-feeds' ),
689
+ 'plugin_error' => esc_html__( 'Could not install a plugin. Please download from WordPress.org and install manually.', 'custom-twitter-feeds' ),
690
+ 'addon_search' => esc_html__( 'Searching Addons', 'custom-twitter-feeds' ),
691
+ 'ajax_url' => admin_url( 'admin-ajax.php' ),
692
+ 'cancel' => esc_html__( 'Cancel', 'custom-twitter-feeds' ),
693
+ 'close' => esc_html__( 'Close', 'custom-twitter-feeds' ),
694
+ 'nonce' => wp_create_nonce( 'ctf-admin' ),
695
+ 'almost_done' => esc_html__( 'Almost Done', 'custom-twitter-feeds' ),
696
+ 'oops' => esc_html__( 'Oops!', 'custom-twitter-feeds' ),
697
+ 'ok' => esc_html__( 'OK', 'custom-twitter-feeds' ),
698
+ 'plugin_install_activate_btn' => esc_html__( 'Install and Activate', 'custom-twitter-feeds' ),
699
+ 'plugin_install_activate_confirm' => esc_html__( 'needs to be installed and activated to import its forms. Would you like us to install and activate it for you?', 'custom-twitter-feeds' ),
700
+ 'plugin_activate_btn' => esc_html__( 'Activate', 'custom-twitter-feeds' ),
701
+ );
702
+ $strings = apply_filters( 'ctf_admin_strings', $strings );
703
+
704
+ wp_localize_script(
705
+ 'ctf_admin_scripts',
706
+ 'ctf_admin_strings',
707
+ $strings
708
+ );
709
  wp_enqueue_style( 'wp-color-picker' );
710
  wp_enqueue_script( 'wp-color-picker' );
711
+ wp_enqueue_script(
712
+ 'jquery-matchheight',
713
+ CTF_PLUGIN_URL . 'js/jquery.matchHeight-min.js',
714
+ array( 'jquery' ),
715
+ '0.7.0',
716
+ false
717
+ );
718
  }
719
  add_action( 'admin_enqueue_scripts', 'ctf_admin_scripts_and_styles' );
720
 
img/about/plugin-fb.png ADDED
Binary file
img/about/plugin-if.png ADDED
Binary file
img/about/plugin-tw.jpg ADDED
Binary file
img/about/plugin-yt.png ADDED
Binary file
img/sw-screenshot.png ADDED
Binary file
inc/CtfAdmin.php CHANGED
@@ -47,7 +47,54 @@ class CtfAdmin
47
  'custom-twitter-feeds-style',
48
  array( $this, 'create_submenu_page_style' )
49
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  }
 
51
 
52
  public static function get_active_tab( $tab = '' )
53
  {
@@ -60,6 +107,10 @@ class CtfAdmin
60
  return 'display';
61
  case 'support':
62
  return 'support';
 
 
 
 
63
  default:
64
  return 'configure';
65
  }
@@ -84,6 +135,11 @@ class CtfAdmin
84
  require_once CTF_URL . '/views/admin/main.php';
85
  }
86
 
 
 
 
 
 
87
  public function general_section_text()
88
  {
89
  // no explanation needed
@@ -217,13 +273,20 @@ class CtfAdmin
217
  'ctf_options_feed_settings' // matches the section name
218
  );
219
 
 
 
 
 
 
 
 
220
  // User Timeline Radio
221
  $this->create_settings_field( array(
222
  'name' => 'usertimeline',
223
- 'title' => '<label for="ctf_feed_type">Feed Type</label><code class="ctf_shortcode">type
224
  Eg: screenname=gopro
225
  Eg: home=true
226
- Eg: hashtag=#cats</code>', // label for the input field
227
  'callback' => 'feed_settings_radio', // name of the function that outputs the html
228
  'page' => 'ctf_options_feed_settings', // matches the section name
229
  'section' => 'ctf_options_feed_settings', // matches the section name
47
  'custom-twitter-feeds-style',
48
  array( $this, 'create_submenu_page_style' )
49
  );
50
+
51
+ //Show a Instagram plugin menu item if it isn't already installed
52
+ if( !is_plugin_active( 'instagram-feed/instagram-feed.php' ) && !is_plugin_active( 'instagram-feed-pro/instagram-feed.php' ) ){
53
+ add_submenu_page(
54
+ 'custom-twitter-feeds',
55
+ __( 'Instagram Feed', 'ctf' ),
56
+ '<span class="ctf_get_sbi"><svg style="height: 14px; margin: 0 8px 0 0; position: relative; top: 2px;" aria-hidden="true" focusable="false" data-prefix="fab" data-icon="instagram" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" class="svg-inline--fa fa-instagram fa-w-14 fa-2x"><path fill="currentColor" d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z" class=""></path></svg>' . __( 'Instagram Feed', 'ctf' ) . '</span>',
57
+ 'manage_options',
58
+ 'admin.php?page=custom-twitter-feeds&tab=more',
59
+ ''
60
+ );
61
+ }
62
+
63
+ //Show a Instagram plugin menu item if it isn't already installed
64
+ if( !is_plugin_active( 'custom-facebook-feed/custom-facebook-feed.php' ) && !is_plugin_active( 'custom-facebook-feed-pro/custom-facebook-feed.php' ) ){
65
+ add_submenu_page(
66
+ 'custom-twitter-feeds',
67
+ __( 'Facebook Feed', 'ctf' ),
68
+ '<span class="ctf_get_cff"><svg style="height: 14px; margin: 0 8px 0 0; position: relative; top: 2px;" aria-hidden="true" focusable="false" data-prefix="fab" data-icon="facebook" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="svg-inline--fa fa-facebook fa-w-16 fa-2x"><path fill="currentColor" d="M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z" class=""></path></svg>' . __( 'Facebook Feed', 'ctf' ) . '</span>',
69
+ 'manage_options',
70
+ 'admin.php?page=custom-twitter-feeds&tab=more',
71
+ ''
72
+ );
73
+ }
74
+
75
+ //Show a YouTube plugin menu item if it isn't already installed
76
+ if( !is_plugin_active( 'feeds-for-youtube/youtube-feed.php' ) && !is_plugin_active( 'youtube-feed-pro/youtube-feed.php' ) ){
77
+ add_submenu_page(
78
+ 'custom-twitter-feeds',
79
+ __( 'YouTube Feed', 'ctf' ),
80
+ '<span class="ctf_get_yt"><svg style="height: 14px; margin: 0 8px 0 0; position: relative; top: 2px;" aria-hidden="true" focusable="false" data-prefix="fab" data-icon="youtube" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" class="svg-inline--fa fa-youtube fa-w-18 fa-2x"><path fill="currentColor" d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z" class=""></path></svg>' . __( 'YouTube Feed', 'ctf' ) . '</span>',
81
+ 'manage_options',
82
+ 'admin.php?page=custom-twitter-feeds&tab=more',
83
+ ''
84
+ );
85
+ }
86
+
87
+ add_submenu_page(
88
+ 'custom-twitter-feeds',
89
+ __( 'Social Wall', 'ctf' ),
90
+ '<span><svg style="height: 14px; margin: 0 8px 0 0; position: relative; top: 2px;" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="th" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="svg-inline--fa fa-th fa-w-16 fa-2x"><path fill="currentColor" d="M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24zm181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24zm32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24zm-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24zm-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24zM0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zm386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zm0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zM181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24z" class=""></path></svg>' . __( 'Social Wall', 'ctf' ) . '</span>',
91
+ 'manage_options',
92
+ 'ctf-sw',
93
+ array( $this, 'social_wall_page' )
94
+ );
95
+
96
  }
97
+
98
 
99
  public static function get_active_tab( $tab = '' )
100
  {
107
  return 'display';
108
  case 'support':
109
  return 'support';
110
+ case 'allfeeds':
111
+ return 'allfeeds';
112
+ case 'more':
113
+ return 'more';
114
  default:
115
  return 'configure';
116
  }
135
  require_once CTF_URL . '/views/admin/main.php';
136
  }
137
 
138
+
139
+ public function social_wall_page() {
140
+ require_once CTF_URL .'views/admin/social-wall.php';
141
+ }
142
+
143
  public function general_section_text()
144
  {
145
  // no explanation needed
273
  'ctf_options_feed_settings' // matches the section name
274
  );
275
 
276
+ $locator_html = '';
277
+ if ( CTF_Feed_Locator::count_unique() > 1 ) {
278
+ $locator_html .= '<div class="ctf_locations_link">';
279
+ $locator_html .= '<a href="?page=custom-twitter-feeds&amp;tab=allfeeds"><svg aria-hidden="true" focusable="false" data-prefix="far" data-icon="search" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="svg-inline--fa fa-search fa-w-16 fa-2x"><path fill="currentColor" d="M508.5 468.9L387.1 347.5c-2.3-2.3-5.3-3.5-8.5-3.5h-13.2c31.5-36.5 50.6-84 50.6-136C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c52 0 99.5-19.1 136-50.6v13.2c0 3.2 1.3 6.2 3.5 8.5l121.4 121.4c4.7 4.7 12.3 4.7 17 0l22.6-22.6c4.7-4.7 4.7-12.3 0-17zM208 368c-88.4 0-160-71.6-160-160S119.6 48 208 48s160 71.6 160 160-71.6 160-160 160z" class=""></path></svg> ' . __( 'Feed Finder', 'custom-twitter-feeds' ) . '</a>';
280
+ $locator_html .= '</div>';
281
+ }
282
+
283
  // User Timeline Radio
284
  $this->create_settings_field( array(
285
  'name' => 'usertimeline',
286
+ 'title' => '<label for="ctf_feed_type">Select a Feed Type</label><code class="ctf_shortcode">type
287
  Eg: screenname=gopro
288
  Eg: home=true
289
+ Eg: hashtag=#cats</code>' . $locator_html, // label for the input field
290
  'callback' => 'feed_settings_radio', // name of the function that outputs the html
291
  'page' => 'ctf_options_feed_settings', // matches the section name
292
  'section' => 'ctf_options_feed_settings', // matches the section name
inc/CtfFeed.php CHANGED
@@ -1369,6 +1369,17 @@ class CtfFeed
1369
  return $twitter_connect->performRequest();
1370
  }
1371
 
 
 
 
 
 
 
 
 
 
 
 
1372
  /**
1373
  * If the feed runs out of tweets to display for some reason,
1374
  * this function creates a graceful failure message
@@ -1413,13 +1424,23 @@ class CtfFeed
1413
  $ctf_feed_classes = apply_filters( 'ctf_feed_classes', $ctf_feed_classes ); //add_filter( 'ctf_feed_classes', function( $ctf_feed_classes ) { return $ctf_feed_classes . ' new-class'; }, 10, 1 );
1414
  $ctf_feed_html = '';
1415
 
1416
- $gdpr_att = '';
 
1417
  if ( CTF_GDPR_Integrations::doing_gdpr( $feed_options ) ) {
1418
- $gdpr_att = ' ctf-gdpr="1"';
 
 
 
 
 
 
 
1419
  }
 
 
1420
 
1421
  $ctf_feed_html .= '<!-- Custom Twitter Feeds by Smash Balloon -->';
1422
- $ctf_feed_html .= '<div id="ctf" class="' . $ctf_feed_classes . '" style="' . $feed_options['width'] . $feed_options['height'] . $feed_options['bgcolor'] . '" data-ctfshortcode="' . $this->getShortCodeJSON() . '"' .$ctf_data_disablelinks . $ctf_data_linktextcolor . $ctf_enable_intents . $gdpr_att .' data-ctfneeded="'. $ctf_data_needed .'">';
1423
  $tweet_set = $this->tweet_set;
1424
 
1425
  // dynamically include header
@@ -1496,7 +1517,7 @@ class CtfFeed
1496
  $ctf_header_html .= '<span class="ctf-verified">' . ctf_get_fa_el( 'fa-check-circle' ) . '</span>';
1497
  }
1498
 
1499
- $ctf_header_html .= '<span class="ctf-header-follow">' . ctf_get_fa_el( 'fa-twitter' ) . 'Follow</span>';
1500
  $ctf_header_html .= '</p>';
1501
 
1502
  if ( $feed_options['showbio'] && !empty($tweet_set[0]['user']['description']) ) {
@@ -1654,7 +1675,7 @@ class CtfFeed
1654
  if ( isset( $retweeter ) && ctf_show( 'retweeter', $feed_options ) ) {
1655
  $tweet_html .= '<div class="ctf-context">';
1656
  $tweet_html .= '<a href="https://twitter.com/intent/user?screen_name=' . $retweeter['screen_name'] . '" target="_blank" rel="noopener noreferrer" class="ctf-retweet-icon">' . ctf_get_fa_el( 'fa-retweet' ) . '<span class="ctf-screenreader">'.__( 'Retweet on Twitter', 'custom-twitter-feeds' ).'</span></a>';
1657
- $tweet_html .= '<a href="https://twitter.com/' . $retweeter['screen_name'] . '" target="_blank" rel="noopener noreferrer" class="ctf-retweet-text" style="' . $feed_options['authortextsize'] . $feed_options['authortextweight'] . $feed_options['textcolor'] . '">' . $retweeter['name'] . ' ' . $feed_options['retweetedtext'] . '</a>';
1658
  $tweet_html .= '</div>';
1659
  }
1660
 
1369
  return $twitter_connect->performRequest();
1370
  }
1371
 
1372
+ public function feedID() {
1373
+ if ( $this->feed_options['persistentcache'] ) {
1374
+ $feed_id = substr( 'ctf_!_' . $this->feed_options['feed_term'], 0, 45 );
1375
+ $feed_id = str_replace( ' -filter:retweets', '', $feed_id );
1376
+ } else {
1377
+ $feed_id = $this->transient_name;
1378
+ }
1379
+
1380
+ return $feed_id;
1381
+ }
1382
+
1383
  /**
1384
  * If the feed runs out of tweets to display for some reason,
1385
  * this function creates a graceful failure message
1424
  $ctf_feed_classes = apply_filters( 'ctf_feed_classes', $ctf_feed_classes ); //add_filter( 'ctf_feed_classes', function( $ctf_feed_classes ) { return $ctf_feed_classes . ' new-class'; }, 10, 1 );
1425
  $ctf_feed_html = '';
1426
 
1427
+ $flags_att = '';
1428
+ $flags = array();
1429
  if ( CTF_GDPR_Integrations::doing_gdpr( $feed_options ) ) {
1430
+ $flags[] = 'gdpr';
1431
+ }
1432
+ if ( ! is_admin()
1433
+ && CTF_Feed_Locator::should_do_ajax_locating( $this->feedID(), get_the_ID() ) ) {
1434
+ $flags[] = 'locator';
1435
+ }
1436
+ if ( ! empty( $flags ) ) {
1437
+ $flags_att = ' data-ctf-flags="' . implode( ',', $flags ) . '"';
1438
  }
1439
+ $post_id_att = ' data-postid="' . esc_attr( get_the_ID() ) . '"';
1440
+ $feed_id_att = ' data-feed-id="' . $this->feedID() . '"';
1441
 
1442
  $ctf_feed_html .= '<!-- Custom Twitter Feeds by Smash Balloon -->';
1443
+ $ctf_feed_html .= '<div id="ctf" class="' . $ctf_feed_classes . '" style="' . $feed_options['width'] . $feed_options['height'] . $feed_options['bgcolor'] . '" data-ctfshortcode="' . $this->getShortCodeJSON() . '"' .$ctf_data_disablelinks . $ctf_data_linktextcolor . $ctf_enable_intents . $flags_att . $post_id_att . $feed_id_att .' data-ctfneeded="'. $ctf_data_needed .'">';
1444
  $tweet_set = $this->tweet_set;
1445
 
1446
  // dynamically include header
1517
  $ctf_header_html .= '<span class="ctf-verified">' . ctf_get_fa_el( 'fa-check-circle' ) . '</span>';
1518
  }
1519
 
1520
+ $ctf_header_html .= '<span class="ctf-header-follow">' . ctf_get_fa_el( 'fa-twitter' ) . __( 'Follow', 'custom-twitter-feeds' ) . '</span>';
1521
  $ctf_header_html .= '</p>';
1522
 
1523
  if ( $feed_options['showbio'] && !empty($tweet_set[0]['user']['description']) ) {
1675
  if ( isset( $retweeter ) && ctf_show( 'retweeter', $feed_options ) ) {
1676
  $tweet_html .= '<div class="ctf-context">';
1677
  $tweet_html .= '<a href="https://twitter.com/intent/user?screen_name=' . $retweeter['screen_name'] . '" target="_blank" rel="noopener noreferrer" class="ctf-retweet-icon">' . ctf_get_fa_el( 'fa-retweet' ) . '<span class="ctf-screenreader">'.__( 'Retweet on Twitter', 'custom-twitter-feeds' ).'</span></a>';
1678
+ $tweet_html .= '<a href="https://twitter.com/' . $retweeter['screen_name'] . '" target="_blank" rel="noopener noreferrer" class="ctf-retweet-text" style="' . $feed_options['authortextsize'] . $feed_options['authortextweight'] . $feed_options['textcolor'] . '">' . $retweeter['name'] . ' ' . __( $feed_options['retweetedtext'], 'custom-twitter-feeds' ) . '</a>';
1679
  $tweet_html .= '</div>';
1680
  }
1681
 
inc/CtfOauthConnect.php CHANGED
@@ -286,23 +286,8 @@ class CtfOauthConnect
286
  case 'file_get_contents':
287
  $this->json = $this->fileGetContentsRequest( $url );
288
  break;
289
- case 'wp_http':
290
- $this->json = $this->wpHttpRequest( $url );
291
- break;
292
  default:
293
- if ( is_callable( 'curl_init' ) ) {
294
- $this->json = $this->curlRequest( $url );
295
-
296
- if ( $this->api_error_no ){
297
- $this->json = $this->fileGetContentsRequest( $url );
298
- }
299
- } elseif ( ( ini_get( 'allow_url_fopen' ) == 1 ||
300
- ini_get( 'allow_url_fopen' ) === TRUE ) &&
301
- in_array( 'https', stream_get_wrappers() ) ) {
302
- $this->json = $this->fileGetContentsRequest( $url );
303
- } else {
304
- $this->json = $this->wpHttpRequest( $url );
305
- }
306
  }
307
 
308
  return $this;
286
  case 'file_get_contents':
287
  $this->json = $this->fileGetContentsRequest( $url );
288
  break;
 
 
 
289
  default:
290
+ $this->json = $this->wpHttpRequest( $url );
 
 
 
 
 
 
 
 
 
 
 
 
291
  }
292
 
293
  return $this;
inc/admin-hooks.php CHANGED
@@ -358,7 +358,8 @@ add_action( 'wp_ajax_ctf_lite_dismiss', 'ctf_lite_dismiss' );
358
  function ctf_admin_hide_unrelated_notices() {
359
 
360
  // Bail if we're not on a ctf screen or page.
361
- if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'custom-twitter-feeds' ) {
 
362
  return;
363
  }
364
 
358
  function ctf_admin_hide_unrelated_notices() {
359
 
360
  // Bail if we're not on a ctf screen or page.
361
+ if ( ! isset( $_GET['page'] )
362
+ || ($_GET['page'] !== 'custom-twitter-feeds' && $_GET['page'] !== 'ctf-sw') ) {
363
  return;
364
  }
365
 
inc/admin/PluginSilentUpgrader.php ADDED
@@ -0,0 +1,576 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace CTF\Helpers;
4
+
5
+ use WP_Error;
6
+ use WP_Upgrader;
7
+ use WP_Filesystem_Base;
8
+
9
+ /** \WP_Upgrader class */
10
+ require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
11
+
12
+ /** \Plugin_Upgrader class */
13
+ require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php';
14
+
15
+ /**
16
+ * In WP 5.3 a PHP 5.6 splat operator (...$args) was added to \WP_Upgrader_Skin::feedback().
17
+ * We need to remove all calls to *Skin::feedback() method, as we can't override it in own Skins
18
+ * without breaking support for PHP 5.3-5.5.
19
+ *
20
+ * @internal Please do not use this class outside of core WPForms development. May be removed at any time.
21
+ *
22
+ * @since 1.5.6.1
23
+ */
24
+ class PluginSilentUpgrader extends \Plugin_Upgrader {
25
+
26
+ /**
27
+ * Run an upgrade/installation.
28
+ *
29
+ * Attempts to download the package (if it is not a local file), unpack it, and
30
+ * install it in the destination folder.
31
+ *
32
+ * @since 1.5.6.1
33
+ *
34
+ * @param array $options {
35
+ * Array or string of arguments for upgrading/installing a package.
36
+ *
37
+ * @type string $package The full path or URI of the package to install.
38
+ * Default empty.
39
+ * @type string $destination The full path to the destination folder.
40
+ * Default empty.
41
+ * @type bool $clear_destination Whether to delete any files already in the
42
+ * destination folder. Default false.
43
+ * @type bool $clear_working Whether to delete the files form the working
44
+ * directory after copying to the destination.
45
+ * Default false.
46
+ * @type bool $abort_if_destination_exists Whether to abort the installation if the destination
47
+ * folder already exists. When true, `$clear_destination`
48
+ * should be false. Default true.
49
+ * @type bool $is_multi Whether this run is one of multiple upgrade/installation
50
+ * actions being performed in bulk. When true, the skin
51
+ * WP_Upgrader::header() and WP_Upgrader::footer()
52
+ * aren't called. Default false.
53
+ * @type array $hook_extra Extra arguments to pass to the filter hooks called by
54
+ * WP_Upgrader::run().
55
+ * }
56
+ * @return array|false|WP_error The result from self::install_package() on success, otherwise a WP_Error,
57
+ * or false if unable to connect to the filesystem.
58
+ */
59
+ public function run( $options ) {
60
+
61
+ $defaults = array(
62
+ 'package' => '', // Please always pass this.
63
+ 'destination' => '', // And this
64
+ 'clear_destination' => false,
65
+ 'abort_if_destination_exists' => true, // Abort if the Destination directory exists, Pass clear_destination as false please
66
+ 'clear_working' => true,
67
+ 'is_multi' => false,
68
+ 'hook_extra' => array(), // Pass any extra $hook_extra args here, this will be passed to any hooked filters.
69
+ );
70
+
71
+ $options = wp_parse_args( $options, $defaults );
72
+
73
+ /**
74
+ * Filters the package options before running an update.
75
+ *
76
+ * See also {@see 'upgrader_process_complete'}.
77
+ *
78
+ * @since 4.3.0
79
+ *
80
+ * @param array $options {
81
+ * Options used by the upgrader.
82
+ *
83
+ * @type string $package Package for update.
84
+ * @type string $destination Update location.
85
+ * @type bool $clear_destination Clear the destination resource.
86
+ * @type bool $clear_working Clear the working resource.
87
+ * @type bool $abort_if_destination_exists Abort if the Destination directory exists.
88
+ * @type bool $is_multi Whether the upgrader is running multiple times.
89
+ * @type array $hook_extra {
90
+ * Extra hook arguments.
91
+ *
92
+ * @type string $action Type of action. Default 'update'.
93
+ * @type string $type Type of update process. Accepts 'plugin', 'theme', or 'core'.
94
+ * @type bool $bulk Whether the update process is a bulk update. Default true.
95
+ * @type string $plugin Path to the plugin file relative to the plugins directory.
96
+ * @type string $theme The stylesheet or template name of the theme.
97
+ * @type string $language_update_type The language pack update type. Accepts 'plugin', 'theme',
98
+ * or 'core'.
99
+ * @type object $language_update The language pack update offer.
100
+ * }
101
+ * }
102
+ */
103
+ $options = apply_filters( 'upgrader_package_options', $options );
104
+
105
+ if ( ! $options['is_multi'] ) { // call $this->header separately if running multiple times
106
+ $this->skin->header();
107
+ }
108
+
109
+ // Connect to the Filesystem first.
110
+ $res = $this->fs_connect( array( WP_CONTENT_DIR, $options['destination'] ) );
111
+ // Mainly for non-connected filesystem.
112
+ if ( ! $res ) {
113
+ if ( ! $options['is_multi'] ) {
114
+ $this->skin->footer();
115
+ }
116
+ return false;
117
+ }
118
+
119
+ $this->skin->before();
120
+
121
+ if ( is_wp_error( $res ) ) {
122
+ $this->skin->error( $res );
123
+ $this->skin->after();
124
+ if ( ! $options['is_multi'] ) {
125
+ $this->skin->footer();
126
+ }
127
+ return $res;
128
+ }
129
+
130
+ /*
131
+ * Download the package (Note, This just returns the filename
132
+ * of the file if the package is a local file)
133
+ */
134
+ $download = $this->download_package( $options['package'], true );
135
+
136
+ // Allow for signature soft-fail.
137
+ // WARNING: This may be removed in the future.
138
+ if ( is_wp_error( $download ) && $download->get_error_data( 'softfail-filename' ) ) {
139
+
140
+ // Don't output the 'no signature could be found' failure message for now.
141
+ if ( 'signature_verification_no_signature' != $download->get_error_code() || WP_DEBUG ) {
142
+ // Outout the failure error as a normal feedback, and not as an error:
143
+ //$this->skin->feedback( $download->get_error_message() );
144
+
145
+ // Report this failure back to WordPress.org for debugging purposes.
146
+ wp_version_check(
147
+ array(
148
+ 'signature_failure_code' => $download->get_error_code(),
149
+ 'signature_failure_data' => $download->get_error_data(),
150
+ )
151
+ );
152
+ }
153
+
154
+ // Pretend this error didn't happen.
155
+ $download = $download->get_error_data( 'softfail-filename' );
156
+ }
157
+
158
+ if ( is_wp_error( $download ) ) {
159
+ $this->skin->error( $download );
160
+ $this->skin->after();
161
+ if ( ! $options['is_multi'] ) {
162
+ $this->skin->footer();
163
+ }
164
+ return $download;
165
+ }
166
+
167
+ $delete_package = ( $download != $options['package'] ); // Do not delete a "local" file
168
+
169
+ // Unzips the file into a temporary directory.
170
+ $working_dir = $this->unpack_package( $download, $delete_package );
171
+ if ( is_wp_error( $working_dir ) ) {
172
+ $this->skin->error( $working_dir );
173
+ $this->skin->after();
174
+ if ( ! $options['is_multi'] ) {
175
+ $this->skin->footer();
176
+ }
177
+ return $working_dir;
178
+ }
179
+
180
+ // With the given options, this installs it to the destination directory.
181
+ $result = $this->install_package(
182
+ array(
183
+ 'source' => $working_dir,
184
+ 'destination' => $options['destination'],
185
+ 'clear_destination' => $options['clear_destination'],
186
+ 'abort_if_destination_exists' => $options['abort_if_destination_exists'],
187
+ 'clear_working' => $options['clear_working'],
188
+ 'hook_extra' => $options['hook_extra'],
189
+ )
190
+ );
191
+
192
+ $this->skin->set_result( $result );
193
+ if ( is_wp_error( $result ) ) {
194
+ $this->skin->error( $result );
195
+ //$this->skin->feedback( 'process_failed' );
196
+ } else {
197
+ // Installation succeeded.
198
+ //$this->skin->feedback( 'process_success' );
199
+ }
200
+
201
+ $this->skin->after();
202
+
203
+ if ( ! $options['is_multi'] ) {
204
+
205
+ /**
206
+ * Fires when the upgrader process is complete.
207
+ *
208
+ * See also {@see 'upgrader_package_options'}.
209
+ *
210
+ * @since 3.6.0
211
+ * @since 3.7.0 Added to WP_Upgrader::run().
212
+ * @since 4.6.0 `$translations` was added as a possible argument to `$hook_extra`.
213
+ *
214
+ * @param WP_Upgrader $this WP_Upgrader instance. In other contexts, $this, might be a
215
+ * Theme_Upgrader, Plugin_Upgrader, Core_Upgrade, or Language_Pack_Upgrader instance.
216
+ * @param array $hook_extra {
217
+ * Array of bulk item update data.
218
+ *
219
+ * @type string $action Type of action. Default 'update'.
220
+ * @type string $type Type of update process. Accepts 'plugin', 'theme', 'translation', or 'core'.
221
+ * @type bool $bulk Whether the update process is a bulk update. Default true.
222
+ * @type array $plugins Array of the basename paths of the plugins' main files.
223
+ * @type array $themes The theme slugs.
224
+ * @type array $translations {
225
+ * Array of translations update data.
226
+ *
227
+ * @type string $language The locale the translation is for.
228
+ * @type string $type Type of translation. Accepts 'plugin', 'theme', or 'core'.
229
+ * @type string $slug Text domain the translation is for. The slug of a theme/plugin or
230
+ * 'default' for core translations.
231
+ * @type string $version The version of a theme, plugin, or core.
232
+ * }
233
+ * }
234
+ */
235
+ do_action( 'upgrader_process_complete', $this, $options['hook_extra'] );
236
+
237
+ $this->skin->footer();
238
+ }
239
+
240
+ return $result;
241
+ }
242
+
243
+ /**
244
+ * Toggle maintenance mode for the site.
245
+ *
246
+ * Create/delete the maintenance file to enable/disable maintenance mode.
247
+ *
248
+ * @since 2.8.0
249
+ *
250
+ * @global WP_Filesystem_Base $wp_filesystem Subclass
251
+ *
252
+ * @param bool $enable True to enable maintenance mode, false to disable.
253
+ */
254
+ public function maintenance_mode( $enable = false ) {
255
+ global $wp_filesystem;
256
+ $file = $wp_filesystem->abspath() . '.maintenance';
257
+ if ( $enable ) {
258
+ //$this->skin->feedback( 'maintenance_start' );
259
+ // Create maintenance file to signal that we are upgrading
260
+ $maintenance_string = '<?php $upgrading = ' . time() . '; ?>';
261
+ $wp_filesystem->delete( $file );
262
+ $wp_filesystem->put_contents( $file, $maintenance_string, FS_CHMOD_FILE );
263
+ } elseif ( ! $enable && $wp_filesystem->exists( $file ) ) {
264
+ //$this->skin->feedback( 'maintenance_end' );
265
+ $wp_filesystem->delete( $file );
266
+ }
267
+ }
268
+
269
+ /**
270
+ * Download a package.
271
+ *
272
+ * @since 2.8.0
273
+ *
274
+ * @param string $package The URI of the package. If this is the full path to an
275
+ * existing local file, it will be returned untouched.
276
+ * @param bool $check_signatures Whether to validate file signatures. Default false.
277
+ * @return string|WP_Error The full path to the downloaded package file, or a WP_Error object.
278
+ */
279
+ public function download_package( $package, $check_signatures = false, $hook_extra = array() ) {
280
+
281
+ /**
282
+ * Filters whether to return the package.
283
+ *
284
+ * @since 3.7.0
285
+ *
286
+ * @param bool $reply Whether to bail without returning the package.
287
+ * Default false.
288
+ * @param string $package The package file name.
289
+ * @param WP_Upgrader $this The WP_Upgrader instance.
290
+ */
291
+ $reply = apply_filters( 'upgrader_pre_download', false, $package, $this );
292
+ if ( false !== $reply ) {
293
+ return $reply;
294
+ }
295
+
296
+ if ( ! preg_match( '!^(http|https|ftp)://!i', $package ) && file_exists( $package ) ) { //Local file or remote?
297
+ return $package; //must be a local file..
298
+ }
299
+
300
+ if ( empty( $package ) ) {
301
+ return new WP_Error( 'no_package', $this->strings['no_package'] );
302
+ }
303
+
304
+ //$this->skin->feedback( 'downloading_package', $package );
305
+
306
+ $download_file = download_url( $package, 300, $check_signatures );
307
+
308
+ if ( is_wp_error( $download_file ) && ! $download_file->get_error_data( 'softfail-filename' ) ) {
309
+ return new WP_Error( 'download_failed', $this->strings['download_failed'], $download_file->get_error_message() );
310
+ }
311
+
312
+ return $download_file;
313
+ }
314
+
315
+ /**
316
+ * Unpack a compressed package file.
317
+ *
318
+ * @since 2.8.0
319
+ *
320
+ * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
321
+ *
322
+ * @param string $package Full path to the package file.
323
+ * @param bool $delete_package Optional. Whether to delete the package file after attempting
324
+ * to unpack it. Default true.
325
+ * @return string|WP_Error The path to the unpacked contents, or a WP_Error on failure.
326
+ */
327
+ public function unpack_package( $package, $delete_package = true ) {
328
+ global $wp_filesystem;
329
+
330
+ //$this->skin->feedback( 'unpack_package' );
331
+
332
+ $upgrade_folder = $wp_filesystem->wp_content_dir() . 'upgrade/';
333
+
334
+ //Clean up contents of upgrade directory beforehand.
335
+ $upgrade_files = $wp_filesystem->dirlist( $upgrade_folder );
336
+ if ( ! empty( $upgrade_files ) ) {
337
+ foreach ( $upgrade_files as $file ) {
338
+ $wp_filesystem->delete( $upgrade_folder . $file['name'], true );
339
+ }
340
+ }
341
+
342
+ // We need a working directory - Strip off any .tmp or .zip suffixes
343
+ $working_dir = $upgrade_folder . basename( basename( $package, '.tmp' ), '.zip' );
344
+
345
+ // Clean up working directory
346
+ if ( $wp_filesystem->is_dir( $working_dir ) ) {
347
+ $wp_filesystem->delete( $working_dir, true );
348
+ }
349
+
350
+ // Unzip package to working directory
351
+ $result = unzip_file( $package, $working_dir );
352
+
353
+ // Once extracted, delete the package if required.
354
+ if ( $delete_package ) {
355
+ unlink( $package );
356
+ }
357
+
358
+ if ( is_wp_error( $result ) ) {
359
+ $wp_filesystem->delete( $working_dir, true );
360
+ if ( 'incompatible_archive' == $result->get_error_code() ) {
361
+ return new WP_Error( 'incompatible_archive', $this->strings['incompatible_archive'], $result->get_error_data() );
362
+ }
363
+ return $result;
364
+ }
365
+
366
+ return $working_dir;
367
+ }
368
+
369
+ /**
370
+ * Install a package.
371
+ *
372
+ * Copies the contents of a package form a source directory, and installs them in
373
+ * a destination directory. Optionally removes the source. It can also optionally
374
+ * clear out the destination folder if it already exists.
375
+ *
376
+ * @since 2.8.0
377
+ *
378
+ * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
379
+ * @global array $wp_theme_directories
380
+ *
381
+ * @param array|string $args {
382
+ * Optional. Array or string of arguments for installing a package. Default empty array.
383
+ *
384
+ * @type string $source Required path to the package source. Default empty.
385
+ * @type string $destination Required path to a folder to install the package in.
386
+ * Default empty.
387
+ * @type bool $clear_destination Whether to delete any files already in the destination
388
+ * folder. Default false.
389
+ * @type bool $clear_working Whether to delete the files form the working directory
390
+ * after copying to the destination. Default false.
391
+ * @type bool $abort_if_destination_exists Whether to abort the installation if
392
+ * the destination folder already exists. Default true.
393
+ * @type array $hook_extra Extra arguments to pass to the filter hooks called by
394
+ * WP_Upgrader::install_package(). Default empty array.
395
+ * }
396
+ *
397
+ * @return array|WP_Error The result (also stored in `WP_Upgrader::$result`), or a WP_Error on failure.
398
+ */
399
+ public function install_package( $args = array() ) {
400
+ global $wp_filesystem, $wp_theme_directories;
401
+
402
+ $defaults = array(
403
+ 'source' => '', // Please always pass this
404
+ 'destination' => '', // and this
405
+ 'clear_destination' => false,
406
+ 'clear_working' => false,
407
+ 'abort_if_destination_exists' => true,
408
+ 'hook_extra' => array(),
409
+ );
410
+
411
+ $args = wp_parse_args( $args, $defaults );
412
+
413
+ // These were previously extract()'d.
414
+ $source = $args['source'];
415
+ $destination = $args['destination'];
416
+ $clear_destination = $args['clear_destination'];
417
+
418
+ set_time_limit( 300 );
419
+
420
+ if ( empty( $source ) || empty( $destination ) ) {
421
+ return new WP_Error( 'bad_request', $this->strings['bad_request'] );
422
+ }
423
+ //$this->skin->feedback( 'installing_package' );
424
+
425
+ /**
426
+ * Filters the install response before the installation has started.
427
+ *
428
+ * Returning a truthy value, or one that could be evaluated as a WP_Error
429
+ * will effectively short-circuit the installation, returning that value
430
+ * instead.
431
+ *
432
+ * @since 2.8.0
433
+ *
434
+ * @param bool|WP_Error $response Response.
435
+ * @param array $hook_extra Extra arguments passed to hooked filters.
436
+ */
437
+ $res = apply_filters( 'upgrader_pre_install', true, $args['hook_extra'] );
438
+
439
+ if ( is_wp_error( $res ) ) {
440
+ return $res;
441
+ }
442
+
443
+ //Retain the Original source and destinations
444
+ $remote_source = $args['source'];
445
+ $local_destination = $destination;
446
+
447
+ $source_files = array_keys( $wp_filesystem->dirlist( $remote_source ) );
448
+ $remote_destination = $wp_filesystem->find_folder( $local_destination );
449
+
450
+ //Locate which directory to copy to the new folder, This is based on the actual folder holding the files.
451
+ if ( 1 == count( $source_files ) && $wp_filesystem->is_dir( trailingslashit( $args['source'] ) . $source_files[0] . '/' ) ) { //Only one folder? Then we want its contents.
452
+ $source = trailingslashit( $args['source'] ) . trailingslashit( $source_files[0] );
453
+ } elseif ( count( $source_files ) == 0 ) {
454
+ return new WP_Error( 'incompatible_archive_empty', $this->strings['incompatible_archive'], $this->strings['no_files'] ); // There are no files?
455
+ } else { // It's only a single file, the upgrader will use the folder name of this file as the destination folder. Folder name is based on zip filename.
456
+ $source = trailingslashit( $args['source'] );
457
+ }
458
+
459
+ /**
460
+ * Filters the source file location for the upgrade package.
461
+ *
462
+ * @since 2.8.0
463
+ * @since 4.4.0 The $hook_extra parameter became available.
464
+ *
465
+ * @param string $source File source location.
466
+ * @param string $remote_source Remote file source location.
467
+ * @param WP_Upgrader $this WP_Upgrader instance.
468
+ * @param array $hook_extra Extra arguments passed to hooked filters.
469
+ */
470
+ $source = apply_filters( 'upgrader_source_selection', $source, $remote_source, $this, $args['hook_extra'] );
471
+
472
+ if ( is_wp_error( $source ) ) {
473
+ return $source;
474
+ }
475
+
476
+ // Has the source location changed? If so, we need a new source_files list.
477
+ if ( $source !== $remote_source ) {
478
+ $source_files = array_keys( $wp_filesystem->dirlist( $source ) );
479
+ }
480
+
481
+ /*
482
+ * Protection against deleting files in any important base directories.
483
+ * Theme_Upgrader & Plugin_Upgrader also trigger this, as they pass the
484
+ * destination directory (WP_PLUGIN_DIR / wp-content/themes) intending
485
+ * to copy the directory into the directory, whilst they pass the source
486
+ * as the actual files to copy.
487
+ */
488
+ $protected_directories = array( ABSPATH, WP_CONTENT_DIR, WP_PLUGIN_DIR, WP_CONTENT_DIR . '/themes' );
489
+
490
+ if ( is_array( $wp_theme_directories ) ) {
491
+ $protected_directories = array_merge( $protected_directories, $wp_theme_directories );
492
+ }
493
+
494
+ if ( in_array( $destination, $protected_directories ) ) {
495
+ $remote_destination = trailingslashit( $remote_destination ) . trailingslashit( basename( $source ) );
496
+ $destination = trailingslashit( $destination ) . trailingslashit( basename( $source ) );
497
+ }
498
+
499
+ if ( $clear_destination ) {
500
+ // We're going to clear the destination if there's something there.
501
+ //$this->skin->feedback( 'remove_old' );
502
+
503
+ $removed = $this->clear_destination( $remote_destination );
504
+
505
+ /**
506
+ * Filters whether the upgrader cleared the destination.
507
+ *
508
+ * @since 2.8.0
509
+ *
510
+ * @param mixed $removed Whether the destination was cleared. true on success, WP_Error on failure
511
+ * @param string $local_destination The local package destination.
512
+ * @param string $remote_destination The remote package destination.
513
+ * @param array $hook_extra Extra arguments passed to hooked filters.
514
+ */
515
+ $removed = apply_filters( 'upgrader_clear_destination', $removed, $local_destination, $remote_destination, $args['hook_extra'] );
516
+
517
+ if ( is_wp_error( $removed ) ) {
518
+ return $removed;
519
+ }
520
+ } elseif ( $args['abort_if_destination_exists'] && $wp_filesystem->exists( $remote_destination ) ) {
521
+ //If we're not clearing the destination folder and something exists there already, Bail.
522
+ //But first check to see if there are actually any files in the folder.
523
+ $_files = $wp_filesystem->dirlist( $remote_destination );
524
+ if ( ! empty( $_files ) ) {
525
+ $wp_filesystem->delete( $remote_source, true ); //Clear out the source files.
526
+ return new WP_Error( 'folder_exists', $this->strings['folder_exists'], $remote_destination );
527
+ }
528
+ }
529
+
530
+ //Create destination if needed
531
+ if ( ! $wp_filesystem->exists( $remote_destination ) ) {
532
+ if ( ! $wp_filesystem->mkdir( $remote_destination, FS_CHMOD_DIR ) ) {
533
+ return new WP_Error( 'mkdir_failed_destination', $this->strings['mkdir_failed'], $remote_destination );
534
+ }
535
+ }
536
+ // Copy new version of item into place.
537
+ $result = copy_dir( $source, $remote_destination );
538
+ if ( is_wp_error( $result ) ) {
539
+ if ( $args['clear_working'] ) {
540
+ $wp_filesystem->delete( $remote_source, true );
541
+ }
542
+ return $result;
543
+ }
544
+
545
+ //Clear the Working folder?
546
+ if ( $args['clear_working'] ) {
547
+ $wp_filesystem->delete( $remote_source, true );
548
+ }
549
+
550
+ $destination_name = basename( str_replace( $local_destination, '', $destination ) );
551
+ if ( '.' == $destination_name ) {
552
+ $destination_name = '';
553
+ }
554
+
555
+ $this->result = compact( 'source', 'source_files', 'destination', 'destination_name', 'local_destination', 'remote_destination', 'clear_destination' );
556
+
557
+ /**
558
+ * Filters the installation response after the installation has finished.
559
+ *
560
+ * @since 2.8.0
561
+ *
562
+ * @param bool $response Installation response.
563
+ * @param array $hook_extra Extra arguments passed to hooked filters.
564
+ * @param array $result Installation result data.
565
+ */
566
+ $res = apply_filters( 'upgrader_post_install', true, $args['hook_extra'], $this->result );
567
+
568
+ if ( is_wp_error( $res ) ) {
569
+ $this->result = $res;
570
+ return $res;
571
+ }
572
+
573
+ //Bombard the calling function will all the info which we've just used.
574
+ return $this->result;
575
+ }
576
+ }
inc/admin/PluginSilentUpgraderSkin.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace CTF\Helpers;
4
+
5
+ /** \WP_Upgrader_Skin class */
6
+ require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader-skin.php';
7
+
8
+ /**
9
+ * Class PluginSilentUpgraderSkin.
10
+ *
11
+ * @internal Please do not use this class outside of core WPForms development. May be removed at any time.
12
+ *
13
+ * @since 1.5.6.1
14
+ */
15
+ class PluginSilentUpgraderSkin extends \WP_Upgrader_Skin {
16
+
17
+ /**
18
+ * Empty out the header of its HTML content and only check to see if it has
19
+ * been performed or not.
20
+ *
21
+ * @since 1.5.6.1
22
+ */
23
+ public function header() {
24
+ }
25
+
26
+ /**
27
+ * Empty out the footer of its HTML contents.
28
+ *
29
+ * @since 1.5.6.1
30
+ */
31
+ public function footer() {
32
+ }
33
+
34
+ /**
35
+ * Instead of outputting HTML for errors, just return them.
36
+ * Ajax request will just ignore it.
37
+ *
38
+ * @since 1.5.6.1
39
+ *
40
+ * @param array $errors Array of errors with the install process.
41
+ *
42
+ * @return array
43
+ */
44
+ public function error( $errors ) {
45
+ return $errors;
46
+ }
47
+
48
+ /**
49
+ * Empty out JavaScript output that calls function to decrement the update counts.
50
+ *
51
+ * @since 1.5.6.1
52
+ *
53
+ * @param string $type Type of update count to decrement.
54
+ */
55
+ public function decrement_update_count( $type ) {
56
+ }
57
+ }
inc/admin/addon-functions.php ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
3
+
4
+ /**
5
+ * Deactivate addon.
6
+ *
7
+ * @since 1.0.0
8
+ */
9
+ function ctf_deactivate_addon() {
10
+ require_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/admin/PluginSilentUpgrader.php';
11
+ require_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/admin/PluginSilentUpgraderSkin.php';
12
+ require_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/admin/class-install-skin.php';
13
+ // Run a security check.
14
+ check_ajax_referer( 'ctf-admin', 'nonce' );
15
+
16
+ // Check for permissions.
17
+ if ( ! current_user_can( 'manage_options' ) ) {
18
+ wp_send_json_error();
19
+ }
20
+
21
+ $type = 'addon';
22
+ if ( ! empty( $_POST['type'] ) ) {
23
+ $type = sanitize_key( $_POST['type'] );
24
+ }
25
+
26
+ if ( isset( $_POST['plugin'] ) ) {
27
+ deactivate_plugins( $_POST['plugin'] );
28
+
29
+ if ( 'plugin' === $type ) {
30
+ wp_send_json_success( esc_html__( 'Plugin deactivated.', 'custom-twitter-feeds' ) );
31
+ } else {
32
+ wp_send_json_success( esc_html__( 'Addon deactivated.', 'custom-twitter-feeds' ) );
33
+ }
34
+ }
35
+
36
+ wp_send_json_error( esc_html__( 'Could not deactivate the addon. Please deactivate from the Plugins page.', 'custom-twitter-feeds' ) );
37
+ }
38
+ add_action( 'wp_ajax_ctf_deactivate_addon', 'ctf_deactivate_addon' );
39
+
40
+ /**
41
+ * Activate addon.
42
+ *
43
+ * @since 1.0.0
44
+ */
45
+ function ctf_activate_addon() {
46
+
47
+ require_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/admin/PluginSilentUpgrader.php';
48
+ require_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/admin/PluginSilentUpgraderSkin.php';
49
+ require_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/admin/class-install-skin.php';
50
+ // Run a security check.
51
+ check_ajax_referer( 'ctf-admin', 'nonce' );
52
+ // Check for permissions.
53
+ if ( ! current_user_can( 'manage_options' ) ) {
54
+ wp_send_json_error();
55
+ }
56
+
57
+ if ( isset( $_POST['plugin'] ) ) {
58
+
59
+ $type = 'addon';
60
+ if ( ! empty( $_POST['type'] ) ) {
61
+ $type = sanitize_key( $_POST['type'] );
62
+ }
63
+
64
+ $activate = activate_plugins( $_POST['plugin'] );
65
+
66
+ if ( ! is_wp_error( $activate ) ) {
67
+ if ( 'plugin' === $type ) {
68
+ wp_send_json_success( esc_html__( 'Plugin activated.', 'custom-twitter-feeds' ) );
69
+ } else {
70
+ wp_send_json_success( esc_html__( 'Addon activated.', 'custom-twitter-feeds' ) );
71
+ }
72
+ }
73
+ }
74
+
75
+ wp_send_json_error( esc_html__( 'Could not activate addon. Please activate from the Plugins page.', 'custom-twitter-feeds' ) );
76
+ }
77
+ add_action( 'wp_ajax_ctf_activate_addon', 'ctf_activate_addon' );
78
+
79
+ /**
80
+ * Install addon.
81
+ *
82
+ * @since 1.0.0
83
+ */
84
+ function ctf_install_addon() {
85
+ require_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/admin/PluginSilentUpgrader.php';
86
+ require_once trailingslashit( CTF_PLUGIN_DIR ) . 'inc/admin/PluginSilentUpgraderSkin.php';
87
+ // Run a security check.
88
+ check_ajax_referer( 'ctf-admin', 'nonce' );
89
+
90
+ // Check for permissions.
91
+ if ( ! current_user_can( 'manage_options' ) ) {
92
+ wp_send_json_error();
93
+ }
94
+
95
+ $error = esc_html__( 'Could not install addon. Please download from wpforms.com and install manually.', 'custom-twitter-feeds' );
96
+
97
+ if ( empty( $_POST['plugin'] ) ) {
98
+ wp_send_json_error( $error );
99
+ }
100
+
101
+ // Set the current screen to avoid undefined notices.
102
+ set_current_screen( 'custom-twitter-feeds' );
103
+
104
+ // Prepare variables.
105
+ $url = esc_url_raw(
106
+ add_query_arg(
107
+ array(
108
+ 'page' => 'custom-twitter-feeds',
109
+ ),
110
+ admin_url( 'admin.php' )
111
+ )
112
+ );
113
+
114
+ $creds = request_filesystem_credentials( $url, '', false, false, null );
115
+
116
+ // Check for file system permissions.
117
+ if ( false === $creds ) {
118
+ wp_send_json_error( $error );
119
+ }
120
+
121
+ if ( ! WP_Filesystem( $creds ) ) {
122
+ wp_send_json_error( $error );
123
+ }
124
+
125
+ /*
126
+ * We do not need any extra credentials if we have gotten this far, so let's install the plugin.
127
+ */
128
+
129
+ require_once CTF_PLUGIN_DIR . 'inc/admin/class-install-skin.php';
130
+
131
+ // Do not allow WordPress to search/download translations, as this will break JS output.
132
+ remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );
133
+
134
+ // Create the plugin upgrader with our custom skin.
135
+ $installer = new CTF\Helpers\PluginSilentUpgrader( new CTF_Install_Skin() );
136
+
137
+ // Error check.
138
+ if ( ! method_exists( $installer, 'install' ) || empty( $_POST['plugin'] ) ) {
139
+ wp_send_json_error( $error );
140
+ }
141
+
142
+ $installer->install( $_POST['plugin'] ); // phpcs:ignore
143
+
144
+ // Flush the cache and return the newly installed plugin basename.
145
+ wp_cache_flush();
146
+
147
+ $plugin_basename = $installer->plugin_info();
148
+
149
+ if ( $plugin_basename ) {
150
+
151
+ $type = 'addon';
152
+ if ( ! empty( $_POST['type'] ) ) {
153
+ $type = sanitize_key( $_POST['type'] );
154
+ }
155
+
156
+ // Activate the plugin silently.
157
+ $activated = activate_plugin( $plugin_basename );
158
+
159
+ if ( ! is_wp_error( $activated ) ) {
160
+ wp_send_json_success(
161
+ array(
162
+ 'msg' => 'plugin' === $type ? esc_html__( 'Plugin installed & activated.', 'custom-twitter-feeds' ) : esc_html__( 'Addon installed & activated.', 'custom-twitter-feeds' ),
163
+ 'is_activated' => true,
164
+ 'basename' => $plugin_basename,
165
+ )
166
+ );
167
+ } else {
168
+ wp_send_json_success(
169
+ array(
170
+ 'msg' => 'plugin' === $type ? esc_html__( 'Plugin installed.', 'custom-twitter-feeds' ) : esc_html__( 'Addon installed.', 'custom-twitter-feeds' ),
171
+ 'is_activated' => false,
172
+ 'basename' => $plugin_basename,
173
+ )
174
+ );
175
+ }
176
+ }
177
+
178
+ wp_send_json_error( $error );
179
+ }
180
+ add_action( 'wp_ajax_ctf_install_addon', 'ctf_install_addon' );
inc/admin/class-install-skin.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ use CTF\Helpers\PluginSilentUpgraderSkin;
3
+ /**
4
+ * Skin for on-the-fly addon installations.
5
+ *
6
+ * @since 1.0.0
7
+ * @since 1.5.6.1 Extend PluginSilentUpgraderSkin and clean up the class.
8
+ */
9
+ class CTF_Install_Skin extends PluginSilentUpgraderSkin {
10
+
11
+ /**
12
+ * Instead of outputting HTML for errors, json_encode the errors and send them
13
+ * back to the Ajax script for processing.
14
+ *
15
+ * @since 1.0.0
16
+ *
17
+ * @param array $errors Array of errors with the install process.
18
+ */
19
+ public function error( $errors ) {
20
+
21
+ if ( ! empty( $errors ) ) {
22
+ wp_send_json_error( $errors );
23
+ }
24
+ }
25
+ }
inc/class-ctf-feed-locator.php ADDED
@@ -0,0 +1,418 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class CTF_Feed_Locator
4
+ *
5
+ * Locates feeds on the site and logs information about them in the database.
6
+ *
7
+ * @since 1.14
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ die( '-1' );
12
+ }
13
+
14
+ class CTF_Feed_Locator
15
+ {
16
+ private $feed_details;
17
+
18
+ private $expiration_time;
19
+
20
+ private $matching_entries;
21
+
22
+ public function __construct( $feed_details ) {
23
+ /**
24
+ * Example of how $feed_details is structured
25
+ *
26
+ * $feed_details = array(
27
+ * 'feed_id' => $transient_name,
28
+ * 'atts' => $atts,
29
+ * 'location' => array(
30
+ * 'post_id' => get_the_ID(),
31
+ * 'html' => 'unknown'
32
+ * )
33
+ * );
34
+ */
35
+ $this->feed_details = $feed_details;
36
+
37
+ $this->matching_entries = array();
38
+
39
+ $this->expiration_time = time() - 2 * WEEK_IN_SECONDS;
40
+ }
41
+
42
+ /**
43
+ * Returns records that match the post ID and feed ID
44
+ * of the feed being located
45
+ *
46
+ * @return array
47
+ *
48
+ * @since 1.14
49
+ */
50
+ public function retrieve_matching_entries() {
51
+ global $wpdb;
52
+ $feed_locator_table_name = esc_sql( $wpdb->prefix . CTF_FEED_LOCATOR );
53
+
54
+ $results = $wpdb->get_results( $wpdb->prepare("
55
+ SELECT *
56
+ FROM $feed_locator_table_name
57
+ WHERE post_id = %d
58
+ AND feed_id = %s", $this->feed_details['location']['post_id'], $this->feed_details['feed_id'] ),ARRAY_A );
59
+
60
+ return $results;
61
+ }
62
+
63
+ /**
64
+ * Add feed being located to the database
65
+ *
66
+ * @since 1.14
67
+ */
68
+ public function insert_entry() {
69
+ global $wpdb;
70
+
71
+ $feed_locator_table_name = esc_sql( $wpdb->prefix . CTF_FEED_LOCATOR );
72
+
73
+ $affected = $wpdb->query( $wpdb->prepare( "INSERT INTO $feed_locator_table_name
74
+ (feed_id,
75
+ post_id,
76
+ html_location,
77
+ shortcode_atts,
78
+ last_update)
79
+ VALUES (
80
+ %s,
81
+ %d,
82
+ %s,
83
+ %s,
84
+ %s);",
85
+ $this->feed_details['feed_id'],
86
+ $this->feed_details['location']['post_id'],
87
+ $this->feed_details['location']['html'],
88
+ ctf_json_encode( $this->feed_details['atts'] ),
89
+ date( 'Y-m-d H:i:s' ) ) );
90
+ }
91
+
92
+ /**
93
+ * Update a record based on the existing "id" column. Location can change
94
+ * from "unknown" to one of footer, content, header, or sidebar.
95
+ *
96
+ * @param $id
97
+ * @param $location
98
+ *
99
+ * @since 1.14
100
+ */
101
+ public function update_entry( $id, $location ) {
102
+ global $wpdb;
103
+
104
+ $feed_locator_table_name = esc_sql( $wpdb->prefix . CTF_FEED_LOCATOR );
105
+
106
+ $query = $wpdb->query( $wpdb->prepare( "
107
+ UPDATE $feed_locator_table_name
108
+ SET last_update = %s, html_location = %s
109
+ WHERE id = %d;", date( 'Y-m-d H:i:s' ), $location, $id ) );
110
+ }
111
+
112
+ /**
113
+ * Processes a feed being located based on whether or not the record
114
+ * exists as well as whether or not an unknown location needs to be
115
+ * updated.
116
+ *
117
+ * @since 1.14
118
+ */
119
+ public function add_or_update_entry() {
120
+ if ( empty( $this->feed_details['feed_id'] ) ) {
121
+ return;
122
+ }
123
+
124
+ $this->matching_entries = $this->retrieve_matching_entries();
125
+
126
+ if ( empty( $this->matching_entries ) ) {
127
+ $this->insert_entry();
128
+ } else {
129
+ $matching_indices = array();
130
+ $matched_location = false;
131
+ $non_unknown_match = false;
132
+ $unknown_match = false;
133
+
134
+ foreach ( $this->matching_entries as $index => $matching_entry ) {
135
+ $details_atts = is_array( $this->feed_details['atts'] ) ? $this->feed_details['atts'] : array();
136
+ $matching_atts = json_decode( $matching_entry['shortcode_atts'], true );
137
+ if ( ! is_array( $matching_atts ) ) {
138
+ $matching_atts = array();
139
+ }
140
+ $atts_diff = array_diff( $matching_atts, $details_atts ); // determines if the shortcode settings match the shortcode settings of an existing feed
141
+ if ( empty( $atts_diff ) ) {
142
+ $matching_indices[] = $matching_entry['id'];
143
+ if ( $matching_entry['html_location'] === $this->feed_details['location']['html'] ) {
144
+ $matched_location = $index;
145
+ $this->update_entry( $matching_entry['id'], $matching_entry['html_location'] );
146
+ }
147
+ if ( $matching_entry['html_location'] !== 'unknown' ) {
148
+ $non_unknown_match = $index;
149
+ } else {
150
+ $unknown_match = $index;
151
+ }
152
+ }
153
+ }
154
+
155
+ if ( false === $matched_location ) {
156
+ // if there is no matched location, there is only one feed on the page, and the feed being checked has an unknown location, update the known location
157
+ if ( count( $matching_indices ) === 1
158
+ && $this->feed_details['location']['html'] === 'unknown'
159
+ && false !== $non_unknown_match ) {
160
+ $this->update_entry( $this->matching_entries[ $non_unknown_match ]['id'], $this->matching_entries[ $non_unknown_match ]['html_location'] );
161
+ } else {
162
+ if ( $this->feed_details['location']['html'] !== 'unknown'
163
+ && false !== $unknown_match ) {
164
+ $this->update_entry( $this->matching_entries[ $unknown_match ]['id'], $this->feed_details['location']['html'] );
165
+ } else {
166
+ $this->insert_entry();
167
+ }
168
+
169
+ }
170
+ }
171
+
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Old feeds are only detected once a day to keep load on the server low.
177
+ *
178
+ * @return bool
179
+ *
180
+ * @since 1.14
181
+ */
182
+ public static function should_clear_old_locations() {
183
+ $ctf_statuses_option = get_option( 'ctf_statuses', array() );
184
+ $last_old_feed_check = isset( $ctf_statuses_option['feed_locator']['last_check'] ) ? $ctf_statuses_option['feed_locator']['last_check'] : 0;
185
+
186
+ return $last_old_feed_check < time() - DAY_IN_SECONDS;
187
+ }
188
+
189
+ /**
190
+ * Old feeds are removed if they haven't been updated in two weeks.
191
+ *
192
+ * @since 1.14
193
+ */
194
+ public static function delete_old_locations() {
195
+ global $wpdb;
196
+
197
+ $feed_locator_table_name = esc_sql( $wpdb->prefix . CTF_FEED_LOCATOR );
198
+ $two_weeks_ago = date( 'Y-m-d H:i:s', time() - 2 * WEEK_IN_SECONDS );
199
+
200
+ $affected = $wpdb->query( $wpdb->prepare(
201
+ "DELETE FROM $feed_locator_table_name WHERE last_update < %s;", $two_weeks_ago ) );
202
+
203
+ $ctf_statuses_option = get_option( 'ctf_statuses', array() );
204
+ $ctf_statuses_option['feed_locator']['last_check'] = time();
205
+ if ( ! isset( $ctf_statuses_option['feed_locator']['initialized'] ) ) {
206
+ $ctf_statuses_option['feed_locator']['initialized'] = time();
207
+ }
208
+
209
+ update_option( 'ctf_statuses', $ctf_statuses_option, true );
210
+ }
211
+
212
+ /**
213
+ * Feeds are located with the page load randomly (5% or 1/30 loads)
214
+ * to decrease load on the server.
215
+ *
216
+ * If the locating just started (within 5 minutes) it is run more often
217
+ * to collect feed locations quickly.
218
+ *
219
+ * @return bool
220
+ *
221
+ * @since 1.14
222
+ */
223
+ public static function should_do_locating() {
224
+ $ctf_statuses_option = get_option( 'ctf_statuses', array() );
225
+ if ( isset( $ctf_statuses_option['feed_locator']['initialized'] )
226
+ && $ctf_statuses_option['feed_locator']['initialized'] < (time() - 300) ) {
227
+ $should_do_locating = rand( 1, 10 ) === 10;
228
+ } else {
229
+ $should_do_locating = rand( 1, 30 ) === 30;
230
+ }
231
+ $should_do_locating = apply_filters( 'ctf_should_do_locating', $should_do_locating );
232
+
233
+ return $should_do_locating;
234
+ }
235
+
236
+ /**
237
+ * Simliar to the should_do_locating method but will add an additional
238
+ * database query to see if there is a feed with an unknown location that
239
+ * matches the details of the feed in question.
240
+ *
241
+ * @param $feed_id
242
+ * @param $post_id
243
+ *
244
+ * @return bool
245
+ *
246
+ * @since 1.14
247
+ */
248
+ public static function should_do_ajax_locating( $feed_id, $post_id ) {
249
+ $should_do_locating = rand( 1, 50 ) === 50;
250
+
251
+ $should_do_locating = apply_filters( 'ctf_should_do_ajax_locating', $should_do_locating );
252
+
253
+ return $should_do_locating;
254
+ }
255
+
256
+ /**
257
+ * Feeds are located with the page load randomly (1/30 loads)
258
+ * to decrease load on the server.
259
+ *
260
+ * If the locating just started (within 5 minutes) it is run more often
261
+ * to collect feed locations quickly.
262
+ *
263
+ * @param $feed_id
264
+ * @param $post_id
265
+ *
266
+ * @return bool
267
+ *
268
+ * @since 1.14
269
+ */
270
+ public static function entries_need_locating( $feed_id, $post_id ) {
271
+ global $wpdb;
272
+ $feed_locator_table_name = esc_sql( $wpdb->prefix . CTF_FEED_LOCATOR );
273
+
274
+ $one_day_ago = date( 'Y-m-d H:i:s', time() - DAY_IN_SECONDS );
275
+
276
+ $results = $wpdb->get_results( $wpdb->prepare("
277
+ SELECT id
278
+ FROM $feed_locator_table_name
279
+ WHERE html_location = 'unknown'
280
+ AND last_update < %s
281
+ AND feed_id = %s
282
+ AND post_id = %d
283
+ LIMIT 1;", $one_day_ago, $feed_id, $post_id ),ARRAY_A );
284
+
285
+ return isset( $results[0] );
286
+ }
287
+
288
+ /**
289
+ * A custom table stores locations
290
+ *
291
+ * @since 1.14
292
+ */
293
+ public static function create_table() {
294
+ global $wpdb;
295
+
296
+ $feed_locator_table_name = esc_sql( $wpdb->prefix . CTF_FEED_LOCATOR );
297
+
298
+ if ( $wpdb->get_var( "show tables like '$feed_locator_table_name'" ) != $feed_locator_table_name ) {
299
+ $sql = "CREATE TABLE " . $feed_locator_table_name . " (
300
+ id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
301
+ feed_id VARCHAR(50) DEFAULT '' NOT NULL,
302
+ post_id BIGINT(20) UNSIGNED NOT NULL,
303
+ html_location VARCHAR(50) DEFAULT 'unknown' NOT NULL,
304
+ shortcode_atts LONGTEXT NOT NULL,
305
+ last_update DATETIME
306
+ );";
307
+ $wpdb->query( $sql );
308
+ }
309
+ $error = $wpdb->last_error;
310
+ $query = $wpdb->last_query;
311
+ $had_error = false;
312
+ if ( $wpdb->get_var( "show tables like '$feed_locator_table_name'" ) != $feed_locator_table_name ) {
313
+ $had_error = true;
314
+ }
315
+
316
+ if ( ! $had_error ) {
317
+ $wpdb->query( "ALTER TABLE $feed_locator_table_name ADD INDEX feed_id (feed_id)" );
318
+ $wpdb->query( "ALTER TABLE $feed_locator_table_name ADD INDEX post_id (post_id)" );
319
+ }
320
+ }
321
+
322
+ /**
323
+ * Counts the number of unique feeds in the database.
324
+ *
325
+ * @return int
326
+ *
327
+ * @since 1.14
328
+ */
329
+ public static function count_unique() {
330
+ global $wpdb;
331
+
332
+ $feed_locator_table_name = esc_sql( $wpdb->prefix . CTF_FEED_LOCATOR );
333
+ $results_content = $wpdb->get_results( "
334
+ SELECT COUNT(*) AS num_entries
335
+ FROM $feed_locator_table_name
336
+ WHERE html_location = 'content'
337
+ ", ARRAY_A );
338
+
339
+
340
+ $results_other = $wpdb->get_results( "
341
+ SELECT COUNT(*) AS num_entries
342
+ FROM $feed_locator_table_name
343
+ WHERE html_location != 'content'
344
+ AND html_location != 'unknown'
345
+ GROUP BY feed_id
346
+ ", ARRAY_A );
347
+
348
+ $total = 0;
349
+ if ( isset( $results_content[0]['num_entries'] ) ) {
350
+ $total += (int)$results_content[0]['num_entries'];
351
+ }
352
+ if ( isset( $results_other[0]['num_entries'] ) ) {
353
+ $total += (int)$results_other[0]['num_entries'];
354
+ }
355
+
356
+ return $total;
357
+ }
358
+
359
+ /**
360
+ * Creates a summary of the located feeds in an array
361
+ *
362
+ * @return array
363
+ *
364
+ * @since 1.14
365
+ */
366
+ public static function summary() {
367
+ global $wpdb;
368
+
369
+ $feed_locator_table_name = esc_sql( $wpdb->prefix . CTF_FEED_LOCATOR );
370
+
371
+ $locations = array(
372
+ array(
373
+ 'label' => __( 'Content', 'custom-twitter-feeds' ),
374
+ 'html_locations' => array( 'content', 'unknown' )
375
+ ),
376
+ array(
377
+ 'label' => __( 'Header', 'custom-twitter-feeds' ),
378
+ 'html_locations' => array( 'header' ),
379
+ 'group_by' => 'feed_id'
380
+ ),
381
+ array(
382
+ 'label' => __( 'Sidebar', 'custom-twitter-feeds' ),
383
+ 'html_locations' => array( 'sidebar' ),
384
+ 'group_by' => 'feed_id'
385
+ ),
386
+ array(
387
+ 'label' => __( 'Footer', 'custom-twitter-feeds' ),
388
+ 'html_locations' => array( 'footer' ),
389
+ 'group_by' => 'feed_id'
390
+ )
391
+ );
392
+
393
+ $one_result_found = false;
394
+
395
+ foreach ( $locations as $key => $location ) {
396
+ $in = implode( "', '", $location['html_locations'] );
397
+ $group_by = isset( $location['group_by'] ) ? "GROUP BY " . $location['group_by'] : "";
398
+ $results = $wpdb->get_results("
399
+ SELECT *
400
+ FROM $feed_locator_table_name
401
+ WHERE html_location IN ('$in')
402
+ $group_by
403
+ ORDER BY last_update ASC",ARRAY_A );
404
+
405
+ if ( isset( $results[0] ) ) {
406
+ $one_result_found = true;
407
+ }
408
+
409
+ $locations[ $key ]['results'] = $results;
410
+ }
411
+
412
+ if ( ! $one_result_found ) {
413
+ return array();
414
+ }
415
+
416
+ return $locations;
417
+ }
418
+ }
js/ctf-admin-scripts.js CHANGED
@@ -114,12 +114,12 @@ jQuery(document).ready(function($){
114
  $ctfToggleSearchGuide.closest('h4').next('div').hide();
115
 
116
  // show on click
117
- $ctfToggleSearchGuide.click(function(){
118
  $(this).closest('h4').next('div').slideToggle();
119
  });
120
 
121
  // tooltips
122
- $('#ctf-admin .ctf-tooltip-link').click(function(){
123
  $(this).closest('tr, h3, .ctf-tooltip-wrap').find('.ctf-tooltip').slideToggle();
124
  });
125
 
@@ -160,24 +160,32 @@ jQuery(document).ready(function($){
160
  // shortcode tooltips
161
  var $ctfAdminLabel = $('#ctf-admin label');
162
 
163
- $ctfAdminLabel.click(function(){
164
  var $sbi_shortcode = $(this).siblings('.ctf_shortcode');
165
  if($sbi_shortcode.is(':visible')){
 
166
  $(this).siblings('.ctf_shortcode').css('display','none');
167
  } else {
 
168
  $(this).siblings('.ctf_shortcode').css('display','block');
169
  }
170
  });
171
- $ctfAdminLabel.hover(function(){
172
- if($(this).siblings('.ctf_shortcode').length > 0 ){
173
- $(this).attr('title', 'Click for shortcode option').append('<code class="ctf_shortcode_symbol">[]</code>');
 
 
 
 
 
 
 
 
174
  }
175
- }, function(){
176
- $(this).find('.ctf_shortcode_symbol').remove();
177
  });
178
 
179
  //Scroll to hash for quick links
180
- $('#ctf-admin a').click(function() {
181
  if(location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
182
  var target = $(this.hash);
183
  target = target.length ? target : this.hash.slice(1);
@@ -199,7 +207,7 @@ jQuery(document).ready(function($){
199
  //Show initially if a width is set
200
  if(ctfWidth.length > 1 && !(ctfWidth == '100' && ctfWidthUnit == '%')) $ctfWidthOptions.show();
201
 
202
- $('#ctf_width, #ctf_width_unit').change(function(){
203
  ctfWidthUnit = $('#ctf-admin #ctf_width_unit').val(),
204
  ctfWidth = $('#ctf-admin #ctf_width').val();
205
 
@@ -214,7 +222,7 @@ jQuery(document).ready(function($){
214
  // clear cache
215
  var $ctfClearCacheButton = $('#ctf-admin #ctf-clear-cache');
216
 
217
- $ctfClearCacheButton.click(function(event) {
218
  event.preventDefault();
219
 
220
  $('#ctf-clear-cache-success').remove();
@@ -240,7 +248,7 @@ jQuery(document).ready(function($){
240
  // clear persistent cache
241
  var $ctfClearPersistentCacheButton = $('#ctf-admin #ctf-clear-persistent-cache');
242
 
243
- $ctfClearPersistentCacheButton.click(function(event) {
244
  event.preventDefault();
245
 
246
  $('#ctf-clear-cache-success').remove();
@@ -263,7 +271,7 @@ jQuery(document).ready(function($){
263
  }); // ajax call
264
  }); // clear-persistent-cache click
265
 
266
- $('.ctf-opt-in').click(function(event) {
267
  event.preventDefault();
268
 
269
  var $btn = jQuery(this);
@@ -272,7 +280,7 @@ jQuery(document).ready(function($){
272
  ctfSubmitOptIn(true);
273
  }); // clear_comment_cache click
274
 
275
- $('.ctf-no-usage-opt-out').click(function(event) {
276
  event.preventDefault();
277
 
278
  var $btn = jQuery(this);
@@ -304,10 +312,10 @@ jQuery(document).ready(function($){
304
  $pro.find('input, select, textarea').attr('disabled', 'true');
305
  }
306
  });
307
- $('#ctf_include_twittercards, #ctf_include_media, #ctf_include_replied_to').attr('disabled', 'true').removeAttr('checked').next('label').css('color', '#999').after(ctfUpgradeNote);
308
 
309
  $('#ctf-admin .ctf-show-pro').closest('span').next('.ctf-pro-options').hide();
310
- $('#ctf-admin .ctf-show-pro').click(function() {
311
  if ($(this).closest('span').next('.ctf-pro-options').is(':visible')) {
312
  $(this).closest('span').next('.ctf-pro-options').hide();
313
  } else {
@@ -322,7 +330,7 @@ jQuery(document).ready(function($){
322
  }, 1);
323
  }
324
  ctfUpdateLayoutTypeOptionsDisplay();
325
- jQuery('.ctf_layout_type').change(ctfUpdateLayoutTypeOptionsDisplay);
326
 
327
  // notices
328
 
@@ -333,7 +341,7 @@ jQuery(document).ready(function($){
333
  jQuery('#ctf-notice-bar').show();
334
  }
335
 
336
- jQuery('#ctf-notice-bar .dismiss').click(function(e) {
337
  e.preventDefault();
338
  jQuery('#ctf-notice-bar').remove();
339
  jQuery.ajax({
@@ -372,4 +380,289 @@ jQuery(document).ready(function($){
372
  }
373
  ctfCheckGdprSetting();
374
 
375
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  $ctfToggleSearchGuide.closest('h4').next('div').hide();
115
 
116
  // show on click
117
+ $ctfToggleSearchGuide.on('click',function(){
118
  $(this).closest('h4').next('div').slideToggle();
119
  });
120
 
121
  // tooltips
122
+ $('#ctf-admin .ctf-tooltip-link').on('click',function(){
123
  $(this).closest('tr, h3, .ctf-tooltip-wrap').find('.ctf-tooltip').slideToggle();
124
  });
125
 
160
  // shortcode tooltips
161
  var $ctfAdminLabel = $('#ctf-admin label');
162
 
163
+ $ctfAdminLabel.on('click',function(){
164
  var $sbi_shortcode = $(this).siblings('.ctf_shortcode');
165
  if($sbi_shortcode.is(':visible')){
166
+ $(this).removeClass('ctf_shortcode_visible');
167
  $(this).siblings('.ctf_shortcode').css('display','none');
168
  } else {
169
+ $(this).addClass('ctf_shortcode_visible');
170
  $(this).siblings('.ctf_shortcode').css('display','block');
171
  }
172
  });
173
+
174
+ $ctfAdminLabel.on('mouseenter mouseleave', function(e) {
175
+ switch(e.type) {
176
+ case 'mouseenter':
177
+ if($(this).siblings('.ctf_shortcode').length > 0 ){
178
+ $(this).attr('title', 'Click for shortcode option').append('<code class="ctf_shortcode_symbol">[]</code>');
179
+ }
180
+ break;
181
+ case 'mouseleave':
182
+ $(this).find('.ctf_shortcode_symbol').remove();
183
+ break;
184
  }
 
 
185
  });
186
 
187
  //Scroll to hash for quick links
188
+ $('#ctf-admin a').on('click',function() {
189
  if(location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
190
  var target = $(this.hash);
191
  target = target.length ? target : this.hash.slice(1);
207
  //Show initially if a width is set
208
  if(ctfWidth.length > 1 && !(ctfWidth == '100' && ctfWidthUnit == '%')) $ctfWidthOptions.show();
209
 
210
+ $('#ctf_width, #ctf_width_unit').on('change',function(){
211
  ctfWidthUnit = $('#ctf-admin #ctf_width_unit').val(),
212
  ctfWidth = $('#ctf-admin #ctf_width').val();
213
 
222
  // clear cache
223
  var $ctfClearCacheButton = $('#ctf-admin #ctf-clear-cache');
224
 
225
+ $ctfClearCacheButton.on('click',function(event) {
226
  event.preventDefault();
227
 
228
  $('#ctf-clear-cache-success').remove();
248
  // clear persistent cache
249
  var $ctfClearPersistentCacheButton = $('#ctf-admin #ctf-clear-persistent-cache');
250
 
251
+ $ctfClearPersistentCacheButton.on('click',function(event) {
252
  event.preventDefault();
253
 
254
  $('#ctf-clear-cache-success').remove();
271
  }); // ajax call
272
  }); // clear-persistent-cache click
273
 
274
+ $('.ctf-opt-in').on('click',function(event) {
275
  event.preventDefault();
276
 
277
  var $btn = jQuery(this);
280
  ctfSubmitOptIn(true);
281
  }); // clear_comment_cache click
282
 
283
+ $('.ctf-no-usage-opt-out').on('click',function(event) {
284
  event.preventDefault();
285
 
286
  var $btn = jQuery(this);
312
  $pro.find('input, select, textarea').attr('disabled', 'true');
313
  }
314
  });
315
+ $('#ctf_include_twittercards, #ctf_include_media, #ctf_include_replied_to').prop('disabled', true).prop('checked',false).next('label').css('color', '#999').after(ctfUpgradeNote);
316
 
317
  $('#ctf-admin .ctf-show-pro').closest('span').next('.ctf-pro-options').hide();
318
+ $('#ctf-admin .ctf-show-pro').on('click',function() {
319
  if ($(this).closest('span').next('.ctf-pro-options').is(':visible')) {
320
  $(this).closest('span').next('.ctf-pro-options').hide();
321
  } else {
330
  }, 1);
331
  }
332
  ctfUpdateLayoutTypeOptionsDisplay();
333
+ jQuery('.ctf_layout_type').on('change',ctfUpdateLayoutTypeOptionsDisplay);
334
 
335
  // notices
336
 
341
  jQuery('#ctf-notice-bar').show();
342
  }
343
 
344
+ jQuery('#ctf-notice-bar .dismiss').on('click',function(e) {
345
  e.preventDefault();
346
  jQuery('#ctf-notice-bar').remove();
347
  jQuery.ajax({
380
  }
381
  ctfCheckGdprSetting();
382
 
383
+ // Locator
384
+ jQuery('.ctf-locator-more').click(function(e) {
385
+ e.preventDefault();
386
+ jQuery(this).closest('td').find('.ctf-full-wrap').show();
387
+ jQuery(this).closest('td').find('.ctf-condensed-wrap').hide();
388
+ jQuery(this).remove();
389
+ });
390
+
391
+ //Click event for other plugins in menu
392
+ $('.ctf_get_sbi, .ctf_get_cff, .ctf_get_ctf, .ctf_get_yt').parent().on('click', function(e){
393
+ e.preventDefault();
394
+
395
+ jQuery('.sb_cross_install_modal').remove();
396
+
397
+ $('#wpbody-content').prepend('<div class="sb_cross_install_modal"><div class="sb_cross_install_inner" id="ctf-admin-about"><div id="ctf-admin-addons"><div class="addons-container"><i class="fa fa-spinner fa-spin ctf-loader" aria-hidden="true"></i></div></div></div></div>');
398
+
399
+ var $self = $(this).find('span'),
400
+ sb_get_plugin = 'custom_twitter_feeds';
401
+
402
+ if( $self.hasClass('ctf_get_cff') ){
403
+ sb_get_plugin = 'custom_facebook_feed';
404
+ } else if( $self.hasClass('ctf_get_sbi') ){
405
+ sb_get_plugin = 'instagram_feed';
406
+ } else if( $self.hasClass('ctf_get_yt') ){
407
+ sb_get_plugin = 'feeds_for_youtube';
408
+ }
409
+
410
+ $get_plugins_url = ctf.ajax_url.replace('admin-ajax.php', '');
411
+
412
+ // Get the quick install box from the about page
413
+ $('.sb_cross_install_modal .addons-container').load($get_plugins_url+'admin.php?page=custom-twitter-feeds&tab=more #install_'+sb_get_plugin);
414
+ });
415
+ //Close the modal if clicking anywhere outside it
416
+ jQuery('body').on('click', '.sb_cross_install_modal', function(e){
417
+ if (e.target !== this) return;
418
+ jQuery('.sb_cross_install_modal').remove();
419
+ });
420
+ });
421
+
422
+ /* global smash_admin, jconfirm, wpCookies, Choices, List */
423
+
424
+ (function($) {
425
+
426
+ 'use strict';
427
+
428
+ // Global settings access.
429
+ var s;
430
+
431
+ // Admin object.
432
+ var SmashAdmin = {
433
+
434
+ // Settings.
435
+ settings: {
436
+ iconActivate: '<i class="fa fa-toggle-on fa-flip-horizontal" aria-hidden="true"></i>',
437
+ iconDeactivate: '<i class="fa fa-toggle-on" aria-hidden="true"></i>',
438
+ iconInstall: '<i class="fa fa-cloud-download" aria-hidden="true"></i>',
439
+ iconSpinner: '<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>',
440
+ mediaFrame: false
441
+ },
442
+
443
+ /**
444
+ * Start the engine.
445
+ *
446
+ * @since 1.3.9
447
+ */
448
+ init: function() {
449
+
450
+ // Settings shortcut.
451
+ s = this.settings;
452
+
453
+ // Document ready.
454
+ $( document ).ready( SmashAdmin.ready );
455
+
456
+ // Addons List.
457
+ SmashAdmin.initAddons();
458
+ },
459
+
460
+ /**
461
+ * Document ready.
462
+ *
463
+ * @since 1.3.9
464
+ */
465
+ ready: function() {
466
+
467
+ // Action available for each binding.
468
+ $( document ).trigger( 'smashReady' );
469
+ },
470
+
471
+ //--------------------------------------------------------------------//
472
+ // Addons List.
473
+ //--------------------------------------------------------------------//
474
+
475
+ /**
476
+ * Element bindings for Addons List page.
477
+ *
478
+ * @since 1.3.9
479
+ */
480
+ initAddons: function() {
481
+
482
+ // Some actions have to be delayed to document.ready.
483
+ $( document ).on( 'smashReady', function() {
484
+
485
+ // Only run on the addons page.
486
+ if ( ! $( '#ctf-admin-addons' ).length ) {
487
+ return;
488
+ }
489
+
490
+ // Display all addon boxes as the same height.
491
+ if( $( '#ctf-admin-about .addon-item').length ){
492
+ $( '#ctf-admin-about .addon-item .details' ).matchHeight( { byrow: false, property: 'height' } );
493
+ }
494
+
495
+ // Addons searching.
496
+ if ( $('#ctf-admin-addons-list').length ) {
497
+ var addonSearch = new List( 'ctf-admin-addons-list', {
498
+ valueNames: [ 'addon-name' ]
499
+ } );
500
+
501
+ $( '#ctf-admin-addons-search' ).on( 'keyup', function () {
502
+ var searchTerm = $( this ).val(),
503
+ $heading = $( '#addons-heading' );
504
+
505
+ if ( searchTerm ) {
506
+ $heading.text( ctf_admin_strings.addon_search );
507
+ }
508
+ else {
509
+ $heading.text( $heading.data( 'text' ) );
510
+ }
511
+
512
+ addonSearch.search( searchTerm );
513
+ } );
514
+ }
515
+ });
516
+
517
+ // Toggle an addon state.
518
+ $( document ).on( 'click', '#ctf-admin-addons .addon-item button', function( event ) {
519
+
520
+ event.preventDefault();
521
+
522
+ if ( $( this ).hasClass( 'disabled' ) ) {
523
+ return false;
524
+ }
525
+
526
+ SmashAdmin.addonToggle( $( this ) );
527
+ });
528
+ },
529
+
530
+ /**
531
+ * Toggle addon state.
532
+ *
533
+ * @since 1.3.9
534
+ */
535
+ addonToggle: function( $btn ) {
536
+
537
+ var $addon = $btn.closest( '.addon-item' ),
538
+ plugin = $btn.attr( 'data-plugin' ),
539
+ plugin_type = $btn.attr( 'data-type' ),
540
+ action,
541
+ cssClass,
542
+ statusText,
543
+ buttonText,
544
+ errorText,
545
+ successText;
546
+
547
+ if ( $btn.hasClass( 'status-go-to-url' ) ) {
548
+ // Open url in new tab.
549
+ window.open( $btn.attr('data-plugin'), '_blank' );
550
+ return;
551
+ }
552
+
553
+ $btn.prop( 'disabled', true ).addClass( 'loading' );
554
+ $btn.html( s.iconSpinner );
555
+
556
+ if ( $btn.hasClass( 'status-active' ) ) {
557
+ // Deactivate.
558
+ action = 'ctf_deactivate_addon';
559
+ cssClass = 'status-inactive';
560
+ if ( plugin_type === 'plugin' ) {
561
+ cssClass += ' button button-secondary';
562
+ }
563
+ statusText = ctf_admin_strings.addon_inactive;
564
+ buttonText = ctf_admin_strings.addon_activate;
565
+ if ( plugin_type === 'addon' ) {
566
+ buttonText = s.iconActivate + buttonText;
567
+ }
568
+ errorText = s.iconDeactivate + ctf_admin_strings.addon_deactivate;
569
+
570
+ } else if ( $btn.hasClass( 'status-inactive' ) ) {
571
+ // Activate.
572
+ action = 'ctf_activate_addon';
573
+ cssClass = 'status-active';
574
+ if ( plugin_type === 'plugin' ) {
575
+ cssClass += ' button button-secondary disabled';
576
+ }
577
+ statusText = ctf_admin_strings.addon_active;
578
+ buttonText = ctf_admin_strings.addon_deactivate;
579
+ if ( plugin_type === 'addon' ) {
580
+ buttonText = s.iconDeactivate + buttonText;
581
+ } else if ( plugin_type === 'plugin' ) {
582
+ buttonText = ctf_admin_strings.addon_activated;
583
+ }
584
+ errorText = s.iconActivate + ctf_admin_strings.addon_activate;
585
+
586
+ } else if ( $btn.hasClass( 'status-download' ) ) {
587
+ // Install & Activate.
588
+ action = 'ctf_install_addon';
589
+ cssClass = 'status-active';
590
+ if ( plugin_type === 'plugin' ) {
591
+ cssClass += ' button disabled';
592
+ }
593
+ statusText = ctf_admin_strings.addon_active;
594
+ buttonText = ctf_admin_strings.addon_activated;
595
+ if ( plugin_type === 'addon' ) {
596
+ buttonText = s.iconActivate + ctf_admin_strings.addon_deactivate;
597
+ }
598
+ errorText = s.iconInstall + ctf_admin_strings.addon_activate;
599
+
600
+ } else {
601
+ return;
602
+ }
603
+
604
+ var data = {
605
+ action: action,
606
+ nonce : ctf_admin_strings.nonce,
607
+ plugin: plugin,
608
+ type : plugin_type
609
+ };
610
+ $.post( ctf_admin_strings.ajax_url, data, function( res ) {
611
+
612
+ if ( res.success ) {
613
+ if ( 'ctf_install_addon' === action ) {
614
+ $btn.attr( 'data-plugin', res.data.basename );
615
+ successText = res.data.msg;
616
+ if ( ! res.data.is_activated ) {
617
+ cssClass = 'status-inactive';
618
+ if ( plugin_type === 'plugin' ) {
619
+ cssClass = 'button';
620
+ }
621
+ statusText = ctf_admin_strings.addon_inactive;
622
+ buttonText = s.iconActivate + ctf_admin_strings.addon_activate;
623
+ }
624
+ } else {
625
+ successText = res.data;
626
+ }
627
+ $addon.find( '.actions' ).append( '<div class="msg success">'+successText+'</div>' );
628
+ $addon.find( 'span.status-label' )
629
+ .removeClass( 'status-active status-inactive status-download' )
630
+ .addClass( cssClass )
631
+ .removeClass( 'button button-primary button-secondary disabled' )
632
+ .text( statusText );
633
+ $btn
634
+ .removeClass( 'status-active status-inactive status-download' )
635
+ .removeClass( 'button button-primary button-secondary disabled' )
636
+ .addClass( cssClass ).html( buttonText );
637
+ } else {
638
+ if ( 'download_failed' === res.data[0].code ) {
639
+ if ( plugin_type === 'addon' ) {
640
+ $addon.find( '.actions' ).append( '<div class="msg error">'+ctf_admin_strings.addon_error+'</div>' );
641
+ } else {
642
+ $addon.find( '.actions' ).append( '<div class="msg error">'+ctf_admin_strings.plugin_error+'</div>' );
643
+ }
644
+ } else {
645
+ $addon.find( '.actions' ).append( '<div class="msg error">'+res.data+'</div>' );
646
+ }
647
+ $btn.html( errorText );
648
+ }
649
+
650
+ $btn.prop( 'disabled', false ).removeClass( 'loading' );
651
+
652
+ // Automatically clear addon messages after 3 seconds.
653
+ setTimeout( function() {
654
+ $( '.addon-item .msg' ).remove();
655
+ }, 3000 );
656
+
657
+ }).fail( function( xhr ) {
658
+ console.log( xhr.responseText );
659
+ });
660
+ },
661
+
662
+ };
663
+
664
+ SmashAdmin.init();
665
+
666
+ window.SmashAdmin = SmashAdmin;
667
+
668
+ })( jQuery );
js/ctf-scripts.js CHANGED
@@ -6,12 +6,28 @@ if(!ctf_js_exists){
6
  window.ctf_init = function() {
7
  window.ctfObject = {};
8
  if ($('.ctf').length
9
- && typeof $('.ctf').first().attr('ctf-gdpr') !== 'undefined') {
10
- window.ctfObject.consentGiven = false;
11
- window.ctfObject.gdpr = true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  } else {
13
  window.ctfObject.consentGiven = true;
14
  window.ctfObject.gdpr = false;
 
15
  }
16
 
17
  if ($('.ctf').length <= $('.ctf_is_initialized').length) {
@@ -24,6 +40,25 @@ if(!ctf_js_exists){
24
  function ctfScripts($ctf) {
25
  $ctf.addClass('ctf_is_initialized');
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  if (ctfCheckConsent()) {
28
  ctfRemovePrivacyFeatures($ctf);
29
  } else {
@@ -123,7 +158,7 @@ if(!ctf_js_exists){
123
 
124
  function ctfHashReplacer(hash) {
125
  //Remove white space at beginning of hash
126
- var replacementString = jQuery.trim(hash);
127
  //If the hash is a hex code then don't replace it with a link as it's likely in the style attr, eg: "color: #ff0000"
128
  if (/^#[0-9A-F]{6}$/i.test(replacementString)) {
129
  return replacementString;
@@ -141,7 +176,7 @@ if(!ctf_js_exists){
141
 
142
  //Link @tags
143
  function ctfReplaceTags(tag) {
144
- var replacementString = jQuery.trim(tag);
145
  return ' <a href="https://twitter.com/' + replacementString.substring(1) + '" target="_blank" rel="nofollow">' + replacementString + '</a>';
146
  }
147
 
@@ -174,7 +209,7 @@ if(!ctf_js_exists){
174
  //Change colors of some items to match tweet text
175
  $ctf.find('.ctf-author-name, .ctf-tweet-date, .ctf-author-screenname, .ctf-twitterlink, .ctf-author-box-link, .ctf-retweet-text, .ctf-quoted-tweet').css('color', $ctf.find('.ctf-tweet-text').css('color'));
176
 
177
- $ctf.find('.ctf_more').unbind('click').bind('click', function (e) {
178
  e.preventDefault();
179
  $(this).hide().next('.ctf_remaining').show();
180
  });
@@ -191,6 +226,9 @@ if(!ctf_js_exists){
191
  $ctfMore.addClass('ctf-loading').append('<div class="ctf-loader"></div>');
192
  $ctfMore.find('.ctf-loader').css('background-color', $ctfMore.css('color'));
193
 
 
 
 
194
  jQuery.ajax({
195
  url: ctf.ajax_url,
196
  type: 'post',
@@ -199,7 +237,10 @@ if(!ctf_js_exists){
199
  last_id_data: lastIDData,
200
  shortcode_data: shortcodeData,
201
  num_needed: numNeeded,
202
- persistent_index: persistentIndex
 
 
 
203
  },
204
  success: function (data) {
205
  if (lastIDData !== '') {
@@ -282,21 +323,21 @@ if(!ctf_js_exists){
282
  ctf_init();
283
 
284
  // Cookie Notice by dFactory
285
- $('#cookie-notice a').click(function() {
286
  setTimeout(function() {
287
  ctfAterConsentToggled();
288
  },1000);
289
  });
290
 
291
  // Cookie Notice by dFactory
292
- $('#cookie-law-info-bar a').click(function() {
293
  setTimeout(function() {
294
  ctfAterConsentToggled();
295
  },1000);
296
  });
297
 
298
  // GDPR Cookie Consent by WebToffee
299
- $('.cli-user-preference-checkbox').click(function(){
300
  ctfAterConsentToggled();
301
  });
302
 
@@ -374,10 +415,15 @@ if(!ctf_js_exists){
374
  });
375
  $ctf.find('.ctf-no-consent').removeClass('ctf-no-consent');
376
  //Header profile pic hover
377
- $ctf.find('.ctf-header .ctf-header-link').hover(function () {
378
- $ctf.find('.ctf-header .ctf-header-img-hover').fadeIn(200);
379
- }, function () {
380
- $ctf.find('.ctf-header .ctf-header-img-hover').stop().fadeOut(600);
 
 
 
 
 
381
  });
382
  }
383
 
@@ -458,6 +504,21 @@ if(!ctf_js_exists){
458
 
459
  return "";
460
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
461
  })(jQuery);
462
 
463
 
6
  window.ctf_init = function() {
7
  window.ctfObject = {};
8
  if ($('.ctf').length
9
+ && typeof $('.ctf').first().attr('data-ctf-flags') !== 'undefined') {
10
+ var flags = $('.ctf').first().attr('data-ctf-flags').split(',');
11
+
12
+ if (flags.indexOf('gdpr') > -1) {
13
+ window.ctfObject.consentGiven = false;
14
+ window.ctfObject.gdpr = true;
15
+ } else {
16
+ window.ctfObject.consentGiven = true;
17
+ window.ctfObject.gdpr = false;
18
+ }
19
+
20
+ if (flags.indexOf('locator') > -1) {
21
+ var random = Math.floor(Math.random() * $('.ctf').length);
22
+ window.ctfObject.locator = $('.ctf').length === 1 || (random === 1);
23
+ } else {
24
+ window.ctfObject.locator = false;
25
+ }
26
+
27
  } else {
28
  window.ctfObject.consentGiven = true;
29
  window.ctfObject.gdpr = false;
30
+ window.ctfObject.locator = false;
31
  }
32
 
33
  if ($('.ctf').length <= $('.ctf_is_initialized').length) {
40
  function ctfScripts($ctf) {
41
  $ctf.addClass('ctf_is_initialized');
42
 
43
+ if (window.ctfObject.locator) {
44
+ var feedID = typeof $ctf.attr('data-feed-id') ? $ctf.attr('data-feed-id') : 'ctf-single',
45
+ postID = typeof $ctf.attr('data-postid') ? $ctf.attr('data-postid') : '';
46
+
47
+ jQuery.ajax({
48
+ url: ctf.ajax_url,
49
+ type: 'post',
50
+ data: {
51
+ action: 'ctf_do_locator',
52
+ atts: $ctf.attr('data-ctfshortcode'),
53
+ feed_id: feedID,
54
+ location: ctfLocationGuess($ctf),
55
+ post_id: postID,
56
+ },
57
+ success: function (data) {
58
+ }
59
+ }); // ajax call
60
+ }
61
+
62
  if (ctfCheckConsent()) {
63
  ctfRemovePrivacyFeatures($ctf);
64
  } else {
158
 
159
  function ctfHashReplacer(hash) {
160
  //Remove white space at beginning of hash
161
+ var replacementString = hash.trim();
162
  //If the hash is a hex code then don't replace it with a link as it's likely in the style attr, eg: "color: #ff0000"
163
  if (/^#[0-9A-F]{6}$/i.test(replacementString)) {
164
  return replacementString;
176
 
177
  //Link @tags
178
  function ctfReplaceTags(tag) {
179
+ var replacementString = tag.trim();
180
  return ' <a href="https://twitter.com/' + replacementString.substring(1) + '" target="_blank" rel="nofollow">' + replacementString + '</a>';
181
  }
182
 
209
  //Change colors of some items to match tweet text
210
  $ctf.find('.ctf-author-name, .ctf-tweet-date, .ctf-author-screenname, .ctf-twitterlink, .ctf-author-box-link, .ctf-retweet-text, .ctf-quoted-tweet').css('color', $ctf.find('.ctf-tweet-text').css('color'));
211
 
212
+ $ctf.find('.ctf_more').off('click').on('click', function (e) {
213
  e.preventDefault();
214
  $(this).hide().next('.ctf_remaining').show();
215
  });
226
  $ctfMore.addClass('ctf-loading').append('<div class="ctf-loader"></div>');
227
  $ctfMore.find('.ctf-loader').css('background-color', $ctfMore.css('color'));
228
 
229
+ var feedID = typeof $ctf.attr('data-feed-id') ? $ctf.attr('data-feed-id') : 'ctf-single',
230
+ postID = typeof $ctf.attr('data-postid') ? $ctf.attr('data-postid') : '';
231
+
232
  jQuery.ajax({
233
  url: ctf.ajax_url,
234
  type: 'post',
237
  last_id_data: lastIDData,
238
  shortcode_data: shortcodeData,
239
  num_needed: numNeeded,
240
+ persistent_index: persistentIndex,
241
+ feed_id: feedID,
242
+ location: ctfLocationGuess($ctf),
243
+ post_id: postID,
244
  },
245
  success: function (data) {
246
  if (lastIDData !== '') {
323
  ctf_init();
324
 
325
  // Cookie Notice by dFactory
326
+ $('#cookie-notice a').on('click',function() {
327
  setTimeout(function() {
328
  ctfAterConsentToggled();
329
  },1000);
330
  });
331
 
332
  // Cookie Notice by dFactory
333
+ $('#cookie-law-info-bar a').on('click',function() {
334
  setTimeout(function() {
335
  ctfAterConsentToggled();
336
  },1000);
337
  });
338
 
339
  // GDPR Cookie Consent by WebToffee
340
+ $('.cli-user-preference-checkbox').on('click',function(){
341
  ctfAterConsentToggled();
342
  });
343
 
415
  });
416
  $ctf.find('.ctf-no-consent').removeClass('ctf-no-consent');
417
  //Header profile pic hover
418
+ $ctf.find('.ctf-header .ctf-header-link').on('mouseenter mouseleave', function(e) {
419
+ switch(e.type) {
420
+ case 'mouseenter':
421
+ $ctf.find('.ctf-header .ctf-header-img-hover').fadeIn(200);
422
+ break;
423
+ case 'mouseleave':
424
+ $ctf.find('.ctf-header .ctf-header-img-hover').stop().fadeOut(600);
425
+ break;
426
+ }
427
  });
428
  }
429
 
504
 
505
  return "";
506
  }
507
+ function ctfLocationGuess($feed) {
508
+ var location = 'content';
509
+
510
+ if ($feed.closest('footer').length) {
511
+ location = 'footer';
512
+ } else if ($feed.closest('.header').length
513
+ || $feed.closest('header').length) {
514
+ location = 'header';
515
+ } else if ($feed.closest('.sidebar').length
516
+ || $feed.closest('aside').length) {
517
+ location = 'sidebar';
518
+ }
519
+
520
+ return location;
521
+ }
522
  })(jQuery);
523
 
524
 
js/ctf-scripts.min.js CHANGED
@@ -1 +1 @@
1
- var ctf_js_exists=void 0!==ctf_js_exists;ctf_js_exists||function(u){function t(){if(window.ctfObject.consentGiven||!window.ctfObject.gdpr)return!0;if("undefined"!=typeof CLI_Cookie)null!==CLI_Cookie.read(CLI_ACCEPT_COOKIE_NAME)&&(window.ctfObject.consentGiven="yes"===CLI_Cookie.read("cookielawinfo-checkbox-non-necessary"));else if(void 0!==window.cnArgs){var u=("; "+document.cookie).split("; cookie_notice_accepted=");if(2===u.length){var t=u.pop().split(";").shift();window.ctfObject.consentGiven="true"===t}}else void 0!==window.cookieconsent?window.ctfObject.consentGiven="allow"===function(u){for(var t=u+"=",e=window.document.cookie.split(";"),n=0;n<e.length;n++){var i=e[n].trim();if(0==i.indexOf(t))return i.substring(t.length,i.length)}return""}("complianz_consent_status"):void 0!==window.Cookiebot?window.ctfObject.consentGiven=Cookiebot.consented:void 0!==window.BorlabsCookie&&(window.ctfObject.consentGiven=window.BorlabsCookie.checkCookieConsent("twitter"));var e=jQuery.Event("ctfcheckconsent");return e.feed=this,jQuery(window).trigger(e),window.ctfObject.consentGiven}function e(t){t.find(".ctf-hide-avatar").length&&!t.find(".ctf-hide-avatar.ctf-no-consent").length||t.find(".ctf-item").addClass("ctf-hide-avatar ctf-no-consent"),u(".ctf-header-img span").length&&u(".ctf-header-img").addClass("ctf-no-consent")}function n(t){c(),t.find(".ctf-item.ctf-no-consent").removeClass("ctf-hide-avatar"),t.find(".ctf-author-avatar").each(function(){u(this).find("span").replaceWith('<img src="'+u(this).find("span").attr("data-avatar")+'" alt="'+u(this).find("span").attr("data-alt")+'" width="48" height="48">')}),t.find(".ctf-header-img").each(function(){u(this).find("span").replaceWith('<img src="'+u(this).find("span").attr("data-avatar")+'" alt="'+u(this).find("span").attr("data-alt")+'" width="48" height="48">')}),t.find(".ctf-no-consent").removeClass("ctf-no-consent"),t.find(".ctf-header .ctf-header-link").hover(function(){t.find(".ctf-header .ctf-header-img-hover").fadeIn(200)},function(){t.find(".ctf-header .ctf-header-img-hover").stop().fadeOut(600)})}function i(){t()&&u(".ctf").each(function(){n(u(this))})}function c(){void 0===window.ctfObject.intentsIncluded&&(window.ctfObject.intentsIncluded=!1),u(".ctf").each(function(){window.ctfObject.intentsIncluded||void 0===u(this).attr("data-ctfintents")||(window.ctfObject.intentsIncluded=!0,function(){if(!window.__twitterIntentHandler){var u=/twitter\.com\/intent\/(\w+)/,t="scrollbars=yes,resizable=yes,toolbar=no,location=yes",e=550,n=420,i=screen.height,c=screen.width;document.addEventListener?document.addEventListener("click",a,!1):document.attachEvent&&document.attachEvent("onclick",a),window.__twitterIntentHandler=!0}function a(a){for(var o,s,f=(a=a||window.event).target||a.srcElement;f&&"a"!==f.nodeName.toLowerCase();)f=f.parentNode;f&&"a"===f.nodeName.toLowerCase()&&f.href&&f.href.match(u)&&(o=Math.round(c/2-e/2),s=0,i>n&&(s=Math.round(i/2-n/2)),window.open(f.href,"intent",t+",width="+e+",height="+n+",left="+o+",top="+s),a.returnValue=!1,a.preventDefault&&a.preventDefault())}}())})}window.ctf_init=function(){function i(i){i.addClass("ctf_is_initialized"),t()?n(i):e(i),i.find(".ctf-item.ctf-new").each(function(){var t,e,n,c,a,o,s=u(this),f=s.find(".ctf-tweet-text-media-wrap"),d=s.find(".ctf-tweet-text").remove(".ctf-tweet-text-media-wrap"),r=" "+d.html();if("true"!=i.attr("data-ctfdisablelinks")&&void 0!==r&&!i.find(".ctf-tweet-text-link").length){var A=i.attr("data-ctflinktextcolor"),l="";A&&(l=A.replace(";","").split("#")[1]),window.ctfLinkify=(t="[a-z\\d.-]+://",e="mailto:",n=new RegExp("(?:\\b[a-z\\d.-]+://[^<>\\s]+|\\b(?:(?:(?:[^\\s!@#$%^&*()_=+[\\]{}\\\\|;:'\",.<>/?]+)\\.)+(?:ac|ad|aero|ae|af|ag|ai|al|am|an|ao|aq|arpa|ar|asia|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|biz|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|cat|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|coop|com|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|info|int|in|io|iq|ir|is|it|je|jm|jobs|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mobi|mo|mp|mq|mr|ms|mt|museum|mu|mv|mw|mx|my|mz|name|na|nc|net|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pro|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|travel|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn--0zwm56d|xn--11b5bs3a9aj6g|xn--80akhbyknj4f|xn--9t4b11yi5a|xn--deba0ad|xn--g6w251d|xn--hgbk6aj7f53bba|xn--hlcj6aya9esc7a|xn--jxalpdlp|xn--kgbechtv|xn--zckzah|ye|yt|yu|za|zm|zw)|(?:(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5]))(?:[;/][^#?<>\\s]*)?(?:\\?[^#<>\\s]*)?(?:#[^<>\\s]*)?(?!\\w)|(?:mailto:)?[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:(?:(?:[^\\s!@#$%^&*()_=+[\\]{}\\\\|;:'\",.<>/?]+)\\.)+(?:ac|ad|aero|ae|af|ag|ai|al|am|an|ao|aq|arpa|ar|asia|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|biz|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|cat|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|coop|com|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|info|int|in|io|iq|ir|is|it|je|jm|jobs|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mobi|mo|mp|mq|mr|ms|mt|museum|mu|mv|mw|mx|my|mz|name|na|nc|net|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pro|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|travel|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn--0zwm56d|xn--11b5bs3a9aj6g|xn--80akhbyknj4f|xn--9t4b11yi5a|xn--deba0ad|xn--g6w251d|xn--hgbk6aj7f53bba|xn--hlcj6aya9esc7a|xn--jxalpdlp|xn--kgbechtv|xn--zckzah|ye|yt|yu|za|zm|zw)|(?:(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5]))(?:\\?[^#<>\\s]*)?(?:#[^<>\\s]*)?(?!\\w))","ig"),c=new RegExp("^"+t,"i"),a={"'":"`",">":"<",")":"(","]":"[","}":"{","B;":"B+","b:":"b9"},o={callback:function(u,t){return t?'<a href="'+t+'" title="'+t+'" target="_blank">'+u+"</a>":u},punct_regexp:/(?:[!?.,:;'"]|(?:&|&amp;)(?:lt|gt|quot|apos|raquo|laquo|rsaquo|lsaquo);)$/},function(u,t){t=t||{};var i,s,f,d,r,A,l,F,h,m,C,B,g="",w=[];for(s in o)void 0===t[s]&&(t[s]=o[s]);for(;i=n.exec(u);)if(f=i[0],l=(A=n.lastIndex)-f.length,!/[\/:]/.test(u.charAt(l-1))){do{F=f,B=f.substr(-1),(C=a[B])&&(h=f.match(new RegExp("\\"+C+"(?!$)","g")),m=f.match(new RegExp("\\"+B,"g")),(h?h.length:0)<(m?m.length:0)&&(f=f.substr(0,f.length-1),A--)),t.punct_regexp&&(f=f.replace(t.punct_regexp,function(u){return A-=u.length,""}))}while(f.length&&f!==F);d=f,c.test(d)||(d=(-1!==d.indexOf("@")?d.indexOf(e)?e:"":d.indexOf("irc.")?d.indexOf("ftp.")?"http://":"ftp://":"irc://")+d),r!=l&&(w.push([u.slice(r,l)]),r=A),w.push([f,d])}for(w.push([u.substr(r)]),s=0;s<w.length;s++)g+=t.callback.apply(window,w[s]);return g||u}),d.find("a").length||(d.find(".emoji").each(function(){u(this).replaceWith(u(this).attr("alt"))}),r=" "+d.html(),r=ctfLinkify(r));r.length>0&&(r=(r=r.replace(/<br>/g,"<br> ")).replace(/(^|\s)#(\w*[\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]+\w*)/gi,function(u){var t=jQuery.trim(u);return/^#[0-9A-F]{6}$/i.test(t)?t:' <a href="https://twitter.com/hashtag/'+t.substring(1)+'" target="_blank" rel="nofollow">'+t+"</a>"}));r=r.replace(/[\s][@]+[A-Za-z0-9-_]+/g,function(u){var t=jQuery.trim(u);return' <a href="https://twitter.com/'+t.substring(1)+'" target="_blank" rel="nofollow">'+t+"</a>"}),d.html(r.trim()),d.append(f),d.find("a").css("color","#"+l),f.css("color","#"+l)}s.find(".ctf-tweet-text a").each(function(){jQuery(this).text().indexOf("http")>-1&&jQuery(this).text().length>63&&jQuery(this).text(jQuery(this).text().substring(0,60)+"...")})}),i.find(".ctf-author-name, .ctf-tweet-date, .ctf-author-screenname, .ctf-twitterlink, .ctf-author-box-link, .ctf-retweet-text, .ctf-quoted-tweet").css("color",i.find(".ctf-tweet-text").css("color")),i.find(".ctf_more").unbind("click").bind("click",function(t){t.preventDefault(),u(this).hide().next(".ctf_remaining").show()}),"function"==typeof ctf_custom_js&&ctf_custom_js(u),i.find(".ctf-author-box-link p:empty").remove()}function a(u,t,e,n,c,a){n.addClass("ctf-loading").append('<div class="ctf-loader"></div>'),n.find(".ctf-loader").css("background-color",n.css("color")),jQuery.ajax({url:ctf.ajax_url,type:"post",data:{action:"ctf_get_more_posts",last_id_data:u,shortcode_data:t,num_needed:c,persistent_index:a},success:function(t){""!==u?(-1==t.indexOf("<meta charset")&&e.find(".ctf-item").removeClass("ctf-new").last().after(t),e.find(".ctf-out-of-tweets").length&&(n.hide(),e.find(".ctf-out-of-tweets p").eq(0).fadeIn().end().eq(1).delay(500).fadeIn())):e.find(".ctf-tweets").append(t),n.removeClass("ctf-loading").find(".ctf-loader").remove(),i(e)}})}window.ctfObject={},u(".ctf").length&&void 0!==u(".ctf").first().attr("ctf-gdpr")?(window.ctfObject.consentGiven=!1,window.ctfObject.gdpr=!0):(window.ctfObject.consentGiven=!0,window.ctfObject.gdpr=!1),u(".ctf").length<=u(".ctf_is_initialized").length||(window.ctfObject.consentGiven&&c(),u(".ctf").each(function(){var c=u(this),o=parseInt(c.attr("data-ctfneeded"));c.width()<=480&&c.addClass("ctf-narrow"),c.width()<=320&&c.addClass("ctf-super-narrow"),u(this).hasClass("ctf_is_initialized")||i(c),setTimeout(function(){if(o>0){var u=c.find(".ctf-more"),t=c.find(".ctf-item").last().attr("id"),e=c.find(".ctf-item").length;a(t,c.attr("data-ctfshortcode"),c,u,o,e)}},500),c.find(".ctf-more").on("click",function(){var t=u(this),e=c.find(".ctf-item").last().attr("id"),n=c.find(".ctf-item").length;a(e,c.attr("data-ctfshortcode"),c,t,0,n)}),c.find(".ctf-author-box-link p:empty").remove(),setTimeout(function(){t()?n(c):e(c)},500)}))},jQuery(document).ready(function(u){ctf_init(),u("#cookie-notice a").click(function(){setTimeout(function(){i()},1e3)}),u("#cookie-law-info-bar a").click(function(){setTimeout(function(){i()},1e3)}),u(".cli-user-preference-checkbox").click(function(){i()}),u(window).on("CookiebotOnAccept",function(u){i()}),u(document).on("cmplzAcceptAll",function(u){i()}),u(document).on("cmplzRevoke",function(u){i()}),u(document).on("borlabs-cookie-consent-saved",function(u){i()})})}(jQuery);
1
+ var ctf_js_exists=void 0!==ctf_js_exists;ctf_js_exists||function(u){function t(){if(window.ctfObject.consentGiven||!window.ctfObject.gdpr)return!0;if("undefined"!=typeof CLI_Cookie)null!==CLI_Cookie.read(CLI_ACCEPT_COOKIE_NAME)&&(window.ctfObject.consentGiven="yes"===CLI_Cookie.read("cookielawinfo-checkbox-non-necessary"));else if(void 0!==window.cnArgs){var u=("; "+document.cookie).split("; cookie_notice_accepted=");if(2===u.length){var t=u.pop().split(";").shift();window.ctfObject.consentGiven="true"===t}}else void 0!==window.cookieconsent?window.ctfObject.consentGiven="allow"===function(u){for(var t=u+"=",e=window.document.cookie.split(";"),n=0;n<e.length;n++){var a=e[n].trim();if(0==a.indexOf(t))return a.substring(t.length,a.length)}return""}("complianz_consent_status"):void 0!==window.Cookiebot?window.ctfObject.consentGiven=Cookiebot.consented:void 0!==window.BorlabsCookie&&(window.ctfObject.consentGiven=window.BorlabsCookie.checkCookieConsent("twitter"));var e=jQuery.Event("ctfcheckconsent");return e.feed=this,jQuery(window).trigger(e),window.ctfObject.consentGiven}function e(t){t.find(".ctf-hide-avatar").length&&!t.find(".ctf-hide-avatar.ctf-no-consent").length||t.find(".ctf-item").addClass("ctf-hide-avatar ctf-no-consent"),u(".ctf-header-img span").length&&u(".ctf-header-img").addClass("ctf-no-consent")}function n(t){c(),t.find(".ctf-item.ctf-no-consent").removeClass("ctf-hide-avatar"),t.find(".ctf-author-avatar").each(function(){u(this).find("span").replaceWith('<img src="'+u(this).find("span").attr("data-avatar")+'" alt="'+u(this).find("span").attr("data-alt")+'" width="48" height="48">')}),t.find(".ctf-header-img").each(function(){u(this).find("span").replaceWith('<img src="'+u(this).find("span").attr("data-avatar")+'" alt="'+u(this).find("span").attr("data-alt")+'" width="48" height="48">')}),t.find(".ctf-no-consent").removeClass("ctf-no-consent"),t.find(".ctf-header .ctf-header-link").on("mouseenter mouseleave",function(u){switch(u.type){case"mouseenter":t.find(".ctf-header .ctf-header-img-hover").fadeIn(200);break;case"mouseleave":t.find(".ctf-header .ctf-header-img-hover").stop().fadeOut(600)}})}function a(){t()&&u(".ctf").each(function(){n(u(this))})}function c(){void 0===window.ctfObject.intentsIncluded&&(window.ctfObject.intentsIncluded=!1),u(".ctf").each(function(){window.ctfObject.intentsIncluded||void 0===u(this).attr("data-ctfintents")||(window.ctfObject.intentsIncluded=!0,function(){if(!window.__twitterIntentHandler){var u=/twitter\.com\/intent\/(\w+)/,t="scrollbars=yes,resizable=yes,toolbar=no,location=yes",e=550,n=420,a=screen.height,c=screen.width;document.addEventListener?document.addEventListener("click",i,!1):document.attachEvent&&document.attachEvent("onclick",i),window.__twitterIntentHandler=!0}function i(i){for(var o,s,d=(i=i||window.event).target||i.srcElement;d&&"a"!==d.nodeName.toLowerCase();)d=d.parentNode;d&&"a"===d.nodeName.toLowerCase()&&d.href&&d.href.match(u)&&(o=Math.round(c/2-e/2),s=0,a>n&&(s=Math.round(a/2-n/2)),window.open(d.href,"intent",t+",width="+e+",height="+n+",left="+o+",top="+s),i.returnValue=!1,i.preventDefault&&i.preventDefault())}}())})}function i(u){var t="content";return u.closest("footer").length?t="footer":u.closest(".header").length||u.closest("header").length?t="header":(u.closest(".sidebar").length||u.closest("aside").length)&&(t="sidebar"),t}window.ctf_init=function(){if(window.ctfObject={},u(".ctf").length&&void 0!==u(".ctf").first().attr("data-ctf-flags")){var a=u(".ctf").first().attr("data-ctf-flags").split(",");if(a.indexOf("gdpr")>-1?(window.ctfObject.consentGiven=!1,window.ctfObject.gdpr=!0):(window.ctfObject.consentGiven=!0,window.ctfObject.gdpr=!1),a.indexOf("locator")>-1){var o=Math.floor(Math.random()*u(".ctf").length);window.ctfObject.locator=1===u(".ctf").length||1===o}else window.ctfObject.locator=!1}else window.ctfObject.consentGiven=!0,window.ctfObject.gdpr=!1,window.ctfObject.locator=!1;function s(a){if(a.addClass("ctf_is_initialized"),window.ctfObject.locator){var c=(a.attr("data-feed-id"),a.attr("data-feed-id")),o=(a.attr("data-postid"),a.attr("data-postid"));jQuery.ajax({url:ctf.ajax_url,type:"post",data:{action:"ctf_do_locator",atts:a.attr("data-ctfshortcode"),feed_id:c,location:i(a),post_id:o},success:function(u){}})}t()?n(a):e(a),a.find(".ctf-item.ctf-new").each(function(){var t,e,n,c,i,o,s=u(this),d=s.find(".ctf-tweet-text-media-wrap"),r=s.find(".ctf-tweet-text").remove(".ctf-tweet-text-media-wrap"),f=" "+r.html();if("true"!=a.attr("data-ctfdisablelinks")&&void 0!==f&&!a.find(".ctf-tweet-text-link").length){var A=a.attr("data-ctflinktextcolor"),l="";A&&(l=A.replace(";","").split("#")[1]),window.ctfLinkify=(t="[a-z\\d.-]+://",e="mailto:",n=new RegExp("(?:\\b[a-z\\d.-]+://[^<>\\s]+|\\b(?:(?:(?:[^\\s!@#$%^&*()_=+[\\]{}\\\\|;:'\",.<>/?]+)\\.)+(?:ac|ad|aero|ae|af|ag|ai|al|am|an|ao|aq|arpa|ar|asia|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|biz|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|cat|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|coop|com|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|info|int|in|io|iq|ir|is|it|je|jm|jobs|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mobi|mo|mp|mq|mr|ms|mt|museum|mu|mv|mw|mx|my|mz|name|na|nc|net|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pro|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|travel|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn--0zwm56d|xn--11b5bs3a9aj6g|xn--80akhbyknj4f|xn--9t4b11yi5a|xn--deba0ad|xn--g6w251d|xn--hgbk6aj7f53bba|xn--hlcj6aya9esc7a|xn--jxalpdlp|xn--kgbechtv|xn--zckzah|ye|yt|yu|za|zm|zw)|(?:(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5]))(?:[;/][^#?<>\\s]*)?(?:\\?[^#<>\\s]*)?(?:#[^<>\\s]*)?(?!\\w)|(?:mailto:)?[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:(?:(?:[^\\s!@#$%^&*()_=+[\\]{}\\\\|;:'\",.<>/?]+)\\.)+(?:ac|ad|aero|ae|af|ag|ai|al|am|an|ao|aq|arpa|ar|asia|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|biz|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|cat|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|coop|com|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|info|int|in|io|iq|ir|is|it|je|jm|jobs|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mobi|mo|mp|mq|mr|ms|mt|museum|mu|mv|mw|mx|my|mz|name|na|nc|net|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pro|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|travel|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn--0zwm56d|xn--11b5bs3a9aj6g|xn--80akhbyknj4f|xn--9t4b11yi5a|xn--deba0ad|xn--g6w251d|xn--hgbk6aj7f53bba|xn--hlcj6aya9esc7a|xn--jxalpdlp|xn--kgbechtv|xn--zckzah|ye|yt|yu|za|zm|zw)|(?:(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5]))(?:\\?[^#<>\\s]*)?(?:#[^<>\\s]*)?(?!\\w))","ig"),c=new RegExp("^"+t,"i"),i={"'":"`",">":"<",")":"(","]":"[","}":"{","B;":"B+","b:":"b9"},o={callback:function(u,t){return t?'<a href="'+t+'" title="'+t+'" target="_blank">'+u+"</a>":u},punct_regexp:/(?:[!?.,:;'"]|(?:&|&amp;)(?:lt|gt|quot|apos|raquo|laquo|rsaquo|lsaquo);)$/},function(u,t){t=t||{};var a,s,d,r,f,A,l,F,h,m,C,g,w="",B=[];for(s in o)void 0===t[s]&&(t[s]=o[s]);for(;a=n.exec(u);)if(d=a[0],l=(A=n.lastIndex)-d.length,!/[\/:]/.test(u.charAt(l-1))){do{F=d,g=d.substr(-1),(C=i[g])&&(h=d.match(new RegExp("\\"+C+"(?!$)","g")),m=d.match(new RegExp("\\"+g,"g")),(h?h.length:0)<(m?m.length:0)&&(d=d.substr(0,d.length-1),A--)),t.punct_regexp&&(d=d.replace(t.punct_regexp,function(u){return A-=u.length,""}))}while(d.length&&d!==F);r=d,c.test(r)||(r=(-1!==r.indexOf("@")?r.indexOf(e)?e:"":r.indexOf("irc.")?r.indexOf("ftp.")?"http://":"ftp://":"irc://")+r),f!=l&&(B.push([u.slice(f,l)]),f=A),B.push([d,r])}for(B.push([u.substr(f)]),s=0;s<B.length;s++)w+=t.callback.apply(window,B[s]);return w||u}),r.find("a").length||(r.find(".emoji").each(function(){u(this).replaceWith(u(this).attr("alt"))}),f=" "+r.html(),f=ctfLinkify(f));f.length>0&&(f=(f=f.replace(/<br>/g,"<br> ")).replace(/(^|\s)#(\w*[\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]+\w*)/gi,function(u){var t=u.trim();return/^#[0-9A-F]{6}$/i.test(t)?t:' <a href="https://twitter.com/hashtag/'+t.substring(1)+'" target="_blank" rel="nofollow">'+t+"</a>"}));f=f.replace(/[\s][@]+[A-Za-z0-9-_]+/g,function(u){var t=u.trim();return' <a href="https://twitter.com/'+t.substring(1)+'" target="_blank" rel="nofollow">'+t+"</a>"}),r.html(f.trim()),r.append(d),r.find("a").css("color","#"+l),d.css("color","#"+l)}s.find(".ctf-tweet-text a").each(function(){jQuery(this).text().indexOf("http")>-1&&jQuery(this).text().length>63&&jQuery(this).text(jQuery(this).text().substring(0,60)+"...")})}),a.find(".ctf-author-name, .ctf-tweet-date, .ctf-author-screenname, .ctf-twitterlink, .ctf-author-box-link, .ctf-retweet-text, .ctf-quoted-tweet").css("color",a.find(".ctf-tweet-text").css("color")),a.find(".ctf_more").off("click").on("click",function(t){t.preventDefault(),u(this).hide().next(".ctf_remaining").show()}),"function"==typeof ctf_custom_js&&ctf_custom_js(u),a.find(".ctf-author-box-link p:empty").remove()}function d(u,t,e,n,a,c){n.addClass("ctf-loading").append('<div class="ctf-loader"></div>'),n.find(".ctf-loader").css("background-color",n.css("color"));var o=(e.attr("data-feed-id"),e.attr("data-feed-id")),d=(e.attr("data-postid"),e.attr("data-postid"));jQuery.ajax({url:ctf.ajax_url,type:"post",data:{action:"ctf_get_more_posts",last_id_data:u,shortcode_data:t,num_needed:a,persistent_index:c,feed_id:o,location:i(e),post_id:d},success:function(t){""!==u?(-1==t.indexOf("<meta charset")&&e.find(".ctf-item").removeClass("ctf-new").last().after(t),e.find(".ctf-out-of-tweets").length&&(n.hide(),e.find(".ctf-out-of-tweets p").eq(0).fadeIn().end().eq(1).delay(500).fadeIn())):e.find(".ctf-tweets").append(t),n.removeClass("ctf-loading").find(".ctf-loader").remove(),s(e)}})}u(".ctf").length<=u(".ctf_is_initialized").length||(window.ctfObject.consentGiven&&c(),u(".ctf").each(function(){var a=u(this),c=parseInt(a.attr("data-ctfneeded"));a.width()<=480&&a.addClass("ctf-narrow"),a.width()<=320&&a.addClass("ctf-super-narrow"),u(this).hasClass("ctf_is_initialized")||s(a),setTimeout(function(){if(c>0){var u=a.find(".ctf-more"),t=a.find(".ctf-item").last().attr("id"),e=a.find(".ctf-item").length;d(t,a.attr("data-ctfshortcode"),a,u,c,e)}},500),a.find(".ctf-more").on("click",function(){var t=u(this),e=a.find(".ctf-item").last().attr("id"),n=a.find(".ctf-item").length;d(e,a.attr("data-ctfshortcode"),a,t,0,n)}),a.find(".ctf-author-box-link p:empty").remove(),setTimeout(function(){t()?n(a):e(a)},500)}))},jQuery(document).ready(function(u){ctf_init(),u("#cookie-notice a").on("click",function(){setTimeout(function(){a()},1e3)}),u("#cookie-law-info-bar a").on("click",function(){setTimeout(function(){a()},1e3)}),u(".cli-user-preference-checkbox").on("click",function(){a()}),u(window).on("CookiebotOnAccept",function(u){a()}),u(document).on("cmplzAcceptAll",function(u){a()}),u(document).on("cmplzRevoke",function(u){a()}),u(document).on("borlabs-cookie-consent-saved",function(u){a()})})}(jQuery);
js/jquery.matchHeight-min.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * jquery-match-height 0.7.2 by @liabru
3
+ * http://brm.io/jquery-match-height/
4
+ * License MIT
5
+ */
6
+ !function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):"undefined"!=typeof module&&module.exports?module.exports=t(require("jquery")):t(jQuery)}(function(t){var e=-1,o=-1,n=function(t){return parseFloat(t)||0},a=function(e){var o=1,a=t(e),i=null,r=[];return a.each(function(){var e=t(this),a=e.offset().top-n(e.css("margin-top")),s=r.length>0?r[r.length-1]:null;null===s?r.push(e):Math.floor(Math.abs(i-a))<=o?r[r.length-1]=s.add(e):r.push(e),i=a}),r},i=function(e){var o={
7
+ byRow:!0,property:"height",target:null,remove:!1};return"object"==typeof e?t.extend(o,e):("boolean"==typeof e?o.byRow=e:"remove"===e&&(o.remove=!0),o)},r=t.fn.matchHeight=function(e){var o=i(e);if(o.remove){var n=this;return this.css(o.property,""),t.each(r._groups,function(t,e){e.elements=e.elements.not(n)}),this}return this.length<=1&&!o.target?this:(r._groups.push({elements:this,options:o}),r._apply(this,o),this)};r.version="0.7.2",r._groups=[],r._throttle=80,r._maintainScroll=!1,r._beforeUpdate=null,
8
+ r._afterUpdate=null,r._rows=a,r._parse=n,r._parseOptions=i,r._apply=function(e,o){var s=i(o),h=t(e),l=[h],c=t(window).scrollTop(),p=t("html").outerHeight(!0),u=h.parents().filter(":hidden");return u.each(function(){var e=t(this);e.data("style-cache",e.attr("style"))}),u.css("display","block"),s.byRow&&!s.target&&(h.each(function(){var e=t(this),o=e.css("display");"inline-block"!==o&&"flex"!==o&&"inline-flex"!==o&&(o="block"),e.data("style-cache",e.attr("style")),e.css({display:o,"padding-top":"0",
9
+ "padding-bottom":"0","margin-top":"0","margin-bottom":"0","border-top-width":"0","border-bottom-width":"0",height:"100px",overflow:"hidden"})}),l=a(h),h.each(function(){var e=t(this);e.attr("style",e.data("style-cache")||"")})),t.each(l,function(e,o){var a=t(o),i=0;if(s.target)i=s.target.outerHeight(!1);else{if(s.byRow&&a.length<=1)return void a.css(s.property,"");a.each(function(){var e=t(this),o=e.attr("style"),n=e.css("display");"inline-block"!==n&&"flex"!==n&&"inline-flex"!==n&&(n="block");var a={
10
+ display:n};a[s.property]="",e.css(a),e.outerHeight(!1)>i&&(i=e.outerHeight(!1)),o?e.attr("style",o):e.css("display","")})}a.each(function(){var e=t(this),o=0;s.target&&e.is(s.target)||("border-box"!==e.css("box-sizing")&&(o+=n(e.css("border-top-width"))+n(e.css("border-bottom-width")),o+=n(e.css("padding-top"))+n(e.css("padding-bottom"))),e.css(s.property,i-o+"px"))})}),u.each(function(){var e=t(this);e.attr("style",e.data("style-cache")||null)}),r._maintainScroll&&t(window).scrollTop(c/p*t("html").outerHeight(!0)),
11
+ this},r._applyDataApi=function(){var e={};t("[data-match-height], [data-mh]").each(function(){var o=t(this),n=o.attr("data-mh")||o.attr("data-match-height");n in e?e[n]=e[n].add(o):e[n]=o}),t.each(e,function(){this.matchHeight(!0)})};var s=function(e){r._beforeUpdate&&r._beforeUpdate(e,r._groups),t.each(r._groups,function(){r._apply(this.elements,this.options)}),r._afterUpdate&&r._afterUpdate(e,r._groups)};r._update=function(n,a){if(a&&"resize"===a.type){var i=t(window).width();if(i===e)return;e=i;
12
+ }n?o===-1&&(o=setTimeout(function(){s(a),o=-1},r._throttle)):s(a)},t(r._applyDataApi);var h=t.fn.on?"on":"bind";t(window)[h]("load",function(t){r._update(!1,t)}),t(window)[h]("resize orientationchange",function(t){r._update(!0,t)})});
languages/custom-twitter-feeds.pot ADDED
@@ -0,0 +1,1309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #, fuzzy
2
+ msgid ""
3
+ msgstr ""
4
+ "Project-Id-Version: \n"
5
+ "POT-Creation-Date: 2021-03-04 13:40-0600\n"
6
+ "PO-Revision-Date: 2021-03-04 13:32-0600\n"
7
+ "Last-Translator: \n"
8
+ "Language-Team: \n"
9
+ "Language: en\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "X-Generator: Poedit 2.4.2\n"
14
+ "X-Poedit-Basepath: ..\n"
15
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
16
+ "X-Poedit-KeywordsList: __;_e;esc_attr__;esc_attr_e;esc_html__;esc_html_e\n"
17
+ "X-Poedit-SearchPath-0: .\n"
18
+
19
+ #: custom-twitter-feed.php:285
20
+ msgid "Settings"
21
+ msgstr ""
22
+
23
+ #: inc/CtfAdmin.php:101
24
+ msgid "Or, manually enter my own Twitter app information"
25
+ msgstr ""
26
+
27
+ #: inc/CtfAdmin.php:104
28
+ msgid ""
29
+ "Check this box if you would like to manually enter the information from your "
30
+ "own <a href=\"https://smashballoon.com/custom-twitter-feeds/docs/create-"
31
+ "twitter-app/?utm_campaign=twitter-"
32
+ "free&utm_source=settings&utm_medium=createownapp\" target=\"_blank\">Twitter "
33
+ "app</a>"
34
+ msgstr ""
35
+
36
+ #: inc/CtfAdmin.php:120 inc/CtfAdmin.php:130 inc/CtfAdmin.php:135
37
+ msgid "Log in to Twitter and get my Access Token and Secret"
38
+ msgstr ""
39
+
40
+ #: inc/CtfAdmin.php:121 inc/CtfAdmin.php:131 inc/CtfAdmin.php:136
41
+ msgid "Button not working?"
42
+ msgstr ""
43
+
44
+ #: inc/CtfAdmin.php:129
45
+ msgid ""
46
+ "There was an error with retrieving your access tokens. Please <a href="
47
+ "\"https://smashballoon.com/custom-twitter-feeds/token/?utm_campaign=twitter-"
48
+ "free&utm_source=settings&utm_medium=errorconnecting\" target=\"_blank\">use "
49
+ "this tool</a> to get your access token and secret."
50
+ msgstr ""
51
+
52
+ #: inc/CtfAdmin.php:225
53
+ msgid "Feed Finder"
54
+ msgstr ""
55
+
56
+ #: inc/CtfAdmin.php:261
57
+ msgid "(only recent tweets initially)"
58
+ msgstr ""
59
+
60
+ #: inc/CtfAdmin.php:1288
61
+ msgid "Include replies"
62
+ msgstr ""
63
+
64
+ #: inc/CtfAdmin.php:1334
65
+ msgid "Set to be 100% width on mobile?"
66
+ msgstr ""
67
+
68
+ #: inc/CtfAdmin.php:1335 inc/CtfAdmin.php:1782
69
+ msgid "What does this mean?"
70
+ msgstr ""
71
+
72
+ #: inc/CtfAdmin.php:1336
73
+ #, php-format
74
+ msgid ""
75
+ "If you set a width on the feed then this will be used on mobile as well as "
76
+ "desktop. Check this setting to set the feed width to be 100% on mobile so "
77
+ "that it is responsive."
78
+ msgstr ""
79
+
80
+ #: inc/CtfAdmin.php:1372
81
+ msgid "Minutes"
82
+ msgstr ""
83
+
84
+ #: inc/CtfAdmin.php:1374
85
+ msgid "Hours"
86
+ msgstr ""
87
+
88
+ #: inc/CtfAdmin.php:1375
89
+ msgid "Days"
90
+ msgstr ""
91
+
92
+ #: inc/CtfAdmin.php:1377
93
+ msgid "Clear Twitter Cache"
94
+ msgstr ""
95
+
96
+ #: inc/CtfAdmin.php:1379
97
+ msgid "Clicking this button will clear all cached data for your Twitter feeds"
98
+ msgstr ""
99
+
100
+ #: inc/CtfAdmin.php:1381
101
+ msgid ""
102
+ "Due to changes in Twitter's API usage policy, the minimum caching time for "
103
+ "the plugin is 1 hour. To check for Tweets more often either create your own "
104
+ "Twitter Developer app or upgrade to the Pro version."
105
+ msgstr ""
106
+
107
+ #: inc/CtfAdmin.php:1393
108
+ msgid "2h / 25 Feb"
109
+ msgstr ""
110
+
111
+ #: inc/CtfAdmin.php:1412
112
+ msgid "Examples"
113
+ msgstr ""
114
+
115
+ #: inc/CtfAdmin.php:1425
116
+ msgid "translation for \"m\" (minutes)"
117
+ msgstr ""
118
+
119
+ #: inc/CtfAdmin.php:1427
120
+ msgid "translation for \"h\" (hours)"
121
+ msgstr ""
122
+
123
+ #: inc/CtfAdmin.php:1429
124
+ msgid "translation for \"now\""
125
+ msgstr ""
126
+
127
+ #: inc/CtfAdmin.php:1503
128
+ msgid "default from Twitter"
129
+ msgstr ""
130
+
131
+ #: inc/CtfAdmin.php:1504
132
+ msgid "(GMT11:00) Midway Island, Samoa"
133
+ msgstr ""
134
+
135
+ #: inc/CtfAdmin.php:1505
136
+ msgid "(GMT10:00) HawaiiAleutian"
137
+ msgstr ""
138
+
139
+ #: inc/CtfAdmin.php:1506
140
+ msgid "(GMT10:00) Hawaii"
141
+ msgstr ""
142
+
143
+ #: inc/CtfAdmin.php:1507
144
+ msgid "(GMT09:30) Marquesas Islands"
145
+ msgstr ""
146
+
147
+ #: inc/CtfAdmin.php:1508
148
+ msgid "(GMT09:00) Gambier Islands"
149
+ msgstr ""
150
+
151
+ #: inc/CtfAdmin.php:1509
152
+ msgid "(GMT09:00) Alaska"
153
+ msgstr ""
154
+
155
+ #: inc/CtfAdmin.php:1510
156
+ msgid "(GMT08:00) Tijuana, Baja California"
157
+ msgstr ""
158
+
159
+ #: inc/CtfAdmin.php:1511
160
+ msgid "(GMT08:00) Pitcairn Islands"
161
+ msgstr ""
162
+
163
+ #: inc/CtfAdmin.php:1512
164
+ msgid "(GMT08:00) Pacific Time (US & Canada)"
165
+ msgstr ""
166
+
167
+ #: inc/CtfAdmin.php:1513
168
+ msgid "(GMT07:00) Mountain Time (US & Canada)"
169
+ msgstr ""
170
+
171
+ #: inc/CtfAdmin.php:1514
172
+ msgid "(GMT07:00) Chihuahua, La Paz, Mazatlan"
173
+ msgstr ""
174
+
175
+ #: inc/CtfAdmin.php:1515
176
+ msgid "(GMT07:00) Arizona"
177
+ msgstr ""
178
+
179
+ #: inc/CtfAdmin.php:1516
180
+ msgid "(GMT06:00) Saskatchewan, Central America"
181
+ msgstr ""
182
+
183
+ #: inc/CtfAdmin.php:1517
184
+ msgid "(GMT06:00) Guadalajara, Mexico City, Monterrey"
185
+ msgstr ""
186
+
187
+ #: inc/CtfAdmin.php:1518
188
+ msgid "(GMT06:00) Easter Island"
189
+ msgstr ""
190
+
191
+ #: inc/CtfAdmin.php:1519
192
+ msgid "(GMT06:00) Central Time (US & Canada)"
193
+ msgstr ""
194
+
195
+ #: inc/CtfAdmin.php:1520
196
+ msgid "(GMT05:00) Eastern Time (US & Canada)"
197
+ msgstr ""
198
+
199
+ #: inc/CtfAdmin.php:1521
200
+ msgid "(GMT05:00) Cuba"
201
+ msgstr ""
202
+
203
+ #: inc/CtfAdmin.php:1522
204
+ msgid "(GMT05:00) Bogota, Lima, Quito, Rio Branco"
205
+ msgstr ""
206
+
207
+ #: inc/CtfAdmin.php:1523
208
+ msgid "(GMT04:30) Caracas"
209
+ msgstr ""
210
+
211
+ #: inc/CtfAdmin.php:1524
212
+ msgid "(GMT04:00) Santiago"
213
+ msgstr ""
214
+
215
+ #: inc/CtfAdmin.php:1525
216
+ msgid "(GMT04:00) La Paz"
217
+ msgstr ""
218
+
219
+ #: inc/CtfAdmin.php:1526
220
+ msgid "(GMT04:00) Faukland Islands"
221
+ msgstr ""
222
+
223
+ #: inc/CtfAdmin.php:1527
224
+ msgid "(GMT04:00) Brazil"
225
+ msgstr ""
226
+
227
+ #: inc/CtfAdmin.php:1528
228
+ msgid "(GMT04:00) Atlantic Time (Goose Bay)"
229
+ msgstr ""
230
+
231
+ #: inc/CtfAdmin.php:1529
232
+ msgid "(GMT04:00) Atlantic Time (Canada)"
233
+ msgstr ""
234
+
235
+ #: inc/CtfAdmin.php:1530
236
+ msgid "(GMT03:30) Newfoundland"
237
+ msgstr ""
238
+
239
+ #: inc/CtfAdmin.php:1531
240
+ msgid "(GMT03:00) UTC3"
241
+ msgstr ""
242
+
243
+ #: inc/CtfAdmin.php:1532
244
+ msgid "(GMT03:00) Montevideo"
245
+ msgstr ""
246
+
247
+ #: inc/CtfAdmin.php:1533
248
+ msgid "(GMT03:00) Miquelon, St. Pierre"
249
+ msgstr ""
250
+
251
+ #: inc/CtfAdmin.php:1534
252
+ msgid "(GMT03:00) Greenland"
253
+ msgstr ""
254
+
255
+ #: inc/CtfAdmin.php:1535
256
+ msgid "(GMT03:00) Buenos Aires"
257
+ msgstr ""
258
+
259
+ #: inc/CtfAdmin.php:1536
260
+ msgid "(GMT03:00) Brasilia"
261
+ msgstr ""
262
+
263
+ #: inc/CtfAdmin.php:1537
264
+ msgid "(GMT02:00) MidAtlantic"
265
+ msgstr ""
266
+
267
+ #: inc/CtfAdmin.php:1538
268
+ msgid "(GMT01:00) Cape Verde Is."
269
+ msgstr ""
270
+
271
+ #: inc/CtfAdmin.php:1539
272
+ msgid "(GMT01:00) Azores"
273
+ msgstr ""
274
+
275
+ #: inc/CtfAdmin.php:1540
276
+ msgid "(GMT) Greenwich Mean Time : Belfast"
277
+ msgstr ""
278
+
279
+ #: inc/CtfAdmin.php:1541
280
+ msgid "(GMT) Greenwich Mean Time : Dublin"
281
+ msgstr ""
282
+
283
+ #: inc/CtfAdmin.php:1542
284
+ msgid "(GMT) Greenwich Mean Time : Lisbon"
285
+ msgstr ""
286
+
287
+ #: inc/CtfAdmin.php:1543
288
+ msgid "(GMT) Greenwich Mean Time : London"
289
+ msgstr ""
290
+
291
+ #: inc/CtfAdmin.php:1544
292
+ msgid "(GMT) Monrovia, Reykjavik"
293
+ msgstr ""
294
+
295
+ #: inc/CtfAdmin.php:1545
296
+ msgid "(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna"
297
+ msgstr ""
298
+
299
+ #: inc/CtfAdmin.php:1546
300
+ msgid "(GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague"
301
+ msgstr ""
302
+
303
+ #: inc/CtfAdmin.php:1547
304
+ msgid "(GMT+01:00) Brussels, Copenhagen, Madrid, Paris"
305
+ msgstr ""
306
+
307
+ #: inc/CtfAdmin.php:1548
308
+ msgid "(GMT+01:00) West Central Africa"
309
+ msgstr ""
310
+
311
+ #: inc/CtfAdmin.php:1549
312
+ msgid "(GMT+01:00) Windhoek"
313
+ msgstr ""
314
+
315
+ #: inc/CtfAdmin.php:1550
316
+ msgid "(GMT+02:00) Beirut"
317
+ msgstr ""
318
+
319
+ #: inc/CtfAdmin.php:1551
320
+ msgid "(GMT+02:00) Cairo"
321
+ msgstr ""
322
+
323
+ #: inc/CtfAdmin.php:1552
324
+ msgid "(GMT+02:00) Gaza"
325
+ msgstr ""
326
+
327
+ #: inc/CtfAdmin.php:1553
328
+ msgid "(GMT+02:00) Harare, Pretoria"
329
+ msgstr ""
330
+
331
+ #: inc/CtfAdmin.php:1554
332
+ msgid "(GMT+02:00) Jerusalem"
333
+ msgstr ""
334
+
335
+ #: inc/CtfAdmin.php:1555
336
+ msgid "(GMT+02:00) Minsk"
337
+ msgstr ""
338
+
339
+ #: inc/CtfAdmin.php:1556
340
+ msgid "(GMT+02:00) Syria"
341
+ msgstr ""
342
+
343
+ #: inc/CtfAdmin.php:1557
344
+ msgid "(GMT+03:00) Moscow, St. Petersburg, Volgograd"
345
+ msgstr ""
346
+
347
+ #: inc/CtfAdmin.php:1558
348
+ msgid "(GMT+03:00) Nairobi"
349
+ msgstr ""
350
+
351
+ #: inc/CtfAdmin.php:1559
352
+ msgid "(GMT+03:30) Tehran"
353
+ msgstr ""
354
+
355
+ #: inc/CtfAdmin.php:1560
356
+ msgid "(GMT+04:00) Abu Dhabi, Muscat"
357
+ msgstr ""
358
+
359
+ #: inc/CtfAdmin.php:1561
360
+ msgid "(GMT+04:00) Yerevan"
361
+ msgstr ""
362
+
363
+ #: inc/CtfAdmin.php:1562
364
+ msgid "(GMT+04:30) Kabul"
365
+ msgstr ""
366
+
367
+ #: inc/CtfAdmin.php:1563
368
+ msgid "(GMT+05:00) Ekaterinburg"
369
+ msgstr ""
370
+
371
+ #: inc/CtfAdmin.php:1564
372
+ msgid "(GMT+05:00) Tashkent"
373
+ msgstr ""
374
+
375
+ #: inc/CtfAdmin.php:1565
376
+ msgid "(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi"
377
+ msgstr ""
378
+
379
+ #: inc/CtfAdmin.php:1566
380
+ msgid "(GMT+05:45) Kathmandu"
381
+ msgstr ""
382
+
383
+ #: inc/CtfAdmin.php:1567
384
+ msgid "(GMT+06:00) Astana, Dhaka"
385
+ msgstr ""
386
+
387
+ #: inc/CtfAdmin.php:1568
388
+ msgid "(GMT+06:00) Novosibirsk"
389
+ msgstr ""
390
+
391
+ #: inc/CtfAdmin.php:1569
392
+ msgid "(GMT+06:30) Yangon (Rangoon)"
393
+ msgstr ""
394
+
395
+ #: inc/CtfAdmin.php:1570
396
+ msgid "(GMT+07:00) Bangkok, Hanoi, Jakarta"
397
+ msgstr ""
398
+
399
+ #: inc/CtfAdmin.php:1571
400
+ msgid "(GMT+07:00) Krasnoyarsk"
401
+ msgstr ""
402
+
403
+ #: inc/CtfAdmin.php:1572
404
+ msgid "(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi"
405
+ msgstr ""
406
+
407
+ #: inc/CtfAdmin.php:1573
408
+ msgid "(GMT+08:00) Irkutsk, Ulaan Bataar"
409
+ msgstr ""
410
+
411
+ #: inc/CtfAdmin.php:1574
412
+ msgid "(GMT+08:00) Perth"
413
+ msgstr ""
414
+
415
+ #: inc/CtfAdmin.php:1575
416
+ msgid "(GMT+08:45) Eucla"
417
+ msgstr ""
418
+
419
+ #: inc/CtfAdmin.php:1576
420
+ msgid "(GMT+09:00) Osaka, Sapporo, Tokyo"
421
+ msgstr ""
422
+
423
+ #: inc/CtfAdmin.php:1577
424
+ msgid "(GMT+09:00) Seoul"
425
+ msgstr ""
426
+
427
+ #: inc/CtfAdmin.php:1578
428
+ msgid "(GMT+09:00) Yakutsk"
429
+ msgstr ""
430
+
431
+ #: inc/CtfAdmin.php:1579
432
+ msgid "(GMT+09:30) Adelaide"
433
+ msgstr ""
434
+
435
+ #: inc/CtfAdmin.php:1580
436
+ msgid "(GMT+09:30) Darwin"
437
+ msgstr ""
438
+
439
+ #: inc/CtfAdmin.php:1581
440
+ msgid "(GMT+10:00) Brisbane"
441
+ msgstr ""
442
+
443
+ #: inc/CtfAdmin.php:1582
444
+ msgid "(GMT+10:00) Sydney"
445
+ msgstr ""
446
+
447
+ #: inc/CtfAdmin.php:1583
448
+ msgid "(GMT+10:00) Vladivostok"
449
+ msgstr ""
450
+
451
+ #: inc/CtfAdmin.php:1584
452
+ msgid "(GMT+10:30) Lord Howe Island"
453
+ msgstr ""
454
+
455
+ #: inc/CtfAdmin.php:1585
456
+ msgid "(GMT+11:00) Solomon Is., New Caledonia"
457
+ msgstr ""
458
+
459
+ #: inc/CtfAdmin.php:1586
460
+ msgid "(GMT+11:00) Magadan"
461
+ msgstr ""
462
+
463
+ #: inc/CtfAdmin.php:1587
464
+ msgid "(GMT+11:30) Norfolk Island"
465
+ msgstr ""
466
+
467
+ #: inc/CtfAdmin.php:1588
468
+ msgid "(GMT+12:00) Anadyr, Kamchatka"
469
+ msgstr ""
470
+
471
+ #: inc/CtfAdmin.php:1589
472
+ msgid "(GMT+12:00) Auckland, Wellington"
473
+ msgstr ""
474
+
475
+ #: inc/CtfAdmin.php:1590
476
+ msgid "(GMT+12:00) Fiji, Kamchatka, Marshall Is."
477
+ msgstr ""
478
+
479
+ #: inc/CtfAdmin.php:1591
480
+ msgid "(GMT+12:45) Chatham Islands"
481
+ msgstr ""
482
+
483
+ #: inc/CtfAdmin.php:1592
484
+ msgid "(GMT+13:00) Nuku'alofa"
485
+ msgstr ""
486
+
487
+ #: inc/CtfAdmin.php:1593
488
+ msgid "(GMT+14:00) Kiritimati"
489
+ msgstr ""
490
+
491
+ #: inc/CtfAdmin.php:1605
492
+ msgid "List"
493
+ msgstr ""
494
+
495
+ #: inc/CtfAdmin.php:1606
496
+ msgid "Carousel"
497
+ msgstr ""
498
+
499
+ #: inc/CtfAdmin.php:1607
500
+ msgid "Masonry"
501
+ msgstr ""
502
+
503
+ #: inc/CtfAdmin.php:1625
504
+ msgid "A full-width list of tweets."
505
+ msgstr ""
506
+
507
+ #: inc/CtfAdmin.php:1630
508
+ msgid "Tweets in columns with no empty space between them."
509
+ msgstr ""
510
+
511
+ #: inc/CtfAdmin.php:1633 inc/CtfAdmin.php:1665
512
+ msgid "Desktop Columns"
513
+ msgstr ""
514
+
515
+ #: inc/CtfAdmin.php:1646 inc/CtfAdmin.php:1678
516
+ msgid "Moblie Columns"
517
+ msgstr ""
518
+
519
+ #: inc/CtfAdmin.php:1662
520
+ msgid "Posts are displayed in a slideshow carousel."
521
+ msgstr ""
522
+
523
+ #: inc/CtfAdmin.php:1691
524
+ msgid "Loop Type"
525
+ msgstr ""
526
+
527
+ #: inc/CtfAdmin.php:1696
528
+ msgid "None"
529
+ msgstr ""
530
+
531
+ #: inc/CtfAdmin.php:1697
532
+ msgid "Rewind"
533
+ msgstr ""
534
+
535
+ #: inc/CtfAdmin.php:1698
536
+ msgid "Infinity"
537
+ msgstr ""
538
+
539
+ #: inc/CtfAdmin.php:1702
540
+ msgid "Navigation Arrows"
541
+ msgstr ""
542
+
543
+ #: inc/CtfAdmin.php:1706
544
+ msgid "Show on Hover"
545
+ msgstr ""
546
+
547
+ #: inc/CtfAdmin.php:1707
548
+ msgid "Show below feed"
549
+ msgstr ""
550
+
551
+ #: inc/CtfAdmin.php:1708
552
+ msgid "Hide arrows"
553
+ msgstr ""
554
+
555
+ #: inc/CtfAdmin.php:1712
556
+ msgid "Carousel Height"
557
+ msgstr ""
558
+
559
+ #: inc/CtfAdmin.php:1716
560
+ msgid "Always set to tallest post"
561
+ msgstr ""
562
+
563
+ #: inc/CtfAdmin.php:1717
564
+ msgid "Set to shortest post, button to expand"
565
+ msgstr ""
566
+
567
+ #: inc/CtfAdmin.php:1718
568
+ msgid "Automatically set to post height (forces single column)"
569
+ msgstr ""
570
+
571
+ #: inc/CtfAdmin.php:1723
572
+ msgid "Enable Autoplay"
573
+ msgstr ""
574
+
575
+ #: inc/CtfAdmin.php:1727
576
+ msgid "Interval Time"
577
+ msgstr ""
578
+
579
+ #: inc/CtfAdmin.php:1730
580
+ msgid "miliseconds"
581
+ msgstr ""
582
+
583
+ #: inc/CtfAdmin.php:1745
584
+ msgid "<p class=\"ctf_note\">"
585
+ msgstr ""
586
+
587
+ #: inc/CtfAdmin.php:1754 inc/CtfAdmin.php:1793
588
+ msgid "Automatic"
589
+ msgstr ""
590
+
591
+ #: inc/CtfAdmin.php:1758 inc/CtfAdmin.php:1785 views/admin/customize.php:52
592
+ msgid "Yes"
593
+ msgstr ""
594
+
595
+ #: inc/CtfAdmin.php:1762 inc/CtfAdmin.php:1790
596
+ msgid "No"
597
+ msgstr ""
598
+
599
+ #: inc/CtfAdmin.php:1769
600
+ msgid "Avatars will be replaced with a Twitter logo in the feed header."
601
+ msgstr ""
602
+
603
+ #: inc/CtfAdmin.php:1770
604
+ msgid "Avatars will not display in Tweets."
605
+ msgstr ""
606
+
607
+ #: inc/CtfAdmin.php:1771
608
+ msgid ""
609
+ "Twitter intents (for replying, retweeting, and liking) will be plain links."
610
+ msgstr ""
611
+
612
+ #: inc/CtfAdmin.php:1785
613
+ msgid ""
614
+ "Enabling this setting prevents all images and videos from being loaded "
615
+ "directly from Twitter's servers (CDN) to prevent any requests to external "
616
+ "websites in your browser. To accommodate this, some features of the plugin "
617
+ "will be disabled or limited."
618
+ msgstr ""
619
+
620
+ #: inc/CtfAdmin.php:1785 inc/CtfAdmin.php:1824
621
+ msgid "What will be limited?"
622
+ msgstr ""
623
+
624
+ #: inc/CtfAdmin.php:1790
625
+ msgid ""
626
+ "The plugin will still make some requests to load and display images and "
627
+ "videos directly from Twitter."
628
+ msgstr ""
629
+
630
+ #: inc/CtfAdmin.php:1793
631
+ #, php-format
632
+ msgid ""
633
+ "The plugin will only load images and videos directly from Twitter if consent "
634
+ "has been given by one of these integrated %s"
635
+ msgstr ""
636
+
637
+ #: inc/CtfAdmin.php:1793
638
+ msgid "GDPR cookie plugins"
639
+ msgstr ""
640
+
641
+ #: inc/CtfAdmin.php:1795
642
+ #, php-format
643
+ msgid ""
644
+ "%s to learn more about GDPR compliance in the Custom Twitter Feed plugin."
645
+ msgstr ""
646
+
647
+ #: inc/CtfAdmin.php:1795
648
+ msgid "Click here"
649
+ msgstr ""
650
+
651
+ #: inc/CtfAdmin.php:1805
652
+ msgid "Error:"
653
+ msgstr ""
654
+
655
+ #: inc/CtfAdmin.php:1805
656
+ msgid ""
657
+ "Due to a configuration issue on your web server, the GDPR setting is unable "
658
+ "to be enabled. Please see below for more information."
659
+ msgstr ""
660
+
661
+ #: inc/CtfAdmin.php:1821
662
+ #, php-format
663
+ msgid "%s detected"
664
+ msgstr ""
665
+
666
+ #: inc/CtfAdmin.php:1823
667
+ msgid ""
668
+ "Some Custom Twitter Feed features will be limited for visitors to ensure "
669
+ "GDPR compliance until they give consent."
670
+ msgstr ""
671
+
672
+ #: inc/CtfAdmin.php:1833
673
+ msgid ""
674
+ "No GDPR consent plugin detected. Install a compatible <a href=\"https://"
675
+ "smashballoon.com/doc/gdpr-plugin-list/?twitter\">GDPR consent plugin</a>, or "
676
+ "manually enable the setting above to display a GDPR compliant version of the "
677
+ "feed to all visitors."
678
+ msgstr ""
679
+
680
+ #: inc/CtfAdmin.php:1841
681
+ msgid ""
682
+ "No requests will be made to third-party websites. To accommodate this, some "
683
+ "features of the plugin will be limited:"
684
+ msgstr ""
685
+
686
+ #: inc/CtfAdmin.php:1848
687
+ msgid ""
688
+ "The plugin will function as normal and load images and videos directly from "
689
+ "Twitter."
690
+ msgstr ""
691
+
692
+ #: inc/CtfAdmin.php:1857
693
+ msgid "Clear Persistent Caches"
694
+ msgstr ""
695
+
696
+ #: inc/CtfAdmin.php:1859
697
+ msgid ""
698
+ "Clicking this button will clear all cached data for search and hashtag feeds "
699
+ "that have persistent caches"
700
+ msgstr ""
701
+
702
+ #: inc/CtfFeed.php:161
703
+ msgid "Retweeted"
704
+ msgstr ""
705
+
706
+ #: inc/CtfFeed.php:167
707
+ msgid "Load More..."
708
+ msgstr ""
709
+
710
+ #: inc/CtfFeed.php:1395
711
+ msgid "That's all! No more Tweets to load"
712
+ msgstr ""
713
+
714
+ #: inc/CtfFeed.php:1520
715
+ msgid "Follow"
716
+ msgstr ""
717
+
718
+ #: inc/CtfFeed.php:1677
719
+ msgid "Retweet on Twitter"
720
+ msgstr ""
721
+
722
+ #: inc/admin-hooks.php:63
723
+ msgid ""
724
+ "<p>Please use a single screenname or Twitter handle of numbers and letters. "
725
+ "If you would like to use more than one screen name for your feed, please "
726
+ "upgrade to our <a href='https://smashballoon.com/custom-twitter-feeds/?"
727
+ "utm_campaign=twitter-free&utm_source=settings&utm_medium=multiuser' "
728
+ "target='_blank'>Pro version</a>.</p>"
729
+ msgstr ""
730
+
731
+ #: inc/admin-hooks.php:72
732
+ msgid ""
733
+ "<p>Please use a single hashtag of numbers and letters. If you would like to "
734
+ "use more than one hashtag or use search terms for your feed, please upgrade "
735
+ "to our <a href='https://smashballoon.com/custom-twitter-feeds/?"
736
+ "utm_campaign=twitter-free&utm_source=settings&utm_medium=multisearch' "
737
+ "target='_blank'>Pro version</a>.</p>"
738
+ msgstr ""
739
+
740
+ #: inc/admin-hooks.php:291
741
+ msgid "Clear Twitter Cards"
742
+ msgstr ""
743
+
744
+ #: inc/admin-hooks.php:293
745
+ msgid ""
746
+ "Clicking this button will clear all cached data for your links that have "
747
+ "Twitter Cards"
748
+ msgstr ""
749
+
750
+ #: inc/admin-hooks.php:306 inc/admin-hooks.php:316
751
+ msgid "any"
752
+ msgstr ""
753
+
754
+ #: inc/admin-hooks.php:307 inc/admin-hooks.php:317
755
+ msgid "all"
756
+ msgstr ""
757
+
758
+ #: inc/admin-hooks.php:311
759
+ msgid "and"
760
+ msgstr ""
761
+
762
+ #: inc/admin-hooks.php:312
763
+ msgid "or"
764
+ msgstr ""
765
+
766
+ #: inc/admin-hooks.php:333 views/admin/configure.php:7
767
+ #: views/admin/configure.php:10 views/admin/customize.php:26
768
+ #: views/admin/customize.php:59 views/admin/style.php:24
769
+ #: views/admin/style.php:34 views/admin/style.php:48
770
+ msgid "Save Changes"
771
+ msgstr ""
772
+
773
+ #: inc/admin/class-ctf-notifications.php:513
774
+ msgid "Dismiss this message"
775
+ msgstr ""
776
+
777
+ #: inc/admin/class-ctf-notifications.php:516
778
+ msgid "Previous message"
779
+ msgstr ""
780
+
781
+ #: inc/admin/class-ctf-notifications.php:517
782
+ msgid "Next message"
783
+ msgstr ""
784
+
785
+ #: inc/blocks/class-ctf-blocks.php:94
786
+ msgid "Add Settings"
787
+ msgstr ""
788
+
789
+ #: inc/blocks/class-ctf-blocks.php:95
790
+ msgid "Shortcode Settings"
791
+ msgstr ""
792
+
793
+ #: inc/blocks/class-ctf-blocks.php:96 views/admin/display.php:24
794
+ msgid "Example"
795
+ msgstr ""
796
+
797
+ #: inc/blocks/class-ctf-blocks.php:97
798
+ msgid "Apply Changes"
799
+ msgstr ""
800
+
801
+ #: inc/class-ctf-feed-locator.php:382
802
+ msgid "Content"
803
+ msgstr ""
804
+
805
+ #: inc/class-ctf-feed-locator.php:386
806
+ msgid "Header"
807
+ msgstr ""
808
+
809
+ #: inc/class-ctf-feed-locator.php:391
810
+ msgid "Sidebar"
811
+ msgstr ""
812
+
813
+ #: inc/class-ctf-feed-locator.php:396
814
+ msgid "Footer"
815
+ msgstr ""
816
+
817
+ #: inc/class-ctf-tracking.php:416
818
+ msgid "Once Weekly"
819
+ msgstr ""
820
+
821
+ #: inc/notices.php:60
822
+ msgid ""
823
+ "Heads up! It looks like you have over 500 Twitter feeds stored in your "
824
+ "WordPress database. This is typically caused by a large number of hashtag "
825
+ "feeds on your site, as the plugin permanently stores older Tweets to work "
826
+ "around Twitter's 7 day hashtag feed limit. This many caches may lead to "
827
+ "performance issues."
828
+ msgstr ""
829
+
830
+ #: inc/notices.php:63
831
+ #, php-format
832
+ msgid "For a solution, please follow the directions %shere%s."
833
+ msgstr ""
834
+
835
+ #: inc/notices.php:99
836
+ msgid "Help us improve the Custom Twitter Feed plugin"
837
+ msgstr ""
838
+
839
+ #: inc/notices.php:100
840
+ msgid ""
841
+ "Understanding how you are using the plugin allows us to further improve it. "
842
+ "Opt-in below to agree to send a weekly report of plugin usage data."
843
+ msgstr ""
844
+
845
+ #: inc/notices.php:101
846
+ msgid "More information"
847
+ msgstr ""
848
+
849
+ #: inc/notices.php:104
850
+ msgid "Yes, I'd like to help"
851
+ msgstr ""
852
+
853
+ #: inc/notices.php:105
854
+ msgid "No, thanks"
855
+ msgstr ""
856
+
857
+ #: inc/widget.php:13
858
+ msgid "Custom Twitter Feeds"
859
+ msgstr ""
860
+
861
+ #: inc/widget.php:14
862
+ msgid "Display your Twitter feed"
863
+ msgstr ""
864
+
865
+ #: inc/widget.php:40
866
+ msgid "Title:"
867
+ msgstr ""
868
+
869
+ #: views/admin/configure.php:12
870
+ msgid ""
871
+ "Next Step: <a href=\"?page=custom-twitter-feeds&tab=customize\">Customize "
872
+ "your Feed</a>"
873
+ msgstr ""
874
+
875
+ #: views/admin/customize.php:48
876
+ msgid "Enable Usage Tracking"
877
+ msgstr ""
878
+
879
+ #: views/admin/customize.php:53
880
+ msgid "What is usage tracking?"
881
+ msgstr ""
882
+
883
+ #: views/admin/customize.php:54
884
+ msgid ""
885
+ "Custom Twitter Feeds will record information and statistics about your site "
886
+ "in order for the team at Smash Balloon to learn more about how our plugins "
887
+ "are used. The plugin will never collect any sensitive information like "
888
+ "access tokens, email addresses, or user information."
889
+ msgstr ""
890
+
891
+ #: views/admin/customize.php:54
892
+ #, php-format
893
+ msgid "%sMore Information%s"
894
+ msgstr ""
895
+
896
+ #: views/admin/customize.php:61
897
+ msgid ""
898
+ "<b>Next Step:</b> <a href=\"?page=custom-twitter-feeds&tab=style\">Style "
899
+ "your Feed</a>"
900
+ msgstr ""
901
+
902
+ #: views/admin/display.php:3
903
+ msgid "Display your Feed"
904
+ msgstr ""
905
+
906
+ #: views/admin/display.php:4
907
+ msgid ""
908
+ "Copy and paste the following shortcode directly into the page, post or "
909
+ "widget where you'd like the feed to show up:"
910
+ msgstr ""
911
+
912
+ #: views/admin/display.php:5 views/admin/main.php:57
913
+ msgid "To copy, click the field then press Ctrl + C (PC) or Cmd + C (Mac)."
914
+ msgstr ""
915
+
916
+ #: views/admin/display.php:7
917
+ msgid "Multiple Feeds"
918
+ msgstr ""
919
+
920
+ #: views/admin/display.php:8
921
+ msgid ""
922
+ "If you'd like to display multiple feeds then you can set different settings "
923
+ "directly in the shortcode like so:"
924
+ msgstr ""
925
+
926
+ #: views/admin/display.php:10
927
+ msgid ""
928
+ "You can display as many different feeds as you like, on either the same page "
929
+ "or on different pages, by just using the shortcode options below. For "
930
+ "example:"
931
+ msgstr ""
932
+
933
+ #: views/admin/display.php:15
934
+ msgid "See the table below for a full list of available shortcode options:"
935
+ msgstr ""
936
+
937
+ #: views/admin/display.php:17
938
+ msgid "Pro version only"
939
+ msgstr ""
940
+
941
+ #: views/admin/display.php:22
942
+ msgid "Shortcode option"
943
+ msgstr ""
944
+
945
+ #: views/admin/display.php:23
946
+ msgid "Description"
947
+ msgstr ""
948
+
949
+ #: views/admin/display.php:27
950
+ msgid "Configure Options"
951
+ msgstr ""
952
+
953
+ #: views/admin/display.php:30
954
+ msgid ""
955
+ "A user account name/Twitter handle. This will generate a user timeline feed"
956
+ msgstr ""
957
+
958
+ #: views/admin/display.php:35
959
+ msgid "Any hashtag. This will generate a hashtag feed"
960
+ msgstr ""
961
+
962
+ #: views/admin/display.php:40
963
+ msgid ""
964
+ "A home timeline will automatically use the account attached to your access "
965
+ "token credentials"
966
+ msgstr ""
967
+
968
+ #: views/admin/display.php:45
969
+ msgid ""
970
+ "Display tweets from multiple user accounts/Twitter handles<br />Display "
971
+ "tweets from multiple hashtags/search terms<br />Display tweets that \"@\" "
972
+ "mention your account"
973
+ msgstr ""
974
+
975
+ #: views/admin/display.php:50
976
+ msgid "A user account name/Twitter handle, separated by commas"
977
+ msgstr ""
978
+
979
+ #: views/admin/display.php:55
980
+ msgid "Any search term or terms. Separate multiple terms by \"+\"."
981
+ msgstr ""
982
+
983
+ #: views/admin/display.php:60
984
+ msgid ""
985
+ "A mentions timeline will automatically use the account attached to your "
986
+ "access token credentials"
987
+ msgstr ""
988
+
989
+ #: views/admin/display.php:65
990
+ msgid "Number of Tweets to display"
991
+ msgstr ""
992
+
993
+ #: views/admin/display.php:69
994
+ msgid "Customize Options"
995
+ msgstr ""
996
+
997
+ #: views/admin/display.php:72
998
+ msgid "How posts are arranged visually in the feed."
999
+ msgstr ""
1000
+
1001
+ #: views/admin/display.php:77
1002
+ msgid "A custom CSS class added to the feed"
1003
+ msgstr ""
1004
+
1005
+ #: views/admin/display.php:82
1006
+ msgid "Custom text for the header"
1007
+ msgstr ""
1008
+
1009
+ #: views/admin/display.php:85
1010
+ msgid "Show/Hide Options"
1011
+ msgstr ""
1012
+
1013
+ #: views/admin/display.php:88
1014
+ msgid "Include a header for this feed"
1015
+ msgstr ""
1016
+
1017
+ #: views/admin/display.php:93
1018
+ msgid "Parts of the Tweet to include in the feed"
1019
+ msgstr ""
1020
+
1021
+ #: views/admin/display.php:98
1022
+ msgid "Parts of the Tweet to exclude in the feed"
1023
+ msgstr ""
1024
+
1025
+ #: views/admin/display.php:103
1026
+ msgid ""
1027
+ "Include a credit link to Custom Twitter Feeds homepage at the bottom of the "
1028
+ "feed"
1029
+ msgstr ""
1030
+
1031
+ #: views/admin/display.php:108
1032
+ msgid "Show the button that loads more tweets"
1033
+ msgstr ""
1034
+
1035
+ #: views/admin/display.php:111
1036
+ msgid "Date Options"
1037
+ msgstr ""
1038
+
1039
+ #: views/admin/display.php:114
1040
+ msgid "Number of one of the default date formats"
1041
+ msgstr ""
1042
+
1043
+ #: views/admin/display.php:119
1044
+ msgid "Manually entered custom date format"
1045
+ msgstr ""
1046
+
1047
+ #: views/admin/display.php:124
1048
+ msgid "Translation for \"m\" time unit (English minute)"
1049
+ msgstr ""
1050
+
1051
+ #: views/admin/display.php:129
1052
+ msgid "Translation for \"h\" time unit (English hour)"
1053
+ msgstr ""
1054
+
1055
+ #: views/admin/display.php:134
1056
+ msgid "Translation for English \"now\""
1057
+ msgstr ""
1058
+
1059
+ #: views/admin/display.php:137
1060
+ msgid "Link Options"
1061
+ msgstr ""
1062
+
1063
+ #: views/admin/display.php:140
1064
+ msgid "Disable the links in the text of the tweet"
1065
+ msgstr ""
1066
+
1067
+ #: views/admin/display.php:145
1068
+ msgid "Link the tweet text to Twitter"
1069
+ msgstr ""
1070
+
1071
+ #: views/admin/display.php:150
1072
+ msgid "Custom text for the Twitter link"
1073
+ msgstr ""
1074
+
1075
+ #: views/admin/display.php:155
1076
+ msgid "A multiplying factor 1-3 to help with tweet filtering"
1077
+ msgstr ""
1078
+
1079
+ #: views/admin/display.php:159
1080
+ msgid "Style Options"
1081
+ msgstr ""
1082
+
1083
+ #: views/admin/display.php:162
1084
+ msgid "The width of your feed. Any number with a unit like \"px\" or \"%\"."
1085
+ msgstr ""
1086
+
1087
+ #: views/admin/display.php:167
1088
+ msgid "The height of your feed. Any number with a unit like \"px\" or \"em\"."
1089
+ msgstr ""
1090
+
1091
+ #: views/admin/display.php:172
1092
+ msgid "Background color for the feed. Any hex color code"
1093
+ msgstr ""
1094
+
1095
+ #: views/admin/display.php:177
1096
+ msgid "Background color for each tweet. Any hex color code"
1097
+ msgstr ""
1098
+
1099
+ #: views/admin/display.php:180
1100
+ msgid "Typography Options"
1101
+ msgstr ""
1102
+
1103
+ #: views/admin/display.php:183
1104
+ msgid "Size of author info font in pixels"
1105
+ msgstr ""
1106
+
1107
+ #: views/admin/display.php:188
1108
+ msgid "Weight of author info font inherit, bold, or normal"
1109
+ msgstr ""
1110
+
1111
+ #: views/admin/display.php:193
1112
+ msgid "Size of Twitter logo in pixels"
1113
+ msgstr ""
1114
+
1115
+ #: views/admin/display.php:198
1116
+ msgid "Color of Twitter logo. Any color hex code."
1117
+ msgstr ""
1118
+
1119
+ #: views/admin/display.php:203
1120
+ msgid "Size of date info font in pixels"
1121
+ msgstr ""
1122
+
1123
+ #: views/admin/display.php:208
1124
+ msgid "Weight of date info font inherit, bold, or normal"
1125
+ msgstr ""
1126
+
1127
+ #: views/admin/display.php:213
1128
+ msgid "Size of quoted author info font in pixels"
1129
+ msgstr ""
1130
+
1131
+ #: views/admin/display.php:218
1132
+ msgid "Weight of quoted author info font inherit, bold, or normal"
1133
+ msgstr ""
1134
+
1135
+ #: views/admin/display.php:223
1136
+ msgid "Color of the text. Any color hex code"
1137
+ msgstr ""
1138
+
1139
+ #: views/admin/display.php:228
1140
+ msgid "Color of the links inside the tweet text. Any color hex code"
1141
+ msgstr ""
1142
+
1143
+ #: views/admin/display.php:233
1144
+ msgid "Size of the icons in pixels"
1145
+ msgstr ""
1146
+
1147
+ #: views/admin/display.php:238
1148
+ msgid "Color of the icons. Any color hex code"
1149
+ msgstr ""
1150
+
1151
+ #: views/admin/display.php:241
1152
+ msgid "\"Load More\" Button Options"
1153
+ msgstr ""
1154
+
1155
+ #: views/admin/display.php:244
1156
+ msgid "Color of the background of the button. Any color hex code"
1157
+ msgstr ""
1158
+
1159
+ #: views/admin/display.php:249
1160
+ msgid "Color of the text of the button. Any color hex code"
1161
+ msgstr ""
1162
+
1163
+ #: views/admin/display.php:254
1164
+ msgid "Custom text inside the button"
1165
+ msgstr ""
1166
+
1167
+ #: views/admin/display.php:261
1168
+ msgid ""
1169
+ "Need help? <a href=\"?page=custom-twitter-feeds&tab=support\">Get Support</"
1170
+ "a>."
1171
+ msgstr ""
1172
+
1173
+ #: views/admin/locator-summary.php:17
1174
+ msgid "Feed Finder Summary"
1175
+ msgstr ""
1176
+
1177
+ #: views/admin/locator-summary.php:18
1178
+ msgid ""
1179
+ "The table below shows a record of all feeds found on your site. A feed may "
1180
+ "not show up here immediately after being created."
1181
+ msgstr ""
1182
+
1183
+ #: views/admin/locator-summary.php:29
1184
+ msgid "Type"
1185
+ msgstr ""
1186
+
1187
+ #: views/admin/locator-summary.php:30
1188
+ msgid "Sources"
1189
+ msgstr ""
1190
+
1191
+ #: views/admin/locator-summary.php:31
1192
+ msgid "Shortcode"
1193
+ msgstr ""
1194
+
1195
+ #: views/admin/locator-summary.php:32
1196
+ msgid "Location"
1197
+ msgstr ""
1198
+
1199
+ #: views/admin/locator-summary.php:65
1200
+ msgid "Show"
1201
+ msgstr ""
1202
+
1203
+ #: views/admin/locator-summary.php:80
1204
+ msgid ""
1205
+ "Locations of your feeds are currently being detected. You'll see more "
1206
+ "information posted here soon!"
1207
+ msgstr ""
1208
+
1209
+ #: views/admin/main.php:10
1210
+ msgid ""
1211
+ "You're using Custom Twitter Feeds Lite. To unlock more features consider <a "
1212
+ "href=\"https://smashballoon.com/custom-twitter-feeds/?utm_campaign=twitter-"
1213
+ "free&utm_source=noticebar&utm_medium=litenotice\" target=\"_blank\" rel="
1214
+ "\"noopener noreferrer\">upgrading to Pro</a>."
1215
+ msgstr ""
1216
+
1217
+ #: views/admin/main.php:11
1218
+ msgid "Dismiss this message."
1219
+ msgstr ""
1220
+
1221
+ #: views/admin/main.php:27
1222
+ msgid "1. Configure"
1223
+ msgstr ""
1224
+
1225
+ #: views/admin/main.php:28
1226
+ msgid "2. Customize"
1227
+ msgstr ""
1228
+
1229
+ #: views/admin/main.php:29
1230
+ msgid "3. Style"
1231
+ msgstr ""
1232
+
1233
+ #: views/admin/main.php:30
1234
+ msgid "4. Display Your Feed"
1235
+ msgstr ""
1236
+
1237
+ #: views/admin/main.php:31
1238
+ msgid "Support"
1239
+ msgstr ""
1240
+
1241
+ #: views/admin/main.php:52
1242
+ msgid ""
1243
+ "Need help setting up the plugin? Check out our <a href=\"https://"
1244
+ "smashballoon.com/custom-twitter-feeds/free/?utm_campaign=twitter-"
1245
+ "free&utm_source=settings&utm_medium=helpsetup\" target=\"_blank\">setup "
1246
+ "directions</a>"
1247
+ msgstr ""
1248
+
1249
+ #: views/admin/main.php:55
1250
+ msgid "Display your feed"
1251
+ msgstr ""
1252
+
1253
+ #: views/admin/main.php:56
1254
+ msgid ""
1255
+ "Copy and paste this shortcode directly into the page, post or widget where "
1256
+ "you'd like to display the feed:"
1257
+ msgstr ""
1258
+
1259
+ #: views/admin/main.php:58
1260
+ msgid ""
1261
+ "Find out how to display <a href='?page=custom-twitter-"
1262
+ "feeds&tab=display'>multiple feeds</a>."
1263
+ msgstr ""
1264
+
1265
+ #: views/admin/style.php:50
1266
+ msgid ""
1267
+ "Next Step: <a href=\"?page=custom-twitter-feeds&tab=display\">Display your "
1268
+ "Feed</a>"
1269
+ msgstr ""
1270
+
1271
+ #: views/admin/support.php:1
1272
+ msgid "Need help?"
1273
+ msgstr ""
1274
+
1275
+ #: views/admin/support.php:3
1276
+ msgid "Check out our "
1277
+ msgstr ""
1278
+
1279
+ #: views/admin/support.php:3
1280
+ msgid "setup directions"
1281
+ msgstr ""
1282
+
1283
+ #: views/admin/support.php:3
1284
+ msgid "for a step-by-step guide on how to setup and use the plugin"
1285
+ msgstr ""
1286
+
1287
+ #: views/admin/support.php:5
1288
+ msgid "Have a problem? Submit a "
1289
+ msgstr ""
1290
+
1291
+ #: views/admin/support.php:5
1292
+ msgid "support ticket"
1293
+ msgstr ""
1294
+
1295
+ #: views/admin/support.php:5
1296
+ msgid "on our website"
1297
+ msgstr ""
1298
+
1299
+ #: views/admin/support.php:5
1300
+ msgid "Please include your <b>System Info</b> below with all support requests."
1301
+ msgstr ""
1302
+
1303
+ #: views/admin/support.php:8
1304
+ msgid "System Info"
1305
+ msgstr ""
1306
+
1307
+ #: views/admin/support.php:8
1308
+ msgid "Click the text below to select all"
1309
+ msgstr ""
views/admin/locator-summary.php ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Custom Feeds for Twitter Feed Locator Summary Template
4
+ * Creates the HTML for the feed locator summary
5
+ *
6
+ * @version 1.14 Custom Feeds for Twitter Pro by Smash Balloon
7
+ *
8
+ */
9
+ // Don't load directly
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ die( '-1' );
12
+ }
13
+ $locator_summary = CTF_Feed_Locator::summary();
14
+ $database_settings = ctf_get_database_settings();
15
+ ?>
16
+ <div class="ctf-feed-locator-summary-wrap">
17
+ <h3><?php esc_html_e( 'Feed Finder Summary', 'custom-twitter-feeds' ); ?></h3>
18
+ <p><?php esc_html_e( 'The table below shows a record of all feeds found on your site. A feed may not show up here immediately after being created.', 'custom-twitter-feeds' ); ?></p>
19
+ <?php
20
+ if ( ! empty( $locator_summary ) ) : ?>
21
+
22
+ <?php foreach ( $locator_summary as $locator_section ) :
23
+ if ( ! empty( $locator_section['results'] ) ) : ?>
24
+ <div class="ctf-single-location">
25
+ <h4><?php echo esc_html( $locator_section['label'] ); ?></h4>
26
+ <table class="widefat striped">
27
+ <thead>
28
+ <tr>
29
+ <th><?php esc_html_e( 'Type', 'custom-twitter-feeds' ); ?></th>
30
+ <th><?php esc_html_e( 'Sources', 'custom-twitter-feeds' ); ?></th>
31
+ <th><?php esc_html_e( 'Shortcode', 'custom-twitter-feeds' ); ?></th>
32
+ <th><?php esc_html_e( 'Location', 'custom-twitter-feeds' ); ?></th>
33
+ </tr>
34
+ </thead>
35
+ <tbody>
36
+
37
+ <?php
38
+ $atts_for_page = array();
39
+ foreach ( $locator_section['results'] as $result ) :
40
+ $should_add = true;
41
+ if ( ! empty( $atts_for_page[ $result['post_id'] ] ) ) {
42
+ foreach ( $atts_for_page[ $result['post_id'] ] as $existing_atts ) {
43
+ if ( $existing_atts === $result['shortcode_atts'] ) {
44
+ $should_add = false;
45
+ }
46
+ }
47
+ }
48
+ if ( $should_add ) {
49
+ $atts_for_page[ $result['post_id'] ][] = $result['shortcode_atts'];
50
+ $shortcode_atts = json_decode( $result['shortcode_atts'], true );
51
+ $shortcode_atts = is_array( $shortcode_atts ) ? $shortcode_atts : array();
52
+ include_once( CTF_URL . '/inc/CtfFeed.php' );
53
+
54
+ $twitter_feed = CtfFeed::init( $shortcode_atts );
55
+ $settings = $twitter_feed->feed_options;
56
+
57
+ $display_terms = str_replace( ' -filter:retweets', '', $settings['feed_term'] );
58
+ $comma_separated = $display_terms;
59
+ $display = $comma_separated;
60
+ if ( strlen( $comma_separated ) > 31 ) {
61
+ $display = '<span class="ctf-condensed-wrap">' . substr( $comma_separated, 0, 30 ) . '<a class="ctf-locator-more" href="JavaScript:void(0);">...</a></span>';
62
+ $comma_separated = '<span class="ctf-full-wrap">' . esc_html( $comma_separated ) . '</span>';
63
+ } else {
64
+ $comma_separated = '';
65
+ }
66
+ $type = isset( $settings['type'] ) ? $settings['type'] : 'usertimeline';
67
+ switch ( $type ) {
68
+ case 'usertimeline':
69
+ $type = __( 'User Timeline', 'custom-twitter-feeds' );
70
+ break;
71
+ case 'hometimeline':
72
+ $type = __( 'Home Timeline', 'custom-twitter-feeds' );
73
+ break;
74
+ case 'mentionstimeline':
75
+ $type = __( 'Mentions Timeline', 'custom-twitter-feeds' );
76
+ break;
77
+ case 'search':
78
+ $type = __( 'Search/Hashtag', 'custom-twitter-feeds' );
79
+ break;
80
+ case 'hashtag':
81
+ $type = __( 'Search/Hashtag', 'custom-twitter-feeds' );
82
+ break;
83
+ case 'lists':
84
+ $type = __( 'Lists', 'custom-twitter-feeds' );
85
+ break;
86
+ } $full_shortcode_string = '[custom-twitter-feeds';
87
+ foreach ( $shortcode_atts as $key => $value ) {
88
+ $full_shortcode_string .= ' ' . esc_html( $key ) . '="' . esc_html( $value ) . '"';
89
+ }
90
+ $full_shortcode_string .= ']';
91
+ ?>
92
+ <tr>
93
+ <td><?php echo esc_html( $type ); ?></td>
94
+ <td><?php echo $display . $comma_separated; ?></td>
95
+ <td>
96
+ <span class="ctf-condensed-wrap"><a class="ctf-locator-more" href="JavaScript:void(0);"><?php esc_html_e( 'Show', 'custom-twitter-feeds' ); ?></a></span>
97
+ <span class="ctf-full-wrap"><?php echo $full_shortcode_string; ?></span>
98
+ </td>
99
+ <td><a href="<?php echo esc_url( get_the_permalink( $result['post_id'] ) ); ?>" target="_blank" rel="noopener"><?php echo esc_html( get_the_title( $result['post_id'] ) ); ?></a></td>
100
+ </tr>
101
+ <?php
102
+ }
103
+
104
+ endforeach; ?>
105
+
106
+
107
+ </tbody>
108
+ </table>
109
+ </div>
110
+
111
+ <?php endif;
112
+ endforeach;
113
+ else: ?>
114
+ <p><?php esc_html_e( 'Locations of your feeds are currently being detected. You\'ll see more information posted here soon!', 'custom-twitter-feeds' ); ?></p>
115
+ <?php endif; ?>
116
+ </div>
views/admin/main.php CHANGED
@@ -29,6 +29,8 @@
29
  <a href="admin.php?page=custom-twitter-feeds&tab=style" class="nav-tab <?php if ( $active_tab == 'style' ){ echo 'nav-tab-active'; } ?>"><?php _e( '3. Style', 'ctf' ); ?></a>
30
  <a href="admin.php?page=custom-twitter-feeds&tab=display" class="nav-tab <?php if ( $active_tab == 'display' ){ echo 'nav-tab-active'; } ?>"><?php _e( '4. Display Your Feed', 'ctf' ); ?></a>
31
  <a href="admin.php?page=custom-twitter-feeds&tab=support" class="nav-tab <?php if ( $active_tab == 'support' ){ echo 'nav-tab-active'; } ?>"><?php _e( 'Support', 'ctf' ); ?></a>
 
 
32
  </h2>
33
  <?php
34
 
@@ -41,8 +43,12 @@
41
  require_once CTF_URL . 'views/admin/configure.php';
42
  } elseif ( $active_tab === 'display' ) {
43
  require_once CTF_URL .'views/admin/display.php';
 
 
44
  } elseif ( $active_tab === 'support' ) {
45
  require_once CTF_URL .'views/admin/support.php';
 
 
46
  }
47
  }
48
  ?>
29
  <a href="admin.php?page=custom-twitter-feeds&tab=style" class="nav-tab <?php if ( $active_tab == 'style' ){ echo 'nav-tab-active'; } ?>"><?php _e( '3. Style', 'ctf' ); ?></a>
30
  <a href="admin.php?page=custom-twitter-feeds&tab=display" class="nav-tab <?php if ( $active_tab == 'display' ){ echo 'nav-tab-active'; } ?>"><?php _e( '4. Display Your Feed', 'ctf' ); ?></a>
31
  <a href="admin.php?page=custom-twitter-feeds&tab=support" class="nav-tab <?php if ( $active_tab == 'support' ){ echo 'nav-tab-active'; } ?>"><?php _e( 'Support', 'ctf' ); ?></a>
32
+ <a href="admin.php?page=custom-twitter-feeds&amp;tab=more" class="nav-tab <?php echo $active_tab == 'more' ? 'nav-tab-active' : ''; ?>"><?php _e('More Social Feeds', 'ctf'); ?>
33
+ </a>
34
  </h2>
35
  <?php
36
 
43
  require_once CTF_URL . 'views/admin/configure.php';
44
  } elseif ( $active_tab === 'display' ) {
45
  require_once CTF_URL .'views/admin/display.php';
46
+ } elseif ( $active_tab === 'allfeeds' ) {
47
+ require_once CTF_URL .'views/admin/locator-summary.php';
48
  } elseif ( $active_tab === 'support' ) {
49
  require_once CTF_URL .'views/admin/support.php';
50
+ } elseif ( $active_tab === 'more' ) {
51
+ require_once CTF_URL .'views/admin/more-social-feeds.php';
52
  }
53
  }
54
  ?>
views/admin/more-social-feeds.php ADDED
@@ -0,0 +1,256 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="ctf_more_plugins" id="ctf-admin-about">
2
+
3
+ <div class="ctf-more-plugins-intro">
4
+ <h3><?php _e( "Here's some more <span>free</span> plugins you might like!", 'ctf' ); ?></h3>
5
+ <p><?php _e( "As you're already using one of our free plugins we thought we'd suggest some others you might like to. Check out our other free plugins below:", 'ctf' ); ?></p>
6
+ </div>
7
+
8
+ <?php function get_am_plugins() {
9
+
10
+ $images_url = CTF_PLUGIN_URL . 'img/about/';
11
+
12
+ return array(
13
+ 'instagram-feed/instagram-feed.php' => array(
14
+ 'icon' => $images_url . 'plugin-if.png',
15
+ 'name' => esc_html__( 'Instagram Feed', 'ctf' ),
16
+ 'desc' => esc_html__( 'Instagram Feed is a clean and beautiful way to add your Instagram posts to your website. Grab your visitors attention and keep them engaged with your site longer.', 'ctf' ),
17
+ 'url' => 'https://downloads.wordpress.org/plugin/instagram-feed.zip',
18
+ 'pro' => array(
19
+ 'plug' => 'instagram-feed-pro/instagram-feed.php',
20
+ 'icon' => $images_url . 'plugin-if.png',
21
+ 'name' => esc_html__( 'Instagram Feed Pro', 'ctf' ),
22
+ 'desc' => esc_html__( 'Instagram Feed is a clean and beautiful way to add your Instagram posts to your website. Grab your visitors attention and keep them engaged with your site longer.', 'ctf' ),
23
+ 'url' => 'https://smashballoon.com/instagram-feed/?utm_campaign=facebook-free&utm_source=cross&utm_medium=ctfinstaller',
24
+ 'act' => 'go-to-url',
25
+ ),
26
+ ),
27
+ 'custom-facebook-feed/custom-facebook-feed.php' => array(
28
+ 'icon' => $images_url . 'plugin-fb.png',
29
+ 'name' => esc_html__( 'Custom Facebook Feed', 'ctf' ),
30
+ 'desc' => esc_html__( 'Custom Facebook Feed makes displaying your Facebook posts easy. Keep your site visitors informed and increase engagement with your Facebook page by displaying a feed on your website.', 'ctf' ),
31
+ 'url' => 'https://downloads.wordpress.org/plugin/custom-facebook-feed.zip',
32
+ 'pro' => array(
33
+ 'plug' => 'custom-facebook-feed-pro/custom-facebook-feed.php',
34
+ 'icon' => $images_url . 'plugin-fb.png',
35
+ 'name' => esc_html__( 'Custom Facebook Feed Pro', 'ctf' ),
36
+ 'desc' => esc_html__( 'Custom Facebook Feed makes displaying your Facebook posts easy. Keep your site visitors informed and increase engagement with your Facebook page by displaying a feed on your website.', 'ctf' ),
37
+ 'url' => 'https://smashballoon.com/custom-facebook-feed/?utm_campaign=instagram-free&utm_source=cross&utm_medium=ctfinstaller',
38
+ 'act' => 'go-to-url',
39
+ )
40
+ ),
41
+
42
+ 'custom-twitter-feeds/custom-twitter-feed.php' => array(
43
+ 'icon' => $images_url . 'plugin-tw.jpg',
44
+ 'name' => esc_html__( 'Custom Twitter Feeds', 'ctf' ),
45
+ 'desc' => esc_html__( 'Custom Twitter Feeds is a highly customizable way to display tweets from your Twitter account. Promote your latest content and update your site content automatically.', 'ctf' ),
46
+ 'url' => 'https://downloads.wordpress.org/plugin/custom-twitter-feeds.zip',
47
+ 'pro' => array(
48
+ 'plug' => 'custom-twitter-feeds-pro/custom-twitter-feed.php',
49
+ 'icon' => $images_url . 'plugin-tw.jpg',
50
+ 'name' => esc_html__( 'Custom Twitter Feeds Pro', 'ctf' ),
51
+ 'desc' => esc_html__( 'Custom Twitter Feeds is a highly customizable way to display tweets from your Twitter account. Promote your latest content and update your site content automatically.', 'ctf' ),
52
+ 'url' => 'https://smashballoon.com/custom-twitter-feeds/?utm_campaign=instagram-free&utm_source=cross&utm_medium=ctfinstaller',
53
+ 'act' => 'go-to-url',
54
+ )
55
+ ),
56
+
57
+ 'feeds-for-youtube/youtube-feed.php' => array(
58
+ 'icon' => $images_url . 'plugin-yt.png',
59
+ 'name' => esc_html__( 'Feeds for YouTube', 'ctf' ),
60
+ 'desc' => esc_html__( 'Feeds for YouTube is a simple yet powerful way to display videos from YouTube on your website. Increase engagement with your channel while keeping visitors on your website.', 'ctf' ),
61
+ 'url' => 'https://downloads.wordpress.org/plugin/feeds-for-youtube.zip',
62
+ 'pro' => array(
63
+ 'plug' => 'youtube-feed-pro/youtube-feed.php',
64
+ 'icon' => $images_url . 'plugin-yt.png',
65
+ 'name' => esc_html__( 'Feeds for YouTube Pro', 'ctf' ),
66
+ 'desc' => esc_html__( 'Feeds for YouTube is a simple yet powerful way to display videos from YouTube on your website. Increase engagement with your channel while keeping visitors on your website.', 'ctf' ),
67
+ 'url' => 'https://smashballoon.com/youtube-feed/?utm_campaign=instagram-free&utm_source=cross&utm_medium=sbyinstaller',
68
+ 'act' => 'go-to-url',
69
+ )
70
+ ),
71
+ );
72
+
73
+ }
74
+
75
+ function output_about_addons() {
76
+
77
+ if ( version_compare( PHP_VERSION, '5.3.0' ) <= 0
78
+ || version_compare( get_bloginfo('version'), '4.6' , '<' ) ){
79
+ return;
80
+ }
81
+
82
+ $all_plugins = get_plugins();
83
+ $am_plugins = get_am_plugins();
84
+ $has_all_plugins = true;
85
+
86
+ ?>
87
+ <div id="ctf-admin-addons">
88
+ <div class="addons-container">
89
+ <?php
90
+ foreach ( $am_plugins as $plugin => $details ) :
91
+
92
+ $free_only = true;
93
+ $plugin_data = get_the_plugin_data( $plugin, $details, $all_plugins, $free_only );
94
+ $plugin_slug = strtolower( str_replace( ' ', '_', $plugin_data['details']['name'] ) );
95
+
96
+ //Only show the plugin if both free/pro versions aren't already active
97
+ isset( $plugin_data['details']['plug'] ) ? $pro_plugin_source = $plugin_data['details']['plug'] : $pro_plugin_source = '';
98
+
99
+ if( !is_plugin_active( $plugin ) && !is_plugin_active( $pro_plugin_source ) ){
100
+ $has_all_plugins = false;
101
+ ?>
102
+ <div class="addon-container" id="install_<?php echo $plugin_slug; ?>">
103
+ <div class="addon-item">
104
+ <div class="details ctf-clear">
105
+ <img src="<?php echo esc_url( $plugin_data['details']['icon'] ); ?>">
106
+ <h5 class="addon-name">
107
+ <?php echo esc_html( $plugin_data['details']['name'] ); ?>
108
+ </h5>
109
+ <p class="addon-desc">
110
+ <?php echo wp_kses_post( $plugin_data['details']['desc'] ); ?>
111
+ </p>
112
+ </div>
113
+ <div class="actions ctf-clear">
114
+ <div class="status">
115
+ <strong>
116
+ <?php _e( 'Price:', 'ctf' );
117
+ echo ' <span style="color: green;">';
118
+ _e( 'Free', 'ctf' );
119
+ echo '</span>'; ?>
120
+ </strong>
121
+ </div>
122
+ <div class="action-button">
123
+ <button class="<?php echo esc_attr( $plugin_data['action_class'] ); ?>" data-plugin="<?php echo esc_attr( $plugin_data['plugin_src'] ); ?>" data-type="plugin">
124
+ <?php echo wp_kses_post( $plugin_data['action_text'] ); ?>
125
+ </button>
126
+ </div>
127
+ </div>
128
+ </div>
129
+ </div>
130
+
131
+ <?php } ?>
132
+
133
+ <?php endforeach;
134
+
135
+ if( $has_all_plugins == true ){ ?>
136
+
137
+ <style type="text/css">.ctf-more-plugins-intro{display:none;}</style>
138
+ <h2><?php _e( 'You already have all of our free plugins. Awesome!', 'ctf' ); ?></h2>
139
+
140
+ <p><?php _e( 'Thank you so much for using our plugins. We appreciate you trusting us to power your social media feeds.', 'ctf' ); ?></p>
141
+ <p><?php _e( 'If you want to support us in our mission to make bringing social media content to your website both easy and reliable, then consider upgrading to one of our Pro plugins.', 'ctf' ); ?></p>
142
+
143
+ <div class="ctf-cols-4">
144
+ <?php //Show a list of Pro plugins which aren't currently active ?>
145
+ <?php foreach ( $am_plugins as $plugin => $details ) :
146
+
147
+ $plugin_data = get_the_plugin_data( $plugin, $details, $all_plugins );
148
+ $plugin_slug = strtolower( str_replace( ' ', '_', $plugin_data['details']['name'] ) );
149
+
150
+ isset( $plugin_data['details']['plug'] ) ? $pro_plugin_source = $plugin_data['details']['plug'] : $pro_plugin_source = '';
151
+ if( !is_plugin_active( $pro_plugin_source ) ){
152
+ ?>
153
+
154
+ <div class="addon-container" id="install_<?php echo $plugin_slug; ?>">
155
+ <div class="addon-item">
156
+ <div class="details ctf-clear">
157
+ <img src="<?php echo esc_url( $plugin_data['details']['icon'] ); ?>">
158
+ <h5 class="addon-name">
159
+ <?php echo esc_html( $plugin_data['details']['name'] ); ?>
160
+ </h5>
161
+ <p class="addon-desc">
162
+ <?php echo wp_kses_post( $plugin_data['details']['desc'] ); ?>
163
+ </p>
164
+ </div>
165
+ <div class="actions ctf-clear">
166
+ <div class="action-button">
167
+ <a href="<?php echo esc_attr( $details['pro']['url'] ); ?>" target="_blank" class="status-go-to-url button button-primary">
168
+ <?php _e( 'Upgrade to Pro', 'ctf' ); ?>
169
+ </a>
170
+ </div>
171
+ </div>
172
+ </div>
173
+ </div>
174
+
175
+ <?php } ?>
176
+
177
+ <?php endforeach; ?>
178
+ </div>
179
+
180
+ <?php } ?>
181
+
182
+ </div>
183
+ </div>
184
+ <?php
185
+ }
186
+
187
+
188
+ function get_the_plugin_data( $plugin, $details, $all_plugins, $free_only = false ) {
189
+
190
+ $have_pro = ( ! empty( $details['pro'] ) && ! empty( $details['pro']['plug'] ) );
191
+ $show_pro = false;
192
+
193
+ $plugin_data = array();
194
+
195
+ if( $free_only ) $have_pro = false;
196
+
197
+ if ( $have_pro ) {
198
+ if ( array_key_exists( $plugin, $all_plugins ) ) {
199
+ if ( is_plugin_active( $plugin ) ) {
200
+ $show_pro = true;
201
+ }
202
+ }
203
+ if ( array_key_exists( $details['pro']['plug'], $all_plugins ) ) {
204
+ $show_pro = true;
205
+ }
206
+ if ( $show_pro ) {
207
+ $plugin = $details['pro']['plug'];
208
+ $details = $details['pro'];
209
+ }
210
+ }
211
+
212
+ if( $free_only ) $show_pro = false;
213
+
214
+ if ( array_key_exists( $plugin, $all_plugins ) ) {
215
+ if ( is_plugin_active( $plugin ) ) {
216
+ // Status text/status.
217
+ $plugin_data['status_class'] = 'status-active';
218
+ $plugin_data['status_text'] = esc_html__( 'Active', 'ctf' );
219
+ // Button text/status.
220
+ $plugin_data['action_class'] = $plugin_data['status_class'] . ' button button-secondary disabled';
221
+ $plugin_data['action_text'] = esc_html__( 'Activated', 'ctf' );
222
+ $plugin_data['plugin_src'] = esc_attr( $plugin );
223
+ } else {
224
+ // Status text/status.
225
+ $plugin_data['status_class'] = 'status-inactive';
226
+ $plugin_data['status_text'] = esc_html__( 'Inactive', 'ctf' );
227
+ // Button text/status.
228
+ $plugin_data['action_class'] = $plugin_data['status_class'] . ' button button-secondary';
229
+ $plugin_data['action_text'] = esc_html__( 'Activate', 'ctf' );
230
+ $plugin_data['plugin_src'] = esc_attr( $plugin );
231
+ }
232
+ } else {
233
+ // Doesn't exist, install.
234
+ // Status text/status.
235
+ $plugin_data['status_class'] = 'status-download';
236
+ if ( isset( $details['act'] ) && 'go-to-url' === $details['act'] ) {
237
+ $plugin_data['status_class'] = 'status-go-to-url';
238
+ }
239
+ $plugin_data['status_text'] = esc_html__( 'Not Installed', 'ctf' );
240
+ // Button text/status.
241
+ $plugin_data['action_class'] = $plugin_data['status_class'] . ' button button-primary';
242
+ $plugin_data['action_text'] = esc_html__( 'Install Plugin', 'ctf' );
243
+ $plugin_data['plugin_src'] = esc_url( $details['url'] );
244
+ }
245
+
246
+ $plugin_data['details'] = $details;
247
+
248
+ return $plugin_data;
249
+ }
250
+
251
+
252
+ output_about_addons();
253
+
254
+ ?>
255
+ <style>.ctf_quickstart, .ctf-pro-notice, .ctf_plugins_promo, .ctf_share_plugin{ display: none !Important; }</style>
256
+ </div>
views/admin/social-wall.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php ( is_plugin_active( 'social-wall/social-wall.php' ) ) ? $ctf_sw_active = true : $ctf_sw_active = false; ?>
2
+
3
+ <div id="ctf-admin" class="wrap sw-landing-page">
4
+
5
+ <?php $plus_svg = '<span class="ctf-sb-plus"><svg aria-hidden="true" focusable="false" data-prefix="fal" data-icon="plus" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512" class="svg-inline--fa fa-plus fa-w-12 fa-2x"><path fill="currentColor" d="M376 232H216V72c0-4.42-3.58-8-8-8h-32c-4.42 0-8 3.58-8 8v160H8c-4.42 0-8 3.58-8 8v32c0 4.42 3.58 8 8 8h160v160c0 4.42 3.58 8 8 8h32c4.42 0 8-3.58 8-8V280h160c4.42 0 8-3.58 8-8v-32c0-4.42-3.58-8-8-8z" class=""></path></svg></span>'; ?>
6
+
7
+ <div class="ctf-sw-icons">
8
+
9
+ <span style="display: inline-block; padding: 0 0 12px 0; width: 360px; max-width: 100%;">
10
+ <svg viewBox="0 0 9161 1878" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2">
11
+ <path d="M671.51192 492.98498c-131.56765-59.12206-268.60859-147.41608-396.53319-188.5154 45.4516 108.39585 83.81326 223.88002 123.5099 338.03081-79.17849 59.49897-171.6647 105.68858-260.02357 156.01204C213.65642 872.8361 320.1446 915.85885 404.9893 980.52836c-67.96118 83.8619-201.48512 171.0179-234.02089 247.0198 140.6921-17.62678 304.63665-46.21028 435.53762-52.00414 28.76425 144.58318 43.59867 303.0974 84.5075 435.5368 60.92028-175.2656 116.0013-356.3729 188.5158-520.0447 111.90636 46.28566 248.28994 102.72599 357.52876 130.01178-76.6463-107.53462-146.59336-221.76932-214.51645-338.02878 100.51155-72.83872 202.17166-144.52441 299.02516-221.02077-136.89504-12.61227-278.73407-20.28825-422.53587-25.99863-22.85286-148.332-16.84825-325.5158-52.00496-461.53949-53.19323 111.48812-115.96685 213.3914-175.51405 318.52475m65.00509 1228.60643c-18.07949 77.37581 41.48757 109.11319 32.50294 156.01204-58.81404-20.26799-103.0575-30.6796-182.01552-19.50201 2.47017-60.37032 56.76657-68.90954 45.50428-143.0107-841.40803-95.6632-843.09804-1616.06909-6.50107-1709.64388C1672.04777-111.55711 1704.8713 1694.70523 736.517 1721.5914" fill="#e34f0e"/>
12
+ <path d="M847.02597 174.46023c35.15671 136.0237 29.1521 313.20749 52.00455 461.53544 143.80221 5.71443 285.63962 13.38636 422.53628 26.00268-96.8531 76.49636-198.51483 148.18205-299.02556 221.01874 67.92349 116.2623 137.87014 230.49416 214.51847 338.03-109.24085-27.2866-245.62443-83.72572-357.5308-130.0126-72.51448 163.67262-127.5955 344.77992-188.51538 520.04553-40.90924-132.4394-55.74325-290.95364-84.5079-435.53681-130.90057 5.79548-294.84472 34.37736-435.53722 52.00415 32.53577-76.0007 166.0589-163.15589 234.02008-247.02021-84.8451-64.67032-191.33207-107.69066-266.52343-182.01472 88.35886-50.32346 180.84346-96.51307 260.02276-156.01609-39.69705-114.14674-78.05668-229.63091-123.50868-338.02675C402.9013 345.5689 539.94427 433.86292 671.51192 492.98498c59.5468-105.13335 122.32082-207.03663 175.51405-318.52475" fill="#fff"/>
13
+ <path d="M1782.27033 1236.51938c41.18267 21.61921 126.79927 44.31938 214.58338 44.31938 213.49962 0 311.03752-107.01507 311.03752-232.40646 0-101.61027-58.52274-171.87269-189.65702-220.5159-92.11913-33.50977-131.13429-48.6432-131.13429-85.39586 0-32.4288 32.51263-54.04801 92.11913-54.04801 72.61154 0 126.79927 20.53824 158.22814 34.59073l41.18267-155.65828c-47.6852-21.6192-110.54295-37.83361-197.2433-37.83361-184.23826 0-293.69746 99.44834-293.69746 228.08262 0 108.09602 82.36534 176.19652 205.91335 219.43493 82.36533 28.10497 114.87797 48.64321 114.87797 84.3149 0 36.75265-32.51264 59.45282-99.70541 59.45282-73.6953 0-145.2231-22.70017-189.65703-45.40034l-36.84765 161.06308zM3019.37602 1270.02915h189.65702l-36.84765-728.56722h-256.8498l-55.27148 194.57285c-21.67508 76.74818-45.51768 179.4394-66.10902 268.07815h-3.25126c-15.17256-88.63875-36.84765-185.92517-57.43898-266.99719l-47.6852-195.6538h-263.35233l-45.51768 728.56721h179.90323l11.9213-260.51142c3.25127-83.23394 6.50253-191.32997 10.83755-294.0212h2.1675c17.34008 99.44835 39.01517 207.54438 58.52274 286.45448l60.69025 252.9447h152.80938l72.61154-254.02566c23.8426-79.99106 54.18773-189.16805 76.94657-285.37352h3.25126c0 113.50083 1.08376 210.78726 4.33502 294.0212l8.67004 260.51142zM3699.9738 1101.39935l46.60144 168.6298h211.33211l-217.83464-728.56722H3478.8879l-211.33211 728.56722h202.66208l41.18267-168.6298h188.57327zm-162.56317-143.76772l31.42888-130.79619c9.7538-41.07649 20.59134-101.61026 31.42888-143.76771h2.1675c11.9213 42.15745 26.01012 102.69122 36.84766 143.76771l33.59639 130.7962h-135.4693zM4016.4301 1236.51938c41.18266 21.61921 126.79926 44.31938 214.58337 44.31938 213.49962 0 311.03752-107.01507 311.03752-232.40646 0-101.61027-58.52274-171.87269-189.65702-220.5159-92.11913-33.50977-131.1343-48.6432-131.1343-85.39586 0-32.4288 32.51264-54.04801 92.11914-54.04801 72.61154 0 126.79926 20.53824 158.22814 34.59073l41.18267-155.65828c-47.6852-21.6192-110.54295-37.83361-197.2433-37.83361-184.23826 0-293.69746 99.44834-293.69746 228.08262 0 108.09602 82.36534 176.19652 205.91335 219.43493 82.36533 28.10497 114.87797 48.64321 114.87797 84.3149 0 36.75265-32.51264 59.45282-99.70541 59.45282-73.6953 0-145.2231-22.70017-189.65703-45.40034l-36.84765 161.06308zM4623.27688 541.46193v728.56722h196.15955V981.41276h237.34222v288.6164h196.15955V541.46192h-196.15955v269.1591h-237.34222v-269.1591h-196.15955z" fill="#282828" fill-rule="nonzero"/>
14
+ <g>
15
+ <path d="M6900.00785 293.7053c5.29-14.371 11.90999-24.77099 19.84998-31.19998 7.94-6.429 16.07-9.644 24.38998-9.644 8.32 0 15.7 2.08 22.12999 6.241 6.43 4.16 10.39999 9.265 11.90999 15.31599 2.27 43.86896 4.16 92.65493 5.67 146.35689 1.51 53.70296 2.65 109.86291 3.4 168.48187.76 58.61796 1.52 118.74891 2.26999 180.39386.76 61.64396 1.33 122.71991 1.71 183.22987.37 60.50695.56 119.1269.56 175.85686 0 56.72996.38 109.28992 1.14 157.69988-3.78 12.1-10.59 20.98999-20.41999 26.65998-9.83999 5.68-19.85998 8.14-30.06997 7.38-10.21-.76-19.28999-4.73-27.22998-11.91-7.94-7.18999-11.91-17.58998-11.91-31.19997l-3.4-983.66226zm173.57987 0c5.3-14.371 11.90999-24.77099 19.85998-31.19998 7.94-6.429 16.06999-9.644 24.38998-9.644 8.32 0 15.69 2.08 22.11999 6.241 6.43 4.16 10.39999 9.265 11.91999 15.31599 2.27 43.86896 4.15 92.65493 5.67 146.35689 1.51 53.70296 2.64 109.86291 3.4 168.48187.76 58.61796 1.51999 118.74891 2.26999 180.39386.76 61.64396 1.33 122.71991 1.7 183.22987.38 60.50695.57 119.1269.57 175.85686 0 56.72996.38 109.28992 1.13 157.69988-3.78 12.1-10.59 20.98999-20.41999 26.65998-9.82999 5.68-19.84998 8.14-30.05998 7.38-10.20999-.76-19.28998-4.73-27.22997-11.91-7.94-7.18999-11.92-17.58998-11.92-31.19997l-3.4-983.66226zm-419.49969 980.25225c-6.81-4.54-13.60999-12.66999-20.41998-24.38998-6.81-11.71999-13.61-24.57998-20.41999-38.57997-6.81-13.98999-13.61999-28.16998-20.41998-42.53997-6.81-14.36999-13.99999-26.84998-21.55998-37.43997-7.56-10.58999-15.51-18.33998-23.82999-23.25998-8.31999-4.92-17.38998-4.73-27.22998.57-15.11998 24.95998-30.43997 49.15996-45.93996 72.60994-15.50999 23.44999-32.52998 43.48997-51.05996 60.12996-18.52999 16.63999-39.70997 28.35998-63.52995 35.16997-23.82999 6.81-51.62997 6.05-83.38994-2.27-31.01998-8.31999-56.16996-24.57998-75.44994-48.77996-19.28999-24.20998-33.65998-52.94996-43.10997-86.22993-9.46-33.27998-14.19-69.77995-14.19-109.48992 0-39.70397 4.35-79.22394 13.05-118.55591 8.7-39.33097 21.36998-77.14894 38.00997-113.45492 16.63999-36.30597 36.67997-67.50595 60.12995-93.60093 23.44999-26.09398 50.10997-45.75996 79.98994-58.99595 29.86998-13.237 62.20996-16.82999 96.99993-10.779 32.51998 6.051 59.36996 19.855 80.54994 41.41198 21.17998 21.55598 38.76997 47.65096 52.75996 78.28394 13.98999 30.63297 24.95998 64.47995 32.89998 101.54192 7.93999 37.06197 15.12998 74.12394 21.55998 111.18692 6.43 37.06197 12.85999 72.42194 19.28999 106.08192 6.41999 33.65997 14.92998 62.58995 25.51998 86.78993 10.58999 24.20998 24.01998 41.97997 40.27997 53.32996 16.25998 11.34 37.62997 12.84999 64.09995 4.53 30.25997-31.00998 54.45996-51.61996 72.60994-61.82996 18.15999-10.20999 31.38998-13.60999 39.70997-10.20999 8.32 3.4 11.91 11.91 10.78 25.52998-1.13 13.61-6.05 28.73998-14.75 45.37997-8.69999 16.63999-20.60998 32.89997-35.73997 48.77996-15.11999 15.88999-32.32997 27.98998-51.61996 36.30997-19.28998 8.32-40.46997 11.16-63.52995 8.51-23.06998-2.65-47.08997-14.56-72.04995-35.73998zm2413.83818 6.81c-2.26-39.32997-5.67-82.25994-10.20999-128.7699-4.53-46.51997-10.58-92.84993-18.14999-138.9899-7.55999-46.13396-16.63998-89.81493-27.22998-131.0369-10.58999-41.22197-23.06998-76.01494-37.43997-104.37892-14.36999-28.36298-30.81997-48.21797-49.34996-59.56396-18.52999-11.34499-39.51997-9.83199-62.96995 4.539-23.44998 14.37099-49.34997 43.30197-77.71994 86.79293-28.35998 43.49097-59.93996 106.08092-94.72993 187.76786-3.03 6.05-7 15.88-11.91 29.49998-4.91999 13.60999-10.20999 28.92998-15.88998 45.94997-5.67 17.01998-11.91 34.97997-18.71999 53.88996-6.8 18.90998-13.03999 37.05997-18.71998 54.45995-5.67 17.4-10.78 32.89998-15.31 46.50997-4.53999 13.61999-7.56999 23.82998-9.07998 30.63998-6.05 15.11998-13.62 23.62998-22.68999 25.52998-9.08 1.89-18.14998.18-27.22998-5.11-9.07999-5.3-17.39998-12.47999-24.95998-21.55998-7.56-9.07-12.09999-17.01999-13.61999-23.81999 6.81-26.47998 12.86-55.96995 18.15999-88.49993 5.29-32.51997 9.45-69.57995 12.47999-111.17991 3.02-41.60397 4.16-88.68794 3.4-141.2559-.76-52.56696-4.54-112.13091-11.35-178.69186 8.32-17.39599 16.65-27.03998 24.96999-28.93098 8.31999-1.891 16.63998.756 24.94998 7.942 8.32 7.18499 16.07999 17.77498 23.25998 31.76697 7.19 13.99299 13.61999 28.17498 19.28999 42.54597 5.67 14.37099 10.20999 27.79698 13.61998 40.27697 3.4 12.47999 5.1 20.61098 5.1 24.39298 16.63999-14.371 31.95998-32.71298 45.94997-55.02596 13.98999-22.31298 28.35997-44.62597 43.10996-66.93895 14.75-22.31298 30.82998-42.16697 48.21997-59.56396 17.39998-17.39598 38.19997-27.98597 62.39995-31.76697 49.91996-9.077 92.27993-3.215 127.0699 17.58499 34.79998 20.79998 63.34996 50.67696 85.65994 89.62993 22.30998 38.95297 39.32997 84.14593 51.05996 135.5789 11.72 51.43296 20.03999 103.05492 24.95998 154.86588 4.91 51.80996 6.99 101.34992 6.24 148.62989-.76 47.26996-2.65 86.02993-5.68 116.2899-8.32 17.39-19.46998 26.08999-33.46997 26.08999-13.99 0-25.13998-8.7-33.46998-26.08998zm-1029.72922-9.08c-43.86997-18.14998-78.46994-41.97996-103.80992-71.46994-25.33998-29.49998-43.10997-61.83995-53.32996-97.00993-10.21-35.16997-13.61-72.03994-10.21-110.61791 3.41-38.57497 12.48-76.20395 27.22999-112.88792 14.74998-36.68397 34.41997-71.28794 58.99995-103.81092 24.57998-32.52398 52.56996-60.32095 83.95994-83.38994 31.38997-23.06898 65.79995-40.08797 103.23992-51.05496 37.43997-10.967 76.20994-13.42599 116.28991-7.375 33.27998 5.295 61.83995 20.99 85.65994 47.08397 23.82998 26.09498 42.73996 58.42996 56.72995 97.00493 13.99 38.57397 22.87999 80.93094 26.65998 127.0699 3.78 46.13797 1.7 91.70893-6.24 136.7079-7.93999 45.00996-21.55997 86.79993-40.83996 125.3699-19.28999 38.57998-44.62997 69.77995-76.01994 93.59993-31.38998 23.82999-69.39995 37.81998-114.01992 41.97997-44.62996 4.16-96.05992-6.24-154.29988-31.19997zm-642.42952 0c-43.86996-18.14998-78.46994-41.97996-103.80992-71.46994-25.33998-29.49998-43.10997-61.83995-53.31996-97.00993-10.20999-35.16997-13.61999-72.03994-10.20999-110.61791 3.4-38.57497 12.48-76.20395 27.21998-112.88792 14.74999-36.68397 34.41997-71.28794 58.99996-103.81092 24.57998-32.52398 52.56996-60.32095 83.95993-83.38994 31.38998-23.06898 65.79995-40.08797 103.23992-51.05496 37.43998-10.967 76.20995-13.42599 116.29992-7.375 33.27997 5.295 61.82995 20.99 85.64993 47.08397 23.82998 26.09498 42.73997 58.42996 56.72996 97.00493 13.98999 38.57397 22.87998 80.93094 26.65998 127.0699 3.79 46.13797 1.71 91.70893-6.24 136.7079-7.94 45.00996-21.54998 86.79993-40.83997 125.3699-19.28998 38.57998-44.62996 69.77995-76.01994 93.59993-31.38997 23.82999-69.38995 37.81998-114.01991 41.97997-44.61997 4.16-96.05993-6.24-154.29989-31.19997zm-1823.64862-14.69998c-5.29-34.31998-9.64-71.39995-13.04999-111.24992-3.4-39.85997-6.24-80.95994-8.5-123.2999-2.27-42.34497-3.79-85.24294-4.54-128.6939-.75999-43.45198-1.13999-86.07294-1.13999-127.86391 0-41.78997.38-81.91994 1.14-120.38991.75-38.46997 1.89-74.30995 3.4-107.52092 2.27-9.41 8.13-15.63699 17.58998-18.68199 9.45-3.044 19.65999-3.736 30.62998-2.075 10.97 1.66 20.98998 5.12 30.06998 10.378 9.07 5.259 13.98999 11.48599 14.73999 18.68198-1.51 31.54998-2.64 62.40896-3.4 92.57593-.76 30.16698-.57 59.91796.57 89.25494 1.13 29.33597 3.4 58.81095 6.81 88.42493 3.4 29.61298 8.12999 59.64095 14.17998 90.08493 35.54998-34.31797 72.03995-55.90596 109.47992-64.76195 37.43997-8.856 72.79995-8.441 106.07992 1.245 33.27998 9.687 63.72995 26.56898 91.32993 50.64796 27.60998 24.07798 49.54996 51.61496 65.80995 82.61194 16.25999 31.00198 25.89998 63.65195 28.92998 97.97192 3.02 34.31998-3.22 66.41995-18.71999 96.30993-15.50998 29.88998-41.40996 55.62996-77.71994 77.21994-36.29997 21.58999-85.46993 35.42998-147.48989 41.50997-27.22998 2.77-50.86996 4.99-70.90994 6.65-20.03999 1.66-38.94997 1.8-56.72996.41-17.76999-1.38-35.91997-5.12-54.45996-11.21-18.52998-6.08999-39.89997-15.49998-64.09995-28.22997zm85.08994-154.42989c-9.83 32.09998-11.34 58.25996-4.53 78.45994 6.8 20.20999 18.89998 35.00998 36.29997 44.41997 17.39999 9.41 38.57997 14.11999 63.53995 14.11999 24.95998 0 50.66997-3.74 77.13995-11.21 26.47998-7.46999 52.37996-18.12998 77.71994-31.96997 25.33998-13.83999 47.08996-30.15997 65.23995-48.97996 13.60999-13.83999 20.79998-30.58998 21.55998-50.23996.75-19.64999-2.84-39.70997-10.78-60.18996-7.94998-20.47998-19.85998-40.13097-35.73996-58.95095-15.88-18.81999-33.65998-34.31798-53.31996-46.49597-19.66999-12.17699-40.65997-19.64998-62.96996-22.41698-22.31998-2.768-44.24996 1.799-65.80995 13.69899-21.54998 11.90099-41.78996 32.10397-60.69995 60.61095-18.90999 28.50398-34.78997 68.22395-47.64996 119.14391zm2380.9882 74.95995c49.15996 31.76997 93.21993 45.00996 132.1799 39.70997 38.94997-5.29 71.65995-21.92999 98.12993-49.91997 26.47998-27.97997 46.32996-63.71995 59.56995-107.20991 13.24-43.48997 18.90999-87.92994 17.01999-133.3119-1.9-45.38197-11.73-87.54994-29.49998-126.5029-17.77999-38.95298-44.81997-68.26196-81.11994-87.92694-20.41998-10.59-44.24997-10.022-71.47994 1.701-27.22998 11.72399-53.88996 30.63297-79.97994 56.72795-26.09998 26.09498-49.73997 57.29496-70.90995 93.60093-21.17999 36.30498-35.54997 73.55695-43.11997 111.75292-7.56 38.19897-6.62 75.06894 2.84 110.61892 9.45 35.54997 31.57998 65.79995 66.36995 90.75993zm-642.42952 0c49.16997 31.76997 93.21993 45.00996 132.1799 39.70997 38.94997-5.29 71.65995-21.92999 98.13993-49.91997 26.46998-27.97997 46.31997-63.71995 59.55996-107.20991 13.23999-43.48997 18.90998-87.92994 17.01998-133.3119-1.89-45.38197-11.71999-87.54994-29.49998-126.5029-17.76998-38.95298-44.80996-68.26196-81.11993-87.92694-20.41999-10.59-44.24997-10.022-71.47995 1.701-27.22998 11.72399-53.88996 30.63297-79.97994 56.72795-26.09998 26.09498-49.72996 57.29496-70.90995 93.60093-21.17998 36.30498-35.54997 73.55695-43.10996 111.75292-7.57 38.19897-6.62 75.06894 2.83 110.61892 9.45999 35.54997 31.57997 65.79995 66.36994 90.75993zm-1159.18912-39.69997c19.65998 30.24997 40.26997 47.64996 61.82995 52.18996 21.55999 4.53 42.53997.56 62.96995-11.92 20.41999-12.47998 39.70997-31.00997 57.85996-55.58995 18.14999-24.57998 33.65998-50.86996 46.51997-78.84994 12.84999-27.98998 22.30998-55.40696 28.35997-82.25794 6.05-26.85098 7.56-48.97496 4.54-66.37095-3.78-18.15299-6.81-34.41497-9.08-48.78596-2.27-14.371-4.72999-27.22898-7.36999-38.57497-2.65-11.345-5.68-21.74599-9.07999-31.19998-3.4-9.455-8.13-19.09799-14.17999-28.93098-30.25998-21.17898-58.42996-29.49898-84.52994-24.95998-26.08998 4.538-49.53996 17.39599-70.33994 38.57397-20.79999 21.17898-38.18997 48.40796-52.18996 81.68794-13.99 33.27997-24.19998 68.07295-30.62998 104.37892-6.43 36.30597-8.51 71.47995-6.24 105.50992 2.27 34.03998 9.45 62.39995 21.55999 85.09994z" fill="#282828" fill-rule="nonzero"/>
16
+ <path d="M6892.93785 1141.07765l-2.93-847.33736c-.01-1.191.2-2.374.61-3.492 6.06-16.43098 13.87-28.16497 22.94999-35.51497 9.95999-8.065 20.24998-11.87199 30.67997-11.87199 10.37 0 19.54999 2.66 27.55998 7.845 8.86 5.732 14.1 12.94799 16.18 21.28698.16.625.25 1.264.29 1.908 2.26999 43.93997 4.15999 92.80393 5.67999 146.59289 1.51 53.75096 2.65 109.96191 3.4 168.63387.76 58.61996 1.52 118.75391 2.27 180.39986.76 61.66396 1.33 122.76091 1.71 183.28987.37 60.52995.56 119.1699.56 175.91986 0 56.66996.38 109.18992 1.13999 157.54988.01 1.06-.14 2.12-.46 3.13-4.6 14.73-12.99999 25.43998-24.96998 32.34998-11.7 6.75-23.64998 9.58-35.79997 8.68-12.44-.92-23.51999-5.71-33.19998-14.47-9.87-8.93-15.19999-21.69998-15.19999-38.57997l-.25-72.25994c-2.06 5.06-4.48 10.24999-7.27 15.58998-9.08998 17.41-21.52998 34.43998-37.35996 51.04997-16.08 16.88998-34.38998 29.74997-54.89996 38.58997-20.83999 8.98999-43.70997 12.12999-68.62995 9.25999-24.60998-2.82-50.33996-15.20999-76.94994-37.68997-7.62-5.23-15.41999-14.25-23.02998-27.34998-6.92-11.92-13.84-24.98998-20.75999-39.21997-6.83-14.02-13.64999-28.23998-20.46998-42.63997-6.53-13.77999-13.4-25.75998-20.65999-35.90997-6.62-9.27-13.48999-16.15999-20.76998-20.45999-4.67-2.76-9.71-2.7-15.12-.35-14.69998 24.18998-29.57997 47.66997-44.62996 70.42995-16.00999 24.20998-33.58997 44.87997-52.71996 62.05995-19.67998 17.66999-42.16997 30.11998-67.46995 37.34997-25.32998 7.23-54.88996 6.63-88.72993-2.23-33.15997-8.89999-60.03995-26.31997-80.66994-52.20995-20.07998-25.18998-35.06997-55.08996-44.90996-89.72994-9.7-34.10997-14.57-71.50994-14.57-112.21991 0-40.42697 4.43-80.66694 13.29-120.71491 8.84999-40.02697 21.73998-78.51394 38.67997-115.46191 17.08998-37.28898 37.69997-69.31695 61.77995-96.11793 24.43998-27.19398 52.23996-47.66197 83.36994-61.45595 31.65997-14.024 65.90995-17.899 102.88992-11.467 34.67997 6.452 63.26995 21.24799 85.85994 44.23397 21.94998 22.34798 40.20996 49.38096 54.70995 81.13794 14.28 31.25498 25.48998 65.78695 33.58998 103.60192 7.97 37.19097 15.17999 74.38195 21.62998 111.57192 6.42 37.00197 12.84 72.31194 19.25999 105.91192 6.27 32.82997 14.53999 61.05995 24.85998 84.65993 9.73 22.24999 21.89998 38.70997 36.83997 49.12997 13.55 9.45999 31.25998 10.32999 53.02996 3.92 30.31998-30.90998 54.72996-51.40997 73.05995-61.72996 12.16999-6.84 22.40998-10.8 30.62997-12.17 7.06-1.17999 12.97-.53999 17.76999 1.42 3.08 1.26 5.82 2.97 8.15 5.15zm171.26987-850.82935c-.41 1.118-.62 2.301-.62 3.492l3.4 983.65725c0 16.87999 5.34 29.64998 15.21 38.57997 9.67998 8.76 20.75997 13.55 33.19997 14.47 12.14999.9 24.09998-1.93 35.79997-8.68 11.95999-6.91 20.36998-17.61999 24.96998-32.34998.32-1.01.47-2.07.45-3.13-.75-48.35996-1.13-100.87992-1.13-157.54988 0-56.74995-.19-115.3899-.57-175.91986-.38-60.52896-.94-121.62591-1.7-183.28987-.76-61.64595-1.51-121.7799-2.27-180.39986-.76-58.67196-1.89-114.88291-3.41-168.63387-1.51-53.78896-3.4-102.65292-5.67999-146.5929-.03-.644-.13-1.283-.28-1.90799-2.09-8.339-7.32-15.55499-16.17999-21.28698-8.02-5.185-17.18998-7.845-27.55998-7.845-10.43999 0-20.71998 3.807-30.68997 11.872-9.08 7.34999-16.88999 19.08398-22.93999 35.51497zm1588.0788 521.3466c11.02-11.49199 21.36999-24.98198 31.06998-40.44997 14.03-22.37998 28.44998-44.75996 43.23997-67.13995 15.13999-22.89798 31.63998-43.26796 49.48996-61.12095 18.93999-18.93699 41.57997-30.45998 67.67995-34.53497 52.65996-9.574 97.29993-3.098 133.9899 18.84098 36.21997 21.64899 65.98995 52.69896 89.20993 93.24193 22.76999 39.74697 40.15997 85.84694 52.12996 138.3279 11.82 51.85696 20.20999 103.90492 25.15998 156.14788 4.96 52.18996 7.05 102.09992 6.29 149.72989-.77 47.60996-2.68 86.64993-5.73 117.1199-.11 1.16-.43 2.28-.92 3.32-10.40999 21.74999-24.99998 31.77998-42.49996 31.77998-17.48999 0-32.07998-10.03-42.48997-31.77997-.56-1.17-.88-2.44-.96-3.73-2.26-39.21997-5.65-82.00994-10.18-128.3799-4.51999-46.29997-10.53998-92.40994-18.06998-138.3399-7.51-45.82997-16.51999-89.21993-27.03998-130.1689-10.38999-40.41497-22.58998-74.53795-36.67997-102.34693-13.35999-26.36698-28.42998-45.00796-45.64997-55.55495-15.47998-9.474-32.93997-7.465-52.51996 4.536-22.56998 13.82998-47.26996 41.87496-74.56994 83.72993-28.12998 43.12897-59.40996 105.21592-93.90993 186.22486-.08.19-.17.37-.26.55-2.91 5.83-6.71 15.30999-11.45 28.42998-4.88999 13.53999-10.15998 28.77998-15.79998 45.70996-5.7 17.09-11.95999 35.12998-18.79998 54.11996-6.77 18.80999-12.98 36.85997-18.61999 54.16996-5.68 17.41999-10.79 32.93998-15.33999 46.57997-4.39 13.16999-7.33 23.04998-8.8 29.63997-.12.52-.28 1.04-.48 1.54-7.70999 19.27999-18.35998 29.19998-29.92997 31.59998-11.43 2.39-22.87998.41-34.30997-6.25-10.03-5.85-19.24999-13.76999-27.59998-23.78998-8.86-10.63999-13.93-20.08998-15.7-28.05998-.33999-1.54-.30999-3.14.08-4.66 6.74-26.20997 12.73-55.41995 17.97-87.60993 5.25-32.26997 9.36999-69.03995 12.36999-110.30991 3.01-41.34297 4.13-88.13794 3.38-140.3819-.75-52.31096-4.52-111.58291-11.29-177.81786-.19-1.829.13-3.674.92-5.332 10.19-21.30698 21.57999-32.05198 31.76998-34.36797 11.17999-2.541 22.52998.468 33.70997 10.12499 9.13 7.881 17.73999 19.41898 25.61998 34.76697 7.34 14.288 13.9 28.76898 19.68999 43.44197 5.82 14.74199 10.46999 28.51598 13.95999 41.31797.7 2.54 1.32 4.919 1.87 7.135zm-1260.43904 469.29265c-45.43997-18.81999-81.21994-43.59997-107.46992-74.15995-26.30998-30.62997-44.73997-64.20995-55.34996-100.72992-10.55-36.33997-14.07999-74.42994-10.56-114.28691 3.48-39.54797 12.79-78.12894 27.90999-115.73892 15.06999-37.49597 35.16997-72.86794 60.28995-106.11092 25.18998-33.31797 53.85996-61.78595 86.01994-85.41793 32.32997-23.76398 67.77995-41.29597 106.34992-52.59396 38.82997-11.373 79.02994-13.941 120.6799-7.653 35.51998 5.652 66.02996 22.35899 91.46994 50.21697 24.64998 26.99898 44.25996 60.42495 58.73995 100.33692 14.28 39.36297 23.36998 82.58094 27.22998 129.6629 3.85 46.99997 1.73 93.42293-6.36 139.2649-8.10999 45.98996-22.03998 88.68993-41.74996 128.1099-20.00999 40.01997-46.33997 72.36995-78.90994 97.08993-32.80998 24.89998-72.49995 39.61997-119.13991 43.96996-46.01997 4.29-99.08993-6.22-159.14988-31.95997zm642.41951 0c-45.43996-18.81999-81.21994-43.59997-107.46992-74.15995-26.30998-30.62997-44.73996-64.20995-55.33995-100.72992-10.55-36.33997-14.08-74.42994-10.57-114.28691 3.49-39.54797 12.79-78.12894 27.90998-115.73892 15.08-37.49597 35.17998-72.86794 60.29996-106.11092 25.17998-33.31797 53.85996-61.78595 86.00993-85.41793 32.33998-23.76398 67.78995-41.29597 106.35992-52.59396 38.82997-11.373 79.01994-13.941 120.66991-7.653 35.52997 5.652 66.03995 22.35899 91.47993 50.21697 24.64998 26.99898 44.25997 60.42495 58.73996 100.33692 14.27999 39.36297 23.36998 82.58094 27.22998 129.6629 3.85 46.99997 1.73 93.42293-6.36 139.2649-8.12 45.98996-22.03998 88.68993-41.74997 128.1099-20.00998 40.01997-46.33996 72.36995-78.90994 97.08993-32.80997 24.89998-72.49994 39.61997-119.1399 43.96996-46.01997 4.29-99.09993-6.22-159.15989-31.95997zM6968.3578 276.0543c-1.1-3.399-3.7-6.152-7.41999-8.557-4.84-3.135-10.41999-4.636-16.68999-4.636-6.2 0-12.17999 2.622-18.09998 7.417-6.5 5.259-11.73 13.762-16.13999 25.24198l3.4 981.84726c0 10.31 2.6 18.33999 8.62 23.77998 6.20999 5.62 13.27998 8.76 21.25998 9.36 8.26999.61 16.35998-1.47 24.32998-6.07 7.31-4.21 12.36999-10.78 15.39999-19.52998-.75-47.98997-1.12-100.04993-1.12-156.16989 0-56.70995-.19-115.30991-.56-175.79486-.38-60.48896-.95-121.54591-1.7-183.16987-.76-61.64195-1.52-121.7709-2.27-180.38686-.76-58.56596-1.89-114.67491-3.4-168.32887-1.5-53.15996-3.37-101.49493-5.61-145.0029zm173.57988 0c-1.1-3.399-3.69-6.152-7.41-8.557-4.84-3.135-10.42-4.636-16.68999-4.636-6.21 0-12.17999 2.622-18.09998 7.417-6.5 5.259-11.74 13.762-16.14 25.24198l3.39 981.84726c0 10.31 2.61 18.33999 8.63 23.77998 6.2 5.62 13.27999 8.76 21.25998 9.36 8.27.61 16.36-1.47 24.31999-6.07 7.31-4.21 12.36999-10.78 15.39998-19.52998-.74-47.98997-1.11-100.04993-1.11-156.16989 0-56.70995-.19-115.30991-.57-175.79486-.37-60.48896-.94-121.54591-1.7-183.16987-.75-61.64195-1.51-121.7709-2.27-180.38686-.75-58.56596-1.88999-114.67491-3.39999-168.32887-1.49-53.15996-3.36-101.49493-5.61-145.0029zm-1474.8589 611.05154c32.78998-28.61098 66.40996-46.87097 100.71993-54.98596 39.23997-9.282 76.29994-8.777 111.17992 1.375 34.64997 10.08599 66.35995 27.64098 95.10993 52.71196 28.56997 24.91798 51.24996 53.42596 68.07995 85.50393 16.88998 32.18698 26.89997 66.10695 30.03997 101.73693 3.2 36.27997-3.42 70.20994-19.80998 101.79992-16.27999 31.37997-43.34997 58.53995-81.47994 81.19994-37.32997 22.19998-87.83993 36.60997-151.58989 42.86996-27.29998 2.78-50.99996 5-71.08994 6.66-20.60999 1.71-40.05997 1.84-58.32996.42-18.53999-1.44-37.47997-5.33-56.80996-11.68-18.96998-6.22999-40.84997-15.83998-65.62995-28.87997-2.81-1.47-4.75-4.19-5.23-7.32-5.32999-34.52997-9.70999-71.83994-13.12998-111.92991-3.41-39.95997-6.26-81.15994-8.53-123.6199-2.28-42.45897-3.79-85.47694-4.55-129.0499-.76-43.51098-1.14-86.18994-1.14-128.03791 0-41.85797.38-82.05394 1.14-120.58691.76-38.56197 1.89-74.48795 3.41-107.77892.03-.637.12-1.27.27-1.889 3.13-12.99999 11.18-21.65098 24.23999-25.85598 10.86999-3.498 22.58998-4.353 35.19997-2.445 12.24999 1.856 23.43998 5.739 33.57997 11.614 12.52 7.25499 18.62999 16.35998 19.67999 26.28797.05.506.07 1.016.04 1.524-1.51 31.47298-2.64 62.25596-3.39 92.34793-.75 29.95198-.57 59.49096.56 88.61794 1.12 29.08597 3.37 58.30895 6.75 87.66993 2.72 23.63898 6.28 47.54596 10.70999 71.71995zm992.55926 378.53171c-5.84-3.89-11.48-11.03-17.31999-21.08998-6.7-11.53-13.38999-24.16999-20.07998-37.92998-6.79-13.95998-13.58-28.10997-20.37999-42.44996-7.08-14.97-14.57999-27.94998-22.44998-38.97997-8.51-11.9-17.51999-20.51999-26.87998-26.04998-11.32-6.69-23.67998-6.83-37.05997.37-1.57.85-2.88 2.1-3.81 3.62-15.05999 24.84997-30.29998 48.93996-45.73996 72.27994-15 22.68998-31.45998 42.10997-49.38997 58.20995-17.37998 15.61-37.24997 26.60998-59.59995 32.99998-22.31999 6.37-48.34997 5.46-78.10994-2.33-28.79998-7.73-52.21996-22.82998-70.15995-45.34996-18.49999-23.20999-32.24998-50.79997-41.31997-82.71994-9.21-32.44998-13.79999-68.03995-13.79999-106.75992 0-38.98097 4.27-77.78094 12.81-116.39591 8.54998-38.63497 20.98998-75.78495 37.33996-111.44792 16.19-35.32397 35.65998-65.69495 58.47996-91.08393 22.45998-24.99598 47.97996-43.85797 76.59994-56.53696 28.08998-12.44899 58.50996-15.75999 91.23993-10.069 30.24998 5.628 55.35996 18.44 75.12995 38.56698 20.39998 20.76598 37.30997 45.92097 50.78996 75.43094 13.70999 30.00998 24.43998 63.17396 32.21997 99.48293 7.92 36.93297 15.08 73.86594 21.48999 110.79991 6.43 37.12298 12.86999 72.53295 19.30998 106.24292 6.59 34.48998 15.34 64.12996 26.18998 88.92994 11.45 26.16998 26.13998 45.24996 43.71997 57.51995 18.48999 12.9 42.71997 15.33 72.81994 5.87 1.58-.49 3.01-1.37 4.16-2.55 29.34998-30.08998 52.73996-50.19996 70.35995-60.09995 8.15-4.59 15.17999-7.72 21.11998-9.24 4.06-1.05 7.35-1.48 9.9-.44 4.83 1.98 5.26 7.53 4.6 15.45-1.04 12.47998-5.67 26.31997-13.65 41.57996-8.3 15.86999-19.68998 31.36998-34.11997 46.51997-14.17 14.87998-30.26998 26.22998-48.33997 34.01997-17.73998 7.65-37.21997 10.19-58.42995 7.76-21.40999-2.46-43.55997-13.78-66.71995-33.42998l-.92-.7zm2465.44814 12.35c2.91-29.76999 4.72-67.65996 5.46-113.66992.75-46.92997-1.32-96.09993-6.2-147.5199-4.87-51.38895-13.12999-102.58491-24.74998-153.59388-11.49-50.38496-28.12998-94.67092-49.98996-132.8309-21.39999-37.36197-48.73997-66.06595-82.10994-86.01693-32.88998-19.65999-72.95995-24.90898-120.38991-16.28799-22.05998 3.447-41.01997 13.102-56.87996 28.95798-16.93999 16.93999-32.57997 36.27997-46.93996 58.00796-14.71 22.24498-29.03998 44.49096-42.98997 66.73695-14.56999 23.23798-30.54998 42.31396-47.87996 57.28095-2.96 2.557-7.14 3.153-10.7 1.525-3.56-1.628-5.84-5.181-5.84-9.093 0-3.38099-1.70999-10.60698-4.74999-21.76198-3.32-12.15799-7.74-25.23598-13.26999-39.23597-5.55-14.06799-11.84999-27.95098-18.87998-41.64996-6.49-12.637-13.39-22.27799-20.89999-28.76698-5.47-4.718-10.73999-7-16.20999-5.759-2.45.558-4.67 2.587-7.11999 5.432-3.3 3.817-6.54 9.02999-9.82 15.58699 6.66 65.73995 10.36 124.6399 11.11 176.70886.76 52.89196-.39 100.26493-3.43 142.1199-3.05 41.92996-7.25 79.28994-12.57999 112.06991-5.18 31.79998-11.08 60.72995-17.68999 86.79993 1.68 5.13 5.45 10.9 10.96 17.51 6.77 8.11999 14.18999 14.57998 22.31998 19.31998 6.72 3.93 13.41999 5.36 20.14998 3.96 6.46-1.35 10.86-8.16 15.16-18.77 1.62-7.01999 4.65999-17.27998 9.15999-30.76997 4.53-13.58999 9.62999-29.07998 15.29998-46.44996 5.7-17.48999 11.97-35.73998 18.80999-54.74996 6.78-18.82999 12.99999-36.71997 18.63999-53.65996 5.71-17.10999 11.02999-32.49998 15.96998-46.18997 5.02-13.88999 9.11-23.97298 12.22-30.26797 35.04997-82.24394 66.88994-145.2539 95.45992-189.06286 29.42998-45.12797 56.52996-74.94494 80.85994-89.85593 27.31998-16.744 51.82996-17.75999 73.41995-4.541 19.83998 12.144 37.66997 33.21197 53.04996 63.57295 14.64998 28.91898 27.40998 64.38095 38.20997 106.40992 10.65999 41.49597 19.79998 85.46594 27.40998 131.9149 7.6 46.34997 13.67999 92.88993 18.23998 139.6299 4.47 45.84996 7.84 88.22993 10.12 127.1199 6.08999 12 13.56998 18.70999 23.59998 18.70999 10.08999 0 17.58998-6.77 23.68998-18.86999zm-1725.4887-15.54c-42.25997-17.47998-75.64994-40.33997-100.04992-68.74995-24.36999-28.36997-41.48997-59.44995-51.30996-93.27993-9.87-33.99997-13.14-69.64994-9.85-106.94891 3.31-37.60098 12.17-74.27895 26.53998-110.03592 14.43-35.87297 33.65998-69.70795 57.69996-101.51292 23.97998-31.72998 51.27996-58.85496 81.89994-81.36094 30.43997-22.37399 63.81995-38.87897 100.12992-49.51597 36.05997-10.56199 73.38995-12.91099 111.98992-7.084 30.95997 4.925 57.54995 19.607 79.76994 43.93898 22.99998 25.18998 41.19997 56.43395 54.70996 93.67193 13.70999 37.78597 22.38998 79.28094 26.09998 124.4769 3.71 45.27597 1.67 89.99593-6.12 134.1609-7.77 44.01997-21.07998 84.89994-39.94997 122.6299-18.55999 37.11998-42.89997 67.17996-73.10994 90.10994-29.96998 22.74998-66.29995 36.00997-108.90992 39.98997-43.22997 4.03-93.00993-6.26-149.42989-30.43998l-.11-.05zm642.41952 0c-42.24997-17.47998-75.63995-40.33997-100.04993-68.74995-24.35998-28.36997-41.47997-59.44995-51.29996-93.27993-9.87-33.99997-13.14999-69.64994-9.86-106.94891 3.32-37.60098 12.17-74.27895 26.54999-110.03592 14.41999-35.87297 33.65997-69.70795 57.69995-101.51292 23.97999-31.72998 51.27997-58.85496 81.89994-81.36094 30.43998-22.37399 63.81995-38.87897 100.12993-49.51597 36.05997-10.56199 73.38994-12.91099 111.98991-7.084 30.94998 4.925 57.54996 19.607 79.76994 43.93898 22.99999 25.18998 41.19997 56.43395 54.70996 93.67193 13.7 37.78597 22.38998 79.28094 26.08998 124.4769 3.71 45.27597 1.68 89.99593-6.12 134.1609-7.76999 44.01997-21.06998 84.89994-39.93996 122.6299-18.55999 37.11998-42.90997 67.17996-73.10995 90.10994-29.96998 22.74998-66.29995 36.00997-108.90992 39.98997-43.22996 4.03-93.00993-6.26-149.42988-30.43998l-.12-.05zM5632.4288 546.7151c-.72-4.174-4.34-7.351-9.72999-10.47199-8.01-4.642-16.86999-7.678-26.54998-9.144-9.33-1.413-18.01998-.883-26.06998 1.707-5.56 1.792-9.16 5.322-10.71 10.675-1.47999 32.83197-2.59999 68.23495-3.33999 106.20592-.76 38.40597-1.14 78.47094-1.14 120.1929 0 41.73398.38 84.29694 1.14 127.68891.75 43.32997 2.26 86.10694 4.52 128.3289 2.26 42.23997 5.09 83.22994 8.49 122.97991 3.21999 37.68997 7.27999 72.88995 12.20998 105.58992 21.78999 11.26 41.14997 19.67999 58.09996 25.24998 17.72999 5.83 35.09997 9.42 52.10996 10.74 17.26999 1.35 35.64997 1.2 55.11996-.41 19.99998-1.66 43.56997-3.87 70.75994-6.63 60.26996-5.91 108.08992-19.17999 143.3599-40.15997 34.48997-20.49998 59.21995-44.82997 73.94994-73.21994 14.61999-28.18998 20.48999-58.46996 17.63999-90.82994-2.91-32.99997-12.19-64.39995-27.82998-94.20593-15.68999-29.91597-36.86997-56.48395-63.51995-79.72193-26.46998-23.08499-55.63996-39.29498-87.54994-48.58197-31.67997-9.221-65.34995-9.546-100.98992-1.115-35.87997 8.488-70.76995 29.33298-104.83992 62.22396-2.63 2.541-6.44 3.442-9.93 2.349-3.49-1.093-6.10999-4.005-6.81999-7.594-6.11-30.71598-10.88-61.01395-14.30999-90.89293-3.43-29.86598-5.72-59.59296-6.86-89.17993-1.15-29.54598-1.34-59.50996-.58-89.89194.75-29.94797 1.88-60.57595 3.37-91.88193zm15.14 553.17259c13.18998-52.14997 29.57997-92.78993 48.95996-122.00191 19.95998-30.08698 41.44996-51.27696 64.19995-63.83695 23.53998-12.994 47.49996-17.891 71.86994-14.869 23.73999 2.944 46.07997 10.883 66.99995 23.83899 20.53999 12.71799 39.10997 28.89298 55.69996 48.54796 16.63999 19.71899 29.09998 40.32097 37.41997 61.78096 8.47 21.83998 12.25 43.24996 11.45 64.19995-.86 22.23998-9.01 41.18997-24.34999 56.78995-18.82998 19.51999-41.36997 36.46998-67.63995 50.81997-26.01998 14.20999-52.61996 25.13998-79.79994 32.80997-27.39998 7.74-54.02996 11.59-79.85994 11.59-26.84998 0-49.58996-5.2-68.29994-15.32-19.60999-10.60999-33.33998-27.23998-41.01997-50.02996-7.32-21.70998-6.15-49.83996 4.37-84.31993zm19.33998 5.12c12.51999-49.58997 27.86998-88.30994 46.28996-116.06692 17.85999-26.92498 36.82998-46.14197 57.19996-57.38296 19.56999-10.80799 39.46997-15.04399 59.73996-12.52999 20.87998 2.59 40.51996 9.597 58.92995 20.99499 18.78999 11.63699 35.76997 26.45898 50.94996 44.44396 15.12 17.92099 26.48998 36.61097 34.04998 56.11096 7.42 19.12999 10.81999 37.84997 10.10999 56.19996-.65 17.04998-6.87 31.58997-18.68999 43.59996-17.54998 18.2-38.49997 33.89998-62.89995 47.22997-24.65998 13.46999-49.86996 23.83998-75.63994 31.10998-25.53998 7.20999-50.34996 10.83999-74.42995 10.83999-23.07998 0-42.69996-4.21-58.77995-12.91-15.18-8.20999-25.64998-21.19998-31.58998-38.81996-6.28-18.63999-4.44-42.72997 4.63-72.33995l.13-.48zm1723.4387 80.90993c51.62996 33.36998 98.03992 46.77997 138.9499 41.21997 41.29996-5.61 75.97994-23.27998 104.04991-52.95996 27.45998-29.02998 48.13997-66.05995 61.86996-111.16992 13.55999-44.57996 19.37998-90.12293 17.43998-136.6379-1.95-46.72396-12.08999-90.13293-30.38997-130.2379-18.71999-41.02096-47.21997-71.85994-85.45994-92.56893-23.01998-11.93999-49.70996-11.81599-80.18994 1.31-28.27998 12.173-56.00995 31.74398-83.09993 58.84096-26.66998 26.66498-50.83997 58.53395-72.47995 95.63293-21.75998 37.30897-36.50997 75.59694-44.27997 114.84991-7.87999 39.75097-6.86 78.13094 2.98 115.13091 10.02 37.67997 33.31998 69.85995 70.19995 96.31993l.41.27zm642.41951 0c51.62996 33.36998 98.04993 46.77997 138.9499 41.21997 41.30997-5.61 75.98994-23.27998 104.05992-52.95996 27.45998-29.02998 48.12996-66.05995 61.86995-111.16992 13.56-44.57996 19.37999-90.12293 17.43999-136.6379-1.95-46.72396-12.09-90.13293-30.38998-130.2379-18.71998-41.02096-47.22996-71.85994-85.45993-92.56893-23.01998-11.93999-49.70996-11.81599-80.18994 1.31-28.27998 12.173-56.00996 31.74398-83.10994 58.84096-26.65998 26.66498-50.82996 58.53395-72.46994 95.63293-21.76999 37.30897-36.51998 75.59694-44.28997 114.84991-7.87 39.75097-6.86 78.13094 2.98 115.13091 10.02999 37.67997 33.32997 69.85995 70.20994 96.31993l.4.27zm11.07-16.65999c46.60996 30.07998 88.23993 43.08997 125.1899 38.06997 36.59997-4.98 67.34995-20.58998 92.21993-46.88996 25.47998-26.93998 44.51997-61.38995 57.25996-103.24992 12.90999-42.40997 18.43998-85.73594 16.58999-129.9859-1.83-44.03997-11.35-84.96594-28.59998-122.76691-16.82999-36.88497-42.40997-64.66495-76.62995-83.20194-17.97998-9.323-38.93997-8.313-62.91995 2.009-26.17998 11.274-51.76996 29.52098-76.85994 54.61396-25.52998 25.52498-48.62996 56.05596-69.34995 91.56793-20.58998 35.30297-34.57997 71.51695-41.93997 108.65792-7.24999 36.63597-6.38 72.00594 2.69 106.10592 8.87 33.34997 29.74998 61.62995 62.34996 85.06993zm-642.42952 0c46.60996 30.07998 88.24993 43.08997 125.1899 38.06997 36.59998-4.98 67.34995-20.58998 92.21994-46.88996 25.48998-26.93998 44.51996-61.38995 57.25995-103.24992 12.91-42.40997 18.43999-85.73594 16.59999-129.9859-1.84-44.03997-11.36-84.96594-28.60998-122.76691-16.82999-36.88497-42.39997-64.66495-76.61994-83.20194-17.97999-9.323-38.94997-8.313-62.91995 2.009-26.18998 11.274-51.77996 29.52098-76.86995 54.61396-25.52998 25.52498-48.62996 56.05596-69.33994 91.56793-20.59999 35.30297-34.58998 71.51695-41.94997 108.65792-7.25 36.63597-6.37 72.00594 2.7 106.10592 8.86999 33.34997 29.73997 61.62995 62.33995 85.06993zm-1173.21912-25.98998c21.51999 33.09998 44.56997 51.54996 68.15995 56.51996 24.03999 5.06 47.46997.75 70.23995-13.16999 21.39998-13.06999 41.66997-32.41998 60.68995-58.17996 18.56-25.12998 34.41998-52.00996 47.55997-80.61994 13.16999-28.64997 22.83998-56.73495 29.03998-84.22993 6.4-28.42898 7.83-51.86396 4.63-70.28295l-.06-.326c-3.75-17.97399-6.74-34.07597-8.99-48.30596-2.31-14.636-4.82-27.73198-7.52-39.28697-2.74-11.752-5.86999-22.52199-9.39999-32.31498-3.62-10.059-8.64-20.32498-15.06999-30.78498-.72-1.164-1.67-2.168-2.79-2.952-32.86997-23.00798-63.61995-31.54997-91.96992-26.61997-28.08998 4.885-53.36996 18.62598-75.75995 41.41997-21.60998 21.99998-39.73997 50.24796-54.27996 84.81893-14.26999 33.96098-24.69998 69.46395-31.25997 106.51092-6.57 37.13497-8.69 73.11395-6.37 107.92392 2.38 35.65997 10.03 65.34995 22.70999 89.12993l.44.75zm223.31984-388.7207c-26.98998-18.50399-52.01996-26.18998-75.36995-22.12799-24.10998 4.192-45.70996 16.16699-64.91995 35.72898-19.99998 20.35698-36.65997 46.56796-50.10996 78.55694-13.70999 32.59997-23.70998 66.68295-29.99998 102.24692-6.29 35.47697-8.33 69.84595-6.11 103.10592 2.15 32.21998 8.8 59.13996 20.2 80.67994 17.73998 27.17998 35.82996 43.38997 55.26995 47.47996 19.06999 4.02 37.61997.38 55.68996-10.65999 19.44998-11.87999 37.74997-29.59997 55.02996-52.99996 17.74998-24.02998 32.90997-49.72996 45.47996-77.08994 12.55-27.30998 21.78999-54.06896 27.68998-80.27594 5.69-25.21598 7.29-45.98996 4.46-62.34495-3.79-18.24499-6.83-34.59698-9.12-49.05396-2.22-14.106-4.63-26.72698-7.22999-37.86298-2.55-10.93899-5.47-20.96898-8.75-30.08497-2.98-8.28-7.05999-16.709-12.20998-25.29798z" fill="#fff"/>
17
+ </g>
18
+ </svg>
19
+ </span>
20
+ <br />
21
+
22
+ <span style="width: 34px; top: -5px;"><svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="facebook" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="svg-inline--fa fa-facebook fa-w-16 fa-2x"><path fill="#475e8f" d="M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z" class=""></path></svg></span>
23
+
24
+ <?php echo $plus_svg; ?>
25
+
26
+ <span><svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="instagram" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" class="svg-inline--fa fa-instagram fa-w-14 fa-2x"><path fill="#e15073" d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z" class=""></path></svg></span>
27
+
28
+ <?php echo $plus_svg; ?>
29
+
30
+ <span style="top: -4px;"><svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="twitter" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="svg-inline--fa fa-twitter fa-w-16 fa-2x"><path fill="#1a92dc" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z" class=""></path></svg></span>
31
+
32
+ <?php echo $plus_svg; ?>
33
+
34
+ <span style="width: 35px; top: -5px;"><svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="youtube" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" class="svg-inline--fa fa-youtube fa-w-18 fa-2x"><path fill="#f5413d" d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z" class=""></path></svg></span>
35
+ </div>
36
+
37
+ <h1>Combine all your social media channels into one single wall.</h1>
38
+ <h2>Maximize your social content and get more followers.</h2>
39
+
40
+ <div style="text-align: center;">
41
+ <a href="https://smashballoon.com/social-wall/?utm_source=plugin-pro&utm_campaign=ctf&utm_medium=sw-cta-1" target="_blank" class="cta button button-primary">Get the Social Wall plugin</a>
42
+ </div>
43
+
44
+ <div class="ctf-sw-info">
45
+ <div class="ctf-sw-features">
46
+ <p><span>A dash of Instagram</span>Add posts from your profile, public hashtag posts, or posts you're tagged in.</p>
47
+ <p><span>A sprinkle of Facebook</span>Include posts from your page or group timeline, or from your photos, videos, albums, and events pages.</p>
48
+ <p><span>A spoonful of Twitter</span>Add Tweets from any Twitter account, hashtag Tweets, mentions, and more.</p>
49
+ <p><span>And a dollop of YouTube</span>Embed videos from any public YouTube channel, playlists, searches, and more.</p>
50
+ <p><span>All in the same feed</span>Combine feeds from all of our Smash Balloon Pro plugins into one single wall feed, and show off all your social media content in one place.</p>
51
+ </div>
52
+ <a class="ctf-sw-screenshot" href="https://smashballoon.com/social-wall/demo?utm_source=plugin-pro&utm_campaign=ctf&utm_medium=sw-demo" target="_blank">
53
+ <span class="cta">View Demo</span>
54
+
55
+ <img src="<?php echo CTF_PLUGIN_URL . 'img/sw-screenshot.png'; ?>" alt="Smash Balloon Social Wall plugin screenshot showing Facebook, Instagram, Twitter, and YouTube posts combined into one wall.">
56
+ </a>
57
+ </div>
58
+
59
+ <div class="ctf-sw-footer-cta">
60
+ <a href="https://smashballoon.com/social-wall/?utm_source=plugin-pro&utm_campaign=ctf&utm_medium=sw-cta-2" target="_blank"><span>🚀</span>Get Social Wall and Increase Engagement >></a>
61
+ </div>
62
+
63
+ </div>
views/admin/support.php CHANGED
@@ -90,6 +90,33 @@ if ( ! is_wp_error( $twitter_api->json ) ) {
90
 
91
  ?>
92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  ## Twitter API RESPONSE: ##
94
  <?php
95
  echo 'Screen Name: ' . $screen_name."\n";
90
 
91
  ?>
92
 
93
+ ## Location Summary: ##
94
+ <?php
95
+ $locator_summary = CTF_Feed_Locator::summary();
96
+ $condensed_shortcode_atts = array( 'search', 'screenname', 'hashtag', 'hometimeline', 'mentionstimeline', 'lists', 'layout', 'whitelist', 'includewords' );
97
+
98
+ if ( ! empty( $locator_summary) ) {
99
+
100
+ foreach ( $locator_summary as $locator_section ) {
101
+ if ( ! empty( $locator_section['results'] ) ) {
102
+ $first_five = array_slice( $locator_section['results'], 0, 5 );
103
+ foreach ( $first_five as $result ) {
104
+ $condensed_shortcode_string = '[custom-twitter-feeds';
105
+ $shortcode_atts = json_decode( $result['shortcode_atts'], true );
106
+ $shortcode_atts = is_array( $shortcode_atts ) ? $shortcode_atts : array();
107
+ foreach ( $shortcode_atts as $key => $value ) {
108
+ if ( in_array( $key, $condensed_shortcode_atts, true ) ) {
109
+ $condensed_shortcode_string .= ' ' . esc_html( $key ). '="' . esc_html( $value ) . '"';
110
+ }
111
+ }
112
+ $condensed_shortcode_string .= ']';
113
+ echo esc_url( get_the_permalink( $result['post_id'] ) ) . ' ' . $condensed_shortcode_string . "\n";
114
+ }
115
+
116
+ }
117
+ }
118
+ }?>
119
+
120
  ## Twitter API RESPONSE: ##
121
  <?php
122
  echo 'Screen Name: ' . $screen_name."\n";